yadaguru/yadaguru-app

View on GitHub
src/services/routeResolverProvider.js

Summary

Maintainability
C
7 hrs
Test Coverage
'use strict';

define([], function() {

  var routeResolver = function() {

    this.$get = function() {
      return this;
    };

    this.routeConfig = (function() {
      var viewsDirectory = '/',
        controllersDirectory = '/',

        setBaseDirectories = function(viewsDir, controllersDir) {
          viewsDirectory = viewsDir;
          controllersDirectory = controllersDir;
        },

        getViewsDirectory = function() {
          return viewsDirectory;
        },

        getControllersDirectory = function() {
          return controllersDirectory;
        };

      return {
        setBaseDirectories: setBaseDirectories,
        getControllersDirectory: getControllersDirectory,
        getViewsDirectory: getViewsDirectory
      };
    }());

    this.route = (function(routeConfig) {

      var resolve = function(url, baseName, path, controllerAs, secure) {
          if (!path) {
            path = '';
          }

          var routeDef = {};
          var baseFileName = baseName.charAt(0).toLowerCase() + baseName.substr(1);
          routeDef.url = url;
          routeDef.templateUrl = routeConfig.getViewsDirectory() + path + baseFileName + '.html';
          routeDef.controller = baseName + 'Controller';
          if (controllerAs) {
            routeDef.controllerAs = controllerAs;
          }
          if (secure) {
            routeDef.data = {
              access: secure
            };
          }
          routeDef.resolve = {
            load: ['$q', '$rootScope', '$http', function($q, $rootScope, $http) {
              // Load rev manifest file, memoizing the results to reduce requests
              var manifestPromise;
              if (window.ygManifest) {
                manifestPromise = $q.resolve(window.ygManifest)
              } else {
                manifestPromise = $http.get('rev-manifest.json?' + new Date().getTime())
                  .then(function(res) {
                    window.ygManifest = res.data;
                    return res.data;
                  }.bind(this));
              }

              return manifestPromise.then(function(manifest) {
                var controllerFile = routeConfig.getControllersDirectory() + path + baseFileName + 'Controller.js';
                // Look up filename in the rev manifest file
                var versionedFile = manifest[controllerFile];
                var dependencies = [versionedFile];
                return resolveDependencies($q, $rootScope, dependencies);
              });
            }]
          };

          return routeDef;
        },

        resolveDependencies = function($q, $rootScope, dependencies) {
          var defer = $q.defer();
          require(dependencies, function() {
            defer.resolve();
            $rootScope.$apply();
          });

          return defer.promise;
        };

      return {
        resolve: resolve
      };
    }(this.routeConfig));

  };

  var servicesApp = angular.module('routeResolverServices', []);

  //Must be a provider since it will be injected into module.config()
  servicesApp.provider('routeResolver', routeResolver);
});