grunt-s3 icon indicating copy to clipboard operation
grunt-s3 copied to clipboard

Error: "has no method 'replace'" when src is array

Open aduth opened this issue 12 years ago • 6 comments

Using fresh install from Git repository link (0.1.0 with Grunt 0.4.0rc7).

Here is my grunt-s3 configuration:

s3: {
    key: '<%= aws.key %>',
    secret: '<%= aws.secret %>',
    bucket: '<%= aws.bucket %>',
    access: 'public-read',
    upload: [
        {
            rel: '<%= siteConfig.output %>',
            src: ['<%= siteConfig.output %>/**/*.*', '!<%= siteConfig.output %>/js/*.js', '!<%= siteConfig.output %>/css/*.css', '!<%= siteConfig.output %>/img/*.*' ],
            dest: '/',
            gzip: true
        },
        {
            rel: '<%= siteConfig.output %>',
            src: ['<%= siteConfig.output %>/js/*.js', '<%= siteConfig.output %>/css/*.css', '<%= siteConfig.output %>/img/*.*'],
            dest: '/',
            gzip: true,
            headers: { 'Cache-Control': 'public, max-age=' + (60 * 60 * 24 * 365) }
        }
    ]
}

Seems to work fine when src properties are not arrays, but I get the following error with the above configuration:

Warning: Object /Users/Andrew/Dropbox/Projects/andrewduthie.com/output/**/*.*,!/Users/Andrew/Dropbox/Projects/andrewduthie.com/output/js/*.js,!/Users/Andrew/Dropbox/Projects/andrewduthie.com/output/css/*.css,!/Users/Andrew/Dropbox/Projects/andrewduthie.com/output/img/*.* has no method 'replace' Use --force to continue.

From my own debugging, seems to be caused at s3.js:54

upload.src = path.resolve(grunt.template.process(upload.src));

When I change upload.src to file, it seems to work correctly for me, but I'm not familiar enough with it to be able to say it's a fix in all cases.

aduth avatar Jan 23 '13 03:01 aduth

Yeah, src doesn't support Arrays, but it absolutely should. I consider this a bug. I will look into it ASAP. In the mean time you can (painfully, I know), specify separate upload objects.

pifantastic avatar Jan 23 '13 03:01 pifantastic

Please just use this.files instead of parsing src yourself. Grunt this for you and it just works. See Creating Tasks and Creating Plugins. Please follow the files conventions.

davidpfahler avatar May 10 '13 09:05 davidpfahler

@davidpfahler can you elaborate on what you mean?

pifantastic avatar May 10 '13 13:05 pifantastic

I think what @davidpfahler is eluding to can be found here https://github.com/gruntjs/grunt/wiki/Inside-Tasks#inside-multi-tasks. Grunt has file path parsing built in already, might as well use it to keep things DRY. In the meantime, wrapping that offending line identified by @aduth with:

if (Object.prototype.toString.call(upload.src) != '[object Array]') {
   upload.src = path.resolve(grunt.template.process(upload.src));
}

seems to do the trick.

danhapgood avatar Jul 08 '13 16:07 danhapgood

I’m running into this issue as well. I second the notion of using grunt’s built-in support for processing src+dest pairs inside tasks. The link provided by @danhapgood above is out of date, please see http://gruntjs.com/api/inside-tasks#this.files.

zakness avatar Jul 13 '14 18:07 zakness

I was running in to the same issue, and what @danhapgood said fixed it! Thanks.

jjbskir avatar Jul 16 '14 18:07 jjbskir