This commit applies `strictNullChecks` to the entire codebase to improve maintainability and type safety. Key changes include: - Remove some explicit null-checks where unnecessary. - Add necessary null-checks. - Refactor static factory functions for a more functional approach. - Improve some test names and contexts for better debugging. - Add unit tests for any additional logic introduced. - Refactor `createPositionFromRegexFullMatch` to its own function as the logic is reused. - Prefer `find` prefix on functions that may return `undefined` and `get` prefix for those that always return a value.
46 lines
1.3 KiB
TypeScript
46 lines
1.3 KiB
TypeScript
import { BaseEntity } from '../infrastructure/Entity/BaseEntity';
|
|
import { IScript } from './IScript';
|
|
import { ICategory } from './ICategory';
|
|
|
|
export class Category extends BaseEntity<number> implements ICategory {
|
|
private allSubScripts?: ReadonlyArray<IScript> = undefined;
|
|
|
|
constructor(
|
|
id: number,
|
|
public readonly name: string,
|
|
public readonly docs: ReadonlyArray<string>,
|
|
public readonly subCategories: ReadonlyArray<ICategory>,
|
|
public readonly scripts: ReadonlyArray<IScript>,
|
|
) {
|
|
super(id);
|
|
validateCategory(this);
|
|
}
|
|
|
|
public includes(script: IScript): boolean {
|
|
return this.getAllScriptsRecursively().some((childScript) => childScript.id === script.id);
|
|
}
|
|
|
|
public getAllScriptsRecursively(): readonly IScript[] {
|
|
if (!this.allSubScripts) {
|
|
this.allSubScripts = parseScriptsRecursively(this);
|
|
}
|
|
return this.allSubScripts;
|
|
}
|
|
}
|
|
|
|
function parseScriptsRecursively(category: ICategory): ReadonlyArray<IScript> {
|
|
return [
|
|
...category.scripts,
|
|
...category.subCategories.flatMap((c) => c.getAllScriptsRecursively()),
|
|
];
|
|
}
|
|
|
|
function validateCategory(category: ICategory) {
|
|
if (!category.name) {
|
|
throw new Error('missing name');
|
|
}
|
|
if (category.subCategories.length === 0 && category.scripts.length === 0) {
|
|
throw new Error('A category must have at least one sub-category or script');
|
|
}
|
|
}
|