@devcraft-ts/diadem 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/LICENSE +21 -0
- package/README.md +306 -0
- package/dist/auto-discovery-5IV22D5D.cjs +73 -0
- package/dist/auto-discovery-5IV22D5D.cjs.map +1 -0
- package/dist/auto-discovery-RPCKK3PB.js +68 -0
- package/dist/auto-discovery-RPCKK3PB.js.map +1 -0
- package/dist/chunk-72YY5X6T.cjs +683 -0
- package/dist/chunk-72YY5X6T.cjs.map +1 -0
- package/dist/chunk-FHQRDO5C.cjs +187 -0
- package/dist/chunk-FHQRDO5C.cjs.map +1 -0
- package/dist/chunk-RTX6B4YY.js +681 -0
- package/dist/chunk-RTX6B4YY.js.map +1 -0
- package/dist/chunk-W7NA3ZZF.js +169 -0
- package/dist/chunk-W7NA3ZZF.js.map +1 -0
- package/dist/cli.cjs +821 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.js +815 -0
- package/dist/cli.js.map +1 -0
- package/dist/container-C1FFn9_4.d.cts +249 -0
- package/dist/container-C1FFn9_4.d.ts +249 -0
- package/dist/index.cjs +145 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +304 -0
- package/dist/index.d.ts +304 -0
- package/dist/index.js +71 -0
- package/dist/index.js.map +1 -0
- package/dist/setup/index.cjs +87 -0
- package/dist/setup/index.cjs.map +1 -0
- package/dist/setup/index.d.cts +81 -0
- package/dist/setup/index.d.ts +81 -0
- package/dist/setup/index.js +75 -0
- package/dist/setup/index.js.map +1 -0
- package/package.json +92 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/config.ts","../src/cli/generator.ts","../src/cli/index.ts"],"names":["resolve","existsSync","readFileSync"],"mappings":"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","file":"cli.js","sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\n/** What the generator emits. */\nexport type EmitMode = 'manifest' | 'compiled'\n\n/** Resolved generator configuration (regexes compiled, paths absolute-ready). */\nexport interface DiademConfig {\n rootDir: string\n scanDirs: string[]\n include: RegExp[]\n exclude: RegExp[]\n outFile: string\n environments: string[]\n /** 'manifest' (data, interpreted at runtime) or 'compiled' (straight-line wiring). */\n emit: EmitMode\n /** For `emit: 'compiled'`, bake in a single environment (else wire all). */\n targetEnv?: string\n}\n\n/** User-facing config (from `diadem.config.json` or CLI flags). */\nexport interface DiademConfigInput {\n scanDirs?: string[]\n include?: string[]\n exclude?: string[]\n outFile?: string\n environments?: string[]\n emit?: EmitMode\n targetEnv?: string\n}\n\nconst DEFAULTS = {\n scanDirs: ['src'],\n // Default: every .ts file. The AST pass keeps only DI-decorated classes, so\n // `include` is purely an optional performance narrowing (e.g. ['Service\\\\.ts$']).\n include: ['\\\\.ts$'],\n exclude: [\n '\\\\.test\\\\.ts$',\n '\\\\.spec\\\\.ts$',\n '\\\\.d\\\\.ts$',\n 'node_modules',\n '/dist/',\n '/build/',\n '/generated/'\n ],\n outFile: 'src/generated/service-manifest.ts',\n environments: ['development', 'production', 'test'],\n emit: 'manifest' as EmitMode,\n targetEnv: undefined as string | undefined\n}\n\nfunction stripUndefined<T extends object>(obj: T): Partial<T> {\n return Object.fromEntries(\n Object.entries(obj).filter(([, v]) => v !== undefined)\n ) as Partial<T>\n}\n\n/**\n * Build a resolved config from defaults, an optional `diadem.config.json` in\n * `rootDir`, and CLI overrides (highest precedence).\n */\nexport function loadConfig(\n rootDir: string,\n overrides: DiademConfigInput = {}\n): DiademConfig {\n let fileConfig: DiademConfigInput = {}\n const configPath = resolve(rootDir, 'diadem.config.json')\n if (existsSync(configPath)) {\n fileConfig = JSON.parse(\n readFileSync(configPath, 'utf8')\n ) as DiademConfigInput\n }\n\n const merged = {\n ...DEFAULTS,\n ...stripUndefined(fileConfig),\n ...stripUndefined(overrides)\n }\n\n return {\n rootDir,\n scanDirs: merged.scanDirs,\n include: merged.include.map((p) => new RegExp(p)),\n exclude: merged.exclude.map((p) => new RegExp(p)),\n outFile: merged.outFile,\n environments: merged.environments,\n emit: merged.emit,\n targetEnv: merged.targetEnv\n }\n}\n","/**\n * Build-time DI manifest generator.\n *\n * Scans the configured source directories, finds DI-decorated classes via the\n * TypeScript AST, extracts each constructor's dependencies, resolves them\n * token-first, topologically sorts the graph, and emits a `service-manifest.ts`\n * conforming to Diadem's `ServiceManifestModule` contract — no runtime\n * reflection required.\n */\n\nimport { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { dirname, join, relative, resolve } from 'node:path'\nimport ts from 'typescript'\nimport type { DiademConfig } from './config'\n\n/** The published package name that generated files import from. */\nconst PACKAGE_NAME = '@devcraft-ts/diadem'\n\ntype Lifecycle =\n | 'dependency'\n | 'singleton'\n | 'factory'\n | 'lazy'\n | 'lazySingleton'\n\nconst LIFECYCLE_BY_DECORATOR: Record<string, Lifecycle> = {\n singleton: 'singleton',\n factory: 'factory',\n lazy: 'lazy',\n lazySingleton: 'lazySingleton',\n injectable: 'dependency'\n}\n\ninterface RawDependency {\n paramName: string\n paramIndex: number\n typeName: string\n isOptional: boolean\n isReadonly: boolean\n isPrivate: boolean\n}\n\ninterface ResolvedDependency extends RawDependency {\n implementingService?: string\n external?: boolean\n}\n\n/** Where a token (abstract class) can be imported from. */\ntype TokenModule =\n | { kind: 'file'; fullPath: string }\n | { kind: 'bare'; specifier: string }\n\ninterface ServiceInfo {\n className: string\n lifecycle: Lifecycle\n environment?: string\n token?: string\n tokenExported: boolean\n /** Resolved import source of the token, for the typed accessor surface. */\n tokenModule?: TokenModule\n fullPath: string\n filePath: string\n exported: boolean\n dependencies: RawDependency[]\n resolvedDependencies: ResolvedDependency[]\n registrationOrder: number\n}\n\n/** A required dependency that no registered service implements. */\nexport interface UnresolvedDependency {\n service: string\n paramName: string\n typeName: string\n}\n\nexport interface GenerateResult {\n outFile: string\n serviceCount: number\n cycles: string[]\n externalDependencies: number\n /** Required (non-optional) dependencies with no implementing service. */\n unresolved: UnresolvedDependency[]\n /** Tokens declared by more than one service (ambiguous resolution). */\n duplicateTokens: string[]\n}\n\nconst PRIMITIVE_TYPES = new Set([\n 'string',\n 'number',\n 'boolean',\n 'Date',\n 'Array',\n 'Object',\n 'any',\n 'unknown',\n 'void',\n 'null',\n 'undefined',\n 'Promise',\n 'RegExp',\n 'Error',\n 'Map',\n 'Set'\n])\n\n/** Run the full generation pipeline and write the manifest file. */\nexport function generateManifest(config: DiademConfig): GenerateResult {\n const files = collectFiles(config)\n const services: ServiceInfo[] = []\n for (const file of files) {\n services.push(...analyzeFile(file.fullPath, file.relPath))\n }\n\n const { sorted, cycles, duplicateTokens } = resolveAndSort(services)\n sorted.forEach((service, index) => {\n service.registrationOrder = index\n })\n\n const outFile = resolve(config.rootDir, config.outFile)\n const content =\n config.emit === 'compiled'\n ? renderCompiled(sorted, config, outFile)\n : renderManifest(sorted, config, outFile)\n mkdirSync(dirname(outFile), { recursive: true })\n writeFileSync(outFile, content, 'utf8')\n\n const externalDependencies = sorted.reduce(\n (sum, s) => sum + s.resolvedDependencies.filter((d) => d.external).length,\n 0\n )\n\n const unresolved: UnresolvedDependency[] = []\n for (const service of sorted) {\n for (const dep of service.resolvedDependencies) {\n if (dep.external && !dep.isOptional) {\n unresolved.push({\n service: service.className,\n paramName: dep.paramName,\n typeName: dep.typeName\n })\n }\n }\n }\n\n return {\n outFile,\n serviceCount: sorted.length,\n cycles,\n externalDependencies,\n unresolved,\n duplicateTokens\n }\n}\n\n// --- File collection -------------------------------------------------------\n\ninterface ScannedFile {\n fullPath: string\n relPath: string\n}\n\nfunction collectFiles(config: DiademConfig): ScannedFile[] {\n const files: ScannedFile[] = []\n for (const dir of config.scanDirs) {\n const abs = resolve(config.rootDir, dir)\n if (!existsSync(abs)) {\n continue\n }\n walk(abs, dir, config, files)\n }\n return files\n}\n\nfunction walk(\n absDir: string,\n relDir: string,\n config: DiademConfig,\n out: ScannedFile[]\n): void {\n for (const entry of readdirSync(absDir, { withFileTypes: true })) {\n const fullPath = join(absDir, entry.name)\n const relPath = join(relDir, entry.name)\n if (entry.isDirectory()) {\n walk(fullPath, relPath, config, out)\n } else if (entry.isFile() && shouldScan(relPath, config)) {\n out.push({ fullPath, relPath })\n }\n }\n}\n\nfunction shouldScan(relPath: string, config: DiademConfig): boolean {\n const normalized = relPath.replace(/\\\\/g, '/')\n if (config.exclude.some((re) => re.test(normalized))) {\n return false\n }\n return config.include.some((re) => re.test(normalized))\n}\n\n// --- AST analysis ----------------------------------------------------------\n\nfunction analyzeFile(fullPath: string, relPath: string): ServiceInfo[] {\n const source = ts.createSourceFile(\n fullPath,\n readFileSync(fullPath, 'utf8'),\n ts.ScriptTarget.Latest,\n /* setParentNodes */ true\n )\n\n // Where each name in scope comes from — for resolving token import sources.\n const tokenSources = new Map<string, TokenModule>()\n const fileDir = dirname(fullPath)\n const exportedClasses = new Set<string>()\n\n ts.forEachChild(source, function collect(node) {\n // import { A, B } from '...'\n if (\n ts.isImportDeclaration(node) &&\n node.importClause?.namedBindings &&\n ts.isNamedImports(node.importClause.namedBindings) &&\n ts.isStringLiteral(node.moduleSpecifier)\n ) {\n const specifier = node.moduleSpecifier.text\n const module: TokenModule = specifier.startsWith('.')\n ? { kind: 'file', fullPath: resolve(fileDir, specifier) }\n : { kind: 'bare', specifier }\n for (const element of node.importClause.namedBindings.elements) {\n tokenSources.set(element.name.text, module)\n }\n }\n // Locally declared, exported abstract classes can serve as tokens.\n if (ts.isClassDeclaration(node) && node.name && isExported(node)) {\n exportedClasses.add(node.name.text)\n tokenSources.set(node.name.text, { kind: 'file', fullPath })\n }\n ts.forEachChild(node, collect)\n })\n\n const services: ServiceInfo[] = []\n ts.forEachChild(source, function visit(node) {\n if (ts.isClassDeclaration(node)) {\n const info = analyzeClass(node, fullPath, relPath, exportedClasses, tokenSources)\n if (info) {\n services.push(info)\n }\n }\n ts.forEachChild(node, visit)\n })\n\n return services\n}\n\nfunction analyzeClass(\n node: ts.ClassDeclaration,\n fullPath: string,\n relPath: string,\n exportedClasses: Set<string>,\n tokenSources: Map<string, TokenModule>\n): ServiceInfo | null {\n if (!node.name) {\n return null\n }\n\n const decoratorInfo = findDIDecorator(node)\n if (!decoratorInfo) {\n return null\n }\n\n const dependencies = analyzeConstructor(node)\n const token = decoratorInfo.token\n\n return {\n className: node.name.text,\n lifecycle: decoratorInfo.lifecycle,\n environment: decoratorInfo.environment,\n token,\n tokenExported: !!token && exportedClasses.has(token),\n tokenModule: token ? tokenSources.get(token) : undefined,\n fullPath,\n filePath: relPath.replace(/\\\\/g, '/'),\n exported: isExported(node),\n dependencies,\n resolvedDependencies: [],\n registrationOrder: 0\n }\n}\n\ninterface DecoratorInfo {\n lifecycle: Lifecycle\n token?: string\n environment?: string\n}\n\nfunction findDIDecorator(node: ts.ClassDeclaration): DecoratorInfo | null {\n const decorators = ts.canHaveDecorators(node)\n ? (ts.getDecorators(node) ?? [])\n : []\n\n for (const decorator of decorators) {\n const expr = decorator.expression\n let name = ''\n let args: ts.NodeArray<ts.Expression> | undefined\n\n if (ts.isCallExpression(expr)) {\n name = expr.expression.getText()\n args = expr.arguments\n } else if (ts.isIdentifier(expr)) {\n name = expr.getText()\n }\n\n const lifecycle = LIFECYCLE_BY_DECORATOR[name]\n if (!lifecycle) {\n continue\n }\n\n let token: string | undefined\n let environment: string | undefined\n if (args && args.length > 0 && ts.isIdentifier(args[0])) {\n token = args[0].getText()\n }\n if (args && args.length > 1 && ts.isStringLiteral(args[1])) {\n environment = args[1].text\n }\n\n return { lifecycle, token, environment }\n }\n\n return null\n}\n\nfunction analyzeConstructor(node: ts.ClassDeclaration): RawDependency[] {\n const ctor = node.members.find((m) => ts.isConstructorDeclaration(m)) as\n | ts.ConstructorDeclaration\n | undefined\n if (!ctor) {\n return []\n }\n\n const deps: RawDependency[] = []\n ctor.parameters.forEach((param, index) => {\n if (!param.type) {\n return\n }\n const typeName = extractTypeName(param.type)\n if (isPrimitive(typeName)) {\n return\n }\n\n const modifiers = ts.canHaveModifiers(param)\n ? (ts.getModifiers(param) ?? [])\n : []\n\n deps.push({\n paramName: param.name.getText(),\n paramIndex: index,\n typeName,\n isOptional: !!param.questionToken || !!param.initializer,\n isReadonly: modifiers.some(\n (m) => m.kind === ts.SyntaxKind.ReadonlyKeyword\n ),\n isPrivate: modifiers.some((m) => m.kind === ts.SyntaxKind.PrivateKeyword)\n })\n })\n\n return deps\n}\n\nfunction extractTypeName(typeNode: ts.TypeNode): string {\n const raw = ts.isTypeReferenceNode(typeNode)\n ? typeNode.typeName.getText()\n : typeNode.getText()\n return raw\n .replace(/<[^>]*>/g, '')\n .replace(/\\[\\]/g, '')\n .trim()\n}\n\nfunction isPrimitive(typeName: string): boolean {\n return (\n PRIMITIVE_TYPES.has(typeName) ||\n typeName.toLowerCase() === typeName ||\n typeName.includes('<')\n )\n}\n\nfunction isExported(node: ts.ClassDeclaration): boolean {\n const modifiers = ts.canHaveModifiers(node) ? ts.getModifiers(node) : undefined\n return (\n modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) ?? false\n )\n}\n\n// --- Dependency resolution + topological sort ------------------------------\n\nfunction resolveAndSort(services: ServiceInfo[]): {\n sorted: ServiceInfo[]\n cycles: string[]\n duplicateTokens: string[]\n} {\n const serviceByName = new Map<string, ServiceInfo>()\n const tokenToImpl = new Map<string, string>()\n const duplicateTokens = new Set<string>()\n\n for (const service of services) {\n serviceByName.set(service.className, service)\n if (service.token) {\n if (tokenToImpl.has(service.token)) {\n duplicateTokens.add(service.token)\n } else {\n tokenToImpl.set(service.token, service.className)\n }\n }\n }\n\n const resolveByHeuristic = (typeName: string): string | undefined => {\n const direct = serviceByName.get(typeName)\n if (direct) {\n return direct.className\n }\n if (typeName.startsWith('I')) {\n const stripped = typeName.slice(1)\n if (serviceByName.has(stripped)) {\n return stripped\n }\n const suffixed = services.find(\n (s) =>\n (s.className.endsWith('Service') ||\n s.className.endsWith('Repository')) &&\n s.className.includes(stripped)\n )\n if (suffixed) {\n return suffixed.className\n }\n }\n return undefined\n }\n\n for (const service of services) {\n service.resolvedDependencies = service.dependencies.map((dep) => {\n const implementingService =\n tokenToImpl.get(dep.typeName) ?? resolveByHeuristic(dep.typeName)\n return implementingService\n ? { ...dep, implementingService }\n : { ...dep, external: true }\n })\n }\n\n const { sorted, cycles } = topologicalSort(services, serviceByName)\n return { sorted, cycles, duplicateTokens: [...duplicateTokens] }\n}\n\nfunction topologicalSort(\n services: ServiceInfo[],\n serviceByName: Map<string, ServiceInfo>\n): { sorted: ServiceInfo[]; cycles: string[] } {\n const visited = new Set<string>()\n const visiting = new Set<string>()\n const sorted: ServiceInfo[] = []\n const cycles: string[] = []\n\n const visit = (name: string): void => {\n if (visited.has(name)) {\n return\n }\n if (visiting.has(name)) {\n cycles.push(name)\n return\n }\n const service = serviceByName.get(name)\n if (!service) {\n return\n }\n visiting.add(name)\n for (const dep of service.resolvedDependencies) {\n if (dep.implementingService && !dep.external) {\n visit(dep.implementingService)\n }\n }\n visiting.delete(name)\n visited.add(name)\n sorted.push(service)\n }\n\n for (const service of services) {\n visit(service.className)\n }\n\n return { sorted, cycles }\n}\n\n// --- Emit ------------------------------------------------------------------\n\nfunction importPathFor(outFile: string, serviceFullPath: string): string {\n let rel = relative(dirname(outFile), serviceFullPath)\n .replace(/\\\\/g, '/')\n .replace(/\\.ts$/, '')\n if (!rel.startsWith('.')) {\n rel = `./${rel}`\n }\n return rel\n}\n\nfunction groupByEnvironment(\n services: ServiceInfo[],\n environments: string[]\n): Record<string, ServiceInfo[]> {\n const groups: Record<string, ServiceInfo[]> = { all: [] }\n for (const env of environments) {\n groups[env] = []\n }\n for (const service of services) {\n groups.all.push(service)\n if (service.environment) {\n groups[service.environment]?.push(service)\n } else {\n for (const env of environments) {\n groups[env].push(service)\n }\n }\n }\n return groups\n}\n\nfunction toEntry(service: ServiceInfo, outFile: string): Record<string, unknown> {\n const entry: Record<string, unknown> = {\n className: service.className,\n importPath: importPathFor(outFile, service.fullPath),\n lifecycle: service.lifecycle,\n exported: service.exported,\n filePath: service.filePath,\n registrationOrder: service.registrationOrder,\n dependencies: service.dependencies,\n resolvedDependencies: service.resolvedDependencies\n }\n if (service.environment) {\n entry.environment = service.environment\n }\n return entry\n}\n\nfunction renderManifest(\n services: ServiceInfo[],\n config: DiademConfig,\n outFile: string\n): string {\n const byEnv = groupByEnvironment(services, config.environments)\n\n // Static imports grouped by (computed) import path.\n const importsByPath = new Map<string, Set<string>>()\n for (const service of services) {\n const path = importPathFor(outFile, service.fullPath)\n const names = importsByPath.get(path) ?? new Set<string>()\n names.add(service.className)\n if (\n service.token &&\n service.token !== service.className &&\n service.tokenExported\n ) {\n names.add(service.token)\n }\n importsByPath.set(path, names)\n }\n\n const staticImports = [...importsByPath.keys()]\n .sort()\n .map((path) => {\n const names = [...(importsByPath.get(path) ?? [])].sort()\n return names.length === 1\n ? `import { ${names[0]} } from '${path}'`\n : `import {\\n ${names.join(',\\n ')}\\n} from '${path}'`\n })\n .join('\\n')\n\n const serviceClassMapping = services\n .map((s) => ` ${s.className}`)\n .join(',\\n')\n\n const envEntries = ['all', ...config.environments]\n .map(\n (env) =>\n ` ${env}: ${JSON.stringify(byEnv[env].map((s) => toEntry(s, outFile)), null, 2)} as ServiceManifestEntry[]`\n )\n .join(',\\n')\n\n const lifecycleCounts = (\n ['dependency', 'singleton', 'factory', 'lazy', 'lazySingleton'] as const\n )\n .map((lc) => ` ${lc}: ${services.filter((s) => s.lifecycle === lc).length}`)\n .join(',\\n')\n\n const totalDependencies = services.reduce(\n (sum, s) => sum + s.dependencies.length,\n 0\n )\n const externalDependencies = services.reduce(\n (sum, s) => sum + s.resolvedDependencies.filter((d) => d.external).length,\n 0\n )\n const maxDepth = services.reduce(\n (max, s) => Math.max(max, s.dependencies.length),\n 0\n )\n\n return `/**\n * Auto-generated by \\`diadem build\\`. DO NOT EDIT MANUALLY.\n *\n * Total services: ${services.length}\n */\n\n/* eslint-disable */\n\nimport type {\n ImportedService,\n ServiceManifestEntry\n} from '${PACKAGE_NAME}'\n\n${staticImports}\n\nexport const SERVICE_MANIFEST: ServiceManifestEntry[] = ${JSON.stringify(\n services.map((s) => toEntry(s, outFile)),\n null,\n 2\n )} as ServiceManifestEntry[]\n\nexport const SERVICES_BY_ENVIRONMENT = {\n${envEntries}\n}\n\nexport const SERVICE_CLASSES = {\n${serviceClassMapping}\n} as const\n\nexport function getServicesForEnvironment(\n environment?: string\n): ServiceManifestEntry[] {\n if (!environment || environment === 'all') {\n return SERVICE_MANIFEST\n }\n return (\n SERVICES_BY_ENVIRONMENT[\n environment as keyof typeof SERVICES_BY_ENVIRONMENT\n ] ?? []\n )\n}\n\nexport async function importService(entry: ServiceManifestEntry) {\n const serviceClass =\n SERVICE_CLASSES[entry.className as keyof typeof SERVICE_CLASSES]\n if (!serviceClass) {\n throw new Error(\\`Service \\${entry.className} not found in manifest.\\`)\n }\n return serviceClass\n}\n\nexport async function importAllServices(\n entries: ServiceManifestEntry[]\n): Promise<ImportedService[]> {\n const ordered = [...entries].sort(\n (a, b) => a.registrationOrder - b.registrationOrder\n )\n const results: ImportedService[] = []\n for (const entry of ordered) {\n const serviceClass =\n SERVICE_CLASSES[entry.className as keyof typeof SERVICE_CLASSES]\n if (serviceClass) {\n results.push({ entry, serviceClass })\n }\n }\n return results\n}\n\nexport const MANIFEST_STATS = {\n totalServices: ${services.length},\n environments: [${config.environments.map((e) => `'${e}'`).join(', ')}],\n lifecycles: {\n${lifecycleCounts}\n },\n dependencyAnalysis: {\n servicesWithDependencies: ${services.filter((s) => s.dependencies.length > 0).length},\n totalDependencies: ${totalDependencies},\n externalDependencies: ${externalDependencies},\n maxDependencyDepth: ${maxDepth}\n }\n}\n`\n}\n\n// --- Emit (compiled wiring) ------------------------------------------------\n\nconst EAGER_LIFECYCLES: ReadonlySet<Lifecycle> = new Set([\n 'singleton',\n 'dependency',\n 'lazySingleton'\n])\n\nfunction localName(className: string): string {\n return `_${className}`\n}\n\nfunction externalDefault(typeName: string): string {\n switch (typeName) {\n case 'string':\n return \"''\"\n case 'number':\n return '0'\n case 'boolean':\n return 'false'\n default:\n return 'undefined'\n }\n}\n\n/**\n * Emit a straight-line `createContainer()` instead of an interpreted manifest.\n * Services are constructed in topological order with direct local-variable\n * references — no manifest array, no resolver loop, no per-dependency lookups\n * during construction. One environment is baked in (config.targetEnv) so there\n * is zero runtime branching.\n *\n * Note: in compiled mode `lazySingleton` is treated as eager (its instance is\n * needed up front to be referenced by dependents), and runtime mock/override\n * registration is not available — use the manifest emit for dev/test if you\n * need that dynamism.\n */\nfunction renderCompiled(\n allServices: ServiceInfo[],\n config: DiademConfig,\n outFile: string\n): string {\n const target = config.targetEnv\n const services = allServices.filter(\n (s) => !target || !s.environment || s.environment === target\n )\n const selected = new Set(services.map((s) => s.className))\n const eager = new Map<string, boolean>()\n for (const s of services) {\n eager.set(s.className, EAGER_LIFECYCLES.has(s.lifecycle))\n }\n\n const classNames = new Set(services.map((s) => s.className))\n\n // Group imports by computed path (impl classes + token classes).\n const importsByPath = new Map<string, Set<string>>()\n const addImport = (path: string, name: string): void => {\n const names = importsByPath.get(path) ?? new Set<string>()\n names.add(name)\n importsByPath.set(path, names)\n }\n for (const service of services) {\n addImport(importPathFor(outFile, service.fullPath), service.className)\n }\n\n // Services exposed in the type-safe accessor surface: those with a uniquely\n // named, importable token. (Duplicate or unlocatable tokens are skipped, as\n // are tokens whose name collides with a different service class.)\n const tokenCount = new Map<string, number>()\n for (const s of services) {\n if (s.token) {\n tokenCount.set(s.token, (tokenCount.get(s.token) ?? 0) + 1)\n }\n }\n const tokenPath = (m: TokenModule): string =>\n m.kind === 'file' ? importPathFor(outFile, m.fullPath) : m.specifier\n const typed = services.filter(\n (s): s is ServiceInfo & { token: string; tokenModule: TokenModule } =>\n !!s.token &&\n !!s.tokenModule &&\n tokenCount.get(s.token) === 1 &&\n (s.token === s.className || !classNames.has(s.token))\n )\n for (const s of typed) {\n addImport(tokenPath(s.tokenModule), s.token)\n }\n\n const serviceImports = [...importsByPath.keys()]\n .sort()\n .map((path) => {\n const names = [...(importsByPath.get(path) ?? [])].sort()\n return names.length === 1\n ? `import { ${names[0]} } from '${path}'`\n : `import {\\n ${names.join(',\\n ')}\\n} from '${path}'`\n })\n .join('\\n')\n\n const argExpr = (service: ServiceInfo): string => {\n const arity = service.dependencies.reduce(\n (max, d) => Math.max(max, d.paramIndex + 1),\n 0\n )\n const args: string[] = Array.from({ length: arity }, () => 'undefined')\n for (const dep of service.resolvedDependencies) {\n if (dep.external) {\n args[dep.paramIndex] = dep.isOptional\n ? 'undefined'\n : externalDefault(dep.typeName)\n continue\n }\n const impl = dep.implementingService\n if (impl && selected.has(impl)) {\n args[dep.paramIndex] = eager.get(impl)\n ? localName(impl)\n : `c.resolve(token(${impl}))`\n } else {\n args[dep.paramIndex] = 'undefined'\n }\n }\n return args.join(', ')\n }\n\n const lines: string[] = []\n for (const service of services) {\n const cls = service.className\n if (eager.get(cls)) {\n lines.push(` const ${localName(cls)} = new ${cls}(${argExpr(service)})`)\n lines.push(` c.register(token(${cls}), ${localName(cls)})`)\n } else {\n lines.push(\n ` c.registerFactory(token(${cls}), () => new ${cls}(${argExpr(service)}))`\n )\n }\n }\n\n const targetComment = target\n ? `environment: ${target}`\n : 'environment: all'\n\n const accessorBlock =\n typed.length === 0\n ? ''\n : `\n/**\n * Type-safe accessor surface. Only registered tokens are present, each typed to\n * its token — resolving an unregistered token is a compile error.\n */\nexport interface DiademServices {\n${typed.map((s) => ` ${s.token}: ${s.token}`).join('\\n')}\n}\n\nexport function createServices(): DiademServices & {\n readonly container: DiademContainer\n dispose: () => Promise<void>\n} {\n const container = createContainer()\n return {\n container,\n dispose: () => container.dispose(),\n${typed\n .map(\n (s) =>\n ` get ${s.token}(): ${s.token} {\\n return container.resolve(${s.token})\\n }`\n )\n .join(',\\n')}\n }\n}\n`\n\n return `/**\n * Auto-generated by \\`diadem build --emit=compiled\\`. DO NOT EDIT MANUALLY.\n *\n * Straight-line wiring (${targetComment}). Total services: ${services.length}.\n */\n\n/* eslint-disable */\n\nimport { DiademContainer, getDIMetadata } from '${PACKAGE_NAME}'\n\n${serviceImports}\n\nfunction token(cls: any): any {\n const meta = getDIMetadata(cls)\n if (!meta) {\n throw new Error('diadem: missing DI metadata for ' + cls.name)\n }\n return meta.token\n}\n\n/** Build a fully-wired, ready container. */\nexport function createContainer(): DiademContainer {\n const c = new DiademContainer()\n${lines.join('\\n')}\n c.setReady()\n return c\n}\n${accessorBlock}`\n}\n","#!/usr/bin/env node\n/**\n * `diadem` CLI — build-time manifest generation.\n *\n * Usage:\n * diadem build [options]\n *\n * Options:\n * --scan-dir <dir> Directory to scan (repeatable). Default: src\n * --out <file> Output manifest path. Default: src/generated/service-manifest.ts\n * --include <regex> Filename include pattern (repeatable). Default: \\.ts$\n * --exclude <regex> Filename exclude pattern (repeatable).\n * --env <name> Environment to group by (repeatable). Default: development, production, test\n * --cwd <dir> Project root. Default: current directory\n * --fail-on-cycle Exit non-zero if a dependency cycle is detected\n * -h, --help Show this help\n *\n * Config file: a `diadem.config.json` in the project root is merged under CLI flags.\n */\n\nimport { loadConfig, type DiademConfigInput } from './config'\nimport { generateManifest } from './generator'\n\ninterface ParsedArgs {\n command: string\n cwd: string\n failOnCycle: boolean\n strict: boolean\n help: boolean\n overrides: DiademConfigInput\n}\n\nfunction parseArgs(argv: string[]): ParsedArgs {\n const parsed: ParsedArgs = {\n command: 'build',\n cwd: process.cwd(),\n failOnCycle: false,\n strict: false,\n help: false,\n overrides: {}\n }\n const scanDirs: string[] = []\n const include: string[] = []\n const exclude: string[] = []\n const environments: string[] = []\n\n let i = 0\n if (argv[i] && !argv[i].startsWith('-')) {\n parsed.command = argv[i]\n i++\n }\n\n for (; i < argv.length; i++) {\n const arg = argv[i]\n const next = (): string => {\n const value = argv[++i]\n if (value === undefined) {\n throw new Error(`Missing value for ${arg}`)\n }\n return value\n }\n switch (arg) {\n case '--scan-dir':\n scanDirs.push(next())\n break\n case '--out':\n parsed.overrides.outFile = next()\n break\n case '--include':\n include.push(next())\n break\n case '--exclude':\n exclude.push(next())\n break\n case '--env':\n environments.push(next())\n break\n case '--cwd':\n parsed.cwd = next()\n break\n case '--emit': {\n const mode = next()\n if (mode !== 'manifest' && mode !== 'compiled') {\n throw new Error(`Invalid --emit value: ${mode} (expected manifest|compiled)`)\n }\n parsed.overrides.emit = mode\n break\n }\n case '--target-env':\n parsed.overrides.targetEnv = next()\n break\n case '--fail-on-cycle':\n parsed.failOnCycle = true\n break\n case '--strict':\n parsed.strict = true\n break\n case '-h':\n case '--help':\n parsed.help = true\n break\n default:\n throw new Error(`Unknown option: ${arg}`)\n }\n }\n\n if (scanDirs.length) parsed.overrides.scanDirs = scanDirs\n if (include.length) parsed.overrides.include = include\n if (exclude.length) parsed.overrides.exclude = exclude\n if (environments.length) parsed.overrides.environments = environments\n\n return parsed\n}\n\nconst HELP = `diadem — build-time DI manifest generator\n\nUsage:\n diadem build [options]\n\nOptions:\n --scan-dir <dir> Directory to scan (repeatable). Default: src\n --out <file> Output manifest path. Default: src/generated/service-manifest.ts\n --include <regex> Filename include pattern (repeatable). Default: \\\\.ts$\n --exclude <regex> Filename exclude pattern (repeatable).\n --env <name> Environment to group by (repeatable). Default: development, production, test\n --emit <mode> Output mode: manifest (default) or compiled (straight-line wiring)\n --target-env <name> For --emit=compiled, bake in a single environment\n --cwd <dir> Project root. Default: current directory\n --fail-on-cycle Exit non-zero if a dependency cycle is detected\n --strict Exit non-zero on cycles, ambiguous tokens, or required\n dependencies with no implementing service\n -h, --help Show this help\n\nA diadem.config.json in the project root is merged under CLI flags.\n`\n\nfunction main(): void {\n const args = parseArgs(process.argv.slice(2))\n\n if (args.help) {\n process.stdout.write(HELP)\n return\n }\n\n if (args.command !== 'build') {\n process.stderr.write(`Unknown command: ${args.command}\\n\\n${HELP}`)\n process.exit(1)\n }\n\n const config = loadConfig(args.cwd, args.overrides)\n const result = generateManifest(config)\n\n process.stdout.write(\n `diadem: wrote ${result.serviceCount} services to ${result.outFile}\\n`\n )\n if (result.externalDependencies > 0) {\n process.stdout.write(\n `diadem: ${result.externalDependencies} external dependencies (not container-managed)\\n`\n )\n }\n\n // Always surface ambiguity/cycles as warnings.\n for (const token of result.duplicateTokens) {\n process.stderr.write(\n `diadem: warning — token ${token} is declared by more than one service (ambiguous)\\n`\n )\n }\n if (result.cycles.length > 0) {\n process.stderr.write(\n `diadem: warning — dependency cycle(s) detected: ${result.cycles.join(', ')}\\n`\n )\n }\n\n // Decide whether to fail the build.\n const cycleViolation = result.cycles.length > 0 && (args.strict || args.failOnCycle)\n const strictViolation =\n args.strict &&\n (result.unresolved.length > 0 || result.duplicateTokens.length > 0)\n\n if (args.strict) {\n for (const dep of result.unresolved) {\n process.stderr.write(\n `diadem: error — ${dep.service} requires ${dep.typeName} (${dep.paramName}), but no service implements it\\n`\n )\n }\n }\n\n if (cycleViolation || strictViolation) {\n process.exit(1)\n }\n}\n\ntry {\n main()\n} catch (error) {\n process.stderr.write(\n `diadem: ${error instanceof Error ? error.message : String(error)}\\n`\n )\n process.exit(1)\n}\n"]}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
type AbstractConstructor<T = unknown> = abstract new (...args: any[]) => T;
|
|
2
|
+
type ConcreteConstructor<T = unknown> = new (...args: any[]) => T;
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Automatic service discovery from a configured build-time manifest.
|
|
6
|
+
*
|
|
7
|
+
* Discovery is cheap: the manifest is an in-memory module registered via
|
|
8
|
+
* `configureManifest`, so this just reads its entries for the requested
|
|
9
|
+
* environment, resolves the corresponding classes, and keeps those carrying DI
|
|
10
|
+
* metadata. Results are cached per environment.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/** Configuration for auto-discovery. */
|
|
14
|
+
interface AutoDiscoveryConfig {
|
|
15
|
+
/** Environment filter; omit (or 'all') to discover every service. */
|
|
16
|
+
environment?: string;
|
|
17
|
+
/** Whether to use the per-environment discovery cache. Defaults to true. */
|
|
18
|
+
useCache?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/** Result of a discovery pass. */
|
|
21
|
+
interface ServiceDiscoveryResult {
|
|
22
|
+
services: ConcreteConstructor[];
|
|
23
|
+
/** Number of manifest entries considered for the environment. */
|
|
24
|
+
totalFound: number;
|
|
25
|
+
/** Number of discovered services carrying DI metadata. */
|
|
26
|
+
totalDecorated: number;
|
|
27
|
+
fromCache: boolean;
|
|
28
|
+
manifestAvailable: boolean;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
type Constructor<T> = abstract new (...args: any[]) => T;
|
|
32
|
+
type Token<T> = Constructor<T>;
|
|
33
|
+
type LifecycleType = 'singleton' | 'factory' | 'lazy' | 'lazySingleton';
|
|
34
|
+
/**
|
|
35
|
+
* A resource that can be released when its owning container is disposed.
|
|
36
|
+
* Singletons and directly-registered values implementing this are torn down
|
|
37
|
+
* automatically by {@link DiademContainer.dispose}.
|
|
38
|
+
*/
|
|
39
|
+
interface Disposable {
|
|
40
|
+
dispose: () => void | Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* DIContainer interface for dependency injection.
|
|
44
|
+
*
|
|
45
|
+
* - Use `register` for direct value/class registration.
|
|
46
|
+
* - Use `registerSingleton` for singletons (one instance per container).
|
|
47
|
+
* - Use `registerFactory` for transient factories (new instance per resolve).
|
|
48
|
+
* - Use `resolve` to retrieve a dependency by token.
|
|
49
|
+
* - Use `isReady` to check if the container is fully set up.
|
|
50
|
+
* - Use `autoRegisterDiscovered` for automatic service discovery and registration.
|
|
51
|
+
*/
|
|
52
|
+
interface DIContainer {
|
|
53
|
+
register: <T>(token: Token<T>, implementation: T) => void;
|
|
54
|
+
resolve: <T>(token: Token<T>) => T;
|
|
55
|
+
resolveAsync: <T>(token: Token<T>) => Promise<T>;
|
|
56
|
+
registerSingleton: <T>(token: Token<T>, factory: () => T) => void;
|
|
57
|
+
registerFactory: <T>(token: Token<T>, factory: () => T) => void;
|
|
58
|
+
registerAsyncFactory: <T>(token: Token<T>, factory: () => Promise<T>) => void;
|
|
59
|
+
registerAsyncSingleton: <T>(token: Token<T>, factory: () => Promise<T>) => void;
|
|
60
|
+
autoDiscover: (config?: AutoDiscoveryConfig) => Promise<ServiceDiscoveryResult>;
|
|
61
|
+
autoRegisterDiscovered: (environment?: string) => Promise<void>;
|
|
62
|
+
isReady: () => boolean;
|
|
63
|
+
getDiagnostics: () => {
|
|
64
|
+
dependencies: number;
|
|
65
|
+
singletons: number;
|
|
66
|
+
factories: number;
|
|
67
|
+
asyncFactories: number;
|
|
68
|
+
isReady: boolean;
|
|
69
|
+
};
|
|
70
|
+
has: <T>(token: Token<T>) => boolean;
|
|
71
|
+
getRegisteredTokens: () => Array<Token<unknown>>;
|
|
72
|
+
onDispose: (callback: () => void | Promise<void>) => void;
|
|
73
|
+
dispose: () => Promise<void>;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* DiademContainer is a dependency injection container.
|
|
77
|
+
*
|
|
78
|
+
* Typically you create **one application-scoped container** and keep it for the
|
|
79
|
+
* lifetime of the process. The library holds no hidden global container — you
|
|
80
|
+
* own the instance — which is what makes it safe in concurrent/SSR environments
|
|
81
|
+
* where a module-level global container would leak state between requests.
|
|
82
|
+
*
|
|
83
|
+
* When you need isolation between concurrent units of work (e.g. per HTTP
|
|
84
|
+
* request, or per test), create a child scope with {@link createChild} that
|
|
85
|
+
* inherits the parent's registrations and can override them locally.
|
|
86
|
+
*
|
|
87
|
+
* - Supports direct registration, singletons, and per-resolve factories.
|
|
88
|
+
* - Supports decorator-driven auto-registration from a build-time manifest,
|
|
89
|
+
* with optional environment filtering.
|
|
90
|
+
* - Stores registration metadata on classes rather than in global state.
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* const container = new DiademContainer()
|
|
94
|
+
* container.register(IRepository, new Repository())
|
|
95
|
+
* container.registerSingleton(IService, () => new Service(container.resolve(IRepository)))
|
|
96
|
+
* container.registerFactory(IApiClient, () => createApiClient())
|
|
97
|
+
*
|
|
98
|
+
* // Or autowire from a configured build-time manifest:
|
|
99
|
+
* await container.autoRegisterDiscovered('production')
|
|
100
|
+
*
|
|
101
|
+
* const repo = container.resolve(IRepository)
|
|
102
|
+
*
|
|
103
|
+
* // Per-request isolation when you need it:
|
|
104
|
+
* const scoped = container.createChild()
|
|
105
|
+
*/
|
|
106
|
+
declare class DiademContainer implements DIContainer {
|
|
107
|
+
private readonly dependencies;
|
|
108
|
+
readonly singletons: Map<Constructor<unknown>, unknown>;
|
|
109
|
+
readonly factories: Map<Constructor<unknown>, () => unknown>;
|
|
110
|
+
readonly asyncFactories: Map<Constructor<unknown>, () => Promise<unknown>>;
|
|
111
|
+
private readonly disposers;
|
|
112
|
+
private ready;
|
|
113
|
+
private disposed;
|
|
114
|
+
/**
|
|
115
|
+
* Register a dependency by value or class instance.
|
|
116
|
+
* @param token Dependency token
|
|
117
|
+
* @param implementation The value or instance to register
|
|
118
|
+
*/
|
|
119
|
+
register<T>(token: Constructor<T>, implementation: T): void;
|
|
120
|
+
/**
|
|
121
|
+
* Register a factory that returns a new instance on every resolve.
|
|
122
|
+
* Use for transient dependencies.
|
|
123
|
+
* @param token Dependency token
|
|
124
|
+
* @param factory Factory function
|
|
125
|
+
*/
|
|
126
|
+
registerFactory<T>(token: Constructor<T>, factory: () => T): void;
|
|
127
|
+
/**
|
|
128
|
+
* Register a singleton (one instance per container).
|
|
129
|
+
*
|
|
130
|
+
* **Order matters:** the factory runs immediately, at registration time, so
|
|
131
|
+
* anything it resolves must already be registered. Register dependencies
|
|
132
|
+
* before their dependents — the build-time manifest is emitted in exactly this
|
|
133
|
+
* (topological) order. To defer construction until first resolve instead, use
|
|
134
|
+
* a `lazySingleton` lifecycle via the decorator/manifest.
|
|
135
|
+
*
|
|
136
|
+
* @param token Dependency token
|
|
137
|
+
* @param factory Factory function, called once, immediately
|
|
138
|
+
*/
|
|
139
|
+
registerSingleton<T>(token: Constructor<T>, factory: () => T): void;
|
|
140
|
+
/**
|
|
141
|
+
* Register a factory that awaits its result on every {@link resolveAsync}.
|
|
142
|
+
* Use for transient dependencies that require asynchronous construction.
|
|
143
|
+
* @param token Dependency token
|
|
144
|
+
* @param factory Async factory function
|
|
145
|
+
*/
|
|
146
|
+
registerAsyncFactory<T>(token: Constructor<T>, factory: () => Promise<T>): void;
|
|
147
|
+
/**
|
|
148
|
+
* Register an async singleton: the factory runs at most once (on the first
|
|
149
|
+
* {@link resolveAsync}) and the awaited instance is cached. If the instance
|
|
150
|
+
* is {@link Disposable} it is torn down on {@link dispose}.
|
|
151
|
+
* @param token Dependency token
|
|
152
|
+
* @param factory Async factory function, called at most once
|
|
153
|
+
*/
|
|
154
|
+
registerAsyncSingleton<T>(token: Constructor<T>, factory: () => Promise<T>): void;
|
|
155
|
+
/** Record a value's disposer if it implements {@link Disposable}. */
|
|
156
|
+
private trackDisposable;
|
|
157
|
+
/**
|
|
158
|
+
* Resolve a dependency by token.
|
|
159
|
+
* @param token Dependency token
|
|
160
|
+
* @returns The resolved dependency
|
|
161
|
+
* @throws If the dependency is not found
|
|
162
|
+
*/
|
|
163
|
+
resolve<T>(token: Constructor<T>): T;
|
|
164
|
+
/**
|
|
165
|
+
* Resolve a dependency that may have been registered asynchronously.
|
|
166
|
+
* Synchronous registrations resolve immediately; async factories/singletons
|
|
167
|
+
* are awaited.
|
|
168
|
+
* @param token Dependency token
|
|
169
|
+
* @returns A promise of the resolved dependency
|
|
170
|
+
* @throws If the dependency is not found
|
|
171
|
+
*/
|
|
172
|
+
resolveAsync<T>(token: Constructor<T>): Promise<T>;
|
|
173
|
+
/**
|
|
174
|
+
* Returns true if the container is fully set up.
|
|
175
|
+
*/
|
|
176
|
+
isReady(): boolean;
|
|
177
|
+
/**
|
|
178
|
+
* Mark the container as ready (all dependencies registered).
|
|
179
|
+
*/
|
|
180
|
+
setReady(): void;
|
|
181
|
+
/**
|
|
182
|
+
* Clear all registrations (useful for testing or container reset).
|
|
183
|
+
*/
|
|
184
|
+
clear(): void;
|
|
185
|
+
/**
|
|
186
|
+
* Register an arbitrary teardown callback, run on {@link dispose} in reverse
|
|
187
|
+
* order of registration.
|
|
188
|
+
*/
|
|
189
|
+
onDispose(callback: () => void | Promise<void>): void;
|
|
190
|
+
/**
|
|
191
|
+
* Dispose the container: run all teardown callbacks (and the `dispose()` of
|
|
192
|
+
* any registered {@link Disposable} singletons/values) in reverse order, then
|
|
193
|
+
* clear all registrations. Idempotent.
|
|
194
|
+
*
|
|
195
|
+
* Note: transient (`factory`) and lazy instances are owned by the caller, not
|
|
196
|
+
* the container, so they are not disposed here.
|
|
197
|
+
*/
|
|
198
|
+
dispose(): Promise<void>;
|
|
199
|
+
/** Whether {@link dispose} has been called. */
|
|
200
|
+
isDisposed(): boolean;
|
|
201
|
+
/**
|
|
202
|
+
* Get diagnostic information about registered dependencies.
|
|
203
|
+
*/
|
|
204
|
+
getDiagnostics(): {
|
|
205
|
+
dependencies: number;
|
|
206
|
+
singletons: number;
|
|
207
|
+
factories: number;
|
|
208
|
+
asyncFactories: number;
|
|
209
|
+
isReady: boolean;
|
|
210
|
+
};
|
|
211
|
+
/**
|
|
212
|
+
* Check if a token is registered in the container
|
|
213
|
+
*/
|
|
214
|
+
has<T>(token: Constructor<T>): boolean;
|
|
215
|
+
/**
|
|
216
|
+
* Get all registered tokens
|
|
217
|
+
*/
|
|
218
|
+
getRegisteredTokens(): Array<Constructor<unknown>>;
|
|
219
|
+
/**
|
|
220
|
+
* Create a child container that inherits this container's registrations and
|
|
221
|
+
* can override them locally. Useful for per-request or per-test scopes.
|
|
222
|
+
*
|
|
223
|
+
* The child shares the parent's already-created singleton instances by
|
|
224
|
+
* reference; it deliberately does NOT inherit the parent's disposers, so
|
|
225
|
+
* disposing the child never tears down shared parent-owned resources. Only
|
|
226
|
+
* resources the child registers itself are disposed with it.
|
|
227
|
+
*/
|
|
228
|
+
createChild(): DiademContainer;
|
|
229
|
+
/**
|
|
230
|
+
* Auto-discover and get information about available services.
|
|
231
|
+
* Does not register them - use autoRegisterDiscovered() for that.
|
|
232
|
+
*/
|
|
233
|
+
autoDiscover(config?: AutoDiscoveryConfig): Promise<ServiceDiscoveryResult>;
|
|
234
|
+
/**
|
|
235
|
+
* Auto-discover and register all DI-decorated services using build-time manifest.
|
|
236
|
+
* This is true autowiring that doesn't require hardcoded paths or explicit imports.
|
|
237
|
+
*
|
|
238
|
+
* @param environment Optional environment filter
|
|
239
|
+
* @example
|
|
240
|
+
* ```typescript
|
|
241
|
+
* const container = new DiademContainer()
|
|
242
|
+
* await container.autoRegisterDiscovered('production')
|
|
243
|
+
* container.setReady()
|
|
244
|
+
* ```
|
|
245
|
+
*/
|
|
246
|
+
autoRegisterDiscovered(environment?: string): Promise<void>;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
export { type AbstractConstructor as A, type ConcreteConstructor as C, DiademContainer as D, type LifecycleType as L, type Token as T, type Constructor as a, type DIContainer as b, type Disposable as c };
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
type AbstractConstructor<T = unknown> = abstract new (...args: any[]) => T;
|
|
2
|
+
type ConcreteConstructor<T = unknown> = new (...args: any[]) => T;
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Automatic service discovery from a configured build-time manifest.
|
|
6
|
+
*
|
|
7
|
+
* Discovery is cheap: the manifest is an in-memory module registered via
|
|
8
|
+
* `configureManifest`, so this just reads its entries for the requested
|
|
9
|
+
* environment, resolves the corresponding classes, and keeps those carrying DI
|
|
10
|
+
* metadata. Results are cached per environment.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/** Configuration for auto-discovery. */
|
|
14
|
+
interface AutoDiscoveryConfig {
|
|
15
|
+
/** Environment filter; omit (or 'all') to discover every service. */
|
|
16
|
+
environment?: string;
|
|
17
|
+
/** Whether to use the per-environment discovery cache. Defaults to true. */
|
|
18
|
+
useCache?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/** Result of a discovery pass. */
|
|
21
|
+
interface ServiceDiscoveryResult {
|
|
22
|
+
services: ConcreteConstructor[];
|
|
23
|
+
/** Number of manifest entries considered for the environment. */
|
|
24
|
+
totalFound: number;
|
|
25
|
+
/** Number of discovered services carrying DI metadata. */
|
|
26
|
+
totalDecorated: number;
|
|
27
|
+
fromCache: boolean;
|
|
28
|
+
manifestAvailable: boolean;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
type Constructor<T> = abstract new (...args: any[]) => T;
|
|
32
|
+
type Token<T> = Constructor<T>;
|
|
33
|
+
type LifecycleType = 'singleton' | 'factory' | 'lazy' | 'lazySingleton';
|
|
34
|
+
/**
|
|
35
|
+
* A resource that can be released when its owning container is disposed.
|
|
36
|
+
* Singletons and directly-registered values implementing this are torn down
|
|
37
|
+
* automatically by {@link DiademContainer.dispose}.
|
|
38
|
+
*/
|
|
39
|
+
interface Disposable {
|
|
40
|
+
dispose: () => void | Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* DIContainer interface for dependency injection.
|
|
44
|
+
*
|
|
45
|
+
* - Use `register` for direct value/class registration.
|
|
46
|
+
* - Use `registerSingleton` for singletons (one instance per container).
|
|
47
|
+
* - Use `registerFactory` for transient factories (new instance per resolve).
|
|
48
|
+
* - Use `resolve` to retrieve a dependency by token.
|
|
49
|
+
* - Use `isReady` to check if the container is fully set up.
|
|
50
|
+
* - Use `autoRegisterDiscovered` for automatic service discovery and registration.
|
|
51
|
+
*/
|
|
52
|
+
interface DIContainer {
|
|
53
|
+
register: <T>(token: Token<T>, implementation: T) => void;
|
|
54
|
+
resolve: <T>(token: Token<T>) => T;
|
|
55
|
+
resolveAsync: <T>(token: Token<T>) => Promise<T>;
|
|
56
|
+
registerSingleton: <T>(token: Token<T>, factory: () => T) => void;
|
|
57
|
+
registerFactory: <T>(token: Token<T>, factory: () => T) => void;
|
|
58
|
+
registerAsyncFactory: <T>(token: Token<T>, factory: () => Promise<T>) => void;
|
|
59
|
+
registerAsyncSingleton: <T>(token: Token<T>, factory: () => Promise<T>) => void;
|
|
60
|
+
autoDiscover: (config?: AutoDiscoveryConfig) => Promise<ServiceDiscoveryResult>;
|
|
61
|
+
autoRegisterDiscovered: (environment?: string) => Promise<void>;
|
|
62
|
+
isReady: () => boolean;
|
|
63
|
+
getDiagnostics: () => {
|
|
64
|
+
dependencies: number;
|
|
65
|
+
singletons: number;
|
|
66
|
+
factories: number;
|
|
67
|
+
asyncFactories: number;
|
|
68
|
+
isReady: boolean;
|
|
69
|
+
};
|
|
70
|
+
has: <T>(token: Token<T>) => boolean;
|
|
71
|
+
getRegisteredTokens: () => Array<Token<unknown>>;
|
|
72
|
+
onDispose: (callback: () => void | Promise<void>) => void;
|
|
73
|
+
dispose: () => Promise<void>;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* DiademContainer is a dependency injection container.
|
|
77
|
+
*
|
|
78
|
+
* Typically you create **one application-scoped container** and keep it for the
|
|
79
|
+
* lifetime of the process. The library holds no hidden global container — you
|
|
80
|
+
* own the instance — which is what makes it safe in concurrent/SSR environments
|
|
81
|
+
* where a module-level global container would leak state between requests.
|
|
82
|
+
*
|
|
83
|
+
* When you need isolation between concurrent units of work (e.g. per HTTP
|
|
84
|
+
* request, or per test), create a child scope with {@link createChild} that
|
|
85
|
+
* inherits the parent's registrations and can override them locally.
|
|
86
|
+
*
|
|
87
|
+
* - Supports direct registration, singletons, and per-resolve factories.
|
|
88
|
+
* - Supports decorator-driven auto-registration from a build-time manifest,
|
|
89
|
+
* with optional environment filtering.
|
|
90
|
+
* - Stores registration metadata on classes rather than in global state.
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* const container = new DiademContainer()
|
|
94
|
+
* container.register(IRepository, new Repository())
|
|
95
|
+
* container.registerSingleton(IService, () => new Service(container.resolve(IRepository)))
|
|
96
|
+
* container.registerFactory(IApiClient, () => createApiClient())
|
|
97
|
+
*
|
|
98
|
+
* // Or autowire from a configured build-time manifest:
|
|
99
|
+
* await container.autoRegisterDiscovered('production')
|
|
100
|
+
*
|
|
101
|
+
* const repo = container.resolve(IRepository)
|
|
102
|
+
*
|
|
103
|
+
* // Per-request isolation when you need it:
|
|
104
|
+
* const scoped = container.createChild()
|
|
105
|
+
*/
|
|
106
|
+
declare class DiademContainer implements DIContainer {
|
|
107
|
+
private readonly dependencies;
|
|
108
|
+
readonly singletons: Map<Constructor<unknown>, unknown>;
|
|
109
|
+
readonly factories: Map<Constructor<unknown>, () => unknown>;
|
|
110
|
+
readonly asyncFactories: Map<Constructor<unknown>, () => Promise<unknown>>;
|
|
111
|
+
private readonly disposers;
|
|
112
|
+
private ready;
|
|
113
|
+
private disposed;
|
|
114
|
+
/**
|
|
115
|
+
* Register a dependency by value or class instance.
|
|
116
|
+
* @param token Dependency token
|
|
117
|
+
* @param implementation The value or instance to register
|
|
118
|
+
*/
|
|
119
|
+
register<T>(token: Constructor<T>, implementation: T): void;
|
|
120
|
+
/**
|
|
121
|
+
* Register a factory that returns a new instance on every resolve.
|
|
122
|
+
* Use for transient dependencies.
|
|
123
|
+
* @param token Dependency token
|
|
124
|
+
* @param factory Factory function
|
|
125
|
+
*/
|
|
126
|
+
registerFactory<T>(token: Constructor<T>, factory: () => T): void;
|
|
127
|
+
/**
|
|
128
|
+
* Register a singleton (one instance per container).
|
|
129
|
+
*
|
|
130
|
+
* **Order matters:** the factory runs immediately, at registration time, so
|
|
131
|
+
* anything it resolves must already be registered. Register dependencies
|
|
132
|
+
* before their dependents — the build-time manifest is emitted in exactly this
|
|
133
|
+
* (topological) order. To defer construction until first resolve instead, use
|
|
134
|
+
* a `lazySingleton` lifecycle via the decorator/manifest.
|
|
135
|
+
*
|
|
136
|
+
* @param token Dependency token
|
|
137
|
+
* @param factory Factory function, called once, immediately
|
|
138
|
+
*/
|
|
139
|
+
registerSingleton<T>(token: Constructor<T>, factory: () => T): void;
|
|
140
|
+
/**
|
|
141
|
+
* Register a factory that awaits its result on every {@link resolveAsync}.
|
|
142
|
+
* Use for transient dependencies that require asynchronous construction.
|
|
143
|
+
* @param token Dependency token
|
|
144
|
+
* @param factory Async factory function
|
|
145
|
+
*/
|
|
146
|
+
registerAsyncFactory<T>(token: Constructor<T>, factory: () => Promise<T>): void;
|
|
147
|
+
/**
|
|
148
|
+
* Register an async singleton: the factory runs at most once (on the first
|
|
149
|
+
* {@link resolveAsync}) and the awaited instance is cached. If the instance
|
|
150
|
+
* is {@link Disposable} it is torn down on {@link dispose}.
|
|
151
|
+
* @param token Dependency token
|
|
152
|
+
* @param factory Async factory function, called at most once
|
|
153
|
+
*/
|
|
154
|
+
registerAsyncSingleton<T>(token: Constructor<T>, factory: () => Promise<T>): void;
|
|
155
|
+
/** Record a value's disposer if it implements {@link Disposable}. */
|
|
156
|
+
private trackDisposable;
|
|
157
|
+
/**
|
|
158
|
+
* Resolve a dependency by token.
|
|
159
|
+
* @param token Dependency token
|
|
160
|
+
* @returns The resolved dependency
|
|
161
|
+
* @throws If the dependency is not found
|
|
162
|
+
*/
|
|
163
|
+
resolve<T>(token: Constructor<T>): T;
|
|
164
|
+
/**
|
|
165
|
+
* Resolve a dependency that may have been registered asynchronously.
|
|
166
|
+
* Synchronous registrations resolve immediately; async factories/singletons
|
|
167
|
+
* are awaited.
|
|
168
|
+
* @param token Dependency token
|
|
169
|
+
* @returns A promise of the resolved dependency
|
|
170
|
+
* @throws If the dependency is not found
|
|
171
|
+
*/
|
|
172
|
+
resolveAsync<T>(token: Constructor<T>): Promise<T>;
|
|
173
|
+
/**
|
|
174
|
+
* Returns true if the container is fully set up.
|
|
175
|
+
*/
|
|
176
|
+
isReady(): boolean;
|
|
177
|
+
/**
|
|
178
|
+
* Mark the container as ready (all dependencies registered).
|
|
179
|
+
*/
|
|
180
|
+
setReady(): void;
|
|
181
|
+
/**
|
|
182
|
+
* Clear all registrations (useful for testing or container reset).
|
|
183
|
+
*/
|
|
184
|
+
clear(): void;
|
|
185
|
+
/**
|
|
186
|
+
* Register an arbitrary teardown callback, run on {@link dispose} in reverse
|
|
187
|
+
* order of registration.
|
|
188
|
+
*/
|
|
189
|
+
onDispose(callback: () => void | Promise<void>): void;
|
|
190
|
+
/**
|
|
191
|
+
* Dispose the container: run all teardown callbacks (and the `dispose()` of
|
|
192
|
+
* any registered {@link Disposable} singletons/values) in reverse order, then
|
|
193
|
+
* clear all registrations. Idempotent.
|
|
194
|
+
*
|
|
195
|
+
* Note: transient (`factory`) and lazy instances are owned by the caller, not
|
|
196
|
+
* the container, so they are not disposed here.
|
|
197
|
+
*/
|
|
198
|
+
dispose(): Promise<void>;
|
|
199
|
+
/** Whether {@link dispose} has been called. */
|
|
200
|
+
isDisposed(): boolean;
|
|
201
|
+
/**
|
|
202
|
+
* Get diagnostic information about registered dependencies.
|
|
203
|
+
*/
|
|
204
|
+
getDiagnostics(): {
|
|
205
|
+
dependencies: number;
|
|
206
|
+
singletons: number;
|
|
207
|
+
factories: number;
|
|
208
|
+
asyncFactories: number;
|
|
209
|
+
isReady: boolean;
|
|
210
|
+
};
|
|
211
|
+
/**
|
|
212
|
+
* Check if a token is registered in the container
|
|
213
|
+
*/
|
|
214
|
+
has<T>(token: Constructor<T>): boolean;
|
|
215
|
+
/**
|
|
216
|
+
* Get all registered tokens
|
|
217
|
+
*/
|
|
218
|
+
getRegisteredTokens(): Array<Constructor<unknown>>;
|
|
219
|
+
/**
|
|
220
|
+
* Create a child container that inherits this container's registrations and
|
|
221
|
+
* can override them locally. Useful for per-request or per-test scopes.
|
|
222
|
+
*
|
|
223
|
+
* The child shares the parent's already-created singleton instances by
|
|
224
|
+
* reference; it deliberately does NOT inherit the parent's disposers, so
|
|
225
|
+
* disposing the child never tears down shared parent-owned resources. Only
|
|
226
|
+
* resources the child registers itself are disposed with it.
|
|
227
|
+
*/
|
|
228
|
+
createChild(): DiademContainer;
|
|
229
|
+
/**
|
|
230
|
+
* Auto-discover and get information about available services.
|
|
231
|
+
* Does not register them - use autoRegisterDiscovered() for that.
|
|
232
|
+
*/
|
|
233
|
+
autoDiscover(config?: AutoDiscoveryConfig): Promise<ServiceDiscoveryResult>;
|
|
234
|
+
/**
|
|
235
|
+
* Auto-discover and register all DI-decorated services using build-time manifest.
|
|
236
|
+
* This is true autowiring that doesn't require hardcoded paths or explicit imports.
|
|
237
|
+
*
|
|
238
|
+
* @param environment Optional environment filter
|
|
239
|
+
* @example
|
|
240
|
+
* ```typescript
|
|
241
|
+
* const container = new DiademContainer()
|
|
242
|
+
* await container.autoRegisterDiscovered('production')
|
|
243
|
+
* container.setReady()
|
|
244
|
+
* ```
|
|
245
|
+
*/
|
|
246
|
+
autoRegisterDiscovered(environment?: string): Promise<void>;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
export { type AbstractConstructor as A, type ConcreteConstructor as C, DiademContainer as D, type LifecycleType as L, type Token as T, type Constructor as a, type DIContainer as b, type Disposable as c };
|