UNPKG

meta-capi-param-builder-clientjs

Version:

Conversions API parameter builder for Client-side JavaScript

152 lines (139 loc) 4.64 kB
/* * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under the license found in the * LICENSE file in the root directory of this source tree. */ import { PII_DATA_TYPE, VALID_PARAM_BUILDER_TOKENS, APPENDIX_LENGTH_V2, APPENDIX_NO_CHANGE, APPENDIX_NET_NEW, } from '../../model/constants.js'; import { getNormalizedEmail } from './emailUtil.js'; import { getNormalizedPhone } from './phoneUtil.js'; import { getNormalizedDOB } from './dobUtil.js'; import { getNormalizedGender } from './genderUtil.js'; import { getNormalizedZipCode } from './zipCodeUtil.js'; import { getNormalizedCity, getNormalizedCountry, getNormalizedExternalID, getNormalizedName, getNormalizedState, } from './stringUtil.js'; import { sha256_main } from './sha256_with_dependencies_new.js'; import { getAppendix } from '../appendixUtil.js'; const TRIM_REGEX = /^\s+|\s+$/g; const SHA_256_REGEX = /^[a-f0-9]{64}$/i; const SHA_256_OR_MD5_REGEX = /^[A-Fa-f0-9]{64}$|^[A-Fa-f0-9]{32}$/; const STRIP_WHITESPACE_REGEX = /\s+/g; // Punctuation characters: !"#$%&'()*+,-./:;<=>?@ [\]^_`{|}~ const STRIP_WHITESPACE_AND_PUNCTUATION_REGEX = /[!"#\$%&'\(\)\*\+,\-\.\/:;<=>\?@ \[\\\]\^_`\{\|\}~\s]+/g; const STRIP_NON_LATIN_ALPHA_NUMERIC_REGEX = /[^a-zA-Z0-9]+/g; function getNormalizedAndHashedPII(piiValue, dataType) { if (!piiValue || typeof piiValue !== 'string') { return null; } if (SHA_256_OR_MD5_REGEX.test(piiValue.trim())) { return piiValue.trim().toLowerCase() + '.' + getAppendix(APPENDIX_NO_CHANGE); } else if (isAlreadyNormalizedAndHashedByParamBuilder(piiValue.trim())) { return piiValue.trim(); } else { const normalizedPII = getNormalizedPII(piiValue, dataType); if (!normalizedPII) { return null; } return sha256_main(normalizedPII) + '.' + getAppendix(APPENDIX_NET_NEW); } } function isAlreadyNormalizedAndHashedByParamBuilder(input) { // Find the position of the last dot const lastDot = input.lastIndexOf('.'); if (lastDot !== -1) { const suffix = input.substring(lastDot + 1); if ( VALID_PARAM_BUILDER_TOKENS.includes(suffix) || suffix.length === APPENDIX_LENGTH_V2 ) { return SHA_256_OR_MD5_REGEX.test(input.substring(0, lastDot)); } } return false; } function getNormalizedPII(piiValue, dataType) { if ( !piiValue || !dataType || typeof piiValue !== 'string' || typeof dataType !== 'string' ) { return null; } dataType = getNormalizedExternalID(dataType); if (!Object.values(PII_DATA_TYPE).includes(dataType)) { return null; } let normalizedPII = piiValue; if (dataType === PII_DATA_TYPE.EMAIL) { normalizedPII = getNormalizedEmail(piiValue); } else if (dataType === PII_DATA_TYPE.PHONE) { normalizedPII = getNormalizedPhone(piiValue); } else if (dataType === PII_DATA_TYPE.DATE_OF_BIRTH) { normalizedPII = getNormalizedDOB(piiValue); } else if (dataType === PII_DATA_TYPE.GENDER) { normalizedPII = getNormalizedGender(piiValue); } else if ( dataType === PII_DATA_TYPE.FIRST_NAME || dataType === PII_DATA_TYPE.LAST_NAME ) { normalizedPII = getNormalizedName(piiValue); } else if (dataType === PII_DATA_TYPE.CITY) { normalizedPII = getNormalizedCity(piiValue); } else if (dataType === PII_DATA_TYPE.STATE) { normalizedPII = getNormalizedState(piiValue); } else if (dataType === PII_DATA_TYPE.COUNTRY) { normalizedPII = getNormalizedCountry(piiValue); } else if (dataType === PII_DATA_TYPE.EXTERNAL_ID) { normalizedPII = getNormalizedExternalID(piiValue); } else if (dataType === PII_DATA_TYPE.ZIP_CODE) { normalizedPII = getNormalizedZipCode(piiValue); } return normalizedPII; } /** * Type-tolerating trimmer. Also, removes not just space-whitespace. */ function trim(obj) { return typeof obj === 'string' ? obj.replace(TRIM_REGEX, '') : ''; } function looksLikeHashed(input) { return typeof input === 'string' && SHA_256_REGEX.test(input); } function strip(obj, mode = 'whitespace_only') { let result = ''; if (typeof obj === 'string') { switch (mode) { case 'whitespace_only': result = obj.replace(STRIP_WHITESPACE_REGEX, ''); break; case 'whitespace_and_punctuation': result = obj.replace(STRIP_WHITESPACE_AND_PUNCTUATION_REGEX, ''); break; case 'all_non_latin_alpha_numeric': result = obj.replace(STRIP_NON_LATIN_ALPHA_NUMERIC_REGEX, ''); break; } } return result; } export { getNormalizedPII, getNormalizedAndHashedPII, looksLikeHashed, trim, strip, };