Skip to content

Commit f9a35f3

Browse files
committed
fix jshint noise and inline script line mapping
1 parent 7194832 commit f9a35f3

2 files changed

Lines changed: 48 additions & 14 deletions

File tree

client/modules/Preview/EmbedFrame.jsx

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -58,27 +58,38 @@ function resolveCSSLinksInString(content, files) {
5858
return newContent;
5959
}
6060

61-
function jsPreprocess(jsText, fileName) {
61+
const JSHINT_OPTIONS = {
62+
esversion: 11,
63+
asi: true,
64+
laxbreak: true,
65+
laxcomma: true
66+
};
67+
68+
function jsPreprocess(jsText, fileName, lineOffset = 0) {
6269
let newContent = jsText;
6370
// check the code for js errors before sending it to strip comments
6471
// or loops.
65-
JSHINT(newContent);
72+
JSHINT(newContent, JSHINT_OPTIONS);
73+
74+
const fatal = JSHINT.errors.filter(
75+
(err) => err && (!err.code || err.code.startsWith('E'))
76+
);
6677

67-
if (JSHINT.errors.length === 0) {
78+
if (fatal.length === 0) {
6879
newContent = decomment(newContent, {
6980
ignore: /\/\/\s*noprotect/g,
7081
space: true
7182
});
7283
newContent = loopProtect(newContent);
7384
} else {
74-
JSHINT.errors.forEach((err) => {
75-
if (!err) return;
76-
const key = `${fileName}:${err.line}:${err.character}:${err.reason}`;
85+
fatal.forEach((err) => {
86+
const line = (err.line || 1) + lineOffset;
87+
const key = `${fileName}:${line}:${err.character}:${err.reason}`;
7788
if (jshintErrorKeys.has(key)) return;
7889
jshintErrorKeys.add(key);
7990
jshintErrors.push({
8091
file: fileName,
81-
line: err.line,
92+
line,
8293
character: err.character,
8394
reason: err.reason,
8495
evidence: err.evidence,
@@ -89,7 +100,7 @@ function jsPreprocess(jsText, fileName) {
89100
return newContent;
90101
}
91102

92-
function resolveJSLinksInString(content, files, fileName) {
103+
function resolveJSLinksInString(content, files, fileName, lineOffset = 0) {
93104
let newContent = content;
94105
let jsFileStrings = content.match(STRING_REGEX);
95106
jsFileStrings = jsFileStrings || [];
@@ -115,10 +126,17 @@ function resolveJSLinksInString(content, files, fileName) {
115126
}
116127
});
117128

118-
return jsPreprocess(newContent, fileName);
129+
return jsPreprocess(newContent, fileName, lineOffset);
119130
}
120131

121-
function resolveScripts(sketchDoc, files) {
132+
function getInlineScriptLineOffset(htmlContent, scriptInner) {
133+
if (!htmlContent || !scriptInner) return 0;
134+
const ix = htmlContent.indexOf(scriptInner);
135+
if (ix < 0) return 0;
136+
return htmlContent.substring(0, ix).split('\n').length - 1;
137+
}
138+
139+
function resolveScripts(sketchDoc, files, htmlContent) {
122140
const scriptsInHTML = sketchDoc.getElementsByTagName('script');
123141
const scriptsInHTMLArray = Array.prototype.slice.call(scriptsInHTML);
124142
scriptsInHTMLArray.forEach((script) => {
@@ -153,7 +171,12 @@ function resolveScripts(sketchDoc, files) {
153171
) !== null
154172
) {
155173
script.setAttribute('crossorigin', '');
156-
script.innerHTML = resolveJSLinksInString(script.innerHTML, files, 'index.html'); // eslint-disable-line
174+
const inlineOffset = getInlineScriptLineOffset(
175+
htmlContent,
176+
script.innerHTML
177+
);
178+
script.innerHTML = resolveJSLinksInString(script.innerHTML, files, 'index.html', inlineOffset); // eslint-disable-line
179+
script.dataset.inlineOffset = String(inlineOffset);
157180
}
158181
});
159182
}
@@ -209,7 +232,8 @@ function addLoopProtect(sketchDoc) {
209232
const scriptsInHTML = sketchDoc.getElementsByTagName('script');
210233
const scriptsInHTMLArray = Array.prototype.slice.call(scriptsInHTML);
211234
scriptsInHTMLArray.forEach((script) => {
212-
script.innerHTML = jsPreprocess(script.innerHTML, 'index.html'); // eslint-disable-line
235+
const inlineOffset = parseInt(script.dataset.inlineOffset || '0', 10);
236+
script.innerHTML = jsPreprocess(script.innerHTML, 'index.html', inlineOffset); // eslint-disable-line
213237
});
214238
}
215239

@@ -232,7 +256,7 @@ function injectLocalFiles(files, htmlFile, options) {
232256
resolvePathsForElementsWithAttribute('href', sketchDoc, resolvedFiles);
233257
// should also include background, data, poster, but these are used way less often
234258

235-
resolveScripts(sketchDoc, resolvedFiles);
259+
resolveScripts(sketchDoc, resolvedFiles, htmlFile.content);
236260
resolveStyles(sketchDoc, resolvedFiles);
237261

238262
if (textOutput || gridOutput) {

client/utils/previewEntry.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,23 @@ function handleMessageEvent(e) {
9393

9494
window.addEventListener('message', handleMessageEvent);
9595

96+
function resolveFileName(rawName) {
97+
if (!rawName) return rawName;
98+
if (window.objectUrls[rawName]) return window.objectUrls[rawName];
99+
const withBlob = `blob:${rawName}`;
100+
if (window.objectUrls[withBlob]) return window.objectUrls[withBlob];
101+
const segment = rawName.split('/').pop();
102+
if (window.objectPaths[segment]) return window.objectPaths[segment];
103+
return rawName;
104+
}
105+
96106
function resolveStackFrame({
97107
fileName,
98108
functionName,
99109
lineNumber,
100110
columnNumber
101111
}) {
102-
const resolvedFileName = window.objectUrls[fileName] || fileName;
112+
const resolvedFileName = resolveFileName(fileName);
103113
let resolvedLineNumber = lineNumber;
104114
if (resolvedFileName === 'index.html' && lineNumber) {
105115
resolvedLineNumber = lineNumber - htmlOffset;

0 commit comments

Comments
 (0)