@@ -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 * n o p r o t e c t / 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 ) {
0 commit comments