Coder Social home page Coder Social logo

interactiveadvertisingbureau / iabtcf-es Goto Github PK

View Code? Open in Web Editor NEW
128.0 34.0 93.0 8.95 MB

Official compliant tool suite for implementing the Transparency and Consent Framework (TCF) v2.0. The essential toolkit for CMPs.

License: Apache License 2.0

JavaScript 2.88% TypeScript 96.61% Shell 0.51%
tcf cmps iab transparency consent-framework gdpr gdpr-compliant gdpr-consent cmp

iabtcf-es's Introduction

InteractiveAdvertisingBureau

@iabtechlabtcf

Official JavaScript / TypeScript compliant tool suite for implementing the Transparency and Consent Framework (TCF) v2.2. The essential toolkit for CMPs.

This is a mono repo containing 5 modules:

Core - For encoding/decoding TC strings and tools for handling the Global Vendor List (GVL).

CmpApi - CMP in-page API (__tcfapi()) tool that works with the core library.

cli - Tool to decode a TC string on the command line interface (cli).

Testing - Tools for testing the core library including random TCModel and GVL generators.

Stub - Code for the on-page __tcfapi() CMP stub.

Contributing

Here you can find the contributing guide to help maintain and update the library.

iabtcf-es's People

Contributors

aitnitishshelage avatar ccartesonetrust avatar chrispaterson avatar dependabot[bot] avatar dianejane avatar ghugues avatar heinzbaumann avatar henry-wu-ucfunnel avatar jofator avatar kemal-mustafic avatar kemalmustafic avatar kenario avatar marco-prontera avatar marliotto avatar matita avatar maxadv avatar mirkorean avatar ncolletti avatar nhagen avatar pgoforth avatar raquelyustemrf avatar rcrisial-intive avatar renebaudisch avatar samtingleff avatar sany1231 avatar sevriugin avatar sid1081 avatar sswayney avatar tla-sirdata avatar wittjill avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

iabtcf-es's Issues

Create ValidationErrors Class

Also, possibly create a base error class in core that all our errors can extend. That way we can easily catch only our errors and handle them in a simple way.

Can not set vendorListVersion on TCModel when GVL is loaded from JSON Object

At the moment, the only way to set the vendorListVersion property is to set it before the gvl property.

import { TCString, TCModel, GVL } from '@iabtcf/core';

const gvl = new GVL(vendorListObject);
const tcModel = new TCModel(gvl); // should not need to wait for readyPromise
tcModel.vendorListVersion = 42; // will not work
TCString.encode(tcModel); // throws TCModelError: invalid value 0 passed for vendorListVersion

My workaround:

import { TCString, TCModel, GVL } from '@iabtcf/core';

const gvl = new GVL(vendorListObject);
const tcModel = new TCModel();
tcModel.vendorListVersion = 42;
tcModel.gvl = gvl;
TCString.encode(tcModel);

I identified 2 problems:

This could be fixed by adding a if (gvl.readyPromise === undefined) {} in set gvl(). For example:

class TCModel {
    public set gvl(gvl: GVL) {

        /**
         * Set the reference but wait to see the other values for when the data populates
         */
        this.gvl_ = gvl;
        this.publisherRestrictions.gvl = gvl;
    
        if (gvl.readyPromise === undefined) {
            this.vendorListVersion_ = gvl.vendorListVersion;
            this.policyVersion_ = gvl.tcfPolicyVersion;
            this.consentLanguage_ = gvl.language;  
        } else {
            gvl.readyPromise.then((): void => {
    
                this.vendorListVersion_ = gvl.vendorListVersion;
                this.policyVersion_ = gvl.tcfPolicyVersion;
                this.consentLanguage_ = gvl.language;
          
            });
      
        }
    }
}

GVL Property Name Mismatch

Issue

The private function mapVendors() uses purposeIds, featureIds, and etc. starting from line 403 in GVL.ts, creating a mismatch with version 2 of the global vendor list found here: consensu vendor list.

Fix

Change name to match GVL.
Example: purposeIds -> purposes

Segment Refactor

Refactor the TCString class to use Segments instead of directly encoding and decoding the Core String.

Symbol polyfill is not added properly in IE 11 in cmpapi(beta.6)

Without including as package dependencies("es6-symbol": "3.1.3")
Seeing Symbol in not undefined in IE, When I try include cmpapi(beta.6).
image

Including as package dependencies("es6-symbol": "3.1.3")
After importing the symbol for IE, Seeing consent language is not initialized error when I set default 'EN' value
image

GVLError launching TCF2.0 string encoding js library

Dears,
we are getting some troubles using the js library for managing the TCF string 2.0.
We installed it straightforward using the suggested npm command:
npm install @iabtcf/core --save
Then we have included the js script in a page following the provided example:

import {TCModel, TCString, GVL} from '@iabtcf/core';

 

/**

 *  the IAB requires CMPs to host their own vendor-list.json files.  This must

 *  be set before creating any instance of the GVL class.

 */

GVL.baseURL = "./resources/vendor-list.json";

 

// create a new TC string

const tcModel = new TCModel(new GVL());

 

// Some fields will not be populated until a GVL is loaded

tcModel.gvl.readPromise.then(() => {

 

  // Set values on tcModel...

 

  const encodedString = TCString.encode(tcModel);

 

  console.log(encodedString); // TC string encoded begins with 'C'

 

})

// take an encoded TC string and decode into a TCModel

//const decodedTCModel = TCString.decode(encodedString);

but when we open the page with the embedded js we get the following error:

GVLError.ts:16 Uncaught GVLError: must specify GVL.baseUrl before loading GVL json

    at new t (http://localhost:1234/iabapi2test.e31bb0bc.js:130:481)

    at new t (http://localhost:1234/iabapi2test.e31bb0bc.js:226:736)

    at Object.parcelRequire.index.js.@iabtcf/core (http://localhost:1234/iabapi2test.e31bb0bc.js:248:33)

    at newRequire (http://localhost:1234/iabapi2test.e31bb0bc.js:47:24)

    at http://localhost:1234/iabapi2test.e31bb0bc.js:81:7

    at http://localhost:1234/iabapi2test.e31bb0bc.js:120:3

t @ GVLError.ts:16

t @ GVL.ts:248

parcelRequire.index.js.@iabtcf/core @ index.js:11

newRequire @ iabapi2test.e31bb0bc.js:47

(anonymous) @ iabapi2test.e31bb0bc.js:81

(anonymous) @ iabapi2test.e31bb0bc.js:120

We tried to change the value of GVL.baseURL to https://vendorlist.consensu.org/v2/vendor-list.json but the result was the same.

Do you have any suggestion for us?

Thanks for your kind support,
Luigi

getTCData TCData object does not have cmpStatus

Version
^1.0.0-beta.7

Module
cmpapi

Describe the bug
TCData object from getTCData call does not return cmpStatus
Screen Shot 2020-02-07 at 11 52 51 AM

From TCData

TCData = {
  tcString: 'base64url-encoded TC string with segments',
  tcfPolicyVersion: 2,
  cmpId:1000,
  cmpVersion: 1000,
  .......
  /**
   * see Ping Status Codes in following table
   */
  cmpStatus: 'string',

Steps to Reproduce

  1. Create tcModel and assign to CmpApi.
const decodedTCModel = TCString.decode(data.cookie);
cmpApi.tcModel = decodedTCModel;
  1. Call getTCData and check tcData object.
__tcfapi('getTCData', 2, (tcData, success) =>  {
    if (success) {
        console.log(`success: ${success}`);
        console.log({tcData});window.tcData = tcData;
    }else {
        console.log(`success: ${success}`);
    }
})

Expected behavior
tcData should have cmpStatus.

Actual behavior
tcData does not have cmpStatus.

TCString from getTCData does not match TCString used to decode TCModel

Version
1.0.0-beta.7

Module
cmpapi

Describe the bug
TCString from getTCData's TCData does not match TCString used to decode TCModel

Steps to Reproduce

  1. Create TCModel from cookie using TCString.decode
  2. Assign TCModel object to CmpApi.tcModel
    code used here:
const decodedTCModel = TCString.decode(data.cookie);
cmpApi.tcModel = decodedTCModel;
__tcfapi('getTCData', 2, (tcData, success) =>  {
    if (success) {
        console.log(`From cookie: ${data.cookie}`);
        console.log(`From TCData: ${tcData.tcString}`);
        console.log(`isEqual${tcData.tcString == data.cookie}`);
        console.log({tcData});
        window.tcData = tcData;
    }
});

Expected behavior
TCData.tcString from getTCData should match string used in TCString.decode.

Actual behavior
TCData.tcString from getTCData does not match string used in TCString.decode.
Specifically language part of the string turned into 'EN'.

tcstring-issue

Unable to set consentlanguage and missing symbol polyfill in IE

Facing below issues on IE11

  1. When I try set the default consent language 'EN', I am getting unhandled promise rejection error.
  2. Symbol, Number.isInteger polyfill are not added for IE.
  3. I see below Circular dependencies error call stack:
    Circular dependency: node_modules\@iabtcf\core\lib\encoder\index.js -> node_modules\@iabtcf\core\lib\encoder\field\index.js -> node_modules\@iabtcf\core\lib\encoder\field\FieldEncoderMap.js -> node_modules\@iabtcf\core\lib\encoder\field\VendorVectorEncoder.js -> node_modules\@iabtcf\core\lib\encoder\index.js Circular dependency: node_modules\@iabtcf\core\lib\encoder\index.js -> node_modules\@iabtcf\core\lib\encoder\field\index.js -> node_modules\@iabtcf\core\lib\encoder\field\FieldEncoderMap.js -> node_modules\@iabtcf\core\lib\encoder\field\VendorVectorEncoder.js -> commonjs-proxy:d:\workspace\banner-script\node_modules\@iabtcf\core\lib\encoder\index.js -> node_modules\@iabtcf\core\lib\encoder\index.js

Legitimate Interest for Special Purpose

Where is the consent for Special Purposes stored in the TCModel? I can only find properties for Purpose Consent and LegInt Purposes, but not for Special Purposes.

I might be missunderstanding the concept of Special Purposes. Appreciate any hint.

Bitlength and Fields have Discrepancy regarding a field name i.e. PublisherConsents

While encoding or decoding the Publisher TC Section, when we are trying to fetch the Bitlength for PublisherConsent section, the same field is named differently in Bitlength class and that is creating the issue.
For reference:-
In master branch

public static readonly publisherPurposeConsents: number = 24;

public static readonly publisherConsents: string = 'publisherConsents';

Wrong PingReturn.cmpStatus while stub is serving ping command.

Version
1.0.0-beta.7

Module
stub

Describe the bug
Wrong cmpStatus with value stubCMP returned on PingReturn when stub is still in place (CMP API not loaded yet).

Steps to Reproduce
This is corrected CmpApi.test.ts test which should fail:

  const assertStub = (): void => {
    expect(window[API_FUNCTION_NAME], `window.${API_FUNCTION_NAME} while stub`).to.be.a('function');
    window[API_FUNCTION_NAME]('ping', 2, (ping: Ping): void => {
      expect(ping.cmpStatus, 'ping.cmpStatus with stub').to.equal('stub');
    });
  };

Expected behavior
PingReturn.cmpStatus should return stub while stub is executing ping command.

Actual behavior
PingReturn.cmpStatus returns stubCMP while stub is executing ping command.

No BitLength Definition of publisherConsents

When encoding and decoding the Publisher TC Section, we found there is no Bitlength definition of publisherConsents field.

It seems that this issue is related to the incorrect fix of issue: #45

public static readonly [Fields.publisherLegitimateInterest]: number = 24;
public static readonly [Fields.purposeConsents]: number = 24;
public static readonly [Fields.purposeLegitimateInterest]: number = 24;

The line defining Bitlength of publisherConsents is missing.

Event listeners are not triggering back when consent is changed.

Event listeners are not triggering back when consent is changed due to scope issue.
On consent change, when executeCommands functions runs then this.callbacks is undefined since it's holding the reference of cmpApi class instead having the reference to EventListenerQueue class.

PingReturn apiVersion returns number instead of string

Version
1.0.0-beta.7

Module
cmpapi

Describe the bug
apiVersion in PingReturn is number.

Steps to Reproduce
Call ping:

__tcfapi('ping', 2, (pingReturn) => {
  console.log(pingReturn);
});

See apiVersion value.

Expected behavior
From PingReturn

 /**
   * version of the CMP API that is supported, e.g. "2.0"
   */
  apiVersion: String,

Actual behavior
apiVersion is a number.
Screen Shot 2020-02-07 at 3 00 49 PM

Core TC String: no default value bit in actual iab spec

Hi,

I'm a java backend developer working for a german company. We need to read values from tc-strings generated by this library. Therefore I found (maybe) an issue. I hope you could help me with.

So here is the case:
My frontend colleague has generated a tc-string for me with this library using the master branch. I tried to read it according to the iab spec (IAB Transparency and Consent String with Global Vendor List Format). My code failed to parse the tc-string, so I decoded it manually and interpreted the bits according to spec. The bits were somewhat weird after "IsRangeEncoding" part (I got vendor id's above 32000).
So we did our test vice versa. I generated a tc-string and gave it to my frontend colleague to parse it with this library. This test also failed, so we compared the two implementations (Java/Javascript).

We found in iabtcf/modules/core/src/encoder/field/VendorVectorEncoder.ts at line 92 that 1 bit for a default value is read (after reading the "IsRangeEncoding" part). In the iab spec there is no default value to set or read after "IsRangeEncoding" - so my java code hasn't read this 1 bit value and the parsed values were wrong.

Could you please check if reading or setting the default value is wrong or if the spec lacks this value?

Many thanks in advance,
Antje Rose

Can I avoid retrieving older versions of vendor list?

Hi all,

From Global vendor list

Where ‘vendor-list-version’ corresponds to the ‘vendorListVersion’ property in the GVL, for example, the following URL would retrieve the GVL update published with version 138

https://vendorlist.consensu.org/v2/archives/vendor-list-v138.json

Previous versions of the GVL may only be used in cases when the current version cannot be downloaded (such as when operating in-app while offline), or for change control management.

With CmpApi tool, this call happens automatically but can I configure the API to not retrieve the older version of the list? Or is this something that's required?

ES6 code in compiled package

I have a Webpack project set up and when I import the CmpApi from node_modules babel throws errors on spread operators. As far as I know projects should exclude /node_modules/ from compiling with babel so external modules are required to be already compiled to ES2015.

ERROR in ./node_modules/@iabtcf/cmpapi/lib/command/responsebuilders/ResponseBuilder.js Module parse failed: Unexpected token (5:17) You may need an appropriate loader to handle this file type. | class ResponseBuilder { | buildResponse() { | return { ...this }; | } | } @ ./node_modules/@iabtcf/cmpapi/lib/command/responsebuilders/TCDataBldr.js 5:26-54 @ ./node_modules/@iabtcf/cmpapi/lib/command/responsebuilders/index.js @ ./node_modules/@iabtcf/cmpapi/lib/command/commands/GetInAppTcDataCommand.js @ ./node_modules/@iabtcf/cmpapi/lib/command/commands/index.js @ ./node_modules/@iabtcf/cmpapi/lib/command/CommandStream.js @ ./node_modules/@iabtcf/cmpapi/lib/command/index.js @ ./node_modules/@iabtcf/cmpapi/lib/CmpApi.js @ ./node_modules/@iabtcf/cmpapi/lib/index.js @ ./src/cmp/Cmp.jsx @ ./src/cmp/index.js @ multi (webpack)-dev-server/client?http://localhost:5003 webpack/hot/dev-server ./cmp/index.js

.babelrc:
{ "sourceMaps": true, "presets": [ [ "es2015", { "loose": true } ], "stage-0" ], "plugins": [ [ "transform-decorators-legacy" ], [ "transform-react-jsx", { "pragma": "h" } ], [ "transform-object-assign" ], "transform-object-rest-spread", [ "transform-runtime", { "regenerator": true, "polyfill": true, "helpers": true } ] ] }

webpack.config.babel.js:
... { test: /\.jsx?$/, exclude: /node_modules/, use: 'babel-loader' }, ...

Polyfills for Symbol, Set are not added for IE 11 and responseType for JSON is not supported

Version
1.0.0-beta.7

Module
cmpapi and core

Describe the bug

  1. With the latest update still facing same issue 'Symbol'. I think previous fix of lib config in tsconfig wont add any pollyfills it just wont complain ES5 syntax. We need use transpiler for this

Please find below screen shot
image

  1. Set is partially supported in IE. It doesn't iterator syntax like new Set([1,2,3]) and add method is not supported.
    image

  2. Response type won't available in IE 11 (JSON.js in core)
    image

Consented purposes/ Special features in the tcData object returning as empty object rather having false value when consent is not given

According to the documentation: https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md#getinapptcdata
When consent is not given, tcData object should return false value but it returns empty object or sometimes consent for only few purposes based on the selection. So the response of the Api's is not consistent across all the conditions.
Please find below screen shot:
image

In this vendorConsent object is empty object and disclosedVendor is a object. Below is the response for mobile API, which is empty string but the consent should be based on bit position.
image

getTCData result in null TCData if GDPRApplies is false

Hi I'm using CmpApi tool. I've followed the following instructions when GDPRApplies is false:
@iabtcf/cmpapi

In the case that GDPR does not apply, simply set the TCModel to null. That's all.

When I'm calling getTCData it returns TCData: null and success: false.

But in the documentation it says:
getTCData

If GDPR does not apply to this user in this context (gdprApplies=false) then this user will have no Transparency and Consent values and a TCData object with no Transparency and Consent values for any Vendors will be passed to the callback function.

TCData

If GDPR does not apply to this user in this context then only gdprApplies, tcfPolicyVersion, cmpId and cmpVersion shall exist in the object.

How would I go about returning only gdprApplies, tcfPolicyVersion, cmpId and cmpVersion values instead of null for this use-case?

Common property's types differ when comparing default GVL and translations.

I noticed that typing of common properties in GVL and translations differ.

Here's an example:
GVL url: https://vendorlist.consensu.org/v2/vendor-list.json
Translations url: https://vendorlist.consensu.org/v2/purposes-fr.json

If you compare types of objects in purposes, specialPurposes, features, specialFeatures and stacks you can see that in GVL those properties are maps while in translation files they are provided as arrays.

GVL purposes:

"purposes": {
    "1": {
        "id": 1,
        "name": "Store and/or access information on a device",
        "description": "Cookies, device identifiers, or other information can be stored or accessed on your device for the purposes presented to you.",
        "descriptionLegal": "Vendors can:\n* Store and access information on the device such as cookies and device identifiers presented to a user."
    },
    ...
}

Translated purposes:

"purposes": [
    {
        "1": {
            "id": 1,
            "name": "Stocker et/ou accéder à des informations stockées sur un terminal",
            "description": "Les cookies, identifiants de votre terminal ou autres informations peuvent être stockés ou consultés sur votre terminal pour les finalités qui vous sont présentées.",
            "descriptionLegal": "Les partenaires peuvent :\n* Stocker des informations et accéder à des informations stockées sur le terminal, comme les cookies et les identifiants du terminal présentés à un utilisateur.\n"
        }
    },
    ...
]

I'm writing this because API becomes inconsistent if you're changing the language.

So if you're using default language GVL, you have purposes as maps while if you change lanugage with changeLanguage, purposes become arrays.

I would recommend to unify this format (and always use IntMap), otherwise it's inconsistent and can provide you with wrong information (e.g.: fetching with [id] returns the results both for maps and array but the result differs).

Here's a sample of runnable code exposing this issue:

import { GVL } from '@iabtcf/core';
GVL.baseUrl = "http://cmp.mysupercoolcmp.com/";
let gvl = new GVL();
gvl.readyPromise.then(() =>{
    console.log("Purpose one from default GVL: ", gvl.purposes[1]);
    gvl.changeLanguage("fr").then(() => {
       console.log("Purpose one from translations: ", gvl.purposes[1]) ;
    });
});

P.S.: I would also mention that provided link in documentation is pointing to translations of TCF v1.1 framework and not to translations for v2.0 (For the full list of iab provided language translations click here. section of documentation).

Lots of circular dependencies in package

Hello all- having installed this package in an existing product, when I run my production build it's flagging a large number of circular dependencies in the iabtcf package. Here's a list of them for your reference:

Circular dependency: node_modules/@iabtcf/core/lib/model/index.js -> node_modules/@iabtcf/core/lib/model/PurposeRestrictionVector.js -> node_modules/@iabtcf/core/lib/model/index.js
Circular dependency: node_modules/@iabtcf/core/lib/model/index.js -> node_modules/@iabtcf/core/lib/model/PurposeRestrictionVector.js -> commonjs-proxy:/Users/briankelly/Documents/projects/cookie-banner-sdk/node_modules/@iabtcf/core/lib/model/index.js -> node_modules/@iabtcf/core/lib/model/index.js
Circular dependency: node_modules/@iabtcf/core/lib/encoder/index.js -> node_modules/@iabtcf/core/lib/encoder/CoreTCEncoder.js -> node_modules/@iabtcf/core/lib/encoder/index.js
Circular dependency: node_modules/@iabtcf/core/lib/encoder/index.js -> node_modules/@iabtcf/core/lib/encoder/CoreTCEncoder.js -> commonjs-proxy:/Users/briankelly/Documents/projects/cookie-banner-sdk/node_modules/@iabtcf/core/lib/encoder/index.js -> node_modules/@iabtcf/core/lib/encoder/index.js
Circular dependency: node_modules/@iabtcf/core/lib/encoder/index.js -> node_modules/@iabtcf/core/lib/encoder/DateEncoder.js -> node_modules/@iabtcf/core/lib/encoder/index.js
Circular dependency: node_modules/@iabtcf/core/lib/encoder/index.js -> node_modules/@iabtcf/core/lib/encoder/EncoderMap.js -> node_modules/@iabtcf/core/lib/encoder/index.js
Circular dependency: node_modules/@iabtcf/core/lib/encoder/index.js -> node_modules/@iabtcf/core/lib/encoder/FixedVectorEncoder.js -> node_modules/@iabtcf/core/lib/encoder/index.js
Circular dependency: node_modules/@iabtcf/core/lib/encoder/index.js -> node_modules/@iabtcf/core/lib/encoder/LangEncoder.js -> node_modules/@iabtcf/core/lib/encoder/index.js
Circular dependency: node_modules/@iabtcf/core/lib/encoder/index.js -> node_modules/@iabtcf/core/lib/encoder/PurposeRestrictionVectorEncoder.js -> node_modules/@iabtcf/core/lib/encoder/index.js
Circular dependency: node_modules/@iabtcf/core/lib/encoder/index.js -> node_modules/@iabtcf/core/lib/encoder/SegmentEncoderMap.js -> node_modules/@iabtcf/core/lib/encoder/index.js
Circular dependency: node_modules/@iabtcf/core/lib/encoder/index.js -> node_modules/@iabtcf/core/lib/encoder/VendorVectorEncoder.js -> node_modules/@iabtcf/core/lib/encoder/index.js
Circular dependency: node_modules/@iabtcf/core/lib/encoder/index.js -> node_modules/@iabtcf/core/lib/encoder/VendorsDisclosedEncoder.js -> node_modules/@iabtcf/core/lib/encoder/index.js
Circular dependency: node_modules/@iabtcf/core/lib/encoder/index.js -> node_modules/@iabtcf/core/lib/encoder/VendorsAllowedEncoder.js -> node_modules/@iabtcf/core/lib/encoder/index.js
Circular dependency: node_modules/@iabtcf/core/lib/encoder/index.js -> node_modules/@iabtcf/core/lib/encoder/PublisherTCEncoder.js -> node_modules/@iabtcf/core/lib/encoder/index.js

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.