Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
80542 views
1
'use strict';
2
/*jshint asi: true */
3
4
var test = require('tap').test;
5
var convert = require('convert-source-map');
6
var commentRegex = require('convert-source-map').commentRegex;
7
var combine = require('..');
8
var mappingsFromMap = require('../lib/mappings-from-map');
9
10
function checkMappings(foo, sm, lineOffset) {
11
function inspect(obj, depth) {
12
return require('util').inspect(obj, false, depth || 5, true);
13
}
14
15
var fooMappings = mappingsFromMap(foo);
16
var mappings = mappingsFromMap(sm);
17
18
var genLinesOffset = true;
19
var origLinesSame = true;
20
for (var i = 0; i < mappings.length; i++) {
21
var fooGen = fooMappings[i].generated;
22
var fooOrig = fooMappings[i].original;
23
var gen = mappings[i].generated
24
var orig = mappings[i].original;
25
26
if (gen.column !== fooGen.column || gen.line !== (fooGen.line + lineOffset)) {
27
console.error(
28
'generated mapping at %s not offset properly:\ninput: [%s]\noutput:[%s]\n\n',
29
i ,
30
inspect(fooGen),
31
inspect(gen)
32
);
33
genLinesOffset = false;
34
}
35
36
if (orig.column !== fooOrig.column || orig.line !== fooOrig.line) {
37
console.error(
38
'original mapping at %s is not the same as the genrated mapping:\ninput: [%s]\noutput:[%s]\n\n',
39
i ,
40
inspect(fooOrig),
41
inspect(orig)
42
);
43
origLinesSame = false;
44
}
45
}
46
return { genLinesOffset: genLinesOffset, origLinesSame: origLinesSame };
47
}
48
49
var foo = {
50
version : 3,
51
file : 'foo.js',
52
sourceRoot : '',
53
sources : [ 'foo.coffee' ],
54
names : [],
55
mappings : ';AAAA;CAAA;CAAA,CAAA,CAAA,IAAO,GAAK;CAAZ',
56
sourcesContent : [ 'console.log(require \'./bar.js\')\n' ] };
57
58
test('add one file with inlined source', function (t) {
59
60
var mapComment = convert.fromObject(foo).toComment();
61
var file = {
62
id: 'xyz'
63
, source: '(function() {\n\n console.log(require(\'./bar.js\'));\n\n}).call(this);\n' + '\n' + mapComment
64
, sourceFile: 'foo.js'
65
};
66
67
var lineOffset = 3
68
var base64 = combine.create()
69
.addFile(file, { line: lineOffset })
70
.base64()
71
72
var sm = convert.fromBase64(base64).toObject();
73
var res = checkMappings(foo, sm, lineOffset);
74
75
t.ok(res.genLinesOffset, 'all generated lines are offset properly and columns unchanged')
76
t.ok(res.origLinesSame, 'all original lines and columns are unchanged')
77
t.deepEqual(sm.sourcesContent, foo.sourcesContent, 'includes the original source')
78
t.deepEqual(sm.sources, ['foo.coffee'], 'includes original filename')
79
t.end()
80
});
81
82
83
test('add one file without inlined source', function (t) {
84
85
var mapComment = convert
86
.fromObject(foo)
87
.setProperty('sourcesContent', [])
88
.toComment();
89
90
var file = {
91
id: 'xyz'
92
, source: '(function() {\n\n console.log(require(\'./bar.js\'));\n\n}).call(this);\n' + '\n' + mapComment
93
, sourceFile: 'foo.js'
94
};
95
96
var lineOffset = 3
97
var base64 = combine.create()
98
.addFile(file, { line: lineOffset })
99
.base64()
100
101
var sm = convert.fromBase64(base64).toObject();
102
var mappings = mappingsFromMap(sm);
103
104
t.deepEqual(sm.sourcesContent, [file.source], 'includes the generated source')
105
t.deepEqual(sm.sources, ['foo.js'], 'includes generated filename')
106
107
t.deepEqual(
108
mappings
109
, [ { generated: { line: 4, column: 0 },
110
original: { line: 1, column: 0 },
111
source: 'foo.js', name: undefined },
112
{ generated: { line: 5, column: 0 },
113
original: { line: 2, column: 0 },
114
source: 'foo.js', name: undefined },
115
{ generated: { line: 6, column: 0 },
116
original: { line: 3, column: 0 },
117
source: 'foo.js', name: undefined },
118
{ generated: { line: 7, column: 0 },
119
original: { line: 4, column: 0 },
120
source: 'foo.js', name: undefined },
121
{ generated: { line: 8, column: 0 },
122
original: { line: 5, column: 0 },
123
source: 'foo.js', name: undefined },
124
{ generated: { line: 9, column: 0 },
125
original: { line: 6, column: 0 },
126
source: 'foo.js', name: undefined },
127
{ generated: { line: 10, column: 0 },
128
original: { line: 7, column: 0 },
129
source: 'foo.js', name: undefined } ]
130
, 'generates mappings offset by the given line'
131
)
132
t.end()
133
})
134
135
test('add one file with inlined sources from multiple files', function(t) {
136
var gen1Map = {
137
version: 3,
138
sources: [ 'one.js', 'two.js' ],
139
names: [],
140
mappings: 'AAAA;ACAA',
141
sourcesContent: [ 'console.log(1);', 'console.log(2);' ]
142
};
143
144
var gen2Map = {
145
version: 3,
146
sources: [ 'three.js', 'four.js' ],
147
names: [],
148
mappings: 'AAAA;ACAA',
149
sourcesContent: [ 'console.log(3);', 'console.log(4);' ]
150
};
151
152
var base64 = combine.create()
153
.addFile({
154
source: 'console.log(1);\nconsole.log(2);\n' + convert.fromObject(gen1Map).toComment(),
155
sourceFile: 'gen1.js'
156
})
157
.addFile({
158
source: 'console.log(3);\nconsole.log(4);\n' + convert.fromObject(gen2Map).toComment(),
159
sourceFile: 'gen2.js'
160
}, {line: 2})
161
.base64()
162
163
var sm = convert.fromBase64(base64).toObject();
164
165
166
t.deepEqual(sm.sources, ['one.js', 'two.js', 'three.js', 'four.js'], 'include the correct source');
167
168
t.deepEqual(sm.sourcesContent, [
169
'console.log(1);',
170
'console.log(2);',
171
'console.log(3);',
172
'console.log(4);'
173
], 'include the correct source file content');
174
175
t.deepEqual(
176
mappingsFromMap(sm)
177
, [ { original: { column: 0, line: 1 },
178
generated: { column: 0, line: 1 },
179
source: 'one.js',
180
name: undefined },
181
{ original: { column: 0, line: 1 },
182
generated: { column: 0, line: 2 },
183
source: 'two.js',
184
name: undefined },
185
{ original: { column: 0, line: 1 },
186
generated: { column: 0, line: 3 },
187
source: 'three.js',
188
name: undefined },
189
{ original: { column: 0, line: 1 },
190
generated: { column: 0, line: 4 },
191
source: 'four.js',
192
name: undefined } ], 'should properly map multiple files');
193
t.end()
194
});
195
196
test('relative path from multiple files', function(t) {
197
// Folder structure as follows:
198
//
199
// project
200
// +- src
201
// +- package1
202
// +- sub
203
// -- one.js
204
// -- two.js
205
// +- package2
206
// +- sub
207
// -- three.js
208
// -- four.js
209
// +- gen
210
// +- gen1.js
211
// +- gen2.js
212
// -- combined.js
213
//
214
// Where 'one.js', 'two.js' were combined to 'gen1.js'
215
// and 'three.js', 'four.js' were combined to 'gen2.js'.
216
// Now 'gen1.js' and 'gen2.js' are being combined from
217
// the project root folder.
218
var gen1Map = {
219
version: 3,
220
sources: [ 'sub/one.js', 'sub/two.js' ],
221
names: [],
222
mappings: 'AAAA;ACAA',
223
sourcesContent: [ 'console.log(1);', 'console.log(2);' ],
224
sourceRoot: '../src/package1'
225
};
226
227
var gen2Map = {
228
version: 3,
229
sources: [ 'sub/three.js', 'sub/four.js' ],
230
names: [],
231
mappings: 'AAAA;ACAA',
232
sourcesContent: [ 'console.log(3);', 'console.log(4);' ],
233
sourceRoot: '../src/package2'
234
};
235
236
var base64 = combine.create()
237
.addFile({
238
source: 'console.log(1);\nconsole.log(2);\n' + convert.fromObject(gen1Map).toComment(),
239
sourceFile: 'gen/gen1.js'
240
})
241
.addFile({
242
source: 'console.log(3);\nconsole.log(4);\n' + convert.fromObject(gen2Map).toComment(),
243
sourceFile: 'gen/gen2.js'
244
}, {line: 2})
245
.base64()
246
247
var sm = convert.fromBase64(base64).toObject();
248
249
t.deepEqual(sm.sources, ['src/package1/sub/one.js', 'src/package1/sub/two.js',
250
'src/package2/sub/three.js', 'src/package2/sub/four.js'],
251
'include the correct source');
252
253
t.deepEqual(sm.sourcesContent, [
254
'console.log(1);',
255
'console.log(2);',
256
'console.log(3);',
257
'console.log(4);'
258
], 'include the correct source file content');
259
260
t.deepEqual(
261
mappingsFromMap(sm)
262
, [ { original: { column: 0, line: 1 },
263
generated: { column: 0, line: 1 },
264
source: 'src/package1/sub/one.js',
265
name: undefined },
266
{ original: { column: 0, line: 1 },
267
generated: { column: 0, line: 2 },
268
source: 'src/package1/sub/two.js',
269
name: undefined },
270
{ original: { column: 0, line: 1 },
271
generated: { column: 0, line: 3 },
272
source: 'src/package2/sub/three.js',
273
name: undefined },
274
{ original: { column: 0, line: 1 },
275
generated: { column: 0, line: 4 },
276
source: 'src/package2/sub/four.js',
277
name: undefined } ], 'should properly map multiple files');
278
t.end()
279
});
280
281
test('relative path when source and file name are the same', function(t) {
282
var gen1Map = {
283
version: 3,
284
sources: [ 'a/b/one.js' ],
285
names: [],
286
mappings: 'AAAA',
287
file: 'a/b/one.js',
288
sourcesContent: [ 'console.log(1);\n' ]
289
};
290
291
var gen2Map = {
292
version: 3,
293
sources: [ 'a/b/two.js' ],
294
names: [],
295
mappings: 'AAAA',
296
file: 'a/b/two.js',
297
sourcesContent: [ 'console.log(2);\n' ]
298
};
299
300
var base64 = combine.create()
301
.addFile({
302
source: 'console.log(1);\n' + convert.fromObject(gen1Map).toComment(),
303
sourceFile: 'a/b/one.js'
304
})
305
.addFile({
306
source: 'console.log(2);\n' + convert.fromObject(gen2Map).toComment(),
307
sourceFile: 'a/b/two.js'
308
}, {line: 1})
309
.base64()
310
311
var sm = convert.fromBase64(base64).toObject();
312
313
t.deepEqual(sm.sources, ['a/b/one.js', 'a/b/two.js'],
314
'include the correct source');
315
316
t.deepEqual(
317
mappingsFromMap(sm)
318
, [ { original: { column: 0, line: 1 },
319
generated: { column: 0, line: 1 },
320
source: 'a/b/one.js',
321
name: undefined },
322
{ original: { column: 0, line: 1 },
323
generated: { column: 0, line: 2 },
324
source: 'a/b/two.js',
325
name: undefined } ], 'should properly map multiple files');
326
t.end()
327
});
328
329
test('remove comments', function (t) {
330
var mapComment = convert.fromObject(foo).toComment();
331
332
function sourcemapComments(src) {
333
var matches = src.match(commentRegex);
334
return matches ? matches.length : 0;
335
}
336
337
t.equal(sourcemapComments('var a = 1;\n' + mapComment), 1);
338
339
[ ''
340
, 'var a = 1;\n' + mapComment
341
, 'var a = 1;\n' + mapComment + '\nvar b = 5;\n' + mapComment
342
] .forEach(function (x) {
343
var removed = combine.removeComments(x)
344
t.equal(sourcemapComments(removed), 0)
345
})
346
t.end()
347
})
348
349