UNPKG

2.43 kBJavaScriptView Raw
1// Copyright 2015 Simon Lydell
2// X11 (“MIT”) Licensed. (See LICENSE.)
3
4var fs = require("fs")
5var esprima = require("esprima")
6var jsTokens = require("./")
7
8
9var typeMap = {
10 Boolean: "name",
11 Identifier: "name",
12 Keyword: "name",
13 Null: "name",
14 Numeric: "number",
15 Punctuator: "punctuator",
16 RegularExpression: "regex",
17 String: "string"
18}
19
20function getEsprimaTokens(code) {
21 var tokens = esprima.tokenize(code, {loc: true})
22 tokens.forEach(function(token) { token.type = typeMap[token.type] })
23 return tokens
24}
25
26
27function jsTokensTokenize(string) {
28 jsTokens.lastIndex = 0
29 if (string === "") return []
30 var tokens = []
31 var match
32 while (match = jsTokens.exec(string)) {
33 tokens.push(jsTokens.matchToToken(match))
34 }
35 return tokens
36}
37
38var exclusionMap = {
39 comment: true,
40 whitespace: true
41}
42
43function getJsTokensTokens(code) {
44 return jsTokensTokenize(code)
45 .filter(function(token) { return !exclusionMap.hasOwnProperty(token.type) })
46}
47
48
49function compare(file) {
50 var code = fs.readFileSync(require.resolve(file)).toString()
51 var esprimaTokens = getEsprimaTokens(code)
52 var jsTokensTokens = getJsTokensTokens(code)
53
54 var length = Math.min(esprimaTokens.length, jsTokensTokens.length)
55 for (var index = 0; index < length; index++) {
56 var esprimaToken = esprimaTokens[index]
57 var jsTokensToken = jsTokensTokens[index]
58 if (
59 esprimaToken.type !== jsTokensToken.type ||
60 esprimaToken.value !== jsTokensToken.value
61 ) {
62 var loc = esprimaToken.loc.start
63 console.error(
64 file + ":" + loc.line + ":" + (loc.column + 1) + ": " +
65 "(token #" + (index + 1) + ")\n" +
66 " esprima: '" + esprimaToken.type + "': " + esprimaToken.value + "\n" +
67 " jsTokens: '" + jsTokensToken.type + "': " + jsTokensToken.value
68 )
69 return false
70 }
71 }
72
73 if (esprimaTokens.length !== jsTokensTokens.length) {
74 console.error(
75 file + ': Number of tokens mismatch.\n' +
76 " esprima: " + (esprimaTokens.length + 1) + "\n" +
77 " jsTokens: " + (jsTokensTokens.length + 1)
78 )
79 return false
80 }
81
82 return true
83}
84
85
86var results = process.argv.slice(2).map(compare)
87
88if (results.every(Boolean)) {
89 console.log(
90 "Comparison succeeded: esprima and jsTokens produced the same tokens!"
91 )
92} else {
93 console.error("Comparison failed.")
94}