summaryrefslogtreecommitdiffstats
path: root/lib/generate/manifest.js
blob: 8bb826a958678d1210d1c61b16b86add23f86b9e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
var _ = require('lodash');
var path = require('path');
var Q = require('q');

var fs = require("./fs");

var extsToIgnore = [".gz"]

var Manifest = function() {
    this.revision = 0;
    this.clear(Date.now());
};

// Regenerate manifest
Manifest.prototype.clear = function(revision) {
    if (revision) this.revision = revision;
    this.sections = {
        'CACHE': {},
        'NETWORK': {},
        'FALLBACK': {}
    };
    return Q(this);
};

// Add a resource
Manifest.prototype.add = function(category, resource, value) {
    if (_.isArray(resource)) {
        _.each(resource, function(subres) {
            this.add(category, subres, value);
        }, this);
        return;
    }
    this.sections[category][resource] = value;
};

// Add a directory in cache
Manifest.prototype.addFolder = function(folder, root, except) {
    var that = this;
    root = root || "/";

    return fs.list(folder)
    .then(function(files) {
        _.each(
            // Ignore diretcories
            _.filter(files, function(file) {
                return file.substr(-1) != "/" && !_.contains(except, path.join(root, file)) && !_.contains(extsToIgnore, path.extname(file));
            }),
            function(file) {
                that.add("CACHE", path.join(root, file));
            }
        );
    })
};

// Get manifest content
Manifest.prototype.dump = function() {
    var lines = [
        "CACHE MANIFEST",
        "# Revision "+this.revision
    ];

    _.each(this.sections, function(content, section) {
        if (_.size(content) == 0) return;
        lines.push("");
        lines.push(section+":");
        lines = lines.concat(_.keys(content));
    }, this);

    return Q(lines.join("\n"));
};

module.exports = Manifest;