Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions lib/Loader/FileLoader.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down
3 changes: 3 additions & 0 deletions test/Resources/config/Kernel.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
class Kernel {}

export default Kernel
4 changes: 4 additions & 0 deletions test/Resources/config/slash-prefixed-class.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
services:
kernel:
class: /Kernel
arguments: []
14 changes: 14 additions & 0 deletions test/node-dependency-injection/lib/Loader/YamlFileLoader.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
Loading