UNPKG

libphonenumber-js

Version:

A simpler (and smaller) rewrite of Google Android's libphonenumber library in javascript

203 lines (201 loc) 6.87 kB
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } var PatternParser = /*#__PURE__*/function () { function PatternParser() { _classCallCheck(this, PatternParser); } return _createClass(PatternParser, [{ key: "parse", value: function parse(pattern) { this.context = [{ or: true, instructions: [] }]; this.parsePattern(pattern); if (this.context.length !== 1) { throw new Error('Non-finalized contexts left when pattern parse ended'); } var _this$context$ = this.context[0], branches = _this$context$.branches, instructions = _this$context$.instructions; if (branches) { return { op: '|', args: branches.concat([expandSingleElementArray(instructions)]) }; } /* istanbul ignore if */ if (instructions.length === 0) { throw new Error('Pattern is required'); } if (instructions.length === 1) { return instructions[0]; } return instructions; } }, { key: "startContext", value: function startContext(context) { this.context.push(context); } }, { key: "endContext", value: function endContext() { this.context.pop(); } }, { key: "getContext", value: function getContext() { return this.context[this.context.length - 1]; } }, { key: "parsePattern", value: function parsePattern(pattern) { if (!pattern) { throw new Error('Pattern is required'); } var match = pattern.match(OPERATOR); if (!match) { if (ILLEGAL_CHARACTER_REGEXP.test(pattern)) { throw new Error("Illegal characters found in a pattern: ".concat(pattern)); } this.getContext().instructions = this.getContext().instructions.concat(pattern.split('')); return; } var operator = match[1]; var before = pattern.slice(0, match.index); var rightPart = pattern.slice(match.index + operator.length); switch (operator) { case '(?:': if (before) { this.parsePattern(before); } this.startContext({ or: true, instructions: [], branches: [] }); break; case ')': if (!this.getContext().or) { throw new Error('")" operator must be preceded by "(?:" operator'); } if (before) { this.parsePattern(before); } if (this.getContext().instructions.length === 0) { throw new Error('No instructions found after "|" operator in an "or" group'); } var _this$getContext = this.getContext(), branches = _this$getContext.branches; branches.push(expandSingleElementArray(this.getContext().instructions)); this.endContext(); this.getContext().instructions.push({ op: '|', args: branches }); break; case '|': if (!this.getContext().or) { throw new Error('"|" operator can only be used inside "or" groups'); } if (before) { this.parsePattern(before); } // The top-level is an implicit "or" group, if required. if (!this.getContext().branches) { // `branches` are not defined only for the root implicit "or" operator. /* istanbul ignore else */ if (this.context.length === 1) { this.getContext().branches = []; } else { throw new Error('"branches" not found in an "or" group context'); } } this.getContext().branches.push(expandSingleElementArray(this.getContext().instructions)); this.getContext().instructions = []; break; case '[': if (before) { this.parsePattern(before); } this.startContext({ oneOfSet: true }); break; case ']': if (!this.getContext().oneOfSet) { throw new Error('"]" operator must be preceded by "[" operator'); } this.endContext(); this.getContext().instructions.push({ op: '[]', args: parseOneOfSet(before) }); break; /* istanbul ignore next */ default: throw new Error("Unknown operator: ".concat(operator)); } if (rightPart) { this.parsePattern(rightPart); } } }]); }(); export { PatternParser as default }; function parseOneOfSet(pattern) { var values = []; var i = 0; while (i < pattern.length) { if (pattern[i] === '-') { if (i === 0 || i === pattern.length - 1) { throw new Error("Couldn't parse a one-of set pattern: ".concat(pattern)); } var prevValue = pattern[i - 1].charCodeAt(0) + 1; var nextValue = pattern[i + 1].charCodeAt(0) - 1; var value = prevValue; while (value <= nextValue) { values.push(String.fromCharCode(value)); value++; } } else { values.push(pattern[i]); } i++; } return values; } var ILLEGAL_CHARACTER_REGEXP = /[\(\)\[\]\?\:\|]/; var OPERATOR = new RegExp( // any of: '(' + // or operator '\\|' + // or '|' + // or group start '\\(\\?\\:' + // or '|' + // or group end '\\)' + // or '|' + // one-of set start '\\[' + // or '|' + // one-of set end '\\]' + ')'); function expandSingleElementArray(array) { if (array.length === 1) { return array[0]; } return array; } //# sourceMappingURL=AsYouTypeFormatter.PatternParser.js.map