@memberjunction/actions-peopledatalabs 0.0.0 → 6.2.0-edge.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,257 @@
1
+ /**
2
+ * A table-agnostic People Data Labs client: bulk person enrichment, person search, a size-1 count,
3
+ * and the free school lookups. It fetches and returns normalized data and writes nothing. Only the
4
+ * fields below are mapped; emails, phones, addresses and everything else PDL returns never leave
5
+ * this module unless `IncludeRaw` is set for debugging.
6
+ */
7
+ import { LogError } from '@memberjunction/core';
8
+ import { DefaultMinLikelihood, PDLAPIEndpoint } from './config.js';
9
+ import { ResolvePDLAPIKey } from './credentials.js';
10
+ export class PDLRateLimitError extends Error {
11
+ constructor(message, retryAfterSeconds) {
12
+ super(message);
13
+ this.name = 'PDLRateLimitError';
14
+ this.RetryAfterSeconds = retryAfterSeconds;
15
+ }
16
+ }
17
+ export class PDLCreditsExhaustedError extends Error {
18
+ constructor(message) {
19
+ super(message);
20
+ this.name = 'PDLCreditsExhaustedError';
21
+ }
22
+ }
23
+ export class PDLAuthError extends Error {
24
+ constructor(message, status) {
25
+ super(message);
26
+ this.name = 'PDLAuthError';
27
+ this.Status = status;
28
+ }
29
+ }
30
+ export class PDLRequestError extends Error {
31
+ constructor(message, status, body) {
32
+ super(message);
33
+ this.name = 'PDLRequestError';
34
+ this.Status = status;
35
+ this.Body = body;
36
+ }
37
+ }
38
+ export class PDLPersonClient {
39
+ static { this.MaxBatchSize = 100; }
40
+ static { this.MaxSearchPageSize = 100; }
41
+ constructor(apiKey, options) {
42
+ if (!apiKey || apiKey.trim().length === 0)
43
+ throw new Error('PDLPersonClient: apiKey is required');
44
+ this.apiKey = apiKey.trim();
45
+ // Bind global fetch so it keeps its expected `this` when not injected.
46
+ this.fetchImpl = options?.FetchImpl ?? fetch.bind(globalThis);
47
+ this.baseURL = TrimTrailingSlashes(options?.BaseURL ?? PDLAPIEndpoint);
48
+ }
49
+ /** Resolve the key through the credentials path (company credential, then PDL_API_KEY), then construct a client. */
50
+ static async ForCompany(companyID, contextUser, options) {
51
+ const key = await ResolvePDLAPIKey(companyID, contextUser);
52
+ if (!key)
53
+ return null;
54
+ return { Client: new PDLPersonClient(key.apiKey, options), KeySource: key.source };
55
+ }
56
+ async BulkEnrich(inputs, options) {
57
+ ValidateInputs(inputs);
58
+ const requests = inputs.map((input) => ({ params: BuildParams(input, options), metadata: { key: input.Key } }));
59
+ const response = await this.request('POST', '/person/bulk', { body: { requests }, context: 'BulkEnrich' });
60
+ const items = response.Body;
61
+ if (!Array.isArray(items) || items.length !== inputs.length) {
62
+ throw new PDLRequestError(`PDLPersonClient.BulkEnrich: expected ${inputs.length} results, got ${Array.isArray(items) ? items.length : 'a non-array body'}`, response.Status, response.Text);
63
+ }
64
+ const matches = items.map((item, index) => MapBulkItem(item, inputs[index], options?.IncludeRaw === true));
65
+ const matched = matches.filter((match) => match.Matched).length;
66
+ return { Matches: matches, CreditsConsumed: response.Headers.creditsSpent ?? matched };
67
+ }
68
+ /** One page of Person Search. Billed per record returned. A no-records response is `Total: 0`, not an error. */
69
+ async SearchPeople(request) {
70
+ if (!Number.isInteger(request.Size) || request.Size < 1 || request.Size > PDLPersonClient.MaxSearchPageSize) {
71
+ throw new Error(`PDLPersonClient.SearchPeople: Size must be an integer from 1 to ${PDLPersonClient.MaxSearchPageSize}`);
72
+ }
73
+ const body = { query: request.Query, size: request.Size };
74
+ if (request.ScrollToken)
75
+ body.scroll_token = request.ScrollToken;
76
+ const response = await this.request('POST', '/person/search', { body, context: 'SearchPeople', allowNotFound: true });
77
+ if (response.Status === 404)
78
+ return { Total: 0, People: [], ScrollToken: null, CreditsConsumed: 0 };
79
+ const people = (response.Body.data ?? []).map((person) => MapPerson(person, person.id ?? '', true, null, false));
80
+ return { Total: response.Body.total ?? people.length, People: people, ScrollToken: response.Body.scroll_token ?? null, CreditsConsumed: response.Headers.creditsSpent ?? people.length };
81
+ }
82
+ /** A size-1 search that returns only the total; the one record is discarded unmapped. */
83
+ async CountPeople(query) {
84
+ const response = await this.request('POST', '/person/search', { body: { query, size: 1 }, context: 'CountPeople', allowNotFound: true });
85
+ if (response.Status === 404)
86
+ return { Total: 0, CreditsConsumed: 0 };
87
+ return { Total: response.Body.total ?? 0, CreditsConsumed: response.Headers.creditsSpent ?? (response.Body.data?.length ?? 0) };
88
+ }
89
+ /** Autocomplete on `field=school`. Free of credits; rate-limited only. */
90
+ async SuggestSchools(text, size = 10) {
91
+ const query = `field=school&text=${encodeURIComponent(text)}&size=${Math.max(1, Math.min(100, Math.floor(size)))}`;
92
+ const response = await this.request('GET', `/autocomplete?${query}`, { context: 'SuggestSchools', allowNotFound: true });
93
+ if (response.Status === 404)
94
+ return [];
95
+ return (response.Body.data ?? []).map((item) => ({ Name: item.name, SchoolID: item.meta?.id ?? null, Count: typeof item.count === 'number' ? item.count : null }));
96
+ }
97
+ /** School Cleaner. Free of credits. Returns null when PDL can't resolve the name. Not trustworthy alone: confirm with SuggestSchools. */
98
+ async CleanSchool(name) {
99
+ const response = await this.request('GET', `/school/clean?name=${encodeURIComponent(name)}`, { context: 'CleanSchool', allowNotFound: true });
100
+ if (response.Status === 404 || !response.Body.name)
101
+ return null;
102
+ return { Name: response.Body.name, SchoolID: response.Body.id ?? null, Count: null };
103
+ }
104
+ async request(method, path, args) {
105
+ const headers = { 'X-Api-Key': this.apiKey, accept: 'application/json' };
106
+ if (args.body !== undefined)
107
+ headers['Content-Type'] = 'application/json';
108
+ const response = await this.fetchImpl(`${this.baseURL}${path}`, { method, headers, body: args.body !== undefined ? JSON.stringify(args.body) : undefined });
109
+ const text = await response.text();
110
+ const parsed = ParseJson(text);
111
+ const result = { Status: response.status, Body: parsed, Headers: ReadHeaders(response.headers), Text: text };
112
+ if (response.ok || (args.allowNotFound && response.status === 404))
113
+ return result;
114
+ throw ClassifyFailure(response.status, parsed, text, result.Headers, `PDLPersonClient.${args.context}: ${method} ${path}`);
115
+ }
116
+ }
117
+ /** Reject oversize batches and inputs nothing identifies before any HTTP call. */
118
+ function ValidateInputs(inputs) {
119
+ if (inputs.length === 0)
120
+ throw new Error('PDLPersonClient.BulkEnrich: at least one input is required');
121
+ if (inputs.length > PDLPersonClient.MaxBatchSize)
122
+ throw new Error(`PDLPersonClient.BulkEnrich: at most ${PDLPersonClient.MaxBatchSize} inputs per call (got ${inputs.length})`);
123
+ inputs.forEach((input, index) => {
124
+ const hasName = !!input.FirstName?.trim() && !!input.LastName?.trim() && !!input.Company?.trim();
125
+ if (!input.PDLID?.trim() && !input.Email?.trim() && !input.LinkedInURL?.trim() && !hasName) {
126
+ throw new Error(`PDLPersonClient.BulkEnrich: input ${index} (${input.Key}) has no identifying field (PDLID, Email, LinkedInURL, or first name + last name + company)`);
127
+ }
128
+ });
129
+ }
130
+ function BuildParams(input, options) {
131
+ const params = { min_likelihood: options?.MinLikelihood ?? DefaultMinLikelihood };
132
+ if (input.PDLID?.trim())
133
+ params.pdl_id = input.PDLID.trim();
134
+ if (input.Email?.trim())
135
+ params.email = input.Email.trim();
136
+ if (input.LinkedInURL?.trim())
137
+ params.profile = input.LinkedInURL.trim();
138
+ if (input.FirstName?.trim())
139
+ params.first_name = input.FirstName.trim();
140
+ if (input.LastName?.trim())
141
+ params.last_name = input.LastName.trim();
142
+ if (input.Company?.trim())
143
+ params.company = input.Company.trim();
144
+ if (options?.Required)
145
+ params.required = options.Required;
146
+ if (options?.DataInclude && options.DataInclude.length > 0)
147
+ params.data_include = options.DataInclude.join(',');
148
+ return params;
149
+ }
150
+ function MapBulkItem(item, input, includeRaw) {
151
+ const echoed = item.metadata?.key;
152
+ if (echoed !== undefined && echoed !== input.Key) {
153
+ throw new PDLRequestError(`PDLPersonClient.BulkEnrich: result for '${input.Key}' carried metadata.key '${String(echoed)}'; refusing to correlate by position`, item.status, JSON.stringify(item));
154
+ }
155
+ if (item.status === 200 && item.data)
156
+ return MapPerson(item.data, input.Key, true, item.likelihood ?? null, includeRaw);
157
+ const empty = MapPerson(null, input.Key, false, null, false);
158
+ if (item.status === 404)
159
+ return empty;
160
+ return { ...empty, ErrorMessage: `PDL returned ${item.status}${item.error ? `: ${ErrorText(item.error)}` : ''}` };
161
+ }
162
+ function MapPerson(data, key, matched, likelihood, includeRaw) {
163
+ const match = {
164
+ Key: key,
165
+ Matched: matched,
166
+ PDLID: data?.id ?? null,
167
+ Likelihood: likelihood,
168
+ LinkedInURL: data?.linkedin_url ?? null,
169
+ Education: (data?.education ?? []).map(MapEducation).filter((entry) => entry !== null),
170
+ Experience: (data?.experience ?? []).map(MapExperience).filter((entry) => entry !== null),
171
+ ErrorMessage: null,
172
+ };
173
+ if (includeRaw && data)
174
+ match.Raw = data;
175
+ return match;
176
+ }
177
+ function MapEducation(raw) {
178
+ const name = raw.school?.name?.trim();
179
+ if (!name)
180
+ return null;
181
+ return { SchoolName: name, SchoolID: raw.school?.id ?? null, Degrees: raw.degrees ?? [], Majors: raw.majors ?? [], StartDate: NormalizeDate(raw.start_date), EndDate: NormalizeDate(raw.end_date) };
182
+ }
183
+ function MapExperience(raw) {
184
+ const name = raw.company?.name?.trim();
185
+ if (!name)
186
+ return null;
187
+ return { CompanyName: name, CompanyDomain: DomainOf(raw.company?.website), Title: raw.title?.name?.trim() || null, StartDate: NormalizeDate(raw.start_date), EndDate: NormalizeDate(raw.end_date), IsCurrent: raw.is_primary === true };
188
+ }
189
+ /** `YYYY`, `YYYY-MM` and `YYYY-MM-DD` to the first day of the year or month; anything else to null. */
190
+ /** Strips trailing slashes without a regex: `/\/+$/` is quadratic on a long run of slashes (CodeQL js/polynomial-redos). */
191
+ export function TrimTrailingSlashes(value) {
192
+ let end = value.length;
193
+ while (end > 0 && value.charAt(end - 1) === '/')
194
+ end--;
195
+ return value.slice(0, end);
196
+ }
197
+ export function NormalizeDate(value) {
198
+ if (!value)
199
+ return null;
200
+ const trimmed = value.trim();
201
+ if (/^\d{4}$/.test(trimmed))
202
+ return `${trimmed}-01-01`;
203
+ if (/^\d{4}-\d{2}$/.test(trimmed))
204
+ return `${trimmed}-01`;
205
+ if (/^\d{4}-\d{2}-\d{2}/.test(trimmed))
206
+ return trimmed.slice(0, 10);
207
+ return null;
208
+ }
209
+ /** Bare host of a website or domain value. */
210
+ export function DomainOf(value) {
211
+ if (!value)
212
+ return null;
213
+ let host = value.trim().toLowerCase().replace(/^[a-z][a-z0-9+.-]*:\/\//, '').replace(/^www\./, '');
214
+ host = host.split(/[/?#]/)[0].replace(/:\d+$/, '').replace(/\.$/, '');
215
+ return host === '' ? null : host;
216
+ }
217
+ function ParseJson(text) {
218
+ try {
219
+ return text ? JSON.parse(text) : null;
220
+ }
221
+ catch {
222
+ return null;
223
+ }
224
+ }
225
+ function ErrorText(error) {
226
+ if (!error)
227
+ return '';
228
+ const type = Array.isArray(error.type) ? error.type.join(',') : error.type;
229
+ return `${type}: ${error.message}`;
230
+ }
231
+ function ReadHeaders(headers) {
232
+ const number = (name) => { const v = headers.get(name); return v !== null && v.trim() !== '' && !Number.isNaN(Number(v)) ? Number(v) : null; };
233
+ return { creditsSpent: number('x-call-credits-spent'), creditsType: headers.get('x-call-credits-type'), rateLimitRemaining: headers.get('x-ratelimit-remaining'), rateLimitReset: headers.get('x-ratelimit-reset'), totalLimitRemaining: number('x-totallimit-remaining') };
234
+ }
235
+ /** Maps a failed top-level response onto the typed errors. Never sleeps. */
236
+ function ClassifyFailure(status, parsed, text, headers, prefix) {
237
+ const body = parsed;
238
+ const detail = body?.error ? ErrorText(body.error) : text.slice(0, 300);
239
+ const message = `${prefix} failed with HTTP ${status}${detail ? ` — ${detail}` : ''}`;
240
+ LogError(message);
241
+ if (status === 401 || status === 403)
242
+ return new PDLAuthError(message, status);
243
+ if (status === 402)
244
+ return new PDLCreditsExhaustedError(message);
245
+ if (status === 429)
246
+ return new PDLRateLimitError(message, RetryAfterSeconds(headers));
247
+ return new PDLRequestError(message, status, text);
248
+ }
249
+ function RetryAfterSeconds(headers) {
250
+ if (!headers.rateLimitReset)
251
+ return null;
252
+ const reset = Date.parse(headers.rateLimitReset.replace(' ', 'T') + 'Z');
253
+ if (Number.isNaN(reset))
254
+ return null;
255
+ return Math.max(0, Math.ceil((reset - Date.now()) / 1000));
256
+ }
257
+ //# sourceMappingURL=PDLPersonClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PDLPersonClient.js","sourceRoot":"","sources":["../src/PDLPersonClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** Base URL of the People Data Labs v5 API. */
2
+ export declare const PDLAPIEndpoint = "https://api.peopledatalabs.com/v5";
3
+ /** Environment fallback when no Company Integration credential is supplied. Read once at module load. */
4
+ export declare const PDLAPIKey: string;
5
+ /** PDL recommends a minimum likelihood of 6 for Person Enrichment; below that, matches are guesses. */
6
+ export declare const DefaultMinLikelihood = 6;
7
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,eAAO,MAAM,cAAc,sCAAsC,CAAC;AAElE,yGAAyG;AACzG,eAAO,MAAM,SAAS,QAAgC,CAAC;AAEvD,uGAAuG;AACvG,eAAO,MAAM,oBAAoB,IAAI,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,7 @@
1
+ /** Base URL of the People Data Labs v5 API. */
2
+ export const PDLAPIEndpoint = 'https://api.peopledatalabs.com/v5';
3
+ /** Environment fallback when no Company Integration credential is supplied. Read once at module load. */
4
+ export const PDLAPIKey = process.env.PDL_API_KEY || '';
5
+ /** PDL recommends a minimum likelihood of 6 for Person Enrichment; below that, matches are guesses. */
6
+ export const DefaultMinLikelihood = 6;
7
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,MAAM,CAAC,MAAM,cAAc,GAAG,mCAAmC,CAAC;AAElE,yGAAyG;AACzG,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;AAEvD,uGAAuG;AACvG,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * API-key resolution for the People Data Labs client, in the same two steps as the Apollo package:
3
+ *
4
+ * 1. A `CompanyID` → that company's active `People Data Labs` `MJ: Company Integrations` row → its
5
+ * `CredentialID` → the `apiKey` inside `MJ: Credentials.Values`.
6
+ * 2. `PDL_API_KEY` from the environment.
7
+ *
8
+ * `CompanyIntegration.APIKey` is never read: it is not decrypt-on-read, so a synced value comes back
9
+ * as `$ENC$…` ciphertext and a 401 that looks like a wrong key. A credential that exists but is
10
+ * malformed throws rather than falling through to the environment: a present-but-broken credential is
11
+ * a configuration error, not a reason to use a different company's key.
12
+ */
13
+ import { type UserInfo } from '@memberjunction/core';
14
+ /** The integration name looked up on the CompanyIntegration row. */
15
+ export declare const PDL_INTEGRATION_NAME = "People Data Labs";
16
+ /** The standard failure text when neither resolution path yields a key. */
17
+ export declare const NO_PDL_KEY_MESSAGE: string;
18
+ /** Where a resolved key came from, so an action can say so in its output. */
19
+ export interface ResolvedPDLKey {
20
+ apiKey: string;
21
+ source: 'credential' | 'environment';
22
+ /** The CompanyIntegration row's id when resolved through a company; null otherwise. */
23
+ companyIntegrationID: string | null;
24
+ }
25
+ /** Pull the key out of a credential's `Values` JSON. Several key names are accepted because records are authored by hand. */
26
+ export declare function ExtractPDLKey(values: string | null | undefined, credentialName: string): string | null;
27
+ /**
28
+ * Resolve the key for this run. Returns null when nothing is configured, so an action can answer
29
+ * `CREDENTIALS_NOT_FOUND`; throws only for a malformed credential (see {@link ExtractPDLKey}).
30
+ */
31
+ export declare function ResolvePDLAPIKey(companyID: string | null, contextUser: UserInfo | undefined): Promise<ResolvedPDLKey | null>;
32
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAKxE,oEAAoE;AACpE,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AAEvD,2EAA2E;AAC3E,eAAO,MAAM,kBAAkB,QAG8C,CAAC;AAE9E,6EAA6E;AAC7E,MAAM,WAAW,cAAc;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,YAAY,GAAG,aAAa,CAAC;IACrC,uFAAuF;IACvF,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAMD,6HAA6H;AAC7H,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBtG;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,WAAW,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAQlI"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * API-key resolution for the People Data Labs client, in the same two steps as the Apollo package:
3
+ *
4
+ * 1. A `CompanyID` → that company's active `People Data Labs` `MJ: Company Integrations` row → its
5
+ * `CredentialID` → the `apiKey` inside `MJ: Credentials.Values`.
6
+ * 2. `PDL_API_KEY` from the environment.
7
+ *
8
+ * `CompanyIntegration.APIKey` is never read: it is not decrypt-on-read, so a synced value comes back
9
+ * as `$ENC$…` ciphertext and a 401 that looks like a wrong key. A credential that exists but is
10
+ * malformed throws rather than falling through to the environment: a present-but-broken credential is
11
+ * a configuration error, not a reason to use a different company's key.
12
+ */
13
+ import { LogError, RunView } from '@memberjunction/core';
14
+ import { CredentialEngine } from '@memberjunction/credentials';
15
+ import { PDLAPIKey } from './config.js';
16
+ /** The integration name looked up on the CompanyIntegration row. */
17
+ export const PDL_INTEGRATION_NAME = 'People Data Labs';
18
+ /** The standard failure text when neither resolution path yields a key. */
19
+ export const NO_PDL_KEY_MESSAGE = `No People Data Labs API key could be resolved. Either link an active '${PDL_INTEGRATION_NAME}' ` +
20
+ `MJ: Company Integrations row for the supplied CompanyID to an MJ: Credentials record whose Values ` +
21
+ `contain { "apiKey": "…" }, or set the PDL_API_KEY environment variable.`;
22
+ function isRecord(value) {
23
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
24
+ }
25
+ /** Pull the key out of a credential's `Values` JSON. Several key names are accepted because records are authored by hand. */
26
+ export function ExtractPDLKey(values, credentialName) {
27
+ if (!values || values.trim().length === 0)
28
+ return null;
29
+ let parsed;
30
+ try {
31
+ parsed = JSON.parse(values);
32
+ }
33
+ catch (error) {
34
+ const msg = error instanceof Error ? error.message : String(error);
35
+ throw new Error(`People Data Labs credential '${credentialName}' has a Values payload that is not valid JSON: ${msg}`);
36
+ }
37
+ if (!isRecord(parsed)) {
38
+ throw new Error(`People Data Labs credential '${credentialName}' Values must be a JSON object containing an apiKey.`);
39
+ }
40
+ for (const key of ['apiKey', 'APIKey', 'api_key', 'ApiKey']) {
41
+ const candidate = parsed[key];
42
+ if (typeof candidate === 'string' && candidate.trim().length > 0)
43
+ return candidate.trim();
44
+ }
45
+ return null;
46
+ }
47
+ /**
48
+ * Resolve the key for this run. Returns null when nothing is configured, so an action can answer
49
+ * `CREDENTIALS_NOT_FOUND`; throws only for a malformed credential (see {@link ExtractPDLKey}).
50
+ */
51
+ export async function ResolvePDLAPIKey(companyID, contextUser) {
52
+ if (companyID) {
53
+ const fromCredential = await resolveFromCompany(companyID, contextUser);
54
+ if (fromCredential)
55
+ return fromCredential;
56
+ }
57
+ const env = PDLAPIKey.trim();
58
+ if (env.length > 0)
59
+ return { apiKey: env, source: 'environment', companyIntegrationID: null };
60
+ return null;
61
+ }
62
+ /** Canonical 8-4-4-4-12 hex form. `CompanyID` is a uniqueidentifier, so anything else is not one. */
63
+ const UUID_PATTERN = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
64
+ async function resolveFromCompany(companyID, contextUser) {
65
+ // Validate rather than escape: the value goes into an ExtraFilter, and boolean logic such as
66
+ // `x' OR '1'='1` would select another tenant's row. A UUID check admits nothing else.
67
+ if (!UUID_PATTERN.test(companyID)) {
68
+ LogError(`ResolvePDLAPIKey: CompanyID '${companyID}' is not a UUID; refusing to build a filter from it.`);
69
+ return null;
70
+ }
71
+ const row = await loadCompanyIntegration(companyID, contextUser);
72
+ if (!row)
73
+ return null;
74
+ if (!row.CredentialID) {
75
+ LogError(`ResolvePDLAPIKey: CompanyIntegration ${row.ID} has no CredentialID. The APIKey column is not read; link an MJ: Credentials record instead.`);
76
+ return null;
77
+ }
78
+ const apiKey = await resolveCredentialKey(row.CredentialID, contextUser);
79
+ return apiKey ? { apiKey, source: 'credential', companyIntegrationID: row.ID } : null;
80
+ }
81
+ async function loadCompanyIntegration(companyID, contextUser) {
82
+ const result = await new RunView().RunView({
83
+ EntityName: 'MJ: Company Integrations',
84
+ // IsActive is nullable; an unset flag must not exclude the row.
85
+ ExtraFilter: `CompanyID = '${companyID}' AND Integration = '${PDL_INTEGRATION_NAME}' AND (IsActive IS NULL OR IsActive = 1)`,
86
+ ResultType: 'simple',
87
+ }, contextUser);
88
+ if (!result.Success) {
89
+ LogError(`ResolvePDLAPIKey: reading MJ: Company Integrations failed — ${result.ErrorMessage ?? 'unknown error'}`);
90
+ return null;
91
+ }
92
+ return result.Results?.[0] ?? null;
93
+ }
94
+ /** Through CredentialEngine, which audits the access, stamps LastUsedAt and validates the Values schema. */
95
+ async function resolveCredentialKey(credentialID, contextUser) {
96
+ await CredentialEngine.Instance.Config(false, contextUser);
97
+ const credential = CredentialEngine.Instance.Credentials.find((c) => c.ID.toLowerCase() === credentialID.toLowerCase());
98
+ if (!credential) {
99
+ LogError(`ResolvePDLAPIKey: MJ: Credentials record ${credentialID} could not be loaded.`);
100
+ return null;
101
+ }
102
+ // The engine filters IsActive on its by-name path only; this resolves by id, so check it here.
103
+ if (credential.IsActive === false) {
104
+ LogError(`ResolvePDLAPIKey: MJ: Credentials record '${credential.Name}' is inactive.`);
105
+ return null;
106
+ }
107
+ let values;
108
+ try {
109
+ const resolved = await CredentialEngine.Instance.GetCredential(credential.Name, { credentialId: credentialID, contextUser, subsystem: 'PeopleDataLabs' });
110
+ values = resolved.values;
111
+ }
112
+ catch (err) {
113
+ LogError(`ResolvePDLAPIKey: MJ: Credentials record '${credential.Name}' could not be resolved — ${err instanceof Error ? err.message : String(err)}`);
114
+ return null;
115
+ }
116
+ const apiKey = ExtractPDLKey(values ? JSON.stringify(values) : null, credential.Name);
117
+ if (!apiKey)
118
+ LogError(`ResolvePDLAPIKey: MJ: Credentials record '${credential.Name}' contains no apiKey value.`);
119
+ return apiKey;
120
+ }
121
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export * from './config.js';
2
+ export * from './credentials.js';
3
+ export * from './params.js';
4
+ export * from './pdl.types.js';
5
+ export * from './PDLPersonClient.js';
6
+ export * from './PDLEnrichPeopleAction.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export * from './config.js';
2
+ export * from './credentials.js';
3
+ export * from './params.js';
4
+ export * from './pdl.types.js';
5
+ export * from './PDLPersonClient.js';
6
+ export * from './PDLEnrichPeopleAction.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Pure helpers for reading action params. Names are matched case-insensitively, and array params
3
+ * accept a real array, a JSON-array string, or a comma-separated string, like the Apollo actions.
4
+ */
5
+ import type { RunActionParams } from '@memberjunction/actions-base';
6
+ export interface ParsedParam<T> {
7
+ value: T | undefined;
8
+ error: string | null;
9
+ }
10
+ export declare function GetParamRaw(params: RunActionParams, name: string): unknown;
11
+ export declare function GetParam(params: RunActionParams, name: string): string | null;
12
+ /** An object-array param: a real array, or a JSON string holding one. */
13
+ export declare function ParseObjectArrayParam(raw: unknown, name: string): ParsedParam<Record<string, unknown>[]>;
14
+ export declare function ParseOptionalIntegerParam(raw: unknown, name: string, options?: {
15
+ min?: number;
16
+ max?: number;
17
+ }): ParsedParam<number>;
18
+ //# sourceMappingURL=params.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../src/params.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAe,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEjF,MAAM,WAAW,WAAW,CAAC,CAAC;IAC1B,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAI1E;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM7E;AAED,yEAAyE;AACzE,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAexG;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,CAAC,MAAM,CAAC,CAUnI"}
package/dist/params.js ADDED
@@ -0,0 +1,50 @@
1
+ export function GetParamRaw(params, name) {
2
+ const lowered = name.trim().toLowerCase();
3
+ const found = params.Params?.find((p) => p.Name?.trim().toLowerCase() === lowered);
4
+ return found?.Value;
5
+ }
6
+ export function GetParam(params, name) {
7
+ const raw = GetParamRaw(params, name);
8
+ if (typeof raw !== 'string') {
9
+ return raw === null || raw === undefined ? null : String(raw).trim() || null;
10
+ }
11
+ return raw.trim() || null;
12
+ }
13
+ /** An object-array param: a real array, or a JSON string holding one. */
14
+ export function ParseObjectArrayParam(raw, name) {
15
+ if (raw === null || raw === undefined || raw === '')
16
+ return { value: undefined, error: null };
17
+ let value = raw;
18
+ if (typeof value === 'string') {
19
+ try {
20
+ value = JSON.parse(value);
21
+ }
22
+ catch (error) {
23
+ const msg = error instanceof Error ? error.message : String(error);
24
+ return { value: undefined, error: `${name} must be a JSON array of objects — got an unparseable string (${msg})` };
25
+ }
26
+ }
27
+ if (!Array.isArray(value) || !value.every((v) => typeof v === 'object' && v !== null && !Array.isArray(v))) {
28
+ return { value: undefined, error: `${name} must be a JSON array of objects` };
29
+ }
30
+ return { value: value, error: null };
31
+ }
32
+ export function ParseOptionalIntegerParam(raw, name, options) {
33
+ if (raw === null || raw === undefined || raw === '')
34
+ return { value: undefined, error: null };
35
+ let value;
36
+ if (typeof raw === 'number')
37
+ value = raw;
38
+ else if (typeof raw === 'string')
39
+ value = Number(raw.trim());
40
+ else
41
+ return { value: undefined, error: `${name} must be a number (got ${typeof raw})` };
42
+ if (!Number.isInteger(value))
43
+ return { value: undefined, error: `${name} must be an integer (got '${String(raw)}')` };
44
+ if (options?.min !== undefined && value < options.min)
45
+ return { value: undefined, error: `${name} must be >= ${options.min} (got ${value})` };
46
+ if (options?.max !== undefined && value > options.max)
47
+ return { value: undefined, error: `${name} must be <= ${options.max} (got ${value})` };
48
+ return { value, error: null };
49
+ }
50
+ //# sourceMappingURL=params.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"params.js","sourceRoot":"","sources":["../src/params.ts"],"names":[],"mappings":"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"}