1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const reflect_1 = require("@azera/reflect");
|
4 | const util_1 = require("@azera/util");
|
5 | const assert_1 = require("assert");
|
6 | const glob = require("glob");
|
7 | const decorators_1 = require("./decorators");
|
8 | const errors_1 = require("./errors");
|
9 | exports.FACTORY_REGEX = /.*Factory$/;
|
10 | exports.SERVICE_REGEX = /.*Service$/;
|
11 | /**
|
12 | * Dependency Injection Container
|
13 | * @author Masoud Zohrabi <mdzzohrabi@gmail.com>
|
14 | */
|
15 | class Container {
|
16 | constructor(services, parameters, autoTags) {
|
17 | /**
|
18 | * Invoked services in-memory cache
|
19 | */
|
20 | this.instances = {};
|
21 | /**
|
22 | * Container parameters collection
|
23 | */
|
24 | this.params = {};
|
25 | /**
|
26 | * Declared service definitions
|
27 | */
|
28 | this.services = {};
|
29 | /**
|
30 | * Tag extractor functions
|
31 | */
|
32 | this.autoTags = [];
|
33 | /**
|
34 | * Type factories
|
35 | */
|
36 | this.factories = new WeakMap();
|
37 | /**
|
38 | * Container-specified class definitions
|
39 | */
|
40 | this.types = new WeakMap();
|
41 | /**
|
42 | * Imported things
|
43 | */
|
44 | this.imported = [];
|
45 | /** Exception on async dependencies when invoke called synchrounosly */
|
46 | this.strictAsync = true;
|
47 | if (autoTags)
|
48 | this.autoTags = autoTags;
|
49 | if (services)
|
50 | this.set(services);
|
51 | if (parameters)
|
52 | this.params = parameters;
|
53 | this.setFactory('serviceContainer', function containerFactory() {
|
54 | return this;
|
55 | });
|
56 | // Get container
|
57 | this.setFactory(Container, () => this);
|
58 | }
|
59 | /**
|
60 | * Check if decorated class was inherited from another decorated class
|
61 | * @param target Class
|
62 | */
|
63 | static isInheritedServiceDecorator(target) {
|
64 | return target[decorators_1.META_INJECT] && !target.hasOwnProperty(decorators_1.META_INJECT);
|
65 | }
|
66 | /**
|
67 | * Prepare class if inherited from service decorated class
|
68 | * @param target Class
|
69 | */
|
70 | static checkInheritance(target) {
|
71 | if (Container.isInheritedServiceDecorator(target)) {
|
72 | let def = decorators_1.getDefinition(target);
|
73 | def.$target = target;
|
74 | def.inherited = false;
|
75 | def.name = target.name;
|
76 | def.service = target;
|
77 | def.parameters = getDependencies(target).deps;
|
78 | decorators_1.setDefinition(target, def);
|
79 | }
|
80 | }
|
81 | /**
|
82 | * Get container parameters
|
83 | */
|
84 | getParameters() {
|
85 | return this.params;
|
86 | }
|
87 | /**
|
88 | * Build service from factory
|
89 | * @param factory Factory
|
90 | * @param _stack Stack
|
91 | * @internal
|
92 | */
|
93 | buildFromFactory(factory, _stack = [], options) {
|
94 | let result, override = { isFactory: false, invoke: true };
|
95 | let { async = false } = options || {};
|
96 | if (util_1.is.Class(factory)) {
|
97 | let context = this._invoke(factory, _stack, { override: { isFactory: false } });
|
98 | result = this._invoke(Method(context, 'create'), _stack, { context, override, async });
|
99 | }
|
100 | else if (util_1.is.Function(factory)) {
|
101 | result = this._invoke(factory, _stack, { context: this, override, async });
|
102 | }
|
103 | else if (util_1.is.Object(factory) && 'create' in factory) {
|
104 | result = this._invoke(Method(factory, 'create'), _stack, { context: this, override, async });
|
105 | }
|
106 | else {
|
107 | throw Error(`Factory must be Function or instanceOf IFactory`);
|
108 | }
|
109 | return result;
|
110 | }
|
111 | /**
|
112 | * Resolve import
|
113 | * @param item Path or Function to import
|
114 | * @internal
|
115 | */
|
116 | resolveImport(item) {
|
117 | if (this.imported.includes(item))
|
118 | return;
|
119 | this.imported.push(item);
|
120 | if (util_1.is.Function(item))
|
121 | this.add(item);
|
122 | else if (util_1.is.String(item)) {
|
123 | item = item + '!(*.d.ts).@(ts|js)'; // Ignore
|
124 | let files = glob.sync(item) || [];
|
125 | files.forEach(file => {
|
126 | let module = require(file);
|
127 | util_1.forEach(module, moduleClass => {
|
128 | if (util_1.is.Function(moduleClass)) {
|
129 | this.add(moduleClass);
|
130 | }
|
131 | });
|
132 | });
|
133 | }
|
134 | }
|
135 | /**
|
136 | * Resolve definition imports
|
137 | * @param service Service definition
|
138 | * @internal
|
139 | */
|
140 | resolveImports(service) {
|
141 | if (!service.imports)
|
142 | return;
|
143 | service.imports.forEach(this.resolveImport.bind(this));
|
144 | }
|
145 | resolveDefinition(definition, _stack, options) {
|
146 | let { context, override, async } = options || {};
|
147 | let service = override ? Object.assign({}, definition, override) : definition;
|
148 | let name = service.name;
|
149 | let result;
|
150 | if (!service.invoke && (name == undefined || util_1.is.Empty(name)))
|
151 | throw Error(`Service has no name`);
|
152 | if (!this.definitions[service.name]) {
|
153 | // Auto-tagger defined in service
|
154 | if (util_1.is.Array(service.autoTags)) {
|
155 | service.autoTags.forEach(item => {
|
156 | if (util_1.is.Function(item))
|
157 | this.autoTag(item);
|
158 | else
|
159 | this.autoTag(item.class, item.tags);
|
160 | });
|
161 | }
|
162 | // Imports
|
163 | this.resolveImports(service);
|
164 | }
|
165 | // Factory
|
166 | if (service.isFactory || service.factory || this.factories.has(service.service)) {
|
167 | let factory = service.factory ? service.factory : service.isFactory ? service.service : this.factories.get(service.service);
|
168 | result = this.buildFromFactory(factory, _stack, options);
|
169 | }
|
170 | else {
|
171 | assert_1.ok(util_1.is.Array(service.parameters || []), `Service ${service.name} parameters must be array, ${service.parameters} given`);
|
172 | assert_1.ok(service.service || service.factory, `No service defined for ${service.name}`);
|
173 | let resolvedParameters = (service.parameters || []).map(dep => this._invoke(dep, _stack, options));
|
174 | let target = service.service;
|
175 | if (this.strictAsync && !async && resolvedParameters.find(d => d instanceof Promise) !== undefined) {
|
176 | throw Error(`Async dependencies are not allowed in synchronous invoke`);
|
177 | }
|
178 | let createService = (parameters) => {
|
179 | // Function service (Factory)
|
180 | if (service.invoke || !util_1.is.Newable(target)) {
|
181 | return { result: target.apply(context || target, parameters), return: true };
|
182 | }
|
183 | let object = new target(...parameters);
|
184 | // Properties
|
185 | if (service.properties) {
|
186 | util_1.forEach(service.properties, (dep, key) => {
|
187 | let prop;
|
188 | if (util_1.is.String(dep) || util_1.is.Function(dep)) {
|
189 | prop = { name: dep };
|
190 | }
|
191 | else {
|
192 | prop = dep;
|
193 | }
|
194 | if (prop.lateBinding) {
|
195 | let resolved;
|
196 | Object.defineProperty(object, key, {
|
197 | get: () => resolved || (resolved = this._invoke(prop.name, _stack, options))
|
198 | });
|
199 | }
|
200 | else {
|
201 | object[key] = this._invoke(prop.name, _stack, options);
|
202 | }
|
203 | });
|
204 | }
|
205 | // Methods
|
206 | if (service.calls) {
|
207 | util_1.forEach(service.calls, (args, method) => {
|
208 | object[method].apply(object, args.map(arg => this._invoke(arg, _stack, options)));
|
209 | });
|
210 | }
|
211 | return { result: object, return: false };
|
212 | };
|
213 | if (async && resolvedParameters.filter(param => param instanceof Promise).length > 0) {
|
214 | let resolver = new Promise(async (resolve, reject) => {
|
215 | resolvedParameters = await Promise.all(resolvedParameters);
|
216 | let { result: object } = createService(resolvedParameters);
|
217 | resolve(object);
|
218 | });
|
219 | if (!service.private)
|
220 | this.instances[name] = resolver;
|
221 | return resolver;
|
222 | }
|
223 | let { result: object, return: doReturn } = createService(resolvedParameters);
|
224 | if (doReturn)
|
225 | return object;
|
226 | result = object;
|
227 | }
|
228 | // Shared services
|
229 | if (!service.private) {
|
230 | this.instances[name] = result;
|
231 | }
|
232 | return result;
|
233 | }
|
234 | _throwError(err, stack = []) {
|
235 | if (err instanceof Error) {
|
236 | if (!(err instanceof errors_1.ServiceNotFoundError))
|
237 | err.message += ', Stack: ' + stack.join(' -> ') + '.';
|
238 | throw err;
|
239 | }
|
240 | }
|
241 | /**
|
242 | * Build service by name
|
243 | * @param name Service name
|
244 | * @param stack Injection stack ( for debugging )
|
245 | * @throws ServiceNotFoundError
|
246 | * @internal
|
247 | */
|
248 | getService(name, stack = [], options) {
|
249 | let service;
|
250 | if (service = this.services[name]) {
|
251 | try {
|
252 | return this.resolveDefinition(service, stack, options);
|
253 | }
|
254 | catch (err) {
|
255 | this._throwError(err, stack);
|
256 | return undefined;
|
257 | }
|
258 | }
|
259 | throw new errors_1.ServiceNotFoundError(name, stack);
|
260 | }
|
261 | _get(name, stack = [], options) {
|
262 | if (name == undefined)
|
263 | return undefined;
|
264 | stack = [].concat(stack || []);
|
265 | stack.push(name);
|
266 | // Function
|
267 | if (typeof name == 'function')
|
268 | return this._invoke(name, stack, options);
|
269 | // Cached
|
270 | if (this.instances[name])
|
271 | return this.instances[name];
|
272 | // Tags
|
273 | if (name.substr(0, 2) == '$$')
|
274 | return this.findByTag(name.substr(2)).map(service => this._get(service.name, stack, options));
|
275 | // Parameter
|
276 | else if (name.substr(0, 1) == '$')
|
277 | return this.getParameter(name.substr(1));
|
278 | // Parameter
|
279 | else if (this.params[name])
|
280 | return this.params[name];
|
281 | return this.getService(name, stack, options);
|
282 | }
|
283 | get(value) {
|
284 | return this._get(value);
|
285 | }
|
286 | /**
|
287 | * Build tagged services
|
288 | * @param tag Tag
|
289 | */
|
290 | getByTag(tag) {
|
291 | return this.findByTag(tag).map(definition => this._get(definition.name)).filter((service) => service != undefined);
|
292 | }
|
293 | getByTagAsync(tag) {
|
294 | return Promise.all(this.findByTag(tag).map(definition => this._get(definition.name, [], { async: true })).filter((service) => service != undefined));
|
295 | }
|
296 | /**
|
297 | * Get tagged services definitions
|
298 | * @param tag Tag
|
299 | */
|
300 | findByTag(tag) {
|
301 | let services = [];
|
302 | util_1.forEach(this.services, service => {
|
303 | if (util_1.is.Array(service.tags) && service.tags.includes(tag))
|
304 | services.push(service);
|
305 | });
|
306 | return services;
|
307 | }
|
308 | invokeLater(context, method) {
|
309 | let container = this;
|
310 | let _context;
|
311 | let _cached;
|
312 | let _deps;
|
313 | if (!method) {
|
314 | let _def = this.getDefinition(context);
|
315 | _deps = _def.parameters;
|
316 | context = { callable: _def.service };
|
317 | method = 'callable';
|
318 | }
|
319 | else {
|
320 | _deps = this.getDefinition(decorators_1.getTarget(context)).methods[method];
|
321 | }
|
322 | let contextName = context && context.name || undefined;
|
323 | let fnName = (contextName ? contextName + '.' : '') + method + 'InvokeLater';
|
324 | return {
|
325 | // Later invokable function
|
326 | [fnName](...params) {
|
327 | // Class as context
|
328 | _context = _context || (typeof context == 'function' ? container._invoke(context) : context);
|
329 | // Execute
|
330 | return _context[method].apply(
|
331 | // This
|
332 | _context,
|
333 | // Parameters
|
334 | (_cached ? _cached : _cached = (_deps || []).map(dep => container._invoke(dep))).concat(params));
|
335 | }
|
336 | }[fnName];
|
337 | }
|
338 | invokeLaterAsync(context, method) {
|
339 | let container = this;
|
340 | let _context;
|
341 | let _cached;
|
342 | let _deps;
|
343 | if (!method) {
|
344 | let _def = this.getDefinition(context);
|
345 | _deps = _def.parameters;
|
346 | context = { callable: _def.service };
|
347 | method = 'callable';
|
348 | }
|
349 | else {
|
350 | _deps = this.getDefinition(decorators_1.getTarget(context)).methods[method];
|
351 | }
|
352 | let contextName = context && context.name || undefined;
|
353 | let fnName = (contextName ? contextName + '.' : '') + method + 'InvokeLaterAsync';
|
354 | return {
|
355 | // Later invokable function
|
356 | async [fnName](...params) {
|
357 | // Class as context
|
358 | _context = _context || (typeof context == 'function' ? await container._invoke(context, [], { async: true }) : context);
|
359 | // Execute
|
360 | return _context[method].apply(
|
361 | // This
|
362 | _context,
|
363 | // Parameters
|
364 | (_cached ? _cached : _cached = await Promise.all((_deps || []).map(dep => container._invoke(dep, [], { async: true })))).concat(params));
|
365 | }
|
366 | }[fnName];
|
367 | }
|
368 | /**
|
369 | * Invoke a function and resolve its dependencies
|
370 | * @param value Invokable value
|
371 | */
|
372 | invoke(value) {
|
373 | return this._invoke(value);
|
374 | }
|
375 | invokeAsync(value) {
|
376 | return this._invoke(value, [], {
|
377 | async: true
|
378 | });
|
379 | }
|
380 | _invoke(value, stack, options) {
|
381 | options = Object.assign({ async: false }, options);
|
382 | stack = stack || [];
|
383 | // String (named service)
|
384 | if (util_1.is.String(value))
|
385 | return this._get(value, stack, options);
|
386 | let _isFunction = false, _isMethod = false, _isClass = false;
|
387 | // Function or Class
|
388 | if ((_isClass = util_1.is.Class(value)) || (_isFunction = util_1.is.Function(value)) || (_isMethod = isMethod(value)) || util_1.is.Array(value)) {
|
389 | let def = this.getDefinition(value);
|
390 | stack.push(`${def.name} (${_isClass ? 'Class' : _isFunction ? 'Function' : _isMethod ? 'Method' : 'Array'})`);
|
391 | if (!_isMethod && !util_1.is.Empty(def.name) && this.instances[def.name])
|
392 | return this.instances[def.name];
|
393 | return this.resolveDefinition(def, stack, options);
|
394 | }
|
395 | // Any other things
|
396 | return options.async ? Promise.resolve(value) : value;
|
397 | }
|
398 | /**
|
399 | * Set parameter value
|
400 | * @param name Parameter name
|
401 | * @param value Value
|
402 | */
|
403 | setParameter(name, value) {
|
404 | this.params[name] = value;
|
405 | return this;
|
406 | }
|
407 | /**
|
408 | * Set parameters value
|
409 | * @param params Parameters
|
410 | */
|
411 | setParameters(params) {
|
412 | this.params = Object.assign(Object.assign({}, this.params), { params });
|
413 | return this;
|
414 | }
|
415 | /**
|
416 | * Set factory for a function
|
417 | * @param type Type
|
418 | * @param factory Factory
|
419 | */
|
420 | setFactory(type, factory) {
|
421 | if (util_1.is.String(type)) {
|
422 | this.set(type, {
|
423 | factory
|
424 | });
|
425 | return this;
|
426 | }
|
427 | this.factories.set(type, factory);
|
428 | delete this.instances[decorators_1.getDefinition(type).name];
|
429 | return this;
|
430 | }
|
431 | /**
|
432 | * Set alias for a type
|
433 | * @param type Type
|
434 | * @param alias Alias value
|
435 | */
|
436 | setAlias(type, alias) {
|
437 | this.setFactory(type, function typeAlias() {
|
438 | return alias;
|
439 | });
|
440 | return this;
|
441 | }
|
442 | /**
|
443 | * Get overrided service definition
|
444 | * @param type Type
|
445 | */
|
446 | getType(type) {
|
447 | return this.types.get(type);
|
448 | }
|
449 | set(...params) {
|
450 | if (util_1.is.Function(params[0])) {
|
451 | this.types.set(params[0], params[1]);
|
452 | return this;
|
453 | }
|
454 | // Collection of values
|
455 | if (util_1.is.HashMap(params[0])) {
|
456 | util_1.forEach(params[0], (value, name) => this.set(name, value));
|
457 | return this;
|
458 | }
|
459 | let [name, value] = params;
|
460 | if (isDefinition(value)) {
|
461 | this.addDefinition(Object.assign({ private: false, tags: [] }, value, { name }));
|
462 | }
|
463 | else if (util_1.is.Function(value) || util_1.is.Array(value)) {
|
464 | let def = Object.assign({}, this.getDefinition(value));
|
465 | def.name = name;
|
466 | this.addDefinition(def);
|
467 | }
|
468 | else
|
469 | this.setParameter(name, value);
|
470 | return this;
|
471 | }
|
472 | /**
|
473 | * Get service built-in definition
|
474 | * @param target Class/Function
|
475 | */
|
476 | getDefinition(target) {
|
477 | let customDeps, def;
|
478 | if (util_1.is.Array(target)) {
|
479 | let { deps, func } = getDependencies(target);
|
480 | target = func;
|
481 | customDeps = deps;
|
482 | }
|
483 | if (util_1.is.Function(target)) {
|
484 | def = decorators_1.getDefinition(target);
|
485 | if (this.types.has(target)) {
|
486 | def = Object.assign({}, def, this.types.get(target));
|
487 | }
|
488 | Container.checkInheritance(target);
|
489 | }
|
490 | else if (isMethod(target)) {
|
491 | let method = target.context[target.method];
|
492 | def = decorators_1.getDefinition(method, target.context);
|
493 | def.service && Container.checkInheritance(def.service);
|
494 | }
|
495 | else if (util_1.is.String(target)) {
|
496 | if (!this.services[target]) {
|
497 | throw new errors_1.ServiceNotFoundError(target);
|
498 | }
|
499 | def = this.services[target];
|
500 | }
|
501 | else {
|
502 | throw TypeError(`getDefinition only accepts function or string.`);
|
503 | }
|
504 | if (customDeps) {
|
505 | def = Object.assign({}, def);
|
506 | def.parameters = customDeps;
|
507 | }
|
508 | return def;
|
509 | }
|
510 | /**
|
511 | * Add definition to container
|
512 | * @param definition Definition
|
513 | */
|
514 | addDefinition(definition) {
|
515 | // Defaults
|
516 | definition = Definition(definition);
|
517 | // Service decorated definition
|
518 | if (definition.service && decorators_1.hasDefinition(definition.service)) {
|
519 | definition = Object.assign(decorators_1.getDefinition(definition.service), definition);
|
520 | }
|
521 | // Auto-tagger defined in service
|
522 | if (util_1.is.Array(definition.autoTags)) {
|
523 | definition.autoTags.forEach(item => {
|
524 | if (util_1.is.Function(item))
|
525 | this.autoTag(item);
|
526 | else
|
527 | this.autoTag(item.class, item.tags);
|
528 | });
|
529 | }
|
530 | // Auto tagging
|
531 | if ((definition.tags || []).length == 0)
|
532 | this.autoTags.forEach(tagger => {
|
533 | definition.tags = [].concat(definition.tags || [], tagger(definition) || []);
|
534 | });
|
535 | delete this.instances[definition.name];
|
536 | this.services[definition.name] = definition;
|
537 | this.resolveImports(definition);
|
538 | return this;
|
539 | }
|
540 | /**
|
541 | * Get parameter value
|
542 | * @param name Parameter name
|
543 | */
|
544 | getParameter(name) {
|
545 | if (this.hasParameter(name))
|
546 | return this.params[name];
|
547 | throw Error(`Parameter ${name} not found`);
|
548 | }
|
549 | /**
|
550 | * Check parameter exists
|
551 | * @param name Parameter name
|
552 | */
|
553 | hasParameter(name) {
|
554 | return Object.keys(this.params).includes(name);
|
555 | }
|
556 | /**
|
557 | * Check for service definition exist
|
558 | * @param name Service name
|
559 | */
|
560 | has(name) {
|
561 | return !!this.services[name];
|
562 | }
|
563 | autoTag(...params) {
|
564 | if (params[1]) {
|
565 | this.autoTags.push(def => def.service && def.service.prototype instanceof params[0] ? params[1] : []);
|
566 | }
|
567 | else {
|
568 | this.autoTags.push(params[0]);
|
569 | }
|
570 | return this;
|
571 | }
|
572 | /**
|
573 | * Declare class or function to container
|
574 | */
|
575 | add(...services) {
|
576 | services.forEach(service => {
|
577 | let definition = this.getDefinition(service);
|
578 | this.set(definition.name, definition);
|
579 | });
|
580 | return this;
|
581 | }
|
582 | /**
|
583 | * Get declared definitions
|
584 | */
|
585 | get definitions() {
|
586 | return this.services;
|
587 | }
|
588 | /**
|
589 | * Return declared service names
|
590 | */
|
591 | get names() {
|
592 | return Object.keys(this.services);
|
593 | }
|
594 | /**
|
595 | * Get services count
|
596 | */
|
597 | get size() {
|
598 | return Object.keys(this.services).length;
|
599 | }
|
600 | [Symbol.iterator]() {
|
601 | let keys = Object.keys(this.services);
|
602 | return {
|
603 | next() {
|
604 | return {
|
605 | done: keys.length > 0,
|
606 | value: keys.pop()
|
607 | };
|
608 | }
|
609 | };
|
610 | }
|
611 | }
|
612 | exports.Container = Container;
|
613 | /**
|
614 | * Get injectable dependencies
|
615 | * @param value Injectable
|
616 | */
|
617 | function getDependencies(value) {
|
618 | let deps = [];
|
619 | let func;
|
620 | if (isMethod(value)) {
|
621 | func = value.context[value.method];
|
622 | deps = reflect_1.getParameters(func);
|
623 | if (Reflect.hasMetadata("design:paramtypes", value.context, value.method)) {
|
624 | let types = Reflect.getMetadata("design:paramtypes", value.context, value.method);
|
625 | deps = types.map(type => {
|
626 | });
|
627 | }
|
628 | }
|
629 | else if (util_1.is.Function(value)) {
|
630 | func = value;
|
631 | deps = value['$inject'] || (decorators_1.hasDefinition(value) && decorators_1.getDefinition(value).parameters) || (reflect_1.getParameters(value, false).filter(p => !p.hasDefault && p.name.length > 0).map(p => p.name));
|
632 | }
|
633 | else if (util_1.is.Array(value)) {
|
634 | func = value[value.length - 1];
|
635 | deps = value.slice(0, value.length - 1);
|
636 | assert_1.ok(util_1.is.Function(func), `Last element of array must be function`);
|
637 | }
|
638 | else {
|
639 | throw TypeError(`value of type ${typeof value} is not injectable`);
|
640 | }
|
641 | return { deps, func };
|
642 | }
|
643 | exports.getDependencies = getDependencies;
|
644 | /**
|
645 | * Create new container definition
|
646 | * @returns {IDefinition}
|
647 | */
|
648 | function Definition(definition) {
|
649 | assert_1.ok(util_1.is.String(definition.name), `Service name must be string`);
|
650 | return definition;
|
651 | }
|
652 | exports.Definition = Definition;
|
653 | function isFactory(value) { return value instanceof Function && exports.FACTORY_REGEX.test(value.name); }
|
654 | exports.isFactory = isFactory;
|
655 | function isService(value) { return value instanceof Function && !exports.FACTORY_REGEX.test(value.name); }
|
656 | exports.isService = isService;
|
657 | function isDefinition(value) {
|
658 | return util_1.is.HashMap(value) && ('service' in value || 'factory' in value);
|
659 | }
|
660 | exports.isDefinition = isDefinition;
|
661 | function Method(context, method) {
|
662 | return { context, method };
|
663 | }
|
664 | exports.Method = Method;
|
665 | function isMethod(value) {
|
666 | return typeof value == 'object' && 'context' in value && 'method' in value;
|
667 | }
|
668 | exports.isMethod = isMethod;
|
669 | const internalClasses = [Object, Function, Number, String, undefined];
|
670 | function isInternalClass(value) {
|
671 | return internalClasses.includes(value);
|
672 | }
|
673 | exports.isInternalClass = isInternalClass;
|
674 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnRhaW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDRDQUErQztBQUMvQyxzQ0FBMEM7QUFFMUMsbUNBQTRCO0FBQzVCLDZCQUE2QjtBQUM3Qiw2Q0FBbUc7QUFDbkcscUNBQWdEO0FBR25DLFFBQUEsYUFBYSxHQUFHLFlBQVksQ0FBQztBQUM3QixRQUFBLGFBQWEsR0FBRyxZQUFZLENBQUM7QUFRMUM7OztHQUdHO0FBQ0gsTUFBYSxTQUFTO0lBZ0VsQixZQUFZLFFBQTJCLEVBQUcsVUFBeUIsRUFBRyxRQUF3QjtRQXRDOUY7O1dBRUc7UUFDSyxjQUFTLEdBQWlCLEVBQUUsQ0FBQztRQUVyQzs7V0FFRztRQUNLLFdBQU0sR0FBaUIsRUFBRSxDQUFDO1FBRWxDOztXQUVHO1FBQ0ssYUFBUSxHQUF5QixFQUFFLENBQUM7UUFFNUM7O1dBRUc7UUFDSyxhQUFRLEdBQWtCLEVBQUUsQ0FBQztRQUVyQzs7V0FFRztRQUNLLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBaUIsQ0FBQztRQUVqRDs7V0FFRztRQUNLLFVBQUssR0FBRyxJQUFJLE9BQU8sRUFBeUIsQ0FBQztRQUVyRDs7V0FFRztRQUNLLGFBQVEsR0FBVSxFQUFFLENBQUM7UUFFN0IsdUVBQXVFO1FBQ2hFLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBR3RCLElBQUssUUFBUTtZQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pDLElBQUssUUFBUTtZQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkMsSUFBSyxVQUFVO1lBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7UUFFM0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLGdCQUFnQjtZQUN6RCxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztRQUVILGdC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 |
\ | No newline at end of file |