Edy Bourne
Edy Bourne

Reputation: 6206

Getting a ReferenceError attempting to eval what seems to me valid ES6. Why?

I am attempting to eval a js file which has the following content:

let typeCache = {};
export function type(label = '') {
    if (typeCache[label]) {
        throw new Error(`Action type "${label}" is not unique"`);
    }
    typeCache[label] = true;
    return label;
}

That's the whole file. No imports, nothing too fancy. But I'm getting an error that says ReferenceError: label is not defined. Which is strange, given that label seems defined just fine.

Can anyone spot anything wrong here?

UPDATE: This file (and many others) are generated from Typescript, and sent to gulp-template so that variables can be replaced, etc. That's when the code is evaled. Here is the complete stacktrace I'm getting:

ReferenceError: label is not defined at eval (lodash.templateSources[80]:9:10) at DestroyableTransform._transform (C:\Work\School\Frontend\node_modules\gulp-template\index.js:24:40) at DestroyableTransform.Transform._read (C:\Work\School\Frontend\node_modules\readable-stream\lib\_stream_transform.js:159:10) at DestroyableTransform.Readable.read (C:\Work\School\Frontend\node_modules\readable-stream\lib\_stream_readable.js:365:10) at flow (C:\Work\School\Frontend\node_modules\readable-stream\lib\_stream_readable.js:739:34) at DestroyableTransform.<anonymous> (C:\Work\School\Frontend\node_modules\readable-stream\lib\_stream_readable.js:610:7) at emitNone (events.js:86:13) at DestroyableTransform.emit (events.js:185:7) at onwriteDrain (C:\Work\School\Frontend\node_modules\gulp\node_modules\readable-stream\lib\_stream_writable.js:300:12) at afterWrite (C:\Work\School\Frontend\node_modules\gulp\node_modules\readable-stream\lib\_stream_writable.js:288:5) at onwrite (C:\Work\School\Frontend\node_modules\gulp\node_modules\readable-stream\lib\_stream_writable.js:281:7)

Thanks!

Upvotes: 0

Views: 208

Answers (1)

Edy Bourne
Edy Bourne

Reputation: 6206

Ohhh I found the issue.

The code above is sent to gulp-template, which uses Lodash's template function, which in turn also attempts to replace that ${label} in the function... resulting in the error given that this is not defined at that time.

So, beware my gulp-template friends.

I fixed my issue by disabling gulp-template's ES6 interpolation and leaving just the ERB style interpolation (e.g. <% blah %>). I did that by providing an options object along with the template, like so:

.pipe(plugins.template(templateToReplace, { interpolate: /<%=([\s\S]+?)%>/g }))

Upvotes: 1

Related Questions