diff --git a/.changeset/seven-moons-crash.md b/.changeset/seven-moons-crash.md new file mode 100644 index 0000000..73a06dc --- /dev/null +++ b/.changeset/seven-moons-crash.md @@ -0,0 +1,5 @@ +--- +'@contentauth/c2pa-web': patch +--- + +Add null check to avoid potential crashes. diff --git a/packages/c2pa-web/src/lib/settings.spec.ts b/packages/c2pa-web/src/lib/settings.spec.ts index 47c131f..b99293e 100644 --- a/packages/c2pa-web/src/lib/settings.spec.ts +++ b/packages/c2pa-web/src/lib/settings.spec.ts @@ -21,6 +21,30 @@ describe('settings', () => { JSON.stringify({ builder: { generate_c2pa_archive: true } }) ); }); + + test('should not throw when a settings value is null', async () => { + // typeof null === 'object' in JS — without a null guard this crashes + const settingsString = await settingsToWasmJson({ + verify: null as any + }); + + expect(settingsString).toEqual( + JSON.stringify({ builder: { generate_c2pa_archive: true }, verify: null }) + ); + }); + + test('should not throw when a nested settings value is null', async () => { + const settingsString = await settingsToWasmJson({ + trust: { userAnchors: null as any } + }); + + expect(settingsString).toEqual( + JSON.stringify({ + builder: { generate_c2pa_archive: true }, + trust: { user_anchors: null } + }) + ); + }); }); describe('trust', () => { diff --git a/packages/c2pa-web/src/lib/settings.ts b/packages/c2pa-web/src/lib/settings.ts index 360984a..a018ad2 100644 --- a/packages/c2pa-web/src/lib/settings.ts +++ b/packages/c2pa-web/src/lib/settings.ts @@ -141,7 +141,7 @@ function snakeCaseify(object: SettingsObjectType): SettingsObjectType { const formattedObject = Object.entries(object).reduce( (formattedObject, [key, val]) => { formattedObject[snakeCase(key)] = - typeof val === 'object' ? snakeCaseify(val) : val; + typeof val === 'object' && val !== null ? snakeCaseify(val) : val; return formattedObject; }, {} as SettingsObjectType