mirror of
https://github.com/jashkenas/coffeescript.git
synced 2026-01-12 00:08:13 -05:00
186 lines
5.2 KiB
CoffeeScript
186 lines
5.2 KiB
CoffeeScript
return if global.testingBrowser
|
|
|
|
{spawn, fork} = require('child_process')
|
|
SourceMap = require '../src/sourcemap'
|
|
|
|
vlqEncodedValues = [
|
|
[1, 'C'],
|
|
[-1, 'D'],
|
|
[2, 'E'],
|
|
[-2, 'F'],
|
|
[0, 'A'],
|
|
[16, 'gB'],
|
|
[948, 'o7B']
|
|
]
|
|
|
|
test "encodeVlq tests", ->
|
|
for pair in vlqEncodedValues
|
|
eq ((new SourceMap).encodeVlq pair[0]), pair[1]
|
|
|
|
test "SourceMap tests", ->
|
|
map = new SourceMap
|
|
map.add [0, 0], [0, 0]
|
|
map.add [1, 5], [2, 4]
|
|
map.add [1, 6], [2, 7]
|
|
map.add [1, 9], [2, 8]
|
|
map.add [3, 0], [3, 4]
|
|
|
|
testWithFilenames = map.generate {
|
|
sourceRoot: ''
|
|
sourceFiles: ['source.coffee']
|
|
generatedFile: 'source.js'
|
|
}
|
|
|
|
deepEqual testWithFilenames, {
|
|
version: 3
|
|
file: 'source.js'
|
|
sourceRoot: ''
|
|
sources: ['source.coffee']
|
|
names: []
|
|
mappings: 'AAAA;;IACK,GAAC,CAAG;IAET'
|
|
}
|
|
|
|
deepEqual map.generate(), {
|
|
version: 3
|
|
file: ''
|
|
sourceRoot: ''
|
|
sources: ['<anonymous>']
|
|
names: []
|
|
mappings: 'AAAA;;IACK,GAAC,CAAG;IAET'
|
|
}
|
|
|
|
# Look up a generated column - should get back the original source position.
|
|
arrayEq map.sourceLocation([2,8]), [1,9]
|
|
|
|
# Look up a point further along on the same line - should get back the same source position.
|
|
arrayEq map.sourceLocation([2,10]), [1,9]
|
|
|
|
test "#3075: v3 source map fields", ->
|
|
{ js, v3SourceMap, sourceMap } = CoffeeScript.compile 'console.log Date.now()',
|
|
filename: 'tempus_fugit.coffee'
|
|
sourceMap: yes
|
|
sourceRoot: './www_root/coffee/'
|
|
|
|
v3SourceMap = JSON.parse v3SourceMap
|
|
arrayEq v3SourceMap.sources, ['tempus_fugit.coffee']
|
|
eq v3SourceMap.sourceRoot, './www_root/coffee/'
|
|
|
|
test "node --enable-source-map built in stack trace mapping", ->
|
|
new Promise (resolve, reject) ->
|
|
proc = fork './test/importing/error.coffee', [
|
|
'--enable-source-maps'
|
|
], stdio: 'pipe'
|
|
|
|
err = ''
|
|
proc.stderr.setEncoding 'utf8'
|
|
proc.stderr.on 'data', (str) -> err += str
|
|
proc.on 'close', ->
|
|
try
|
|
match = err.match /error\.coffee:(\d+):(\d+)/
|
|
throw new Error err unless match
|
|
|
|
[_, line, column] = match
|
|
equal line, 3 # Mapped source line
|
|
equal column, 9 # Mapped source column
|
|
|
|
resolve()
|
|
catch exception
|
|
reject exception
|
|
|
|
if Number(process.versions.node.split('.')[0]) >= 14
|
|
test "NODE_OPTIONS=--enable-source-maps environment variable stack trace mapping", ->
|
|
new Promise (resolve, reject) ->
|
|
proc = fork './test/importing/error.coffee', [],
|
|
env:
|
|
NODE_OPTIONS: '--enable-source-maps'
|
|
stdio: 'pipe'
|
|
|
|
err = ''
|
|
proc.stderr.setEncoding 'utf8'
|
|
proc.stderr.on 'data', (str) -> err += str
|
|
proc.on 'close', ->
|
|
try
|
|
match = err.match /error\.coffee:(\d+):(\d+)/
|
|
throw new Error err unless match
|
|
|
|
[_, line, column] = match
|
|
equal line, 3 # Mapped source line
|
|
equal column, 9 # Mapped source column
|
|
|
|
resolve()
|
|
catch exception
|
|
reject exception
|
|
|
|
test "generate correct stack traces with --enable-source-maps from bin/coffee", ->
|
|
new Promise (resolve, reject) ->
|
|
proc = fork 'test/importing/error.coffee',
|
|
['--enable-source-maps'],
|
|
stdio: 'pipe'
|
|
|
|
err = ""
|
|
proc.stderr.setEncoding 'utf8'
|
|
proc.stderr.on 'data', (str) -> err += str
|
|
proc.on 'close', ->
|
|
try
|
|
match = err.match /error\.coffee:(\d+):(\d+)/
|
|
throw new Error err unless match
|
|
|
|
[_, line, column] = match
|
|
equal line, 3 # Mapped source line
|
|
equal column, 9 # Mapped source column
|
|
|
|
resolve()
|
|
catch exception
|
|
reject exception
|
|
|
|
test "don't change stack traces if another library has patched `Error.prepareStackTrace`", ->
|
|
new Promise (resolve, reject) ->
|
|
# This uses `spawn` rather than the preferred `fork` because `fork` requires
|
|
# loading code in a separate file. The `--eval` here shows exactly what is
|
|
# executing without indirection.
|
|
proc = spawn 'node', [
|
|
'--eval', """
|
|
const patchedPrepareStackTrace = Error.prepareStackTrace = function() {};
|
|
require('./register.js');
|
|
process.stdout.write(Error.prepareStackTrace === patchedPrepareStackTrace ? 'preserved' : 'overwritten');
|
|
"""
|
|
]
|
|
|
|
out = ''
|
|
proc.stdout.setEncoding 'utf8'
|
|
proc.stdout.on 'data', (str) -> out += str
|
|
|
|
proc.on 'close', (status) ->
|
|
try
|
|
equal status, 0
|
|
equal out, 'preserved'
|
|
|
|
resolve()
|
|
catch exception
|
|
reject exception
|
|
|
|
test "requiring 'CoffeeScript' doesn't change `Error.prepareStackTrace`", ->
|
|
new Promise (resolve, reject) ->
|
|
# This uses `spawn` rather than the preferred `fork` because `fork` requires
|
|
# loading code in a separate file. The `--eval` here shows exactly what is
|
|
# executing without indirection.
|
|
proc = spawn 'node', [
|
|
'--eval', """
|
|
require('./lib/coffeescript/coffeescript.js');
|
|
process.stdout.write(Error.prepareStackTrace === undefined ? 'unused' : 'defined');
|
|
"""
|
|
]
|
|
|
|
out = ''
|
|
proc.stdout.setEncoding 'utf8'
|
|
proc.stdout.on 'data', (str) -> out += str
|
|
|
|
proc.on 'close', (status) ->
|
|
try
|
|
equal status, 0
|
|
equal out, 'unused'
|
|
|
|
resolve()
|
|
catch exception
|
|
reject exception
|