1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- import isViablePhoneNumber from './isViablePhoneNumber.js'
- // https://www.ietf.org/rfc/rfc3966.txt
- /**
- * @param {string} text - Phone URI (RFC 3966).
- * @return {object} `{ ?number, ?ext }`.
- */
- export function parseRFC3966(text) {
- let number
- let ext
- // Replace "tel:" with "tel=" for parsing convenience.
- text = text.replace(/^tel:/, 'tel=')
- for (const part of text.split(';')) {
- const [name, value] = part.split('=')
- switch (name) {
- case 'tel':
- number = value
- break
- case 'ext':
- ext = value
- break
- case 'phone-context':
- // Only "country contexts" are supported.
- // "Domain contexts" are ignored.
- if (value[0] === '+') {
- number = value + number
- }
- break
- }
- }
- // If the phone number is not viable, then abort.
- if (!isViablePhoneNumber(number)) {
- return {}
- }
- const result = { number }
- if (ext) {
- result.ext = ext
- }
- return result
- }
- /**
- * @param {object} - `{ ?number, ?extension }`.
- * @return {string} Phone URI (RFC 3966).
- */
- export function formatRFC3966({ number, ext }) {
- if (!number) {
- return ''
- }
- if (number[0] !== '+') {
- throw new Error(`"formatRFC3966()" expects "number" to be in E.164 format.`)
- }
- return `tel:${number}${ext ? ';ext=' + ext : ''}`
- }
|