iubenda-consent-solution-api
Advanced tools
Comparing version 0.1.1 to 0.1.2
@@ -1,5 +0,216 @@ | ||
import { ConsentExtended, ConsentPostResponse, ConsentResponse, ConsentsQueryParameters } from '~/consent'; | ||
import { Subject, SubjectPostResponse, SubjectQueryParameters, SubjectResponse } from '~/subject'; | ||
export * from '~/consent'; | ||
export * from '~/subject'; | ||
export interface ConsentsQueryParameters { | ||
/** | ||
* Filter by consents timestamp. Returns all consents from that time onward (inclusive). Valid formats: 2018-02-22 00:40:00 UTC, 2018-02-22T00:40:00Z (ISO 8601), 1519260000 (unix timestamp in seconds). | ||
*/ | ||
from_time?: string; | ||
/** | ||
* Filter by consents timestamp. Returns all consents from that time backward (inclusive). Valid formats: 2018-02-22 00:40:00 UTC, 2018-02-22T00:40:00Z (ISO 8601), 1519260000 (unix timestamp in seconds). | ||
*/ | ||
to_time?: string; | ||
/** | ||
* Filter by consents source. Possible values: public, private. | ||
*/ | ||
source?: ['public', 'private']; | ||
/** | ||
* Filter by IP address. Default null. Valid formats (IP address format). | ||
*/ | ||
ip_address?: string; | ||
/** | ||
* Filter by consents type. By not passing this value it returns all consents. Possible values: cookie_policy, null. Default not passed. | ||
*/ | ||
consent_type?: string; | ||
/** | ||
* Filter by Subject ID. | ||
*/ | ||
subject_id?: string; | ||
/** | ||
* Filter by Subject email. It must exactly match (case sensitive). | ||
*/ | ||
subject_email_exact?: string; | ||
/** | ||
* Filter by Subject email. It tries to match parts of the provided email split by dots and spaces. Ex. providing “@test.com” will match all the subjects with an email containing “@test” or containing “com” (case insensitive). | ||
*/ | ||
subject_email?: string; | ||
/** | ||
* Filter by Subject first name. It must exactly match (case sensitive). | ||
*/ | ||
subject_first_name?: string; | ||
/** | ||
* Filter by Subject last name. It must exactly match (case sensitive). | ||
*/ | ||
subject_last_name?: string; | ||
/** | ||
* Filter by Subject full name. It tries to match parts of the provided full name split by dots and spaces. Ex. “test hello” will match all the subjects with a full name containing “test” or containing “hello” (case insensitive). | ||
*/ | ||
subject_full_name?: string; | ||
/** | ||
* Filter by subject verified status. Possible values: true, false. | ||
*/ | ||
subject_verified?: boolean; | ||
/** | ||
* Filter for consents in which the key exists. | ||
*/ | ||
preference_key?: string; | ||
/** | ||
* Filters for results with the value provided being contained in either subject’s id, first_name, last_name, full_name, email. | ||
*/ | ||
fulltext?: string; | ||
/** | ||
* Cursor which indicates after which Consent the results should be returned (cursor excluded). | ||
*/ | ||
starting_after?: string; | ||
/** | ||
* Number indicating the number of results returned. Min: 1, Max: 100. Default 10. | ||
*/ | ||
limit?: number; | ||
} | ||
export interface Consent { | ||
/** | ||
* auto-filled if not provided, ISO 8601 timestamp at which the consent occurred | ||
*/ | ||
timestamp?: string; | ||
checksum?: string; | ||
subject?: ConsentSubject; | ||
/** | ||
* Set of key-value pairs with user preferences for the consent action | ||
*/ | ||
preferences?: ConsentPreferences; | ||
/** | ||
* Considered only when using a `private` key. Saves the passed IP address on the Consent. Default null | ||
*/ | ||
ip_address?: null; | ||
/** | ||
* Default `true`, Considered only when using a `public` key. Enables or disables (true, false) the IP address autedetection. Default true | ||
*/ | ||
autodetect_ip_address: string; | ||
} | ||
export interface ConsentExtended extends Consent { | ||
legal_notices?: (ConsentLegalNoticesEntity)[] | null; | ||
proofs?: (ConsentProofsEntity)[] | null; | ||
} | ||
export interface ConsentResponse extends Consent { | ||
/** | ||
* Optional, auto-filled if not provided | ||
*/ | ||
id: string; | ||
owner: string; | ||
source: string; | ||
} | ||
export interface ConsentPostResponse extends Consent { | ||
id: string; | ||
timestamp: string; | ||
subject_id: string; | ||
} | ||
export interface ConsentSubject { | ||
/** | ||
* Optional, auto-filled if not provided | ||
*/ | ||
id?: string; | ||
owner_id?: string; | ||
email?: string; | ||
first_name?: string; | ||
last_name?: string; | ||
/** | ||
* Reserved field used to signal whether a subject is verified, for instance via the double opt-in method | ||
*/ | ||
verified?: boolean; | ||
} | ||
export interface ConsentPreferences { | ||
[key: string]: string; | ||
} | ||
export interface ConsentLegalNoticesEntity { | ||
/** | ||
* privacy_policy, cookie_policy, term or a custom identifier | ||
*/ | ||
identifier: string; | ||
/** | ||
* Optional, auto-filled if not provided | ||
*/ | ||
version: string; | ||
} | ||
export interface ConsentProofsEntity { | ||
content: string; | ||
form: string; | ||
} | ||
export interface SubjectQueryParameters { | ||
/** | ||
* Filter by id. It must exactly match. Default null | ||
*/ | ||
id: string; | ||
/** | ||
* Filter by owner_id. It must exactly match. Default null | ||
*/ | ||
owner_id: string; | ||
/** | ||
* Filter by email. It must exactly match (case sensitive). Default null | ||
*/ | ||
email_exact: string; | ||
/** | ||
* Filter by email. It tries to match parts of the provided email split by dots and spaces. Ex. providing “@test.com” will match all the subjects with an email containing “@test” or containing “com” (case insensitive). Default null | ||
*/ | ||
email: string; | ||
/** | ||
* Filter by first name. It must exactly match (case sensitive). Default null | ||
*/ | ||
first_name: string; | ||
/** | ||
* Filter by last name. It must exactly match (case sensitive). Default null | ||
*/ | ||
last_name: string; | ||
/** | ||
* Filter by full name. It tries to match parts of the provided full name split by dots and spaces. Ex. “test hello” will match all the subjects with a full name containing “test” or containing “hello” (case insensitive). Default null | ||
*/ | ||
full_name: string; | ||
/** | ||
* Filter by subjects timestamp. Returns all subjects from that time onward (inclusive). Valid formats: 2018-02-22 00:40:00 UTC, 2018-02-22T00:40:00Z (ISO 8601), 1519260000 (unix timestamp in seconds). Default null | ||
*/ | ||
from_time: string; | ||
/** | ||
* Filter by subjects timestamp. Returns all subjects from that time backward (inclusive). Valid formats: 2018-02-22 00:40:00 UTC, 2018-02-22T00:40:00Z (ISO 8601), 1519260000 (unix timestamp in seconds). Default null | ||
*/ | ||
to_time: string; | ||
/** | ||
* Filter by verified status. Possible values: true, false. Default null | ||
*/ | ||
verified: boolean; | ||
/** | ||
* Filters for results with the value provided being contained in either id, first_name, last_name, full_name, email. Default null | ||
*/ | ||
fulltext: string; | ||
/** | ||
* Cursor which indicates after which Subject the results should be returned (cursor excluded). Default null | ||
*/ | ||
starting_after: string; | ||
/** | ||
* Number indicating the number of results returned. Min: 1, Max: 101. Default 10 | ||
*/ | ||
limit: number; | ||
} | ||
export interface Subject { | ||
/** | ||
* Optional, auto-filled if not provided | ||
*/ | ||
id?: string; | ||
email?: string; | ||
first_name?: string; | ||
last_name?: string; | ||
full_name?: string; | ||
verified?: boolean; | ||
} | ||
export interface SubjectResponse extends Subject { | ||
owner_id: string; | ||
preferences?: SubjectPreferences; | ||
timestamp: string; | ||
} | ||
export interface SubjectPreferences { | ||
[key: string]: Preference; | ||
} | ||
export interface Preference { | ||
value: boolean; | ||
consent_id: string; | ||
} | ||
export interface SubjectPostResponse { | ||
id: string; | ||
timestamp: string; | ||
} | ||
export interface ResponseError { | ||
@@ -23,3 +234,3 @@ error: boolean; | ||
private generateUrl; | ||
private sendRequest; | ||
private static sendRequest; | ||
getConsents(query?: ConsentsQueryParameters): Promise<ResponseError | ConsentResponse[]>; | ||
@@ -26,0 +237,0 @@ getConsent(id: string): Promise<ResponseError | ConsentExtended>; |
"use strict"; | ||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | ||
}) : (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
o[k2] = m[k]; | ||
})); | ||
var __exportStar = (this && this.__exportStar) || function(m, exports) { | ||
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); | ||
}; | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
@@ -51,4 +41,2 @@ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
var superagent_1 = require("superagent"); | ||
__exportStar(require("./consent"), exports); | ||
__exportStar(require("./subject"), exports); | ||
var IubendaConsentSolution = /** @class */ (function () { | ||
@@ -79,3 +67,3 @@ function IubendaConsentSolution(options) { | ||
}; | ||
IubendaConsentSolution.prototype.sendRequest = function (request) { | ||
IubendaConsentSolution.sendRequest = function (request) { | ||
return __awaiter(this, void 0, void 0, function () { | ||
@@ -109,3 +97,3 @@ var response; | ||
} | ||
return [4 /*yield*/, this.sendRequest(req)]; | ||
return [4 /*yield*/, IubendaConsentSolution.sendRequest(req)]; | ||
case 1: return [2 /*return*/, _a.sent()]; | ||
@@ -120,3 +108,3 @@ } | ||
switch (_a.label) { | ||
case 0: return [4 /*yield*/, this.sendRequest(this.addHeaders((0, superagent_1.get)(this.generateUrl('consent/' + id))))]; | ||
case 0: return [4 /*yield*/, IubendaConsentSolution.sendRequest(this.addHeaders((0, superagent_1.get)(this.generateUrl('consent/' + id))))]; | ||
case 1: return [2 /*return*/, _a.sent()]; | ||
@@ -129,9 +117,9 @@ } | ||
return __awaiter(this, void 0, void 0, function () { | ||
var _a; | ||
return __generator(this, function (_b) { | ||
switch (_b.label) { | ||
var _a, _b; | ||
return __generator(this, function (_c) { | ||
switch (_c.label) { | ||
case 0: | ||
_a = this.sendRequest; | ||
return [4 /*yield*/, this.sendRequest(this.addHeaders((0, superagent_1.post)(this.generateUrl('consent')).send(consent)))]; | ||
case 1: return [2 /*return*/, _a.apply(this, [_b.sent()])]; | ||
_b = (_a = IubendaConsentSolution).sendRequest; | ||
return [4 /*yield*/, IubendaConsentSolution.sendRequest(this.addHeaders((0, superagent_1.post)(this.generateUrl('consent')).send(consent)))]; | ||
case 1: return [2 /*return*/, _b.apply(_a, [_c.sent()])]; | ||
} | ||
@@ -151,3 +139,3 @@ }); | ||
} | ||
return [4 /*yield*/, this.sendRequest(req)]; | ||
return [4 /*yield*/, IubendaConsentSolution.sendRequest(req)]; | ||
case 1: return [2 /*return*/, _a.sent()]; | ||
@@ -165,3 +153,3 @@ } | ||
req = this.addHeaders((0, superagent_1.get)(this.generateUrl('subjects/' + id))); | ||
return [4 /*yield*/, this.sendRequest(req)]; | ||
return [4 /*yield*/, IubendaConsentSolution.sendRequest(req)]; | ||
case 1: return [2 /*return*/, _a.sent()]; | ||
@@ -179,3 +167,3 @@ } | ||
req = this.addHeaders((0, superagent_1.post)(this.generateUrl('subjects')).send(subject)); | ||
return [4 /*yield*/, this.sendRequest(req)]; | ||
return [4 /*yield*/, IubendaConsentSolution.sendRequest(req)]; | ||
case 1: return [2 /*return*/, _a.sent()]; | ||
@@ -193,3 +181,3 @@ } | ||
req = this.addHeaders((0, superagent_1.put)(this.generateUrl('subjects/' + id)).send(subject)); | ||
return [4 /*yield*/, this.sendRequest(req)]; | ||
return [4 /*yield*/, IubendaConsentSolution.sendRequest(req)]; | ||
case 1: return [2 /*return*/, _a.sent()]; | ||
@@ -196,0 +184,0 @@ } |
{ | ||
"name": "iubenda-consent-solution-api", | ||
"version": "0.1.1", | ||
"version": "0.1.2", | ||
"description": "API client to implement Iubenda Consent Solution in backend service", | ||
@@ -5,0 +5,0 @@ "main": "dist/index.js", |
import {expect} from 'chai'; | ||
import {IubendaConsentSolution} from '~/index'; | ||
const validApiKey = process.env.API_KEY||'YOUR-VALID-IUBENDA-API-KEY'; | ||
const validApiKey = process.env.API_KEY || 'YOUR-VALID-IUBENDA-API-KEY'; | ||
const invalidApiKey = 'invalid'; | ||
@@ -6,0 +6,0 @@ |
255
src/index.ts
import {get, post, put, SuperAgentRequest} from 'superagent'; | ||
import {ConsentExtended, ConsentPostResponse, ConsentResponse, ConsentsQueryParameters} from '~/consent'; | ||
import {Subject, SubjectPostResponse, SubjectQueryParameters, SubjectResponse} from '~/subject'; | ||
export * from '~/consent'; | ||
export * from '~/subject'; | ||
//region consent | ||
export interface ConsentsQueryParameters { | ||
/** | ||
* Filter by consents timestamp. Returns all consents from that time onward (inclusive). Valid formats: 2018-02-22 00:40:00 UTC, 2018-02-22T00:40:00Z (ISO 8601), 1519260000 (unix timestamp in seconds). | ||
*/ | ||
from_time?: string; | ||
/** | ||
* Filter by consents timestamp. Returns all consents from that time backward (inclusive). Valid formats: 2018-02-22 00:40:00 UTC, 2018-02-22T00:40:00Z (ISO 8601), 1519260000 (unix timestamp in seconds). | ||
*/ | ||
to_time?: string; | ||
/** | ||
* Filter by consents source. Possible values: public, private. | ||
*/ | ||
source?: ['public', 'private']; | ||
/** | ||
* Filter by IP address. Default null. Valid formats (IP address format). | ||
*/ | ||
ip_address?: string; | ||
/** | ||
* Filter by consents type. By not passing this value it returns all consents. Possible values: cookie_policy, null. Default not passed. | ||
*/ | ||
consent_type?: string; | ||
/** | ||
* Filter by Subject ID. | ||
*/ | ||
subject_id?: string; | ||
/** | ||
* Filter by Subject email. It must exactly match (case sensitive). | ||
*/ | ||
subject_email_exact?: string; | ||
/** | ||
* Filter by Subject email. It tries to match parts of the provided email split by dots and spaces. Ex. providing “@test.com” will match all the subjects with an email containing “@test” or containing “com” (case insensitive). | ||
*/ | ||
subject_email?: string; | ||
/** | ||
* Filter by Subject first name. It must exactly match (case sensitive). | ||
*/ | ||
subject_first_name?: string; | ||
/** | ||
* Filter by Subject last name. It must exactly match (case sensitive). | ||
*/ | ||
subject_last_name?: string; | ||
/** | ||
* Filter by Subject full name. It tries to match parts of the provided full name split by dots and spaces. Ex. “test hello” will match all the subjects with a full name containing “test” or containing “hello” (case insensitive). | ||
*/ | ||
subject_full_name?: string; | ||
/** | ||
* Filter by subject verified status. Possible values: true, false. | ||
*/ | ||
subject_verified?: boolean; | ||
/** | ||
* Filter for consents in which the key exists. | ||
*/ | ||
preference_key?: string; | ||
/** | ||
* Filters for results with the value provided being contained in either subject’s id, first_name, last_name, full_name, email. | ||
*/ | ||
fulltext?: string; | ||
/** | ||
* Cursor which indicates after which Consent the results should be returned (cursor excluded). | ||
*/ | ||
starting_after?: string; | ||
/** | ||
* Number indicating the number of results returned. Min: 1, Max: 100. Default 10. | ||
*/ | ||
limit?: number; | ||
} | ||
export interface Consent { | ||
/** | ||
* auto-filled if not provided, ISO 8601 timestamp at which the consent occurred | ||
*/ | ||
timestamp?: string; | ||
checksum?: string; | ||
subject?: ConsentSubject; | ||
/** | ||
* Set of key-value pairs with user preferences for the consent action | ||
*/ | ||
preferences?: ConsentPreferences; | ||
/** | ||
* Considered only when using a `private` key. Saves the passed IP address on the Consent. Default null | ||
*/ | ||
ip_address?: null; | ||
/** | ||
* Default `true`, Considered only when using a `public` key. Enables or disables (true, false) the IP address autedetection. Default true | ||
*/ | ||
autodetect_ip_address: string; | ||
} | ||
export interface ConsentExtended extends Consent { | ||
legal_notices?: (ConsentLegalNoticesEntity)[] | null; | ||
proofs?: (ConsentProofsEntity)[] | null; | ||
} | ||
export interface ConsentResponse extends Consent { | ||
/** | ||
* Optional, auto-filled if not provided | ||
*/ | ||
id: string; | ||
owner: string; | ||
source: string; | ||
} | ||
export interface ConsentPostResponse extends Consent { | ||
id: string; | ||
timestamp: string; | ||
subject_id: string; | ||
} | ||
export interface ConsentSubject { | ||
/** | ||
* Optional, auto-filled if not provided | ||
*/ | ||
id?: string; | ||
owner_id?: string; | ||
email?: string; | ||
first_name?: string; | ||
last_name?: string; | ||
/** | ||
* Reserved field used to signal whether a subject is verified, for instance via the double opt-in method | ||
*/ | ||
verified?: boolean; | ||
} | ||
export interface ConsentPreferences { | ||
[key: string]: string; | ||
} | ||
export interface ConsentLegalNoticesEntity { | ||
/** | ||
* privacy_policy, cookie_policy, term or a custom identifier | ||
*/ | ||
identifier: string; | ||
/** | ||
* Optional, auto-filled if not provided | ||
*/ | ||
version: string; | ||
} | ||
export interface ConsentProofsEntity { | ||
content: string; | ||
form: string; | ||
} | ||
//endregion | ||
//region subject | ||
export interface SubjectQueryParameters { | ||
/** | ||
* Filter by id. It must exactly match. Default null | ||
*/ | ||
id: string; | ||
/** | ||
* Filter by owner_id. It must exactly match. Default null | ||
*/ | ||
owner_id: string; | ||
/** | ||
* Filter by email. It must exactly match (case sensitive). Default null | ||
*/ | ||
email_exact: string; | ||
/** | ||
* Filter by email. It tries to match parts of the provided email split by dots and spaces. Ex. providing “@test.com” will match all the subjects with an email containing “@test” or containing “com” (case insensitive). Default null | ||
*/ | ||
email: string; | ||
/** | ||
* Filter by first name. It must exactly match (case sensitive). Default null | ||
*/ | ||
first_name: string; | ||
/** | ||
* Filter by last name. It must exactly match (case sensitive). Default null | ||
*/ | ||
last_name: string; | ||
/** | ||
* Filter by full name. It tries to match parts of the provided full name split by dots and spaces. Ex. “test hello” will match all the subjects with a full name containing “test” or containing “hello” (case insensitive). Default null | ||
*/ | ||
full_name: string; | ||
/** | ||
* Filter by subjects timestamp. Returns all subjects from that time onward (inclusive). Valid formats: 2018-02-22 00:40:00 UTC, 2018-02-22T00:40:00Z (ISO 8601), 1519260000 (unix timestamp in seconds). Default null | ||
*/ | ||
from_time: string; | ||
/** | ||
* Filter by subjects timestamp. Returns all subjects from that time backward (inclusive). Valid formats: 2018-02-22 00:40:00 UTC, 2018-02-22T00:40:00Z (ISO 8601), 1519260000 (unix timestamp in seconds). Default null | ||
*/ | ||
to_time: string; | ||
/** | ||
* Filter by verified status. Possible values: true, false. Default null | ||
*/ | ||
verified: boolean; | ||
/** | ||
* Filters for results with the value provided being contained in either id, first_name, last_name, full_name, email. Default null | ||
*/ | ||
fulltext: string; | ||
/** | ||
* Cursor which indicates after which Subject the results should be returned (cursor excluded). Default null | ||
*/ | ||
starting_after: string; | ||
/** | ||
* Number indicating the number of results returned. Min: 1, Max: 101. Default 10 | ||
*/ | ||
limit: number; | ||
} | ||
export interface Subject { | ||
/** | ||
* Optional, auto-filled if not provided | ||
*/ | ||
id?: string; | ||
email?: string; | ||
first_name?: string; | ||
last_name?: string; | ||
full_name?: string; | ||
verified?: boolean; | ||
} | ||
export interface SubjectResponse extends Subject { | ||
owner_id: string; | ||
preferences?: SubjectPreferences; | ||
timestamp: string; | ||
} | ||
export interface SubjectPreferences { | ||
[key: string]: Preference; | ||
} | ||
export interface Preference { | ||
value: boolean; | ||
consent_id: string; | ||
} | ||
export interface SubjectPostResponse { | ||
id: string; | ||
timestamp: string; | ||
} | ||
//endregion | ||
export interface ResponseError { | ||
@@ -49,3 +280,3 @@ error: boolean; | ||
private async sendRequest(request: SuperAgentRequest): Promise<ResponseError | any> { | ||
private static async sendRequest(request: SuperAgentRequest): Promise<ResponseError | any> { | ||
const response = await request; | ||
@@ -64,11 +295,11 @@ if (response.status < 300) { | ||
} | ||
return await this.sendRequest(req); | ||
return await IubendaConsentSolution.sendRequest(req); | ||
} | ||
async getConsent(id: string): Promise<ResponseError | ConsentExtended> { | ||
return await this.sendRequest(this.addHeaders(get(this.generateUrl('consent/' + id)))); | ||
return await IubendaConsentSolution.sendRequest(this.addHeaders(get(this.generateUrl('consent/' + id)))); | ||
} | ||
async createConsent(consent: ConsentExtended): Promise<ResponseError | ConsentPostResponse> { | ||
return this.sendRequest(await this.sendRequest(this.addHeaders(post(this.generateUrl('consent')).send(consent)))); | ||
return IubendaConsentSolution.sendRequest(await IubendaConsentSolution.sendRequest(this.addHeaders(post(this.generateUrl('consent')).send(consent)))); | ||
} | ||
@@ -81,3 +312,3 @@ | ||
} | ||
return await this.sendRequest(req); | ||
return await IubendaConsentSolution.sendRequest(req); | ||
} | ||
@@ -87,3 +318,3 @@ | ||
const req = this.addHeaders(get(this.generateUrl('subjects/' + id))); | ||
return await this.sendRequest(req); | ||
return await IubendaConsentSolution.sendRequest(req); | ||
} | ||
@@ -93,3 +324,3 @@ | ||
const req = this.addHeaders(post(this.generateUrl('subjects')).send(subject)); | ||
return await this.sendRequest(req); | ||
return await IubendaConsentSolution.sendRequest(req); | ||
} | ||
@@ -99,3 +330,3 @@ | ||
const req = this.addHeaders(put(this.generateUrl('subjects/' + id)).send(subject)); | ||
return await this.sendRequest(req); | ||
return await IubendaConsentSolution.sendRequest(req); | ||
} | ||
@@ -102,0 +333,0 @@ } |
@@ -74,3 +74,4 @@ { | ||
"allowSyntheticDefaultImports": true | ||
} | ||
}, | ||
"include": ["src/**/*"] | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
43879
14
905
1