From b209d710b88502d13580d5c6574c6af0ba68a4ac Mon Sep 17 00:00:00 2001 From: Alexander Zinn Date: Sat, 25 Oct 2025 17:20:23 -0400 Subject: [PATCH] Formatting --- .prettierrc | 12 +++++ eslint.config.ts | 48 +++++++++---------- src/di/DependencyManager.ts | 88 ++++++++++++++++------------------- src/di/IDependencyManager.ts | 6 +-- src/di/IDependencyProvider.ts | 2 +- src/di/NamedType.ts | 8 +--- src/lang/Disposable.ts | 2 +- src/lang/DisposableList.ts | 2 +- 8 files changed, 83 insertions(+), 85 deletions(-) create mode 100644 .prettierrc diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..5e87b44 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,12 @@ +{ + "arrowParens": "avoid", + "bracketSameLine": true, + "bracketSpacing": false, + "printWidth": 180, + "semi": true, + "singleAttributePerLine": false, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "none", + "useTabs": false +} diff --git a/eslint.config.ts b/eslint.config.ts index 3448d84..49b893d 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -1,35 +1,35 @@ -import js from "@eslint/js"; -import globals from "globals"; -import tseslint from "typescript-eslint"; -import json from "@eslint/json"; -import markdown from "@eslint/markdown"; -import css from "@eslint/css"; -import { defineConfig } from "eslint/config"; +import js from '@eslint/js'; +import globals from 'globals'; +import tseslint from 'typescript-eslint'; +import json from '@eslint/json'; +import markdown from '@eslint/markdown'; +import css from '@eslint/css'; +import {defineConfig} from 'eslint/config'; export default defineConfig([ { - files: ["**/*.{js,mjs,cjs,ts,mts,cts}"], - plugins: { js }, - extends: ["js/recommended"], - languageOptions: { globals: globals.node }, + files: ['**/*.{js,mjs,cjs,ts,mts,cts}'], + plugins: {js}, + extends: ['js/recommended'], + languageOptions: {globals: globals.node} }, tseslint.configs.recommended, { - files: ["**/*.json"], - plugins: { json }, - language: "json/json", - extends: ["json/recommended"], + files: ['**/*.json'], + plugins: {json}, + language: 'json/json', + extends: ['json/recommended'] }, { - files: ["**/*.md"], - plugins: { markdown }, - language: "markdown/commonmark", - extends: ["markdown/recommended"], + files: ['**/*.md'], + plugins: {markdown}, + language: 'markdown/commonmark', + extends: ['markdown/recommended'] }, { - files: ["**/*.css"], - plugins: { css }, - language: "css/css", - extends: ["css/recommended"], - }, + files: ['**/*.css'], + plugins: {css}, + language: 'css/css', + extends: ['css/recommended'] + } ]); diff --git a/src/di/DependencyManager.ts b/src/di/DependencyManager.ts index 7e3e744..3e2905f 100644 --- a/src/di/DependencyManager.ts +++ b/src/di/DependencyManager.ts @@ -1,11 +1,11 @@ -import type IDependencyProvider from "./IDependencyProvider"; -import type IDisposable from "../lang/IDisposable"; -import Disposable from "../lang/Disposable"; -import Type from "./Type"; -import type IDependencyManager from "./IDependencyManager"; +import type IDependencyProvider from './IDependencyProvider'; +import type IDisposable from '../lang/IDisposable'; +import Disposable from '../lang/Disposable'; +import Type from './Type'; +import type IDependencyManager from './IDependencyManager'; type Constructor = new (...args: unknown[]) => T; -type ModuleLoader = (modulePath: string) => Promise; +type ModuleLoader = (modulePath: string) => Promise; export default class DependencyManager implements IDependencyManager { private readonly _moduleLoader: ModuleLoader; @@ -16,8 +16,8 @@ export default class DependencyManager implements IDependencyManager { private readonly _pending: Type[]; constructor(moduleLoader: ModuleLoader) { - if (typeof moduleLoader !== "function") { - throw new Error("Module loader must be a function"); + if (typeof moduleLoader !== 'function') { + throw new Error('Module loader must be a function'); } this._moduleLoader = moduleLoader; @@ -30,25 +30,23 @@ export default class DependencyManager implements IDependencyManager { public defineDependencies(type: Type, dependencies: Type[]): IDisposable { if (!(type instanceof Type)) { - throw new Error("Type must be a Type"); + throw new Error('Type must be a Type'); } if (!Array.isArray(dependencies)) { - throw new Error("Dependencies must be an array"); + throw new Error('Dependencies must be an array'); } for (const dependency of dependencies) { if (!(dependency instanceof Type)) { - throw new Error("Dependency must be a Type"); + throw new Error('Dependency must be a Type'); } } const key = type.toURN(); if (this._injections.has(key)) { - throw new Error( - `Dependencies already defined for type [${type.toString()}]`, - ); + throw new Error(`Dependencies already defined for type [${type.toString()}]`); } this._injections.set(key, dependencies); @@ -61,7 +59,7 @@ export default class DependencyManager implements IDependencyManager { public getDependencies(type: Type): Type[] | undefined { if (!(type instanceof Type)) { - throw new Error("Type must be an instance of Type"); + throw new Error('Type must be an instance of Type'); } return this._injections.get(type.toURN()); @@ -69,7 +67,7 @@ export default class DependencyManager implements IDependencyManager { public addProvider(provider: IDependencyProvider): IDisposable { if (!this.isProvider(provider)) { - throw new Error("Provider must implement IDependencyProvider"); + throw new Error('Provider must implement IDependencyProvider'); } this._providers.push(provider); @@ -83,7 +81,22 @@ export default class DependencyManager implements IDependencyManager { } public async resolveProvider(type: Type): Promise { - return this.resolve(type); + if (!(type instanceof Type)) { + throw new Error('Type must be an instance of Type'); + } + + const candidates = this._providers.filter(provider => provider.canProvide(type)); + + if (candidates.length === 0) { + throw new Error(`No provider for [${type.toString()}]`); + } + + if (candidates.length > 1) { + const candidateNames = candidates.map(c => c.toString()).join(', '); + throw new Error(`Multiple providers for ${type}: ${candidateNames}`); + } + + return candidates[0] as IDependencyProvider; } public async instantiateType(type: Type): Promise { @@ -95,10 +108,8 @@ export default class DependencyManager implements IDependencyManager { // Check for circular dependencies if (this._pending.includes(type)) { - const pendingChain = this._pending.map((t) => t.toString()).join(' -> '); - throw new Error( - `Failed to resolve ${type} due to circular dependency: ${pendingChain}` - ); + const pendingChain = this._pending.map(t => t.toString()).join(' -> '); + throw new Error(`Failed to resolve ${type} due to circular dependency: ${pendingChain}`); } this._pending.push(type); @@ -109,7 +120,7 @@ export default class DependencyManager implements IDependencyManager { // Resolve all dependencies const resolvedDependencies = await Promise.all( - dependencies.map(async (dependency) => { + dependencies.map(async dependency => { const provider = await this.resolveProvider(dependency); let instance = await provider.provide(dependency); @@ -150,7 +161,7 @@ export default class DependencyManager implements IDependencyManager { public addEagerType(type: Type): void { if (!(type instanceof Type)) { - throw new Error("Type must be an instance of Type"); + throw new Error('Type must be an instance of Type'); } this._eagerTypes.push(type); @@ -167,35 +178,14 @@ export default class DependencyManager implements IDependencyManager { private isProvider(obj: unknown): obj is IDependencyProvider { return ( obj !== null && - typeof obj === "object" && - "canProvide" in obj && - "provide" in obj && - typeof (obj as IDependencyProvider).canProvide === "function" && - typeof (obj as IDependencyProvider).provide === "function" + typeof obj === 'object' && + 'canProvide' in obj && + 'provide' in obj && + typeof (obj as IDependencyProvider).canProvide === 'function' && + typeof (obj as IDependencyProvider).provide === 'function' ); } - private resolve(type: Type): IDependencyProvider { - if (!(type instanceof Type)) { - throw new Error("Type must be an instance of Type"); - } - - const candidates = this._providers.filter((provider) => - provider.canProvide(type), - ); - - if (candidates.length === 0) { - throw new Error(`No provider for [${type.toString()}]`); - } - - if (candidates.length > 1) { - const candidateNames = candidates.map((c) => c.toString()).join(", "); - throw new Error(`Multiple providers for ${type}: ${candidateNames}`); - } - - return candidates[0] as IDependencyProvider; - } - private injectDependencies(Constructor: Constructor, dependencies: unknown[]): unknown { if (dependencies.length === 0) { return new Constructor(); diff --git a/src/di/IDependencyManager.ts b/src/di/IDependencyManager.ts index 0229d9a..b6f8f46 100644 --- a/src/di/IDependencyManager.ts +++ b/src/di/IDependencyManager.ts @@ -1,6 +1,6 @@ -import type Type from "./Type"; -import type IDisposable from "../lang/IDisposable"; -import type IDependencyProvider from "./IDependencyProvider"; +import type Type from './Type'; +import type IDisposable from '../lang/IDisposable'; +import type IDependencyProvider from './IDependencyProvider'; export default interface IDependencyManager { defineDependencies(type: Type, dependencies: Type[]): IDisposable; diff --git a/src/di/IDependencyProvider.ts b/src/di/IDependencyProvider.ts index ed54328..ea5ff9f 100644 --- a/src/di/IDependencyProvider.ts +++ b/src/di/IDependencyProvider.ts @@ -1,4 +1,4 @@ -import Type from "./Type"; +import Type from './Type'; export default interface IDependencyProvider { canProvide(type: Type): boolean; diff --git a/src/di/NamedType.ts b/src/di/NamedType.ts index 06e686e..6379125 100644 --- a/src/di/NamedType.ts +++ b/src/di/NamedType.ts @@ -1,4 +1,4 @@ -import Type from "./Type"; +import Type from './Type'; export default class NamedType extends Type { private readonly _name: string; @@ -13,11 +13,7 @@ export default class NamedType extends Type { } public override equals(other: Type) { - return ( - super.equals(other) && - other instanceof Type && - this.getName() === (other as NamedType).getName() - ); + return super.equals(other) && other instanceof Type && this.getName() === (other as NamedType).getName(); } public overridetoURN(): string { diff --git a/src/lang/Disposable.ts b/src/lang/Disposable.ts index 0b322b2..887b07f 100644 --- a/src/lang/Disposable.ts +++ b/src/lang/Disposable.ts @@ -1,4 +1,4 @@ -import IDisposable from "./IDisposable"; +import IDisposable from './IDisposable'; export default class Disposable implements IDisposable { private readonly _cleanup: () => void; diff --git a/src/lang/DisposableList.ts b/src/lang/DisposableList.ts index 8d8ff2e..d5d7a9d 100644 --- a/src/lang/DisposableList.ts +++ b/src/lang/DisposableList.ts @@ -1,4 +1,4 @@ -import IDisposable from "./IDisposable"; +import IDisposable from './IDisposable'; export default class DisposableList implements IDisposable { private readonly _list: IDisposable[];