Skip to content

Commit 98659a9

Browse files
Merge pull request #1 from solidusjs/filerev-manifest
New addManifest plugin
2 parents 2e297e8 + 99315a3 commit 98659a9

File tree

3 files changed

+103
-3
lines changed

3 files changed

+103
-3
lines changed

README.md

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ styles-22222222.css: body {background: url("/loader-11111111.gif")}
2525
index-33333333.html: <img src="/loader-11111111.gif" /> <link href="/styles-22222222.css" type="text/css" />
2626
```
2727

28-
## Usage:
28+
## Usage
2929

3030
```javascript
3131
var filerevReplace = require('gulp-filerev-replace');
@@ -40,12 +40,48 @@ gulp.src('/mysite/**/*', {base: '/mysite'})
4040
...
4141
```
4242

43-
### Options:
43+
### Options
4444

4545
- `filerev`: [minimatch](https://github.com/isaacs/minimatch) pattern to filter the files to filerev.
4646
- `replace`: [minimatch](https://github.com/isaacs/minimatch) pattern to filter the files to replace.
4747
- `base`: Directory from where the files are served by the web server. Optional, defaults to the [file's base](https://github.com/gulpjs/gulp/blob/master/docs/API.md#optionsbase);
4848

49+
Manifest
50+
====================
51+
52+
A second plugin is also available that adds a new file to the stream. This file contains a JSON list of all files that were filereved.
53+
54+
## Usage
55+
56+
```javascript
57+
var filerevReplace = require('gulp-filerev-replace');
58+
59+
// Include all files to filerev and/or replace, making sure the base is correct
60+
gulp.src('/mysite/**/*', {base: '/mysite'})
61+
.pipe(filerevReplace({
62+
filerev: ['assets/**/*'], // Select the files to filerev
63+
replace: ['views/**/*'], // Select the files to replace
64+
base: 'assets' // Filerevved files are served from the assets directory by the web server
65+
}))
66+
.pipe(filerevReplace.addManifest({path: 'assets/filerev.json'}))
67+
...
68+
```
69+
70+
The example above would add a new file in the stream, with path `assets/filerev.json`, containing something like:
71+
72+
```javascript
73+
{
74+
"assets/loader.gif": "assets/loader-11111111.gif",
75+
"assets/styles.css": "assets/styles-22222222.css"
76+
}
77+
```
78+
79+
### Options
80+
81+
`options` is an object containing the [vinyl file options](https://github.com/wearefractal/vinyl#file) to use for the manifest file. It defaults to:
82+
83+
- `path`: `filerev-replace-manifest.json`
84+
4985
## TODO
5086

5187
- Try to break this into simpler plugins...

index.js

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ var istextorbinary = require('istextorbinary');
99
const PLUGIN_NAME = 'gulp-filerev-replace';
1010
const STARTING_DELIMITER = '(\\\\?\'|\\\\?"|\\\\?\\(\\s*)';
1111
const ENDING_DELIMITER = '(\\\\?\'|\\\\?"|\\s*\\\\?\\)|\\?|#)';
12+
const MANIFEST_OPTIONS = {path: 'filerev-replace-manifest.json'};
1213

1314
function plugin(options) {
1415
var self = {};
@@ -21,6 +22,23 @@ function plugin(options) {
2122
)();
2223
};
2324

25+
plugin.addManifest = function(options) {
26+
var manifest = {};
27+
var manifest_file = new gutil.File(options || MANIFEST_OPTIONS);
28+
29+
return through.obj(function(file, enc, cb) {
30+
if (file.old_relative) manifest[file.old_relative] = file.relative;
31+
this.push(file);
32+
cb();
33+
}, function(cb) {
34+
manifest_file.contents = new Buffer(JSON.stringify(manifest, null, 2));
35+
this.push(manifest_file);
36+
cb();
37+
});
38+
};
39+
40+
// PRIVATE
41+
2442
function initialize(options) {
2543
var self = this;
2644

@@ -101,7 +119,8 @@ function filerevAndReplace() {
101119
}
102120

103121
if (self.filerev[old_relative]) {
104-
file.path = filerevFile(file);
122+
file.path = filerevFile(file);
123+
file.old_relative = old_relative;
105124

106125
gutil.log(PLUGIN_NAME, 'Filerevved: ' + old_relative + ' -> ' + file.relative);
107126

test/test.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,51 @@ describe('gulp-filerev-replace', function() {
123123
done();
124124
});
125125
});
126+
127+
describe('.addManifest', function() {
128+
it('adds a manifest file to the stream', function(done) {
129+
gulp
130+
.src(fixtures('basic/*'))
131+
.pipe(filerevReplace())
132+
.pipe(filerevReplace.addManifest())
133+
.pipe(sa.last(function(file) {
134+
assert.equal(file.relative, 'filerev-replace-manifest.json');
135+
assert.deepEqual(JSON.parse(file.contents), {
136+
'loader.gif': 'loader-aef3c727.gif',
137+
'styles.css': 'styles-b442055f.css',
138+
'index.html': 'index-42012d94.html'
139+
});
140+
}))
141+
.pipe(sa.end(done));
142+
});
143+
144+
it('with folders', function(done) {
145+
gulp
146+
.src(fixtures('basic/*'), {base: fixtures('')})
147+
.pipe(filerevReplace({base: fixtures('basic')}))
148+
.pipe(filerevReplace.addManifest())
149+
.pipe(sa.last(function(file) {
150+
assert.equal(file.relative, 'filerev-replace-manifest.json');
151+
assert.deepEqual(JSON.parse(file.contents), {
152+
'basic/loader.gif': 'basic/loader-aef3c727.gif',
153+
'basic/styles.css': 'basic/styles-b442055f.css',
154+
'basic/index.html': 'basic/index-42012d94.html'
155+
});
156+
}))
157+
.pipe(sa.end(done));
158+
});
159+
160+
it('with options', function(done) {
161+
gulp
162+
.src(fixtures('basic/*'))
163+
.pipe(filerevReplace())
164+
.pipe(filerevReplace.addManifest({path: 'folder/file.txt'}))
165+
.pipe(sa.last(function(file) {
166+
assert.equal(file.relative, 'folder/file.txt');
167+
}))
168+
.pipe(sa.end(done));
169+
});
170+
});
126171
});
127172

128173
var fixtures = function(glob) {

0 commit comments

Comments
 (0)