mani-game-engine 1.0.0-pre.34 → 1.0.0-pre.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/injector.js CHANGED
@@ -1,290 +1,290 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Injector = exports.InjectType = exports.InjectId = exports.Inject = exports.createDependencyAnnotation = exports.putIfAbsent = void 0;
4
- require("reflect-metadata");
5
- const isInjectDependency = (dep) => dep.kind === 'inject';
6
- const isTypeDependency = (dep) => dep.kind === 'type';
7
- const putIfAbsent = (map, key, value) => {
8
- let v = map.get(key);
9
- if (!v) {
10
- v = value();
11
- map.set(key, v);
12
- }
13
- return v;
14
- };
15
- exports.putIfAbsent = putIfAbsent;
16
- const createDependencyAnnotation = (cb) => (dependantType, _propertyKey, index) => {
17
- const metadata = Reflect.getMetadata('design:paramtypes', dependantType);
18
- const type = metadata[index];
19
- if (type === dependantType) {
20
- throw new Error('Could not inject class in itself.');
21
- }
22
- const depList = (0, exports.putIfAbsent)(Injector.dependencyMap, dependantType, () => []);
23
- depList.push(cb(type, index, dependantType));
24
- };
25
- exports.createDependencyAnnotation = createDependencyAnnotation;
26
- exports.Inject = (0, exports.createDependencyAnnotation)((type, index) => ({ kind: 'inject', index, type, id: '' }));
27
- const InjectId = (id) => (0, exports.createDependencyAnnotation)((type, index) => ({ kind: 'inject', index, type, id }));
28
- exports.InjectId = InjectId;
29
- const InjectType = (id) => (0, exports.createDependencyAnnotation)((_type, index) => ({ kind: 'type', index, id }));
30
- exports.InjectType = InjectType;
31
- class Injector {
32
- constructor(parent) {
33
- this.parent = parent;
34
- this.typeMappings = new Map();
35
- this.classMappings = new Map();
36
- this.parameterResolverArrays = new Map();
37
- this.classResolvers = new Map();
38
- this.typeResolvers = new Map();
39
- this.singletons = new Map();
40
- this.typeSingletons = new Map();
41
- this.dependencyResolverExtensions = parent ? parent.dependencyResolverExtensions : new Map();
42
- this.map(Injector).toValue(this);
43
- }
44
- createChild() {
45
- return new this.constructor(this);
46
- }
47
- addExtensionResolver(kind, resolver) {
48
- this.dependencyResolverExtensions.set(kind, resolver);
49
- }
50
- map(type, id = '') {
51
- const mapper = new InternalClassMapper(this);
52
- const idMappings = (0, exports.putIfAbsent)(this.classMappings, type, () => ({ map: new Map() }));
53
- if (id === '') {
54
- idMappings.def = mapper.mapping;
55
- }
56
- else {
57
- idMappings.map.set(id, mapper.mapping);
58
- }
59
- return mapper;
60
- }
61
- mapType(id) {
62
- const typeMapper = new InternalTypeMapper(this);
63
- this.typeMappings.set(id, typeMapper.mapping);
64
- return typeMapper;
65
- }
66
- getType(id) {
67
- const typeResolver = this.getTypeResolver(id);
68
- if (!typeResolver) {
69
- throw new Error(`No Mapping for Type with id: '${String(id)}'`);
70
- }
71
- return typeResolver();
72
- }
73
- get(type, id = '') {
74
- const resolver = this.getClassIdResolver(type, id);
75
- if (!resolver) {
76
- throw new Error(`No Mapping for Type ${type.name}` + String(id === '' ? '' : ` with id: '${String(id)}'`));
77
- }
78
- return resolver();
79
- }
80
- createInstance(type) {
81
- return this.getCreateInstanceResolver(type)();
82
- }
83
- createResolverArray(resolverContext) {
84
- const { type } = resolverContext;
85
- const result = [];
86
- const dependencies = Injector.dependencyMap.get(resolverContext.type);
87
- if (!dependencies) {
88
- return [];
89
- }
90
- for (const dependency of dependencies) {
91
- let resolver;
92
- if (isInjectDependency(dependency)) {
93
- if (!dependency.type)
94
- throw new Error(`Undefined dependency type for ${type.name}. Check for circular dependency.`);
95
- const classIdResolver = this.getClassIdResolver(dependency.type, dependency.id);
96
- if (!classIdResolver) {
97
- throw new Error(`Could not inject ${dependency.type.name} into ${resolverContext.type.name}`);
98
- }
99
- resolver = classIdResolver;
100
- }
101
- else if (isTypeDependency(dependency)) {
102
- const typeResolver = this.getTypeResolver(dependency.id);
103
- if (!typeResolver) {
104
- throw new Error(`Could not inject type with id '${String(dependency.id)}' into ${resolverContext.type.name}`);
105
- }
106
- resolver = typeResolver;
107
- }
108
- else {
109
- const extensionResolver = this.dependencyResolverExtensions.get(dependency.kind);
110
- if (!extensionResolver) {
111
- throw new Error(`no dependency resolver for '${dependency.kind}'`);
112
- }
113
- resolver = extensionResolver(resolverContext, dependency);
114
- }
115
- result[dependency.index] = resolver;
116
- }
117
- return result;
118
- }
119
- getClassMapping(type, id) {
120
- const idMapping = this.classMappings.get(type);
121
- if (!idMapping) {
122
- if (!this.parent)
123
- return undefined;
124
- return this.parent.getClassMapping(type, id);
125
- }
126
- const mapping = id === '' ? idMapping.def : idMapping.map.get(id);
127
- if (!mapping) {
128
- if (!this.parent)
129
- return undefined;
130
- return this.parent.getClassMapping(type, id);
131
- }
132
- return mapping;
133
- }
134
- getClassIdResolver(dependencyType, id) {
135
- const getResolver = () => {
136
- const mapping = this.getClassMapping(dependencyType, id);
137
- if (!mapping)
138
- return undefined;
139
- switch (mapping.kind) {
140
- case 0:
141
- return this.getCreateInstanceResolver(dependencyType);
142
- case 1:
143
- const instance = mapping.value;
144
- return () => instance;
145
- case 2:
146
- let singleton;
147
- const singletonContainer = (0, exports.putIfAbsent)(mapping.injector.singletons, dependencyType, () => ({ map: new Map() }));
148
- if (id === '') {
149
- if (singletonContainer.def) {
150
- singleton = singletonContainer.def;
151
- }
152
- else {
153
- singletonContainer.def = mapping.injector.createInstance(dependencyType);
154
- singleton = singletonContainer.def;
155
- }
156
- }
157
- else {
158
- singleton = (0, exports.putIfAbsent)(singletonContainer.map, id, () => mapping.injector.createInstance(dependencyType));
159
- }
160
- return () => singleton;
161
- case 3:
162
- return mapping.provider;
163
- }
164
- };
165
- const container = (0, exports.putIfAbsent)(this.classResolvers, dependencyType, () => ({
166
- def: undefined,
167
- map: new Map(),
168
- }));
169
- if (id === '') {
170
- if (container.def) {
171
- return container.def;
172
- }
173
- const resolver = getResolver();
174
- container.def = resolver;
175
- return resolver;
176
- }
177
- else {
178
- return (0, exports.putIfAbsent)(container.map, id, () => getResolver());
179
- }
180
- }
181
- getTypeResolver(id) {
182
- return (0, exports.putIfAbsent)(this.typeResolvers, id, () => {
183
- const mapping = this.getTypeMapping(id);
184
- if (!mapping)
185
- return undefined;
186
- if (mapping.kind === undefined) {
187
- throw new Error(`No TypeMapping for id ${String(id)}.`);
188
- }
189
- if (mapping.kind === 2) {
190
- const instance = mapping.value;
191
- return () => instance;
192
- }
193
- else if (mapping.kind === 0) {
194
- return this.getCreateInstanceResolver(mapping.type);
195
- }
196
- else if (mapping.kind === 1) {
197
- const instance = (0, exports.putIfAbsent)(mapping.injector.typeSingletons, id, () => mapping.injector.createInstance(mapping.type));
198
- return () => instance;
199
- }
200
- else {
201
- return mapping.provider;
202
- }
203
- });
204
- }
205
- getCreateInstanceResolver(type) {
206
- const resolvers = (0, exports.putIfAbsent)(this.parameterResolverArrays, type, () => this.createResolverArray({
207
- kind: 'class',
208
- type: type,
209
- }));
210
- if (resolvers.length === 0) {
211
- return () => new type();
212
- }
213
- const args = new Array(resolvers.length);
214
- return () => {
215
- for (let i = 0; i < args.length; i++) {
216
- args[i] = resolvers[i]();
217
- }
218
- return new type(...args);
219
- };
220
- }
221
- getTypeMapping(id) {
222
- const mapping = this.typeMappings.get(id);
223
- if (!mapping) {
224
- if (!this.parent)
225
- return undefined;
226
- return this.parent.getTypeMapping(id);
227
- }
228
- return mapping;
229
- }
230
- }
231
- exports.Injector = Injector;
232
- Injector.dependencyMap = new Map();
233
- class InternalTypeMapper {
234
- constructor(injector) {
235
- this.injector = injector;
236
- this.mapping = { kind: undefined };
237
- }
238
- toClass(classValue) {
239
- Object.assign(this.mapping, {
240
- kind: 0,
241
- type: classValue,
242
- });
243
- }
244
- toSingleton(classValue) {
245
- Object.assign(this.mapping, {
246
- kind: 1,
247
- type: classValue,
248
- injector: this.injector,
249
- });
250
- }
251
- toValue(value) {
252
- Object.assign(this.mapping, {
253
- kind: 2,
254
- value: value,
255
- });
256
- }
257
- toProvider(provider) {
258
- Object.assign(this.mapping, {
259
- kind: 3,
260
- provider: provider,
261
- });
262
- }
263
- }
264
- class InternalClassMapper {
265
- constructor(injector) {
266
- this.injector = injector;
267
- this.mapping = { kind: 0 };
268
- }
269
- toValue(value) {
270
- Object.assign(this.mapping, {
271
- kind: 1,
272
- value: value,
273
- });
274
- return value;
275
- }
276
- toSingleton() {
277
- Object.assign(this.mapping, {
278
- kind: 2,
279
- injector: this.injector,
280
- });
281
- this.mapping.kind = 2;
282
- }
283
- toProvider(provider) {
284
- Object.assign(this.mapping, {
285
- kind: 3,
286
- provider: provider,
287
- });
288
- }
289
- }
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Injector = exports.InjectType = exports.InjectId = exports.Inject = exports.createDependencyAnnotation = exports.putIfAbsent = void 0;
4
+ require("reflect-metadata");
5
+ const isInjectDependency = (dep) => dep.kind === 'inject';
6
+ const isTypeDependency = (dep) => dep.kind === 'type';
7
+ const putIfAbsent = (map, key, value) => {
8
+ let v = map.get(key);
9
+ if (!v) {
10
+ v = value();
11
+ map.set(key, v);
12
+ }
13
+ return v;
14
+ };
15
+ exports.putIfAbsent = putIfAbsent;
16
+ const createDependencyAnnotation = (cb) => (dependantType, _propertyKey, index) => {
17
+ const metadata = Reflect.getMetadata('design:paramtypes', dependantType);
18
+ const type = metadata[index];
19
+ if (type === dependantType) {
20
+ throw new Error('Could not inject class in itself.');
21
+ }
22
+ const depList = (0, exports.putIfAbsent)(Injector.dependencyMap, dependantType, () => []);
23
+ depList.push(cb(type, index, dependantType));
24
+ };
25
+ exports.createDependencyAnnotation = createDependencyAnnotation;
26
+ exports.Inject = (0, exports.createDependencyAnnotation)((type, index) => ({ kind: 'inject', index, type, id: '' }));
27
+ const InjectId = (id) => (0, exports.createDependencyAnnotation)((type, index) => ({ kind: 'inject', index, type, id }));
28
+ exports.InjectId = InjectId;
29
+ const InjectType = (id) => (0, exports.createDependencyAnnotation)((_type, index) => ({ kind: 'type', index, id }));
30
+ exports.InjectType = InjectType;
31
+ class Injector {
32
+ constructor(parent) {
33
+ this.parent = parent;
34
+ this.typeMappings = new Map();
35
+ this.classMappings = new Map();
36
+ this.parameterResolverArrays = new Map();
37
+ this.classResolvers = new Map();
38
+ this.typeResolvers = new Map();
39
+ this.singletons = new Map();
40
+ this.typeSingletons = new Map();
41
+ this.dependencyResolverExtensions = parent ? parent.dependencyResolverExtensions : new Map();
42
+ this.map(Injector).toValue(this);
43
+ }
44
+ createChild() {
45
+ return new this.constructor(this);
46
+ }
47
+ addExtensionResolver(kind, resolver) {
48
+ this.dependencyResolverExtensions.set(kind, resolver);
49
+ }
50
+ map(type, id = '') {
51
+ const mapper = new InternalClassMapper(this);
52
+ const idMappings = (0, exports.putIfAbsent)(this.classMappings, type, () => ({ map: new Map() }));
53
+ if (id === '') {
54
+ idMappings.def = mapper.mapping;
55
+ }
56
+ else {
57
+ idMappings.map.set(id, mapper.mapping);
58
+ }
59
+ return mapper;
60
+ }
61
+ mapType(id) {
62
+ const typeMapper = new InternalTypeMapper(this);
63
+ this.typeMappings.set(id, typeMapper.mapping);
64
+ return typeMapper;
65
+ }
66
+ getType(id) {
67
+ const typeResolver = this.getTypeResolver(id);
68
+ if (!typeResolver) {
69
+ throw new Error(`No Mapping for Type with id: '${String(id)}'`);
70
+ }
71
+ return typeResolver();
72
+ }
73
+ get(type, id = '') {
74
+ const resolver = this.getClassIdResolver(type, id);
75
+ if (!resolver) {
76
+ throw new Error(`No Mapping for Type ${type.name}` + String(id === '' ? '' : ` with id: '${String(id)}'`));
77
+ }
78
+ return resolver();
79
+ }
80
+ createInstance(type) {
81
+ return this.getCreateInstanceResolver(type)();
82
+ }
83
+ createResolverArray(resolverContext) {
84
+ const { type } = resolverContext;
85
+ const result = [];
86
+ const dependencies = Injector.dependencyMap.get(resolverContext.type);
87
+ if (!dependencies) {
88
+ return [];
89
+ }
90
+ for (const dependency of dependencies) {
91
+ let resolver;
92
+ if (isInjectDependency(dependency)) {
93
+ if (!dependency.type)
94
+ throw new Error(`Undefined dependency type for ${type.name}. Check for circular dependency.`);
95
+ const classIdResolver = this.getClassIdResolver(dependency.type, dependency.id);
96
+ if (!classIdResolver) {
97
+ throw new Error(`Could not inject ${dependency.type.name} into ${resolverContext.type.name}`);
98
+ }
99
+ resolver = classIdResolver;
100
+ }
101
+ else if (isTypeDependency(dependency)) {
102
+ const typeResolver = this.getTypeResolver(dependency.id);
103
+ if (!typeResolver) {
104
+ throw new Error(`Could not inject type with id '${String(dependency.id)}' into ${resolverContext.type.name}`);
105
+ }
106
+ resolver = typeResolver;
107
+ }
108
+ else {
109
+ const extensionResolver = this.dependencyResolverExtensions.get(dependency.kind);
110
+ if (!extensionResolver) {
111
+ throw new Error(`no dependency resolver for '${dependency.kind}'`);
112
+ }
113
+ resolver = extensionResolver(resolverContext, dependency);
114
+ }
115
+ result[dependency.index] = resolver;
116
+ }
117
+ return result;
118
+ }
119
+ getClassMapping(type, id) {
120
+ const idMapping = this.classMappings.get(type);
121
+ if (!idMapping) {
122
+ if (!this.parent)
123
+ return undefined;
124
+ return this.parent.getClassMapping(type, id);
125
+ }
126
+ const mapping = id === '' ? idMapping.def : idMapping.map.get(id);
127
+ if (!mapping) {
128
+ if (!this.parent)
129
+ return undefined;
130
+ return this.parent.getClassMapping(type, id);
131
+ }
132
+ return mapping;
133
+ }
134
+ getClassIdResolver(dependencyType, id) {
135
+ const getResolver = () => {
136
+ const mapping = this.getClassMapping(dependencyType, id);
137
+ if (!mapping)
138
+ return undefined;
139
+ switch (mapping.kind) {
140
+ case 0:
141
+ return this.getCreateInstanceResolver(dependencyType);
142
+ case 1:
143
+ const instance = mapping.value;
144
+ return () => instance;
145
+ case 2:
146
+ let singleton;
147
+ const singletonContainer = (0, exports.putIfAbsent)(mapping.injector.singletons, dependencyType, () => ({ map: new Map() }));
148
+ if (id === '') {
149
+ if (singletonContainer.def) {
150
+ singleton = singletonContainer.def;
151
+ }
152
+ else {
153
+ singletonContainer.def = mapping.injector.createInstance(dependencyType);
154
+ singleton = singletonContainer.def;
155
+ }
156
+ }
157
+ else {
158
+ singleton = (0, exports.putIfAbsent)(singletonContainer.map, id, () => mapping.injector.createInstance(dependencyType));
159
+ }
160
+ return () => singleton;
161
+ case 3:
162
+ return mapping.provider;
163
+ }
164
+ };
165
+ const container = (0, exports.putIfAbsent)(this.classResolvers, dependencyType, () => ({
166
+ def: undefined,
167
+ map: new Map(),
168
+ }));
169
+ if (id === '') {
170
+ if (container.def) {
171
+ return container.def;
172
+ }
173
+ const resolver = getResolver();
174
+ container.def = resolver;
175
+ return resolver;
176
+ }
177
+ else {
178
+ return (0, exports.putIfAbsent)(container.map, id, () => getResolver());
179
+ }
180
+ }
181
+ getTypeResolver(id) {
182
+ return (0, exports.putIfAbsent)(this.typeResolvers, id, () => {
183
+ const mapping = this.getTypeMapping(id);
184
+ if (!mapping)
185
+ return undefined;
186
+ if (mapping.kind === undefined) {
187
+ throw new Error(`No TypeMapping for id ${String(id)}.`);
188
+ }
189
+ if (mapping.kind === 2) {
190
+ const instance = mapping.value;
191
+ return () => instance;
192
+ }
193
+ else if (mapping.kind === 0) {
194
+ return this.getCreateInstanceResolver(mapping.type);
195
+ }
196
+ else if (mapping.kind === 1) {
197
+ const instance = (0, exports.putIfAbsent)(mapping.injector.typeSingletons, id, () => mapping.injector.createInstance(mapping.type));
198
+ return () => instance;
199
+ }
200
+ else {
201
+ return mapping.provider;
202
+ }
203
+ });
204
+ }
205
+ getCreateInstanceResolver(type) {
206
+ const resolvers = (0, exports.putIfAbsent)(this.parameterResolverArrays, type, () => this.createResolverArray({
207
+ kind: 'class',
208
+ type: type,
209
+ }));
210
+ if (resolvers.length === 0) {
211
+ return () => new type();
212
+ }
213
+ const args = new Array(resolvers.length);
214
+ return () => {
215
+ for (let i = 0; i < args.length; i++) {
216
+ args[i] = resolvers[i]();
217
+ }
218
+ return new type(...args);
219
+ };
220
+ }
221
+ getTypeMapping(id) {
222
+ const mapping = this.typeMappings.get(id);
223
+ if (!mapping) {
224
+ if (!this.parent)
225
+ return undefined;
226
+ return this.parent.getTypeMapping(id);
227
+ }
228
+ return mapping;
229
+ }
230
+ }
231
+ exports.Injector = Injector;
232
+ Injector.dependencyMap = new Map();
233
+ class InternalTypeMapper {
234
+ constructor(injector) {
235
+ this.injector = injector;
236
+ this.mapping = { kind: undefined };
237
+ }
238
+ toClass(classValue) {
239
+ Object.assign(this.mapping, {
240
+ kind: 0,
241
+ type: classValue,
242
+ });
243
+ }
244
+ toSingleton(classValue) {
245
+ Object.assign(this.mapping, {
246
+ kind: 1,
247
+ type: classValue,
248
+ injector: this.injector,
249
+ });
250
+ }
251
+ toValue(value) {
252
+ Object.assign(this.mapping, {
253
+ kind: 2,
254
+ value: value,
255
+ });
256
+ }
257
+ toProvider(provider) {
258
+ Object.assign(this.mapping, {
259
+ kind: 3,
260
+ provider: provider,
261
+ });
262
+ }
263
+ }
264
+ class InternalClassMapper {
265
+ constructor(injector) {
266
+ this.injector = injector;
267
+ this.mapping = { kind: 0 };
268
+ }
269
+ toValue(value) {
270
+ Object.assign(this.mapping, {
271
+ kind: 1,
272
+ value: value,
273
+ });
274
+ return value;
275
+ }
276
+ toSingleton() {
277
+ Object.assign(this.mapping, {
278
+ kind: 2,
279
+ injector: this.injector,
280
+ });
281
+ this.mapping.kind = 2;
282
+ }
283
+ toProvider(provider) {
284
+ Object.assign(this.mapping, {
285
+ kind: 3,
286
+ provider: provider,
287
+ });
288
+ }
289
+ }
290
290
  //# sourceMappingURL=injector.js.map