miickel / gulp-angular-templatecache

Concatenates and registers AngularJS templates in the $templateCache.
MIT License
524 stars 103 forks source link

Leading slash added to filenames under gulp 4 #164

Open dmellstrom opened 5 years ago

dmellstrom commented 5 years ago

Calling this package with gulp 4 erroneously results in template filenames with leading separators.

This seems to be due to the breaking change in vinyl, where internal path records such as file.base are now normalized: https://github.com/gulpjs/vinyl/commit/9ae7cd10c5423cbad9d38fc6c99960c62ac2f429#diff-c49ce3c4dfcfa830e06789881dd4d5d4 That change breaks the following code: url = path.join(root, file.path.replace(base || file.base, ''));

It is the root cause of #153

I posted a workaround in the other issue, but I'll see if I can cook something up that's compatible with all vinyl versions instead

dmellstrom commented 5 years ago

To add some confusion, the tests for this package use vinyl 2. As a result, they have been written to accommodate the regression. I really don't think they should expect URLs with leading slashes for the template filenames, as that doesn't match the behavior observed when running this plugin with gulp 3.

simonua commented 5 years ago

Reopening due to breaking change with Gulp 3 after fixing this for Gulp 4 in 2.2.4. The code has since been reverted and 2.2.5 was published to reestablish status quo prior to this fix.

adamreisnz commented 5 years ago

This is a problem, it's breaking all our builds now >.< Fixed by using 2.2.4

simonua commented 5 years ago

@adamreisnz, but works when you continue to use transformUrl, correct?

adamreisnz commented 5 years ago

Yes that's right. We had 2 repositories actually with a similar build process, and one of them didn't have the transformUrl logic, hence the failure. Took us 2 hours to figure out what's happening 😢

Once we put the transformUrl in place it was working again.

simonua commented 5 years ago

Ugh! I'm sorry for the wasted time.

adamreisnz commented 5 years ago

No worries, these things happen 👍

Towerism commented 5 years ago

This is exactly what I'm dealing with right now. I'm upgrading dependencies of a legacy project, and upgrading gulp3->gulp4 mysteriously broke the site.

andzejsw commented 5 years ago

Same happened to me. Fixed by using 2.2.4 (i had v2.2.6).

j-fulbright commented 5 years ago

I see that 3.0.0 still is exhibiting this issue.. So I'm assuming that till whenever, that going back to 2.2.4 is still recommended?

simonua commented 5 years ago

Can you use the transformUrl approach with 3.0.0? I haven't dug into this much lately, admittedly, and I don't know that I am going to have the time for this, but if anyone were to put up a PR for a community review, that'd be a good step.

roman-rr commented 5 years ago

Hope it helps (gulp v4)

gulpfile.js


var replace = require('gulp-replace');
...
...
...
gulp.task('templatecache', function(done) {
  gulp.src(./www/js/**/**/*.html)
    .pipe(templateCache())
    .pipe(replace('put(\'/', 'put(\''))
    .pipe(gulp.dest('./www/js'))
    .on('end', done);
});
sblandin2018 commented 4 years ago

I incurred in this problem today migrating from gulp 3.9.1 to gulp 4.0.2

The transformUrl approach works with 3.0.0 but for some reason I don't understand the url passed to transformUrl function does not contain slashes but backslashes.

ie instead of:

/session/auto-planning/AutoPlanning.html

you get:

\session\auto-planning\AutoPlanning.html

To make transformUrl approach remove the leading slash you need to write:

transformUrl: function (url) {
    return url.replace(/^\\/, '');
}

Can you use the transformUrl approach with 3.0.0? I haven't dug into this much lately, admittedly, and I don't know that I am going to have the time for this, but if anyone were to put up a PR for a community review, that'd be a good step.

binarykitchen commented 4 years ago

Ugh, this bug did cost me hours and was a pain until I found the above temporary solution. But really, this should be fixed eh?

AshokKumarSharma commented 3 years ago

@binarykitchen what was solution you take to remove the slash. required output $templateCache.put("directives/sy-dob-selector-directive.html","html"); but getting $templateCache.put("/directives/sy-dob-selector-directive.html","html");

i just need to remove the slash . i was migrating the gulp 3 to 4 version

AshokKumarSharma commented 3 years ago

@roman-rr that solution doesn't work

opolo commented 3 years ago

Thx, transformUrl fix worked just fine for our legacy solution I just upgraded to Gulp v4.

jhlee8804 commented 1 year ago

@sblandin2018 Not working on osx.

use this:

transformUrl: function (url) {
    return url.replace(/^\//, '');
}