@travetto/app
Version:
Application registration/management and run support.
42 lines (37 loc) • 1.62 kB
text/typescript
import { lstatSync } from 'fs';
import { Class } from '@travetto/base';
import { SchemaRegistry } from '@travetto/schema';
import { RootIndex } from '@travetto/manifest';
import { ApplicationConfig, AppClass } from './types';
import { ApplicationRegistry } from './registry';
export type AppDecorator = { description?: string };
/**
* Marks a class as a candidate for application execution. The application
* has a name, and optional configuration for the various parameters. The
* compiler will automatically infer the parameters from the `run` method of
* the class.
*
* @augments `@travetto/app:Application`
* @augments `@travetto/di:Injectable`
*/
export function Application(name: string, config?: AppDecorator) {
return <T extends Class<AppClass>>(target: T): void => {
const src = RootIndex.getFunctionMetadata(target)!.source;
const stat = lstatSync(src, { throwIfNoEntry: false }) ?? { mtimeMs: 0, ctimeMs: 0 };
const finalName = name.replace(/(\s+|[^A-Za-z0-9\-_])/g, '-').replace(/([a-z])([A-Z])/g, (_, l, u) => `${l}-${u.toLowerCase()}`);
const out: Partial<ApplicationConfig> = {
params: [],
...config ?? {},
globalName: finalName,
target,
module: RootIndex.manifest.mainModule,
import: RootIndex.getFromSource(src)!.import,
targetId: target.Ⲑid,
name: finalName,
generatedTime: Math.max(stat.mtimeMs, stat.ctimeMs)
};
SchemaRegistry.register(target);
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
ApplicationRegistry.register(out.name!, out as ApplicationConfig);
};
}