Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
context.viewModel = childContainer.viewModel = childContainer.get(viewModelResource.value);
context.viewModelResource = viewModelResource;
return context;
});
}
// When viewModel in context is not a module path
// only prepare the metadata and ensure the view model instance is ready
// if viewModel is a class, instantiate it
let ctor = context.viewModel.constructor;
let isClass = typeof context.viewModel === 'function';
if (isClass) {
ctor = context.viewModel;
childContainer.autoRegister(ctor);
}
let m = metadata.getOrCreateOwn(metadata.resource, HtmlBehaviorResource, ctor);
// We don't call ViewResources.prototype.convention here as it should be called later
// Just need to prepare the metadata for later usage
m.elementName = m.elementName || 'dynamic-element';
// HtmlBehaviorResource has its own guard to prevent unnecessary subsequent initialization calls
// so it's safe to call initialize this way
m.initialize(isClass ? childContainer : (context.container || childContainer), ctor);
// simulate the metadata of view model, like it was analyzed by module analyzer
// Cannot create a ResourceDescription instance here as it does too much
context.viewModelResource = { metadata: m, value: ctor };
// register the host element in case custom element view model declares it
if (context.host) {
childContainer.registerInstance(DOM.Element, context.host);
}
childContainer.viewModel = context.viewModel = isClass ? childContainer.get(ctor) : context.viewModel;
return Promise.resolve(context);
}
//no convention and no customeElement or customAttribute but behavior added by other metadata
resourceTypeMeta.elementName = _hyphenate(impl.name);
}
}
} else {
resourceTypeMeta = ViewResources.convention(impl)
|| HtmlBehaviorResource.convention(impl.name)
|| ValueConverterResource.convention(impl.name)
|| BindingBehaviorResource.convention(impl.name)
|| ViewEngineHooksResource.convention(impl.name);
if (!resourceTypeMeta) {
// doesn't match any convention, and is an exported value => custom element
resourceTypeMeta = new HtmlBehaviorResource();
resourceTypeMeta.elementName = _hyphenate(impl.name);
}
metadata.define(metadata.resource, resourceTypeMeta, impl);
}
resourceTypeMeta.initialize(container, impl);
resourceTypeMeta.register(this);
return resourceTypeMeta;
}
}
function getObserver(instance, name) {
let lookup = instance.__observers__;
if (lookup === undefined) {
// We need to lookup the actual behavior for this instance,
// as it might be a derived class (and behavior) rather than
// the class (and behavior) that declared the property calling getObserver().
// This means we can't capture the behavior in property get/set/getObserver and pass it here.
// Note that it's probably for the best, as passing the behavior is an overhead
// that is only useful in the very first call of the first property of the instance.
let ctor = Object.getPrototypeOf(instance).constructor; // Playing safe here, user could have written to instance.constructor.
let behavior = metadata.get(metadata.resource, ctor);
if (!behavior.isInitialized) {
behavior.initialize(Container.instance || new Container(), instance.constructor);
}
lookup = behavior.observerLocator.getOrCreateObserversLookup(instance);
behavior._ensurePropertiesDefined(instance, lookup);
}
return lookup[name];
}
it('should define metadata using something else', () => {
let behaviorResource = new class FakeResource{}();
@resource(behaviorResource)
class El {}
expect(El.$resource).toBe(undefined);
expect(metadata.getOwn(metadata.resource, El)).toBe(behaviorResource);
});
});
return function(target){
metadata.define(metadata.resource, new ValueConverterResource(nameOrTarget), target);
}
}
constructor(key: string, exportedValue: any, resourceTypeMeta: Object) {
if (!resourceTypeMeta) {
resourceTypeMeta = metadata.get(metadata.resource, exportedValue);
if (!resourceTypeMeta) {
resourceTypeMeta = new HtmlBehaviorResource();
resourceTypeMeta.elementName = hyphenate(key);
metadata.define(metadata.resource, resourceTypeMeta, exportedValue);
}
}
if (resourceTypeMeta instanceof HtmlBehaviorResource) {
if (resourceTypeMeta.elementName === undefined) {
//customeElement()
resourceTypeMeta.elementName = hyphenate(key);
} else if (resourceTypeMeta.attributeName === undefined) {
//customAttribute()
resourceTypeMeta.attributeName = hyphenate(key);
} else if (resourceTypeMeta.attributeName === null && resourceTypeMeta.elementName === null) {
export function valueConverter(nameOrTarget){
if(nameOrTarget === undefined || typeof nameOrTarget === 'string'){
return function(target){
metadata.define(metadata.resource, new ValueConverterResource(nameOrTarget), target);
}
}
metadata.define(metadata.resource, new ValueConverterResource(), nameOrTarget);
}
let deco = function(t) {
let r = metadata.getOrCreateOwn(metadata.resource, HtmlBehaviorResource, t);
r.containerless = true;
};
return function(target) {
if (override instanceof HtmlBehaviorResource) {
metadata.define(metadata.resource, override, target);
} else {
let r = metadata.getOrCreateOwn(metadata.resource, HtmlBehaviorResource, target);
Object.assign(r, override);
}
};
}
export function bindingBehavior(nameOrTarget) {
if (nameOrTarget === undefined || typeof nameOrTarget === 'string') {
return function(target) {
metadata.define(metadata.resource, new BindingBehaviorResource(nameOrTarget), target);
};
}
metadata.define(metadata.resource, new BindingBehaviorResource(), nameOrTarget);
}