'use strict'; /*jshint asi: true */ var test = require('tap').test; var convert = require('convert-source-map'); var commentRegex = require('convert-source-map').commentRegex; var combine = require('..'); var mappingsFromMap = require('../lib/mappings-from-map'); function checkMappings(foo, sm, lineOffset) { function inspect(obj, depth) { return require('util').inspect(obj, false, depth || 5, true); } var fooMappings = mappingsFromMap(foo); var mappings = mappingsFromMap(sm); var genLinesOffset = true; var origLinesSame = true; for (var i = 0; i < mappings.length; i++) { var fooGen = fooMappings[i].generated; var fooOrig = fooMappings[i].original; var gen = mappings[i].generated var orig = mappings[i].original; if (gen.column !== fooGen.column || gen.line !== (fooGen.line + lineOffset)) { console.error( 'generated mapping at %s not offset properly:\ninput: [%s]\noutput:[%s]\n\n', i , inspect(fooGen), inspect(gen) ); genLinesOffset = false; } if (orig.column !== fooOrig.column || orig.line !== fooOrig.line) { console.error( 'original mapping at %s is not the same as the genrated mapping:\ninput: [%s]\noutput:[%s]\n\n', i , inspect(fooOrig), inspect(orig) ); origLinesSame = false; } } return { genLinesOffset: genLinesOffset, origLinesSame: origLinesSame }; } var foo = { version : 3, file : 'foo.js', sourceRoot : '', sources : [ 'foo.coffee' ], names : [], mappings : ';AAAA;CAAA;CAAA,CAAA,CAAA,IAAO,GAAK;CAAZ', sourcesContent : [ 'console.log(require \'./bar.js\')\n' ] }; test('add one file with inlined source', function (t) { var mapComment = convert.fromObject(foo).toComment(); var file = { id: 'xyz' , source: '(function() {\n\n console.log(require(\'./bar.js\'));\n\n}).call(this);\n' + '\n' + mapComment , sourceFile: 'foo.js' }; var lineOffset = 3 var base64 = combine.create() .addFile(file, { line: lineOffset }) .base64() var sm = convert.fromBase64(base64).toObject(); var res = checkMappings(foo, sm, lineOffset); t.ok(res.genLinesOffset, 'all generated lines are offset properly and columns unchanged') t.ok(res.origLinesSame, 'all original lines and columns are unchanged') t.deepEqual(sm.sourcesContent, foo.sourcesContent, 'includes the original source') t.deepEqual(sm.sources, ['foo.coffee'], 'includes original filename') t.end() }); test('add one file without inlined source', function (t) { var mapComment = convert .fromObject(foo) .setProperty('sourcesContent', []) .toComment(); var file = { id: 'xyz' , source: '(function() {\n\n console.log(require(\'./bar.js\'));\n\n}).call(this);\n' + '\n' + mapComment , sourceFile: 'foo.js' }; var lineOffset = 3 var base64 = combine.create() .addFile(file, { line: lineOffset }) .base64() var sm = convert.fromBase64(base64).toObject(); var mappings = mappingsFromMap(sm); t.deepEqual(sm.sourcesContent, [file.source], 'includes the generated source') t.deepEqual(sm.sources, ['foo.js'], 'includes generated filename') t.deepEqual( mappings , [ { generated: { line: 4, column: 0 }, original: { line: 1, column: 0 }, source: 'foo.js', name: null }, { generated: { line: 5, column: 0 }, original: { line: 2, column: 0 }, source: 'foo.js', name: null }, { generated: { line: 6, column: 0 }, original: { line: 3, column: 0 }, source: 'foo.js', name: null }, { generated: { line: 7, column: 0 }, original: { line: 4, column: 0 }, source: 'foo.js', name: null }, { generated: { line: 8, column: 0 }, original: { line: 5, column: 0 }, source: 'foo.js', name: null }, { generated: { line: 9, column: 0 }, original: { line: 6, column: 0 }, source: 'foo.js', name: null }, { generated: { line: 10, column: 0 }, original: { line: 7, column: 0 }, source: 'foo.js', name: null } ] , 'generates mappings offset by the given line' ) t.end() }) test('add one file with inlined sources from multiple files', function(t) { var gen1Map = { version: 3, sources: [ 'one.js', 'two.js' ], names: [], mappings: 'AAAA;ACAA', sourcesContent: [ 'console.log(1);', 'console.log(2);' ] }; var gen2Map = { version: 3, sources: [ 'three.js', 'four.js' ], names: [], mappings: 'AAAA;ACAA', sourcesContent: [ 'console.log(3);', 'console.log(4);' ] }; var base64 = combine.create() .addFile({ source: 'console.log(1);\nconsole.log(2);\n' + convert.fromObject(gen1Map).toComment(), sourceFile: 'gen1.js' }) .addFile({ source: 'console.log(3);\nconsole.log(4);\n' + convert.fromObject(gen2Map).toComment(), sourceFile: 'gen2.js' }, {line: 2}) .base64() var sm = convert.fromBase64(base64).toObject(); t.deepEqual(sm.sources, ['one.js', 'two.js', 'three.js', 'four.js'], 'include the correct source'); t.deepEqual(sm.sourcesContent, [ 'console.log(1);', 'console.log(2);', 'console.log(3);', 'console.log(4);' ], 'include the correct source file content'); t.deepEqual( mappingsFromMap(sm) , [ { original: { column: 0, line: 1 }, generated: { column: 0, line: 1 }, source: 'one.js', name: null }, { original: { column: 0, line: 1 }, generated: { column: 0, line: 2 }, source: 'two.js', name: null }, { original: { column: 0, line: 1 }, generated: { column: 0, line: 3 }, source: 'three.js', name: null }, { original: { column: 0, line: 1 }, generated: { column: 0, line: 4 }, source: 'four.js', name: null } ], 'should properly map multiple files'); t.end() }); test('relative path from multiple files', function(t) { // Folder structure as follows: // // project // +- src // +- package1 // +- sub // -- one.js // -- two.js // +- package2 // +- sub // -- three.js // -- four.js // +- gen // +- gen1.js // +- gen2.js // -- combined.js // // Where 'one.js', 'two.js' were combined to 'gen1.js' // and 'three.js', 'four.js' were combined to 'gen2.js'. // Now 'gen1.js' and 'gen2.js' are being combined from // the project root folder. var gen1Map = { version: 3, sources: [ 'sub/one.js', 'sub/two.js' ], names: [], mappings: 'AAAA;ACAA', sourcesContent: [ 'console.log(1);', 'console.log(2);' ], sourceRoot: '../src/package1' }; var gen2Map = { version: 3, sources: [ 'sub/three.js', 'sub/four.js' ], names: [], mappings: 'AAAA;ACAA', sourcesContent: [ 'console.log(3);', 'console.log(4);' ], sourceRoot: '../src/package2' }; var base64 = combine.create() .addFile({ source: 'console.log(1);\nconsole.log(2);\n' + convert.fromObject(gen1Map).toComment(), sourceFile: 'gen/gen1.js' }) .addFile({ source: 'console.log(3);\nconsole.log(4);\n' + convert.fromObject(gen2Map).toComment(), sourceFile: 'gen/gen2.js' }, {line: 2}) .base64() var sm = convert.fromBase64(base64).toObject(); t.deepEqual(sm.sources, ['src/package1/sub/one.js', 'src/package1/sub/two.js', 'src/package2/sub/three.js', 'src/package2/sub/four.js'], 'include the correct source'); t.deepEqual(sm.sourcesContent, [ 'console.log(1);', 'console.log(2);', 'console.log(3);', 'console.log(4);' ], 'include the correct source file content'); t.deepEqual( mappingsFromMap(sm) , [ { original: { column: 0, line: 1 }, generated: { column: 0, line: 1 }, source: 'src/package1/sub/one.js', name: null }, { original: { column: 0, line: 1 }, generated: { column: 0, line: 2 }, source: 'src/package1/sub/two.js', name: null }, { original: { column: 0, line: 1 }, generated: { column: 0, line: 3 }, source: 'src/package2/sub/three.js', name: null }, { original: { column: 0, line: 1 }, generated: { column: 0, line: 4 }, source: 'src/package2/sub/four.js', name: null } ], 'should properly map multiple files'); t.end() }); test('relative path when source and file name are the same', function(t) { var gen1Map = { version: 3, sources: [ 'a/b/one.js' ], names: [], mappings: 'AAAA', file: 'a/b/one.js', sourcesContent: [ 'console.log(1);\n' ] }; var gen2Map = { version: 3, sources: [ 'a/b/two.js' ], names: [], mappings: 'AAAA', file: 'a/b/two.js', sourcesContent: [ 'console.log(2);\n' ] }; var base64 = combine.create() .addFile({ source: 'console.log(1);\n' + convert.fromObject(gen1Map).toComment(), sourceFile: 'a/b/one.js' }) .addFile({ source: 'console.log(2);\n' + convert.fromObject(gen2Map).toComment(), sourceFile: 'a/b/two.js' }, {line: 1}) .base64() var sm = convert.fromBase64(base64).toObject(); t.deepEqual(sm.sources, ['a/b/one.js', 'a/b/two.js'], 'include the correct source'); t.deepEqual( mappingsFromMap(sm) , [ { original: { column: 0, line: 1 }, generated: { column: 0, line: 1 }, source: 'a/b/one.js', name: null }, { original: { column: 0, line: 1 }, generated: { column: 0, line: 2 }, source: 'a/b/two.js', name: null } ], 'should properly map multiple files'); t.end() }); test('remove comments', function (t) { var mapComment = convert.fromObject(foo).toComment(); function sourcemapComments(src) { var matches = src.match(commentRegex); return matches ? matches.length : 0; } t.equal(sourcemapComments('var a = 1;\n' + mapComment), 1); [ '' , 'var a = 1;\n' + mapComment , 'var a = 1;\n' + mapComment + '\nvar b = 5;\n' + mapComment ] .forEach(function (x) { var removed = combine.removeComments(x) t.equal(sourcemapComments(removed), 0) }) t.end() })
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 19553 | swellard | Move and rename clients | ||
//guest/perforce_software/helix-web-services/main/source/clients/2016.1.0/javascript/node_modules/combine-source-map/test/combine-source-map.js | |||||
#2 | 19053 | tjuricek |
Rebuild JavaScript Client SDK. The JavaScript client now is a "typed" approach that tends to be similar in approach to the other clients, based on the swagger definition for the platform version. Importantly, client SDK tests are individual scripts (that run under node) that are actually controlled via TestNG. This approach now lets us use a consistent test reporting format so we can at least collect reports from each of the jobs. The documentation is still in progress, that I want to validate as the tests are generated. |
||
#1 | 18810 | tjuricek |
First-pass at JavaScript client SDK. JavaScript requires Node with Gulp to "browserfy" the library. It's the easiest way I found to use the swagger-js project; bundle up a wrapping method. There is no JavaScript reference guide. The swagger-js doesn't really document what they do very well, actually. Overall I'm not particularly impressed by swagger-js, it was hard to even figure out what the right method syntax was. We may want to invest time in doing it better. This required setting CORS response headers, which are currently defaulted to a fairly insecure setting. |