diff --git a/lib/Loader/FileLoader.js b/lib/Loader/FileLoader.js index c8d7298..f7fa7d1 100644 --- a/lib/Loader/FileLoader.js +++ b/lib/Loader/FileLoader.js @@ -313,12 +313,18 @@ class FileLoader { * @private */ async _requireClassNameFromPath (classObject, mainClassName) { - const fromDirectory = this._getFromDirectoryByClassObject(classObject) - const exportedModule = await this._getExportedModule(fromDirectory, classObject) + // Normalize legacy slash-prefixed single-segment class references (e.g. '/Kernel' → 'Kernel'). + // These are distinguished from real absolute paths by having only one path segment after '/'. + const normalizedClass = (classObject && classObject.startsWith('/') && classObject.lastIndexOf('/') === 0) + ? classObject.slice(1) + : classObject + + const fromDirectory = this._getFromDirectoryByClassObject(normalizedClass) + const exportedModule = await this._getExportedModule(fromDirectory, normalizedClass) const mainClass = exportedModule[mainClassName] const defaultClass = exportedModule.default - const fileNameClass = exportedModule[path.basename(classObject)] + const fileNameClass = exportedModule[path.basename(normalizedClass)] return mainClass || defaultClass || fileNameClass || exportedModule } diff --git a/test/Resources/config/Kernel.js b/test/Resources/config/Kernel.js new file mode 100644 index 0000000..a6bd163 --- /dev/null +++ b/test/Resources/config/Kernel.js @@ -0,0 +1,3 @@ +class Kernel {} + +export default Kernel diff --git a/test/Resources/config/slash-prefixed-class.yml b/test/Resources/config/slash-prefixed-class.yml new file mode 100644 index 0000000..61fbae1 --- /dev/null +++ b/test/Resources/config/slash-prefixed-class.yml @@ -0,0 +1,4 @@ +services: + kernel: + class: /Kernel + arguments: [] diff --git a/test/node-dependency-injection/lib/Loader/YamlFileLoader.spec.js b/test/node-dependency-injection/lib/Loader/YamlFileLoader.spec.js index 57e4c7a..e6fb7e3 100644 --- a/test/node-dependency-injection/lib/Loader/YamlFileLoader.spec.js +++ b/test/node-dependency-injection/lib/Loader/YamlFileLoader.spec.js @@ -246,6 +246,20 @@ describe('YamlFileLoader', () => { return assert.instanceOf(syntheticService, SyntheticService) }) + it('should load a service with a legacy slash-prefixed class reference', async () => { + // Arrange. + const serviceName = 'kernel' + + // Act. + await loader.load( + path.join(__dirname, '/../../../Resources/config/slash-prefixed-class.yml')) + await container.compile() + const actual = container.get(serviceName) + + // Assert. + return assert.isObject(actual) + }) + it('should load properly service without default export', async () => { // Arrange. const serviceName = 'named'