| ... | @@ -67,7 +67,7 @@ interface CustomNoticeConfigEntry { | ... | @@ -67,7 +67,7 @@ interface CustomNoticeConfigEntry { |
| 67 | } | 67 | } |
| 68 | | 68 | |
| 69 | interface PackageNoticeOverrideConfigEntry { | 69 | interface PackageNoticeOverrideConfigEntry { |
| 70 | readonly generatedNotice?: GeneratedNoticeConfigEntry; | 70 | readonly generatedNotices?: ReadonlyArray<GeneratedNoticeConfigEntry>; |
| 71 | readonly license?: string; | 71 | readonly license?: string; |
| 72 | readonly name?: string; | 72 | readonly name?: string; |
| 73 | readonly noticeFile?: string; | 73 | readonly noticeFile?: string; |
| ... | @@ -257,8 +257,16 @@ function decodePackageOverrides(value: unknown): ReadonlyArray<PackageNoticeOver | ... | @@ -257,8 +257,16 @@ function decodePackageOverrides(value: unknown): ReadonlyArray<PackageNoticeOver |
| 257 | entry.generatedNotice === undefined | 257 | entry.generatedNotice === undefined |
| 258 | ? undefined | 258 | ? undefined |
| 259 | : decodeGeneratedNotice(entry.generatedNotice, `${context} generated notice`); | 259 | : decodeGeneratedNotice(entry.generatedNotice, `${context} generated notice`); |
| 260 | if (noticeFile !== undefined && generatedNotice !== undefined) { | 260 | const generatedNotices = decodeGeneratedNotices(entry.generatedNotices, context); |
| 261 | throw new Error(`${context} cannot define both "noticeFile" and "generatedNotice".`); | 261 | if ( |
| | 262 | Number(noticeFile !== undefined) + |
| | 263 | Number(generatedNotice !== undefined) + |
| | 264 | Number(generatedNotices !== undefined) > |
| | 265 | 1 |
| | 266 | ) { |
| | 267 | throw new Error( |
| | 268 | `${context} can define only one of "noticeFile", "generatedNotice", or "generatedNotices".`, |
| | 269 | ); |
| 262 | } | 270 | } |
| 263 | const sourceUrl = readOptionalString(entry, "sourceUrl", context); | 271 | const sourceUrl = readOptionalString(entry, "sourceUrl", context); |
| 264 | return { | 272 | return { |
| ... | @@ -267,7 +275,8 @@ function decodePackageOverrides(value: unknown): ReadonlyArray<PackageNoticeOver | ... | @@ -267,7 +275,8 @@ function decodePackageOverrides(value: unknown): ReadonlyArray<PackageNoticeOver |
| 267 | ...(version !== undefined ? { version } : {}), | 275 | ...(version !== undefined ? { version } : {}), |
| 268 | ...(license !== undefined ? { license } : {}), | 276 | ...(license !== undefined ? { license } : {}), |
| 269 | ...(noticeFile !== undefined ? { noticeFile } : {}), | 277 | ...(noticeFile !== undefined ? { noticeFile } : {}), |
| 270 | ...(generatedNotice !== undefined ? { generatedNotice } : {}), | 278 | ...(generatedNotice !== undefined ? { generatedNotices: [generatedNotice] } : {}), |
| | 279 | ...(generatedNotices !== undefined ? { generatedNotices } : {}), |
| 271 | ...(sourceUrl !== undefined ? { sourceUrl } : {}), | 280 | ...(sourceUrl !== undefined ? { sourceUrl } : {}), |
| 272 | }; | 281 | }; |
| 273 | }); | 282 | }); |
| ... | @@ -396,9 +405,7 @@ function configuredGeneratedNotices( | ... | @@ -396,9 +405,7 @@ function configuredGeneratedNotices( |
| 396 | ): ReadonlyArray<GeneratedNoticeConfigEntry> { | 405 | ): ReadonlyArray<GeneratedNoticeConfigEntry> { |
| 397 | return [ | 406 | return [ |
| 398 | ...config.customNotices.flatMap((notice) => notice.generatedNotices ?? []), | 407 | ...config.customNotices.flatMap((notice) => notice.generatedNotices ?? []), |
| 399 | ...config.packageOverrides.flatMap((override) => | 408 | ...config.packageOverrides.flatMap((override) => override.generatedNotices ?? []), |
| 400 | override.generatedNotice ? [override.generatedNotice] : [], | | |
| 401 | ), | | |
| 402 | ]; | 409 | ]; |
| 403 | } | 410 | } |
| 404 | | 411 | |
| ... | @@ -780,9 +787,9 @@ async function packageEntry( | ... | @@ -780,9 +787,9 @@ async function packageEntry( |
| 780 | } | 787 | } |
| 781 | | 788 | |
| 782 | const repositoryKey = repositoryNoticeKey(collected.packageJson, license); | 789 | const repositoryKey = repositoryNoticeKey(collected.packageJson, license); |
| 783 | const noticeText = override?.generatedNotice | 790 | const noticeText = override?.generatedNotices |
| 784 | ? await generatedNoticeText( | 791 | ? await generatedNoticeText( |
| 785 | [override.generatedNotice], | 792 | override.generatedNotices, |
| 786 | configDirectory, | 793 | configDirectory, |
| 787 | allowMissingGeneratedNotices, | 794 | allowMissingGeneratedNotices, |
| 788 | ) | 795 | ) |
| ... | @@ -793,7 +800,7 @@ async function packageEntry( | ... | @@ -793,7 +800,7 @@ async function packageEntry( |
| 793 | : ((await packageNoticeText(collected.packageRoot, packageNotices)) ?? | 800 | : ((await packageNoticeText(collected.packageRoot, packageNotices)) ?? |
| 794 | (repositoryKey ? repositoryNotices.get(repositoryKey) : undefined)); | 801 | (repositoryKey ? repositoryNotices.get(repositoryKey) : undefined)); |
| 795 | if (!noticeText) { | 802 | if (!noticeText) { |
| 796 | if (override?.generatedNotice && allowMissingGeneratedNotices) return null; | 803 | if (override?.generatedNotices && allowMissingGeneratedNotices) return null; |
| 797 | throw new Error( | 804 | throw new Error( |
| 798 | `${name}@${version} does not include a license or notice file. Add a package override with "noticeFile" or "generatedNotice" in the third-party license config.`, | 805 | `${name}@${version} does not include a license or notice file. Add a package override with "noticeFile" or "generatedNotice" in the third-party license config.`, |
| 799 | ); | 806 | ); |