diff --git a/.changeset/short-flies-collect.md b/.changeset/short-flies-collect.md new file mode 100644 index 0000000000000..d393f92175c57 --- /dev/null +++ b/.changeset/short-flies-collect.md @@ -0,0 +1,5 @@ +--- +'@backstage/config-loader': patch +--- + +Handle empty config files gracefully diff --git a/packages/config-loader/src/loader.test.ts b/packages/config-loader/src/loader.test.ts index 058f59aef1f10..8c4d0b48a4888 100644 --- a/packages/config-loader/src/loader.test.ts +++ b/packages/config-loader/src/loader.test.ts @@ -104,6 +104,7 @@ describe('loadConfig', () => { `, '/root/secrets/substituted.txt': '123abc', '/root/${ESCAPE_ME}.txt': 'notSubstituted', + '/root/empty.yaml': '# just a comment', }); }); @@ -469,6 +470,17 @@ describe('loadConfig', () => { await new Promise(resolve => setTimeout(resolve, 1000)); }); + it('handles empty files gracefully', async () => { + await expect( + loadConfig({ + configRoot: '/root', + configTargets: [{ path: '/root/empty.yaml' }], + }), + ).resolves.toEqual({ + appConfigs: [], + }); + }); + function defer() { let resolve: (value: T) => void; const promise = new Promise(_resolve => { diff --git a/packages/config-loader/src/loader.ts b/packages/config-loader/src/loader.ts index 7ceb2e85488d9..9537d2d945ee8 100644 --- a/packages/config-loader/src/loader.ts +++ b/packages/config-loader/src/loader.ts @@ -160,13 +160,17 @@ export async function loadConfig( }; const input = yaml.parse(await readFile(configPath)); - const substitutionTransform = createSubstitutionTransform(env); - const data = await applyConfigTransforms(dir, input, [ - createIncludeTransform(env, readFile, substitutionTransform), - substitutionTransform, - ]); - fileConfigs.push({ data, context: basename(configPath) }); + // A completely empty file ends up as a null return value + if (input !== null) { + const substitutionTransform = createSubstitutionTransform(env); + const data = await applyConfigTransforms(dir, input, [ + createIncludeTransform(env, readFile, substitutionTransform), + substitutionTransform, + ]); + + fileConfigs.push({ data, context: basename(configPath) }); + } } return { fileConfigs, loadedPaths };