@twentyhq/people-data-labs 1.0.0

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.
Files changed (341) hide show
  1. package/.claude/settings.local.json +7 -0
  2. package/.nvmrc +1 -0
  3. package/.oxlintrc.json +58 -0
  4. package/.yarnrc.yml +1 -0
  5. package/README.md +16 -0
  6. package/package.json +37 -0
  7. package/public/gallery/cover.png +0 -0
  8. package/public/people-data-labs-icon.png +0 -0
  9. package/src/__tests__/global-setup.ts +87 -0
  10. package/src/__tests__/people-data-labs.integration-test.ts +25 -0
  11. package/src/application-config.ts +18 -0
  12. package/src/command-menu-items/enrich-companies.ts +14 -0
  13. package/src/command-menu-items/enrich-people.ts +14 -0
  14. package/src/constants/__tests__/select-option-constants.spec.ts +142 -0
  15. package/src/constants/billing-margin-multiplier.ts +1 -0
  16. package/src/constants/company-match-cost-dollars.ts +1 -0
  17. package/src/constants/company-type-options.ts +46 -0
  18. package/src/constants/enrichment-status-options.ts +19 -0
  19. package/src/constants/enrichment-workflow-seeds.ts +27 -0
  20. package/src/constants/funding-stage-options.ts +195 -0
  21. package/src/constants/industry-options.ts +1033 -0
  22. package/src/constants/inferred-salary-options.ts +81 -0
  23. package/src/constants/job-role-options.ts +172 -0
  24. package/src/constants/job-title-class-options.ts +39 -0
  25. package/src/constants/job-title-sub-role-options.ts +746 -0
  26. package/src/constants/location-continent-options.ts +53 -0
  27. package/src/constants/metro-options.ts +2692 -0
  28. package/src/constants/mic-exchange-options.ts +494 -0
  29. package/src/constants/micro-credits-per-dollar.ts +1 -0
  30. package/src/constants/pdl-base-url.ts +1 -0
  31. package/src/constants/person-match-cost-dollars.ts +1 -0
  32. package/src/constants/seniority-options.ts +74 -0
  33. package/src/constants/sex-options.ts +18 -0
  34. package/src/constants/size-options.ts +60 -0
  35. package/src/constants/universal-identifiers.ts +1516 -0
  36. package/src/constants/update-fields-option-values.ts +5 -0
  37. package/src/constants/update-fields-options.ts +7 -0
  38. package/src/fields/company/pdl-affiliated-profiles.field.ts +20 -0
  39. package/src/fields/company/pdl-alternative-domains.field.ts +20 -0
  40. package/src/fields/company/pdl-alternative-names.field.ts +20 -0
  41. package/src/fields/company/pdl-company-type.field.ts +28 -0
  42. package/src/fields/company/pdl-employee-count-by-country.field.ts +21 -0
  43. package/src/fields/company/pdl-employee-count.field.ts +19 -0
  44. package/src/fields/company/pdl-enrichment-status.field.ts +29 -0
  45. package/src/fields/company/pdl-facebook-url.field.ts +19 -0
  46. package/src/fields/company/pdl-founded-year.field.ts +19 -0
  47. package/src/fields/company/pdl-funding-stages.field.ts +28 -0
  48. package/src/fields/company/pdl-headline.field.ts +19 -0
  49. package/src/fields/company/pdl-id.field.ts +19 -0
  50. package/src/fields/company/pdl-industry-detail.field.ts +20 -0
  51. package/src/fields/company/pdl-industry.field.ts +28 -0
  52. package/src/fields/company/pdl-last-enriched-at.field.ts +20 -0
  53. package/src/fields/company/pdl-last-funding-date.field.ts +20 -0
  54. package/src/fields/company/pdl-latest-funding-stage.field.ts +29 -0
  55. package/src/fields/company/pdl-legal-name.field.ts +19 -0
  56. package/src/fields/company/pdl-linkedin-id.field.ts +19 -0
  57. package/src/fields/company/pdl-location-continent.field.ts +29 -0
  58. package/src/fields/company/pdl-location-metro.field.ts +28 -0
  59. package/src/fields/company/pdl-mic-exchange.field.ts +28 -0
  60. package/src/fields/company/pdl-naics.field.ts +19 -0
  61. package/src/fields/company/pdl-number-funding-rounds.field.ts +20 -0
  62. package/src/fields/company/pdl-raw-payload.field.ts +19 -0
  63. package/src/fields/company/pdl-sic.field.ts +19 -0
  64. package/src/fields/company/pdl-size-range.field.ts +28 -0
  65. package/src/fields/company/pdl-summary.field.ts +19 -0
  66. package/src/fields/company/pdl-tags.field.ts +19 -0
  67. package/src/fields/company/pdl-ticker.field.ts +19 -0
  68. package/src/fields/company/pdl-total-funding.field.ts +19 -0
  69. package/src/fields/company/pdl-twitter-url.field.ts +19 -0
  70. package/src/fields/person/pdl-birth-date.field.ts +19 -0
  71. package/src/fields/person/pdl-birth-year.field.ts +19 -0
  72. package/src/fields/person/pdl-certifications.field.ts +19 -0
  73. package/src/fields/person/pdl-education.field.ts +19 -0
  74. package/src/fields/person/pdl-enrichment-status.field.ts +29 -0
  75. package/src/fields/person/pdl-experience.field.ts +19 -0
  76. package/src/fields/person/pdl-facebook-url.field.ts +19 -0
  77. package/src/fields/person/pdl-github-url.field.ts +19 -0
  78. package/src/fields/person/pdl-headline.field.ts +19 -0
  79. package/src/fields/person/pdl-id.field.ts +19 -0
  80. package/src/fields/person/pdl-industry.field.ts +28 -0
  81. package/src/fields/person/pdl-inferred-salary.field.ts +28 -0
  82. package/src/fields/person/pdl-interests.field.ts +19 -0
  83. package/src/fields/person/pdl-job-onet-code.field.ts +19 -0
  84. package/src/fields/person/pdl-job-role.field.ts +28 -0
  85. package/src/fields/person/pdl-job-start-date.field.ts +19 -0
  86. package/src/fields/person/pdl-job-summary.field.ts +19 -0
  87. package/src/fields/person/pdl-job-title-class.field.ts +28 -0
  88. package/src/fields/person/pdl-job-title-sub-role.field.ts +29 -0
  89. package/src/fields/person/pdl-languages.field.ts +19 -0
  90. package/src/fields/person/pdl-last-enriched-at.field.ts +19 -0
  91. package/src/fields/person/pdl-likelihood.field.ts +19 -0
  92. package/src/fields/person/pdl-linkedin-connections.field.ts +20 -0
  93. package/src/fields/person/pdl-linkedin-username.field.ts +20 -0
  94. package/src/fields/person/pdl-location-metro.field.ts +28 -0
  95. package/src/fields/person/pdl-location.field.ts +19 -0
  96. package/src/fields/person/pdl-name-aliases.field.ts +19 -0
  97. package/src/fields/person/pdl-profiles.field.ts +19 -0
  98. package/src/fields/person/pdl-raw-payload.field.ts +19 -0
  99. package/src/fields/person/pdl-seniority.field.ts +28 -0
  100. package/src/fields/person/pdl-sex.field.ts +28 -0
  101. package/src/fields/person/pdl-skills.field.ts +19 -0
  102. package/src/fields/person/pdl-summary.field.ts +19 -0
  103. package/src/fields/person/pdl-twitter-url.field.ts +19 -0
  104. package/src/fields/person/pdl-years-experience.field.ts +21 -0
  105. package/src/front-components/enrich-companies-component-effect.tsx +21 -0
  106. package/src/front-components/enrich-people-component-effect.tsx +21 -0
  107. package/src/front-components/utils/call-enrich-logic-function.utils.ts +21 -0
  108. package/src/logic-functions/__mocks__/company-node.mock.ts +11 -0
  109. package/src/logic-functions/__mocks__/create-core-api-client-mock.ts +35 -0
  110. package/src/logic-functions/__mocks__/pdl-company-data.mock.ts +27 -0
  111. package/src/logic-functions/__mocks__/pdl-person-data.mock.ts +23 -0
  112. package/src/logic-functions/__mocks__/person-node.mock.ts +12 -0
  113. package/src/logic-functions/enrich-companies.function.ts +76 -0
  114. package/src/logic-functions/enrich-company.function.ts +73 -0
  115. package/src/logic-functions/enrich-people.function.ts +76 -0
  116. package/src/logic-functions/enrich-person.function.ts +73 -0
  117. package/src/logic-functions/errors/__tests__/pdl-config-error.spec.ts +16 -0
  118. package/src/logic-functions/errors/__tests__/pdl-invalid-input-error.spec.ts +16 -0
  119. package/src/logic-functions/errors/__tests__/pdl-operation-error.spec.ts +16 -0
  120. package/src/logic-functions/errors/__tests__/pdl-record-not-found-error.spec.ts +21 -0
  121. package/src/logic-functions/errors/pdl-config-error.ts +8 -0
  122. package/src/logic-functions/errors/pdl-error-code.ts +8 -0
  123. package/src/logic-functions/errors/pdl-error.ts +12 -0
  124. package/src/logic-functions/errors/pdl-invalid-input-error.ts +8 -0
  125. package/src/logic-functions/errors/pdl-operation-error.ts +8 -0
  126. package/src/logic-functions/errors/pdl-record-not-found-error.ts +22 -0
  127. package/src/logic-functions/handlers/__tests__/enrich-companies.spec.ts +159 -0
  128. package/src/logic-functions/handlers/__tests__/enrich-company.spec.ts +147 -0
  129. package/src/logic-functions/handlers/__tests__/enrich-people.spec.ts +313 -0
  130. package/src/logic-functions/handlers/__tests__/enrich-person.spec.ts +198 -0
  131. package/src/logic-functions/handlers/__tests__/post-install.spec.ts +153 -0
  132. package/src/logic-functions/handlers/company-enrichment-adapter.ts +42 -0
  133. package/src/logic-functions/handlers/company-single-enrichment-adapter.ts +15 -0
  134. package/src/logic-functions/handlers/enrich-companies.ts +15 -0
  135. package/src/logic-functions/handlers/enrich-company.ts +19 -0
  136. package/src/logic-functions/handlers/enrich-people.ts +15 -0
  137. package/src/logic-functions/handlers/enrich-person.ts +19 -0
  138. package/src/logic-functions/handlers/person-enrichment-adapter.ts +29 -0
  139. package/src/logic-functions/handlers/person-single-enrichment-adapter.ts +15 -0
  140. package/src/logic-functions/handlers/post-install.ts +69 -0
  141. package/src/logic-functions/post-install.function.ts +17 -0
  142. package/src/logic-functions/utils/__tests__/aggregate-bulk-enrich-result.spec.ts +52 -0
  143. package/src/logic-functions/utils/__tests__/build-address.spec.ts +30 -0
  144. package/src/logic-functions/utils/__tests__/build-allowed-values.spec.ts +16 -0
  145. package/src/logic-functions/utils/__tests__/build-bulk-records-trigger.spec.ts +26 -0
  146. package/src/logic-functions/utils/__tests__/build-company-create-data.spec.ts +37 -0
  147. package/src/logic-functions/utils/__tests__/build-company-match-keys.spec.ts +35 -0
  148. package/src/logic-functions/utils/__tests__/build-company-matched-data.spec.ts +56 -0
  149. package/src/logic-functions/utils/__tests__/build-currency-from-usd.spec.ts +17 -0
  150. package/src/logic-functions/utils/__tests__/build-emails.spec.ts +23 -0
  151. package/src/logic-functions/utils/__tests__/build-error-result.spec.ts +16 -0
  152. package/src/logic-functions/utils/__tests__/build-full-name.spec.ts +64 -0
  153. package/src/logic-functions/utils/__tests__/build-links.spec.ts +25 -0
  154. package/src/logic-functions/utils/__tests__/build-logic-function-step.spec.ts +33 -0
  155. package/src/logic-functions/utils/__tests__/build-matched-result.spec.ts +33 -0
  156. package/src/logic-functions/utils/__tests__/build-not-found-result.spec.ts +15 -0
  157. package/src/logic-functions/utils/__tests__/build-person-matched-data.spec.ts +117 -0
  158. package/src/logic-functions/utils/__tests__/build-person-name-param.spec.ts +17 -0
  159. package/src/logic-functions/utils/__tests__/build-phones.spec.ts +32 -0
  160. package/src/logic-functions/utils/__tests__/build-skipped-result.spec.ts +17 -0
  161. package/src/logic-functions/utils/__tests__/capitalize-name.spec.ts +26 -0
  162. package/src/logic-functions/utils/__tests__/capitalize-name.test.ts +17 -0
  163. package/src/logic-functions/utils/__tests__/charge-matched-enrichments.spec.ts +56 -0
  164. package/src/logic-functions/utils/__tests__/chunk.spec.ts +25 -0
  165. package/src/logic-functions/utils/__tests__/enrich-companies.spec.ts +26 -0
  166. package/src/logic-functions/utils/__tests__/enrich-company.spec.ts +54 -0
  167. package/src/logic-functions/utils/__tests__/enrich-people.spec.ts +32 -0
  168. package/src/logic-functions/utils/__tests__/enrich-person.spec.ts +62 -0
  169. package/src/logic-functions/utils/__tests__/extract-company-match-params.spec.ts +86 -0
  170. package/src/logic-functions/utils/__tests__/extract-pdl-error-message.spec.ts +17 -0
  171. package/src/logic-functions/utils/__tests__/extract-person-match-params.spec.ts +75 -0
  172. package/src/logic-functions/utils/__tests__/extract-record-ids.spec.ts +32 -0
  173. package/src/logic-functions/utils/__tests__/find-company-id-by-filter.spec.ts +42 -0
  174. package/src/logic-functions/utils/__tests__/find-company-id.spec.ts +118 -0
  175. package/src/logic-functions/utils/__tests__/find-existing-workflow-id.spec.ts +26 -0
  176. package/src/logic-functions/utils/__tests__/find-or-create-current-company.spec.ts +203 -0
  177. package/src/logic-functions/utils/__tests__/get-pdl-api-key.spec.ts +38 -0
  178. package/src/logic-functions/utils/__tests__/is-empty-address.spec.ts +20 -0
  179. package/src/logic-functions/utils/__tests__/is-empty-emails.spec.ts +14 -0
  180. package/src/logic-functions/utils/__tests__/is-empty-full-name.spec.ts +14 -0
  181. package/src/logic-functions/utils/__tests__/is-empty-links.spec.ts +14 -0
  182. package/src/logic-functions/utils/__tests__/is-empty-phones.spec.ts +14 -0
  183. package/src/logic-functions/utils/__tests__/is-empty-text.spec.ts +15 -0
  184. package/src/logic-functions/utils/__tests__/map-company.spec.ts +48 -0
  185. package/src/logic-functions/utils/__tests__/map-person.spec.ts +81 -0
  186. package/src/logic-functions/utils/__tests__/normalize-domain.spec.ts +19 -0
  187. package/src/logic-functions/utils/__tests__/normalize-linkedin-url.spec.ts +22 -0
  188. package/src/logic-functions/utils/__tests__/now-iso.spec.ts +9 -0
  189. package/src/logic-functions/utils/__tests__/parse-geo.spec.ts +21 -0
  190. package/src/logic-functions/utils/__tests__/parse-partial-date.spec.ts +29 -0
  191. package/src/logic-functions/utils/__tests__/parse-pdl-item.spec.ts +88 -0
  192. package/src/logic-functions/utils/__tests__/pick-multi-select.spec.ts +28 -0
  193. package/src/logic-functions/utils/__tests__/pick-select.spec.ts +38 -0
  194. package/src/logic-functions/utils/__tests__/pick-writable-standard.spec.ts +37 -0
  195. package/src/logic-functions/utils/__tests__/post-pdl-enrich.spec.ts +192 -0
  196. package/src/logic-functions/utils/__tests__/post-pdl-single-enrich.spec.ts +172 -0
  197. package/src/logic-functions/utils/__tests__/read-companies.spec.ts +39 -0
  198. package/src/logic-functions/utils/__tests__/read-people.spec.ts +40 -0
  199. package/src/logic-functions/utils/__tests__/resolve-logic-function-id.spec.ts +25 -0
  200. package/src/logic-functions/utils/__tests__/resolve-update-fields-mode.spec.ts +34 -0
  201. package/src/logic-functions/utils/__tests__/run-batch-enrichment.spec.ts +524 -0
  202. package/src/logic-functions/utils/__tests__/salary-transform.spec.ts +15 -0
  203. package/src/logic-functions/utils/__tests__/seed-enrichment-workflow.spec.ts +136 -0
  204. package/src/logic-functions/utils/__tests__/size-transform.spec.ts +18 -0
  205. package/src/logic-functions/utils/__tests__/to-json-array.spec.ts +16 -0
  206. package/src/logic-functions/utils/__tests__/to-json-object.spec.ts +18 -0
  207. package/src/logic-functions/utils/__tests__/to-number.spec.ts +17 -0
  208. package/src/logic-functions/utils/__tests__/to-string-array.spec.ts +17 -0
  209. package/src/logic-functions/utils/__tests__/to-text.spec.ts +20 -0
  210. package/src/logic-functions/utils/__tests__/update-companies-status.spec.ts +32 -0
  211. package/src/logic-functions/utils/__tests__/update-company-record.spec.ts +25 -0
  212. package/src/logic-functions/utils/__tests__/update-people-status.spec.ts +32 -0
  213. package/src/logic-functions/utils/__tests__/update-person-record.spec.ts +25 -0
  214. package/src/logic-functions/utils/aggregate-bulk-enrich-result.ts +21 -0
  215. package/src/logic-functions/utils/build-address.ts +40 -0
  216. package/src/logic-functions/utils/build-allowed-values.ts +5 -0
  217. package/src/logic-functions/utils/build-bulk-records-trigger.ts +25 -0
  218. package/src/logic-functions/utils/build-company-create-data.ts +35 -0
  219. package/src/logic-functions/utils/build-company-match-keys.ts +16 -0
  220. package/src/logic-functions/utils/build-company-matched-data.ts +56 -0
  221. package/src/logic-functions/utils/build-currency-from-usd.ts +16 -0
  222. package/src/logic-functions/utils/build-emails.ts +34 -0
  223. package/src/logic-functions/utils/build-error-result.ts +18 -0
  224. package/src/logic-functions/utils/build-full-name.ts +38 -0
  225. package/src/logic-functions/utils/build-links.ts +23 -0
  226. package/src/logic-functions/utils/build-logic-function-step.ts +30 -0
  227. package/src/logic-functions/utils/build-matched-result.ts +21 -0
  228. package/src/logic-functions/utils/build-not-found-result.ts +9 -0
  229. package/src/logic-functions/utils/build-person-matched-data.ts +78 -0
  230. package/src/logic-functions/utils/build-person-name-param.ts +19 -0
  231. package/src/logic-functions/utils/build-phones.ts +40 -0
  232. package/src/logic-functions/utils/build-skipped-result.ts +15 -0
  233. package/src/logic-functions/utils/capitalize-name.ts +8 -0
  234. package/src/logic-functions/utils/charge-matched-enrichments.ts +29 -0
  235. package/src/logic-functions/utils/chunk.ts +18 -0
  236. package/src/logic-functions/utils/enrich-chunk.ts +361 -0
  237. package/src/logic-functions/utils/enrich-companies.ts +21 -0
  238. package/src/logic-functions/utils/enrich-company.ts +23 -0
  239. package/src/logic-functions/utils/enrich-people.ts +22 -0
  240. package/src/logic-functions/utils/enrich-person.ts +24 -0
  241. package/src/logic-functions/utils/extract-company-match-params.ts +52 -0
  242. package/src/logic-functions/utils/extract-pdl-error-message.ts +47 -0
  243. package/src/logic-functions/utils/extract-person-match-params.ts +59 -0
  244. package/src/logic-functions/utils/extract-record-ids.ts +18 -0
  245. package/src/logic-functions/utils/find-company-id-by-filter.ts +28 -0
  246. package/src/logic-functions/utils/find-company-id.ts +59 -0
  247. package/src/logic-functions/utils/find-existing-workflow-id.ts +18 -0
  248. package/src/logic-functions/utils/find-or-create-current-company.ts +108 -0
  249. package/src/logic-functions/utils/get-pdl-api-key.ts +15 -0
  250. package/src/logic-functions/utils/internal-field-names.ts +6 -0
  251. package/src/logic-functions/utils/is-empty-address.ts +20 -0
  252. package/src/logic-functions/utils/is-empty-emails.ts +13 -0
  253. package/src/logic-functions/utils/is-empty-full-name.ts +13 -0
  254. package/src/logic-functions/utils/is-empty-links.ts +13 -0
  255. package/src/logic-functions/utils/is-empty-phones.ts +13 -0
  256. package/src/logic-functions/utils/is-empty-text.ts +4 -0
  257. package/src/logic-functions/utils/map-company.ts +115 -0
  258. package/src/logic-functions/utils/map-person.ts +136 -0
  259. package/src/logic-functions/utils/normalize-domain.ts +22 -0
  260. package/src/logic-functions/utils/normalize-linkedin-url.ts +23 -0
  261. package/src/logic-functions/utils/now-iso.ts +1 -0
  262. package/src/logic-functions/utils/parse-geo.ts +33 -0
  263. package/src/logic-functions/utils/parse-partial-date.ts +33 -0
  264. package/src/logic-functions/utils/parse-pdl-item.ts +82 -0
  265. package/src/logic-functions/utils/pick-multi-select.ts +32 -0
  266. package/src/logic-functions/utils/pick-select.ts +30 -0
  267. package/src/logic-functions/utils/pick-writable-standard.ts +27 -0
  268. package/src/logic-functions/utils/post-pdl-enrich.ts +89 -0
  269. package/src/logic-functions/utils/post-pdl-single-enrich.ts +59 -0
  270. package/src/logic-functions/utils/read-companies.ts +53 -0
  271. package/src/logic-functions/utils/read-people.ts +48 -0
  272. package/src/logic-functions/utils/resolve-logic-function-id.ts +11 -0
  273. package/src/logic-functions/utils/resolve-min-likelihood.ts +12 -0
  274. package/src/logic-functions/utils/resolve-update-fields-mode.ts +16 -0
  275. package/src/logic-functions/utils/run-batch-enrichment.ts +50 -0
  276. package/src/logic-functions/utils/run-single-enrichment.ts +44 -0
  277. package/src/logic-functions/utils/salary-transform.ts +18 -0
  278. package/src/logic-functions/utils/seed-enrichment-workflow.ts +131 -0
  279. package/src/logic-functions/utils/size-transform.ts +15 -0
  280. package/src/logic-functions/utils/to-bulk-enrich-input.ts +14 -0
  281. package/src/logic-functions/utils/to-json-array.ts +4 -0
  282. package/src/logic-functions/utils/to-json-object.ts +22 -0
  283. package/src/logic-functions/utils/to-number.ts +4 -0
  284. package/src/logic-functions/utils/to-string-array.ts +28 -0
  285. package/src/logic-functions/utils/to-text.ts +11 -0
  286. package/src/logic-functions/utils/update-companies-status.ts +18 -0
  287. package/src/logic-functions/utils/update-company-record.ts +15 -0
  288. package/src/logic-functions/utils/update-people-status.ts +18 -0
  289. package/src/logic-functions/utils/update-person-record.ts +15 -0
  290. package/src/roles/default-function.role.ts +41 -0
  291. package/src/types/address-parts.ts +9 -0
  292. package/src/types/address-value.ts +10 -0
  293. package/src/types/batch-enrichment-adapter.ts +43 -0
  294. package/src/types/bulk-enrich-input.ts +9 -0
  295. package/src/types/bulk-enrich-result.ts +11 -0
  296. package/src/types/company-id-by-match-key-cache.ts +1 -0
  297. package/src/types/company-match-keys.ts +6 -0
  298. package/src/types/company-node.ts +16 -0
  299. package/src/types/currency-value.ts +4 -0
  300. package/src/types/emails-value.ts +4 -0
  301. package/src/types/enrich-result.ts +11 -0
  302. package/src/types/enrich-status.ts +1 -0
  303. package/src/types/enrichment-workflow-seed.ts +9 -0
  304. package/src/types/full-name-value.ts +4 -0
  305. package/src/types/links-value.ts +5 -0
  306. package/src/types/mapped-record.ts +4 -0
  307. package/src/types/pdl-company-data.ts +50 -0
  308. package/src/types/pdl-company-enrich-params.ts +7 -0
  309. package/src/types/pdl-enrich-result.ts +4 -0
  310. package/src/types/pdl-person-data.ts +65 -0
  311. package/src/types/pdl-person-enrich-params.ts +8 -0
  312. package/src/types/person-node.ts +11 -0
  313. package/src/types/phones-value.ts +12 -0
  314. package/src/types/post-install-result.ts +5 -0
  315. package/src/types/seed-enrichment-workflow-result.ts +7 -0
  316. package/src/types/select-option-meta.ts +9 -0
  317. package/src/types/single-enrich-input.ts +7 -0
  318. package/src/types/tag-color.ts +26 -0
  319. package/src/types/update-fields-option.ts +4 -0
  320. package/src/types/workflow-bulk-records-trigger.ts +15 -0
  321. package/src/types/workflow-logic-function-step.ts +18 -0
  322. package/src/utils/__tests__/build-select-options.spec.ts +20 -0
  323. package/src/utils/__tests__/is-defined.spec.ts +16 -0
  324. package/src/utils/__tests__/is-unique-violation-error.spec.ts +71 -0
  325. package/src/utils/__tests__/normalize-enum-value.spec.ts +28 -0
  326. package/src/utils/__tests__/prune-undefined.spec.ts +22 -0
  327. package/src/utils/__tests__/strip-separators.spec.ts +13 -0
  328. package/src/utils/__tests__/to-error-message.spec.ts +13 -0
  329. package/src/utils/build-select-options.ts +16 -0
  330. package/src/utils/is-defined.ts +5 -0
  331. package/src/utils/is-unique-violation-error.ts +74 -0
  332. package/src/utils/normalize-enum-value.ts +15 -0
  333. package/src/utils/prune-undefined.ts +15 -0
  334. package/src/utils/strip-separators.ts +4 -0
  335. package/src/utils/to-error-message.ts +2 -0
  336. package/src/views/enriched-companies.view.ts +69 -0
  337. package/src/views/enriched-people.view.ts +74 -0
  338. package/tsconfig.json +42 -0
  339. package/tsconfig.spec.json +9 -0
  340. package/vitest.config.ts +31 -0
  341. package/vitest.unit.config.ts +14 -0
@@ -0,0 +1,11 @@
1
+ export const resolveLogicFunctionId = ({
2
+ logicFunctions,
3
+ universalIdentifier,
4
+ }: {
5
+ logicFunctions: { id: string; universalIdentifier?: string | null }[];
6
+ universalIdentifier: string;
7
+ }): string | undefined =>
8
+ logicFunctions.find(
9
+ (logicFunction) =>
10
+ logicFunction.universalIdentifier === universalIdentifier,
11
+ )?.id;
@@ -0,0 +1,12 @@
1
+ const DEFAULT_MIN_LIKELIHOOD = 2;
2
+ const WEAK_IDENTIFIER_MIN_LIKELIHOOD = 6;
3
+
4
+ export const resolveMinLikelihood = ({
5
+ inputMinLikelihood,
6
+ hasStrongIdentifier,
7
+ }: {
8
+ inputMinLikelihood: number | undefined;
9
+ hasStrongIdentifier: boolean;
10
+ }): number =>
11
+ inputMinLikelihood ??
12
+ (hasStrongIdentifier ? DEFAULT_MIN_LIKELIHOOD : WEAK_IDENTIFIER_MIN_LIKELIHOOD);
@@ -0,0 +1,16 @@
1
+ import { UPDATE_FIELDS_OPTIONS } from 'src/constants/update-fields-options';
2
+ import { type UpdateFieldsOption } from 'src/types/update-fields-option';
3
+
4
+ export const resolveUpdateFieldsMode = (
5
+ updateFields?: UpdateFieldsOption,
6
+ ): { shouldPersist: boolean; overrideExistingValues: boolean } => {
7
+ if (updateFields === UPDATE_FIELDS_OPTIONS.no) {
8
+ return { shouldPersist: false, overrideExistingValues: false };
9
+ }
10
+
11
+ if (updateFields === UPDATE_FIELDS_OPTIONS.overwrite) {
12
+ return { shouldPersist: true, overrideExistingValues: true };
13
+ }
14
+
15
+ return { shouldPersist: true, overrideExistingValues: false };
16
+ };
@@ -0,0 +1,50 @@
1
+ import { type CoreApiClient } from 'twenty-client-sdk/core';
2
+
3
+ import { aggregateBulkEnrichResult } from 'src/logic-functions/utils/aggregate-bulk-enrich-result';
4
+ import {
5
+ buildErrorResult,
6
+ ENRICHMENT_FAILED_MESSAGE,
7
+ } from 'src/logic-functions/utils/build-error-result';
8
+ import { chunk } from 'src/logic-functions/utils/chunk';
9
+ import { enrichChunk } from 'src/logic-functions/utils/enrich-chunk';
10
+ import { extractRecordIds } from 'src/logic-functions/utils/extract-record-ids';
11
+ import { type BatchEnrichmentAdapter } from 'src/types/batch-enrichment-adapter';
12
+ import { type BulkEnrichInput } from 'src/types/bulk-enrich-input';
13
+ import { type BulkEnrichResult } from 'src/types/bulk-enrich-result';
14
+ import { type CompanyIdByMatchKeyCache } from 'src/types/company-id-by-match-key-cache';
15
+ import { type EnrichResult } from 'src/types/enrich-result';
16
+
17
+ const PDL_BATCH_SIZE = 100;
18
+
19
+ export const runBatchEnrichment = async <TNode, TData, TParams>({
20
+ client,
21
+ input,
22
+ adapter,
23
+ }: {
24
+ client: CoreApiClient;
25
+ input: BulkEnrichInput;
26
+ adapter: BatchEnrichmentAdapter<TNode, TData, TParams>;
27
+ }): Promise<BulkEnrichResult> => {
28
+ const recordIds = Array.from(new Set(extractRecordIds(input.records)));
29
+ const resultById = new Map<string, EnrichResult>();
30
+ const companyIdByMatchKeyCache: CompanyIdByMatchKeyCache = new Map();
31
+
32
+ for (const recordIdsChunk of chunk({ items: recordIds, size: PDL_BATCH_SIZE })) {
33
+ await enrichChunk({
34
+ client,
35
+ recordIds: recordIdsChunk,
36
+ input,
37
+ adapter,
38
+ resultById,
39
+ companyIdByMatchKeyCache,
40
+ });
41
+ }
42
+
43
+ const results = recordIds.map(
44
+ (recordId) =>
45
+ resultById.get(recordId) ??
46
+ buildErrorResult({ recordId, error: ENRICHMENT_FAILED_MESSAGE }),
47
+ );
48
+
49
+ return aggregateBulkEnrichResult(results);
50
+ };
@@ -0,0 +1,44 @@
1
+ import { isNonEmptyString } from '@sniptt/guards';
2
+ import { type CoreApiClient } from 'twenty-client-sdk/core';
3
+
4
+ import {
5
+ buildErrorResult,
6
+ ENRICHMENT_FAILED_MESSAGE,
7
+ } from 'src/logic-functions/utils/build-error-result';
8
+ import { runBatchEnrichment } from 'src/logic-functions/utils/run-batch-enrichment';
9
+ import { type BatchEnrichmentAdapter } from 'src/types/batch-enrichment-adapter';
10
+ import { type EnrichResult } from 'src/types/enrich-result';
11
+ import { type SingleEnrichInput } from 'src/types/single-enrich-input';
12
+
13
+ const NO_RECORD_ID_MESSAGE = 'No record id was provided to enrich.';
14
+
15
+ export const runSingleEnrichment = async <TNode, TData, TParams>({
16
+ client,
17
+ input,
18
+ adapter,
19
+ }: {
20
+ client: CoreApiClient;
21
+ input: SingleEnrichInput;
22
+ adapter: BatchEnrichmentAdapter<TNode, TData, TParams>;
23
+ }): Promise<EnrichResult> => {
24
+ const recordId = input.recordId?.trim();
25
+
26
+ if (!isNonEmptyString(recordId)) {
27
+ return buildErrorResult({ recordId: '', error: NO_RECORD_ID_MESSAGE });
28
+ }
29
+
30
+ const bulkResult = await runBatchEnrichment({
31
+ client,
32
+ input: {
33
+ records: recordId,
34
+ updateFields: input.updateFields,
35
+ minLikelihood: input.minLikelihood,
36
+ },
37
+ adapter,
38
+ });
39
+
40
+ return (
41
+ bulkResult.results[0] ??
42
+ buildErrorResult({ recordId, error: ENRICHMENT_FAILED_MESSAGE })
43
+ );
44
+ };
@@ -0,0 +1,18 @@
1
+ import { stripSeparators } from 'src/utils/strip-separators';
2
+
3
+ const SALARY_LOOKUP: Record<string, string> = {
4
+ '<20000': 'UNDER_20000',
5
+ '20000-25000': 'FROM_20000_TO_25000',
6
+ '25000-35000': 'FROM_25000_TO_35000',
7
+ '35000-45000': 'FROM_35000_TO_45000',
8
+ '45000-55000': 'FROM_45000_TO_55000',
9
+ '55000-70000': 'FROM_55000_TO_70000',
10
+ '70000-85000': 'FROM_70000_TO_85000',
11
+ '85000-100000': 'FROM_85000_TO_100000',
12
+ '100000-150000': 'FROM_100000_TO_150000',
13
+ '150000-250000': 'FROM_150000_TO_250000',
14
+ '>250000': 'OVER_250000',
15
+ };
16
+
17
+ export const salaryTransform = (raw: string): string | undefined =>
18
+ SALARY_LOOKUP[stripSeparators(raw)];
@@ -0,0 +1,131 @@
1
+ import { type CoreApiClient } from 'twenty-client-sdk/core';
2
+
3
+ import { PdlOperationError } from 'src/logic-functions/errors/pdl-operation-error';
4
+ import { buildBulkRecordsTrigger } from 'src/logic-functions/utils/build-bulk-records-trigger';
5
+ import { buildLogicFunctionStep } from 'src/logic-functions/utils/build-logic-function-step';
6
+ import { findExistingWorkflowId } from 'src/logic-functions/utils/find-existing-workflow-id';
7
+ import { type EnrichmentWorkflowSeed } from 'src/types/enrichment-workflow-seed';
8
+ import { type SeedEnrichmentWorkflowResult } from 'src/types/seed-enrichment-workflow-result';
9
+ import { isDefined } from 'src/utils/is-defined';
10
+
11
+ const TRIGGER_STEP_ID = 'trigger';
12
+
13
+ export const seedEnrichmentWorkflow = async ({
14
+ client,
15
+ logicFunctionId,
16
+ seed,
17
+ }: {
18
+ client: CoreApiClient;
19
+ logicFunctionId: string;
20
+ seed: EnrichmentWorkflowSeed;
21
+ }): Promise<SeedEnrichmentWorkflowResult> => {
22
+ const existingWorkflowId = await findExistingWorkflowId({
23
+ client,
24
+ name: seed.workflowName,
25
+ });
26
+
27
+ if (isDefined(existingWorkflowId)) {
28
+ return {
29
+ objectNameSingular: seed.objectNameSingular,
30
+ workflowName: seed.workflowName,
31
+ status: 'skipped',
32
+ workflowId: existingWorkflowId,
33
+ };
34
+ }
35
+
36
+ const createResult = (await client.mutation({
37
+ createWorkflow: {
38
+ __args: { data: { name: seed.workflowName } },
39
+ id: true,
40
+ },
41
+ })) as { createWorkflow?: { id?: string } };
42
+
43
+ const workflowId = createResult.createWorkflow?.id;
44
+
45
+ if (!isDefined(workflowId)) {
46
+ throw new PdlOperationError(
47
+ `Failed to create workflow "${seed.workflowName}": no id returned.`,
48
+ );
49
+ }
50
+
51
+ const versionsResult = (await client.query({
52
+ workflowVersions: {
53
+ __args: { filter: { workflowId: { eq: workflowId } } },
54
+ edges: { node: { id: true, status: true } },
55
+ },
56
+ })) as {
57
+ workflowVersions?: { edges?: { node?: { id?: string; status?: string } }[] };
58
+ };
59
+
60
+ const draftVersionId = versionsResult.workflowVersions?.edges?.find(
61
+ (edge) => edge.node?.status === 'DRAFT',
62
+ )?.node?.id;
63
+
64
+ if (!isDefined(draftVersionId)) {
65
+ throw new PdlOperationError(
66
+ `No draft version found for workflow "${seed.workflowName}".`,
67
+ );
68
+ }
69
+
70
+ const stepId = crypto.randomUUID();
71
+
72
+ const trigger = buildBulkRecordsTrigger({
73
+ objectNameSingular: seed.objectNameSingular,
74
+ name: seed.triggerName,
75
+ icon: seed.icon,
76
+ });
77
+
78
+ await client.mutation({
79
+ updateWorkflowVersion: {
80
+ __args: { id: draftVersionId, data: { trigger } },
81
+ id: true,
82
+ },
83
+ });
84
+
85
+ const callMutationNotYetInClientSchema = (
86
+ request: unknown,
87
+ ): Promise<unknown> => client.mutation(request as never);
88
+
89
+ await callMutationNotYetInClientSchema({
90
+ createWorkflowVersionStep: {
91
+ __args: {
92
+ input: {
93
+ workflowVersionId: draftVersionId,
94
+ stepType: 'LOGIC_FUNCTION',
95
+ parentStepId: TRIGGER_STEP_ID,
96
+ id: stepId,
97
+ defaultSettings: { input: { logicFunctionId } },
98
+ },
99
+ },
100
+ triggerDiff: true,
101
+ stepsDiff: true,
102
+ },
103
+ });
104
+
105
+ const step = buildLogicFunctionStep({
106
+ id: stepId,
107
+ name: seed.stepName,
108
+ logicFunctionId,
109
+ logicFunctionInput: seed.logicFunctionInput,
110
+ });
111
+
112
+ await callMutationNotYetInClientSchema({
113
+ updateWorkflowVersionStep: {
114
+ __args: { input: { workflowVersionId: draftVersionId, step } },
115
+ id: true,
116
+ },
117
+ });
118
+
119
+ await callMutationNotYetInClientSchema({
120
+ activateWorkflowVersion: {
121
+ __args: { workflowVersionId: draftVersionId },
122
+ },
123
+ });
124
+
125
+ return {
126
+ objectNameSingular: seed.objectNameSingular,
127
+ workflowName: seed.workflowName,
128
+ status: 'created',
129
+ workflowId,
130
+ };
131
+ };
@@ -0,0 +1,15 @@
1
+ import { stripSeparators } from 'src/utils/strip-separators';
2
+
3
+ const SIZE_LOOKUP: Record<string, string> = {
4
+ '1-10': 'ONE_TO_TEN',
5
+ '11-50': 'ELEVEN_TO_FIFTY',
6
+ '51-200': 'FIFTY_ONE_TO_TWO_HUNDRED',
7
+ '201-500': 'TWO_HUNDRED_ONE_TO_FIVE_HUNDRED',
8
+ '501-1000': 'FIVE_HUNDRED_ONE_TO_ONE_THOUSAND',
9
+ '1001-5000': 'ONE_THOUSAND_ONE_TO_FIVE_THOUSAND',
10
+ '5001-10000': 'FIVE_THOUSAND_ONE_TO_TEN_THOUSAND',
11
+ '10001+': 'TEN_THOUSAND_ONE_PLUS',
12
+ };
13
+
14
+ export const sizeTransform = (raw: string): string | undefined =>
15
+ SIZE_LOOKUP[stripSeparators(raw)];
@@ -0,0 +1,14 @@
1
+ import { isObject } from '@sniptt/guards';
2
+ import { type RoutePayload } from 'twenty-sdk/define';
3
+
4
+ import { type BulkEnrichInput } from 'src/types/bulk-enrich-input';
5
+
6
+ type EnrichRouteBody = { recordIds?: string[] };
7
+
8
+ export type EnrichInput = BulkEnrichInput | RoutePayload<EnrichRouteBody>;
9
+
10
+ const isRoutePayload = (input: EnrichInput): input is RoutePayload<EnrichRouteBody> =>
11
+ isObject(input) && 'requestContext' in input;
12
+
13
+ export const toBulkEnrichInput = (input: EnrichInput): BulkEnrichInput =>
14
+ isRoutePayload(input) ? { records: input.body?.recordIds ?? [] } : input;
@@ -0,0 +1,4 @@
1
+ import { isNonEmptyArray } from '@sniptt/guards';
2
+
3
+ export const toJsonArray = (value: unknown): unknown[] | undefined =>
4
+ isNonEmptyArray(value) ? value : undefined;
@@ -0,0 +1,22 @@
1
+ import { isArray, isObject } from '@sniptt/guards';
2
+
3
+ export const toJsonObject = (
4
+ value: unknown,
5
+ ): Record<string, unknown> | undefined => {
6
+ if (!isObject(value) || isArray(value)) {
7
+ return undefined;
8
+ }
9
+
10
+ const valuePrototype = Object.getPrototypeOf(value);
11
+ const isPlainObject =
12
+ valuePrototype === Object.prototype || valuePrototype === null;
13
+ if (!isPlainObject) {
14
+ return undefined;
15
+ }
16
+
17
+ if (Object.keys(value).length === 0) {
18
+ return undefined;
19
+ }
20
+
21
+ return value as Record<string, unknown>;
22
+ };
@@ -0,0 +1,4 @@
1
+ import { isNumber } from '@sniptt/guards';
2
+
3
+ export const toNumber = (value: unknown): number | undefined =>
4
+ isNumber(value) && Number.isFinite(value) ? value : undefined;
@@ -0,0 +1,28 @@
1
+ import { isArray, isNonEmptyArray } from '@sniptt/guards';
2
+
3
+ import { toText } from 'src/logic-functions/utils/to-text';
4
+ import { isDefined } from 'src/utils/is-defined';
5
+
6
+ export const toStringArray = (value: unknown): string[] | undefined => {
7
+ if (!isArray(value)) {
8
+ return undefined;
9
+ }
10
+
11
+ const uniqueStrings: string[] = [];
12
+ const seenLowercaseValues = new Set<string>();
13
+
14
+ for (const entry of value) {
15
+ const stringValue = toText(entry);
16
+ if (!isDefined(stringValue)) {
17
+ continue;
18
+ }
19
+
20
+ const lowercaseValue = stringValue.toLowerCase();
21
+ if (!seenLowercaseValues.has(lowercaseValue)) {
22
+ seenLowercaseValues.add(lowercaseValue);
23
+ uniqueStrings.push(stringValue);
24
+ }
25
+ }
26
+
27
+ return isNonEmptyArray(uniqueStrings) ? uniqueStrings : undefined;
28
+ };
@@ -0,0 +1,11 @@
1
+ import { isNonEmptyString, isString } from '@sniptt/guards';
2
+
3
+ export const toText = (value: unknown): string | undefined => {
4
+ if (!isString(value)) {
5
+ return undefined;
6
+ }
7
+
8
+ const trimmed = value.trim();
9
+
10
+ return isNonEmptyString(trimmed) ? trimmed : undefined;
11
+ };
@@ -0,0 +1,18 @@
1
+ import { type CoreApiClient } from 'twenty-client-sdk/core';
2
+
3
+ export const updateCompaniesStatus = async ({
4
+ client,
5
+ recordIds,
6
+ data,
7
+ }: {
8
+ client: CoreApiClient;
9
+ recordIds: string[];
10
+ data: Record<string, unknown>;
11
+ }): Promise<void> => {
12
+ await client.mutation({
13
+ updateCompanies: {
14
+ __args: { filter: { id: { in: recordIds } }, data },
15
+ id: true,
16
+ },
17
+ });
18
+ };
@@ -0,0 +1,15 @@
1
+ import { type CoreApiClient } from 'twenty-client-sdk/core';
2
+
3
+ export const updateCompanyRecord = async ({
4
+ client,
5
+ recordId,
6
+ data,
7
+ }: {
8
+ client: CoreApiClient;
9
+ recordId: string;
10
+ data: Record<string, unknown>;
11
+ }): Promise<void> => {
12
+ await client.mutation({
13
+ updateCompany: { __args: { id: recordId, data }, id: true },
14
+ });
15
+ };
@@ -0,0 +1,18 @@
1
+ import { type CoreApiClient } from 'twenty-client-sdk/core';
2
+
3
+ export const updatePeopleStatus = async ({
4
+ client,
5
+ recordIds,
6
+ data,
7
+ }: {
8
+ client: CoreApiClient;
9
+ recordIds: string[];
10
+ data: Record<string, unknown>;
11
+ }): Promise<void> => {
12
+ await client.mutation({
13
+ updatePeople: {
14
+ __args: { filter: { id: { in: recordIds } }, data },
15
+ id: true,
16
+ },
17
+ });
18
+ };
@@ -0,0 +1,15 @@
1
+ import { type CoreApiClient } from 'twenty-client-sdk/core';
2
+
3
+ export const updatePersonRecord = async ({
4
+ client,
5
+ recordId,
6
+ data,
7
+ }: {
8
+ client: CoreApiClient;
9
+ recordId: string;
10
+ data: Record<string, unknown>;
11
+ }): Promise<void> => {
12
+ await client.mutation({
13
+ updatePerson: { __args: { id: recordId, data }, id: true },
14
+ });
15
+ };
@@ -0,0 +1,41 @@
1
+ import {
2
+ defineApplicationRole,
3
+ STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS,
4
+ SystemPermissionFlag,
5
+ } from 'twenty-sdk/define';
6
+
7
+ import { DEFAULT_ROLE_UNIVERSAL_IDENTIFIER } from 'src/constants/universal-identifiers';
8
+
9
+ export default defineApplicationRole({
10
+ universalIdentifier: DEFAULT_ROLE_UNIVERSAL_IDENTIFIER,
11
+ label: 'People Data Labs enrichment role',
12
+ description: 'Reads and updates People/Companies to write enrichment data.',
13
+ canReadAllObjectRecords: false,
14
+ canUpdateAllObjectRecords: false,
15
+ canSoftDeleteAllObjectRecords: false,
16
+ canDestroyAllObjectRecords: false,
17
+ canUpdateAllSettings: false,
18
+ canBeAssignedToAgents: false,
19
+ canBeAssignedToUsers: false,
20
+ canBeAssignedToApiKeys: false,
21
+ objectPermissions: [
22
+ {
23
+ objectUniversalIdentifier:
24
+ STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.person.universalIdentifier,
25
+ canReadObjectRecords: true,
26
+ canUpdateObjectRecords: true,
27
+ canSoftDeleteObjectRecords: false,
28
+ canDestroyObjectRecords: false,
29
+ },
30
+ {
31
+ objectUniversalIdentifier:
32
+ STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.company.universalIdentifier,
33
+ canReadObjectRecords: true,
34
+ canUpdateObjectRecords: true,
35
+ canSoftDeleteObjectRecords: false,
36
+ canDestroyObjectRecords: false,
37
+ },
38
+ ],
39
+ fieldPermissions: [],
40
+ permissionFlagUniversalIdentifiers: [SystemPermissionFlag.WORKFLOWS],
41
+ });
@@ -0,0 +1,9 @@
1
+ export type AddressParts = {
2
+ street1?: string | null;
3
+ street2?: string | null;
4
+ city?: string | null;
5
+ postcode?: string | null;
6
+ state?: string | null;
7
+ country?: string | null;
8
+ geo?: string | null;
9
+ };
@@ -0,0 +1,10 @@
1
+ export type AddressValue = {
2
+ addressStreet1: string;
3
+ addressStreet2: string;
4
+ addressCity: string;
5
+ addressPostcode: string;
6
+ addressState: string;
7
+ addressCountry: string;
8
+ addressLat: number | null;
9
+ addressLng: number | null;
10
+ };
@@ -0,0 +1,43 @@
1
+ import { type CoreApiClient } from 'twenty-client-sdk/core';
2
+
3
+ import { type BulkEnrichInput } from 'src/types/bulk-enrich-input';
4
+ import { type CompanyIdByMatchKeyCache } from 'src/types/company-id-by-match-key-cache';
5
+ import { type PdlEnrichResult } from 'src/types/pdl-enrich-result';
6
+
7
+ export type BatchEnrichmentAdapter<TNode, TData, TParams> = {
8
+ objectNameSingular: string;
9
+ noIdentifierMessage: string;
10
+ costPerMatchDollars: number;
11
+ readRecords: (args: {
12
+ client: CoreApiClient;
13
+ recordIds: string[];
14
+ }) => Promise<TNode[]>;
15
+ getNodeId: (node: TNode) => string;
16
+ extractParams: (args: {
17
+ node: TNode;
18
+ input: BulkEnrichInput;
19
+ }) => TParams | undefined;
20
+ enrichBatch: (params: TParams[]) => Promise<PdlEnrichResult<TData>[]>;
21
+ buildMatchedData: (args: {
22
+ client: CoreApiClient;
23
+ node: TNode;
24
+ outcome: { likelihood?: number; data: TData };
25
+ enrichedAt: string;
26
+ companyIdByMatchKeyCache: CompanyIdByMatchKeyCache;
27
+ overrideExistingValues: boolean;
28
+ shouldPersist: boolean;
29
+ }) => Promise<{
30
+ mappedData: Record<string, unknown>;
31
+ persistData: Record<string, unknown>;
32
+ }>;
33
+ updateOne: (args: {
34
+ client: CoreApiClient;
35
+ recordId: string;
36
+ data: Record<string, unknown>;
37
+ }) => Promise<void>;
38
+ updateManyStatus: (args: {
39
+ client: CoreApiClient;
40
+ recordIds: string[];
41
+ data: Record<string, unknown>;
42
+ }) => Promise<void>;
43
+ };
@@ -0,0 +1,9 @@
1
+ import { type UpdateFieldsOption } from 'src/types/update-fields-option';
2
+
3
+ export type RecordInput = string | { id?: string | null };
4
+
5
+ export type BulkEnrichInput = {
6
+ records: RecordInput | RecordInput[];
7
+ updateFields?: UpdateFieldsOption;
8
+ minLikelihood?: number;
9
+ };
@@ -0,0 +1,11 @@
1
+ import { type EnrichResult } from 'src/types/enrich-result';
2
+
3
+ export type BulkEnrichResult = {
4
+ success: boolean;
5
+ total: number;
6
+ matched: number;
7
+ notFound: number;
8
+ skipped: number;
9
+ errored: number;
10
+ results: EnrichResult[];
11
+ };
@@ -0,0 +1 @@
1
+ export type CompanyIdByMatchKeyCache = Map<string, string | undefined>;
@@ -0,0 +1,6 @@
1
+ export type CompanyMatchKeys = {
2
+ pdlId?: string;
3
+ website?: string;
4
+ linkedinUrl?: string;
5
+ name?: string;
6
+ };
@@ -0,0 +1,16 @@
1
+ export type CompanyNode = {
2
+ id: string;
3
+ name?: string | null;
4
+ domainName?: { primaryLinkUrl?: string | null } | null;
5
+ linkedinLink?: { primaryLinkUrl?: string | null } | null;
6
+ address?: {
7
+ addressStreet1?: string | null;
8
+ addressStreet2?: string | null;
9
+ addressCity?: string | null;
10
+ addressPostcode?: string | null;
11
+ addressState?: string | null;
12
+ addressCountry?: string | null;
13
+ } | null;
14
+ pdlId?: string | null;
15
+ pdlLastEnrichedAt?: string | null;
16
+ };
@@ -0,0 +1,4 @@
1
+ export type CurrencyValue = {
2
+ amountMicros: number;
3
+ currencyCode: string;
4
+ };
@@ -0,0 +1,4 @@
1
+ export type EmailsValue = {
2
+ primaryEmail: string;
3
+ additionalEmails: string[] | null;
4
+ };
@@ -0,0 +1,11 @@
1
+ import { type EnrichStatus } from 'src/types/enrich-status';
2
+
3
+ export type EnrichResult = {
4
+ success: boolean;
5
+ recordId: string;
6
+ status: EnrichStatus;
7
+ updatedFields: string[];
8
+ data?: Record<string, unknown>;
9
+ message: string;
10
+ error?: string;
11
+ };
@@ -0,0 +1 @@
1
+ export type EnrichStatus = 'MATCHED' | 'NOT_FOUND' | 'ERROR' | 'SKIPPED';
@@ -0,0 +1,9 @@
1
+ export type EnrichmentWorkflowSeed = {
2
+ objectNameSingular: string;
3
+ workflowName: string;
4
+ triggerName: string;
5
+ icon: string;
6
+ stepName: string;
7
+ logicFunctionUniversalIdentifier: string;
8
+ logicFunctionInput: Record<string, unknown>;
9
+ };