libphonenumber-metadata-generator
Version:
Metadata generator for `libphonenumber-js`
195 lines (146 loc) • 8.46 kB
JavaScript
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
// Parses `release_notes.txt` file from Google's `libphonenumber` GitHub repository.
export default function parseReleaseNotes(text) {
var versionsInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
// Get a block of release notes that describes a released version.
var _getVersionNotes = getVersionNotes(text),
_getVersionNotes2 = _slicedToArray(_getVersionNotes, 2),
versionNotes = _getVersionNotes2[0],
restText = _getVersionNotes2[1]; // Read the first line of the release notes.
// It contains the release date and the version number.
// Example: "Aug 13, 2025: v9.0.12"
var _readLine = readLine(versionNotes),
_readLine2 = _slicedToArray(_readLine, 2),
dateAndVersionText = _readLine2[0],
textAfterDateAndVersion = _readLine2[1]; // Old release notes entries might have a "\n\n" sequence after the "date and version" line.
// Skip such old release notes entries.
if (textAfterDateAndVersion) {
// Parse `date` and `version` from the first line of text.
// `date` example: "Nov 23, 2016".
// `version` example: "9.0.12".
var dateAndVersion = parseDateAndVersion(dateAndVersionText);
if (dateAndVersion) {
var date = dateAndVersion.date,
version = dateAndVersion.version; // Read the metadata changes.
var metadataChanges = parseMetadataChanges(textAfterDateAndVersion); // Add this version's info to the list and proceed recursively.
versionsInfo = versionsInfo.concat([{
date: date,
version: version,
changes: metadataChanges
}]);
}
} // If there're more release notes.
if (restText) {
return parseReleaseNotes(restText, versionsInfo);
} // If there're no more release notes, return the result.
return versionsInfo;
}
var METADATA_CHANGES_START_MARKER = 'Metadata changes:';
var METADATA_CHANGES_ITEM_START_MARKER = ' - ';
var METADATA_CHANGES_ITEM_NEW_LINE_MARKER = ' '; // Parses metadata changes from text.
// Finds "Metadata changes:" line, then reads everything below it that starts with a " - ".
// Returns a list of metadata changes (an array of strings).
function parseMetadataChanges(text) {
var metadataChanges = []; // First, it looks for a "Metadata changes:" line which denotes a start of metadata changes block.
var metadataChangesStartsAt = text.indexOf(METADATA_CHANGES_START_MARKER);
if (metadataChangesStartsAt >= 0) {
// If the "Metadata changes:" line is found, the next lines describe metadata changes.
// Those lines start with either " - " or " ".
// If it encounters anything different then it assumes the end of metadata changes block.
var metadataChangesAndRest = text.slice(metadataChangesStartsAt + METADATA_CHANGES_START_MARKER.length + '\n'.length);
while (metadataChangesAndRest) {
var _readLine3 = readLine(metadataChangesAndRest),
_readLine4 = _slicedToArray(_readLine3, 2),
line = _readLine4[0],
rest = _readLine4[1];
if (line.indexOf(METADATA_CHANGES_ITEM_START_MARKER) === 0) {
// If it encounters a "new list item" sequence, it adds a new entry in the list of changes,
metadataChanges.push(line.slice(METADATA_CHANGES_ITEM_START_MARKER.length));
} else if (line.indexOf(METADATA_CHANGES_ITEM_NEW_LINE_MARKER) === 0) {
// If it encounters a "new line" sequence within a given "list item",
// it appends the text on the new line to the text of the latest entry in the list of changes.
metadataChanges[metadataChanges.length - 1] += '\n' + line.slice(METADATA_CHANGES_ITEM_NEW_LINE_MARKER.length);
} else {
// If it encounters anything different then it assumes the end of metadata changes block.
break;
}
metadataChangesAndRest = rest;
}
}
return metadataChanges;
} // Reads the top line from the text.
// Returns that line of text and the rest of the text.
function readLine(text) {
var indexOfNewLineCharacter = text.indexOf('\n');
if (indexOfNewLineCharacter >= 0) {
return [text.slice(0, indexOfNewLineCharacter), text.slice(indexOfNewLineCharacter + '\n'.length)];
}
return [text, undefined];
} // Splits `text` into a "version notes" block and "rest text".
function getVersionNotes(text) {
// Read the latest version's entry of the release notes.
var versionBlockSeparatorStartsAt = text.indexOf(VERSION_BLOCK_SEPARATOR);
if (versionBlockSeparatorStartsAt >= 0) {
var versionNotes = text.slice(0, versionBlockSeparatorStartsAt);
var restText = text.slice(versionBlockSeparatorStartsAt + VERSION_BLOCK_SEPARATOR.length);
return [versionNotes, restText];
} else {
return [text, undefined];
}
} // Parses `date` and `version` from a line of text.
// `date` example: "Nov 23, 2016".
// `version` example: "9.0.12".
function parseDateAndVersion(dateAndVersion) {
// Example: "Aug 13, 2025: v9.0.12"
var match = dateAndVersion.match(DATE_AND_VERSION_REGEXP_3);
if (match) {
return {
date: new Date(Date.UTC(getYearNumber(match[3]), getMonthNumber(match[1]) - 1, getDayNumber(match[2]))),
version: match[4]
};
} // Example: "August 11th, 2011: libphonenumber-3.8"
match = dateAndVersion.match(DATE_AND_VERSION_REGEXP_2);
if (match) {
return {
date: new Date(Date.UTC(getYearNumber(match[3]), getMonthNumber(match[1]) - 1, getDayNumber(match[2]))),
version: match[4]
};
} // Example: "July 30th, 2010"
match = dateAndVersion.match(DATE_AND_VERSION_REGEXP_1);
if (match) {
return {
date: new Date(Date.UTC(getYearNumber(match[3]), getMonthNumber(match[1]) - 1, getDayNumber(match[2]))),
version: match[4]
};
}
}
function getYearNumber(text) {
return Number(text);
}
function getMonthNumber(text) {
if (MONTHS_SHORT.includes(text)) {
return MONTHS_SHORT.indexOf(text) + 1;
}
if (MONTHS_LONG.includes(text)) {
return MONTHS_LONG.indexOf(text) + 1;
}
}
function getDayNumber(text) {
// Example: "02" → 2.
return parseInt(text, 10);
}
var MONTHS_SHORT = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
var MONTHS_LONG = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; // The latest format of release notes entry header.
// Example: "Nov 23, 2016: v7.7.5"
var DATE_AND_VERSION_REGEXP_3 = /([A-Za-z]+) (\d+), (\d{4}): v([\d\.]+)$/; // One of the older formats of release notes entry header.
// Example: "August 11th, 2011: libphonenumber-3.8"
var DATE_AND_VERSION_REGEXP_2 = /([A-Za-z]+) (\d+)(?:th)?, (\d{4}): libphonenumber-([\d\.]+)$/; // The initial format of release notes entry header.
// Example: "July 30th, 2010"
var DATE_AND_VERSION_REGEXP_1 = /([A-Za-z]+) (\d+)(?:th)?, (\d{4})$/;
var VERSION_BLOCK_SEPARATOR = '\n\n';
//# sourceMappingURL=parseReleaseNotes.js.map