{"version":3,"sources":["webpack:///./transfer/components/addressDropdown.js","webpack:///./transfer/utils/address-utils.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/griffin-paypal/address.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/griffin-paypal/lib/client/address.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/griffin-paypal/lib/addressCommon.js","webpack:///./experiments/reviewScreenRedesign.js"],"names":["i18n","content","sysColorBackgroundMediumContrast","_PAYPAL_THEME","Container","glamorous","div","margin","isReviewScreenRedesign","greyBackgroundAndSmaller","AddressDropdown","React","Component","constructor","arguments","_defineProperty","this","props","addresses","map","address","selectedAddressSingleLine","convertAddressToSingleLine","value","id","primaryText","undefined","filter","option","ellipsis","singleLine","griffinMetadata","getGriffinMetadata","griffinHandler","griffinAddress","createHandler","result","formatAddress","style","ADDRESS_FORMAT_DISPLAY_SINGLE","error","window","onerror","AddressUtils","address_line_1","addressLine1","address_line_2","addressLine2","admin_area_2","city","admin_area_1","state","postal_code","zipcode","country_code","countryCode","length","substring","event","target","SHIPPING_ADDRESS_OPTIONS","ADD_ADDRESS","handleAddAddress","handleSelectAddress","tracking","Events","p2p_review_shipping_address_pressed","componentWillReceiveProps","nextProps","shakeBillingLabel","setTimeout","dispatch","CardActions","render","yourAddressContentKey","selectElementId","selectedAddress","hasNoAddressNeededOption","addNewAddressContentKey","showENSubTextRTR","createElement","_DropdownMenu","label","Fragment","concat","enRTRStrings","options","NO_ADDRESS_NEEDED","renderDropdownOptions","data-nemo","onChange","handleChange","onClick","_Button","tertiary","type","padding","handleClick","className","_CaptionText","color","module","exports","addressCommon","assertion","assertMetadata","assertType","basic","definePrivateProperty","formatMessage","unsupportedCountryCodeRe","AddressHandler","getCountry","metadata","countryAliasMapping","country","interceptError","test","message","Error","attributes","setConstants","Object","defineProperty","prototype","bind","handlerDefaultScript","script","enumerable","validateAddress","transformAddress","griffin","language","territory","handler","assertRange","defineProperties","getValueOrDefault","isLatin","jsonDeepMerge","objectGet","objectValues","trimObject","objectAssign","STYLES","ADDRESS_FORMAT_INPUT","ADDRESS_FORMAT_DISPLAY_MULTI","TYPES","ADDRESS_COARSE","ADDRESS_PORTABLE","ADDRESS_PORTABLE_WITH_DETAILS","tranformFromTypeToTypeMapping","coarse","portable","detailed","styleValues","typeValues","transformTypeValues","COARSE_ADDRESS_FIELDS","COARSE_CONTEXT_FIELD_MAP","DISPLAY","ADDRESS_LINES","PORTABLE_ADDRESS_FIELDS","PORTABLE_ADDRESS_WITH_DETAILS_FIELDS","PORTABLE_CONTEXT_FIELD_MAP","TYPE_FIELDS_MAP","PORTABLE_DETAIL_REQUIRED_ERROR","name","detail","metadataLayoutAndProperties","fieldsToCheck","field","every","isLatinAddress","addressScript","metadataTransformMapping","fromType","toType","assertAddress","keys","address_details","addressDetailsField","forEach","propName","propValue","split","assertCountryCode","dependencies","assertOptionsType","optionsType","unwrapBraces","str","replace","createInputObject","detailedLayout","layout","properties","strings","labels","presetValues","reduce","accumulator","obj","fieldProperties","list","groupList","casing","maxLength","max_length","required","hidden","disabled","preset_data","key","applyDisplayTransforms","addressParts","parts","part","inputText","prefix","postfix","text","toUpperCase","toLowerCase","applyCasing","produceFieldText","toParts","addressFields","line","indexOf","collapseParts","index","array","lineString","trimAddress","addressEntryFields","oldGriffinCoarseSupport","fixes","postcode","filterDisabledLayout","filterdLayout","i","ele","portableAddressDetailedToRegular","fromAddress","transformMapping","toAddressLine","addressLine","object","item","transformMappingCopy","address_lines","toAddress","_transformAddress","fromAddressFields","patternsData","patternsRe","patternsMatchElement","processPatternTransforms","toField","lineItem","garbage","fromField","matchElement","RegExp","pair","match","_validateAddress","fields","errors","re","fieldValue","push","validation_regex","validateField","showCountryName","organization","err","propertiesAndLayout","full_name","business_name","displayFields","addressToParts","addressLines","partsToTextArray","join","isAddressDetailsEmpty","regularErrors","detailedErrors","memo","addressLineErrors","includes","detailedFieldsValue","addressDetails","pxp"],"mappings":"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","file":"42.esm.js","sourcesContent":["import PropTypes from 'prop-types'\nimport React from 'react'\nimport glamorous from 'glamorous'\nimport content from 'pp-react-l10n'\nimport * as AddressUtils from '../utils/address-utils'\nimport * as CardActions from '../actions/card'\nimport enRTRStrings from '../../../../config/enRTRStrings'\nimport {\n Button,\n CaptionText,\n DropdownMenu,\n PAYPAL_THEME,\n} from '@paypalcorp/pp-react'\nimport { tracking } from '../../lib/analytics/mParticle'\nimport Events from '../../lib/analytics/eventTags'\nimport { greyBackgroundAndSmaller } from 'lib/styles/media-queries'\nimport { SHIPPING_ADDRESS_OPTIONS } from '../../../../lib/constants'\nimport { isReviewScreenRedesign } from '../../experiments/reviewScreenRedesign'\n\nconst i18n = content('widgets/addressDropdown')\nconst { sysColorBackgroundMediumContrast } = PAYPAL_THEME\nconst Container = glamorous.div({\n margin: isReviewScreenRedesign() ? '1rem 0' : '1rem 2rem',\n [greyBackgroundAndSmaller]: {\n margin: '1rem 0',\n },\n})\n\nclass AddressDropdown extends React.Component {\n static propTypes = {\n addresses: PropTypes.array.isRequired,\n addressEntryFormat: PropTypes.object.isRequired,\n selectedAddress: PropTypes.object.isRequired,\n handleAddAddress: PropTypes.func.isRequired,\n handleSelectAddress: PropTypes.func.isRequired,\n selectElementId: PropTypes.string.isRequired,\n yourAddressContentKey: PropTypes.string.isRequired,\n addNewAddressContentKey: PropTypes.string.isRequired,\n shouldRenderLabel: PropTypes.bool.isRequired,\n hasNoAddressNeededOption: PropTypes.bool.isRequired,\n shakeBillingLabel: PropTypes.bool,\n dispatch: PropTypes.func,\n dir: PropTypes.string.isRequired,\n showENSubTextRTR: PropTypes.bool,\n }\n\n renderDropdownOptions = () => {\n return this.props.addresses\n .map(address => {\n const selectedAddressSingleLine = this.convertAddressToSingleLine(\n address\n )\n // Do not show invalid address\n return selectedAddressSingleLine\n ? {\n value: address.id,\n primaryText: selectedAddressSingleLine,\n }\n : undefined\n })\n .filter(option => option !== undefined) // remove invalid addresses\n }\n\n convertAddressToSingleLine = address => {\n const ellipsis = i18n('label.ellipsis')\n\n const griffinMappedAddress = {\n address_line_1:\n (address.addressLine1 && address.addressLine1.value) ||\n address.address_line_1,\n address_line_2:\n (address.addressLine2 && address.addressLine2.value) ||\n address.address_line_2,\n admin_area_2:\n (address.city && address.city.value) || address.admin_area_2,\n admin_area_1:\n (address.state && address.state.value) || address.admin_area_1,\n postal_code:\n (address.zipcode && address.zipcode.value) || address.postal_code,\n country_code: address.countryCode || address.country_code,\n }\n const singleLine = AddressUtils.formatAddressToSingleLine(\n griffinMappedAddress\n )\n\n return singleLine.length > 75\n ? singleLine.substring(0, 75) + ellipsis\n : singleLine\n }\n\n handleChange = event => {\n if (event.target.value === SHIPPING_ADDRESS_OPTIONS.ADD_ADDRESS) {\n return this.props.handleAddAddress()\n }\n\n this.props.handleSelectAddress(event.target.value)\n }\n\n handleClick = () => {\n this.props.handleAddAddress()\n tracking(Events.p2p_review_shipping_address_pressed())\n }\n\n componentWillReceiveProps(nextProps) {\n if (nextProps.shakeBillingLabel && !this.props.shakeBillingLabel) {\n setTimeout(() => {\n this.props.dispatch(\n CardActions.handleNoBillingAddress(nextProps.shakeBillingLabel)\n )\n }, 2000)\n }\n }\n\n render() {\n const {\n yourAddressContentKey,\n selectElementId,\n addresses,\n selectedAddress,\n hasNoAddressNeededOption,\n addNewAddressContentKey,\n showENSubTextRTR,\n shakeBillingLabel,\n } = this.props\n\n return (\n \n {addresses.length > 0 && (\n \n {i18n(yourAddressContentKey)}\n {showENSubTextRTR && `(${enRTRStrings[yourAddressContentKey]})`}\n \n }\n options={[\n ...(hasNoAddressNeededOption\n ? [\n {\n value: SHIPPING_ADDRESS_OPTIONS.NO_ADDRESS_NEEDED,\n primaryText: i18n('label.noAddressNeeded'),\n },\n ]\n : []),\n ...this.renderDropdownOptions(),\n {\n value: SHIPPING_ADDRESS_OPTIONS.ADD_ADDRESS,\n primaryText: i18n(addNewAddressContentKey),\n },\n ]}\n data-nemo=\"add-shipping-address\"\n value={selectedAddress.id}\n onChange={this.handleChange}\n onClick={() =>\n tracking(Events.p2p_review_shipping_address_pressed())\n }\n />\n )}\n {addresses.length === 0 && (\n <>\n \n {i18n(addNewAddressContentKey)}\n \n {showENSubTextRTR && (\n \n {enRTRStrings[addNewAddressContentKey]}\n \n )}\n \n )}\n \n )\n }\n}\n\nexport default AddressDropdown\n","/**\n * Utilities that deal with address, leveraging client-side Griffin 🎉\n */\nimport griffinAddress from 'griffin-paypal/address'\nimport getGriffinMetadata from './griffin-utils'\n\n/**\n * Get the supported currency pattern for specific style for the current locale\n * @param {Object} address griffin portable address object\n * @return {String} the address into single line\n */\n\nexport function formatAddressToSingleLine(address: Object) {\n const griffinMetadata = getGriffinMetadata()\n const griffinHandler = griffinAddress.createHandler(griffinMetadata)\n\n try {\n const result = griffinHandler.formatAddress(address, {\n style: griffinHandler.ADDRESS_FORMAT_DISPLAY_SINGLE,\n })\n if (typeof result === 'string') {\n return result\n }\n throw result\n } catch (error) {\n // for error scenario griffin returns an error object so this fn must return empty string to downstream\n window.onerror('griffin::formatAddressToSingleLine', '', 0, 0, error)\n return ''\n }\n}\n","\"use strict\";\nmodule.exports = require(\"./lib/client/address\");\n","/* jslint node: true */\n\n\"use strict\";\n\nvar addressCommon = require(\"../addressCommon\");\n\nvar assertion = require(\"./utils/assertion\");\nvar assertMetadata = assertion.assertMetadata;\nvar assertType = assertion.assertType;\n\nvar basic = require(\"./utils/basic\");\nvar definePrivateProperty = basic.definePrivateProperty;\nvar formatMessage = basic.formatMessage;\n\nvar unsupportedCountryCodeRe = /Unsupported value for address.country_code/;\n\nfunction AddressHandler() {}\naddressCommon.setConstants(AddressHandler);\n\nfunction getCountry(metadata, countryCode) {\n return (\n metadata.countryAliasMapping[countryCode] || countryCode || metadata.country\n );\n}\n\nfunction interceptError(error) {\n if (unsupportedCountryCodeRe.test(error.message)) {\n throw new Error(\n formatMessage(\"You have not loaded metadata for `{{country}}` country\", {\n country: error.attributes.countryCode\n })\n );\n }\n throw error;\n}\n\nObject.defineProperty(AddressHandler.prototype, \"formatAddress\", {\n value: function formatAddress(address, options) {\n var metadata = this.metadata;\n try {\n return addressCommon.formatAddress(address, options, metadata, {\n getCountry: getCountry.bind(null, metadata),\n handlerDefaultScript: metadata.script\n });\n } catch (error) {\n interceptError(error);\n }\n },\n enumerable: true\n});\n\nObject.defineProperty(AddressHandler.prototype, \"validateAddress\", {\n value: function validateAddress(address, options) {\n var metadata = this.metadata;\n try {\n return addressCommon.validateAddress(address, options, metadata, {\n handlerDefaultScript: metadata.script,\n getCountry: getCountry.bind(null, metadata)\n });\n } catch (error) {\n interceptError(error);\n }\n },\n enumerable: true\n});\n\nObject.defineProperty(AddressHandler.prototype, \"transformAddress\", {\n value: function transformAddress(address, options) {\n var metadata = this.metadata;\n try {\n return addressCommon.transformAddress(address, options, metadata, {\n getCountry: getCountry.bind(null, metadata)\n });\n } catch (error) {\n interceptError(error);\n }\n },\n enumerable: true\n});\n\nfunction createHandler(metadata) {\n assertType(metadata, \"metadata\", [\"plain object\"]);\n\n assertMetadata(metadata.griffin);\n assertMetadata(metadata.griffin.address);\n metadata = metadata.griffin.address;\n\n assertMetadata(metadata.country, [\"string\"]);\n assertMetadata(metadata.language, [\"string\"]);\n assertMetadata(metadata.script, [\"string\"]);\n assertMetadata(metadata.territory);\n\n var handler = new AddressHandler();\n definePrivateProperty(handler, \"metadata\", metadata);\n\n return handler;\n}\n\nmodule.exports = {\n createHandler: createHandler\n};\n","/**\n * Shared code between Griffin Node.js and Griffin client.\n *\n * Important: Do NOT include anything in here that isn't meant to be part of both libraries.\n */\n\n\"use strict\";\n\nvar assertion = require(\"./client/utils/assertion\");\nvar assertRange = assertion.assertRange;\nvar assertType = assertion.assertType;\n\nvar basic = require(\"./client/utils/basic\");\nvar defineProperties = basic.defineProperties;\nvar getValueOrDefault = basic.getValueOrDefault;\nvar isLatin = basic.isLatin;\nvar jsonDeepMerge = basic.jsonDeepMerge;\nvar objectGet = basic.objectGet;\nvar objectValues = basic.objectValues;\nvar trimObject = basic.trimObject;\nvar objectAssign = require(\"object-assign\");\n\nvar STYLES = {\n ADDRESS_FORMAT_INPUT: \"input\",\n ADDRESS_FORMAT_DISPLAY_SINGLE: \"single_line\",\n ADDRESS_FORMAT_DISPLAY_MULTI: \"multi_line\"\n};\n\nvar TYPES = {\n ADDRESS_COARSE: \"coarse\",\n ADDRESS_PORTABLE: \"portable\",\n ADDRESS_PORTABLE_WITH_DETAILS: \"detailed\"\n};\n\nvar tranformFromTypeToTypeMapping = {\n coarse: [TYPES.ADDRESS_PORTABLE],\n portable: [TYPES.ADDRESS_COARSE],\n detailed: [TYPES.ADDRESS_PORTABLE]\n};\n\nvar styleValues = objectValues(STYLES);\nvar typeValues = [TYPES.ADDRESS_COARSE, TYPES.ADDRESS_PORTABLE];\nvar transformTypeValues = objectValues(TYPES);\n\n// PPaaS: https://github.paypal.com/ApiSpecifications-R/CommonComponentsSpecification/blob/v3/schema/address.json\nvar COARSE_ADDRESS_FIELDS = [\n \"line1\",\n \"line2\",\n \"state\",\n \"city\",\n \"postal_code\",\n \"country_code\"\n];\nvar COARSE_CONTEXT_FIELD_MAP = {\n DISPLAY: COARSE_ADDRESS_FIELDS // array of all display fields for coarse address\n};\n\n// PPaaS: https://github.paypal.com/ApiSpecifications-R/CommonComponentsSpecification/blob/v3/schema/address_portable.json\nvar ADDRESS_LINES = [\"address_line_1\", \"address_line_2\", \"address_line_3\"];\nvar PORTABLE_ADDRESS_FIELDS = ADDRESS_LINES.concat([\n \"admin_area_4\",\n \"admin_area_3\",\n \"admin_area_2\",\n \"admin_area_1\",\n \"postal_code\",\n \"country_code\"\n]);\nvar PORTABLE_ADDRESS_DETAILED_ONLY_FIELDS = [\n \"address_details.building_name\",\n \"address_details.delivery_service\",\n \"address_details.street_name\",\n \"address_details.street_number\",\n \"address_details.street_type\",\n \"address_details.sub_building\"\n];\nvar PORTABLE_ADDRESS_WITH_DETAILS_FIELDS = PORTABLE_ADDRESS_FIELDS.concat(\n PORTABLE_ADDRESS_DETAILED_ONLY_FIELDS\n);\nvar _addressNameFields = [\"full_name\", \"business_name\"];\nvar PORTABLE_CONTEXT_FIELD_MAP = {\n DISPLAY: _addressNameFields.concat(PORTABLE_ADDRESS_FIELDS) // array of all display fields for portable address (includes name fields)\n};\n\nvar TYPE_FIELDS_MAP = {\n coarse: COARSE_ADDRESS_FIELDS,\n portable: PORTABLE_ADDRESS_FIELDS,\n detailed: PORTABLE_ADDRESS_WITH_DETAILS_FIELDS\n};\n\nvar POSTAL_CODE_TYPE = \"postal_code\";\n\nvar PORTABLE_DETAIL_REQUIRED_ERROR = [\n {\n name: \"ADDRESS_REQUIRED_FIELD_MISSING\",\n message: \"A required address field is missing\",\n detail: \"address_details\"\n }\n];\n\nfunction metadataLayoutAndProperties(props) {\n var script;\n var address = props.address;\n var handlerDefaultScript = props.handlerDefaultScript;\n var metadata = props.metadata;\n var style = props.style || STYLES.ADDRESS_FORMAT_INPUT;\n var type = props.type;\n\n if (style === STYLES.ADDRESS_FORMAT_INPUT) {\n // The preferred script for input format is the handler default script (if available) or Latn.\n script = objectGet(metadata, [\n \"territory\",\n address.country_code,\n \"script\",\n handlerDefaultScript\n ])\n ? handlerDefaultScript\n : \"Latn\";\n } else {\n script = addressScript({\n address: address,\n metadata: metadata,\n type: type\n });\n }\n\n // Note: No fallback to 'Default' because address_v2 has metadata for all assigned countries.\n // return { layout, properties } || {}.\n return (\n objectGet(metadata, [\n \"territory\",\n address.country_code,\n \"script\",\n script,\n \"layout_type\",\n type + \"_\" + style\n ]) || {}\n );\n}\n\nfunction metadataTransformMapping(metadata, territory, fromType, toType) {\n return objectGet(metadata, [\n \"territory\",\n territory,\n \"transform_mapping\",\n fromType + \"_to_\" + toType\n ]);\n}\n\n/**\n * Given a parameter, assert it's a valid address.\n * @param {Object} address the address object\n * @throws TypeError\n */\nfunction assertAddress(address) {\n assertType(address, \"address\", [\"plain object\"]);\n var props = Object.keys(address);\n if (address.address_details) {\n props = props.concat(\n Object.keys(address.address_details).map(function(addressDetailsField) {\n return \"address_details.\" + addressDetailsField;\n })\n );\n }\n props.forEach(function(propName) {\n var propValue = objectGet(address, propName.split(\".\"));\n if (propName === \"address_details\") {\n assertType(propValue, \"address.\" + propName, [\"plain object\"]);\n return;\n }\n assertType(propValue, \"address.\" + propName, [\n \"undefined\",\n \"null\",\n \"string\"\n ]);\n });\n}\n\n/**\n * Given a parameter, assert it's a valid country code parameter.\n * @param {string} address the address object\n * @param {Object} environment (Node or client) dependencies\n * @throws TypeError\n */\nfunction assertCountryCode(countryCode, metadata, dependencies) {\n var getCountry = dependencies.getCountry;\n countryCode = getCountry(countryCode); // resolve country_code or fall back to handler country\n\n // 1: Territory keys corresponds to all loaded/supported countries.\n assertRange(\n countryCode,\n metadata.territory /* 1 */,\n \"Unsupported value for address.country_code: {countryCode}\",\n { countryCode: countryCode }\n );\n return countryCode;\n}\n\n/**\n * Given a parameter, assert it's a valid options.type.\n * @param {Object} optionsType the options.type object\n * @throws TypeError\n */\nfunction assertOptionsType(optionsType) {\n var type = getValueOrDefault(optionsType, TYPES.ADDRESS_PORTABLE);\n assertType(type, \"options.type\", [\"string\"]);\n assertRange(type, typeValues, \"Invalid value for options.type: {type}\", {\n type: type\n });\n return type;\n}\n\n/**\n * Given an address object and a type (coarse or portable),\n * return true if the address is completely Latin characters\n * @param {Object} address the address object to test\n * @param {string} type 'portable' or 'coarse' (default)\n * @return {boolean} true if the address is completely Latin\n */\nfunction isLatinAddress(address, type) {\n // get list of fields to check based on type (default to coarse)\n var fieldsToCheck =\n type === \"portable\"\n ? PORTABLE_CONTEXT_FIELD_MAP.DISPLAY // use full set of display fields (including name)\n : COARSE_CONTEXT_FIELD_MAP.DISPLAY;\n\n // filter out postal_code, which should not be checked\n fieldsToCheck = fieldsToCheck.filter(function(field) {\n return field !== \"postal_code\";\n });\n\n // return true if all checked fields are Latin in the given address\n return fieldsToCheck.every(function(field) {\n return isLatin(address[field]);\n });\n}\n\n/**\n * Determine the script to use when attempting to load address metadata\n * cf. https://github.paypal.com/Globalization-Playground/griffin-client-address-design#script-detection\n * If input style: Script = default script of handler language\n * If display style: Script = Latn if address is all Latin, otherwise country default address script\n *\n * NOTE: This assumes that `country` has already been resolved to address.country_code\n * or handler country if address.country_code didn't exist\n *\n * @param {Object} props.address the address object\n * @param {string} props.handlerDefaultScript the default script for the handler language\n * @param {Object} props.metadata\n * @param {string} props.style input, multi_line, or single_line\n * @param {string} props.type coarse or portable\n */\nfunction addressScript(props) {\n var address = props.address;\n var metadata = props.metadata;\n var type = props.type;\n\n // If address is all Latin, always use Latn script\n if (isLatinAddress(address, type)) {\n return \"Latn\";\n }\n\n // Otherwise, use the default address script for the country (which is guaranteed to be in the metadata)\n return objectGet(metadata, [\n \"territory\",\n address.country_code,\n \"primary_script\"\n ]);\n}\n\n/**\n * Given \"{abc}\", return \"abc\"\n * @param {string} str string wrapped in curly braces\n * @return {string} what's inside the curly braces\n */\nfunction unwrapBraces(str) {\n if (!str) {\n return;\n }\n return str.replace(/^{(.*?)}$/, \"$1\"); // e.g., \"{state}\" --> \"state\"\n}\n\n/**\n * Given an address object and metadata (from addressV2Meta)\n * Munge them together to produce an address input object (the return value for ADDRESS_FORMAT_INPUT style)\n *\n * @param {Object} address\n * @param {Object} metadata\n *\n * @return {Object} address input object: {layout, properties}\n */\nfunction createInputObject(props) {\n var address = props.address;\n var detailedLayout = props.detailedLayout;\n var layout = props.layout;\n var metadata = props.metadata;\n var properties = props.properties;\n var type = props.type;\n\n var strings = objectGet(metadata, [\n \"territory\",\n address.country_code,\n \"strings\"\n ]);\n\n // 1: Metadata at this point includes one only handler\n strings = strings[Object.keys(strings)[0] /* 1 */];\n\n var labels = objectGet(strings, [\"address_\" + type, \"labels\"]);\n var presetValues = objectGet(strings, \"preset_values\");\n strings = objectGet(strings, \"address_\" + type);\n\n return jsonDeepMerge(\n {\n layout: layout,\n\n properties: Object.keys(properties).reduce(function(accumulator, field) {\n var fieldProperties = properties[field] || {};\n var list = objectGet(strings, [\"preset_values\", field, \"list\"]);\n var groupList = objectGet(strings, [\n \"preset_values\",\n field,\n \"group_list\"\n ]);\n\n // pick out field properties to expose in input object (exclude validation_regex)\n accumulator[field] = {\n casing: fieldProperties && fieldProperties.casing,\n\n // note max_length --> maxLength\n maxLength: fieldProperties && fieldProperties.max_length,\n\n required: fieldProperties && fieldProperties.required,\n\n hidden: fieldProperties && fieldProperties.hidden,\n\n disabled: fieldProperties && fieldProperties.disabled,\n\n label: labels[field],\n\n // for value, use the preset_data from metadata, or the address input, or just empty string\n // Note: using `objectGet` due to portable address detailed fields like address_details.street_name.\n value:\n fieldProperties.preset_data ||\n objectGet(address, field.split(\".\")) ||\n \"\",\n\n list: presetValues[unwrapBraces(list)],\n\n groupList: presetValues[unwrapBraces(groupList)]\n };\n\n stripUndefined(accumulator[field]); // strip any undefined properties\n\n if (fieldProperties && fieldProperties.disabled) {\n delete accumulator[field];\n }\n\n return accumulator;\n }, {})\n },\n detailedLayout && { detailedLayout: detailedLayout }\n );\n}\n\n/**\n * Given an object with properties, remove any undefined properties\n * Note: Mutates the input object\n * @param {Object} obj\n * @return {Object}\n */\nfunction stripUndefined(obj) {\n Object.keys(obj).forEach(function(key) {\n if (obj[key] === undefined) {\n delete obj[key];\n }\n });\n return obj;\n}\n\n/**\n * Given an address, layout (from metadata), and list of relevant fields,\n * populate a layout array with values from the address object to create a \"parts\" array\n *\n * @param {Object} address the address object\n * @param {Object} layout\n * @param {string} type the address type\n *\n * @returns {array} the parts array populated with values from the address object\n * This allows for further processing to prevent consecutive/trailing/leading separators:\n * [\n * [\n * { type: 'address_line_1', value: '123 Smith Dr.' }\n * ],\n * ...\n * [\n * { type: 'admin_area_2', value: 'San Jose' },\n * { type: 'separator', value: ', ' },\n * { type: 'admin_area_1', value: 'CA' },\n * { type: 'separator', value: ' ' },\n * { type: 'postal_code', value: '95131' }\n * ],\n * [\n * { type: 'country_code', value: 'UNITED STATES OF AMERICA' }\n * ]\n * ]\n *\n */\nfunction addressToParts(address, layout, type) {\n // get all possible display fields for this address type\n var displayFields =\n type === TYPES.ADDRESS_COARSE\n ? COARSE_CONTEXT_FIELD_MAP.DISPLAY\n : PORTABLE_CONTEXT_FIELD_MAP.DISPLAY; // includes full_name and organization\n\n // Note: loop over all components in the layout metadata, not just the fields present in the address object,\n // because we need to display some fields (e.g. SG city) even when address object doesn't have it\n\n // loop over lines in layout\n return layout.map(toParts.bind(null, address, displayFields));\n}\n\n/**\n * Performs address transformations, e.g., preset_data, casing, etc.\n * @param {array} addressParts address parts as returned by addressToParts().\n * @param {Object} properties address metadata properties.\n * @example\n * applyDisplayTransforms([[... { type: 'admin_area_1', value: 'ca' }, ...], ...], properties);\n * // > [[..., { type: 'admin_area_1', value: 'CA' }, ...], ...]\n * // (note CA)\n */\nfunction applyDisplayTransforms(addressParts, properties) {\n addressParts.forEach(function(parts) {\n parts.forEach(function(part) {\n if (part.type === \"separator\") {\n return part;\n }\n\n // pull out properties for this field (to get preset_data and casing)\n var fieldProperties = properties[part.type] || {};\n\n // construct field value based on preset_data, casing, etc.\n part.value = produceFieldText(part.value, fieldProperties);\n });\n });\n}\n\n/**\n * Return an address line \"parts\".\n * @param {Object} address the address object.\n * @param {array} addressFields list of fields of the address (according to its type).\n * @param {array} line metadata layout line\n * @return {array} the line parts populated with values from the address object.\n * [\n * { type: 'address_line_1', value: '123 Smith Dr.' }\n * ]\n */\nfunction toParts(address, addressFields, line) {\n // loop over fields in this line\n return line.map(function(field) {\n // if the field name from the metadata doesn't match one of the display fields,\n // then it's just a literal separator\n if (addressFields.indexOf(field) === -1) {\n return {\n type: \"separator\",\n value: field\n };\n }\n return {\n // Note: using `objectGet` due to portable address detailed fields like address_details.street_name.\n type: field,\n value: objectGet(address, field.split(\".\"))\n };\n });\n}\n\n/**\n * Given address field text and metadata, return the text to display for this field\n * Returns preset_data if it exists, otherwise applies casing and appends affixes\n *\n * @param {string|undefined} inputText text from the address object for this field\n * @param {Object} fieldProperties metadata 'properties' section for this field\n * @return {string} the appropriate text to display for this field\n */\nfunction produceFieldText(inputText, fieldProperties) {\n // preset_data (like \"SINGAPORE\") overrides anything\n if (fieldProperties.preset_data !== undefined) {\n return fieldProperties.preset_data;\n }\n\n var prefix = fieldProperties.prefix || \"\";\n var postfix = fieldProperties.postfix || \"\";\n var casing = fieldProperties.casing; // 'uppercase', 'lowercase', or undefined\n\n return prefix + applyCasing(inputText || \"\", casing) + postfix || \"\";\n}\n\n/**\n * Apply casing to a string\n *\n * @param {string} text the string to change\n * @param {string} casing 'uppercase' or 'lowercase'\n * @return {string} the text with casing (if any) applied\n */\nfunction applyCasing(text, casing) {\n if (casing === \"uppercase\") {\n return text.toUpperCase();\n } else if (casing === \"lowercase\") {\n return text.toLowerCase();\n }\n return text; // if no casing supplied, don't apply any casing\n}\n\n/**\n * Given address parts array (see 'addressToParts'), return an array of strings representing each line\n * With blank lines filtered and no consecutive, initial, or trailing separators\n * @param {array} addressParts\n * @return {array} array of strings (lines)\n */\nfunction partsToTextArray(addressParts) {\n return addressParts\n .map(function(parts) {\n return collapseParts(parts); // collapse this line parts array into a string\n })\n .filter(function(line) {\n return line !== \"\"; // remove any blank lines\n });\n}\n\n/**\n * Given a line parts array like this:\n * [\n * { type: 'admin_area_2', value: 'San Jose' },\n * { type: 'separator', value: ', ' },\n * { type: 'admin_area_1', value: 'CA' },\n * ...\n * ]\n * Collapse it into a string but without any consecutive, initial, or trailing separators\n *\n * @param {array} parts\n * @return {string} the line parts array collapsed into a string\n */\nfunction collapseParts(parts) {\n return parts\n .filter(function(part) {\n // filter any blank values\n return part.value;\n })\n .filter(function(part, index, array) {\n // filter any consecutive separators\n // skip non-separators\n if (part.type !== \"separator\") {\n return true;\n }\n // filter a separator if the next part is going to be a separator\n if (array[index + 1] && array[index + 1].type === \"separator\") {\n return false;\n }\n\n return true;\n })\n .filter(function(part, index, array) {\n // filter any initial or final separator\n // skip non-separators\n if (part.type !== \"separator\") {\n return true;\n }\n\n // filter any line-initial or line-final separators\n if (index === 0 || index === array.length - 1) {\n return false;\n }\n\n return true;\n })\n .reduce(function(lineString, part) {\n // combine all 'value' properties into a single string\n return (lineString += part.value);\n }, \"\");\n}\n\nfunction trimAddress(address, type) {\n // pare down to only relevant fields and trim string fields themselves\n // remove full_name and business_name because those values are passed in via options.name and options.organization\n var addressEntryFields =\n type === TYPES.ADDRESS_PORTABLE\n ? PORTABLE_ADDRESS_FIELDS.concat(\"address_details\")\n : COARSE_ADDRESS_FIELDS;\n\n return trimObject(address, addressEntryFields);\n}\n\n/**\n * Validates a specific field (`field` parameter, e.g. 'address_line_1') of the passed `address` object\n * based on the metadata `properties`.\n */\nfunction validateField(address, field, properties) {\n if (!properties[field]) {\n return [];\n }\n var re;\n var errors = [];\n var fieldValue = objectGet(address, field.split(\".\"));\n // Check for missing required address properties.\n if (properties[field].required && !fieldValue) {\n errors.push({\n name: \"ADDRESS_REQUIRED_FIELD_MISSING\",\n message: \"A required address field is missing\",\n detail: field\n });\n }\n // Check for invalid postal code.\n if (field === POSTAL_CODE_TYPE && properties[field].validation_regex) {\n // TODO Create the regular expression instance once elsewhere, not in here everytime.\n re = new RegExp(\"^\" + properties[field].validation_regex + \"$\");\n if (fieldValue && !re.test(fieldValue)) {\n errors.push({\n name: \"ADDRESS_PATTERN_VALIDATION_ERROR\",\n message: \"The field provided does not match the validation pattern\",\n detail: {\n field: field\n }\n });\n }\n }\n return errors;\n}\n\nfunction oldGriffinCoarseSupport(address) {\n var fixes = {};\n if (address.postcode !== undefined && address.postal_code === undefined) {\n fixes.postal_code = address.postcode;\n }\n if (address.country !== undefined && address.country_code === undefined) {\n fixes.country_code = address.country;\n }\n // Clone and set coarse address \"fixes\".\n if (Object.keys(fixes).length) {\n address = jsonDeepMerge(address, fixes);\n }\n return address;\n}\n\nfunction filterDisabledLayout(layout, properties) {\n if (!layout) {\n return layout;\n }\n var filterdLayout = [];\n for (var i = 0; i < layout.length; i = i + 1) {\n filterdLayout[i] = layout[i].filter(function(ele) {\n return properties[ele] ? !properties[ele].disabled : 1;\n });\n }\n return filterdLayout.filter(function(ele) {\n return ele.length;\n });\n}\n\n/**\n * The core formatAddress function, i.e., the full implementation should be in this function\n * except for environment dependent variables, which are passed via *dependencies* parameter.\n * @param {Object} address See README for details.\n * @param {Object} options See README for details.\n * @param {Object} dependencies Environment dependencies variables (Node.js vs client).\n * @returns See README for details.\n * @example See README for details.\n */\nfunction formatAddress(address, options, metadata, dependencies) {\n assertAddress(address);\n\n options = getValueOrDefault(options, {}); // Note that options is optional, since all its properties are optional\n assertType(options, \"options\", [\"plain object\"]);\n\n // extract options and validate them\n var style = getValueOrDefault(\n options.style,\n STYLES.ADDRESS_FORMAT_DISPLAY_MULTI\n );\n assertType(style, \"options.style\", [\"string\"]);\n assertRange(style, styleValues, \"Invalid value for options.style: {style}\", {\n style: style\n });\n var type = assertOptionsType(options.type);\n var showCountryName = getValueOrDefault(options.showCountryName, false); // omit country name by default\n assertType(showCountryName, \"options.showCountryName\", [\"boolean\"]);\n assertType(options.name, \"options.name\", [\"string\", \"undefined\"]);\n assertType(options.organization, \"options.organization\", [\n \"string\",\n \"undefined\"\n ]);\n\n if (type === TYPES.ADDRESS_COARSE) {\n address = oldGriffinCoarseSupport(address);\n }\n\n address = trimAddress(address, type);\n try {\n address.country_code = assertCountryCode(\n address.country_code,\n metadata,\n dependencies\n );\n } catch (err) {\n return {\n errors: [\n {\n name: \"ADDRESS_INVALID_COUNTRY_ERROR\",\n message:\n \"Unsupported country/region: \" +\n address.country_code +\n \" or was not loaded on the client metadata\",\n detail: { field: \"country_code\" }\n }\n ]\n };\n }\n var propertiesAndLayout = metadataLayoutAndProperties({\n address: address,\n handlerDefaultScript: dependencies.handlerDefaultScript,\n metadata: metadata,\n style: style,\n type: type\n });\n var properties = propertiesAndLayout.properties;\n var layout = filterDisabledLayout(propertiesAndLayout.layout, properties);\n var detailedLayout = filterDisabledLayout(\n propertiesAndLayout.detailedLayout,\n properties\n );\n\n if (style === STYLES.ADDRESS_FORMAT_INPUT) {\n return createInputObject({\n address: address,\n detailedLayout: detailedLayout,\n layout: layout,\n metadata: metadata,\n properties: properties,\n type: type\n });\n }\n\n if (type === TYPES.ADDRESS_PORTABLE && address.address_details) {\n address = portableAddressDetailedToRegular(\n address,\n metadataTransformMapping(\n metadata,\n address.country_code,\n \"detailed\",\n \"portable\"\n )\n );\n }\n\n // add options.name and options.organization as full_name and business_name, respectively\n address.full_name = options.name;\n address.business_name = options.organization;\n\n var addressParts = addressToParts(address, detailedLayout || layout, type);\n\n // Blank out country name if showCountryName is false.\n if (!showCountryName) {\n addressParts = addressParts.map(function(parts) {\n return parts.filter(function(part) {\n return part.type !== \"country_code\";\n });\n });\n }\n\n applyDisplayTransforms(addressParts, properties);\n var addressLines = partsToTextArray(addressParts);\n\n // if style is multi_line, just return the addressLines\n // but if single_line, join it into a string and return\n return style === STYLES.ADDRESS_FORMAT_DISPLAY_SINGLE\n ? addressLines.join(\"\")\n : addressLines;\n}\n\n/**\n * Set constants in the passed object.\n * @param {object} Object where constants such as ADDRESS_PORTABLE should be set.\n */\nfunction setConstants(object) {\n defineProperties(object, STYLES);\n defineProperties(object, TYPES);\n}\n\nfunction portableAddressDetailedToRegular(fromAddress, transformMapping) {\n var addressLines = transformMapping[\"address_lines\"]\n .map(function(addressLine) {\n var parts = toParts(\n fromAddress,\n PORTABLE_ADDRESS_WITH_DETAILS_FIELDS,\n addressLine\n );\n return collapseParts(parts);\n })\n .filter(function(value) {\n return value !== \"\";\n });\n\n // assigning address_lines to address_line_1, address_line_2 and address_line_3\n var toAddressLine = addressLines.reduce(function(object, item, index) {\n object[\"address_line_\" + (index + 1)] = item;\n return object;\n }, {});\n\n // deleting address_lines from transform mapping\n var transformMappingCopy = objectAssign({}, transformMapping);\n delete transformMappingCopy.address_lines;\n\n var toAddress = _transformAddress({\n fromAddress: fromAddress,\n fromAddressFields: PORTABLE_ADDRESS_WITH_DETAILS_FIELDS,\n patternsData: {},\n transformMapping: transformMappingCopy\n });\n return jsonDeepMerge(toAddressLine, toAddress);\n}\n\nfunction _transformAddress(props) {\n var fromAddress = props.fromAddress;\n var fromAddressFields = props.fromAddressFields;\n var patternsData = props.patternsData;\n var transformMapping = props.transformMapping;\n\n var patternsRe = {};\n var patternsMatchElement = {};\n var processPatternTransforms = function(toField, lineItem) {\n return lineItem.replace(/^patterns\\.(.*?)\\.\\$([0-9])$/, function(\n garbage,\n fromField,\n matchElement\n ) {\n patternsRe[toField] = new RegExp(\"^\" + patternsData[fromField] + \"$\");\n patternsMatchElement[toField] = +matchElement;\n return fromField;\n });\n };\n\n return Object.keys(transformMapping)\n .map(function(toField) {\n var line = transformMapping[toField];\n line = line.map(processPatternTransforms.bind(null, toField));\n var parts = toParts(fromAddress, fromAddressFields, line);\n return { toField: toField, value: collapseParts(parts) };\n })\n .filter(function(pair) {\n return pair.value !== \"\";\n })\n .reduce(function(toAddress, pair) {\n var match;\n var toField = pair.toField;\n var value = pair.value;\n\n // Patterns processing.\n if (patternsRe[toField]) {\n match = value.match(patternsRe[toField]);\n value = match[patternsMatchElement[toField]];\n }\n\n if (value) {\n toAddress[toField] = value;\n }\n return toAddress;\n }, {});\n}\n\n/**\n * The core transformAddress function, i.e., the full implementation should be in this function\n * except for environment dependent variables, which are passed via *dependencies* parameter.\n * @param {Object} address See README for details.\n * @param {Object} options See README for details.\n * @param {Object} dependencies Environment dependencies variables (Node.js vs client).\n * @returns See README for details.\n * @example See README for details.\n */\nfunction transformAddress(fromAddress, options, metadata, dependencies) {\n // address\n assertAddress(fromAddress);\n\n // options\n options = getValueOrDefault(options, {});\n assertType(options, \"options\", [\"plain object\"]);\n\n // options.fromType\n var fromType = options.fromType;\n assertType(fromType, \"options.fromType\", [\"string\"]);\n assertRange(\n fromType,\n transformTypeValues,\n \"Invalid value for options.fromType: {type}\",\n { type: fromType }\n );\n var fromAddressFields = TYPE_FIELDS_MAP[fromType];\n\n // options.toType\n var toType = options.toType;\n assertType(toType, \"options.toType\", [\"string\"]);\n assertRange(\n toType,\n transformTypeValues,\n \"Invalid value for options.toType: {type}\",\n {\n type: toType\n }\n );\n\n if (fromType === TYPES.ADDRESS_COARSE) {\n fromAddress = oldGriffinCoarseSupport(fromAddress);\n }\n\n try {\n var countryCode = assertCountryCode(\n fromAddress.country_code,\n metadata,\n dependencies\n );\n } catch (err) {\n return {\n errors: [\n {\n name: \"ADDRESS_INVALID_COUNTRY_ERROR\",\n message:\n \"Unsupported country/region: \" +\n fromAddress.country_code +\n \" or was not loaded on the client metadata\",\n detail: { field: \"country_code\" }\n }\n ]\n };\n }\n\n if (fromType === toType) {\n // No need to perform tranformation as from and to address type is same.\n return fromAddress;\n }\n\n assertRange(\n toType,\n tranformFromTypeToTypeMapping[fromType],\n \"Address transformation is not allowed options.fromType: {fromType} to options.toType: {toType}\",\n {\n fromType: fromType,\n toType: toType\n }\n );\n\n if (\n fromType === TYPES.ADDRESS_PORTABLE_WITH_DETAILS &&\n toType === TYPES.ADDRESS_PORTABLE\n ) {\n return portableAddressDetailedToRegular(\n fromAddress,\n metadataTransformMapping(metadata, countryCode, \"detailed\", \"portable\")\n );\n }\n\n var transformMapping = metadataTransformMapping(\n metadata,\n countryCode,\n fromType,\n toType\n );\n\n var isAddressDetailsEmpty =\n fromAddress.address_details &&\n Object.keys(fromAddress.address_details).length\n ? false\n : true;\n\n if (fromType === TYPES.ADDRESS_PORTABLE && !isAddressDetailsEmpty) {\n fromAddress = portableAddressDetailedToRegular(\n fromAddress,\n metadataTransformMapping(metadata, countryCode, \"detailed\", \"portable\")\n );\n }\n\n var patternsData = objectGet(metadata, [\n \"territory\",\n countryCode,\n \"transform_mapping\",\n \"transform_properties\",\n \"patterns\"\n ]);\n\n return _transformAddress({\n fromAddress: fromAddress,\n fromAddressFields: fromAddressFields,\n patternsData: patternsData,\n transformMapping: transformMapping\n });\n}\n\nfunction _validateAddress(address, fields, properties) {\n return fields.reduce(function(errors, field) {\n return errors.concat(validateField(address, field, properties));\n }, []);\n}\n\n/**\n * The core validateAddress function, i.e., the full implementation should be in this function\n * except for environment dependent variables, which are passed via *dependencies* parameter.\n * @param {Object} address See README for details.\n * @param {Object} options See README for details.\n * @param {Object} dependencies Environment dependencies variables (Node.js vs client).\n * @returns See README for details.\n * @example See README for details.\n */\nfunction validateAddress(address, options, metadata, dependencies) {\n // address\n assertAddress(address);\n\n // options\n options = getValueOrDefault(options, {});\n assertType(options, \"options\", [\"plain object\"]);\n\n // options.type\n var type = assertOptionsType(options.type);\n var fields =\n type === TYPES.ADDRESS_PORTABLE\n ? PORTABLE_ADDRESS_WITH_DETAILS_FIELDS\n : TYPE_FIELDS_MAP[type];\n\n // options.field\n var field = options.field;\n assertType(field, \"options.field\", [\"undefined\", \"string\"]);\n if (field) {\n assertRange(field, fields, \"Invalid value for options.field: {field}\", {\n field: field\n });\n fields = [field];\n }\n\n if (type === TYPES.ADDRESS_COARSE) {\n address = oldGriffinCoarseSupport(address);\n }\n\n address = trimAddress(address, type);\n try {\n address.country_code = assertCountryCode(\n address.country_code,\n metadata,\n dependencies\n );\n } catch (err) {\n return {\n errors: [\n {\n name: \"ADDRESS_INVALID_COUNTRY_ERROR\",\n message:\n \"Unsupported country/region: \" +\n address.country_code +\n \" or was not loaded on the client metadata\",\n detail: { field: \"country_code\" }\n }\n ]\n };\n }\n var propertiesAndLayout = metadataLayoutAndProperties({\n address: address,\n handlerDefaultScript: dependencies.handlerDefaultScript,\n metadata: metadata,\n type: type\n });\n var properties = propertiesAndLayout.properties;\n var detailedLayout = propertiesAndLayout.detailedLayout;\n\n // For portable address on countries that include detailed data and options.field not\n // specified, return:\n // - No errors `{}` in case either regular or detailed layout would be fullfiled\n // - All errors (regular + detailed) otherwise\n if (type === TYPES.ADDRESS_PORTABLE && detailedLayout && !field) {\n var regularErrors = _validateAddress(\n address,\n PORTABLE_ADDRESS_FIELDS,\n properties\n );\n var thisDetailedFields = detailedLayout.reduce(function(memo, line) {\n line.forEach(function(part) {\n if (PORTABLE_ADDRESS_WITH_DETAILS_FIELDS.indexOf(part) !== -1) {\n memo.push(part);\n }\n });\n return memo;\n }, []);\n\n var detailedErrors = _validateAddress(\n address,\n thisDetailedFields,\n properties\n );\n if (regularErrors.length && detailedErrors.length) {\n return {\n errors: regularErrors.concat(\n detailedErrors.filter(function(error) {\n return /address_details/.test(error.detail);\n })\n )\n };\n }\n\n // if address_line_* is missing and address_details object is empty\n // then we need to return error on field \"address_details\".\n if (regularErrors.length) {\n // check if \"address_line_*\" is missing or not\n var addressLineErrors = regularErrors.filter(function(error) {\n return (\n error.name === \"ADDRESS_REQUIRED_FIELD_MISSING\" &&\n ADDRESS_LINES.includes(error.detail)\n );\n });\n if (addressLineErrors) {\n // get list of non empty detail object\n var detailedFieldsValue = [];\n if (address.address_details) {\n var addressDetails = address.address_details;\n Object.keys(addressDetails).forEach(function(key) {\n if (addressDetails[key] && addressDetails[key] !== \"\") {\n detailedFieldsValue.push(addressDetails[key]);\n }\n });\n }\n // check if detail object is empty or not\n if (!detailedFieldsValue.length) {\n return {\n errors: PORTABLE_DETAIL_REQUIRED_ERROR.concat(addressLineErrors)\n };\n }\n }\n }\n\n return {};\n }\n\n var errors = _validateAddress(address, fields, properties);\n return errors.length ? { errors: errors } : {};\n}\n\nmodule.exports = {\n formatAddress: formatAddress,\n setConstants: setConstants,\n transformAddress: transformAddress,\n validateAddress: validateAddress\n};\n","/**\n * https://www.msmaster.qa.paypal.com/elmo/experiment/126418\n */\n\nimport * as pxp from '../lib/pxp'\n\nexport function isReviewScreenRedesign() {\n return pxp.isTreatment('Trmt_p2p_review_screen_redesign')\n}\n"],"sourceRoot":""}