-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathangular-global-injector.js
More file actions
175 lines (154 loc) · 5.27 KB
/
Copy pathangular-global-injector.js
File metadata and controls
175 lines (154 loc) · 5.27 KB
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
166
167
168
169
170
171
172
173
174
175
(function(angular, window) {
'use strict';
var globalsModule = angular.module('globals', []),
// Local registry of dependencies
registered = {},
// String of the lodash method for matching
// because lodash is defined anonymously
LO_DASH_METHOD = 'function () {\n return _;\n }';
/**
* Utility method to create a getter function
* @param {*} value Value the getter should return
* @returns {Function} The created getter function
*/
function createGetter(value) {
return function() {
return value;
};
}
/**
* Iterates through a string based array of dependencies to get their values
* @param {Array.<String>} dependencies Dependency names as an array
* @param {Object} registered Collection of registered dependencies
* @param {Window} window Browser window object
* @returns {Array.<*>} Array of the dependency values
*/
function resolveDependencies(dependencies, registered, window) {
var resolved = [],
depLength = dependencies.length,
dependency,
i = 0;
for (; i < depLength; i += 1) {
dependency = getDependency(dependencies[i], registered, window);
if (dependency) {
resolved.push(dependency);
} else {
throw new Error('Unable to find dependency');
}
}
return resolved;
}
/**
* Adds default requirejs parameters which some scripts look for (moment)
* @param {Array.<*>} params Array of the resolved dependencies
* @returns {Array.<*>} Passed in array with require parameters at end
*/
function addRequireParameters(params) {
var require = null,
config = {
config: createGetter({
noGlobal: true
})
},
exports = [],
requireParams = [
require,
exports,
config
];
Array.prototype.push.apply(params, requireParams);
return params;
}
/**
* Parses arguments passed to the define method. Necessary to handle the
* complexities of having multiple optional values
* @param {String|Array|Function} name Can also be dependencies or method
* @param {Array|Function} [dependencies] Dependencies or Getter method
* @param {Function} [value] Getter method for the dependency
* @returns {{name: String, dependencies: Array|null, value: Function}}
*/
function parseArgs(name, dependencies, value) {
if (name instanceof Array) {
value = dependencies;
dependencies = name;
name = undefined;
} else if (typeof name === 'function') {
// Super hacky check for lodash since it is using an anonymous define
value = name;
name = value.toString() === LO_DASH_METHOD ? '_' : undefined;
dependencies = [];
} else if (typeof name === 'object' && name.lab.name === 'd3_lab') {
// Super hacky check for d3 since it is using an anonymous define
value = createGetter(name);
name = 'd3';
dependencies = [];
} else {
value = dependencies;
dependencies = [];
}
return {
name: name,
dependencies: dependencies,
value: value
};
}
/**
* Attempts to locate a single dependency in the registry and on window
* @param {String} dependency dependency name
* @param {Object} registered Currently registered dependencies
* @param {Window} window Browser window
*/
function getDependency(dependency, registered, window) {
return (dependency in registered ? registered : window)[dependency];
}
/**
* Adds the dependency to registry and angular
* @param {String} name Dependency name
* @param {*} value Dependency value
*/
function createWrappedDependency(name, value) {
// If it is not an anonymous define
if (name) {
// Add dependency to angular global injector registry
registered[name] = value;
// Create angular injectable of dependency
globalsModule.factory(name, createGetter(value));
}
}
/**
* Impersonates requirejs's define method to create an angular factory
* for dependencies that support require so they don't become global variables
* @param {String|Array|Function} [name] Name of dependency or see below
* @param {Array.<String>|Function} dependencies Dependencies or see below
* @param {Function} value Getter function for dependency being defined
*/
function define(name, dependencies, value) {
var resolved = [],
parsed = parseArgs(name, dependencies, value),
defined;
resolved = addRequireParameters(
resolveDependencies(parsed.dependencies, registered, window)
);
// Run dependency getter method passing in the dependencies
defined = parsed.value.apply(parsed.value, resolved);
createWrappedDependency(parsed.name, defined);
// Allow globals to be forcefully removed
if (define.forceRemoveGlobals) {
delete window[parsed.name];
Object.defineProperty(window, parsed.name, {
writable: false
});
}
}
// Amd is looked for by some scripts
define.amd = {};
define.type = 'Angular Global Injector';
define.version = '0.0.2';
define.forceRemoveGlobals = false;
window.define = define;
// As jQuery must be included before angular we add it to the registry
// automatically
if (window.jQuery) {
createWrappedDependency('jquery', window.jQuery);
}
}(angular, window));