import Arbitrary from '@/ecs/arbitrary.js'; import Schema from '@/ecs/schema.js'; import gather from '@/util/gather.js'; const specificationsAndOrDecorators = gather( import.meta.glob('./*.js', {eager: true, import: 'default'}), ); const Components = {}; for (const componentName in specificationsAndOrDecorators) { // TODO: byKey, byId, ... if (Number.isInteger(+componentName)) { continue; } const specificationOrDecorator = specificationsAndOrDecorators[componentName]; if ('function' === typeof specificationOrDecorator) { Components[componentName] = specificationOrDecorator( class Decorated extends Arbitrary { static componentName = componentName; } ); if (!Components[componentName]) { throw new Error(`Component ${componentName} decorator returned nothing`); } } else { Components[componentName] = class Component extends Arbitrary { static componentName = componentName; static schema = new Schema({ type: 'object', properties: specificationOrDecorator, }); } } } export default Components;