Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
class VValueConverter {}
let vMeta = resources.autoRegister(container, VValueConverter);
resourceMetaType = metadata.get(metadata.resource, VValueConverter);
expect(vMeta).toBe(resourceMetaType);
@valueConverter('v')
class V {}
expect(() => resources.autoRegister(container, V)).toThrow();
// =========
class BBindingBehavior {}
let bMeta = resources.autoRegister(container, BBindingBehavior);
resourceMetaType = metadata.get(metadata.resource, BBindingBehavior);
expect(bMeta).toBe(resourceMetaType);
@bindingBehavior('b')
class B {}
expect(() => resources.autoRegister(container, B)).toThrow();
// ========
class HViewEngineHooks {
beforeCompile() {}
}
let hMeta = resources.autoRegister(container, HViewEngineHooks);
resourceMetaType = metadata.get(metadata.resource, HViewEngineHooks);
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);
}
_validate(object, propertyName = null, rules = null) {
const errors = [];
if (!rules) {
rules = metadata.get(metadataKey, object);
}
if (!rules) {
// no rules defined for propertyName.
return errors;
}
rules = rules.rules;
for (let i = 0, ii = rules.length; i < ii; i++) {
const ruleInfo = rules[i];
if (propertyName !== null && ruleInfo.key !== propertyName) {
continue;
}
const { name, config } = ruleInfo.rule;
const validator = { [propertyName]: { [name]: config } };
const result = validate(object, validator);
if (result) {
errors.push(new ValidationError(ruleInfo.rule, result[propertyName][0], object, propertyName));
_validate(object, propertyName = null, rules = null) {
const errors = [];
if (!rules) {
rules = metadata.get(metadataKey, object);
}
if (!rules) {
// no rules defined for propertyName.
return errors;
}
rules = rules.rules;
for (let i = 0, ii = rules.length; i < ii; i++) {
const ruleInfo = rules[i];
if (propertyName !== null && ruleInfo.key !== propertyName) {
continue;
}
const { name, config } = ruleInfo.rule;
const validator = { [propertyName]: { [name]: config } };
const result = validate(object, validator);
if (result) {
errors.push(new ValidationError(ruleInfo.rule, result[propertyName][0], object, propertyName));
const deco = (target: DependencyCtor & { inject?: any }) => {
if (!target.hasOwnProperty('inject')) {
target.inject = (
(metadata.getOwn(metadata.paramTypes, target) as Array) ||
_emptyParameters
).slice();
if (target.inject && target.inject.length > 0) {
// TypeScript 3.0 metadata for "...rest" gives type "Object"
// if last parameter is "Object", assume it's a ...rest and remove that
// metadata.
if (target.inject[target.inject.length - 1] === Object) {
target.inject.splice(-1, 1);
}
}
}
};
let deco = function(target) {
if (!target.hasOwnProperty('inject')) {
target.inject = (metadata.getOwn(metadata.paramTypes, target) || _emptyParameters).slice();
// TypeScript 3.0 metadata for "...rest" gives type "Object"
// if last parameter is "Object", assume it's a ...rest and remove that metadata.
if (target.inject.length > 0 &&
target.inject[target.inject.length - 1] === Object) {
target.inject.pop();
}
}
};
//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);
});
});
var deco = function(target){
Metadata.on(target).add(new ElementConfigResource());
};