Rename vendors to third parties

Renames the user-facing 'vendor' concept to 'third party' across the
entire codebase. The shared common_third_parties reference table is
unchanged.

Migration. Renames the vendor_category enum, the vendors and
vendor_<entity> tables (contacts, services, compliance_reports,
business_associate_agreements, data_privacy_agreements,
risk_assessments) and their vendor_id columns, the asset_vendors /
data_vendors / processing_activity_vendors junction tables,
generated_documents.vendors_document_id, the webhook_event_type
'vendor:<verb>' values, and the snapshots_type 'VENDORS' value.

Backend. Renames coredata models and SQL queries, probo services,
GraphQL / MCP API surface, console / trust / webhook resolvers and
types, the CLI (prb vendor* -> prb third-party*; pkg/cmd/vendormgmt
-> pkg/cmd/thirdpartymgmt), the document generator, vetting agent
prompts, and the common-third-parties-import command.

Frontend, packages, n8n, e2e. Renames apps/console pages, components,
hooks, routes, dialogs, and tabs; the shared @probo/vendors package
(now @probo/third-parties); the @probo/ui Vendors atoms (now
ThirdParties, VendorLogo -> ThirdPartyLogo); the n8n community node
actions/vendor folder (now actions/thirdParty); and the e2e Go test
suite (console and MCP). Filesystem and URL paths use kebab-case
(third-parties), GraphQL fields and TypeScript identifiers use
camelCase (thirdParty / thirdParties), Go types use PascalCase
(ThirdParty), and human-facing text uses 'third party' with a space.

Co-authored-by: Bryan Frimin <bryan@getprobo.com>
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
This commit is contained in:
Sacha Al Himdani
2026-05-13 16:15:33 +02:00
parent 9eed0d71c8
commit eecbe4c46c
281 changed files with 8491 additions and 8425 deletions

View File

@@ -196,6 +196,11 @@ export class Probo implements INodeType {
value: 'task',
description: 'Manage tasks',
},
{
name: 'Third Party',
value: 'thirdParty',
description: 'Manage third parties',
},
{
name: 'TIA',
value: 'tia',
@@ -216,11 +221,6 @@ export class Probo implements INodeType {
value: 'user',
description: 'Manage organization users (profiles)',
},
{
name: 'Vendor',
value: 'vendor',
description: 'Manage vendors',
},
{
name: 'Webhook',
value: 'webhook',

View File

@@ -111,8 +111,8 @@ export const description: INodeProperties[] = [
required: true,
},
{
displayName: 'Vendor IDs',
name: 'vendorIds',
displayName: 'ThirdParty IDs',
name: 'thirdPartyIds',
type: 'string',
displayOptions: {
show: {
@@ -121,7 +121,7 @@ export const description: INodeProperties[] = [
},
},
default: '',
description: 'Comma-separated list of vendor IDs',
description: 'Comma-separated list of thirdParty IDs',
},
{
displayName: 'Options',
@@ -144,11 +144,11 @@ export const description: INodeProperties[] = [
description: 'Whether to include owner details in the response',
},
{
displayName: 'Include Vendors',
name: 'includeVendors',
displayName: 'Include ThirdParties',
name: 'includeThirdParties',
type: 'boolean',
default: false,
description: 'Whether to include vendors in the response',
description: 'Whether to include thirdParties in the response',
},
],
},
@@ -164,10 +164,10 @@ export async function execute(
const ownerId = this.getNodeParameter('ownerId', itemIndex) as string;
const assetType = this.getNodeParameter('assetType', itemIndex) as string;
const dataTypesStored = this.getNodeParameter('dataTypesStored', itemIndex) as string;
const vendorIdsStr = this.getNodeParameter('vendorIds', itemIndex, '') as string;
const thirdPartyIdsStr = this.getNodeParameter('thirdPartyIds', itemIndex, '') as string;
const options = this.getNodeParameter('options', itemIndex, {}) as {
includeOwner?: boolean;
includeVendors?: boolean;
includeThirdParties?: boolean;
};
const ownerFragment = options.includeOwner
@@ -178,8 +178,8 @@ export async function execute(
}`
: '';
const vendorsFragment = options.includeVendors
? `vendors(first: 100) {
const thirdPartiesFragment = options.includeThirdParties
? `thirdParties(first: 100) {
edges {
node {
id
@@ -200,7 +200,7 @@ export async function execute(
assetType
dataTypesStored
${ownerFragment}
${vendorsFragment}
${thirdPartiesFragment}
createdAt
updatedAt
}
@@ -209,7 +209,7 @@ export async function execute(
}
`;
const vendorIds = vendorIdsStr ? vendorIdsStr.split(',').map((id) => id.trim()).filter(Boolean) : undefined;
const thirdPartyIds = thirdPartyIdsStr ? thirdPartyIdsStr.split(',').map((id) => id.trim()).filter(Boolean) : undefined;
const variables = {
input: {
@@ -219,7 +219,7 @@ export async function execute(
ownerId,
assetType,
dataTypesStored,
...(vendorIds && vendorIds.length > 0 && { vendorIds }),
...(thirdPartyIds && thirdPartyIds.length > 0 && { thirdPartyIds }),
},
};

View File

@@ -51,11 +51,11 @@ export const description: INodeProperties[] = [
description: 'Whether to include owner details in the response',
},
{
displayName: 'Include Vendors',
name: 'includeVendors',
displayName: 'Include ThirdParties',
name: 'includeThirdParties',
type: 'boolean',
default: false,
description: 'Whether to include vendors in the response',
description: 'Whether to include thirdParties in the response',
},
],
},
@@ -68,7 +68,7 @@ export async function execute(
const assetId = this.getNodeParameter('assetId', itemIndex) as string;
const options = this.getNodeParameter('options', itemIndex, {}) as {
includeOwner?: boolean;
includeVendors?: boolean;
includeThirdParties?: boolean;
};
const ownerFragment = options.includeOwner
@@ -79,8 +79,8 @@ export async function execute(
}`
: '';
const vendorsFragment = options.includeVendors
? `vendors(first: 100) {
const thirdPartiesFragment = options.includeThirdParties
? `thirdParties(first: 100) {
edges {
node {
id
@@ -100,7 +100,7 @@ export async function execute(
assetType
dataTypesStored
${ownerFragment}
${vendorsFragment}
${thirdPartiesFragment}
createdAt
updatedAt
}

View File

@@ -81,11 +81,11 @@ export const description: INodeProperties[] = [
description: 'Whether to include owner details in the response',
},
{
displayName: 'Include Vendors',
name: 'includeVendors',
displayName: 'Include ThirdParties',
name: 'includeThirdParties',
type: 'boolean',
default: false,
description: 'Whether to include vendors in the response',
description: 'Whether to include thirdParties in the response',
},
],
},
@@ -100,7 +100,7 @@ export async function execute(
const limit = this.getNodeParameter('limit', itemIndex, 50) as number;
const options = this.getNodeParameter('options', itemIndex, {}) as {
includeOwner?: boolean;
includeVendors?: boolean;
includeThirdParties?: boolean;
};
const ownerFragment = options.includeOwner
@@ -111,8 +111,8 @@ export async function execute(
}`
: '';
const vendorsFragment = options.includeVendors
? `vendors(first: 100) {
const thirdPartiesFragment = options.includeThirdParties
? `thirdParties(first: 100) {
edges {
node {
id
@@ -135,7 +135,7 @@ export async function execute(
assetType
dataTypesStored
${ownerFragment}
${vendorsFragment}
${thirdPartiesFragment}
createdAt
updatedAt
}

View File

@@ -106,8 +106,8 @@ export const description: INodeProperties[] = [
description: 'The types of data stored in the asset',
},
{
displayName: 'Vendor IDs',
name: 'vendorIds',
displayName: 'ThirdParty IDs',
name: 'thirdPartyIds',
type: 'string',
displayOptions: {
show: {
@@ -116,7 +116,7 @@ export const description: INodeProperties[] = [
},
},
default: '',
description: 'Comma-separated list of vendor IDs',
description: 'Comma-separated list of thirdParty IDs',
},
{
displayName: 'Options',
@@ -139,11 +139,11 @@ export const description: INodeProperties[] = [
description: 'Whether to include owner details in the response',
},
{
displayName: 'Include Vendors',
name: 'includeVendors',
displayName: 'Include ThirdParties',
name: 'includeThirdParties',
type: 'boolean',
default: false,
description: 'Whether to include vendors in the response',
description: 'Whether to include thirdParties in the response',
},
],
},
@@ -159,10 +159,10 @@ export async function execute(
const ownerId = this.getNodeParameter('ownerId', itemIndex, '') as string;
const assetType = this.getNodeParameter('assetType', itemIndex, '') as string;
const dataTypesStored = this.getNodeParameter('dataTypesStored', itemIndex, '') as string;
const vendorIdsStr = this.getNodeParameter('vendorIds', itemIndex, '') as string;
const thirdPartyIdsStr = this.getNodeParameter('thirdPartyIds', itemIndex, '') as string;
const options = this.getNodeParameter('options', itemIndex, {}) as {
includeOwner?: boolean;
includeVendors?: boolean;
includeThirdParties?: boolean;
};
const ownerFragment = options.includeOwner
@@ -173,8 +173,8 @@ export async function execute(
}`
: '';
const vendorsFragment = options.includeVendors
? `vendors(first: 100) {
const thirdPartiesFragment = options.includeThirdParties
? `thirdParties(first: 100) {
edges {
node {
id
@@ -194,7 +194,7 @@ export async function execute(
assetType
dataTypesStored
${ownerFragment}
${vendorsFragment}
${thirdPartiesFragment}
createdAt
updatedAt
}
@@ -208,9 +208,9 @@ export async function execute(
if (ownerId) input.ownerId = ownerId;
if (assetType) input.assetType = assetType;
if (dataTypesStored) input.dataTypesStored = dataTypesStored;
if (vendorIdsStr) {
const vendorIds = vendorIdsStr.split(',').map((vid) => vid.trim()).filter(Boolean);
if (vendorIds.length > 0) input.vendorIds = vendorIds;
if (thirdPartyIdsStr) {
const thirdPartyIds = thirdPartyIdsStr.split(',').map((vid) => vid.trim()).filter(Boolean);
if (thirdPartyIds.length > 0) input.thirdPartyIds = thirdPartyIds;
}
const responseData = await proboApiRequest.call(this, query, { input });

View File

@@ -91,8 +91,8 @@ export const description: INodeProperties[] = [
required: true,
},
{
displayName: 'Vendor IDs',
name: 'vendorIds',
displayName: 'ThirdParty IDs',
name: 'thirdPartyIds',
type: 'string',
displayOptions: {
show: {
@@ -101,7 +101,7 @@ export const description: INodeProperties[] = [
},
},
default: '',
description: 'Comma-separated list of vendor IDs',
description: 'Comma-separated list of thirdParty IDs',
},
{
displayName: 'Options',
@@ -124,11 +124,11 @@ export const description: INodeProperties[] = [
description: 'Whether to include owner details in the response',
},
{
displayName: 'Include Vendors',
name: 'includeVendors',
displayName: 'Include ThirdParties',
name: 'includeThirdParties',
type: 'boolean',
default: false,
description: 'Whether to include vendors in the response',
description: 'Whether to include thirdParties in the response',
},
],
},
@@ -142,10 +142,10 @@ export async function execute(
const name = this.getNodeParameter('name', itemIndex) as string;
const dataClassification = this.getNodeParameter('dataClassification', itemIndex) as string;
const ownerId = this.getNodeParameter('ownerId', itemIndex) as string;
const vendorIdsStr = this.getNodeParameter('vendorIds', itemIndex, '') as string;
const thirdPartyIdsStr = this.getNodeParameter('thirdPartyIds', itemIndex, '') as string;
const options = this.getNodeParameter('options', itemIndex, {}) as {
includeOwner?: boolean;
includeVendors?: boolean;
includeThirdParties?: boolean;
};
const ownerFragment = options.includeOwner
@@ -156,8 +156,8 @@ export async function execute(
}`
: '';
const vendorsFragment = options.includeVendors
? `vendors(first: 100) {
const thirdPartiesFragment = options.includeThirdParties
? `thirdParties(first: 100) {
edges {
node {
id
@@ -176,7 +176,7 @@ export async function execute(
name
dataClassification
${ownerFragment}
${vendorsFragment}
${thirdPartiesFragment}
createdAt
updatedAt
}
@@ -185,7 +185,7 @@ export async function execute(
}
`;
const vendorIds = vendorIdsStr ? vendorIdsStr.split(',').map((id) => id.trim()).filter(Boolean) : undefined;
const thirdPartyIds = thirdPartyIdsStr ? thirdPartyIdsStr.split(',').map((id) => id.trim()).filter(Boolean) : undefined;
const variables = {
input: {
@@ -193,7 +193,7 @@ export async function execute(
name,
dataClassification,
ownerId,
...(vendorIds && vendorIds.length > 0 && { vendorIds }),
...(thirdPartyIds && thirdPartyIds.length > 0 && { thirdPartyIds }),
},
};

View File

@@ -51,11 +51,11 @@ export const description: INodeProperties[] = [
description: 'Whether to include owner details in the response',
},
{
displayName: 'Include Vendors',
name: 'includeVendors',
displayName: 'Include ThirdParties',
name: 'includeThirdParties',
type: 'boolean',
default: false,
description: 'Whether to include vendors in the response',
description: 'Whether to include thirdParties in the response',
},
],
},
@@ -68,7 +68,7 @@ export async function execute(
const datumId = this.getNodeParameter('datumId', itemIndex) as string;
const options = this.getNodeParameter('options', itemIndex, {}) as {
includeOwner?: boolean;
includeVendors?: boolean;
includeThirdParties?: boolean;
};
const ownerFragment = options.includeOwner
@@ -79,8 +79,8 @@ export async function execute(
}`
: '';
const vendorsFragment = options.includeVendors
? `vendors(first: 100) {
const thirdPartiesFragment = options.includeThirdParties
? `thirdParties(first: 100) {
edges {
node {
id
@@ -98,7 +98,7 @@ export async function execute(
name
dataClassification
${ownerFragment}
${vendorsFragment}
${thirdPartiesFragment}
createdAt
updatedAt
}

View File

@@ -81,11 +81,11 @@ export const description: INodeProperties[] = [
description: 'Whether to include owner details in the response',
},
{
displayName: 'Include Vendors',
name: 'includeVendors',
displayName: 'Include ThirdParties',
name: 'includeThirdParties',
type: 'boolean',
default: false,
description: 'Whether to include vendors in the response',
description: 'Whether to include thirdParties in the response',
},
],
},
@@ -100,7 +100,7 @@ export async function execute(
const limit = this.getNodeParameter('limit', itemIndex, 50) as number;
const options = this.getNodeParameter('options', itemIndex, {}) as {
includeOwner?: boolean;
includeVendors?: boolean;
includeThirdParties?: boolean;
};
const ownerFragment = options.includeOwner
@@ -111,8 +111,8 @@ export async function execute(
}`
: '';
const vendorsFragment = options.includeVendors
? `vendors(first: 100) {
const thirdPartiesFragment = options.includeThirdParties
? `thirdParties(first: 100) {
edges {
node {
id
@@ -133,7 +133,7 @@ export async function execute(
name
dataClassification
${ownerFragment}
${vendorsFragment}
${thirdPartiesFragment}
createdAt
updatedAt
}

View File

@@ -88,8 +88,8 @@ export const description: INodeProperties[] = [
description: 'The ID of the owner (People)',
},
{
displayName: 'Vendor IDs',
name: 'vendorIds',
displayName: 'ThirdParty IDs',
name: 'thirdPartyIds',
type: 'string',
displayOptions: {
show: {
@@ -98,7 +98,7 @@ export const description: INodeProperties[] = [
},
},
default: '',
description: 'Comma-separated list of vendor IDs',
description: 'Comma-separated list of thirdParty IDs',
},
{
displayName: 'Options',
@@ -121,11 +121,11 @@ export const description: INodeProperties[] = [
description: 'Whether to include owner details in the response',
},
{
displayName: 'Include Vendors',
name: 'includeVendors',
displayName: 'Include ThirdParties',
name: 'includeThirdParties',
type: 'boolean',
default: false,
description: 'Whether to include vendors in the response',
description: 'Whether to include thirdParties in the response',
},
],
},
@@ -139,10 +139,10 @@ export async function execute(
const name = this.getNodeParameter('name', itemIndex, '') as string;
const dataClassification = this.getNodeParameter('dataClassification', itemIndex, '') as string;
const ownerId = this.getNodeParameter('ownerId', itemIndex, '') as string;
const vendorIdsStr = this.getNodeParameter('vendorIds', itemIndex, '') as string;
const thirdPartyIdsStr = this.getNodeParameter('thirdPartyIds', itemIndex, '') as string;
const options = this.getNodeParameter('options', itemIndex, {}) as {
includeOwner?: boolean;
includeVendors?: boolean;
includeThirdParties?: boolean;
};
const ownerFragment = options.includeOwner
@@ -153,8 +153,8 @@ export async function execute(
}`
: '';
const vendorsFragment = options.includeVendors
? `vendors(first: 100) {
const thirdPartiesFragment = options.includeThirdParties
? `thirdParties(first: 100) {
edges {
node {
id
@@ -172,7 +172,7 @@ export async function execute(
name
dataClassification
${ownerFragment}
${vendorsFragment}
${thirdPartiesFragment}
createdAt
updatedAt
}
@@ -184,9 +184,9 @@ export async function execute(
if (name) input.name = name;
if (dataClassification) input.dataClassification = dataClassification;
if (ownerId) input.ownerId = ownerId;
if (vendorIdsStr) {
const vendorIds = vendorIdsStr.split(',').map((vid) => vid.trim()).filter(Boolean);
if (vendorIds.length > 0) input.vendorIds = vendorIds;
if (thirdPartyIdsStr) {
const thirdPartyIds = thirdPartyIdsStr.split(',').map((vid) => vid.trim()).filter(Boolean);
if (thirdPartyIds.length > 0) input.thirdPartyIds = thirdPartyIds;
}
const responseData = await proboApiRequest.call(this, query, { input });

View File

@@ -41,7 +41,7 @@ import * as statementOfApplicability from './statementOfApplicability';
import * as task from './task';
import * as tia from './tia';
import * as trustCenter from './trustCenter';
import * as vendor from './vendor';
import * as thirdParty from './thirdParty';
import * as webhook from './webhook';
export interface ResourceModule {
@@ -83,7 +83,7 @@ export const resources: Record<string, ResourceModule> = {
task: task as ResourceModule,
tia: tia as ResourceModule,
trustCenter: trustCenter as ResourceModule,
vendor: vendor as ResourceModule,
thirdParty: thirdParty as ResourceModule,
webhook: webhook as ResourceModule,
};

View File

@@ -22,7 +22,7 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['create'],
},
},
@@ -36,12 +36,12 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['create'],
},
},
default: '',
description: 'The name of the vendor',
description: 'The name of the thirdParty',
required: true,
},
{
@@ -53,12 +53,12 @@ export const description: INodeProperties[] = [
},
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['create'],
},
},
default: '',
description: 'The description of the vendor',
description: 'The description of the thirdParty',
},
{
displayName: 'Category',
@@ -66,12 +66,12 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['create'],
},
},
default: '',
description: 'The category of the vendor',
description: 'The category of the thirdParty',
},
{
displayName: 'Website URL',
@@ -79,12 +79,12 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['create'],
},
},
default: '',
description: 'The website URL of the vendor',
description: 'The website URL of the thirdParty',
},
{
displayName: 'Legal Name',
@@ -92,12 +92,12 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['create'],
},
},
default: '',
description: 'The legal name of the vendor',
description: 'The legal name of the thirdParty',
},
{
displayName: 'Headquarter Address',
@@ -105,12 +105,12 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['create'],
},
},
default: '',
description: 'The headquarter address of the vendor',
description: 'The headquarter address of the thirdParty',
},
{
displayName: 'Business Owner ID',
@@ -118,7 +118,7 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['create'],
},
},
@@ -131,7 +131,7 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['create'],
},
},
@@ -146,7 +146,7 @@ export const description: INodeProperties[] = [
default: {},
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['create'],
},
},
@@ -200,7 +200,7 @@ export const description: INodeProperties[] = [
name: 'statusPageUrl',
type: 'string',
default: '',
description: 'The status page URL of the vendor',
description: 'The status page URL of the thirdParty',
},
{
displayName: 'Subprocessors List URL',
@@ -252,9 +252,9 @@ export async function execute(
};
const query = `
mutation CreateVendor($input: CreateVendorInput!) {
createVendor(input: $input) {
vendorEdge {
mutation CreateThirdParty($input: CreateThirdPartyInput!) {
createThirdParty(input: $input) {
thirdPartyEdge {
node {
id
name

View File

@@ -17,17 +17,17 @@ import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor ID',
name: 'vendorId',
displayName: 'ThirdParty ID',
name: 'thirdPartyId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['createContact'],
},
},
default: '',
description: 'The ID of the vendor',
description: 'The ID of the thirdParty',
required: true,
},
{
@@ -36,7 +36,7 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['createContact'],
},
},
@@ -50,7 +50,7 @@ export const description: INodeProperties[] = [
placeholder: 'name@email.com',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['createContact'],
},
},
@@ -63,7 +63,7 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['createContact'],
},
},
@@ -76,7 +76,7 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['createContact'],
},
},
@@ -89,16 +89,16 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorId = this.getNodeParameter('vendorId', itemIndex) as string;
const thirdPartyId = this.getNodeParameter('thirdPartyId', itemIndex) as string;
const fullName = this.getNodeParameter('fullName', itemIndex, '') as string;
const email = this.getNodeParameter('email', itemIndex, '') as string;
const phone = this.getNodeParameter('phone', itemIndex, '') as string;
const role = this.getNodeParameter('role', itemIndex, '') as string;
const query = `
mutation CreateVendorContact($input: CreateVendorContactInput!) {
createVendorContact(input: $input) {
vendorContactEdge {
mutation CreateThirdPartyContact($input: CreateThirdPartyContactInput!) {
createThirdPartyContact(input: $input) {
thirdPartyContactEdge {
node {
id
fullName
@@ -113,7 +113,7 @@ export async function execute(
}
`;
const input: Record<string, unknown> = { vendorId };
const input: Record<string, unknown> = { thirdPartyId };
if (fullName) input.fullName = fullName;
if (email) input.email = email;
if (phone) input.phone = phone;

View File

@@ -17,17 +17,17 @@ import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor ID',
name: 'vendorId',
displayName: 'ThirdParty ID',
name: 'thirdPartyId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['createRiskAssessment'],
},
},
default: '',
description: 'The ID of the vendor',
description: 'The ID of the thirdParty',
required: true,
},
{
@@ -36,7 +36,7 @@ export const description: INodeProperties[] = [
type: 'dateTime',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['createRiskAssessment'],
},
},
@@ -50,7 +50,7 @@ export const description: INodeProperties[] = [
type: 'options',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['createRiskAssessment'],
},
},
@@ -71,7 +71,7 @@ export const description: INodeProperties[] = [
type: 'options',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['createRiskAssessment'],
},
},
@@ -94,7 +94,7 @@ export const description: INodeProperties[] = [
},
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['createRiskAssessment'],
},
},
@@ -107,7 +107,7 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorId = this.getNodeParameter('vendorId', itemIndex) as string;
const thirdPartyId = this.getNodeParameter('thirdPartyId', itemIndex) as string;
const expiresAtRaw = this.getNodeParameter('expiresAt', itemIndex) as string;
const dataSensitivity = this.getNodeParameter('dataSensitivity', itemIndex) as string;
const businessImpact = this.getNodeParameter('businessImpact', itemIndex) as string;
@@ -117,9 +117,9 @@ export async function execute(
const expiresAt = new Date(expiresAtRaw).toISOString();
const query = `
mutation CreateVendorRiskAssessment($input: CreateVendorRiskAssessmentInput!) {
createVendorRiskAssessment(input: $input) {
vendorRiskAssessmentEdge {
mutation CreateThirdPartyRiskAssessment($input: CreateThirdPartyRiskAssessmentInput!) {
createThirdPartyRiskAssessment(input: $input) {
thirdPartyRiskAssessmentEdge {
node {
id
expiresAt
@@ -135,7 +135,7 @@ export async function execute(
`;
const input: Record<string, unknown> = {
vendorId,
thirdPartyId,
expiresAt,
dataSensitivity,
businessImpact,

View File

@@ -17,17 +17,17 @@ import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor ID',
name: 'vendorId',
displayName: 'ThirdParty ID',
name: 'thirdPartyId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['createService'],
},
},
default: '',
description: 'The ID of the vendor',
description: 'The ID of the thirdParty',
required: true,
},
{
@@ -36,12 +36,12 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['createService'],
},
},
default: '',
description: 'The name of the vendor service',
description: 'The name of the thirdParty service',
required: true,
},
{
@@ -53,12 +53,12 @@ export const description: INodeProperties[] = [
},
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['createService'],
},
},
default: '',
description: 'The description of the vendor service',
description: 'The description of the thirdParty service',
},
];
@@ -66,14 +66,14 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorId = this.getNodeParameter('vendorId', itemIndex) as string;
const thirdPartyId = this.getNodeParameter('thirdPartyId', itemIndex) as string;
const name = this.getNodeParameter('name', itemIndex) as string;
const description = this.getNodeParameter('description', itemIndex, '') as string;
const query = `
mutation CreateVendorService($input: CreateVendorServiceInput!) {
createVendorService(input: $input) {
vendorServiceEdge {
mutation CreateThirdPartyService($input: CreateThirdPartyServiceInput!) {
createThirdPartyService(input: $input) {
thirdPartyServiceEdge {
node {
id
name
@@ -87,7 +87,7 @@ export async function execute(
`;
const input: Record<string, unknown> = {
vendorId,
thirdPartyId,
name,
};
if (description) input.description = description;

View File

@@ -17,17 +17,17 @@ import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor ID',
name: 'vendorId',
displayName: 'ThirdParty ID',
name: 'thirdPartyId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['delete'],
},
},
default: '',
description: 'The ID of the vendor to delete',
description: 'The ID of the thirdParty to delete',
required: true,
},
];
@@ -36,17 +36,17 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorId = this.getNodeParameter('vendorId', itemIndex) as string;
const thirdPartyId = this.getNodeParameter('thirdPartyId', itemIndex) as string;
const query = `
mutation DeleteVendor($input: DeleteVendorInput!) {
deleteVendor(input: $input) {
deletedVendorId
mutation DeleteThirdParty($input: DeleteThirdPartyInput!) {
deleteThirdParty(input: $input) {
deletedThirdPartyId
}
}
`;
const responseData = await proboApiRequest.call(this, query, { input: { vendorId } });
const responseData = await proboApiRequest.call(this, query, { input: { thirdPartyId } });
return {
json: responseData,

View File

@@ -17,17 +17,17 @@ import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor ID',
name: 'vendorId',
displayName: 'ThirdParty ID',
name: 'thirdPartyId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['deleteBusinessAssociateAgreement'],
},
},
default: '',
description: 'The ID of the vendor',
description: 'The ID of the thirdParty',
required: true,
},
];
@@ -36,17 +36,17 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorId = this.getNodeParameter('vendorId', itemIndex) as string;
const thirdPartyId = this.getNodeParameter('thirdPartyId', itemIndex) as string;
const query = `
mutation DeleteVendorBusinessAssociateAgreement($input: DeleteVendorBusinessAssociateAgreementInput!) {
deleteVendorBusinessAssociateAgreement(input: $input) {
deletedVendorBusinessAssociateAgreementId
mutation DeleteThirdPartyBusinessAssociateAgreement($input: DeleteThirdPartyBusinessAssociateAgreementInput!) {
deleteThirdPartyBusinessAssociateAgreement(input: $input) {
deletedThirdPartyBusinessAssociateAgreementId
}
}
`;
const responseData = await proboApiRequest.call(this, query, { input: { vendorId } });
const responseData = await proboApiRequest.call(this, query, { input: { thirdPartyId } });
return {
json: responseData,

View File

@@ -17,17 +17,17 @@ import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor Compliance Report ID',
name: 'vendorComplianceReportId',
displayName: 'ThirdParty Compliance Report ID',
name: 'thirdPartyComplianceReportId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['deleteComplianceReport'],
},
},
default: '',
description: 'The ID of the vendor compliance report to delete',
description: 'The ID of the thirdParty compliance report to delete',
required: true,
},
];
@@ -36,17 +36,17 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorComplianceReportId = this.getNodeParameter('vendorComplianceReportId', itemIndex) as string;
const thirdPartyComplianceReportId = this.getNodeParameter('thirdPartyComplianceReportId', itemIndex) as string;
const query = `
mutation DeleteVendorComplianceReport($input: DeleteVendorComplianceReportInput!) {
deleteVendorComplianceReport(input: $input) {
deletedVendorComplianceReportId
mutation DeleteThirdPartyComplianceReport($input: DeleteThirdPartyComplianceReportInput!) {
deleteThirdPartyComplianceReport(input: $input) {
deletedThirdPartyComplianceReportId
}
}
`;
const responseData = await proboApiRequest.call(this, query, { input: { vendorComplianceReportId } });
const responseData = await proboApiRequest.call(this, query, { input: { thirdPartyComplianceReportId } });
return {
json: responseData,

View File

@@ -17,17 +17,17 @@ import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor Contact ID',
name: 'vendorContactId',
displayName: 'ThirdParty Contact ID',
name: 'thirdPartyContactId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['deleteContact'],
},
},
default: '',
description: 'The ID of the vendor contact to delete',
description: 'The ID of the thirdParty contact to delete',
required: true,
},
];
@@ -36,17 +36,17 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorContactId = this.getNodeParameter('vendorContactId', itemIndex) as string;
const thirdPartyContactId = this.getNodeParameter('thirdPartyContactId', itemIndex) as string;
const query = `
mutation DeleteVendorContact($input: DeleteVendorContactInput!) {
deleteVendorContact(input: $input) {
deletedVendorContactId
mutation DeleteThirdPartyContact($input: DeleteThirdPartyContactInput!) {
deleteThirdPartyContact(input: $input) {
deletedThirdPartyContactId
}
}
`;
const responseData = await proboApiRequest.call(this, query, { input: { vendorContactId } });
const responseData = await proboApiRequest.call(this, query, { input: { thirdPartyContactId } });
return {
json: responseData,

View File

@@ -17,17 +17,17 @@ import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor ID',
name: 'vendorId',
displayName: 'ThirdParty ID',
name: 'thirdPartyId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['deleteDataPrivacyAgreement'],
},
},
default: '',
description: 'The ID of the vendor',
description: 'The ID of the thirdParty',
required: true,
},
];
@@ -36,17 +36,17 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorId = this.getNodeParameter('vendorId', itemIndex) as string;
const thirdPartyId = this.getNodeParameter('thirdPartyId', itemIndex) as string;
const query = `
mutation DeleteVendorDataPrivacyAgreement($input: DeleteVendorDataPrivacyAgreementInput!) {
deleteVendorDataPrivacyAgreement(input: $input) {
deletedVendorDataPrivacyAgreementId
mutation DeleteThirdPartyDataPrivacyAgreement($input: DeleteThirdPartyDataPrivacyAgreementInput!) {
deleteThirdPartyDataPrivacyAgreement(input: $input) {
deletedThirdPartyDataPrivacyAgreementId
}
}
`;
const responseData = await proboApiRequest.call(this, query, { input: { vendorId } });
const responseData = await proboApiRequest.call(this, query, { input: { thirdPartyId } });
return {
json: responseData,

View File

@@ -17,17 +17,17 @@ import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor Service ID',
name: 'vendorServiceId',
displayName: 'ThirdParty Service ID',
name: 'thirdPartyServiceId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['deleteService'],
},
},
default: '',
description: 'The ID of the vendor service to delete',
description: 'The ID of the thirdParty service to delete',
required: true,
},
];
@@ -36,17 +36,17 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorServiceId = this.getNodeParameter('vendorServiceId', itemIndex) as string;
const thirdPartyServiceId = this.getNodeParameter('thirdPartyServiceId', itemIndex) as string;
const query = `
mutation DeleteVendorService($input: DeleteVendorServiceInput!) {
deleteVendorService(input: $input) {
deletedVendorServiceId
mutation DeleteThirdPartyService($input: DeleteThirdPartyServiceInput!) {
deleteThirdPartyService(input: $input) {
deletedThirdPartyServiceId
}
}
`;
const responseData = await proboApiRequest.call(this, query, { input: { vendorServiceId } });
const responseData = await proboApiRequest.call(this, query, { input: { thirdPartyServiceId } });
return {
json: responseData,

View File

@@ -17,17 +17,17 @@ import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor ID',
name: 'vendorId',
displayName: 'ThirdParty ID',
name: 'thirdPartyId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['get'],
},
},
default: '',
description: 'The ID of the vendor',
description: 'The ID of the thirdParty',
required: true,
},
{
@@ -38,7 +38,7 @@ export const description: INodeProperties[] = [
default: {},
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['get'],
},
},
@@ -72,7 +72,7 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorId = this.getNodeParameter('vendorId', itemIndex) as string;
const thirdPartyId = this.getNodeParameter('thirdPartyId', itemIndex) as string;
const options = this.getNodeParameter('options', itemIndex, {}) as {
includeOrganization?: boolean;
includeBusinessOwner?: boolean;
@@ -103,9 +103,9 @@ export async function execute(
: '';
const query = `
query GetVendor($vendorId: ID!) {
node(id: $vendorId) {
... on Vendor {
query GetThirdParty($thirdPartyId: ID!) {
node(id: $thirdPartyId) {
... on ThirdParty {
id
name
description
@@ -136,7 +136,7 @@ export async function execute(
`;
const variables = {
vendorId,
thirdPartyId,
};
const responseData = await proboApiRequest.call(this, query, variables);

View File

@@ -22,7 +22,7 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getAll'],
},
},
@@ -36,7 +36,7 @@ export const description: INodeProperties[] = [
type: 'boolean',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getAll'],
},
},
@@ -49,7 +49,7 @@ export const description: INodeProperties[] = [
type: 'number',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getAll'],
returnAll: [false],
},
@@ -68,7 +68,7 @@ export const description: INodeProperties[] = [
default: {},
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getAll'],
},
},
@@ -135,10 +135,10 @@ export async function execute(
: '';
const query = `
query GetVendors($organizationId: ID!, $first: Int, $after: CursorKey) {
query GetThirdParties($organizationId: ID!, $first: Int, $after: CursorKey) {
node(id: $organizationId) {
... on Organization {
vendors(first: $first, after: $after) {
thirdParties(first: $first, after: $after) {
edges {
node {
id
@@ -177,21 +177,21 @@ export async function execute(
}
`;
const vendors = await proboApiRequestAllItems.call(
const thirdParties = await proboApiRequestAllItems.call(
this,
query,
{ organizationId },
(response) => {
const data = response?.data as IDataObject | undefined;
const node = data?.node as IDataObject | undefined;
return node?.vendors as IDataObject | undefined;
return node?.thirdParties as IDataObject | undefined;
},
returnAll,
limit,
);
return {
json: { vendors },
json: { thirdParties },
pairedItem: { item: itemIndex },
};
}

View File

@@ -17,17 +17,17 @@ import { proboApiRequestAllItems } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor ID',
name: 'vendorId',
displayName: 'ThirdParty ID',
name: 'thirdPartyId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getAllComplianceReports'],
},
},
default: '',
description: 'The ID of the vendor',
description: 'The ID of the thirdParty',
required: true,
},
{
@@ -36,7 +36,7 @@ export const description: INodeProperties[] = [
type: 'boolean',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getAllComplianceReports'],
},
},
@@ -49,7 +49,7 @@ export const description: INodeProperties[] = [
type: 'number',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getAllComplianceReports'],
returnAll: [false],
},
@@ -66,14 +66,14 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorId = this.getNodeParameter('vendorId', itemIndex) as string;
const thirdPartyId = this.getNodeParameter('thirdPartyId', itemIndex) as string;
const returnAll = this.getNodeParameter('returnAll', itemIndex) as boolean;
const limit = this.getNodeParameter('limit', itemIndex, 50) as number;
const query = `
query GetVendorComplianceReports($vendorId: ID!, $first: Int, $after: CursorKey) {
node(id: $vendorId) {
... on Vendor {
query GetThirdPartyComplianceReports($thirdPartyId: ID!, $first: Int, $after: CursorKey) {
node(id: $thirdPartyId) {
... on ThirdParty {
complianceReports(first: $first, after: $after) {
edges {
node {
@@ -95,10 +95,10 @@ export async function execute(
}
`;
const vendorComplianceReports = await proboApiRequestAllItems.call(
const thirdPartyComplianceReports = await proboApiRequestAllItems.call(
this,
query,
{ vendorId },
{ thirdPartyId },
(response) => {
const data = response?.data as IDataObject | undefined;
const node = data?.node as IDataObject | undefined;
@@ -109,7 +109,7 @@ export async function execute(
);
return {
json: { vendorComplianceReports },
json: { thirdPartyComplianceReports },
pairedItem: { item: itemIndex },
};
}

View File

@@ -17,17 +17,17 @@ import { proboApiRequestAllItems } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor ID',
name: 'vendorId',
displayName: 'ThirdParty ID',
name: 'thirdPartyId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getAllContacts'],
},
},
default: '',
description: 'The ID of the vendor',
description: 'The ID of the thirdParty',
required: true,
},
{
@@ -36,7 +36,7 @@ export const description: INodeProperties[] = [
type: 'boolean',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getAllContacts'],
},
},
@@ -49,7 +49,7 @@ export const description: INodeProperties[] = [
type: 'number',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getAllContacts'],
returnAll: [false],
},
@@ -68,17 +68,17 @@ export const description: INodeProperties[] = [
default: {},
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getAllContacts'],
},
},
options: [
{
displayName: 'Include Vendor',
name: 'includeVendor',
displayName: 'Include ThirdParty',
name: 'includeThirdParty',
type: 'boolean',
default: false,
description: 'Whether to include vendor in the response',
description: 'Whether to include thirdParty in the response',
},
],
},
@@ -88,24 +88,24 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorId = this.getNodeParameter('vendorId', itemIndex) as string;
const thirdPartyId = this.getNodeParameter('thirdPartyId', itemIndex) as string;
const returnAll = this.getNodeParameter('returnAll', itemIndex) as boolean;
const limit = this.getNodeParameter('limit', itemIndex, 50) as number;
const options = this.getNodeParameter('options', itemIndex, {}) as {
includeVendor?: boolean;
includeThirdParty?: boolean;
};
const vendorFragment = options.includeVendor
? `vendor {
const thirdPartyFragment = options.includeThirdParty
? `thirdParty {
id
name
}`
: '';
const query = `
query GetVendorContacts($vendorId: ID!, $first: Int, $after: CursorKey) {
node(id: $vendorId) {
... on Vendor {
query GetThirdPartyContacts($thirdPartyId: ID!, $first: Int, $after: CursorKey) {
node(id: $thirdPartyId) {
... on ThirdParty {
contacts(first: $first, after: $after) {
edges {
node {
@@ -114,7 +114,7 @@ export async function execute(
email
phone
role
${vendorFragment}
${thirdPartyFragment}
createdAt
updatedAt
}
@@ -129,10 +129,10 @@ export async function execute(
}
`;
const vendorContacts = await proboApiRequestAllItems.call(
const thirdPartyContacts = await proboApiRequestAllItems.call(
this,
query,
{ vendorId },
{ thirdPartyId },
(response) => {
const data = response?.data as IDataObject | undefined;
const node = data?.node as IDataObject | undefined;
@@ -143,7 +143,7 @@ export async function execute(
);
return {
json: { vendorContacts },
json: { thirdPartyContacts },
pairedItem: { item: itemIndex },
};
}

View File

@@ -17,17 +17,17 @@ import { proboApiRequestAllItems } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor ID',
name: 'vendorId',
displayName: 'ThirdParty ID',
name: 'thirdPartyId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getAllRiskAssessments'],
},
},
default: '',
description: 'The ID of the vendor',
description: 'The ID of the thirdParty',
required: true,
},
{
@@ -36,7 +36,7 @@ export const description: INodeProperties[] = [
type: 'boolean',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getAllRiskAssessments'],
},
},
@@ -49,7 +49,7 @@ export const description: INodeProperties[] = [
type: 'number',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getAllRiskAssessments'],
returnAll: [false],
},
@@ -68,17 +68,17 @@ export const description: INodeProperties[] = [
default: {},
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getAllRiskAssessments'],
},
},
options: [
{
displayName: 'Include Vendor',
name: 'includeVendor',
displayName: 'Include ThirdParty',
name: 'includeThirdParty',
type: 'boolean',
default: false,
description: 'Whether to include vendor in the response',
description: 'Whether to include thirdParty in the response',
},
],
},
@@ -88,24 +88,24 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorId = this.getNodeParameter('vendorId', itemIndex) as string;
const thirdPartyId = this.getNodeParameter('thirdPartyId', itemIndex) as string;
const returnAll = this.getNodeParameter('returnAll', itemIndex) as boolean;
const limit = this.getNodeParameter('limit', itemIndex, 50) as number;
const options = this.getNodeParameter('options', itemIndex, {}) as {
includeVendor?: boolean;
includeThirdParty?: boolean;
};
const vendorFragment = options.includeVendor
? `vendor {
const thirdPartyFragment = options.includeThirdParty
? `thirdParty {
id
name
}`
: '';
const query = `
query GetVendorRiskAssessments($vendorId: ID!, $first: Int, $after: CursorKey) {
node(id: $vendorId) {
... on Vendor {
query GetThirdPartyRiskAssessments($thirdPartyId: ID!, $first: Int, $after: CursorKey) {
node(id: $thirdPartyId) {
... on ThirdParty {
riskAssessments(first: $first, after: $after) {
edges {
node {
@@ -114,7 +114,7 @@ export async function execute(
dataSensitivity
businessImpact
notes
${vendorFragment}
${thirdPartyFragment}
createdAt
updatedAt
}
@@ -129,10 +129,10 @@ export async function execute(
}
`;
const vendorRiskAssessments = await proboApiRequestAllItems.call(
const thirdPartyRiskAssessments = await proboApiRequestAllItems.call(
this,
query,
{ vendorId },
{ thirdPartyId },
(response) => {
const data = response?.data as IDataObject | undefined;
const node = data?.node as IDataObject | undefined;
@@ -143,7 +143,7 @@ export async function execute(
);
return {
json: { vendorRiskAssessments },
json: { thirdPartyRiskAssessments },
pairedItem: { item: itemIndex },
};
}

View File

@@ -17,17 +17,17 @@ import { proboApiRequestAllItems } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor ID',
name: 'vendorId',
displayName: 'ThirdParty ID',
name: 'thirdPartyId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getAllServices'],
},
},
default: '',
description: 'The ID of the vendor',
description: 'The ID of the thirdParty',
required: true,
},
{
@@ -36,7 +36,7 @@ export const description: INodeProperties[] = [
type: 'boolean',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getAllServices'],
},
},
@@ -49,7 +49,7 @@ export const description: INodeProperties[] = [
type: 'number',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getAllServices'],
returnAll: [false],
},
@@ -68,17 +68,17 @@ export const description: INodeProperties[] = [
default: {},
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getAllServices'],
},
},
options: [
{
displayName: 'Include Vendor',
name: 'includeVendor',
displayName: 'Include ThirdParty',
name: 'includeThirdParty',
type: 'boolean',
default: false,
description: 'Whether to include vendor in the response',
description: 'Whether to include thirdParty in the response',
},
],
},
@@ -88,31 +88,31 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorId = this.getNodeParameter('vendorId', itemIndex) as string;
const thirdPartyId = this.getNodeParameter('thirdPartyId', itemIndex) as string;
const returnAll = this.getNodeParameter('returnAll', itemIndex) as boolean;
const limit = this.getNodeParameter('limit', itemIndex, 50) as number;
const options = this.getNodeParameter('options', itemIndex, {}) as {
includeVendor?: boolean;
includeThirdParty?: boolean;
};
const vendorFragment = options.includeVendor
? `vendor {
const thirdPartyFragment = options.includeThirdParty
? `thirdParty {
id
name
}`
: '';
const query = `
query GetVendorServices($vendorId: ID!, $first: Int, $after: CursorKey) {
node(id: $vendorId) {
... on Vendor {
query GetThirdPartyServices($thirdPartyId: ID!, $first: Int, $after: CursorKey) {
node(id: $thirdPartyId) {
... on ThirdParty {
services(first: $first, after: $after) {
edges {
node {
id
name
description
${vendorFragment}
${thirdPartyFragment}
createdAt
updatedAt
}
@@ -127,10 +127,10 @@ export async function execute(
}
`;
const vendorServices = await proboApiRequestAllItems.call(
const thirdPartyServices = await proboApiRequestAllItems.call(
this,
query,
{ vendorId },
{ thirdPartyId },
(response) => {
const data = response?.data as IDataObject | undefined;
const node = data?.node as IDataObject | undefined;
@@ -141,7 +141,7 @@ export async function execute(
);
return {
json: { vendorServices },
json: { thirdPartyServices },
pairedItem: { item: itemIndex },
};
}

View File

@@ -17,17 +17,17 @@ import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor ID',
name: 'vendorId',
displayName: 'ThirdParty ID',
name: 'thirdPartyId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getBusinessAssociateAgreement'],
},
},
default: '',
description: 'The ID of the vendor',
description: 'The ID of the thirdParty',
required: true,
},
];
@@ -36,12 +36,12 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorId = this.getNodeParameter('vendorId', itemIndex) as string;
const thirdPartyId = this.getNodeParameter('thirdPartyId', itemIndex) as string;
const query = `
query GetVendorBusinessAssociateAgreement($vendorId: ID!) {
node(id: $vendorId) {
... on Vendor {
query GetThirdPartyBusinessAssociateAgreement($thirdPartyId: ID!) {
node(id: $thirdPartyId) {
... on ThirdParty {
businessAssociateAgreement {
id
validFrom
@@ -57,7 +57,7 @@ export async function execute(
}
`;
const responseData = await proboApiRequest.call(this, query, { vendorId });
const responseData = await proboApiRequest.call(this, query, { thirdPartyId });
return {
json: responseData,

View File

@@ -17,17 +17,17 @@ import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor Contact ID',
name: 'vendorContactId',
displayName: 'ThirdParty Contact ID',
name: 'thirdPartyContactId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getContact'],
},
},
default: '',
description: 'The ID of the vendor contact',
description: 'The ID of the thirdParty contact',
required: true,
},
{
@@ -38,17 +38,17 @@ export const description: INodeProperties[] = [
default: {},
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getContact'],
},
},
options: [
{
displayName: 'Include Vendor',
name: 'includeVendor',
displayName: 'Include ThirdParty',
name: 'includeThirdParty',
type: 'boolean',
default: false,
description: 'Whether to include vendor in the response',
description: 'Whether to include thirdParty in the response',
},
],
},
@@ -58,28 +58,28 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorContactId = this.getNodeParameter('vendorContactId', itemIndex) as string;
const thirdPartyContactId = this.getNodeParameter('thirdPartyContactId', itemIndex) as string;
const options = this.getNodeParameter('options', itemIndex, {}) as {
includeVendor?: boolean;
includeThirdParty?: boolean;
};
const vendorFragment = options.includeVendor
? `vendor {
const thirdPartyFragment = options.includeThirdParty
? `thirdParty {
id
name
}`
: '';
const query = `
query GetVendorContact($vendorContactId: ID!) {
node(id: $vendorContactId) {
... on VendorContact {
query GetThirdPartyContact($thirdPartyContactId: ID!) {
node(id: $thirdPartyContactId) {
... on ThirdPartyContact {
id
fullName
email
phone
role
${vendorFragment}
${thirdPartyFragment}
createdAt
updatedAt
}
@@ -87,7 +87,7 @@ export async function execute(
}
`;
const responseData = await proboApiRequest.call(this, query, { vendorContactId });
const responseData = await proboApiRequest.call(this, query, { thirdPartyContactId });
return {
json: responseData,

View File

@@ -17,17 +17,17 @@ import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor ID',
name: 'vendorId',
displayName: 'ThirdParty ID',
name: 'thirdPartyId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getDataPrivacyAgreement'],
},
},
default: '',
description: 'The ID of the vendor',
description: 'The ID of the thirdParty',
required: true,
},
];
@@ -36,12 +36,12 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorId = this.getNodeParameter('vendorId', itemIndex) as string;
const thirdPartyId = this.getNodeParameter('thirdPartyId', itemIndex) as string;
const query = `
query GetVendorDataPrivacyAgreement($vendorId: ID!) {
node(id: $vendorId) {
... on Vendor {
query GetThirdPartyDataPrivacyAgreement($thirdPartyId: ID!) {
node(id: $thirdPartyId) {
... on ThirdParty {
dataPrivacyAgreement {
id
validFrom
@@ -57,7 +57,7 @@ export async function execute(
}
`;
const responseData = await proboApiRequest.call(this, query, { vendorId });
const responseData = await proboApiRequest.call(this, query, { thirdPartyId });
return {
json: responseData,

View File

@@ -17,17 +17,17 @@ import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor Risk Assessment ID',
name: 'vendorRiskAssessmentId',
displayName: 'ThirdParty Risk Assessment ID',
name: 'thirdPartyRiskAssessmentId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getRiskAssessment'],
},
},
default: '',
description: 'The ID of the vendor risk assessment',
description: 'The ID of the thirdParty risk assessment',
required: true,
},
{
@@ -38,17 +38,17 @@ export const description: INodeProperties[] = [
default: {},
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getRiskAssessment'],
},
},
options: [
{
displayName: 'Include Vendor',
name: 'includeVendor',
displayName: 'Include ThirdParty',
name: 'includeThirdParty',
type: 'boolean',
default: false,
description: 'Whether to include vendor in the response',
description: 'Whether to include thirdParty in the response',
},
],
},
@@ -58,28 +58,28 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorRiskAssessmentId = this.getNodeParameter('vendorRiskAssessmentId', itemIndex) as string;
const thirdPartyRiskAssessmentId = this.getNodeParameter('thirdPartyRiskAssessmentId', itemIndex) as string;
const options = this.getNodeParameter('options', itemIndex, {}) as {
includeVendor?: boolean;
includeThirdParty?: boolean;
};
const vendorFragment = options.includeVendor
? `vendor {
const thirdPartyFragment = options.includeThirdParty
? `thirdParty {
id
name
}`
: '';
const query = `
query GetVendorRiskAssessment($vendorRiskAssessmentId: ID!) {
node(id: $vendorRiskAssessmentId) {
... on VendorRiskAssessment {
query GetThirdPartyRiskAssessment($thirdPartyRiskAssessmentId: ID!) {
node(id: $thirdPartyRiskAssessmentId) {
... on ThirdPartyRiskAssessment {
id
expiresAt
dataSensitivity
businessImpact
notes
${vendorFragment}
${thirdPartyFragment}
createdAt
updatedAt
}
@@ -88,7 +88,7 @@ export async function execute(
`;
const variables = {
vendorRiskAssessmentId,
thirdPartyRiskAssessmentId,
};
const responseData = await proboApiRequest.call(this, query, variables);

View File

@@ -17,17 +17,17 @@ import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor Service ID',
name: 'vendorServiceId',
displayName: 'ThirdParty Service ID',
name: 'thirdPartyServiceId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getService'],
},
},
default: '',
description: 'The ID of the vendor service',
description: 'The ID of the thirdParty service',
required: true,
},
{
@@ -38,17 +38,17 @@ export const description: INodeProperties[] = [
default: {},
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['getService'],
},
},
options: [
{
displayName: 'Include Vendor',
name: 'includeVendor',
displayName: 'Include ThirdParty',
name: 'includeThirdParty',
type: 'boolean',
default: false,
description: 'Whether to include vendor in the response',
description: 'Whether to include thirdParty in the response',
},
],
},
@@ -58,26 +58,26 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorServiceId = this.getNodeParameter('vendorServiceId', itemIndex) as string;
const thirdPartyServiceId = this.getNodeParameter('thirdPartyServiceId', itemIndex) as string;
const options = this.getNodeParameter('options', itemIndex, {}) as {
includeVendor?: boolean;
includeThirdParty?: boolean;
};
const vendorFragment = options.includeVendor
? `vendor {
const thirdPartyFragment = options.includeThirdParty
? `thirdParty {
id
name
}`
: '';
const query = `
query GetVendorService($vendorServiceId: ID!) {
node(id: $vendorServiceId) {
... on VendorService {
query GetThirdPartyService($thirdPartyServiceId: ID!) {
node(id: $thirdPartyServiceId) {
... on ThirdPartyService {
id
name
description
${vendorFragment}
${thirdPartyFragment}
createdAt
updatedAt
}
@@ -86,7 +86,7 @@ export async function execute(
`;
const variables = {
vendorServiceId,
thirdPartyServiceId,
};
const responseData = await proboApiRequest.call(this, query, variables);

View File

@@ -49,171 +49,171 @@ export const description: INodeProperties[] = [
noDataExpression: true,
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: 'Create a new vendor',
action: 'Create a vendor',
description: 'Create a new third party',
action: 'Create a third party',
},
{
name: 'Create Contact',
value: 'createContact',
description: 'Create a new vendor contact',
action: 'Create a vendor contact',
description: 'Create a new third party contact',
action: 'Create a third party contact',
},
{
name: 'Create Risk Assessment',
value: 'createRiskAssessment',
description: 'Create a new vendor risk assessment',
action: 'Create a vendor risk assessment',
description: 'Create a new third party risk assessment',
action: 'Create a third party risk assessment',
},
{
name: 'Create Service',
value: 'createService',
description: 'Create a new vendor service',
action: 'Create a vendor service',
description: 'Create a new third party service',
action: 'Create a third party service',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a vendor',
action: 'Delete a vendor',
description: 'Delete a third party',
action: 'Delete a third party',
},
{
name: 'Delete Business Associate Agreement',
value: 'deleteBusinessAssociateAgreement',
description: 'Delete a vendor business associate agreement',
action: 'Delete a vendor business associate agreement',
description: 'Delete a third party business associate agreement',
action: 'Delete a third party business associate agreement',
},
{
name: 'Delete Compliance Report',
value: 'deleteComplianceReport',
description: 'Delete a vendor compliance report',
action: 'Delete a vendor compliance report',
description: 'Delete a third party compliance report',
action: 'Delete a third party compliance report',
},
{
name: 'Delete Contact',
value: 'deleteContact',
description: 'Delete a vendor contact',
action: 'Delete a vendor contact',
description: 'Delete a third party contact',
action: 'Delete a third party contact',
},
{
name: 'Delete Data Privacy Agreement',
value: 'deleteDataPrivacyAgreement',
description: 'Delete a vendor data privacy agreement',
action: 'Delete a vendor data privacy agreement',
description: 'Delete a third party data privacy agreement',
action: 'Delete a third party data privacy agreement',
},
{
name: 'Delete Service',
value: 'deleteService',
description: 'Delete a vendor service',
action: 'Delete a vendor service',
description: 'Delete a third party service',
action: 'Delete a third party service',
},
{
name: 'Get',
value: 'get',
description: 'Get a vendor',
action: 'Get a vendor',
description: 'Get a third party',
action: 'Get a third party',
},
{
name: 'Get Business Associate Agreement',
value: 'getBusinessAssociateAgreement',
description: 'Get a vendor business associate agreement',
action: 'Get a vendor business associate agreement',
description: 'Get a third party business associate agreement',
action: 'Get a third party business associate agreement',
},
{
name: 'Get Contact',
value: 'getContact',
description: 'Get a vendor contact',
action: 'Get a vendor contact',
description: 'Get a third party contact',
action: 'Get a third party contact',
},
{
name: 'Get Data Privacy Agreement',
value: 'getDataPrivacyAgreement',
description: 'Get a vendor data privacy agreement',
action: 'Get a vendor data privacy agreement',
description: 'Get a third party data privacy agreement',
action: 'Get a third party data privacy agreement',
},
{
name: 'Get Many',
value: 'getAll',
description: 'Get many vendors',
action: 'Get many vendors',
description: 'Get many third parties',
action: 'Get many third parties',
},
{
name: 'Get Many Compliance Reports',
value: 'getAllComplianceReports',
description: 'Get many vendor compliance reports',
action: 'Get many vendor compliance reports',
description: 'Get many third party compliance reports',
action: 'Get many third party compliance reports',
},
{
name: 'Get Many Contacts',
value: 'getAllContacts',
description: 'Get many vendor contacts',
action: 'Get many vendor contacts',
description: 'Get many third party contacts',
action: 'Get many third party contacts',
},
{
name: 'Get Many Risk Assessments',
value: 'getAllRiskAssessments',
description: 'Get many vendor risk assessments',
action: 'Get many vendor risk assessments',
description: 'Get many third party risk assessments',
action: 'Get many third party risk assessments',
},
{
name: 'Get Many Services',
value: 'getAllServices',
description: 'Get many vendor services',
action: 'Get many vendor services',
description: 'Get many third party services',
action: 'Get many third party services',
},
{
name: 'Get Risk Assessment',
value: 'getRiskAssessment',
description: 'Get a vendor risk assessment',
action: 'Get a vendor risk assessment',
description: 'Get a third party risk assessment',
action: 'Get a third party risk assessment',
},
{
name: 'Get Service',
value: 'getService',
description: 'Get a vendor service',
action: 'Get a vendor service',
description: 'Get a third party service',
action: 'Get a third party service',
},
{
name: 'Publish List',
value: 'publish',
description: 'Publish the vendor register as a document version',
action: 'Publish the vendor register',
description: 'Publish the third party register as a document version',
action: 'Publish the third party register',
},
{
name: 'Update',
value: 'update',
description: 'Update an existing vendor',
action: 'Update a vendor',
description: 'Update an existing third party',
action: 'Update a third party',
},
{
name: 'Update Business Associate Agreement',
value: 'updateBusinessAssociateAgreement',
description: 'Update a vendor business associate agreement validity',
action: 'Update a vendor business associate agreement',
description: 'Update a third party business associate agreement validity',
action: 'Update a third party business associate agreement',
},
{
name: 'Update Contact',
value: 'updateContact',
description: 'Update an existing vendor contact',
action: 'Update a vendor contact',
description: 'Update an existing third party contact',
action: 'Update a third party contact',
},
{
name: 'Update Data Privacy Agreement',
value: 'updateDataPrivacyAgreement',
description: 'Update a vendor data privacy agreement validity',
action: 'Update a vendor data privacy agreement',
description: 'Update a third party data privacy agreement validity',
action: 'Update a third party data privacy agreement',
},
{
name: 'Update Service',
value: 'updateService',
description: 'Update an existing vendor service',
action: 'Update a vendor service',
description: 'Update an existing third party service',
action: 'Update a third party service',
},
],
default: 'create',

View File

@@ -22,12 +22,12 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['publish'],
},
},
default: '',
description: 'The ID of the organization whose vendor list to publish',
description: 'The ID of the organization whose thirdParty list to publish',
required: true,
},
{
@@ -36,7 +36,7 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['publish'],
},
},
@@ -49,7 +49,7 @@ export const description: INodeProperties[] = [
type: 'boolean',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['publish'],
},
},
@@ -67,8 +67,8 @@ export async function execute(
const minor = this.getNodeParameter('minor', itemIndex, false) as boolean;
const query = `
mutation PublishVendorList($input: PublishVendorListInput!) {
publishVendorList(input: $input) {
mutation PublishThirdPartyList($input: PublishThirdPartyListInput!) {
publishThirdPartyList(input: $input) {
documentEdge {
node {
id

View File

@@ -17,17 +17,17 @@ import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor ID',
name: 'vendorId',
displayName: 'ThirdParty ID',
name: 'thirdPartyId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['update'],
},
},
default: '',
description: 'The ID of the vendor to update',
description: 'The ID of the thirdParty to update',
required: true,
},
{
@@ -36,12 +36,12 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['update'],
},
},
default: '',
description: 'The name of the vendor',
description: 'The name of the thirdParty',
},
{
displayName: 'Description',
@@ -52,12 +52,12 @@ export const description: INodeProperties[] = [
},
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['update'],
},
},
default: '',
description: 'The description of the vendor',
description: 'The description of the thirdParty',
},
{
displayName: 'Category',
@@ -65,12 +65,12 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['update'],
},
},
default: '',
description: 'The category of the vendor',
description: 'The category of the thirdParty',
},
{
displayName: 'Website URL',
@@ -78,12 +78,12 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['update'],
},
},
default: '',
description: 'The website URL of the vendor',
description: 'The website URL of the thirdParty',
},
{
displayName: 'Legal Name',
@@ -91,12 +91,12 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['update'],
},
},
default: '',
description: 'The legal name of the vendor',
description: 'The legal name of the thirdParty',
},
{
displayName: 'Headquarter Address',
@@ -104,12 +104,12 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['update'],
},
},
default: '',
description: 'The headquarter address of the vendor',
description: 'The headquarter address of the thirdParty',
},
{
displayName: 'Business Owner ID',
@@ -117,7 +117,7 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['update'],
},
},
@@ -130,7 +130,7 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['update'],
},
},
@@ -143,12 +143,12 @@ export const description: INodeProperties[] = [
type: 'boolean',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['update'],
},
},
default: false,
description: 'Whether to show the vendor on the trust center',
description: 'Whether to show the thirdParty on the trust center',
},
{
displayName: 'Additional Fields',
@@ -158,7 +158,7 @@ export const description: INodeProperties[] = [
default: {},
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['update'],
},
},
@@ -212,7 +212,7 @@ export const description: INodeProperties[] = [
name: 'statusPageUrl',
type: 'string',
default: '',
description: 'The status page URL of the vendor',
description: 'The status page URL of the thirdParty',
},
{
displayName: 'Subprocessors List URL',
@@ -240,7 +240,7 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorId = this.getNodeParameter('vendorId', itemIndex) as string;
const thirdPartyId = this.getNodeParameter('thirdPartyId', itemIndex) as string;
const name = this.getNodeParameter('name', itemIndex, '') as string;
const description = this.getNodeParameter('description', itemIndex, '') as string;
const category = this.getNodeParameter('category', itemIndex, '') as string;
@@ -265,9 +265,9 @@ export async function execute(
};
const query = `
mutation UpdateVendor($input: UpdateVendorInput!) {
updateVendor(input: $input) {
vendor {
mutation UpdateThirdParty($input: UpdateThirdPartyInput!) {
updateThirdParty(input: $input) {
thirdParty {
id
name
description
@@ -294,7 +294,7 @@ export async function execute(
}
`;
const input: Record<string, unknown> = { id: vendorId };
const input: Record<string, unknown> = { id: thirdPartyId };
if (name) input.name = name;
if (description !== undefined) input.description = description === '' ? null : description;
if (category) input.category = category;

View File

@@ -17,17 +17,17 @@ import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor ID',
name: 'vendorId',
displayName: 'ThirdParty ID',
name: 'thirdPartyId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['updateBusinessAssociateAgreement'],
},
},
default: '',
description: 'The ID of the vendor',
description: 'The ID of the thirdParty',
required: true,
},
{
@@ -36,7 +36,7 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['updateBusinessAssociateAgreement'],
},
},
@@ -49,7 +49,7 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['updateBusinessAssociateAgreement'],
},
},
@@ -62,14 +62,14 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorId = this.getNodeParameter('vendorId', itemIndex) as string;
const thirdPartyId = this.getNodeParameter('thirdPartyId', itemIndex) as string;
const validFrom = this.getNodeParameter('validFrom', itemIndex, '') as string;
const validUntil = this.getNodeParameter('validUntil', itemIndex, '') as string;
const query = `
mutation UpdateVendorBusinessAssociateAgreement($input: UpdateVendorBusinessAssociateAgreementInput!) {
updateVendorBusinessAssociateAgreement(input: $input) {
vendorBusinessAssociateAgreement {
mutation UpdateThirdPartyBusinessAssociateAgreement($input: UpdateThirdPartyBusinessAssociateAgreementInput!) {
updateThirdPartyBusinessAssociateAgreement(input: $input) {
thirdPartyBusinessAssociateAgreement {
id
validFrom
validUntil
@@ -78,7 +78,7 @@ export async function execute(
}
`;
const input: Record<string, unknown> = { vendorId };
const input: Record<string, unknown> = { thirdPartyId };
if (validFrom) input.validFrom = validFrom;
if (validUntil) input.validUntil = validUntil;

View File

@@ -17,17 +17,17 @@ import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor Contact ID',
name: 'vendorContactId',
displayName: 'ThirdParty Contact ID',
name: 'thirdPartyContactId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['updateContact'],
},
},
default: '',
description: 'The ID of the vendor contact to update',
description: 'The ID of the thirdParty contact to update',
required: true,
},
{
@@ -38,7 +38,7 @@ export const description: INodeProperties[] = [
default: {},
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['updateContact'],
},
},
@@ -80,7 +80,7 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorContactId = this.getNodeParameter('vendorContactId', itemIndex) as string;
const thirdPartyContactId = this.getNodeParameter('thirdPartyContactId', itemIndex) as string;
const additionalFields = this.getNodeParameter('additionalFields', itemIndex, {}) as {
fullName?: string;
email?: string;
@@ -89,9 +89,9 @@ export async function execute(
};
const query = `
mutation UpdateVendorContact($input: UpdateVendorContactInput!) {
updateVendorContact(input: $input) {
vendorContact {
mutation UpdateThirdPartyContact($input: UpdateThirdPartyContactInput!) {
updateThirdPartyContact(input: $input) {
thirdPartyContact {
id
fullName
email
@@ -104,7 +104,7 @@ export async function execute(
}
`;
const input: Record<string, unknown> = { id: vendorContactId };
const input: Record<string, unknown> = { id: thirdPartyContactId };
if (additionalFields.fullName !== undefined) input.fullName = additionalFields.fullName === '' ? null : additionalFields.fullName;
if (additionalFields.email !== undefined) input.email = additionalFields.email === '' ? null : additionalFields.email;
if (additionalFields.phone !== undefined) input.phone = additionalFields.phone === '' ? null : additionalFields.phone;

View File

@@ -17,17 +17,17 @@ import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor ID',
name: 'vendorId',
displayName: 'ThirdParty ID',
name: 'thirdPartyId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['updateDataPrivacyAgreement'],
},
},
default: '',
description: 'The ID of the vendor',
description: 'The ID of the thirdParty',
required: true,
},
{
@@ -36,7 +36,7 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['updateDataPrivacyAgreement'],
},
},
@@ -49,7 +49,7 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['updateDataPrivacyAgreement'],
},
},
@@ -62,14 +62,14 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorId = this.getNodeParameter('vendorId', itemIndex) as string;
const thirdPartyId = this.getNodeParameter('thirdPartyId', itemIndex) as string;
const validFrom = this.getNodeParameter('validFrom', itemIndex, '') as string;
const validUntil = this.getNodeParameter('validUntil', itemIndex, '') as string;
const query = `
mutation UpdateVendorDataPrivacyAgreement($input: UpdateVendorDataPrivacyAgreementInput!) {
updateVendorDataPrivacyAgreement(input: $input) {
vendorDataPrivacyAgreement {
mutation UpdateThirdPartyDataPrivacyAgreement($input: UpdateThirdPartyDataPrivacyAgreementInput!) {
updateThirdPartyDataPrivacyAgreement(input: $input) {
thirdPartyDataPrivacyAgreement {
id
validFrom
validUntil
@@ -78,7 +78,7 @@ export async function execute(
}
`;
const input: Record<string, unknown> = { vendorId };
const input: Record<string, unknown> = { thirdPartyId };
if (validFrom) input.validFrom = validFrom;
if (validUntil) input.validUntil = validUntil;

View File

@@ -17,17 +17,17 @@ import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Vendor Service ID',
name: 'vendorServiceId',
displayName: 'ThirdParty Service ID',
name: 'thirdPartyServiceId',
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['updateService'],
},
},
default: '',
description: 'The ID of the vendor service to update',
description: 'The ID of the thirdParty service to update',
required: true,
},
{
@@ -36,12 +36,12 @@ export const description: INodeProperties[] = [
type: 'string',
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['updateService'],
},
},
default: '',
description: 'The name of the vendor service',
description: 'The name of the thirdParty service',
},
{
displayName: 'Description',
@@ -52,12 +52,12 @@ export const description: INodeProperties[] = [
},
displayOptions: {
show: {
resource: ['vendor'],
resource: ['thirdParty'],
operation: ['updateService'],
},
},
default: '',
description: 'The description of the vendor service',
description: 'The description of the thirdParty service',
},
];
@@ -65,14 +65,14 @@ export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const vendorServiceId = this.getNodeParameter('vendorServiceId', itemIndex) as string;
const thirdPartyServiceId = this.getNodeParameter('thirdPartyServiceId', itemIndex) as string;
const name = this.getNodeParameter('name', itemIndex, '') as string;
const description = this.getNodeParameter('description', itemIndex, '') as string;
const query = `
mutation UpdateVendorService($input: UpdateVendorServiceInput!) {
updateVendorService(input: $input) {
vendorService {
mutation UpdateThirdPartyService($input: UpdateThirdPartyServiceInput!) {
updateThirdPartyService(input: $input) {
thirdPartyService {
id
name
description
@@ -83,7 +83,7 @@ export async function execute(
}
`;
const input: Record<string, unknown> = { id: vendorServiceId };
const input: Record<string, unknown> = { id: thirdPartyServiceId };
if (name) input.name = name;
if (description !== undefined) input.description = description === '' ? null : description;

View File

@@ -61,12 +61,12 @@ export const description: INodeProperties[] = [
{ name: 'Obligation Created', value: 'OBLIGATION_CREATED' },
{ name: 'Obligation Deleted', value: 'OBLIGATION_DELETED' },
{ name: 'Obligation Updated', value: 'OBLIGATION_UPDATED' },
{ name: 'Third Party Created', value: 'THIRD_PARTY_CREATED' },
{ name: 'Third Party Deleted', value: 'THIRD_PARTY_DELETED' },
{ name: 'Third Party Updated', value: 'THIRD_PARTY_UPDATED' },
{ name: 'User Created', value: 'USER_CREATED' },
{ name: 'User Deleted', value: 'USER_DELETED' },
{ name: 'User Updated', value: 'USER_UPDATED' },
{ name: 'Vendor Created', value: 'VENDOR_CREATED' },
{ name: 'Vendor Deleted', value: 'VENDOR_DELETED' },
{ name: 'Vendor Updated', value: 'VENDOR_UPDATED' },
],
default: [],
description: 'The event types to subscribe to',

View File

@@ -60,12 +60,12 @@ export const description: INodeProperties[] = [
{ name: 'Obligation Created', value: 'OBLIGATION_CREATED' },
{ name: 'Obligation Deleted', value: 'OBLIGATION_DELETED' },
{ name: 'Obligation Updated', value: 'OBLIGATION_UPDATED' },
{ name: 'Third Party Created', value: 'THIRD_PARTY_CREATED' },
{ name: 'Third Party Deleted', value: 'THIRD_PARTY_DELETED' },
{ name: 'Third Party Updated', value: 'THIRD_PARTY_UPDATED' },
{ name: 'User Created', value: 'USER_CREATED' },
{ name: 'User Deleted', value: 'USER_DELETED' },
{ name: 'User Updated', value: 'USER_UPDATED' },
{ name: 'Vendor Created', value: 'VENDOR_CREATED' },
{ name: 'Vendor Deleted', value: 'VENDOR_DELETED' },
{ name: 'Vendor Updated', value: 'VENDOR_UPDATED' },
],
default: [],
description: 'The event types to subscribe to (replaces existing selection)',

View File

@@ -1,6 +1,6 @@
# Vendors
# Third parties
The [vendors.json](vendors.json) file and derived files contains data about various vendors and their security certifications. This data is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.
The [data.json](data.json) file and derived files contain data about various third parties and their security certifications. This data is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.
## License Requirements

View File

@@ -1,23 +1,23 @@
# Vendors library
# ThirdParties library
A curated collection of software vendor information for use in vendor management and compliance activities.
A curated collection of software thirdParty information for use in thirdParty management and compliance activities.
## Overview
This package provides a structured dataset of software vendors and service providers with comprehensive metadata including:
This package provides a structured dataset of software thirdParties and service providers with comprehensive metadata including:
- Basic vendor information (name, website, description)
- Basic thirdParty information (name, website, description)
- Legal documentation URLs (privacy policy, terms of service, etc.)
- Compliance certifications
- Security information
## Data Structure
Each vendor entry follows the structure defined in `data.d.ts`, including fields for:
Each thirdParty entry follows the structure defined in `data.d.ts`, including fields for:
- `name`: Display name of the vendor
- `name`: Display name of the thirdParty
- `legalName`: Legal business name
- `websiteUrl`: Vendor's website
- `websiteUrl`: ThirdParty's website
- `privacyPolicyUrl`: URL to privacy policy
- `termsOfServiceUrl`: URL to terms of service
- And many more compliance-related URLs and metadata

View File

@@ -1,4 +1,4 @@
# Vendors
# ThirdParties
## Table of Contents by Category
@@ -2727,7 +2727,7 @@ AI-powered global spend platform offering corporate cards, expense management, b
## Ramp
Corporate spend-management platform offering corporate cards, expense automation, bill pay, and vendor management for finance teams.
Corporate spend-management platform offering corporate cards, expense automation, bill pay, and thirdParty management for finance teams.
**Legal Name:** Ramp Business Corporation
@@ -2861,7 +2861,7 @@ Puzzle provides modern, real-time accounting software that gives startups automa
## Probo
Probo is an open-source compliance platform that helps startups achieve SOC 2 and ISO 27001 certifications quickly and affordably, with expert guidance and no vendor lock-in.
Probo is an open-source compliance platform that helps startups achieve SOC 2 and ISO 27001 certifications quickly and affordably, with expert guidance and no thirdParty lock-in.
**Legal Name:** Probo Inc.
@@ -3057,7 +3057,7 @@ Comprehensive public cloud computing platform offering infrastructure, data anal
- Cloud Computing Compliance Controls Catalog (C5)
- CSA
- GSMA SAS-SM
- Higher Education Cloud Vendor Assessment Tool (HECVAT)
- Higher Education Cloud ThirdParty Assessment Tool (HECVAT)
- ISO 9001:2015
- ISO 22301:2019 & BS EN ISO 22301:2019
- ISO 50001:2018

View File

@@ -13,13 +13,13 @@
// PERFORMANCE OF THIS SOFTWARE.
/**
* Type definitions for vendor data
* Type definitions for thirdParty data
*/
/**
* Category types for vendors
* Category types for thirdParties
*/
export type VendorCategory =
export type ThirdPartyCategory =
| "ANALYTICS"
| "CLOUD_MONITORING"
| "CLOUD_PROVIDER"
@@ -44,72 +44,72 @@ export type VendorCategory =
| "VERSION_CONTROL";
/**
* Represents a software vendor or service provider with associated metadata
* Represents a software thirdParty or service provider with associated metadata
*/
export interface Vendor {
/** Display name of the vendor */
export interface ThirdParty {
/** Display name of the thirdParty */
name: string;
/** Legal business name of the vendor */
/** Legal business name of the thirdParty */
legalName?: string;
/** Physical headquarters address */
headquarterAddress?: string;
/** Vendor's website URL */
/** ThirdParty's website URL */
websiteUrl: string;
/** URL to vendor's privacy policy */
/** URL to thirdParty's privacy policy */
privacyPolicyUrl?: string;
/** URL to vendor's terms of service */
/** URL to thirdParty's terms of service */
termsOfServiceUrl?: string;
/** URL to vendor's service level agreement */
/** URL to thirdParty's service level agreement */
serviceLevelAgreementUrl?: string;
/** URL to service software agreement */
serviceSoftwareAgreementUrl?: string;
/** URL to vendor's data processing agreement */
/** URL to thirdParty's data processing agreement */
dataProcessingAgreementUrl?: string;
/** URL to vendor's list of subprocessors */
/** URL to thirdParty's list of subprocessors */
subprocessorsListUrl?: string;
/** URL to vendor's business associate agreement */
/** URL to thirdParty's business associate agreement */
businessAssociateAgreementUrl?: string;
/** Short description of the vendor/service */
/** Short description of the thirdParty/service */
description?: string;
/** Primary category for the vendor */
category?: VendorCategory;
/** Primary category for the thirdParty */
category?: ThirdPartyCategory;
/** Security or compliance certifications held by the vendor */
/** Security or compliance certifications held by the thirdParty */
certifications?: string[];
/** URL to vendor's security page */
/** URL to thirdParty's security page */
securityPageUrl?: string;
/** URL to vendor's trust page */
/** URL to thirdParty's trust page */
trustPageUrl?: string;
/** URL to vendor's status page */
/** URL to thirdParty's status page */
statusPageUrl?: string;
/** Countries where the vendor is located */
/** Countries where the thirdParty is located */
countries?: CountryCode[];
}
/**
* Array of vendor data
* Array of thirdParty data
*/
export type Vendors = Vendor[];
export type ThirdParties = ThirdParty[];
/**
* Default export representing the entire vendor dataset
* Default export representing the entire thirdParty dataset
*/
declare const data: Vendors;
declare const data: ThirdParties;
export default data;

View File

@@ -1,5 +1,5 @@
{
"name": "@probo/vendors",
"name": "@probo/third-parties",
"version": "0.0.1",
"publishConfig": {
"access": "public"

View File

@@ -0,0 +1,143 @@
import { readFile } from "node:fs/promises";
import { createWriteStream } from "node:fs";
import path from "node:path";
const data = await readFile(path.join(import.meta.dirname, '../data.json'), 'utf8');
const thirdParties = JSON.parse(data);
const output = path.join(import.meta.dirname, '../VENDORS.md');
const file = createWriteStream(output);
const formatAsList = (array) => {
if (!array || array.length === 0) return '';
if (typeof array === 'string') {
return array.split(',').map(item => `- ${item.trim()}`).join('\n');
}
return array.map(item => `- ${item}`).join('\n');
};
file.write('# ThirdParties\n\n');
file.write('## Table of Contents by Category\n\n');
const categoriesMap = new Map();
for (const thirdParty of thirdParties) {
const category = (thirdParty.category || thirdParty.categories || 'Uncategorized');
if (!categoriesMap.has(category)) {
categoriesMap.set(category, []);
}
categoriesMap.get(category).push(thirdParty.name);
}
const sortedCategories = [...categoriesMap.keys()].sort();
for (const category of sortedCategories) {
file.write(`### ${category}\n\n`);
const thirdPartiesInCategory = categoriesMap.get(category).sort();
for (const thirdPartyName of thirdPartiesInCategory) {
// Create proper anchor by:
// 1. Converting to lowercase
// 2. Replacing spaces with hyphens
// 3. Removing parentheses, dots, and other special characters
const anchor = thirdPartyName.toLowerCase()
.replace(/\s+/g, '-')
.replace(/[\(\)\.]/g, '')
.replace(/[^a-z0-9\-]/g, '');
file.write(`- [${thirdPartyName}](#${anchor})\n`);
}
file.write('\n');
}
file.write('---\n\n');
for (const thirdParty of thirdParties) {
file.write(`## ${thirdParty.name}\n\n`);
if (thirdParty.description) {
file.write(`${thirdParty.description}\n\n`);
}
if (thirdParty.legalName) {
file.write(`**Legal Name:** ${thirdParty.legalName}\n\n`);
}
if (thirdParty.headquarterAddress) {
file.write(`**Headquarters:** ${thirdParty.headquarterAddress}\n\n`);
}
file.write('### Links\n\n');
file.write('| Resource | Link |\n');
file.write('|----------|------|\n');
if (thirdParty.websiteUrl) {
file.write(`| Website | [Link](${thirdParty.websiteUrl}) |\n`);
}
if (thirdParty.privacyPolicyUrl) {
file.write(`| Privacy Policy | [Link](${thirdParty.privacyPolicyUrl}) |\n`);
}
if (thirdParty.termsOfServiceUrl && thirdParty.termsOfServiceUrl !== 'undefined') {
file.write(`| Terms of Service | [Link](${thirdParty.termsOfServiceUrl}) |\n`);
}
if (thirdParty.serviceLevelAgreementUrl && thirdParty.serviceLevelAgreementUrl !== 'undefined') {
file.write(`| Service Level Agreement | [Link](${thirdParty.serviceLevelAgreementUrl}) |\n`);
}
if (thirdParty.securityPageUrl && thirdParty.securityPageUrl !== 'undefined') {
file.write(`| Security Page | [Link](${thirdParty.securityPageUrl}) |\n`);
}
if (thirdParty.trustPageUrl && thirdParty.trustPageUrl !== 'undefined') {
file.write(`| Trust Page | [Link](${thirdParty.trustPageUrl}) |\n`);
}
if (thirdParty.statusPageUrl && thirdParty.statusPageUrl !== 'undefined') {
file.write(`| Status Page | [Link](${thirdParty.statusPageUrl}) |\n`);
}
if (thirdParty.dataProcessingAgreementUrl && thirdParty.dataProcessingAgreementUrl !== 'undefined') {
file.write(`| Data Processing Agreement | [Link](${thirdParty.dataProcessingAgreementUrl}) |\n`);
}
if (thirdParty.businessAssociateAgreementUrl && thirdParty.businessAssociateAgreementUrl !== 'undefined') {
file.write(`| Business Associate Agreement | [Link](${thirdParty.businessAssociateAgreementUrl}) |\n`);
}
if (thirdParty.serviceSoftwareAgreementUrl && thirdParty.serviceSoftwareAgreementUrl !== 'undefined') {
file.write(`| Service Software Agreement | [Link](${thirdParty.serviceSoftwareAgreementUrl}) |\n`);
}
if (thirdParty.subprocessorsListUrl && thirdParty.subprocessorsListUrl !== 'undefined') {
file.write(`| Subprocessors List | [Link](${thirdParty.subprocessorsListUrl}) |\n`);
}
file.write('\n');
if (thirdParty.categories && thirdParty.categories !== 'undefined') {
file.write(`**Categories:** ${thirdParty.categories}\n\n`);
} else if (thirdParty.category && thirdParty.category !== 'undefined') {
file.write(`**Category:** ${thirdParty.category}\n\n`);
}
if (thirdParty.certifications && thirdParty.certifications !== 'undefined') {
file.write('### Certifications\n\n');
file.write(formatAsList(thirdParty.certifications));
file.write('\n\n');
}
if (thirdParty.subprocessors && thirdParty.subprocessors !== 'undefined') {
file.write('### Subprocessors\n\n');
file.write(formatAsList(thirdParty.subprocessors));
file.write('\n\n');
}
file.write('---\n\n');
}
file.end();

View File

@@ -33,7 +33,7 @@ import { Slack } from "./Slack";
import { Supabase } from "./Supabase";
import { Tally } from "./Tally";
const vendors: Record<string, FC<ComponentProps<"svg">>> = {
const thirdParties: Record<string, FC<ComponentProps<"svg">>> = {
BREX: Brex,
CLOUDFLARE: Cloudflare,
DOCUSIGN: DocuSign,
@@ -57,15 +57,15 @@ const vendors: Record<string, FC<ComponentProps<"svg">>> = {
TALLY: Tally,
};
type VendorLogoProps = ComponentProps<"svg"> & {
/** The vendor/brand name (case-insensitive, supports enum values like GOOGLE_WORKSPACE). */
vendor: string;
type ThirdPartyLogoProps = ComponentProps<"svg"> & {
/** The thirdParty/brand name (case-insensitive, supports enum values like GOOGLE_WORKSPACE). */
thirdParty: string;
/** When true, renders the SVG in monochrome, adapting to the current theme. */
tint?: boolean;
};
export function VendorLogo({ vendor, tint, ...props }: VendorLogoProps) {
const Component = vendors[vendor.toUpperCase()];
export function ThirdPartyLogo({ thirdParty, tint, ...props }: ThirdPartyLogoProps) {
const Component = thirdParties[thirdParty.toUpperCase()];
if (!Component) return null;
if (tint) {

View File

@@ -16,4 +16,4 @@ export { Sentry } from "./Sentry";
export { Slack } from "./Slack";
export { Supabase } from "./Supabase";
export { Tally } from "./Tally";
export { VendorLogo } from "./VendorLogo";
export { ThirdPartyLogo } from "./ThirdPartyLogo";

View File

@@ -61,7 +61,7 @@ export {
Row,
RowButton,
} from "./Atoms/DataTable/DataTable";
export * from "./Atoms/Vendors";
export * from "./Atoms/ThirdParties";
// Molecules
export {

View File

@@ -1,143 +0,0 @@
import { readFile } from "node:fs/promises";
import { createWriteStream } from "node:fs";
import path from "node:path";
const data = await readFile(path.join(import.meta.dirname, '../data.json'), 'utf8');
const vendors = JSON.parse(data);
const output = path.join(import.meta.dirname, '../VENDORS.md');
const file = createWriteStream(output);
const formatAsList = (array) => {
if (!array || array.length === 0) return '';
if (typeof array === 'string') {
return array.split(',').map(item => `- ${item.trim()}`).join('\n');
}
return array.map(item => `- ${item}`).join('\n');
};
file.write('# Vendors\n\n');
file.write('## Table of Contents by Category\n\n');
const categoriesMap = new Map();
for (const vendor of vendors) {
const category = (vendor.category || vendor.categories || 'Uncategorized');
if (!categoriesMap.has(category)) {
categoriesMap.set(category, []);
}
categoriesMap.get(category).push(vendor.name);
}
const sortedCategories = [...categoriesMap.keys()].sort();
for (const category of sortedCategories) {
file.write(`### ${category}\n\n`);
const vendorsInCategory = categoriesMap.get(category).sort();
for (const vendorName of vendorsInCategory) {
// Create proper anchor by:
// 1. Converting to lowercase
// 2. Replacing spaces with hyphens
// 3. Removing parentheses, dots, and other special characters
const anchor = vendorName.toLowerCase()
.replace(/\s+/g, '-')
.replace(/[\(\)\.]/g, '')
.replace(/[^a-z0-9\-]/g, '');
file.write(`- [${vendorName}](#${anchor})\n`);
}
file.write('\n');
}
file.write('---\n\n');
for (const vendor of vendors) {
file.write(`## ${vendor.name}\n\n`);
if (vendor.description) {
file.write(`${vendor.description}\n\n`);
}
if (vendor.legalName) {
file.write(`**Legal Name:** ${vendor.legalName}\n\n`);
}
if (vendor.headquarterAddress) {
file.write(`**Headquarters:** ${vendor.headquarterAddress}\n\n`);
}
file.write('### Links\n\n');
file.write('| Resource | Link |\n');
file.write('|----------|------|\n');
if (vendor.websiteUrl) {
file.write(`| Website | [Link](${vendor.websiteUrl}) |\n`);
}
if (vendor.privacyPolicyUrl) {
file.write(`| Privacy Policy | [Link](${vendor.privacyPolicyUrl}) |\n`);
}
if (vendor.termsOfServiceUrl && vendor.termsOfServiceUrl !== 'undefined') {
file.write(`| Terms of Service | [Link](${vendor.termsOfServiceUrl}) |\n`);
}
if (vendor.serviceLevelAgreementUrl && vendor.serviceLevelAgreementUrl !== 'undefined') {
file.write(`| Service Level Agreement | [Link](${vendor.serviceLevelAgreementUrl}) |\n`);
}
if (vendor.securityPageUrl && vendor.securityPageUrl !== 'undefined') {
file.write(`| Security Page | [Link](${vendor.securityPageUrl}) |\n`);
}
if (vendor.trustPageUrl && vendor.trustPageUrl !== 'undefined') {
file.write(`| Trust Page | [Link](${vendor.trustPageUrl}) |\n`);
}
if (vendor.statusPageUrl && vendor.statusPageUrl !== 'undefined') {
file.write(`| Status Page | [Link](${vendor.statusPageUrl}) |\n`);
}
if (vendor.dataProcessingAgreementUrl && vendor.dataProcessingAgreementUrl !== 'undefined') {
file.write(`| Data Processing Agreement | [Link](${vendor.dataProcessingAgreementUrl}) |\n`);
}
if (vendor.businessAssociateAgreementUrl && vendor.businessAssociateAgreementUrl !== 'undefined') {
file.write(`| Business Associate Agreement | [Link](${vendor.businessAssociateAgreementUrl}) |\n`);
}
if (vendor.serviceSoftwareAgreementUrl && vendor.serviceSoftwareAgreementUrl !== 'undefined') {
file.write(`| Service Software Agreement | [Link](${vendor.serviceSoftwareAgreementUrl}) |\n`);
}
if (vendor.subprocessorsListUrl && vendor.subprocessorsListUrl !== 'undefined') {
file.write(`| Subprocessors List | [Link](${vendor.subprocessorsListUrl}) |\n`);
}
file.write('\n');
if (vendor.categories && vendor.categories !== 'undefined') {
file.write(`**Categories:** ${vendor.categories}\n\n`);
} else if (vendor.category && vendor.category !== 'undefined') {
file.write(`**Category:** ${vendor.category}\n\n`);
}
if (vendor.certifications && vendor.certifications !== 'undefined') {
file.write('### Certifications\n\n');
file.write(formatAsList(vendor.certifications));
file.write('\n\n');
}
if (vendor.subprocessors && vendor.subprocessors !== 'undefined') {
file.write('### Subprocessors\n\n');
file.write(formatAsList(vendor.subprocessors));
file.write('\n\n');
}
file.write('---\n\n');
}
file.end();