lib/transforms/startOverIfAssetSourceFilesChange.js

lib/ AssetGraph.js errors.js index.js query.js
assets/ Asset.js Atom.js CacheManifest.js CoffeeScript.js Css.js Flash.js Gif.js Htc.js Html.js I18n.js Ico.js Image.js JavaScript.js Jpeg.js Json.js KnockoutJsTemplate.js Less.js Png.js Rss.js StaticUrlMap.js Stylus.js Text.js Xml.js index.js
relations/ CacheManifestEntry.js CssAlphaImageLoader.js CssBehavior.js CssFontFaceSrc.js CssImage.js CssImport.js CssUrlTokenRelation.js HtmlAlternateLink.js HtmlAnchor.js HtmlAppleTouchStartupImage.js HtmlApplet.js HtmlAudio.js HtmlCacheManifest.js HtmlConditionalComment.js HtmlDataBindAttribute.js HtmlEdgeSideInclude.js HtmlEmbed.js HtmlFrame.js HtmlIFrame.js HtmlIFrameSrcDoc.js HtmlImage.js HtmlInlineScriptTemplate.js HtmlKnockoutContainerless.js HtmlObject.js HtmlRelation.js HtmlRequireJsMain.js HtmlScript.js HtmlShortcutIcon.js HtmlStyle.js HtmlStyleAttribute.js HtmlVideo.js HtmlVideoPoster.js JavaScriptAmdDefine.js JavaScriptAmdRequire.js JavaScriptCommonJsRequire.js JavaScriptExtJsRequire.js JavaScriptGetStaticUrl.js JavaScriptGetText.js JavaScriptInclude.js JavaScriptShimRequire.js JavaScriptTrHtml.js Relation.js StaticUrlMapEntry.js index.js
resolvers/ data.js extJs4Dir.js file.js fixedDirectory.js http.js index.js javascript.js
transforms/ addCacheManifest.js bundleRelations.js bundleRequireJs.js compileCoffeeScriptToJavaScript.js compileLessToCss.js compileStylusToCss.js compressJavaScript.js convertCssImportsToHtmlStyles.js convertHtmlStylesToInlineCssImports.js convertStylesheetsToInlineStyles.js drawGraph.js executeJavaScriptInOrder.js externalizeRelations.js flattenStaticIncludes.js inlineCssImagesWithLegacyFallback.js inlineRelations.js loadAssets.js mergeIdenticalAssets.js minifyAssets.js moveAssets.js moveAssetsInOrder.js populate.js prettyPrintAssets.js pullGlobalsIntoVariables.js registerRequireJsConfig.js removeAssets.js removeRelations.js setAssetContentType.js setAssetEncoding.js setAssetExtension.js setHtmlImageDimensions.js startOverIfAssetSourceFilesChange.js writeAssetsToDisc.js writeAssetsToStdout.js writeStatsToStderr.js
util/ deepCopy.js extendWithGettersAndSetters.js fsTools.js getImageInfoFromBuffers.js memoizeAsyncAccessor.js uniqueId.js urlTools.js
var fs = require('fs'),
    urlTools = require('../util/urlTools'),
    query = require('../query');

module.exports = function (queryObj) {
    var watchedFilesByName = {},
        watchAssetMatcher = query.queryObjToMatcherFunction(queryObj),
        transforms = [],
        isFirstRun = true,
        isIdle = false,
        changedFilesByName = {};

    return function startOverIfAssetSourceFilesChange(assetGraph) {

        function rerunTransformsIfIdleAndFilesChanged () {
            var changedFileNames = Object.keys(changedFilesByName);
            if (isIdle && changedFileNames.length > 0) {
                console.warn("----------------------------------\nrestartIfAssetSourceFilesChange: Source files changed:\n  " + changedFileNames.join("\n  "));
                isIdle = false;
                changedFilesByName = {};
                assetGraph.findRelations().forEach(function (relation) {
                    assetGraph.removeRelation(relation);
                });
                assetGraph.findAssets().forEach(function (asset) {
                    assetGraph.removeAsset(asset);
                });
                assetGraph.queue(transforms).run();
            } else if (isIdle) {
                console.warn("transforms.restartIfAssetSourceFilesChange: Waiting...");
            }
        }

        assetGraph.on('addAsset', function (asset) {
            if (asset.url && /^file:/.test(asset.url)) {
                var fileName = urlTools.fileUrlToFsPath(asset.url);
                if (watchAssetMatcher(asset) && !(fileName in watchedFilesByName)) {
                    watchedFilesByName[fileName] = true;
                    fs.watchFile(fileName, function (currStat, prevStat) {
                        if (currStat.mtime.getTime() !== prevStat.mtime.getTime()) {
                            changedFilesByName[fileName] = true;
                            rerunTransformsIfIdleAndFilesChanged();
                        }
                    });
                }
            }
        }).on('beforeTransform', function (transform) {
            isIdle = false;
            if (isFirstRun) {
                transforms.push(transform);
            }
        }).on('idle', function () {
            isIdle = true;
            isFirstRun = false;
            rerunTransformsIfIdleAndFilesChanged();
        });
    };
};