public static JsAnalyzer Analyze(string directory, AnalysisLimits limits = null, Action parseCallback = null) { List <AnalysisFile> files = new List <AnalysisFile>(); foreach (var file in Directory.GetFiles(directory, "*", SearchOption.AllDirectories)) { if (String.Equals(Path.GetExtension(file), ".js", StringComparison.OrdinalIgnoreCase)) { var relativeFile = file.Substring(directory.Length); if (!limits.IsPathExceedNestingLimit(relativeFile)) { files.Add(new AnalysisFile(file, File.ReadAllText(file))); } } else if (String.Equals(Path.GetFileName(file), "package.json", StringComparison.OrdinalIgnoreCase)) { JavaScriptSerializer serializer = new JavaScriptSerializer(); Dictionary <string, object> json; try { json = serializer.Deserialize <Dictionary <string, object> >(File.ReadAllText(file)); } catch { continue; } object mainFile; if (json != null && json.TryGetValue("main", out mainFile) && mainFile is string) { files.Add(AnalysisFile.PackageJson(file, (string)mainFile)); } } } return(Analyze(limits, parseCallback, files.ToArray())); }
public void RequireAssignedExports() { var entries = Analysis.Analyze( new AnalysisFile("mod.js", @"var x = require('mymod').value;"), AnalysisFile.PackageJson("node_modules\\mymod\\package.json", "./lib/mymod"), new AnalysisFile("node_modules\\mymod\\lib\\mymod.js", @"exports.value = 42;"), new AnalysisFile("node_modules\\mymod\\lib\\mymod\\foo.js", @"exports.value = 'abc';") ); AssertUtil.ContainsExactly( entries["mod.js"].Analysis.GetTypeIdsByIndex("x", 0), BuiltinTypeId.Number ); }
public void RequireTrailingSlash() { var entries = Analysis.Analyze( new AnalysisFile("mod.js", @"var x = require('mymod').value;"), new AnalysisFile("node_modules\\mymod\\mymod.js", @"module.exports = require('./mymod/')"), AnalysisFile.PackageJson("node_modules\\mymod\\package.json", "./mymod.js"), new AnalysisFile("node_modules\\mymod\\mymod\\index.js", @"exports.value = 'abc';") ); AssertUtil.ContainsExactly( entries["mod.js"].Analysis.GetTypeIdsByIndex("x", 0), BuiltinTypeId.String ); }