@realtek/core-theme 0.0.167 → 0.0.168

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,181 @@
1
+ //#region src/services/diceCandidateMapper.js
2
+ function e(...e) {
3
+ return e.find((e) => e != null && String(e).trim() !== "");
4
+ }
5
+ function t(e, t) {
6
+ if (!(!e || !t)) return Object.prototype.hasOwnProperty.call(e, t) ? e[t] : String(t).split(".").reduce((e, t) => e?.[t], e);
7
+ }
8
+ function n(e) {
9
+ return /^[a-f0-9]{24}$/i.test(String(e ?? "").trim());
10
+ }
11
+ function r(e) {
12
+ let t = String(e ?? "").trim();
13
+ return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(t) || /^[a-f0-9]{40,}$/i.test(t);
14
+ }
15
+ function i(t, n) {
16
+ let r = String(t ?? "").trim(), i = e(n?.candidateId, n?.customFields?.diceProfileData?.candidateId);
17
+ return i && r === String(i).trim() || /^[a-f0-9]{40,}-\d+$/i.test(r);
18
+ }
19
+ function a(e) {
20
+ let t = /* @__PURE__ */ new Set(), n = [], i = (e, a = "") => {
21
+ if (e != null) {
22
+ if (typeof e == "string" || typeof e == "number") {
23
+ let t = String(e).trim(), i = /(^|[._-])(dice|profile|source|external).*(id|guid|uuid)$|(^|[._-])(id|guid|uuid)$/i.test(a);
24
+ t && i && r(t) && n.push({
25
+ path: a,
26
+ value: t
27
+ });
28
+ return;
29
+ }
30
+ typeof e != "object" || t.has(e) || (t.add(e), Object.entries(e).forEach(([e, t]) => {
31
+ i(t, a ? `${a}.${e}` : e);
32
+ }));
33
+ }
34
+ };
35
+ return i(e), n.find((e) => /dice|profile|source|external/i.test(e.path))?.value ?? n[0]?.value ?? "";
36
+ }
37
+ function o(r) {
38
+ if (!r || typeof r != "object") return "";
39
+ let o = (() => {
40
+ let e = r?.sourceType ?? r?.profileSource ?? r?.selectedSource;
41
+ return (Array.isArray(e) ? e : [e]).some((e) => String(e ?? "").trim().toLowerCase() === "dice");
42
+ })(), s = e(...(/* @__PURE__ */ "diceId,diceID,dice_id,diceProfileId,diceProfileID,diceProfileGuid,profileId,profileID,profileGuid,sourceId,sourceProfileId,externalId,externalProfileId,customFields.diceId,customFields.diceProfileId,customFields.profileId,customFields.externalProfileId,customFields.diceProfileData.diceId,customFields.diceProfileData.diceID,customFields.diceProfileData.id,customFields.diceProfileData._id,customFields.diceProfileData.profileId,customFields.diceProfileData.profileID,customFields.diceProfileData.diceProfileId,customFields.diceProfileData.diceProfileID,customFields.diceProfileData.guid,customFields.diceProfileData.uuid,customFields.diceProfileData.externalId,customFields.diceProfileData.candidateid,customFields.diceProfileData.candidateId".split(",")).map((e) => t(r, e)));
43
+ if (s && !i(s, r)) return String(s);
44
+ let c = a(r);
45
+ if (c) return c;
46
+ let l = e(r.id, r._id);
47
+ return l && (o || !n(l)) ? String(l) : "";
48
+ }
49
+ function s(e) {
50
+ return e ? Array.isArray(e) ? e.map((e) => {
51
+ if (e?.skill) return e.skill;
52
+ if (typeof e == "object" && e) {
53
+ if (e?.name) return e.name;
54
+ if (e?.skillName) return e.skillName;
55
+ if (e?.value) return e.value;
56
+ }
57
+ return typeof e == "string" ? e : null;
58
+ }).filter(Boolean) : typeof e == "string" ? e.split(",").map((e) => e.trim()).filter(Boolean) : [] : [];
59
+ }
60
+ function c(e) {
61
+ if (Array.isArray(e.locations) && e.locations.length > 0) {
62
+ let t = e.locations[0];
63
+ if (typeof t == "string") return t;
64
+ if (t?.region) return t.region;
65
+ if (t?.city) return t.city;
66
+ if (t?.name) return t.name;
67
+ if (t?.location) return t.location;
68
+ }
69
+ return e.currentLocation ?? e.location ?? e.city ?? e.region ?? "";
70
+ }
71
+ function l(e) {
72
+ let t = e.totalExperience ?? e.experience ?? e.yearsOfExperience ?? e.exp ?? e.totalYearsOfExperience ?? e.workExperienceYears;
73
+ return t != null && t !== "" ? t : null;
74
+ }
75
+ function u(e) {
76
+ return e.dateLastUpdated ?? e.updatedAt ?? e.createdAt ?? e.createdDate ?? e.dateCreated ?? null;
77
+ }
78
+ function d(e) {
79
+ let t = [
80
+ e.firstName,
81
+ e.middleName,
82
+ e.lastName
83
+ ].filter(Boolean);
84
+ return t.length > 0 ? t.join(" ") : e.fullName ?? e.name ?? e.candidateName ?? "";
85
+ }
86
+ function f(e, t = 0) {
87
+ if (!e || typeof e != "object") return {
88
+ id: `dice-candidate-${t}`,
89
+ diceId: "",
90
+ candidateId: "",
91
+ firstName: "",
92
+ lastName: "",
93
+ name: "-",
94
+ designation: "-",
95
+ currentLocation: "",
96
+ location: "",
97
+ exp: "",
98
+ totalExperience: null,
99
+ skills: [],
100
+ createdAt: null,
101
+ createdOn: "-",
102
+ sourceType: "dice",
103
+ profileSource: "dice"
104
+ };
105
+ let n = d(e), r = n.split(" "), i = r[0] || "", a = r.length > 1 ? r[r.length - 1] : "", f = c(e), p = l(e), m = u(e), h = o(e), g = e.candidateId ?? e.customFields?.diceProfileData?.candidateId ?? `dice-candidate-${t}`, _ = e.skills ?? e.technicalSkills ?? e.primarySkills ?? e.keySkills ?? [], v = s(_);
106
+ return process.env.NODE_ENV === "development" && (console.log("[DiceMapper] Original skills:", _), console.log("[DiceMapper] Mapped skills:", v), console.log("[DiceMapper] Dice IDs:", {
107
+ id: h,
108
+ diceId: h,
109
+ candidateId: g
110
+ })), {
111
+ ...e,
112
+ id: h,
113
+ diceId: h,
114
+ candidateId: g,
115
+ firstName: i,
116
+ lastName: a,
117
+ middleName: e.middleName || "",
118
+ name: n || "-",
119
+ fullName: n || "",
120
+ designation: e.currentJobTitle ?? e.jobTitle ?? e.designation ?? e.currentDesignation ?? "-",
121
+ currentDesignation: e.currentJobTitle ?? e.jobTitle ?? e.designation ?? e.currentDesignation ?? "",
122
+ jobTitle: e.currentJobTitle ?? e.jobTitle ?? e.designation ?? "",
123
+ currentLocation: f || "",
124
+ location: f || "",
125
+ city: e.city ?? e.locations?.[0]?.city ?? "",
126
+ region: e.region ?? e.locations?.[0]?.region ?? "",
127
+ totalExperience: p,
128
+ experience: p,
129
+ yearsOfExperience: p,
130
+ exp: p != null && p !== "" ? `${p} yrs` : "",
131
+ skills: v,
132
+ technicalSkills: v,
133
+ primarySkills: v,
134
+ createdAt: m,
135
+ createdOn: m ? String(m) : "-",
136
+ updatedAt: m,
137
+ dateLastUpdated: m,
138
+ sourceType: "dice",
139
+ profileSource: "dice",
140
+ selectedSource: ["dice"],
141
+ email: e.email ?? e.emailAddress ?? "",
142
+ phone: e.phone ?? e.phoneNumber ?? e.mobile ?? "",
143
+ summary: e.summary ?? e.bio ?? e.description ?? "",
144
+ resume: e.resume ?? e.resumeUrl ?? e.cvUrl ?? "",
145
+ isActive: !0,
146
+ isDeleted: !1
147
+ };
148
+ }
149
+ function p(e) {
150
+ return Array.isArray(e) ? e.map((e, t) => f(e, t)) : [];
151
+ }
152
+ function m(e, t = {}) {
153
+ if (!e || typeof e != "object") return {
154
+ status: "success",
155
+ data: {
156
+ fields: [],
157
+ actions: [],
158
+ columnActions: [],
159
+ count: 0,
160
+ data: []
161
+ }
162
+ };
163
+ let n = p(Array.isArray(e) ? e : e?.data?.data ?? e?.data?.applicant ?? e?.data?.candidates ?? e?.data?.items ?? e?.items ?? e?.candidates ?? e?.records ?? []), r = e?.data?.count?.searchCount ?? e?.data?.count?.total ?? e?.count?.searchCount ?? e?.count?.total ?? e?.total ?? e?.totalCount ?? n.length;
164
+ return {
165
+ status: e?.status ?? "success",
166
+ data: {
167
+ fields: t?.fields ?? e?.data?.fields ?? e?.fields ?? [],
168
+ actions: t?.actions ?? e?.data?.actions ?? e?.actions ?? [],
169
+ columnActions: t?.columnActions ?? e?.data?.columnActions ?? e?.columnActions ?? [],
170
+ count: Number(r) || 0,
171
+ data: n,
172
+ ...e?.data?.actionRules && { actionRules: e.data.actionRules },
173
+ ...e?.data?.tabs && { tabs: e.data.tabs },
174
+ ...e?.data?.tabField && { tabField: e.data.tabField }
175
+ }
176
+ };
177
+ }
178
+ //#endregion
179
+ export { m as a, o as i, p as n, s as r, f as t };
180
+
181
+ //# sourceMappingURL=diceCandidateMapper-BKRGwz7g.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diceCandidateMapper-BKRGwz7g.js","names":[],"sources":["../src/services/diceCandidateMapper.js"],"sourcesContent":["/**\n * Dice Candidate Response Mapper\n * \n * Transforms Dice API candidate responses into the existing Internal Candidate\n * List API format. This ensures the frontend receives an identical response\n * schema regardless of the data source.\n * \n * Reusable for additional external sources (Monster, CareerBuilder, LinkedIn, etc.)\n */\n\n/**\n * Normalizes skills from various Dice skill formats into a simple string array\n */\nfunction firstPresentValue(...values) {\n return values.find((value) => value !== undefined && value !== null && String(value).trim() !== '');\n}\n\nfunction getPathValue(record, path) {\n if (!record || !path) return undefined;\n if (Object.prototype.hasOwnProperty.call(record, path)) return record[path];\n return String(path)\n .split('.')\n .reduce((value, key) => value?.[key], record);\n}\n\nfunction isLikelyInternalRecordId(value) {\n return /^[a-f0-9]{24}$/i.test(String(value ?? '').trim());\n}\n\nfunction isLikelyDiceProfileId(value) {\n const text = String(value ?? '').trim();\n return (\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(text)\n || /^[a-f0-9]{40,}$/i.test(text)\n );\n}\n\nfunction isLikelyDiceCandidateId(value, candidate) {\n const text = String(value ?? '').trim();\n const knownCandidateId = firstPresentValue(\n candidate?.candidateId,\n candidate?.customFields?.diceProfileData?.candidateId,\n );\n\n return (\n (knownCandidateId && text === String(knownCandidateId).trim())\n || /^[a-f0-9]{40,}-\\d+$/i.test(text)\n );\n}\n\nfunction findLikelyDiceProfileId(record) {\n const seen = new Set();\n const candidates = [];\n\n const visit = (value, path = '') => {\n if (value === null || value === undefined) return;\n if (typeof value === 'string' || typeof value === 'number') {\n const text = String(value).trim();\n const keyLooksRelevant = /(^|[._-])(dice|profile|source|external).*(id|guid|uuid)$|(^|[._-])(id|guid|uuid)$/i.test(path);\n if (text && keyLooksRelevant && isLikelyDiceProfileId(text)) {\n candidates.push({ path, value: text });\n }\n return;\n }\n if (typeof value !== 'object' || seen.has(value)) return;\n seen.add(value);\n Object.entries(value).forEach(([key, child]) => {\n visit(child, path ? `${path}.${key}` : key);\n });\n };\n\n visit(record);\n\n return candidates.find((candidate) => /dice|profile|source|external/i.test(candidate.path))?.value\n ?? candidates[0]?.value\n ?? '';\n}\n\nexport function resolveDiceProfileId(candidate) {\n if (!candidate || typeof candidate !== 'object') return '';\n\n // Check if this is a Dice candidate\n const isDiceCandidate = (() => {\n const source = candidate?.sourceType\n ?? candidate?.profileSource\n ?? candidate?.selectedSource;\n const normalizedSources = Array.isArray(source) ? source : [source];\n return normalizedSources.some(\n (value) => String(value ?? '').trim().toLowerCase() === 'dice',\n );\n })();\n\n const explicitPaths = [\n 'diceId',\n 'diceID',\n 'dice_id',\n 'diceProfileId',\n 'diceProfileID',\n 'diceProfileGuid',\n 'profileId',\n 'profileID',\n 'profileGuid',\n 'sourceId',\n 'sourceProfileId',\n 'externalId',\n 'externalProfileId',\n 'customFields.diceId',\n 'customFields.diceProfileId',\n 'customFields.profileId',\n 'customFields.externalProfileId',\n 'customFields.diceProfileData.diceId',\n 'customFields.diceProfileData.diceID',\n 'customFields.diceProfileData.id',\n 'customFields.diceProfileData._id',\n 'customFields.diceProfileData.profileId',\n 'customFields.diceProfileData.profileID',\n 'customFields.diceProfileData.diceProfileId',\n 'customFields.diceProfileData.diceProfileID',\n 'customFields.diceProfileData.guid',\n 'customFields.diceProfileData.uuid',\n 'customFields.diceProfileData.externalId',\n 'customFields.diceProfileData.candidateid',\n 'customFields.diceProfileData.candidateId',\n ];\n\n const explicitDiceId = firstPresentValue(\n ...explicitPaths.map((path) => getPathValue(candidate, path)),\n );\n\n if (explicitDiceId && !isLikelyDiceCandidateId(explicitDiceId, candidate)) {\n return String(explicitDiceId);\n }\n\n const likelyNestedId = findLikelyDiceProfileId(candidate);\n if (likelyNestedId) return likelyNestedId;\n\n const genericId = firstPresentValue(candidate.id, candidate._id);\n \n // For Dice candidates, accept the ID even if it looks like an internal MongoDB ObjectId\n // For non-Dice candidates, reject IDs that look like internal record IDs\n if (genericId && (isDiceCandidate || !isLikelyInternalRecordId(genericId))) {\n return String(genericId);\n }\n \n return '';\n}\n\nexport function normalizeDiceSkills(skills) {\n if (!skills) return [];\n \n if (Array.isArray(skills)) {\n return skills\n .map(skill => {\n // Handle Dice format: {skill: \"courts\", lastUsed: 2026}\n if (skill?.skill) return skill.skill;\n // Handle other object formats\n if (typeof skill === 'object' && skill !== null) {\n if (skill?.name) return skill.name;\n if (skill?.skillName) return skill.skillName;\n if (skill?.value) return skill.value;\n }\n // Handle string skills\n if (typeof skill === 'string') return skill;\n return null;\n })\n .filter(Boolean);\n }\n \n if (typeof skills === 'string') {\n return skills.split(',').map(s => s.trim()).filter(Boolean);\n }\n \n return [];\n}\n\n/**\n * Normalizes location from various Dice location formats\n */\nfunction normalizeDiceLocation(candidate) {\n // Try locations array first (common in Dice)\n if (Array.isArray(candidate.locations) && candidate.locations.length > 0) {\n const loc = candidate.locations[0];\n if (typeof loc === 'string') return loc;\n if (loc?.region) return loc.region;\n if (loc?.city) return loc.city;\n if (loc?.name) return loc.name;\n if (loc?.location) return loc.location;\n }\n \n // Try direct location fields\n return (\n candidate.currentLocation ??\n candidate.location ??\n candidate.city ??\n candidate.region ??\n ''\n );\n}\n\n/**\n * Normalizes experience from various Dice experience formats\n */\nfunction normalizeDiceExperience(candidate) {\n const exp = (\n candidate.totalExperience ??\n candidate.experience ??\n candidate.yearsOfExperience ??\n candidate.exp ??\n candidate.totalYearsOfExperience ??\n candidate.workExperienceYears\n );\n \n return exp != null && exp !== '' ? exp : null;\n}\n\n/**\n * Normalizes date from various Dice date formats\n */\nfunction normalizeDiceDate(candidate) {\n return (\n candidate.dateLastUpdated ??\n candidate.updatedAt ??\n candidate.createdAt ??\n candidate.createdDate ??\n candidate.dateCreated ??\n null\n );\n}\n\n/**\n * Normalizes name from various Dice name formats\n */\nfunction normalizeDiceName(candidate) {\n const parts = [\n candidate.firstName,\n candidate.middleName,\n candidate.lastName,\n ].filter(Boolean);\n \n if (parts.length > 0) return parts.join(' ');\n \n return (\n candidate.fullName ??\n candidate.name ??\n candidate.candidateName ??\n ''\n );\n}\n\n/**\n * Maps a single Dice candidate to the Internal Candidate format\n * \n * @param {Object} diceCandidate - Raw Dice API candidate object\n * @param {number} index - Index for fallback ID generation\n * @returns {Object} Mapped candidate in Internal format\n */\nexport function mapDiceCandidateToInternal(diceCandidate, index = 0) {\n if (!diceCandidate || typeof diceCandidate !== 'object') {\n return {\n id: `dice-candidate-${index}`,\n diceId: '',\n candidateId: '',\n firstName: '',\n lastName: '',\n name: '-',\n designation: '-',\n currentLocation: '',\n location: '',\n exp: '',\n totalExperience: null,\n skills: [],\n createdAt: null,\n createdOn: '-',\n sourceType: 'dice',\n profileSource: 'dice',\n };\n }\n\n const fullName = normalizeDiceName(diceCandidate);\n const nameParts = fullName.split(' ');\n const firstName = nameParts[0] || '';\n const lastName = nameParts.length > 1 ? nameParts[nameParts.length - 1] : '';\n \n const location = normalizeDiceLocation(diceCandidate);\n const experience = normalizeDiceExperience(diceCandidate);\n const createdOn = normalizeDiceDate(diceCandidate);\n const diceProfileId = resolveDiceProfileId(diceCandidate);\n const candidateId = diceCandidate.candidateId\n ?? diceCandidate.customFields?.diceProfileData?.candidateId\n ?? `dice-candidate-${index}`;\n \n // Extract skills from various possible fields\n const rawSkills = diceCandidate.skills ?? \n diceCandidate.technicalSkills ?? \n diceCandidate.primarySkills ??\n diceCandidate.keySkills ??\n [];\n \n const skills = normalizeDiceSkills(rawSkills);\n \n // Debug logging to verify transformation\n if (process.env.NODE_ENV === 'development') {\n console.log('[DiceMapper] Original skills:', rawSkills);\n console.log('[DiceMapper] Mapped skills:', skills);\n console.log('[DiceMapper] Dice IDs:', {\n id: diceProfileId,\n diceId: diceProfileId,\n candidateId,\n });\n }\n\n return {\n // Preserve original Dice fields for reference\n ...diceCandidate,\n \n // Map to Internal candidate schema. Keep the Dice profile id as the primary id.\n id: diceProfileId,\n diceId: diceProfileId,\n candidateId,\n \n // Name fields\n firstName,\n lastName,\n middleName: diceCandidate.middleName || '',\n name: fullName || '-',\n fullName: fullName || '',\n \n // Professional info\n designation: diceCandidate.currentJobTitle ?? diceCandidate.jobTitle ?? diceCandidate.designation ?? diceCandidate.currentDesignation ?? '-',\n currentDesignation: diceCandidate.currentJobTitle ?? diceCandidate.jobTitle ?? diceCandidate.designation ?? diceCandidate.currentDesignation ?? '',\n jobTitle: diceCandidate.currentJobTitle ?? diceCandidate.jobTitle ?? diceCandidate.designation ?? '',\n \n // Location\n currentLocation: location || '',\n location: location || '',\n city: diceCandidate.city ?? diceCandidate.locations?.[0]?.city ?? '',\n region: diceCandidate.region ?? diceCandidate.locations?.[0]?.region ?? '',\n \n // Experience\n totalExperience: experience,\n experience: experience,\n yearsOfExperience: experience,\n exp: experience != null && experience !== '' ? `${experience} yrs` : '',\n \n // Skills\n skills,\n technicalSkills: skills,\n primarySkills: skills,\n \n // Dates\n createdAt: createdOn,\n createdOn: createdOn ? String(createdOn) : '-',\n updatedAt: createdOn,\n dateLastUpdated: createdOn,\n \n // Source identification\n sourceType: 'dice',\n profileSource: 'dice',\n selectedSource: ['dice'],\n \n // Additional fields with defaults\n email: diceCandidate.email ?? diceCandidate.emailAddress ?? '',\n phone: diceCandidate.phone ?? diceCandidate.phoneNumber ?? diceCandidate.mobile ?? '',\n summary: diceCandidate.summary ?? diceCandidate.bio ?? diceCandidate.description ?? '',\n resume: diceCandidate.resume ?? diceCandidate.resumeUrl ?? diceCandidate.cvUrl ?? '',\n \n // Status and metadata\n isActive: true,\n isDeleted: false,\n };\n}\n\n/**\n * Maps an array of Dice candidates to the Internal Candidate format\n * \n * @param {Array} diceCandidates - Array of raw Dice API candidate objects\n * @returns {Array} Array of mapped candidates in Internal format\n */\nexport function mapDiceCandidatesToInternal(diceCandidates) {\n if (!Array.isArray(diceCandidates)) {\n return [];\n }\n \n return diceCandidates.map((candidate, index) => \n mapDiceCandidateToInternal(candidate, index)\n );\n}\n\n/**\n * Transforms a Dice API response to match the existing Candidate List API response format\n * \n * @param {Object} diceResponse - Raw Dice API response\n * @param {Object} originalResponseStructure - The expected response structure from Internal API\n * @returns {Object} Transformed response matching Internal API format\n */\nexport function transformDiceResponseToInternalFormat(diceResponse, originalResponseStructure = {}) {\n if (!diceResponse || typeof diceResponse !== 'object') {\n return {\n status: 'success',\n data: {\n fields: [],\n actions: [],\n columnActions: [],\n count: 0,\n data: [],\n },\n };\n }\n\n // Extract candidates array from various possible response structures\n const diceCandidates = Array.isArray(diceResponse) \n ? diceResponse \n : diceResponse?.data?.data ?? \n diceResponse?.data?.applicant ?? \n diceResponse?.data?.candidates ?? \n diceResponse?.data?.items ?? \n diceResponse?.items ?? \n diceResponse?.candidates ?? \n diceResponse?.records ?? \n [];\n\n // Map Dice candidates to Internal format\n const mappedCandidates = mapDiceCandidatesToInternal(diceCandidates);\n\n // Extract count from various possible locations\n const count = (\n diceResponse?.data?.count?.searchCount ??\n diceResponse?.data?.count?.total ??\n diceResponse?.count?.searchCount ??\n diceResponse?.count?.total ??\n diceResponse?.total ??\n diceResponse?.totalCount ??\n mappedCandidates.length\n );\n\n // Preserve existing metadata from the original response structure\n return {\n status: diceResponse?.status ?? 'success',\n data: {\n // Preserve fields, actions, columnActions from original structure\n fields: originalResponseStructure?.fields ?? diceResponse?.data?.fields ?? diceResponse?.fields ?? [],\n actions: originalResponseStructure?.actions ?? diceResponse?.data?.actions ?? diceResponse?.actions ?? [],\n columnActions: originalResponseStructure?.columnActions ?? diceResponse?.data?.columnActions ?? diceResponse?.columnActions ?? [],\n \n // Count and mapped data\n count: Number(count) || 0,\n data: mappedCandidates,\n \n // Preserve any additional metadata\n ...(diceResponse?.data?.actionRules && { actionRules: diceResponse.data.actionRules }),\n ...(diceResponse?.data?.tabs && { tabs: diceResponse.data.tabs }),\n ...(diceResponse?.data?.tabField && { tabField: diceResponse.data.tabField }),\n },\n };\n}\n\n/**\n * Checks if a response contains Dice candidates\n * \n * @param {Array|Object} response - API response to check\n * @returns {boolean} True if response contains Dice candidates\n */\nexport function isDiceResponse(response) {\n if (!response) return false;\n \n const candidates = Array.isArray(response) \n ? response \n : response?.data?.data ?? \n response?.data?.applicant ?? \n response?.data?.candidates ?? \n response?.data?.items ?? \n response?.items ?? \n [];\n \n if (!Array.isArray(candidates) || candidates.length === 0) {\n return false;\n }\n \n // Check first few candidates for Dice source indicators\n const sampleSize = Math.min(candidates.length, 5);\n for (let i = 0; i < sampleSize; i++) {\n const candidate = candidates[i];\n const sourceType = candidate?.sourceType ?? candidate?.profileSource ?? '';\n if (String(sourceType).toLowerCase() === 'dice') {\n return true;\n }\n }\n \n return false;\n}\n\nexport default {\n mapDiceCandidateToInternal,\n mapDiceCandidatesToInternal,\n transformDiceResponseToInternalFormat,\n isDiceResponse,\n};\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { a as e } from "./diceCandidateMapper-BKRGwz7g.js";
2
+ export { e as transformDiceResponseToInternalFormat };
@@ -0,0 +1 @@
1
+ const e=require("./diceCandidateMapper-MB-yyU21.cjs");exports.transformDiceResponseToInternalFormat=e.a;
@@ -0,0 +1,2 @@
1
+ function e(...e){return e.find(e=>e!=null&&String(e).trim()!==``)}function t(e,t){if(!(!e||!t))return Object.prototype.hasOwnProperty.call(e,t)?e[t]:String(t).split(`.`).reduce((e,t)=>e?.[t],e)}function n(e){return/^[a-f0-9]{24}$/i.test(String(e??``).trim())}function r(e){let t=String(e??``).trim();return/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(t)||/^[a-f0-9]{40,}$/i.test(t)}function i(t,n){let r=String(t??``).trim(),i=e(n?.candidateId,n?.customFields?.diceProfileData?.candidateId);return i&&r===String(i).trim()||/^[a-f0-9]{40,}-\d+$/i.test(r)}function a(e){let t=new Set,n=[],i=(e,a=``)=>{if(e!=null){if(typeof e==`string`||typeof e==`number`){let t=String(e).trim(),i=/(^|[._-])(dice|profile|source|external).*(id|guid|uuid)$|(^|[._-])(id|guid|uuid)$/i.test(a);t&&i&&r(t)&&n.push({path:a,value:t});return}typeof e!=`object`||t.has(e)||(t.add(e),Object.entries(e).forEach(([e,t])=>{i(t,a?`${a}.${e}`:e)}))}};return i(e),n.find(e=>/dice|profile|source|external/i.test(e.path))?.value??n[0]?.value??``}function o(r){if(!r||typeof r!=`object`)return``;let o=(()=>{let e=r?.sourceType??r?.profileSource??r?.selectedSource;return(Array.isArray(e)?e:[e]).some(e=>String(e??``).trim().toLowerCase()===`dice`)})(),s=e(...`diceId,diceID,dice_id,diceProfileId,diceProfileID,diceProfileGuid,profileId,profileID,profileGuid,sourceId,sourceProfileId,externalId,externalProfileId,customFields.diceId,customFields.diceProfileId,customFields.profileId,customFields.externalProfileId,customFields.diceProfileData.diceId,customFields.diceProfileData.diceID,customFields.diceProfileData.id,customFields.diceProfileData._id,customFields.diceProfileData.profileId,customFields.diceProfileData.profileID,customFields.diceProfileData.diceProfileId,customFields.diceProfileData.diceProfileID,customFields.diceProfileData.guid,customFields.diceProfileData.uuid,customFields.diceProfileData.externalId,customFields.diceProfileData.candidateid,customFields.diceProfileData.candidateId`.split(`,`).map(e=>t(r,e)));if(s&&!i(s,r))return String(s);let c=a(r);if(c)return c;let l=e(r.id,r._id);return l&&(o||!n(l))?String(l):``}function s(e){return e?Array.isArray(e)?e.map(e=>{if(e?.skill)return e.skill;if(typeof e==`object`&&e){if(e?.name)return e.name;if(e?.skillName)return e.skillName;if(e?.value)return e.value}return typeof e==`string`?e:null}).filter(Boolean):typeof e==`string`?e.split(`,`).map(e=>e.trim()).filter(Boolean):[]:[]}function c(e){if(Array.isArray(e.locations)&&e.locations.length>0){let t=e.locations[0];if(typeof t==`string`)return t;if(t?.region)return t.region;if(t?.city)return t.city;if(t?.name)return t.name;if(t?.location)return t.location}return e.currentLocation??e.location??e.city??e.region??``}function l(e){let t=e.totalExperience??e.experience??e.yearsOfExperience??e.exp??e.totalYearsOfExperience??e.workExperienceYears;return t!=null&&t!==``?t:null}function u(e){return e.dateLastUpdated??e.updatedAt??e.createdAt??e.createdDate??e.dateCreated??null}function d(e){let t=[e.firstName,e.middleName,e.lastName].filter(Boolean);return t.length>0?t.join(` `):e.fullName??e.name??e.candidateName??``}function f(e,t=0){if(!e||typeof e!=`object`)return{id:`dice-candidate-${t}`,diceId:``,candidateId:``,firstName:``,lastName:``,name:`-`,designation:`-`,currentLocation:``,location:``,exp:``,totalExperience:null,skills:[],createdAt:null,createdOn:`-`,sourceType:`dice`,profileSource:`dice`};let n=d(e),r=n.split(` `),i=r[0]||``,a=r.length>1?r[r.length-1]:``,f=c(e),p=l(e),m=u(e),h=o(e),g=e.candidateId??e.customFields?.diceProfileData?.candidateId??`dice-candidate-${t}`,_=e.skills??e.technicalSkills??e.primarySkills??e.keySkills??[],v=s(_);return process.env.NODE_ENV===`development`&&(console.log(`[DiceMapper] Original skills:`,_),console.log(`[DiceMapper] Mapped skills:`,v),console.log(`[DiceMapper] Dice IDs:`,{id:h,diceId:h,candidateId:g})),{...e,id:h,diceId:h,candidateId:g,firstName:i,lastName:a,middleName:e.middleName||``,name:n||`-`,fullName:n||``,designation:e.currentJobTitle??e.jobTitle??e.designation??e.currentDesignation??`-`,currentDesignation:e.currentJobTitle??e.jobTitle??e.designation??e.currentDesignation??``,jobTitle:e.currentJobTitle??e.jobTitle??e.designation??``,currentLocation:f||``,location:f||``,city:e.city??e.locations?.[0]?.city??``,region:e.region??e.locations?.[0]?.region??``,totalExperience:p,experience:p,yearsOfExperience:p,exp:p!=null&&p!==``?`${p} yrs`:``,skills:v,technicalSkills:v,primarySkills:v,createdAt:m,createdOn:m?String(m):`-`,updatedAt:m,dateLastUpdated:m,sourceType:`dice`,profileSource:`dice`,selectedSource:[`dice`],email:e.email??e.emailAddress??``,phone:e.phone??e.phoneNumber??e.mobile??``,summary:e.summary??e.bio??e.description??``,resume:e.resume??e.resumeUrl??e.cvUrl??``,isActive:!0,isDeleted:!1}}function p(e){return Array.isArray(e)?e.map((e,t)=>f(e,t)):[]}function m(e,t={}){if(!e||typeof e!=`object`)return{status:`success`,data:{fields:[],actions:[],columnActions:[],count:0,data:[]}};let n=p(Array.isArray(e)?e:e?.data?.data??e?.data?.applicant??e?.data?.candidates??e?.data?.items??e?.items??e?.candidates??e?.records??[]),r=e?.data?.count?.searchCount??e?.data?.count?.total??e?.count?.searchCount??e?.count?.total??e?.total??e?.totalCount??n.length;return{status:e?.status??`success`,data:{fields:t?.fields??e?.data?.fields??e?.fields??[],actions:t?.actions??e?.data?.actions??e?.actions??[],columnActions:t?.columnActions??e?.data?.columnActions??e?.columnActions??[],count:Number(r)||0,data:n,...e?.data?.actionRules&&{actionRules:e.data.actionRules},...e?.data?.tabs&&{tabs:e.data.tabs},...e?.data?.tabField&&{tabField:e.data.tabField}}}}Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return f}});
2
+ //# sourceMappingURL=diceCandidateMapper-MB-yyU21.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diceCandidateMapper-MB-yyU21.cjs","names":[],"sources":["../src/services/diceCandidateMapper.js"],"sourcesContent":["/**\n * Dice Candidate Response Mapper\n * \n * Transforms Dice API candidate responses into the existing Internal Candidate\n * List API format. This ensures the frontend receives an identical response\n * schema regardless of the data source.\n * \n * Reusable for additional external sources (Monster, CareerBuilder, LinkedIn, etc.)\n */\n\n/**\n * Normalizes skills from various Dice skill formats into a simple string array\n */\nfunction firstPresentValue(...values) {\n return values.find((value) => value !== undefined && value !== null && String(value).trim() !== '');\n}\n\nfunction getPathValue(record, path) {\n if (!record || !path) return undefined;\n if (Object.prototype.hasOwnProperty.call(record, path)) return record[path];\n return String(path)\n .split('.')\n .reduce((value, key) => value?.[key], record);\n}\n\nfunction isLikelyInternalRecordId(value) {\n return /^[a-f0-9]{24}$/i.test(String(value ?? '').trim());\n}\n\nfunction isLikelyDiceProfileId(value) {\n const text = String(value ?? '').trim();\n return (\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(text)\n || /^[a-f0-9]{40,}$/i.test(text)\n );\n}\n\nfunction isLikelyDiceCandidateId(value, candidate) {\n const text = String(value ?? '').trim();\n const knownCandidateId = firstPresentValue(\n candidate?.candidateId,\n candidate?.customFields?.diceProfileData?.candidateId,\n );\n\n return (\n (knownCandidateId && text === String(knownCandidateId).trim())\n || /^[a-f0-9]{40,}-\\d+$/i.test(text)\n );\n}\n\nfunction findLikelyDiceProfileId(record) {\n const seen = new Set();\n const candidates = [];\n\n const visit = (value, path = '') => {\n if (value === null || value === undefined) return;\n if (typeof value === 'string' || typeof value === 'number') {\n const text = String(value).trim();\n const keyLooksRelevant = /(^|[._-])(dice|profile|source|external).*(id|guid|uuid)$|(^|[._-])(id|guid|uuid)$/i.test(path);\n if (text && keyLooksRelevant && isLikelyDiceProfileId(text)) {\n candidates.push({ path, value: text });\n }\n return;\n }\n if (typeof value !== 'object' || seen.has(value)) return;\n seen.add(value);\n Object.entries(value).forEach(([key, child]) => {\n visit(child, path ? `${path}.${key}` : key);\n });\n };\n\n visit(record);\n\n return candidates.find((candidate) => /dice|profile|source|external/i.test(candidate.path))?.value\n ?? candidates[0]?.value\n ?? '';\n}\n\nexport function resolveDiceProfileId(candidate) {\n if (!candidate || typeof candidate !== 'object') return '';\n\n // Check if this is a Dice candidate\n const isDiceCandidate = (() => {\n const source = candidate?.sourceType\n ?? candidate?.profileSource\n ?? candidate?.selectedSource;\n const normalizedSources = Array.isArray(source) ? source : [source];\n return normalizedSources.some(\n (value) => String(value ?? '').trim().toLowerCase() === 'dice',\n );\n })();\n\n const explicitPaths = [\n 'diceId',\n 'diceID',\n 'dice_id',\n 'diceProfileId',\n 'diceProfileID',\n 'diceProfileGuid',\n 'profileId',\n 'profileID',\n 'profileGuid',\n 'sourceId',\n 'sourceProfileId',\n 'externalId',\n 'externalProfileId',\n 'customFields.diceId',\n 'customFields.diceProfileId',\n 'customFields.profileId',\n 'customFields.externalProfileId',\n 'customFields.diceProfileData.diceId',\n 'customFields.diceProfileData.diceID',\n 'customFields.diceProfileData.id',\n 'customFields.diceProfileData._id',\n 'customFields.diceProfileData.profileId',\n 'customFields.diceProfileData.profileID',\n 'customFields.diceProfileData.diceProfileId',\n 'customFields.diceProfileData.diceProfileID',\n 'customFields.diceProfileData.guid',\n 'customFields.diceProfileData.uuid',\n 'customFields.diceProfileData.externalId',\n 'customFields.diceProfileData.candidateid',\n 'customFields.diceProfileData.candidateId',\n ];\n\n const explicitDiceId = firstPresentValue(\n ...explicitPaths.map((path) => getPathValue(candidate, path)),\n );\n\n if (explicitDiceId && !isLikelyDiceCandidateId(explicitDiceId, candidate)) {\n return String(explicitDiceId);\n }\n\n const likelyNestedId = findLikelyDiceProfileId(candidate);\n if (likelyNestedId) return likelyNestedId;\n\n const genericId = firstPresentValue(candidate.id, candidate._id);\n \n // For Dice candidates, accept the ID even if it looks like an internal MongoDB ObjectId\n // For non-Dice candidates, reject IDs that look like internal record IDs\n if (genericId && (isDiceCandidate || !isLikelyInternalRecordId(genericId))) {\n return String(genericId);\n }\n \n return '';\n}\n\nexport function normalizeDiceSkills(skills) {\n if (!skills) return [];\n \n if (Array.isArray(skills)) {\n return skills\n .map(skill => {\n // Handle Dice format: {skill: \"courts\", lastUsed: 2026}\n if (skill?.skill) return skill.skill;\n // Handle other object formats\n if (typeof skill === 'object' && skill !== null) {\n if (skill?.name) return skill.name;\n if (skill?.skillName) return skill.skillName;\n if (skill?.value) return skill.value;\n }\n // Handle string skills\n if (typeof skill === 'string') return skill;\n return null;\n })\n .filter(Boolean);\n }\n \n if (typeof skills === 'string') {\n return skills.split(',').map(s => s.trim()).filter(Boolean);\n }\n \n return [];\n}\n\n/**\n * Normalizes location from various Dice location formats\n */\nfunction normalizeDiceLocation(candidate) {\n // Try locations array first (common in Dice)\n if (Array.isArray(candidate.locations) && candidate.locations.length > 0) {\n const loc = candidate.locations[0];\n if (typeof loc === 'string') return loc;\n if (loc?.region) return loc.region;\n if (loc?.city) return loc.city;\n if (loc?.name) return loc.name;\n if (loc?.location) return loc.location;\n }\n \n // Try direct location fields\n return (\n candidate.currentLocation ??\n candidate.location ??\n candidate.city ??\n candidate.region ??\n ''\n );\n}\n\n/**\n * Normalizes experience from various Dice experience formats\n */\nfunction normalizeDiceExperience(candidate) {\n const exp = (\n candidate.totalExperience ??\n candidate.experience ??\n candidate.yearsOfExperience ??\n candidate.exp ??\n candidate.totalYearsOfExperience ??\n candidate.workExperienceYears\n );\n \n return exp != null && exp !== '' ? exp : null;\n}\n\n/**\n * Normalizes date from various Dice date formats\n */\nfunction normalizeDiceDate(candidate) {\n return (\n candidate.dateLastUpdated ??\n candidate.updatedAt ??\n candidate.createdAt ??\n candidate.createdDate ??\n candidate.dateCreated ??\n null\n );\n}\n\n/**\n * Normalizes name from various Dice name formats\n */\nfunction normalizeDiceName(candidate) {\n const parts = [\n candidate.firstName,\n candidate.middleName,\n candidate.lastName,\n ].filter(Boolean);\n \n if (parts.length > 0) return parts.join(' ');\n \n return (\n candidate.fullName ??\n candidate.name ??\n candidate.candidateName ??\n ''\n );\n}\n\n/**\n * Maps a single Dice candidate to the Internal Candidate format\n * \n * @param {Object} diceCandidate - Raw Dice API candidate object\n * @param {number} index - Index for fallback ID generation\n * @returns {Object} Mapped candidate in Internal format\n */\nexport function mapDiceCandidateToInternal(diceCandidate, index = 0) {\n if (!diceCandidate || typeof diceCandidate !== 'object') {\n return {\n id: `dice-candidate-${index}`,\n diceId: '',\n candidateId: '',\n firstName: '',\n lastName: '',\n name: '-',\n designation: '-',\n currentLocation: '',\n location: '',\n exp: '',\n totalExperience: null,\n skills: [],\n createdAt: null,\n createdOn: '-',\n sourceType: 'dice',\n profileSource: 'dice',\n };\n }\n\n const fullName = normalizeDiceName(diceCandidate);\n const nameParts = fullName.split(' ');\n const firstName = nameParts[0] || '';\n const lastName = nameParts.length > 1 ? nameParts[nameParts.length - 1] : '';\n \n const location = normalizeDiceLocation(diceCandidate);\n const experience = normalizeDiceExperience(diceCandidate);\n const createdOn = normalizeDiceDate(diceCandidate);\n const diceProfileId = resolveDiceProfileId(diceCandidate);\n const candidateId = diceCandidate.candidateId\n ?? diceCandidate.customFields?.diceProfileData?.candidateId\n ?? `dice-candidate-${index}`;\n \n // Extract skills from various possible fields\n const rawSkills = diceCandidate.skills ?? \n diceCandidate.technicalSkills ?? \n diceCandidate.primarySkills ??\n diceCandidate.keySkills ??\n [];\n \n const skills = normalizeDiceSkills(rawSkills);\n \n // Debug logging to verify transformation\n if (process.env.NODE_ENV === 'development') {\n console.log('[DiceMapper] Original skills:', rawSkills);\n console.log('[DiceMapper] Mapped skills:', skills);\n console.log('[DiceMapper] Dice IDs:', {\n id: diceProfileId,\n diceId: diceProfileId,\n candidateId,\n });\n }\n\n return {\n // Preserve original Dice fields for reference\n ...diceCandidate,\n \n // Map to Internal candidate schema. Keep the Dice profile id as the primary id.\n id: diceProfileId,\n diceId: diceProfileId,\n candidateId,\n \n // Name fields\n firstName,\n lastName,\n middleName: diceCandidate.middleName || '',\n name: fullName || '-',\n fullName: fullName || '',\n \n // Professional info\n designation: diceCandidate.currentJobTitle ?? diceCandidate.jobTitle ?? diceCandidate.designation ?? diceCandidate.currentDesignation ?? '-',\n currentDesignation: diceCandidate.currentJobTitle ?? diceCandidate.jobTitle ?? diceCandidate.designation ?? diceCandidate.currentDesignation ?? '',\n jobTitle: diceCandidate.currentJobTitle ?? diceCandidate.jobTitle ?? diceCandidate.designation ?? '',\n \n // Location\n currentLocation: location || '',\n location: location || '',\n city: diceCandidate.city ?? diceCandidate.locations?.[0]?.city ?? '',\n region: diceCandidate.region ?? diceCandidate.locations?.[0]?.region ?? '',\n \n // Experience\n totalExperience: experience,\n experience: experience,\n yearsOfExperience: experience,\n exp: experience != null && experience !== '' ? `${experience} yrs` : '',\n \n // Skills\n skills,\n technicalSkills: skills,\n primarySkills: skills,\n \n // Dates\n createdAt: createdOn,\n createdOn: createdOn ? String(createdOn) : '-',\n updatedAt: createdOn,\n dateLastUpdated: createdOn,\n \n // Source identification\n sourceType: 'dice',\n profileSource: 'dice',\n selectedSource: ['dice'],\n \n // Additional fields with defaults\n email: diceCandidate.email ?? diceCandidate.emailAddress ?? '',\n phone: diceCandidate.phone ?? diceCandidate.phoneNumber ?? diceCandidate.mobile ?? '',\n summary: diceCandidate.summary ?? diceCandidate.bio ?? diceCandidate.description ?? '',\n resume: diceCandidate.resume ?? diceCandidate.resumeUrl ?? diceCandidate.cvUrl ?? '',\n \n // Status and metadata\n isActive: true,\n isDeleted: false,\n };\n}\n\n/**\n * Maps an array of Dice candidates to the Internal Candidate format\n * \n * @param {Array} diceCandidates - Array of raw Dice API candidate objects\n * @returns {Array} Array of mapped candidates in Internal format\n */\nexport function mapDiceCandidatesToInternal(diceCandidates) {\n if (!Array.isArray(diceCandidates)) {\n return [];\n }\n \n return diceCandidates.map((candidate, index) => \n mapDiceCandidateToInternal(candidate, index)\n );\n}\n\n/**\n * Transforms a Dice API response to match the existing Candidate List API response format\n * \n * @param {Object} diceResponse - Raw Dice API response\n * @param {Object} originalResponseStructure - The expected response structure from Internal API\n * @returns {Object} Transformed response matching Internal API format\n */\nexport function transformDiceResponseToInternalFormat(diceResponse, originalResponseStructure = {}) {\n if (!diceResponse || typeof diceResponse !== 'object') {\n return {\n status: 'success',\n data: {\n fields: [],\n actions: [],\n columnActions: [],\n count: 0,\n data: [],\n },\n };\n }\n\n // Extract candidates array from various possible response structures\n const diceCandidates = Array.isArray(diceResponse) \n ? diceResponse \n : diceResponse?.data?.data ?? \n diceResponse?.data?.applicant ?? \n diceResponse?.data?.candidates ?? \n diceResponse?.data?.items ?? \n diceResponse?.items ?? \n diceResponse?.candidates ?? \n diceResponse?.records ?? \n [];\n\n // Map Dice candidates to Internal format\n const mappedCandidates = mapDiceCandidatesToInternal(diceCandidates);\n\n // Extract count from various possible locations\n const count = (\n diceResponse?.data?.count?.searchCount ??\n diceResponse?.data?.count?.total ??\n diceResponse?.count?.searchCount ??\n diceResponse?.count?.total ??\n diceResponse?.total ??\n diceResponse?.totalCount ??\n mappedCandidates.length\n );\n\n // Preserve existing metadata from the original response structure\n return {\n status: diceResponse?.status ?? 'success',\n data: {\n // Preserve fields, actions, columnActions from original structure\n fields: originalResponseStructure?.fields ?? diceResponse?.data?.fields ?? diceResponse?.fields ?? [],\n actions: originalResponseStructure?.actions ?? diceResponse?.data?.actions ?? diceResponse?.actions ?? [],\n columnActions: originalResponseStructure?.columnActions ?? diceResponse?.data?.columnActions ?? diceResponse?.columnActions ?? [],\n \n // Count and mapped data\n count: Number(count) || 0,\n data: mappedCandidates,\n \n // Preserve any additional metadata\n ...(diceResponse?.data?.actionRules && { actionRules: diceResponse.data.actionRules }),\n ...(diceResponse?.data?.tabs && { tabs: diceResponse.data.tabs }),\n ...(diceResponse?.data?.tabField && { tabField: diceResponse.data.tabField }),\n },\n };\n}\n\n/**\n * Checks if a response contains Dice candidates\n * \n * @param {Array|Object} response - API response to check\n * @returns {boolean} True if response contains Dice candidates\n */\nexport function isDiceResponse(response) {\n if (!response) return false;\n \n const candidates = Array.isArray(response) \n ? response \n : response?.data?.data ?? \n response?.data?.applicant ?? \n response?.data?.candidates ?? \n response?.data?.items ?? \n response?.items ?? \n [];\n \n if (!Array.isArray(candidates) || candidates.length === 0) {\n return false;\n }\n \n // Check first few candidates for Dice source indicators\n const sampleSize = Math.min(candidates.length, 5);\n for (let i = 0; i < sampleSize; i++) {\n const candidate = candidates[i];\n const sourceType = candidate?.sourceType ?? candidate?.profileSource ?? '';\n if (String(sourceType).toLowerCase() === 'dice') {\n return true;\n }\n }\n \n return false;\n}\n\nexport default {\n mapDiceCandidateToInternal,\n mapDiceCandidatesToInternal,\n transformDiceResponseToInternalFormat,\n isDiceResponse,\n};\n"],"mappings":"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"}