From efdb502e1b23ba842303f1391d435f3124df8dc3 Mon Sep 17 00:00:00 2001 From: IanM Date: Wed, 14 Oct 2026 16:05:42 +0100 Subject: [PATCH] fix: don't crash on a licence that isn't an SPDX identifier --- src/steps/gen-ext-scaffolder.ts | 15 +++++++++++++-- test/steps/gen-ext-scaffolder.test.ts | 19 ++++++++++++++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/steps/gen-ext-scaffolder.ts b/src/steps/gen-ext-scaffolder.ts index cf0221f..6914370 100644 --- a/src/steps/gen-ext-scaffolder.ts +++ b/src/steps/gen-ext-scaffolder.ts @@ -17,6 +17,18 @@ function assertUnreachable(_x: never): never { throw new Error("Didn't expect to get here"); } +/** + * The SPDX text for a licence, or an empty string when it isn't a known SPDX + * identifier (e.g. "proprietary" or a free-form "© Some Company"). + */ +export function licenseTextFor(licenseType: unknown): string { + if (typeof licenseType !== 'string' || !licenseType) return ''; + + const id = [...(spdxLicenseListSimple as Set)].find((l) => l.toLowerCase() === licenseType.toLowerCase()); + + return id ? require(`spdx-license-list/licenses/${id}`).licenseText : ''; +} + export const EXTENSION_PARAMS = [ 'packageName', 'packageDescription', @@ -170,8 +182,7 @@ function paramNamesToDef(name: ExtensionParams): TemplateParam - licenseType && licenseType !== 'proprietary' ? require(`spdx-license-list/licenses/${licenseType}`).licenseText : '', + compute: async (_paths, licenseType: string) => licenseTextFor(licenseType), }; case 'extensionId': diff --git a/test/steps/gen-ext-scaffolder.test.ts b/test/steps/gen-ext-scaffolder.test.ts index fa2acb0..ca60b18 100644 --- a/test/steps/gen-ext-scaffolder.test.ts +++ b/test/steps/gen-ext-scaffolder.test.ts @@ -1,4 +1,4 @@ -import { genExtScaffolder } from '../../src/steps/gen-ext-scaffolder'; +import { genExtScaffolder, licenseTextFor } from '../../src/steps/gen-ext-scaffolder'; describe('genExtScaffolder', function () { it('validates', async function () { @@ -7,3 +7,20 @@ describe('genExtScaffolder', function () { await scaffolder.validate(); }); }); + +describe('licenseTextFor', function () { + it('returns the SPDX text for a known licence', function () { + expect(licenseTextFor('MIT')).toContain('Permission is hereby granted'); + }); + + it('matches SPDX identifiers case-insensitively', function () { + expect(licenseTextFor('mit')).toBe(licenseTextFor('MIT')); + }); + + it.each(['proprietary', 'PROPRIETARY', '© Glowing Blue AG', '', undefined, ['MIT', 'GPL-3.0-only']])( + 'returns an empty string for %p', + function (license) { + expect(licenseTextFor(license)).toBe(''); + } + ); +});