@andrew_l/ioc 0.2.21 → 0.3.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/ServiceContainer.ts","../src/ioc.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport { globSync } from 'node:fs';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { type AnyFunction, captureStackTrace, logger } from '@andrew_l/toolkit';\n\nexport type Factory = any;\n\nexport type Service = {\n factory?: Factory;\n constructorName?: string;\n constructorPath?: string;\n instance: any;\n};\n\nexport interface SetupOptions {\n pathRoot?: string;\n\n /**\n * Absolute or relative path where generated type file will be saved\n */\n typeOutput?: string;\n\n /**\n * Absolute or relative glob patterns to auto-import service files\n */\n autoImportPatterns?: string[];\n\n /**\n * Should generate type file\n */\n generateTypes?: boolean;\n}\n\nconst storage = new Map<string, Service>();\n\nconst log = logger('IOC');\n\nexport default {\n get<T>(id: string): T {\n const service = storage.get(id);\n\n if (!service) {\n throw new Error(`No service is registered for [${id}]`);\n }\n\n if (!service.instance) {\n service.instance = service.factory?.();\n service.factory = undefined;\n }\n\n return service.instance;\n },\n\n set(\n id: string,\n factoryOrClassReference: Factory | AnyFunction,\n buildInstantly: boolean = false,\n ) {\n if (this.isSet(id)) {\n throw new Error(`Service [${id}] is already registered`);\n }\n\n let constructorPath: string | undefined;\n\n try {\n constructorPath = extractFilePathFromStack(captureStackTrace(this.set));\n } catch (_) {}\n\n this.override(id, factoryOrClassReference, buildInstantly, constructorPath);\n },\n\n override(\n id: string,\n factoryOrClassReference: Factory | AnyFunction,\n buildInstantly: boolean = false,\n constructorPath?: string,\n ) {\n const factory: Factory = getFactory(factoryOrClassReference);\n\n storage.set(id, {\n factory: buildInstantly ? undefined : factory,\n instance: buildInstantly ? factory() : undefined,\n constructorName: getConstructorName(factoryOrClassReference),\n constructorPath,\n });\n },\n\n isSet(id: string): boolean {\n return storage.has(id);\n },\n\n clear() {\n storage.clear();\n },\n\n async setup({\n pathRoot = process.cwd(),\n generateTypes = false,\n autoImportPatterns = ['./services/*/**/*.service.{js,mjs,ts,mts,cts}'],\n typeOutput = './ioc.d.ts',\n }: SetupOptions | undefined = {}) {\n typeOutput = path.isAbsolute(typeOutput)\n ? typeOutput\n : path.join(pathRoot, typeOutput);\n\n if (!typeOutput.endsWith('.d.ts')) {\n typeOutput = path.join(typeOutput, 'ioc.d.ts');\n }\n\n autoImportPatterns = autoImportPatterns.map(servicePath => {\n return path.isAbsolute(servicePath)\n ? servicePath\n : path.join(pathRoot, servicePath);\n });\n\n log.debug('Setup', {\n pathRoot,\n generateTypes,\n autoImportPatterns,\n typeOutput,\n });\n\n await this.importServices(autoImportPatterns);\n\n if (generateTypes) {\n await this.writeTypes(typeOutput);\n }\n },\n\n async importServices(autoImportPatterns: string[]) {\n for (const pattern of autoImportPatterns) {\n for (const filePath of globSync(pattern)) {\n await import(filePath);\n }\n }\n },\n\n async writeTypes(outputFilePath: string) {\n const typesDefinitions: string[] = [];\n const outputFolderPath = path.dirname(outputFilePath);\n\n for (const [\n key,\n { constructorName, constructorPath },\n ] of storage.entries()) {\n if (!constructorName || !constructorPath) continue;\n\n typesDefinitions.push(\n `\"${key}\": import('./${path.relative(\n outputFolderPath,\n constructorPath,\n )}').${constructorName};`,\n );\n }\n\n const typesContent = `/* eslint-disable */\n/* prettier-ignore */\n// @ts-nocheck\n// Generated by @andrew_l/ioc\n\nexport {};\n\ndeclare module '@andrew_l/ioc' {\n\tinterface IocMap {\n\t\t${typesDefinitions.sort().join('\\n\\t\\t')}\n\t}\n\n\tfunction ioc<Key extends keyof IocMap>(id: Key): IocMap[Key];\n}`;\n\n const newHash = crypto\n .createHmac('sha256', '')\n .update(typesContent)\n .digest('hex');\n\n const oldHash = await getHashFromTypeFile(outputFilePath);\n\n if (newHash !== oldHash) {\n log.warn('Types file has been updated.');\n\n await fs.writeFile(\n outputFilePath,\n `// hash:${newHash}\\n${typesContent}\\n`,\n );\n }\n },\n};\n\nfunction extractFilePathFromStack(stack: string): string {\n let result = stack.split('\\n')[0].slice(7).replace('<anonymous>', '').trim();\n\n if (result.startsWith('(')) {\n result = result.slice(1);\n }\n\n if (result.endsWith(')')) {\n result = result.slice(0, -1);\n }\n\n if (!result.startsWith('file://')) {\n result = 'file://' + result;\n }\n\n result = new URL(result).pathname.split(':')[0];\n\n if (result.endsWith('.ts')) {\n result = result.slice(0, -3) + '.js';\n }\n return result;\n}\n\nfunction isConstructable(obj: any): obj is Function {\n // https://stackoverflow.com/a/46320004\n return !!obj.prototype && !!obj.prototype.constructor.name;\n}\n\nfunction getFactory(factoryOrClassReference: Factory | AnyFunction): Factory {\n return isConstructable(factoryOrClassReference)\n ? () => new factoryOrClassReference()\n : factoryOrClassReference;\n}\n\nfunction getConstructorName(\n factoryOrClassReference: Factory | AnyFunction,\n): string {\n return isConstructable(factoryOrClassReference)\n ? factoryOrClassReference.prototype.constructor.name\n : String(factoryOrClassReference).match(/new\\s(\\w+)\\(/)?.[1] || '';\n}\n\nasync function getHashFromTypeFile(filePath: string): Promise<string | null> {\n try {\n const content = await fs.readFile(filePath, { encoding: 'utf8' });\n const lastLine = content.split('\\n').at(0);\n\n return lastLine?.split('hash:')[1] || null;\n } catch (_) {\n return null;\n }\n}\n","import ServiceContainer from './ServiceContainer';\n\n/**\n * This interface can be augmented by users to add types to ioc\n */\ninterface IocMap {}\n\n/**\n * Get instance of service\n * @example\n * const userService ioc('UserService');\n *\n * @group Main\n */\nexport function ioc<Key extends keyof IocMap>(id: Key): IocMap[Key] {\n return ServiceContainer.get(id as any) as any;\n}\nexport type { IocMap };\n"],"names":["logger","captureStackTrace","path","globSync","crypto","fs"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/ServiceContainer.ts","../src/ioc.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport { globSync } from 'node:fs';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { type AnyFunction, captureStackTrace, logger } from '@andrew_l/toolkit';\n\nexport type Factory = any;\n\nexport type Service = {\n factory?: Factory;\n constructorName?: string;\n constructorPath?: string;\n instance: any;\n};\n\nexport interface SetupOptions {\n pathRoot?: string;\n\n /**\n * Absolute or relative path where generated type file will be saved\n */\n typeOutput?: string;\n\n /**\n * Absolute or relative glob patterns to auto-import service files\n */\n autoImportPatterns?: string[];\n\n /**\n * Should generate type file\n */\n generateTypes?: boolean;\n}\n\nconst storage = new Map<string, Service>();\n\nconst log = logger('IOC');\n\nexport default {\n get<T>(id: string): T {\n const service = storage.get(id);\n\n if (!service) {\n throw new Error(`No service is registered for [${id}]`);\n }\n\n if (!service.instance) {\n service.instance = service.factory?.();\n service.factory = undefined;\n }\n\n return service.instance;\n },\n\n set(\n id: string,\n factoryOrClassReference: Factory | AnyFunction,\n buildInstantly: boolean = false,\n ) {\n if (this.isSet(id)) {\n throw new Error(`Service [${id}] is already registered`);\n }\n\n let constructorPath: string | undefined;\n\n try {\n constructorPath = extractFilePathFromStack(captureStackTrace(this.set));\n } catch (_) {}\n\n this.override(id, factoryOrClassReference, buildInstantly, constructorPath);\n },\n\n override(\n id: string,\n factoryOrClassReference: Factory | AnyFunction,\n buildInstantly: boolean = false,\n constructorPath?: string,\n ) {\n const factory: Factory = getFactory(factoryOrClassReference);\n\n storage.set(id, {\n factory: buildInstantly ? undefined : factory,\n instance: buildInstantly ? factory() : undefined,\n constructorName: getConstructorName(factoryOrClassReference),\n constructorPath,\n });\n },\n\n isSet(id: string): boolean {\n return storage.has(id);\n },\n\n clear() {\n storage.clear();\n },\n\n async setup({\n pathRoot = process.cwd(),\n generateTypes = false,\n autoImportPatterns = ['./services/*/**/*.service.{js,mjs,ts,mts,cts}'],\n typeOutput = './ioc.d.ts',\n }: SetupOptions | undefined = {}) {\n typeOutput = path.isAbsolute(typeOutput)\n ? typeOutput\n : path.join(pathRoot, typeOutput);\n\n if (!typeOutput.endsWith('.d.ts')) {\n typeOutput = path.join(typeOutput, 'ioc.d.ts');\n }\n\n autoImportPatterns = autoImportPatterns.map(servicePath => {\n return path.isAbsolute(servicePath)\n ? servicePath\n : path.join(pathRoot, servicePath);\n });\n\n log.debug('Setup', {\n pathRoot,\n generateTypes,\n autoImportPatterns,\n typeOutput,\n });\n\n await this.importServices(autoImportPatterns);\n\n if (generateTypes) {\n await this.writeTypes(typeOutput);\n }\n },\n\n async importServices(autoImportPatterns: string[]) {\n for (const pattern of autoImportPatterns) {\n for (const filePath of globSync(pattern)) {\n await import(filePath);\n }\n }\n },\n\n async writeTypes(outputFilePath: string) {\n const typesDefinitions: string[] = [];\n const outputFolderPath = path.dirname(outputFilePath);\n\n for (const [\n key,\n { constructorName, constructorPath },\n ] of storage.entries()) {\n if (!constructorName || !constructorPath) continue;\n\n typesDefinitions.push(\n `\"${key}\": import('./${path.relative(\n outputFolderPath,\n constructorPath,\n )}').${constructorName};`,\n );\n }\n\n const typesContent = `/* eslint-disable */\n/* prettier-ignore */\n// @ts-nocheck\n// Generated by @andrew_l/ioc\n\nexport {};\n\ndeclare module '@andrew_l/ioc' {\n\tinterface IocMap {\n\t\t${typesDefinitions.sort().join('\\n\\t\\t')}\n\t}\n\n\tfunction ioc<Key extends keyof IocMap>(id: Key): IocMap[Key];\n}`;\n\n const newHash = crypto\n .createHmac('sha256', '')\n .update(typesContent)\n .digest('hex');\n\n const oldHash = await getHashFromTypeFile(outputFilePath);\n\n if (newHash !== oldHash) {\n log.warn('Types file has been updated.');\n\n await fs.writeFile(\n outputFilePath,\n `// hash:${newHash}\\n${typesContent}\\n`,\n );\n }\n },\n};\n\nfunction extractFilePathFromStack(stack: string): string {\n let result = stack.split('\\n')[0].slice(7).replace('<anonymous>', '').trim();\n\n if (result.startsWith('(')) {\n result = result.slice(1);\n }\n\n if (result.endsWith(')')) {\n result = result.slice(0, -1);\n }\n\n if (!result.startsWith('file://')) {\n result = 'file://' + result;\n }\n\n result = new URL(result).pathname.split(':')[0];\n\n if (result.endsWith('.ts')) {\n result = result.slice(0, -3) + '.js';\n }\n return result;\n}\n\nfunction isConstructable(obj: any): obj is Function {\n // https://stackoverflow.com/a/46320004\n return !!obj.prototype && !!obj.prototype.constructor.name;\n}\n\nfunction getFactory(factoryOrClassReference: Factory | AnyFunction): Factory {\n return isConstructable(factoryOrClassReference)\n ? () => new factoryOrClassReference()\n : factoryOrClassReference;\n}\n\nfunction getConstructorName(\n factoryOrClassReference: Factory | AnyFunction,\n): string {\n return isConstructable(factoryOrClassReference)\n ? factoryOrClassReference.prototype.constructor.name\n : String(factoryOrClassReference).match(/new\\s(\\w+)\\(/)?.[1] || '';\n}\n\nasync function getHashFromTypeFile(filePath: string): Promise<string | null> {\n try {\n const content = await fs.readFile(filePath, { encoding: 'utf8' });\n const lastLine = content.split('\\n').at(0);\n\n return lastLine?.split('hash:')[1] || null;\n } catch (_) {\n return null;\n }\n}\n","import ServiceContainer from './ServiceContainer';\n\n/**\n * This interface can be augmented by users to add types to ioc\n */\ninterface IocMap {}\n\n/**\n * Get instance of service\n * @example\n * const userService ioc('UserService');\n *\n * @group Main\n */\nexport function ioc<Key extends keyof IocMap>(id: Key): IocMap[Key] {\n return ServiceContainer.get(id as any) as any;\n}\nexport type { IocMap };\n"],"names":["logger","captureStackTrace","path","globSync","crypto","fs"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/ServiceContainer.ts","../src/ioc.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport { globSync } from 'node:fs';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { type AnyFunction, captureStackTrace, logger } from '@andrew_l/toolkit';\n\nexport type Factory = any;\n\nexport type Service = {\n factory?: Factory;\n constructorName?: string;\n constructorPath?: string;\n instance: any;\n};\n\nexport interface SetupOptions {\n pathRoot?: string;\n\n /**\n * Absolute or relative path where generated type file will be saved\n */\n typeOutput?: string;\n\n /**\n * Absolute or relative glob patterns to auto-import service files\n */\n autoImportPatterns?: string[];\n\n /**\n * Should generate type file\n */\n generateTypes?: boolean;\n}\n\nconst storage = new Map<string, Service>();\n\nconst log = logger('IOC');\n\nexport default {\n get<T>(id: string): T {\n const service = storage.get(id);\n\n if (!service) {\n throw new Error(`No service is registered for [${id}]`);\n }\n\n if (!service.instance) {\n service.instance = service.factory?.();\n service.factory = undefined;\n }\n\n return service.instance;\n },\n\n set(\n id: string,\n factoryOrClassReference: Factory | AnyFunction,\n buildInstantly: boolean = false,\n ) {\n if (this.isSet(id)) {\n throw new Error(`Service [${id}] is already registered`);\n }\n\n let constructorPath: string | undefined;\n\n try {\n constructorPath = extractFilePathFromStack(captureStackTrace(this.set));\n } catch (_) {}\n\n this.override(id, factoryOrClassReference, buildInstantly, constructorPath);\n },\n\n override(\n id: string,\n factoryOrClassReference: Factory | AnyFunction,\n buildInstantly: boolean = false,\n constructorPath?: string,\n ) {\n const factory: Factory = getFactory(factoryOrClassReference);\n\n storage.set(id, {\n factory: buildInstantly ? undefined : factory,\n instance: buildInstantly ? factory() : undefined,\n constructorName: getConstructorName(factoryOrClassReference),\n constructorPath,\n });\n },\n\n isSet(id: string): boolean {\n return storage.has(id);\n },\n\n clear() {\n storage.clear();\n },\n\n async setup({\n pathRoot = process.cwd(),\n generateTypes = false,\n autoImportPatterns = ['./services/*/**/*.service.{js,mjs,ts,mts,cts}'],\n typeOutput = './ioc.d.ts',\n }: SetupOptions | undefined = {}) {\n typeOutput = path.isAbsolute(typeOutput)\n ? typeOutput\n : path.join(pathRoot, typeOutput);\n\n if (!typeOutput.endsWith('.d.ts')) {\n typeOutput = path.join(typeOutput, 'ioc.d.ts');\n }\n\n autoImportPatterns = autoImportPatterns.map(servicePath => {\n return path.isAbsolute(servicePath)\n ? servicePath\n : path.join(pathRoot, servicePath);\n });\n\n log.debug('Setup', {\n pathRoot,\n generateTypes,\n autoImportPatterns,\n typeOutput,\n });\n\n await this.importServices(autoImportPatterns);\n\n if (generateTypes) {\n await this.writeTypes(typeOutput);\n }\n },\n\n async importServices(autoImportPatterns: string[]) {\n for (const pattern of autoImportPatterns) {\n for (const filePath of globSync(pattern)) {\n await import(filePath);\n }\n }\n },\n\n async writeTypes(outputFilePath: string) {\n const typesDefinitions: string[] = [];\n const outputFolderPath = path.dirname(outputFilePath);\n\n for (const [\n key,\n { constructorName, constructorPath },\n ] of storage.entries()) {\n if (!constructorName || !constructorPath) continue;\n\n typesDefinitions.push(\n `\"${key}\": import('./${path.relative(\n outputFolderPath,\n constructorPath,\n )}').${constructorName};`,\n );\n }\n\n const typesContent = `/* eslint-disable */\n/* prettier-ignore */\n// @ts-nocheck\n// Generated by @andrew_l/ioc\n\nexport {};\n\ndeclare module '@andrew_l/ioc' {\n\tinterface IocMap {\n\t\t${typesDefinitions.sort().join('\\n\\t\\t')}\n\t}\n\n\tfunction ioc<Key extends keyof IocMap>(id: Key): IocMap[Key];\n}`;\n\n const newHash = crypto\n .createHmac('sha256', '')\n .update(typesContent)\n .digest('hex');\n\n const oldHash = await getHashFromTypeFile(outputFilePath);\n\n if (newHash !== oldHash) {\n log.warn('Types file has been updated.');\n\n await fs.writeFile(\n outputFilePath,\n `// hash:${newHash}\\n${typesContent}\\n`,\n );\n }\n },\n};\n\nfunction extractFilePathFromStack(stack: string): string {\n let result = stack.split('\\n')[0].slice(7).replace('<anonymous>', '').trim();\n\n if (result.startsWith('(')) {\n result = result.slice(1);\n }\n\n if (result.endsWith(')')) {\n result = result.slice(0, -1);\n }\n\n if (!result.startsWith('file://')) {\n result = 'file://' + result;\n }\n\n result = new URL(result).pathname.split(':')[0];\n\n if (result.endsWith('.ts')) {\n result = result.slice(0, -3) + '.js';\n }\n return result;\n}\n\nfunction isConstructable(obj: any): obj is Function {\n // https://stackoverflow.com/a/46320004\n return !!obj.prototype && !!obj.prototype.constructor.name;\n}\n\nfunction getFactory(factoryOrClassReference: Factory | AnyFunction): Factory {\n return isConstructable(factoryOrClassReference)\n ? () => new factoryOrClassReference()\n : factoryOrClassReference;\n}\n\nfunction getConstructorName(\n factoryOrClassReference: Factory | AnyFunction,\n): string {\n return isConstructable(factoryOrClassReference)\n ? factoryOrClassReference.prototype.constructor.name\n : String(factoryOrClassReference).match(/new\\s(\\w+)\\(/)?.[1] || '';\n}\n\nasync function getHashFromTypeFile(filePath: string): Promise<string | null> {\n try {\n const content = await fs.readFile(filePath, { encoding: 'utf8' });\n const lastLine = content.split('\\n').at(0);\n\n return lastLine?.split('hash:')[1] || null;\n } catch (_) {\n return null;\n }\n}\n","import ServiceContainer from './ServiceContainer';\n\n/**\n * This interface can be augmented by users to add types to ioc\n */\ninterface IocMap {}\n\n/**\n * Get instance of service\n * @example\n * const userService ioc('UserService');\n *\n * @group Main\n */\nexport function ioc<Key extends keyof IocMap>(id: Key): IocMap[Key] {\n return ServiceContainer.get(id as any) as any;\n}\nexport type { IocMap };\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/ServiceContainer.ts","../src/ioc.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport { globSync } from 'node:fs';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { type AnyFunction, captureStackTrace, logger } from '@andrew_l/toolkit';\n\nexport type Factory = any;\n\nexport type Service = {\n factory?: Factory;\n constructorName?: string;\n constructorPath?: string;\n instance: any;\n};\n\nexport interface SetupOptions {\n pathRoot?: string;\n\n /**\n * Absolute or relative path where generated type file will be saved\n */\n typeOutput?: string;\n\n /**\n * Absolute or relative glob patterns to auto-import service files\n */\n autoImportPatterns?: string[];\n\n /**\n * Should generate type file\n */\n generateTypes?: boolean;\n}\n\nconst storage = new Map<string, Service>();\n\nconst log = logger('IOC');\n\nexport default {\n get<T>(id: string): T {\n const service = storage.get(id);\n\n if (!service) {\n throw new Error(`No service is registered for [${id}]`);\n }\n\n if (!service.instance) {\n service.instance = service.factory?.();\n service.factory = undefined;\n }\n\n return service.instance;\n },\n\n set(\n id: string,\n factoryOrClassReference: Factory | AnyFunction,\n buildInstantly: boolean = false,\n ) {\n if (this.isSet(id)) {\n throw new Error(`Service [${id}] is already registered`);\n }\n\n let constructorPath: string | undefined;\n\n try {\n constructorPath = extractFilePathFromStack(captureStackTrace(this.set));\n } catch (_) {}\n\n this.override(id, factoryOrClassReference, buildInstantly, constructorPath);\n },\n\n override(\n id: string,\n factoryOrClassReference: Factory | AnyFunction,\n buildInstantly: boolean = false,\n constructorPath?: string,\n ) {\n const factory: Factory = getFactory(factoryOrClassReference);\n\n storage.set(id, {\n factory: buildInstantly ? undefined : factory,\n instance: buildInstantly ? factory() : undefined,\n constructorName: getConstructorName(factoryOrClassReference),\n constructorPath,\n });\n },\n\n isSet(id: string): boolean {\n return storage.has(id);\n },\n\n clear() {\n storage.clear();\n },\n\n async setup({\n pathRoot = process.cwd(),\n generateTypes = false,\n autoImportPatterns = ['./services/*/**/*.service.{js,mjs,ts,mts,cts}'],\n typeOutput = './ioc.d.ts',\n }: SetupOptions | undefined = {}) {\n typeOutput = path.isAbsolute(typeOutput)\n ? typeOutput\n : path.join(pathRoot, typeOutput);\n\n if (!typeOutput.endsWith('.d.ts')) {\n typeOutput = path.join(typeOutput, 'ioc.d.ts');\n }\n\n autoImportPatterns = autoImportPatterns.map(servicePath => {\n return path.isAbsolute(servicePath)\n ? servicePath\n : path.join(pathRoot, servicePath);\n });\n\n log.debug('Setup', {\n pathRoot,\n generateTypes,\n autoImportPatterns,\n typeOutput,\n });\n\n await this.importServices(autoImportPatterns);\n\n if (generateTypes) {\n await this.writeTypes(typeOutput);\n }\n },\n\n async importServices(autoImportPatterns: string[]) {\n for (const pattern of autoImportPatterns) {\n for (const filePath of globSync(pattern)) {\n await import(filePath);\n }\n }\n },\n\n async writeTypes(outputFilePath: string) {\n const typesDefinitions: string[] = [];\n const outputFolderPath = path.dirname(outputFilePath);\n\n for (const [\n key,\n { constructorName, constructorPath },\n ] of storage.entries()) {\n if (!constructorName || !constructorPath) continue;\n\n typesDefinitions.push(\n `\"${key}\": import('./${path.relative(\n outputFolderPath,\n constructorPath,\n )}').${constructorName};`,\n );\n }\n\n const typesContent = `/* eslint-disable */\n/* prettier-ignore */\n// @ts-nocheck\n// Generated by @andrew_l/ioc\n\nexport {};\n\ndeclare module '@andrew_l/ioc' {\n\tinterface IocMap {\n\t\t${typesDefinitions.sort().join('\\n\\t\\t')}\n\t}\n\n\tfunction ioc<Key extends keyof IocMap>(id: Key): IocMap[Key];\n}`;\n\n const newHash = crypto\n .createHmac('sha256', '')\n .update(typesContent)\n .digest('hex');\n\n const oldHash = await getHashFromTypeFile(outputFilePath);\n\n if (newHash !== oldHash) {\n log.warn('Types file has been updated.');\n\n await fs.writeFile(\n outputFilePath,\n `// hash:${newHash}\\n${typesContent}\\n`,\n );\n }\n },\n};\n\nfunction extractFilePathFromStack(stack: string): string {\n let result = stack.split('\\n')[0].slice(7).replace('<anonymous>', '').trim();\n\n if (result.startsWith('(')) {\n result = result.slice(1);\n }\n\n if (result.endsWith(')')) {\n result = result.slice(0, -1);\n }\n\n if (!result.startsWith('file://')) {\n result = 'file://' + result;\n }\n\n result = new URL(result).pathname.split(':')[0];\n\n if (result.endsWith('.ts')) {\n result = result.slice(0, -3) + '.js';\n }\n return result;\n}\n\nfunction isConstructable(obj: any): obj is Function {\n // https://stackoverflow.com/a/46320004\n return !!obj.prototype && !!obj.prototype.constructor.name;\n}\n\nfunction getFactory(factoryOrClassReference: Factory | AnyFunction): Factory {\n return isConstructable(factoryOrClassReference)\n ? () => new factoryOrClassReference()\n : factoryOrClassReference;\n}\n\nfunction getConstructorName(\n factoryOrClassReference: Factory | AnyFunction,\n): string {\n return isConstructable(factoryOrClassReference)\n ? factoryOrClassReference.prototype.constructor.name\n : String(factoryOrClassReference).match(/new\\s(\\w+)\\(/)?.[1] || '';\n}\n\nasync function getHashFromTypeFile(filePath: string): Promise<string | null> {\n try {\n const content = await fs.readFile(filePath, { encoding: 'utf8' });\n const lastLine = content.split('\\n').at(0);\n\n return lastLine?.split('hash:')[1] || null;\n } catch (_) {\n return null;\n }\n}\n","import ServiceContainer from './ServiceContainer';\n\n/**\n * This interface can be augmented by users to add types to ioc\n */\ninterface IocMap {}\n\n/**\n * Get instance of service\n * @example\n * const userService ioc('UserService');\n *\n * @group Main\n */\nexport function ioc<Key extends keyof IocMap>(id: Key): IocMap[Key] {\n return ServiceContainer.get(id as any) as any;\n}\nexport type { IocMap };\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andrew_l/ioc",
3
- "version": "0.2.21",
3
+ "version": "0.3.1",
4
4
  "description": "Pretty simple IOC Container.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -29,14 +29,15 @@
29
29
  ],
30
30
  "devDependencies": {
31
31
  "@types/node": "22.10.5",
32
- "typescript": "~5.6.2",
33
- "unbuild": "3.0.0-rc.11",
34
- "vitest": "^2.1.3"
32
+ "typescript": "~5.8.3",
33
+ "unbuild": "3.5.0",
34
+ "vitest": "^3.2.4"
35
35
  },
36
36
  "dependencies": {
37
- "@andrew_l/toolkit": "0.2.21"
37
+ "@andrew_l/toolkit": "0.3.1"
38
38
  },
39
39
  "scripts": {
40
+ "check-types": "tsc --noEmit",
40
41
  "build": "unbuild",
41
42
  "test": "echo todo",
42
43
  "test:watch": "vitest watch --typecheck"