| 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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
 | 'use strict';
/**
 * @ngdoc interface
 * @name angular.Module
 * @description
 *
 * Interface for configuring angular {@link angular.module modules}.
 */
function setupModuleLoader(window) {
  function ensure(obj, name, factory) {
    return obj[name] || (obj[name] = factory());
  }
  return ensure(ensure(window, 'angular', Object), 'module', function() {
    /** @type {Object.<string, angular.Module>} */
    var modules = {};
    /**
     * @ngdoc function
     * @name angular.module
     * @description
     *
     * The `angular.module` is a global place for registering angular modules. All modules
     * (angular core or 3rd party) that should be available to an application must be registered using this mechanism.
     *
     * # Module
     *
     * A module is a collocation of services, directives, filters, and configure information. Module is used to configure the,
     * {@link angular.module.AUTO.$injector $injector}.
     *
     * <pre>
     * // Create a new module
     * var myModule = angular.module('myModule', []);
     *
     * // configure a new service
     * myModule.value('appName', 'MyCoolApp');
     *
     * // configure existing services inside initialization blocks.
     * myModule.init(function($locationProvider) {
     *   // Configure existing providers
     *   $locationProvider.hashPrefix = '!';
     * });
     * </pre>
     *
     * Then you can load your module like this:
     *
     * <pre>
     * var injector = angular.injector(['ng', 'MyModule'])
     * </pre>
     *
     * @param {!string} name The name of the module to create or retrieve.
     * @param {Array.<string>=} requires If specified then new module is being created. If unspecified then the
     *        the module is being retrieved for further configuration.
     * @param {Function} initFn Option configuration function for the module. Same as
     *        {@link angular.Module#init Module.init()}.
     * @return {angular.Module}
     */
    return function module(name, requires, initFn) {
      if (requires && modules.hasOwnProperty(name)) {
        modules[name] = null;
      }
      return ensure(modules, name, function() {
        if (!requires) {
          throw Error('No module: ' + name);
        }
        /** @type {!Array.<Array.<*>>} */
        var invokeQueue = [];
        var init = invokeLater('$injector', 'invoke');
        /** @type {angular.Module} */
        var moduleInstance = {
          /**
           * @ngdoc property
           * @name angular.Module#requires
           * @propertyOf angular.Module
           * @returns {Array.<string>} List of module names which must be loaded before this module.
           * @description
           * Holds the list of modules which the injector will load before the current module is loaded.
           */
          requires: requires,
          invokeQueue: invokeQueue,
          /**
           * @ngdoc method
           * @name angular.Module#service
           * @methodOf angular.Module
           * @param {string} name service name
           * @param {Function} providerType Construction function for creating new instance of the service.
           * @description
           * See {@link angular.module.AUTO.$provide#service $provide.service()}.
           */
          service: invokeLater('$provide', 'service'),
          /**
           * @ngdoc method
           * @name angular.Module#factory
           * @methodOf angular.Module
           * @param {string} name service name
           * @param {Function} providerFunction Function for creating new instance of the service.
           * @description
           * See {@link angular.module.AUTO.$provide#service $provide.factory()}.
           */
          factory: invokeLater('$provide', 'factory'),
          /**
           * @ngdoc method
           * @name angular.Module#value
           * @methodOf angular.Module
           * @param {string} name service name
           * @param {*} object Service instance object.
           * @description
           * See {@link angular.module.AUTO.$provide#value $provide.value()}.
           */
          value: invokeLater('$provide', 'value'),
          /**
           * @ngdoc method
           * @name angular.Module#filter
           * @methodOf angular.Module
           * @param {string} name filterr name
           * @param {Function} filterFactory Factory function for creating new instance of filter.
           * @description
           * See {@link angular.module.ng.$filterProvider#register $filterProvider.register()}.
           */
          filter: invokeLater('$filterProvider', 'register'),
          /**
           * @ngdoc method
           * @name angular.Module#init
           * @methodOf angular.Module
           * @param {Function} initializationFn Execute this function on module load, allowing it to do any
           *   service configuration..
           * @description
           * Use this method to register work which needs to be performed on module loading.
           */
          init: init
        };
        if (initFn) {
          init(initFn);
        }
        return  moduleInstance;
        /**
         * @param {string} provider
         * @param {string} method
         * @returns {angular.Module}
         */
        function invokeLater(provider, method) {
          return function() {
            invokeQueue.push([provider, method, arguments]);
            return moduleInstance;
          }
        }
      });
    };
  });
}
 |