diff --git a/.changeset/lovely-cobras-doubt.md b/.changeset/lovely-cobras-doubt.md new file mode 100644 index 0000000000..765a412d8a --- /dev/null +++ b/.changeset/lovely-cobras-doubt.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-defaults': patch +--- + +Fixed bug in PackageDiscoveryService where packages with "exports" field caused ERR_PACKAGE_PATH_NOT_EXPORTED error during backend startup. diff --git a/packages/backend-defaults/src/PackageDiscoveryService.ts b/packages/backend-defaults/src/PackageDiscoveryService.ts index 90e8d0f59d..fe0ab931a7 100644 --- a/packages/backend-defaults/src/PackageDiscoveryService.ts +++ b/packages/backend-defaults/src/PackageDiscoveryService.ts @@ -23,6 +23,7 @@ import { RootLoggerService, } from '@backstage/backend-plugin-api'; import { BackstagePackageJson } from '@backstage/cli-node'; +import { isError } from '@backstage/errors'; const DETECTED_PACKAGE_ROLES = [ 'node-library', @@ -125,9 +126,19 @@ export class PackageDiscoveryService { const features: BackendFeature[] = []; for (const name of dependencyNames) { - const depPkg = require(require.resolve(`${name}/package.json`, { - paths: [packageDir], - })) as BackstagePackageJson; + let depPkg: BackstagePackageJson; + try { + const packageJsonPath = require.resolve(`${name}/package.json`, { + paths: [packageDir], + }); + depPkg = require(packageJsonPath) as BackstagePackageJson; + } catch (error) { + // Handle packages with "exports" field that don't export ./package.json + if (isError(error) && error.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED') { + continue; // Skip packages that don't export package.json - they can't be Backstage packages + } + throw error; + } if ( !depPkg?.backstage?.role || !DETECTED_PACKAGE_ROLES.includes(depPkg.backstage.role)