UNPKG

@ibyar/core

Version:

Ibyar core, Implements Aurora's core functionality, low-level services, and utilities

78 lines 2.97 kB
import { makeClassDecorator, makeClassMemberDecorator } from '@ibyar/decorators'; import { Components } from '../component/component.js'; import { ReflectComponents } from '../component/reflect.js'; import { fetchHtml } from '../utils/path.js'; export function HostListener(eventName, args) { return makeClassMemberDecorator((value, context, metadata) => { if (typeof context.name !== 'string') { throw new TypeError(`type ${typeof context.name} of '${context.name.toString()}' is not supported`); } args = typeof args === 'string' ? [args] : args; ReflectComponents.addHostListener(metadata, context.name, eventName, args || []); }); } export function HostBinding(hostPropertyName) { return makeClassMemberDecorator((value, context, metadata) => { if (typeof context.name !== 'string') { throw new TypeError(`type ${typeof context.name} of '${context.name.toString()}' is not supported`); } if (context.private) { throw new SyntaxError(`private members '${context.name.toString()}' is not supported.`); } ReflectComponents.addHostBinding(metadata, context.name, hostPropertyName); }); } /** * register a new pipe */ export const Pipe = makeClassDecorator((opt, constructor, context, metadata) => { Components.definePipe(constructor, opt, metadata); }); /** * register a new structure or attribute directive */ export const Directive = makeClassDecorator((opt, constructor, context, metadata) => { Components.defineDirective(constructor, opt, metadata); }); /** * register a new service */ export const Injectable = makeClassDecorator((opt, constructor, context) => { Components.defineInjectable(constructor, opt, context.metadata); }); function generateComponent(target, opt, metadata) { if (opt.templateUrl) { fetchHtml(opt.templateUrl) .then(htmlTemplate => { if (htmlTemplate) { opt.template = htmlTemplate; Components.defineComponent(target, opt, metadata); } }) .catch(reason => { console.error(`Error @URL: ${opt.templateUrl}, for model Class: ${target.name},\n Reason: ${reason}.`); }); } else { Components.defineComponent(target, opt, metadata); } } /** * define a new custom element model class */ export const Component = makeClassDecorator((opt, constructor, context, metadata) => { if (Array.isArray(opt)) { for (const comp of opt) { generateComponent(constructor, comp, metadata); } } else if (typeof opt === 'object') { generateComponent(constructor, opt, metadata); } }); export const customElement = makeClassDecorator((opt, constructor, context) => { Components.defineView(constructor, opt); }); export const Module = makeClassDecorator((opt, constructor, context) => { }); //# sourceMappingURL=decorators.js.map