atlas_coverage_core/
debug.rs1use settings::Settings;
2use model::PuppeteerData;
3use model::SourceMap;
4use source_map::SourceMapSource;
5use vlq_decode;
6use std::path::Path;
7use util;
8use lines::calculate_executable_line_mappings;
9use source_map::process_references;
10use lines::calculate_line_coverage;
11use load;
12use std::env::current_dir;
13use std::env::args;
14use std::fs;
15use lines::FileCoverage;
16
17pub fn print_existing(settings: Settings) {
18 let args: Vec<String> = args().collect();
19 let reads = fs::read_dir(current_dir().expect("Not in a valid directory").join(&args[1])).expect("Cannot read directory");
20 let paths = reads.into_iter().map(|v| v.expect("Cannot read file entry").path()).collect::<Vec<_>>();
21
22 let values = load::load_items(paths);
23
24 for v in values {
25 print_if_has_existing_source_map(&settings, v);
26 }
27}
28
29fn print_if_has_existing_source_map(settings: &Settings, data: PuppeteerData) {
30 if let Some(source_mapping_url) = data.get_source_mapping_url() {
31 let source_path = data.url.replace(&settings.public_url_base, &settings.dist_path);
32
33 let source_mapping_url = source_mapping_url.replace("//# sourceMappingURL=", "");
34 let source_mapping_path = Path::new(&source_path)
35 .parent()
36 .unwrap()
37 .join(source_mapping_url.clone());
38
39 println!("{} - {}", source_mapping_url, data.url);
40
41 let source_mapping_path = Path::new(&source_mapping_path);
42 if source_mapping_path.exists() {
43 let source_map: SourceMap = util::deserialize_object(source_mapping_path).unwrap();
44
45 let references = process_references(&settings, &source_map);
46
47 let _meta_refs = references.iter().map(|r| r.meta()).collect::<Vec<_>>();
48let file_refs = references.iter().map(|s| s.file_path.clone()).collect();
55 let line_refs = calculate_executable_line_mappings(&source_map, references);
56 let file_coverage : Vec<FileCoverage> =
57 calculate_line_coverage(data.ranges, line_refs, file_refs, data.text.as_str());
58
59 file_coverage.iter().for_each(|fc| {
60 let content = util::fast_read(&fc.path);
61 match content {
62 Ok(content) => {
63 let lines = content.lines().count();
64 let cov_lines = fc.lines.iter().last().map(|v| v.line_number);
65 match cov_lines {
66 Some(last_line) => {
67 println!("Within bounds? {: <5} || {: <5} - {: <5}", last_line <= lines, lines, last_line);
68 },
69 None => {
70 println!("Empty file");
71 }
72 }
73 },
74 Err(_err) => {
75 println!("Within bounds? {: <5} - {} doesn't exist or is empty!", false, &fc.path)
76 },
77 }
78 })
79}
81 }
82
83
84}
85
86pub fn debug_source_map(
89 _settings: &Settings,
90 source_map: &SourceMap,
91 references: Vec<SourceMapSource>,
92 minified: String,
93) {
94 let sources = references
95 .into_iter()
96 .map(SourceMapSource::convert_to_user_source)
97 .collect::<Vec<_>>();
98 let mut prev: usize = 9999;
99 let mut announce = None;
100 for v in vlq_decode::MappingData::new(source_map.mappings.as_bytes()) {
101 let minified_slice: String = minified
102 .lines()
103 .skip(v.gen_line as usize)
104 .next()
105 .unwrap()
106 .chars()
107 .skip(v.gen_column as usize)
108 .take(20)
109 .collect();
110 let mut source_slice: Option<String> = None;
111 let mut name: Option<String> = None;
112 if let Some(ref source_ref) = v.source.as_ref() {
113 if prev != source_ref.source_idx as usize {
114 prev = source_ref.source_idx as usize;
115 announce = Some(prev);
116 }
117 source_slice = sources
118 .get(source_ref.source_idx as usize)
119 .unwrap()
120 .as_ref()
121 .map(|ref source_content| {
122 source_content
123 .lines()
124 .skip(source_ref.source_line as usize)
125 .next()
126 .unwrap()
127 .chars()
128 .skip(source_ref.source_col as usize)
129 .take(20)
130 .collect()
131 });
132 if let Some(name_idx) = source_ref.name_idx {
133 name = source_map
134 .names
135 .get(name_idx as usize)
136 .map(|v| v.to_owned());
137 }
138 }
139 if let Some(announce_idx) = announce {
140 println!("--------------------------------------------------------------------------------------------");
141 println!("FILE {}", source_map.sources[announce_idx]);
142 println!("--------------------------------------------------------------------------------------------");
143 announce = None
144 }
145 if let Some(ref source_slice) = source_slice {
146 let source = v.source.as_ref().unwrap();
147 println!(
148 "{: <1}.{: <5} > {: <3}.{: <5} | {: <20} | {: <20} | {: <20}",
149 v.gen_line,
150 v.gen_column,
151 source.source_line,
152 source.source_col,
153 minified_slice,
154 source_slice,
155 name.unwrap_or("".to_owned())
156 );
157 } else {
158 println!(
159 "{: <1}.{: <5} | {: <20} |",
160 v.gen_line, v.gen_column, minified_slice
161 );
162 }
163 }
164}