fork of hey-api/openapi-ts because I need some additional things
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}