Something went wrong. Try again.
fork of hey-api/openapi-ts because I need some additional things
Something went wrong. Try again.
3.0 kB · 86 lines
TypeScript
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687import path from 'node:path';
import type { IProjectRenderMeta } from '../extensions';import { FileRegistry } from '../files/registry';import { defaultExtensions } from '../languages/extensions';import { defaultModuleEntryNames } from '../languages/modules';import { defaultNameConflictResolvers } from '../languages/resolvers';import type { Extensions, ModuleEntryNames, NameConflictResolvers } from '../languages/types';import { NodeRegistry } from '../nodes/registry';import type { IOutput } from '../output';import { Planner } from '../planner/planner';import { simpleNameConflictResolver } from '../planner/resolvers';import type { NameConflictResolver } from '../planner/types';import type { Renderer } from '../renderer';import { SymbolRegistry } from '../symbols/registry';import type { IProject } from './types';
export class Project implements IProject { private _isPlanned = false;
readonly files: FileRegistry; readonly nodes = new NodeRegistry(); readonly symbols = new SymbolRegistry();
readonly defaultFileName: string; readonly defaultNameConflictResolver: NameConflictResolver; readonly extensions: Extensions; readonly fileName?: (name: string) => string; readonly moduleEntryNames: ModuleEntryNames; readonly nameConflictResolvers: NameConflictResolvers; readonly renderers: ReadonlyArray<Renderer>; readonly root: string;
constructor( args: Pick< Partial<IProject>, | 'defaultFileName' | 'defaultNameConflictResolver' | 'extensions' | 'fileName' | 'moduleEntryNames' | 'nameConflictResolvers' | 'renderers' > & Pick<IProject, 'root'>, ) { const fileName = args.fileName; this.defaultFileName = args.defaultFileName ?? 'main'; this.defaultNameConflictResolver = args.defaultNameConflictResolver ?? simpleNameConflictResolver; this.extensions = { ...defaultExtensions, ...args.extensions, }; this.fileName = typeof fileName === 'string' ? () => fileName : fileName; this.files = new FileRegistry(this); this.moduleEntryNames = { ...defaultModuleEntryNames, ...args.moduleEntryNames, }; this.nameConflictResolvers = { ...defaultNameConflictResolvers, ...args.nameConflictResolvers, }; this.renderers = args.renderers ?? []; this.root = path.resolve(args.root).replace(/[/\\]+$/, ''); }
plan(meta?: IProjectRenderMeta): void { if (this._isPlanned) return; new Planner(this).plan(meta); this._isPlanned = true; }
render(meta?: IProjectRenderMeta): ReadonlyArray<IOutput> { if (!this._isPlanned) this.plan(meta); const files: Array<IOutput> = []; for (const file of this.files.registered()) { if (!file.external && file.finalPath && file.renderer) { const content = file.renderer.render({ file, meta, project: this }); files.push({ content, path: file.finalPath }); } } return files; }}