fork of hey-api/openapi-ts because I need some additional things
at feat/skip-token 58 lines 1.4 kB view raw
1import path from 'node:path'; 2 3import type { IProject } from '../project/types'; 4import { File } from './file'; 5import type { FileKeyArgs, IFileIn, IFileRegistry } from './types'; 6 7type FileId = number; 8type FileKey = string; 9 10export class FileRegistry implements IFileRegistry { 11 private _id: FileId = 0; 12 private _values: Map<FileKey, File> = new Map(); 13 private readonly project: IProject; 14 15 constructor(project: IProject) { 16 this.project = project; 17 } 18 19 get(args: FileKeyArgs): File | undefined { 20 return this._values.get(this.createFileKey(args)); 21 } 22 23 isRegistered(args: FileKeyArgs): boolean { 24 return this._values.has(this.createFileKey(args)); 25 } 26 27 get nextId(): FileId { 28 return this._id++; 29 } 30 31 register(file: IFileIn): File { 32 const key = this.createFileKey(file); 33 34 let result = this._values.get(key); 35 if (result) { 36 if (file.name) { 37 result.setName(file.name); 38 } 39 } else { 40 result = new File(file, this.nextId, this.project); 41 } 42 43 this._values.set(key, result); 44 45 return result; 46 } 47 48 *registered(): IterableIterator<File> { 49 for (const file of this._values.values()) { 50 yield file; 51 } 52 } 53 54 private createFileKey(args: FileKeyArgs): string { 55 const logicalPath = args.logicalFilePath.split(path.sep).join('/'); 56 return `${args.external ? 'ext:' : ''}${logicalPath}${args.language ? `:${args.language}` : ''}`; 57 } 58}