InteractiveAdvertisingBureau/iabtcf-es

Possible sdk (1.5.10)/vendor list (21) incompatibility issue

Opened this issue · 6 comments

Version
sdk version: 1.5.10
vendorlist version: 21

Module (core, cmpapi, cli, stub, or testing)
core

Describe with reproduction steps – What is the expected behavior?
I am not able to load the vendor list json using the code snippet below.

import { GVL } from '@iabtechlabtcf/core';
import type { VendorList } from '@iabtechlabtcf/core';
const gvl = new GVL(vendorListJSON);

I get an error because vendor 4 does not have "legIntClaim".

Here is what vendor 4 in version 21 vendorlist:
"4":{"id":4,"name":"Roq.ad GmbH","purposes":[1,2,3,4,7,9,10],"legIntPurposes":[],"flexiblePurposes":[],"specialPurposes":[],"features":[1,2,3],"specialFeatures":[1],"cookieMaxAgeSeconds":31536000,"usesCookies":true,"cookieRefresh":true,"usesNonCookieAccess":false,"dataRetention":{"stdRetention":365,"purposes":{},"specialPurposes":{}},"urls":[{"langId":"en","privacy":"https://www.roq.ad/privacy-policy-roqad/"}],"dataDeclaration":[1,2,3,4,5,6,8,9,11],"deviceStorageDisclosureUrl":"https://roqad-public.s3.eu-central-1.amazonaws.com/tcf-disclosure.json"}

When I manually fix this particular issue, I encounter further incompatibility errors.

Hello, @adafee15, thanks for rising the issue.

I have tried to check with the lates version of the GVL https://vendor-list.consensu.org/v3/vendor-list.json running the following code snippet in ts-node. No issue found.

import gvlJson from './data/vendor-list.json';
import { GVL, VersionOrVendorList } from '@iabtechlabtcf/core';

const vendorListJson: VersionOrVendorList = gvlJson as unknown as VersionOrVendorList;

export const loadGVL = () => {
  const gvl = new GVL(vendorListJson);
  console.log(gvl.gvlSpecificationVersion);
  console.log(gvl.vendors[755]);
}

got the following output in the terminal

3
{
  id: 755,
  name: 'Google Advertising Products',
  purposes: [ 1, 3, 4 ],
  legIntPurposes: [ 2, 7, 9, 10 ],
  flexiblePurposes: [ 2, 7, 9, 10 ],
  specialPurposes: [ 1, 2 ],
  features: [ 1, 2 ],
  specialFeatures: [],
  cookieMaxAgeSeconds: 34190000,
  usesCookies: true,
  cookieRefresh: false,
  usesNonCookieAccess: true,
  dataRetention: {
    stdRetention: 548,
    purposes: { '3': 180, '4': 180 },
    specialPurposes: { '1': 1096 }
  },
  urls: [
    {
      langId: 'en',
      privacy: 'https://business.safety.google/privacy/',
      legIntClaim: 'https://policies.google.com/privacy#europeanrequirements'
    },
    {
      langId: 'bg',
      privacy: 'https://business.safety.google/intl/bg/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=bg#europeanrequirements'
    },
    {
      langId: 'cs',
      privacy: 'https://business.safety.google/intl/cs/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=cs#europeanrequirements'
    },
    {
      langId: 'da',
      privacy: 'https://business.safety.google/intl/da/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=da#europeanrequirements'
    },
    {
      langId: 'de',
      privacy: 'https://business.safety.google/intl/de/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=de#europeanrequirements'
    },
    {
      langId: 'el',
      privacy: 'https://business.safety.google/intl/el/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=el#europeanrequirements'
    },
    {
      langId: 'es',
      privacy: 'https://business.safety.google/intl/es/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=es#europeanrequirements'
    },
    {
      langId: 'et',
      privacy: 'https://business.safety.google/intl/et/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=et#europeanrequirements'
    },
    {
      langId: 'fi',
      privacy: 'https://business.safety.google/intl/fi/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=fi#europeanrequirements'
    },
    {
      langId: 'fr',
      privacy: 'https://business.safety.google/intl/fr/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=fr#europeanrequirements'
    },
    {
      langId: 'hr',
      privacy: 'https://business.safety.google/intl/hr/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=hr#europeanrequirements'
    },
    {
      langId: 'hu',
      privacy: 'https://business.safety.google/intl/hu/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=hu#europeanrequirements'
    },
    {
      langId: 'it',
      privacy: 'https://business.safety.google/intl/it/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=it#europeanrequirements'
    },
    {
      langId: 'lt',
      privacy: 'https://business.safety.google/intl/lt/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=lt#europeanrequirements'
    },
    {
      langId: 'lv',
      privacy: 'https://business.safety.google/intl/lv/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=lv#europeanrequirements'
    },
    {
      langId: 'nl',
      privacy: 'https://business.safety.google/intl/nl/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=nl#europeanrequirements'
    },
    {
      langId: 'no',
      privacy: 'https://business.safety.google/intl/no/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=no#europeanrequirements'
    },
    {
      langId: 'pl',
      privacy: 'https://business.safety.google/intl/pl/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=pl#europeanrequirements'
    },
    {
      langId: 'pt',
      privacy: 'https://business.safety.google/intl/pt-PT/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=pt-PT#europeanrequirements'
    },
    {
      langId: 'ro',
      privacy: 'https://business.safety.google/intl/ro/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=ro#europeanrequirements'
    },
    {
      langId: 'sk',
      privacy: 'https://business.safety.google/intl/sk/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=sk#europeanrequirements'
    },
    {
      langId: 'sl',
      privacy: 'https://business.safety.google/intl/sl/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=sl#europeanrequirements'
    },
    {
      langId: 'sv',
      privacy: 'https://business.safety.google/intl/sv/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=sv#europeanrequirements'
    }
  ],
  dataDeclaration: [
    1, 2,  3,  5, 6,
    7, 8, 10, 11
  ],
  deviceStorageDisclosureUrl: 'https://www.gstatic.com/iabtcf/deviceStorageDisclosure.json'
}
done

could you please confirm that you have still have a problem.
//
Thanks

Hello, @adafee15, thanks for rising the issue.

I have tried to check with the lates version of the GVL https://vendor-list.consensu.org/v3/vendor-list.json running the following code snippet in ts-node. No issue found.

import gvlJson from './data/vendor-list.json';
import { GVL, VersionOrVendorList } from '@iabtechlabtcf/core';

const vendorListJson: VersionOrVendorList = gvlJson as unknown as VersionOrVendorList;

export const loadGVL = () => {
  const gvl = new GVL(vendorListJson);
  console.log(gvl.gvlSpecificationVersion);
  console.log(gvl.vendors[755]);
}

got the following output in the terminal

3
{
  id: 755,
  name: 'Google Advertising Products',
  purposes: [ 1, 3, 4 ],
  legIntPurposes: [ 2, 7, 9, 10 ],
  flexiblePurposes: [ 2, 7, 9, 10 ],
  specialPurposes: [ 1, 2 ],
  features: [ 1, 2 ],
  specialFeatures: [],
  cookieMaxAgeSeconds: 34190000,
  usesCookies: true,
  cookieRefresh: false,
  usesNonCookieAccess: true,
  dataRetention: {
    stdRetention: 548,
    purposes: { '3': 180, '4': 180 },
    specialPurposes: { '1': 1096 }
  },
  urls: [
    {
      langId: 'en',
      privacy: 'https://business.safety.google/privacy/',
      legIntClaim: 'https://policies.google.com/privacy#europeanrequirements'
    },
    {
      langId: 'bg',
      privacy: 'https://business.safety.google/intl/bg/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=bg#europeanrequirements'
    },
    {
      langId: 'cs',
      privacy: 'https://business.safety.google/intl/cs/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=cs#europeanrequirements'
    },
    {
      langId: 'da',
      privacy: 'https://business.safety.google/intl/da/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=da#europeanrequirements'
    },
    {
      langId: 'de',
      privacy: 'https://business.safety.google/intl/de/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=de#europeanrequirements'
    },
    {
      langId: 'el',
      privacy: 'https://business.safety.google/intl/el/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=el#europeanrequirements'
    },
    {
      langId: 'es',
      privacy: 'https://business.safety.google/intl/es/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=es#europeanrequirements'
    },
    {
      langId: 'et',
      privacy: 'https://business.safety.google/intl/et/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=et#europeanrequirements'
    },
    {
      langId: 'fi',
      privacy: 'https://business.safety.google/intl/fi/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=fi#europeanrequirements'
    },
    {
      langId: 'fr',
      privacy: 'https://business.safety.google/intl/fr/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=fr#europeanrequirements'
    },
    {
      langId: 'hr',
      privacy: 'https://business.safety.google/intl/hr/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=hr#europeanrequirements'
    },
    {
      langId: 'hu',
      privacy: 'https://business.safety.google/intl/hu/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=hu#europeanrequirements'
    },
    {
      langId: 'it',
      privacy: 'https://business.safety.google/intl/it/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=it#europeanrequirements'
    },
    {
      langId: 'lt',
      privacy: 'https://business.safety.google/intl/lt/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=lt#europeanrequirements'
    },
    {
      langId: 'lv',
      privacy: 'https://business.safety.google/intl/lv/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=lv#europeanrequirements'
    },
    {
      langId: 'nl',
      privacy: 'https://business.safety.google/intl/nl/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=nl#europeanrequirements'
    },
    {
      langId: 'no',
      privacy: 'https://business.safety.google/intl/no/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=no#europeanrequirements'
    },
    {
      langId: 'pl',
      privacy: 'https://business.safety.google/intl/pl/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=pl#europeanrequirements'
    },
    {
      langId: 'pt',
      privacy: 'https://business.safety.google/intl/pt-PT/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=pt-PT#europeanrequirements'
    },
    {
      langId: 'ro',
      privacy: 'https://business.safety.google/intl/ro/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=ro#europeanrequirements'
    },
    {
      langId: 'sk',
      privacy: 'https://business.safety.google/intl/sk/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=sk#europeanrequirements'
    },
    {
      langId: 'sl',
      privacy: 'https://business.safety.google/intl/sl/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=sl#europeanrequirements'
    },
    {
      langId: 'sv',
      privacy: 'https://business.safety.google/intl/sv/privacy/',
      legIntClaim: 'https://policies.google.com/privacy?hl=sv#europeanrequirements'
    }
  ],
  dataDeclaration: [
    1, 2,  3,  5, 6,
    7, 8, 10, 11
  ],
  deviceStorageDisclosureUrl: 'https://www.gstatic.com/iabtcf/deviceStorageDisclosure.json'
}
done

could you please confirm that you have still have a problem.
//
Thanks

Yes..please help mi...thanks

@adafee15 could you please test my code snippet with lates GVL v24 and send me error message that you are getting, thanks

import gvlJson from './data/vendor-list.json';
import { GVL, VersionOrVendorList } from '@iabtechlabtcf/core';

const vendorListJson: VersionOrVendorList = gvlJson as unknown as VersionOrVendorList;

export const loadGVL = () => {
  const gvl = new GVL(vendorListJson);
  console.log(gvl.gvlSpecificationVersion);
  console.log(gvl.vendors[755]);
}

Thank you for your reply. We are actually ended up using very similar code as you posted above (gvlJson as unknown as VersionOrVendorList) .

However, we would rather not cast gvlJson as unknown to do a double assertion as that is not a best practice. The underlying issue is that the Vendor Model is incorrect (legIntClaim needs to be optional under urls, and there may be another issue or two as well). Would it be possible to fix the inconsistencies between the vendor list and the Model so that we don't need to do a double assertion and can ensure type safety?

ok, makes sense, I agree, we need to improve the vendor model

Thank you!