}
*/
export async function clearCaches() {
- userLog("Clearing all four CV localforage.INDEXEDDB caches…");
- // const tasks = [zipJsonStore, cacheStore].map(localforage.clear);
+ userLog("Clearing all five localforage.INDEXEDDB caches…");
+ // const tasks = [zippedJsonStore, cachedFetchStore].map(localforage.clear);
// const results = await Promise.all(tasks);
// results.forEach(x => userLog("Done it", x));
- await failedStore.clear();
- await zipJsonStore.clear();
- await cacheStore.clear(); // This is the one used by the Axion Door43Api (above)
- await unzipStore.clear();
+ await failedFetchStore.clear();
+ await zippedJsonStore.clear();
+ await cachedFetchStore.clear(); // This is the one used by the Axion Door43Api (above)
+ await unzippedFileStore.clear();
await clearCheckedArticleCache(); // Used for checking TA and TW articles referred to by TN links
+ await clearStoredSegmentCache(); // Used for caching verse segments extracted from USFM, etc.
}
@@ -175,7 +202,7 @@ function addToListIfMissing(repos, newRepo) {
async function getUnZippedFile(path) {
// functionLog(`getUnZippedFile(${path})`);
// TODO: Why did we need to lowerCase it here ???
- const contents = await unzipStore.getItem(path.toLowerCase());
+ const contents = await unzippedFileStore.getItem(path.toLowerCase());
return contents;
}
@@ -186,16 +213,16 @@ async function getUnZippedFile(path) {
*/
async function getUnZippedPictureFile(uri) {
// functionLog(`getUnZippedPictureFile(${uri})`);
- const contents = await unzipStore.getItem(uri);
+ const contents = await unzippedFileStore.getItem(uri);
return contents;
}
/**
* searches for files in this order:
- * - cache of uncompressed files (unzipStore)
- * - cache of zipped repos (zipJsonStore)
- * - and finally calls cachedFetchFileFromServerWithBranch() which first checks in cacheStore to see if already fetched. * @param {string} username
+ * - cache of uncompressed files (unzippedFileStore)
+ * - cache of zipped repos (zippedJsonStore)
+ * - and finally calls cachedFetchFileFromServerWithBranch() which first checks in cachedFetchStore to see if already fetched. * @param {string} username
* @param {string} repository
* @param {string} path
* @param {string} branch
@@ -226,7 +253,7 @@ export async function cachedGetFile({ username, repository, path, branch }) {
if (contents) {
// save unzipped file in cache to speed later retrieval
- await unzipStore.setItem(filePath.toLowerCase(), contents);
+ await unzippedFileStore.setItem(filePath.toLowerCase(), contents);
// if (filePath.indexOf('_tq/') < 0) // Don’t log for TQ1 files coz too many
// userLog(`cachedGetFile saved ${filePath} to cache for next time`);
}
@@ -304,7 +331,7 @@ export async function cachedGetBookFilenameFromManifest({ username, repository,
* In this case it would not need to use await to wait for results.
* TRICKY: note that even if the user is super fast in selecting books and clicking next, it will not hurt anything.
* cachedGetFileFromZipOrServer() would just be fetching files directly from repo until the zips are loaded.
- * After that the files would be pulled out of zipJsonStore.
+ * After that the files would be pulled out of zippedJsonStore.
* @param {string} givenUsername
* @param {string} givenLanguageCode
* @param {Array} bookIDList - one or more books that will be checked
@@ -342,7 +369,7 @@ export async function preloadReposIfNecessary(givenUsername, givenLanguageCode,
// const repoName = formRepoName(languageCode, repoCode);
// // debugLog(`preloadReposIfNecessary: checking zip file for ${repoName}…`);
// const uri = zipUri({ username, repository: repoName, branchOrRelease });
- // const zipBlob = await zipJsonStore.getItem(uri.toLowerCase());
+ // const zipBlob = await zippedJsonStore.getItem(uri.toLowerCase());
// if (!zipBlob) newRepoList.push(repoCode);
// }
@@ -406,14 +433,14 @@ export async function preloadReposIfNecessary(givenUsername, givenLanguageCode,
if (thisRepoCode === 'OBS') {
// debugLog(`preloadReposIfNecessary: preloading OBS zipped pictures file from ${OBS_PICTURE_ZIP_URI}…`);
- const zipBlob = await zipJsonStore.getItem(OBS_PICTURE_ZIP_FILENAME);
+ const zipBlob = await zippedJsonStore.getItem(OBS_PICTURE_ZIP_FILENAME);
// debugLog(` getZipFromStore(${uri} -- empty: ${!zipBlob}`);
if (!zipBlob) {
userLog(`downloadingOBSPicturesZipFile(${OBS_PICTURE_ZIP_URI})…`);
const response = await fetch(OBS_PICTURE_ZIP_URI);
if (response.status === 200 || response.status === 0) {
const zipArrayBuffer = await response.arrayBuffer(); // blob storage not supported on mobile
- await zipJsonStore.setItem(OBS_PICTURE_ZIP_FILENAME, zipArrayBuffer);
+ await zippedJsonStore.setItem(OBS_PICTURE_ZIP_FILENAME, zipArrayBuffer);
// debugLog(` downloadingOBSPicturesZipFile(${uri}) -- saved zip`);
} else {
console.error(`downloadingOBSPicturesZipFile(${OBS_PICTURE_ZIP_URI}) -- got response status: ${response.status}`);
@@ -427,7 +454,7 @@ export async function preloadReposIfNecessary(givenUsername, givenLanguageCode,
/**
- * does http file fetch from server uses cacheStore to minimize repeated fetches of same file
+ * does http file fetch from server uses cachedFetchStore to minimize repeated fetches of same file
* @param {string} username
* @param {string} repository
* @param {string} path
@@ -447,7 +474,7 @@ async function cachedFetchFileFromServerWithBranch({ username, repository, path,
/**
- * does http file fetch from server uses cacheStore to minimize repeated fetches of same file
+ * does http file fetch from server uses cachedFetchStore to minimize repeated fetches of same file
* @param {string} username
* @param {string} repository
* @param {string} path
@@ -467,7 +494,7 @@ export async function cachedFetchFileFromServerWithTag({ username, repository, p
/**
- * does http file fetch from server uses cacheStore to minimize repeated fetches of same file
+ * does http file fetch from server uses cachedFetchStore to minimize repeated fetches of same file
* @param {string} username
* @param {string} repository
* @param {string} path
@@ -481,7 +508,7 @@ async function cachedFetchFileFromServerWorker(uri, username, repository, path,
// if it needs to be checked, should be checked before this point
// const repositoryExistsOnDoor43 = await repositoryExistsOnDoor43({ username, repository });
// let uri;
- const failMessage = await failedStore.getItem(uri.toLowerCase());
+ const failMessage = await failedFetchStore.getItem(uri.toLowerCase());
if (failMessage) {
// debugLog(` cachedFetchFileFromServerWorker failed previously for ${uri}: ${failMessage}`);
return null;
@@ -494,19 +521,19 @@ async function cachedFetchFileFromServerWorker(uri, username, repository, path,
}
catch (fffsError) {
console.error(`cachedFetchFileFromServerWorker could not fetch ${username} ${repository} ${branchOrTag} ${path}: ${fffsError}`)
- /* await */ failedStore.setItem(uri.toLowerCase(), fffsError.message);
+ /* await */ failedFetchStore.setItem(uri.toLowerCase(), fffsError.message);
return null;
}
// } else { // ! repositoryExistsOnDoor43
// console.error(`cachedFetchFileFromServerWorker repo ${username} '${repository}' does not exist!`);
- // /* await */ failedStore.setItem(uri.toLowerCase(), `Repo '${repository}' does not exist!`);
+ // /* await */ failedFetchStore.setItem(uri.toLowerCase(), `Repo '${repository}' does not exist!`);
// return null;
// }
};
/**
- * older getFile without that doesn’t use the unzipStore
+ * older getFile without that doesn’t use the unzippedFileStore
* @param {string} username
* @param {string} repository
* @param {string} path
@@ -600,7 +627,7 @@ export async function cachedGetFileUsingFullURL({ uri, params }) {
// debugLog(`cachedGetFileUsingFullURL got ${uri} from unzipped cache`);
return pictureContents;
}
- const zipBlob = await zipJsonStore.getItem(OBS_PICTURE_ZIP_FILENAME);
+ const zipBlob = await zippedJsonStore.getItem(OBS_PICTURE_ZIP_FILENAME);
// debugLog(` getZipFromStore(${OBS_PICTURE_ZIP_FILENAME} -- empty: ${!zipBlob}`);
try {
if (zipBlob) {
@@ -625,7 +652,7 @@ export async function cachedGetFileUsingFullURL({ uri, params }) {
// userLog(` cachedGetFile got ${filePath} from zipfile`);
if (pictureContents) {
// save unzipped file in cache to speed later retrieval
- await unzipStore.setItem(uri, pictureContents);
+ await unzippedFileStore.setItem(uri, pictureContents);
// userLog(`cachedGetFileUsingFullURL saved ${uri} to cache for next time`);
return pictureContents;
}
@@ -662,7 +689,7 @@ export async function cachedGetRepositoryZipFile({ username, repository, branchO
// https://git.door43.org/{username}/{repository}/archive/{branch}.zip
// functionLog(`cachedGetRepositoryZipFile(${username}, ${repository}, ${branchOrRelease}, ${forceLoad})…`);
- if (!forceLoad) { // see if we already have in zipJsonStore
+ if (!forceLoad) { // see if we already have in zippedJsonStore
const zipBlob = await getZipFromStore(username, repository, branchOrRelease);
if (zipBlob) {
// debugLog(`cachedGetRepositoryZipFile for ${username}, ${repository}, ${branchOrRelease} -- already loaded`);
@@ -677,7 +704,7 @@ export async function cachedGetRepositoryTreeFile({ username, repository, branch
// https://git.door43.org/{username}/{repository}/archive/{branch}.zip
// functionLog(`cachedGetRepositoryTreeFile(${username}, ${repository}, ${branchOrRelease}, ${forceLoad})…`);
- if (!forceLoad) { // see if we already have in zipJsonStore
+ if (!forceLoad) { // see if we already have in zippedJsonStore
const treeJSON = await getTreeFromStore(username, repository, branchOrRelease);
if (treeJSON) {
// debugLog(`cachedGetRepositoryTreeFile for ${username}, ${repository}, ${branchOrRelease} -- already loaded`);
@@ -703,7 +730,7 @@ async function downloadRepositoryZipFile({ username, repository, branchOrRelease
const response = await fetch(uri);
if (response.status === 200 || response.status === 0) {
const zipArrayBuffer = await response.arrayBuffer(); // blob storage not supported on mobile
- await zipJsonStore.setItem(uri.toLowerCase(), zipArrayBuffer);
+ await zippedJsonStore.setItem(uri.toLowerCase(), zipArrayBuffer);
// debugLog(` downloadRepositoryZipFile(${username}, ${repository}, ${branchOrRelease}) -- saved zip: ${uri}`);
return true;
} else {
@@ -753,7 +780,7 @@ async function downloadRepositoryTreeFile({ username, repository, branchOrReleas
// saves a lot of memory not storing the entire object of {path, mode, type, size, sha, url}
// const abbreviatedJSONTree = JSONTree.map(x => x.path);
// debugLog(` downloadRepositoryTreeFile saving ${repository} abbreviatedJSONTree[17]=${JSON.stringify(abbreviatedJSONTree[17])}`);
- await zipJsonStore.setItem(treeURI.toLowerCase(), JSONTree.map(x => x.path));
+ await zippedJsonStore.setItem(treeURI.toLowerCase(), JSONTree.map(x => x.path));
// debugLog(` downloadRepositoryTreeFile(${username}, ${repository}, ${branchOrRelease}) -- saved ${JSONTree.length.toLocaleString()} JSON entries from ${treeURI}`);
return true;
};
@@ -777,7 +804,7 @@ export async function getFileListFromZip({ username, repository, branchOrRelease
const response = await fetch(uri);
if (response.status === 200 || response.status === 0) {
const zipArrayBuffer = await response.arrayBuffer(); // blob storage not supported on mobile
- zipBlob = await zipJsonStore.setItem(uri.toLowerCase(), zipArrayBuffer);
+ zipBlob = await zippedJsonStore.setItem(uri.toLowerCase(), zipArrayBuffer);
} else {
console.error(`getFileListFromZip got response status: ${response.status}`);
return [];
@@ -828,7 +855,7 @@ async function getZipFromStore(username, repository, branchOrRelease) {
// functionLog(`getZipFromStore(${username}, ${repository}, ${branchOrRelease})…`);
const uri = zipUri({ username, repository, branchOrRelease });
// debugLog(` uri=${uri}`);
- const zipBlob = await zipJsonStore.getItem(uri.toLowerCase());
+ const zipBlob = await zippedJsonStore.getItem(uri.toLowerCase());
// debugLog(` getZipFromStore(${uri} -- empty: ${!zipBlob}`);
return zipBlob;
}
@@ -837,7 +864,7 @@ async function getTreeFromStore(username, repository, branchOrRelease) {
// functionLog(`getZipFromStore(${username}, ${repository}, ${branchOrRelease})…`);
const treeURI = treeUri({ username, repository, branchOrRelease });
// debugLog(` treeURI=${treeURI}`);
- const treeJSON = await zipJsonStore.getItem(treeURI.toLowerCase());
+ const treeJSON = await zippedJsonStore.getItem(treeURI.toLowerCase());
// debugLog(` getZipFromStore(${treeURI} -- empty: ${!treeJSON}`);
return treeJSON;
}
diff --git a/src/core/manifest-text-check.js b/src/core/manifest-text-check.js
index 7c8cd5a5..e44c0e8c 100644
--- a/src/core/manifest-text-check.js
+++ b/src/core/manifest-text-check.js
@@ -9,12 +9,13 @@ import { removeDisabledNotices } from './disabled-notices';
import { debugLog, functionLog, parameterAssert, logicAssert } from './utilities';
-const MANIFEST_VALIDATOR_VERSION_STRING = '0.5.0';
+const MANIFEST_VALIDATOR_VERSION_STRING = '1.0.0';
// Pasted in 2020-10-02 from https://raw.githubusercontent.com/unfoldingWord/dcs/master/options/schema/rc.schema.json
// Updated 2021-02-19
// Now March 2021 it’s moved to https://github.com/unfoldingWord/rc-schema/blob/master/rc.schema.json
// TODO: Load the latest one dynamically
+// RJH added FRT book 17Nov2021
const MANIFEST_SCHEMA = {
"$schema": "http://json-schema.org/draft-07/schema",
"$id": "https://resource-container.readthedocs.io/schema/rc.schema.json",
@@ -411,6 +412,7 @@ const MANIFEST_SCHEMA = {
"title": "Items",
"type": "string",
"enum": [
+ "bible-frt",
"bible-ot",
"bible-nt",
"ta"
@@ -452,6 +454,7 @@ const MANIFEST_SCHEMA = {
"projectIdentifier": {
"type": "string",
"enum": [
+ "frt",
"gen",
"exo",
"lev",
@@ -692,7 +695,7 @@ export async function checkManifestText(username, languageCode, repoCode, repoNa
if ((repoCode === 'UHB' && languageIdentifier !== 'hbo')
|| (repoCode === 'UGNT' && languageIdentifier !== 'el-x-koine')
|| (repoCode !== 'UHB' && repoCode !== 'UGNT' && languageIdentifier !== languageCode)) // for most repos
- addNotice({ priority: 933, message: "Manifest' language' 'identifier' doesn’t match", details: `expected '${languageCode}' but manifest has '${languageIdentifier}'`, location: ourLocation });
+ addNotice({ priority: 933, message: "Manifest' language' 'identifier' doesn’t match", details: `expected ‘${languageCode}’ but manifest has ‘${languageIdentifier}’`, location: ourLocation });
} catch (e) {
debugLog(`checkManifestText got error ${e.message} while loading 'language' 'identifier'`);
addNotice({ priority: 934, message: "'language' key or 'idenfier' subkey is missing", location: ourLocation });
diff --git a/src/core/markdown-text-check.js b/src/core/markdown-text-check.js
index 5e82557f..e106c3a8 100644
--- a/src/core/markdown-text-check.js
+++ b/src/core/markdown-text-check.js
@@ -8,7 +8,7 @@ import { removeDisabledNotices } from './disabled-notices';
import { parameterAssert, dataAssert, debugLog, functionLog } from './utilities';
-const MARKDOWN_TEXT_VALIDATOR_VERSION_STRING = '0.8.2';
+const MARKDOWN_TEXT_VALIDATOR_VERSION_STRING = '1.0.0';
/**
@@ -317,6 +317,15 @@ export async function checkMarkdownText(username, languageCode, repoCode, textOr
let numLeadingSpaces;
if (line) {
const thisHeaderLevel = line.match(/^#*/)[0].length;
+ if (thisHeaderLevel > 0)
+ if (line.length === thisHeaderLevel)
+ addNoticePartial({ priority: 780, message: "Markdown header has no text", lineNumber: n, characterIndex: 0, excerpt: line, location: ourLocation });
+ else // have more characters after the hashes
+ if (line[thisHeaderLevel] !== ' ') {
+ const excerpt = line.slice(0, excerptLength) + (line.length > excerptLength ? '…' : '');
+ addNoticePartial({ priority: 779, message: "Markdown header is missing the following space", lineNumber: n, characterIndex: 0, excerpt, location: ourLocation });
+ }
+
// if (thisHeaderLevel) debugLog(`checkMarkdownText: Got1 thisHeaderLevel=${thisHeaderLevel} after ${currentHeaderLevel} for line ${n}: ${line}`);
if (thisHeaderLevel > currentHeaderLevel + 1
&& !textOrFileName.startsWith('TA ')) { // Suppress this notice for translationAcademy subsections
diff --git a/src/core/notes-links-check.js b/src/core/notes-links-check.js
index 2bda6f3a..3a6437da 100644
--- a/src/core/notes-links-check.js
+++ b/src/core/notes-links-check.js
@@ -9,11 +9,13 @@ import { userLog, debugLog, functionLog, parameterAssert, logicAssert, dataAsser
import jQuery from 'jquery'; // For avoiding CORS checking
-// const NOTES_LINKS_VALIDATOR_VERSION_STRING = '1.0.0';
+// const NOTES_LINKS_VALIDATOR_VERSION_STRING = '1.0.3';
// const DEFAULT_LANGUAGE_CODE = 'en';
const DEFAULT_BRANCH = 'master';
+const MISSING_FOLDER_SLASH_LINK_REGEX = new RegExp('\\d]\\(\\.\\.\\d', 'g'); // [2:1](..02/01.md) missing a forward slash after the ..
+
const GENERAL_MARKDOWN_LINK1_REGEX = new RegExp('\\[[^\\]]+?\\]\\([^\\)]+?\\)', 'g'); // [displayLink](URL)
const GENERAL_MARKDOWN_LINK2_REGEX = new RegExp('\\[\\[[^\\]]+?\\]\\]', 'g'); // [[combinedDisplayLink]]
@@ -163,7 +165,7 @@ export async function checkNotesLinksToOutside(username, languageCode, repoCode,
//parameterAssert(typeof incompleteNoticeObject.location === 'string', `cTNlnk addNoticePartial: 'location' parameter should be a string not a '${typeof incompleteNoticeObject.location}': ${incompleteNoticeObject.location}`);
// incompleteNoticeObject.debugChain = incompleteNoticeObject.debugChain ? `checkNotesLinksToOutside ${ incompleteNoticeObject.debugChain } ` : `checkNotesLinksToOutside(${ fieldName })`;
if (bookID.length) incompleteNoticeObject.bookID = bookID; // Don't set the field if we don't have a useful bookID
- aboutToOverwrite('checkNotesLinksToOutside', ['filename'], incompleteNoticeObject, { fieldName });
+ aboutToOverwrite('checkNotesLinksToOutside', ['fieldName'], incompleteNoticeObject, { fieldName });
ctarResult.noticeList.push({ ...incompleteNoticeObject, fieldName });
}
@@ -229,6 +231,15 @@ export async function checkNotesLinksToOutside(username, languageCode, repoCode,
let regexMatchObject;
+ // Check for common bad links like [2:1](..02/01.md) which is missing a forward slash after the double dots
+ while ((regexMatchObject = MISSING_FOLDER_SLASH_LINK_REGEX.exec(fieldText))) {
+ // debugLog(`Got bad link ${JSON.stringify(regexMatchObject)}`);
+ // const [totalLink] = regexMatchObject;
+ const characterIndex = regexMatchObject.index + 4;
+ const excerpt = (characterIndex > excerptHalfLength ? '…' : '') + fieldText.substring(characterIndex - excerptHalfLength, characterIndex + excerptHalfLengthPlus) + (characterIndex + excerptHalfLengthPlus < fieldText.length ? '…' : '')
+ addNoticePartial({ priority: 753, message: "Link target is missing a forward slash", excerpt, location: ourLocation });
+ }
+
// Check for image links (including OBS pictures)
while ((regexMatchObject = SIMPLE_IMAGE_REGEX.exec(fieldText))) {
// debugLog(`Got markdown image in line ${lineNumber}:`, JSON.stringify(regexMatchObject));
@@ -357,12 +368,12 @@ export async function checkNotesLinksToOutside(username, languageCode, repoCode,
processedLinkList.push(totalLink); // Save the full link
if (foundLanguageCode !== '*') {
- const characterIndex = TA_FULL_DISPLAY_LINK_REGEX.lastIndex - totalLink.length + 7; // lastIndex points to the end of the field that was found
+ const characterIndex = regexMatchObject.index + 7;
const excerpt = (characterIndex > excerptHalfLength ? '…' : '') + fieldText.substring(characterIndex - excerptHalfLength, characterIndex + excerptHalfLengthPlus) + (characterIndex + excerptHalfLengthPlus < fieldText.length ? '…' : '')
- addNoticePartial({ priority: 450, message: "Resource container link should have '*' language code", details: `not '${foundLanguageCode}'`, characterIndex, excerpt, location: ourLocation });
+ addNoticePartial({ priority: 450, message: "Resource container link should have '*' language code", details: `not ‘${foundLanguageCode}’`, characterIndex, excerpt, location: ourLocation });
} else if (repoCode === 'TN') { // but not TN2
// At the moment, tC can’t handle these links with * so we have to ensure that they're not there
- const characterIndex = TA_FULL_DISPLAY_LINK_REGEX.lastIndex - totalLink.length + 7; // lastIndex points to the end of the field that was found
+ const characterIndex = regexMatchObject.index + 7;
const excerpt = (characterIndex > excerptHalfLength ? '…' : '') + fieldText.substring(characterIndex - excerptHalfLength, characterIndex + excerptHalfLengthPlus) + (characterIndex + excerptHalfLengthPlus < fieldText.length ? '…' : '')
addNoticePartial({ priority: 950, message: "tC cannot yet process '*' language code", characterIndex, excerpt, location: ourLocation });
}
@@ -570,12 +581,12 @@ export async function checkNotesLinksToOutside(username, languageCode, repoCode,
processedLinkList.push(totalLink); // Save the full link
if (foundLanguageCode !== '*') {
- const characterIndex = TA_DOUBLE_BRACKETED_LINK_REGEX.lastIndex - totalLink.length + 7; // lastIndex points to the end of the field that was found
+ const characterIndex = regexMatchObject.index + 7;
const excerpt = (characterIndex > excerptHalfLength ? '…' : '') + fieldText.substring(characterIndex - excerptHalfLength, characterIndex + excerptHalfLengthPlus) + (characterIndex + excerptHalfLengthPlus < fieldText.length ? '…' : '')
- addNoticePartial({ priority: 450, message: "Resource container link should have '*' language code", details: `not '${foundLanguageCode}'`, characterIndex, excerpt, location: ourLocation });
+ addNoticePartial({ priority: 450, message: "Resource container link should have '*' language code", details: `not ‘${foundLanguageCode}’`, characterIndex, excerpt, location: ourLocation });
} else if (repoCode === 'TN') { // but not TN2
// At the moment, tC can’t handle these links with * so we have to ensure that they're not there
- const characterIndex = TA_DOUBLE_BRACKETED_LINK_REGEX.lastIndex - totalLink.length + 7; // lastIndex points to the end of the field that was found
+ const characterIndex = regexMatchObject.index + 7;
const excerpt = (characterIndex > excerptHalfLength ? '…' : '') + fieldText.substring(characterIndex - excerptHalfLength, characterIndex + excerptHalfLengthPlus) + (characterIndex + excerptHalfLengthPlus < fieldText.length ? '…' : '')
addNoticePartial({ priority: 950, message: "tC cannot yet process '*' language code", characterIndex, excerpt, location: ourLocation });
}
@@ -724,7 +735,7 @@ export async function checkNotesLinksToOutside(username, languageCode, repoCode,
processedLinkList.push(totalLink); // Save the full link
if (Lg !== '*' && Lg !== languageCode)
- addNoticePartial({ priority: 669, message: "Unexpected language code in link", details: `resource language code is '${languageCode}'`, excerpt: Lg, location: ourLocation });
+ addNoticePartial({ priority: 669, message: "Unexpected language code in link", details: `resource language code is ‘${languageCode}’`, excerpt: Lg, location: ourLocation });
if (optionalN1) {
logicAssert(optionalB1, `Should have book name as well as number '${optionalN1}' in '${totalLink}'`);
@@ -792,7 +803,7 @@ export async function checkNotesLinksToOutside(username, languageCode, repoCode,
processedLinkList.push(totalLink); // Save the full link
if (Lg !== '*' && Lg !== languageCode)
- addNoticePartial({ priority: 669, message: "Unexpected language code in link", details: `resource language code is '${languageCode}'`, excerpt: Lg, location: ourLocation });
+ addNoticePartial({ priority: 669, message: "Unexpected language code in link", details: `resource language code is '${languageCode}’`, excerpt: Lg, location: ourLocation });
if (optionalN1) {
logicAssert(optionalB1, `Should have book name as well as number '${optionalN1}' in '${totalLink}'`);
@@ -819,7 +830,7 @@ export async function checkNotesLinksToOutside(username, languageCode, repoCode,
console.error(`TN Link CheckA couldn’t compare chapter numbers for ${bookID} ${givenC}:${givenV} ${fieldName} with ${C1} from '${fieldText}': ${ccError}`);
}
if (linkVerseInt !== 1)
- addNoticePartial({ priority: 729, message: "Expected verse one for whole chapter link", details: `not verse ${linkVerseInt}`, excerpt: totalLink, location: ourLocation });
+ addNoticePartial({ priority: 729, message: "Expected verse one for whole chapter link", details: `not verse ${linkVerseInt}`, excerpt: totalLink, location: ourLocation });
if (linkBookCode === 'obs') {
const numStories = 50;
diff --git a/src/core/notes-tsv7-row-check.js b/src/core/notes-tsv7-row-check.js
index ab9d3be6..d7c83294 100644
--- a/src/core/notes-tsv7-row-check.js
+++ b/src/core/notes-tsv7-row-check.js
@@ -318,7 +318,7 @@ export async function checkNotesTSV7DataRow(username, languageCode, repoCode, li
let numVersesThisChapter, haveGoodChapterNumber;
if (C.length) {
if (C !== givenC)
- addNoticePartial({ priority: 976, message: "Wrong chapter number", details: `expected '${givenC}'`, fieldName: 'Reference', rowID, excerpt: C, location: ourRowLocation });
+ addNoticePartial({ priority: 976, message: "Wrong chapter number", details: `expected ‘${givenC}’`, fieldName: 'Reference', rowID, excerpt: C, location: ourRowLocation });
if (C === 'front') { }
else if (/^\d+$/.test(C)) {
let intC = Number(C);
@@ -354,7 +354,7 @@ export async function checkNotesTSV7DataRow(username, languageCode, repoCode, li
if (V?.length) { // can be undefined if no colon at split above
if (V !== givenV)
- addNoticePartial({ priority: 975, message: "Wrong verse number", details: `expected '${givenV}'`, rowID, fieldName: 'Reference', excerpt: V, location: ourRowLocation });
+ addNoticePartial({ priority: 975, message: "Wrong verse number", details: `expected ‘${givenV}’`, rowID, fieldName: 'Reference', excerpt: V, location: ourRowLocation });
if (bookID === 'OBS' || V === 'intro') { }
else if (/^\d+$/.test(V)) {
let intV = Number(V);
@@ -449,7 +449,7 @@ export async function checkNotesTSV7DataRow(username, languageCode, repoCode, li
}
else // TODO: Find more details about when these fields are really compulsory (and when they're not, e.g., for 'intro') ???
if (repoCode === 'TN2' && V !== 'intro' && occurrence !== '0')
- addNoticePartial({ priority: 919, message: "Missing Quote field", details: `should Occurrence be zero instead of ${occurrence} with SR='${supportReference}'`, fieldName: 'Quote', rowID, location: ourRowLocation });
+ addNoticePartial({ priority: 919, message: "Missing Quote field", details: `should Occurrence be zero instead of ${occurrence} with SR=‘${supportReference}’`, fieldName: 'Quote', rowID, location: ourRowLocation });
if (occurrence.length) { // This should usually be a digit
if ((characterIndex = occurrence.indexOf('\\n')) !== -1) {
@@ -499,7 +499,7 @@ export async function checkNotesTSV7DataRow(username, languageCode, repoCode, li
if (adjustedLink === supportReference) foundSR = true;
}
if (linksList.length && V !== 'intro') {
- let details = supportReference ? `SR='${supportReference}'` : "empty SR field"
+ let details = supportReference ? `SR=‘${supportReference}’` : "empty SR field"
if (linksList.length > 1) details += `—found ${linksList.length} TA links`;
const excerpt = linksList.length > 1 ? JSON.stringify(linksList) : linksList[0];
if (foundSR) {
diff --git a/src/core/notes-tsv7-table-check.js b/src/core/notes-tsv7-table-check.js
index 8079fc79..2c40587f 100644
--- a/src/core/notes-tsv7-table-check.js
+++ b/src/core/notes-tsv7-table-check.js
@@ -6,7 +6,7 @@ import { checkNotesTSV7DataRow } from './notes-tsv7-row-check';
import { parameterAssert, aboutToOverwrite } from './utilities';
-const NOTES_TABLE_VALIDATOR_VERSION_STRING = '0.4.2';
+const NOTES_TABLE_VALIDATOR_VERSION_STRING = '1.0.0';
const NUM_EXPECTED_NOTES_TSV_FIELDS = 7; // so expects 6 tabs per line
const EXPECTED_NOTES_HEADING_LINE = 'Reference\tID\tTags\tSupportReference\tQuote\tOccurrence\tNote';
@@ -128,7 +128,7 @@ export async function checkNotesTSV7Table(username, languageCode, repoCode, book
if (lines[0] === EXPECTED_NOTES_HEADING_LINE)
addSuccessMessage(`Checked TSV header ${ourLocation}`);
else
- addNoticePartial({ priority: 988, message: "Bad TSV header", details: `expected '${EXPECTED_NOTES_HEADING_LINE}'`, excerpt: lines[0], lineNumber: 1, location: ourLocation });
+ addNoticePartial({ priority: 988, message: "Bad TSV header", details: `expected ‘${EXPECTED_NOTES_HEADING_LINE}’`, excerpt: lines[0], lineNumber: 1, location: ourLocation });
}
else // not the header
{
@@ -198,7 +198,7 @@ export async function checkNotesTSV7Table(username, languageCode, repoCode, book
if (/^\d+$/.test(lastC)) {
let lastintC = Number(lastC);
if (intC < lastintC)
- addNoticePartial({ priority: 736, C, V, message: "Receding chapter number", details: `'${C}' after '${lastC}'`, rowID, lineNumber: n + 1, location: ourLocation });
+ addNoticePartial({ priority: 736, C, V, message: "Receding chapter number", details: `'${C}' after '${lastC}’`, rowID, lineNumber: n + 1, location: ourLocation });
else if (intC > lastintC + 1)
addNoticePartial({ priority: 735, C, V, message: "Advancing chapter number", details: `'${C}' after '${lastC}'`.rowID, lineNumber: n + 1, location: ourLocation });
}
@@ -241,7 +241,7 @@ export async function checkNotesTSV7Table(username, languageCode, repoCode, book
}
}
else
- addNoticePartial({ priority: 738, C, V, message: "Bad verse number", rowID, lineNumber: n + 1, excerpt: reference, location: ourLocation });
+ addNoticePartial({ priority: 794, C, V, message: "Bad verse number", rowID, lineNumber: n + 1, excerpt: reference, location: ourLocation });
}
else
diff --git a/src/core/orig-quote-check.js b/src/core/orig-quote-check.js
index df0e8c72..c38a698e 100644
--- a/src/core/orig-quote-check.js
+++ b/src/core/orig-quote-check.js
@@ -3,12 +3,12 @@ import * as books from './books/books';
import { DEFAULT_EXCERPT_LENGTH, REPO_CODES_LIST } from './defaults';
// eslint-disable-next-line no-unused-vars
import { CLOSING_PUNCTUATION_CHARACTERS, HEBREW_CANTILLATION_REGEX, PAIRED_PUNCTUATION_OPENERS, PAIRED_PUNCTUATION_CLOSERS } from './text-handling-functions';
-import { cachedGetFile } from './getApi';
+import { cachedGetFile, cacheSegment, fetchSegmentIfCached } from './getApi';
// eslint-disable-next-line no-unused-vars
import { functionLog, debugLog, parameterAssert, logicAssert, dataAssert, ourParseInt, aboutToOverwrite } from './utilities';
-// const OL_QUOTE_VALIDATOR_VERSION_STRING = '0.10.10';
+// const OL_QUOTE_VALIDATOR_VERSION_STRING = '1.0.0';
/**
@@ -111,11 +111,10 @@ export async function checkOriginalLanguageQuoteAndOccurrence(username, language
* @param {Object} checkingOptions
*/
async function getOriginalVerse(bookID, C, V, checkingOptions) {
- // TODO: Cache these ???
-
// functionLog(`checkOriginalLanguageQuoteAndOccurrence getOriginalVerse(${bookID}, ${C}:${V})…`);
//parameterAssert(V.indexOf('-') === -1 && V.indexOf('–') === -1, `checkOriginalLanguageQuoteAndOccurrence getOriginalVerse: Did not expect hyphen or dash in V parameter: '${V}'`);
+ // NOTE: We don't need to cache inside this function, because the results get cached in getOriginalPassage() below
let username;
try {
username = checkingOptions?.originalLanguageRepoUsername;
@@ -213,7 +212,7 @@ export async function checkOriginalLanguageQuoteAndOccurrence(username, language
verseText += (bookLine.startsWith('\\f ') ? '' : ' ') + bookLine;
}
}
- verseText = verseText.replace(/\\p/g, '').trim().replace(/ {2}/g, ' ')
+ verseText = verseText.replace(/\\p/g, '').trim().replace(/ {2}/g, ' ') // Eliminate double spaces
// debugLog(`Got verse text1: '${verseText}'`);
// Remove \w fields (just leaving the actual Bible text words)
@@ -243,7 +242,7 @@ export async function checkOriginalLanguageQuoteAndOccurrence(username, language
// debugLog(`Got verse text3: '${verseText}'`);
// Final clean-up (shouldn’t be necessary, but just in case)
- verseText = verseText.replace(/ {2}/g, ' ');
+ verseText = verseText.replace(/ {2}/g, ' '); // Eliminate double spaces
//parameterAssert(verseText.indexOf('\\w') === -1, `getOriginalVerse: Should be no \\w in ${bookID} ${C}:${V} '${verseText}'`);
//parameterAssert(verseText.indexOf('\\k') === -1, `getOriginalVerse: Should be no \\k in ${bookID} ${C}:${V} '${verseText}'`);
//parameterAssert(verseText.indexOf('x-') === -1, `getOriginalVerse: Should be no x- in ${bookID} ${C}:${V} '${verseText}'`);
@@ -265,27 +264,38 @@ export async function checkOriginalLanguageQuoteAndOccurrence(username, language
* @param {Object} checkingOptions
*/
async function getOriginalPassage(bookID, C, V, checkingOptions) {
- // TODO: Cache these ???
-
// functionLog(`checkOriginalLanguageQuoteAndOccurrence getOriginalPassage(${bookID}, ${C}:${V})…`);
- if (/^[0-9]{1,3}$/.test(V)) // Assume it's a single verse or frame-number
- return await getOriginalVerse(bookID, C, V, checkingOptions);
+ // TODO: Why not calculate and cache all of these at once
+ const uniqueCacheID = `${username}_${languageCode}_${repoCode}+${bookID}_${C}:${V}`;
+ const cachedPassage = await fetchSegmentIfCached(uniqueCacheID);
+ if (cachedPassage !== null) return cachedPassage;
+
+ let versePassage;
+ if (/^[0-9]{1,3}$/.test(V)) {// Assume it's a single verse or frame-number
+ versePassage = await getOriginalVerse(bookID, C, V, checkingOptions);
+ cacheSegment(versePassage, uniqueCacheID); // Don't bother (a)waiting
+ return versePassage;
+ }
V = V.replace('–', '-'); // Make sure than en-dash becomes a hyphen
const vBits = V.split('-');
- if (vBits.length !== 2)
- return await getOriginalVerse(bookID, C, V, checkingOptions);
+ if (vBits.length !== 2) {
+ versePassage = await getOriginalVerse(bookID, C, V, checkingOptions);
+ cacheSegment(versePassage, uniqueCacheID); // Don't bother (a)waiting
+ return versePassage;
+ }
let vStartInt, vEndInt;
try { vStartInt = parseInt(vBits[0]); vEndInt = parseInt(vBits[1]); }
catch (e) { console.log(`checkOriginalLanguageQuoteAndOccurrence: getOriginalVerse failed on '${V}' with ${e}`); return; }
if (vStartInt >= vEndInt) { console.log(`checkOriginalLanguageQuoteAndOccurrence: getOriginalVerse failed on '${V}'`); return; }
- let versePassage = '';
+ versePassage = '';
for (let vInt = vStartInt; vInt <= vEndInt; vInt++) {
versePassage += (versePassage.length ? ' ' : '') + await getOriginalVerse(bookID, C, vInt.toString(), checkingOptions);
}
+ cacheSegment(versePassage, uniqueCacheID); // Don't bother (a)waiting
return versePassage;
}
// end of getOriginalPassage function
@@ -584,7 +594,7 @@ export async function checkOriginalLanguageQuoteAndOccurrence(username, language
const match = HEBREW_CANTILLATION_REGEX.exec(fieldText);
if (match) { // it’s null if no matches
debugLog(`checkOriginalLanguageQuoteAndOccurrence: got cantillation match: ${typeof match} ${match.length} '${JSON.stringify(match)}'`);
- addNoticePartial({ priority: 904, message: "Unexpected Hebrew cantillation mark in original language field", details: `found ${match.length} '${match}'`, C, V, excerpt: fieldText, location: ourLocation });
+ addNoticePartial({ priority: 904, message: "Unexpected Hebrew cantillation mark in original language field", details: `found ${match.length} '${match}’`, C, V, excerpt: fieldText, location: ourLocation });
}
*/
@@ -611,14 +621,14 @@ export async function checkOriginalLanguageQuoteAndOccurrence(username, language
if (fieldText.length > 1 && (opener_index = PAIRED_PUNCTUATION_OPENERS.indexOf(fieldText[0])) !== -1
&& fieldText.indexOf(expected_closing_char = PAIRED_PUNCTUATION_CLOSERS[opener_index]) === -1) {
const excerpt = fieldText.length <= excerptLength ? fieldText : `${fieldText.slice(0, excerptHalfLength)}…${fieldText.substring(fieldText.length - excerptHalfLength)}`;
- addNoticePartial({ priority: 859, message: `Unexpected unclosed paired punctuation at beginning of quote`, details: `Found '${fieldText[0]}' at start, but no matching '${expected_closing_char}'`, characterIndex: 0, excerpt, location: ourLocation });
+ addNoticePartial({ priority: 859, message: `Unexpected unclosed paired punctuation at beginning of quote`, details: `Found '${fieldText[0]}' at start, but no matching '${expected_closing_char}’`, characterIndex: 0, excerpt, location: ourLocation });
}
let closer_index, expected_opening_char
if (fieldText.length > 1 && (closer_index = PAIRED_PUNCTUATION_CLOSERS.indexOf(fieldText.slice(-1))) !== -1
&& ((whichTestament !== 'new' && whichTestament !== 'both') || fieldText.slice(-1) !== '’') // Allow final apostrophe for UGNT and OBS
&& fieldText.indexOf(expected_opening_char = PAIRED_PUNCTUATION_OPENERS[closer_index]) === -1) {
const excerpt = fieldText.length <= excerptLength ? fieldText : `${fieldText.slice(0, excerptHalfLength)}…${fieldText.substring(fieldText.length - excerptHalfLength)}`;
- addNoticePartial({ priority: 858, message: `Unexpected unopened paired punctuation at end of quote`, details: `Found '${fieldText.slice(-1)}' at end, but no matching '${expected_opening_char}'`, characterIndex: fieldText.length - 1, excerpt, location: ourLocation });
+ addNoticePartial({ priority: 858, message: `Unexpected unopened paired punctuation at end of quote`, details: `Found '${fieldText.slice(-1)}' at end, but no matching '${expected_opening_char}’`, characterIndex: fieldText.length - 1, excerpt, location: ourLocation });
}
const noDashFieldText = fieldText.replace(/[—־]/g, ' '); // em-dash and then maqaf
diff --git a/src/core/plain-text-check.js b/src/core/plain-text-check.js
index c7c3ab34..d678dc57 100644
--- a/src/core/plain-text-check.js
+++ b/src/core/plain-text-check.js
@@ -4,10 +4,13 @@ import { OPEN_CLOSE_PUNCTUATION_PAIRS, PAIRED_PUNCTUATION_OPENERS, PAIRED_PUNCTU
import { checkTextField } from './field-text-check';
import { removeDisabledNotices } from './disabled-notices';
// eslint-disable-next-line no-unused-vars
-import { parameterAssert, debugLog } from './utilities';
+import { parameterAssert, debugLog, functionLog } from './utilities';
-const PLAIN_TEXT_VALIDATOR_VERSION_STRING = '0.5.1';
+const separatedDigitsRegex = new RegExp('\\d{1,3}, (\\d{1,3})', 'g'); // e.g., "5, 000"
+const tooManyDigitsRegex = new RegExp('[^HG]\\d{4,}', 'g'); // e.g., "5000" should have a separator but not H1234 or G12340
+
+const PLAIN_TEXT_VALIDATOR_VERSION_STRING = '1.0.2';
/**
@@ -30,7 +33,7 @@ export function checkPlainText(username, languageCode, repoCode, textType, textN
Returns a result object containing a successList and a noticeList
*/
- // functionLog(`checkPlainText(${textName}, (${plainText.length} chars), ${givenLocation}, ${JSON.stringify(checkingOptions)})…`);
+ // functionLog(`checkPlainText(${username}, ${languageCode}, ${repoCode}, ${textType}, ${textName}, (${plainText.length} chars), ${givenLocation}, ${JSON.stringify(checkingOptions)})…`);
//parameterAssert(languageCode !== undefined, "checkPlainText: 'languageCode' parameter should be defined");
//parameterAssert(typeof languageCode === 'string', `checkPlainText: 'languageCode' parameter should be a string not a '${typeof languageCode}': ${languageCode}`);
//parameterAssert(languageCode !== 'markdown' && languageCode !== 'USFM' && languageCode !== 'YAML' && languageCode !== 'text' && languageCode !== 'raw' && languageCode !== 'unfoldingWord', `checkPlainText: 'languageCode' ${languageCode} parameter should be not be '${languageCode}'`);
@@ -63,6 +66,8 @@ export function checkPlainText(username, languageCode, repoCode, textType, textN
const excerptHalfLengthPlus = Math.floor((excerptLength + 1) / 2); // rounded up
// debugLog(`Using excerptHalfLength=${excerptHalfLength}`, `excerptHalfLengthPlus=${excerptHalfLengthPlus}`);
+ const noCapitalSentenceRegex = new RegExp(`[.!?] [a-z]{1,${excerptLength}}`, 'g'); // e.g., "end. start"
+
const cutoffPriorityLevel = checkingOptions?.cutoffPriorityLevel ? checkingOptions?.cutoffPriorityLevel : 0;
const cptResult = { successList: [], noticeList: [] };
@@ -195,6 +200,7 @@ export function checkPlainText(username, languageCode, repoCode, textType, textN
addNotice({ priority: 201, message: "File contains both Arabic and other commas", location: ourLocation });
}
+ let regexMatchObject;
const lines = plainText.split('\n');
// debugLog(` '${location}' has ${lines.length.toLocaleString()} total lines`);
// checking nested markers (so that we can give the line number in the notice)
@@ -210,6 +216,21 @@ export function checkPlainText(username, languageCode, repoCode, textType, textN
if (textType === 'text' || textType === 'raw') // other file-types do these checks themselves
checkPlainLineContents(n, line, ourLocation);
+ // Search for separated digits, e.g, "5, 000" which can happen in aligned USFM
+ // NOTE: This could also pick up a list of 1, 2, and 3.
+ if (cutoffPriorityLevel < 198)
+ while ((regexMatchObject = separatedDigitsRegex.exec(line)))
+ if (regexMatchObject[1].startsWith('0'))
+ addNotice({ priority: 498, message: "Found separated digits", excerpt: regexMatchObject[0], lineNumber: n, location: ourLocation });
+ else
+ addNotice({ priority: 198, message: "Found possible separated digits", excerpt: regexMatchObject[0], lineNumber: n, location: ourLocation });
+
+ // Search for long numbers like "20000" which should probably be "20,000" in English text
+ // NOTE: Need to eliminate Strongs numbers, zip codes, ISBN numbers, copyright years, commit SHAs, etc.
+ if (cutoffPriorityLevel < 91 && !textName.endsWith('manifest') && !line.startsWith('\\id') && line.indexOf('strong="') === -1 && line.indexOf('Strong’s:') === -1 && line.indexOf('©') === -1 && line.indexOf('ISBN') === -1 && line.indexOf('USA.') === -1 && line.indexOf('/commit/') === -1 && line.indexOf('Version') === -1)
+ while ((regexMatchObject = tooManyDigitsRegex.exec(line)))
+ addNotice({ priority: 91, message: "Possible missing separator in digit string", excerpt: regexMatchObject[0], lineNumber: n, location: ourLocation });
+
// Check for nested brackets and quotes, etc.
if (cutoffPriorityLevel < 777)
for (let characterIndex = 0; characterIndex < line.length; characterIndex++) {
@@ -231,7 +252,7 @@ export function checkPlainText(username, languageCode, repoCode, textType, textN
} else // something is still open and this isn’t a match -- might just be consequential error
if (char !== '’' // Closing single quote is also used as apostrophe in English
&& (textType !== 'markdown' || char !== '>' || characterIndex > 4)) { // Markdown uses > or >> or > > or > > > for block indents so ignore these -- might just be consequential error
- const excerpt = (characterIndex > excerptHalfLength ? '…' : '') + line.substring(characterIndex - excerptHalfLength, characterIndex + excerptHalfLengthPlus).replace(/ /g, '␣') + (characterIndex + excerptHalfLengthPlus < line.length ? '…' : '')
+ const excerpt = (characterIndex > excerptHalfLength ? '…' : '') + line.substring(characterIndex - excerptHalfLength, characterIndex + excerptHalfLengthPlus) + (characterIndex + excerptHalfLengthPlus < line.length ? '…' : '')
const details = `'${lastEntry.char}' opened on line ${lastEntry.n.toLocaleString()} character ${lastEntry.x + 1}`;
addNotice({ priority: 777, message: `Bad punctuation nesting: ${char} closing character doesn’t match`, details, lineNumber: n, characterIndex, excerpt, location: ourLocation });
// debugLog(` ERROR 777: mismatched characters: ${details}`);
@@ -239,9 +260,9 @@ export function checkPlainText(username, languageCode, repoCode, textType, textN
} else // Closed something unexpectedly without an opener
if (char !== '’' // Closing single quote is also used as apostrophe in English
&& (textType !== 'markdown' || char !== '>')) { // Markdown uses > for block indents so ignore these
- const excerpt = (characterIndex > excerptHalfLength ? '…' : '') + line.substring(characterIndex - excerptHalfLength, characterIndex + excerptHalfLengthPlus).replace(/ /g, '␣') + (characterIndex + excerptHalfLengthPlus < line.length ? '…' : '')
+ const excerpt = (characterIndex > excerptHalfLength ? '…' : '') + line.substring(characterIndex - excerptHalfLength, characterIndex + excerptHalfLengthPlus) + (characterIndex + excerptHalfLengthPlus < line.length ? '…' : '')
addNotice({ priority: 774, message: `Unexpected ${char} closing character (no matching opener)`, lineNumber: n, characterIndex, excerpt, location: ourLocation });
- // debugLog(` ERROR 774: closed with nothing open: ${char}`);
+ // debugLog(` ERROR 774: closed with nothing open: ${char} from ${line}`);
}
}
@@ -256,7 +277,7 @@ export function checkPlainText(username, languageCode, repoCode, textType, textN
if (cutoffPriorityLevel < 768 && openMarkers.length) {
const [{ char, n, x }] = openMarkers.slice(-1);
const line = lines[n - 1];
- const excerpt = (x > excerptHalfLength ? '…' : '') + line.slice(x - excerptHalfLength, x + excerptHalfLengthPlus) + (x + excerptHalfLengthPlus < line.length ? '…' : '')
+ const excerpt = (x > excerptHalfLength ? '…' : '') + line.substring(x - excerptHalfLength, x + excerptHalfLengthPlus) + (x + excerptHalfLengthPlus < line.length ? '…' : '')
const details = openMarkers.length > 1 ? `${openMarkers.length} unclosed set${openMarkers.length === 1 ? '' : 's'}` : null;
addNotice({ priority: 768, message: `At end of text with unclosed ${char} opening character`, details, lineNumber: n, characterIndex: x, excerpt, location: ourLocation });
}
@@ -277,8 +298,20 @@ export function checkPlainText(username, languageCode, repoCode, textType, textN
addNotice({ priority: leftChar === '“' ? 162 : 462, message: `Mismatched ${leftChar}${rightChar} characters`, details: `left=${leftCount.toLocaleString()}, right=${rightCount.toLocaleString()}`, location: ourLocation });
}
+ if (cutoffPriorityLevel < 97)
+ while ((regexMatchObject = noCapitalSentenceRegex.exec(plainText)))
+ if ((textType !== 'YAML' || regexMatchObject[0] !== '. in') // e.g., Ph.D. in "Shape of Greek iota symbol in late 3rd century manuscripts"
+ && (textType !== 'markdown' || regexMatchObject[0] !== '. t' || plainText.slice(regexMatchObject.index + 3, regexMatchObject.index + 4) !== 'C') // Sentence starting with tC
+ ) {
+ const characterIndex = regexMatchObject.index;
+ const excerpt = (characterIndex > excerptHalfLength ? '…' : '') + plainText.substring(characterIndex - excerptHalfLength, characterIndex + excerptHalfLengthPlus) + (characterIndex + excerptHalfLengthPlus < plainText.length ? '…' : '')
+ // debugLog(`checkPlainText for ${textType} found no capital with '${regexMatchObject[0]}' at index ${characterIndex} giving excerpt='${excerpt}'`);
+ const details = `the ‘${plainText.slice(characterIndex + 2, characterIndex + 3)}’ after ${plainText.slice(characterIndex, characterIndex + 1)}`;
+ addNotice({ priority: ['en'].includes(languageCode) ? 197 : 97, message: "Sentence may not start with capital letter", details, excerpt, location: ourLocation });
+ }
+
if (!checkingOptions?.suppressNoticeDisablingFlag) {
- // functionLog(`checkPlainText: calling removeDisabledNotices(${cptResult.noticeList.length}) having ${JSON.stringify(checkingOptions)}`);
+ // debugLog(`checkPlainText: calling removeDisabledNotices(${cptResult.noticeList.length}) having ${JSON.stringify(checkingOptions)}`);
cptResult.noticeList = removeDisabledNotices(cptResult.noticeList);
}
diff --git a/src/core/questions-tsv7-row-check.js b/src/core/questions-tsv7-row-check.js
index 6619db75..db2d96ef 100644
--- a/src/core/questions-tsv7-row-check.js
+++ b/src/core/questions-tsv7-row-check.js
@@ -295,7 +295,7 @@ export async function checkQuestionsTSV7DataRow(username, languageCode, repoCode
let numVersesThisChapter, haveGoodChapterNumber;
if (C?.length) {
if (C !== givenC)
- addNoticePartial({ priority: 976, message: "Wrong chapter number", details: `expected '${givenC}'`, fieldName: 'Reference', rowID, excerpt: C, location: ourRowLocation });
+ addNoticePartial({ priority: 976, message: "Wrong chapter number", details: `expected ‘${givenC}’`, fieldName: 'Reference', rowID, excerpt: C, location: ourRowLocation });
if (C === 'front') { }
else if (/^\d+$/.test(C)) {
let intC = Number(C);
@@ -333,7 +333,7 @@ export async function checkQuestionsTSV7DataRow(username, languageCode, repoCode
if (V?.length) { // can be undefined if no colon at split above
if (V.indexOf('-') === -1) { // Not a verse bridge
if (V !== givenV)
- addNoticePartial({ priority: 975, message: "Wrong verse number", details: `expected '${givenV}'`, rowID, fieldName: 'Reference', excerpt: V, location: ourRowLocation });
+ addNoticePartial({ priority: 975, message: "Wrong verse number", details: `expected ‘${givenV}’`, rowID, fieldName: 'Reference', excerpt: V, location: ourRowLocation });
if (bookID === 'OBS' || V === 'intro') { }
else if (/^\d+$/.test(V)) {
let intV = Number(V);
@@ -356,7 +356,7 @@ export async function checkQuestionsTSV7DataRow(username, languageCode, repoCode
if (/^\d+$/.test(V1) && /^\d+$/.test(V2)) {
const intV1 = Number(V1), intV2 = Number(V2), intGivenV = Number(givenV);
if (intGivenV < intV1 || intGivenV > intV2)
- addNoticePartial({ priority: 975, message: "Wrong verse number", details: `expected '${givenV}' to be inside range`, rowID, fieldName: 'Reference', excerpt: V, location: ourRowLocation });
+ addNoticePartial({ priority: 975, message: "Wrong verse number", details: `expected ‘${givenV}' to be inside range`, rowID, fieldName: 'Reference', excerpt: V, location: ourRowLocation });
else if (intV1 >= intV2)
addNoticePartial({ priority: 808, message: "Bad verse range", details: "Second digits should be greater", rowID, fieldName: 'Reference', excerpt: V, location: ourRowLocation });
else if (intV1 === 0 && bookID !== 'PSA') // Psalms have \d as verse zero
@@ -467,7 +467,7 @@ export async function checkQuestionsTSV7DataRow(username, languageCode, repoCode
// // debugLog("Got TA Regex in Question", JSON.stringify(regexMatchObject));
// const adjustedLink = regexMatchObject[0].slice(2, regexMatchObject[0].length - 2)
// if (supportReference !== adjustedLink && V !== 'intro') {
- // const details = supportReference ? `(SR='${supportReference}')` : "(empty SR field)"
+ // const details = supportReference ? `(SR=‘${supportReference}’)` : "(empty SR field)"
// addNoticePartial({ priority: 786, message: "Should have a SupportReference when OccurrenceNote has a TA link", details, rowID, fieldName: 'Question', excerpt: adjustedLink, location: ourRowLocation });
// }
// }
@@ -497,7 +497,7 @@ export async function checkQuestionsTSV7DataRow(username, languageCode, repoCode
// // debugLog("Got TA Regex in Response", JSON.stringify(regexMatchObject));
// const adjustedLink = regexMatchObject[0].slice(2, regexMatchObject[0].length - 2)
// if (supportReference !== adjustedLink && V !== 'intro') {
- // const details = supportReference ? `(SR='${supportReference}')` : "(empty SR field)"
+ // const details = supportReference ? `(SR=‘${supportReference}’)` : "(empty SR field)"
// addNoticePartial({ priority: 786, message: "Should have a SupportReference when OccurrenceNote has a TA link", details, rowID, fieldName: 'Response', excerpt: adjustedLink, location: ourRowLocation });
// }
// }
diff --git a/src/core/questions-tsv7-table-check.js b/src/core/questions-tsv7-table-check.js
index 50f0f3ad..be60e84d 100644
--- a/src/core/questions-tsv7-table-check.js
+++ b/src/core/questions-tsv7-table-check.js
@@ -6,7 +6,7 @@ import { checkQuestionsTSV7DataRow } from './questions-tsv7-row-check';
import { parameterAssert, aboutToOverwrite } from './utilities';
-const QUESTIONS_TABLE_VALIDATOR_VERSION_STRING = '0.3.3';
+const QUESTIONS_TABLE_VALIDATOR_VERSION_STRING = '1.0.0';
const NUM_EXPECTED_QUESTIONS_TSV_FIELDS = 7; // so expects 6 tabs per line
const EXPECTED_QUESTIONS_HEADING_LINE = 'Reference\tID\tTags\tQuote\tOccurrence\tQuestion\tResponse';
@@ -127,7 +127,7 @@ export async function checkQuestionsTSV7Table(username, languageCode, repoCode,
if (lines[0] === EXPECTED_QUESTIONS_HEADING_LINE)
addSuccessMessage(`Checked TSV header ${ourLocation}`);
else
- addNoticePartial({ priority: 988, message: "Bad TSV header", details: `expected '${EXPECTED_QUESTIONS_HEADING_LINE}'`, excerpt: lines[0], lineNumber: 1, location: ourLocation });
+ addNoticePartial({ priority: 988, message: "Bad TSV header", details: `expected ‘${EXPECTED_QUESTIONS_HEADING_LINE}’`, excerpt: lines[0], lineNumber: 1, location: ourLocation });
}
else // not the header
{
@@ -197,7 +197,7 @@ export async function checkQuestionsTSV7Table(username, languageCode, repoCode,
if (/^\d+$/.test(lastC)) {
let lastintC = Number(lastC);
if (intC < lastintC)
- addNoticePartial({ priority: 736, C, V, message: "Receding chapter number", details: `'${C}' after '${lastC}'`, rowID, lineNumber: n + 1, location: ourLocation });
+ addNoticePartial({ priority: 736, C, V, message: "Receding chapter number", details: `'${C}' after '${lastC}’`, rowID, lineNumber: n + 1, location: ourLocation });
else if (intC > lastintC + 1)
addNoticePartial({ priority: 735, C, V, message: "Advancing chapter number", details: `'${C}' after '${lastC}'`.rowID, lineNumber: n + 1, location: ourLocation });
}
@@ -242,9 +242,9 @@ export async function checkQuestionsTSV7Table(username, languageCode, repoCode,
}
}
else if (/^[,\d]+$/.test(V)) { // all digits and comma, i.e., a verse list
- addNoticePartial({ priority: 238, C, V, message: "Can't handle verse list yet", rowID, lineNumber: n + 1, excerpt: reference, location: ourLocation });
+ addNoticePartial({ priority: 238, C, V, message: "Checker can’t handle verse list yet", rowID, lineNumber: n + 1, excerpt: reference, location: ourLocation });
} else
- addNoticePartial({ priority: 738, C, V, message: "Bad verse number", rowID, lineNumber: n + 1, excerpt: reference, location: ourLocation });
+ addNoticePartial({ priority: 794, C, V, message: "Bad verse number", rowID, lineNumber: n + 1, excerpt: reference, location: ourLocation });
}
else
diff --git a/src/core/tn-tsv9-row-check.js b/src/core/tn-tsv9-row-check.js
index 8926f426..bb475e18 100644
--- a/src/core/tn-tsv9-row-check.js
+++ b/src/core/tn-tsv9-row-check.js
@@ -318,7 +318,7 @@ export async function checkTN_TSV9DataRow(username, languageCode, repoCode, line
// Check the fields one-by-one
if (B.length) {
if (B !== bookID)
- addNoticePartial({ priority: 978, message: "Wrong book identifier", details: `expected '${bookID}'`, fieldName: 'Book', rowID, excerpt: B, location: ourRowLocation });
+ addNoticePartial({ priority: 978, message: "Wrong book identifier", details: `expected ‘${bookID}’`, fieldName: 'Book', rowID, excerpt: B, location: ourRowLocation });
}
else
addNoticePartial({ priority: 977, message: "Missing book identifier", characterIndex: 0, rowID, location: ourRowLocation });
@@ -326,7 +326,7 @@ export async function checkTN_TSV9DataRow(username, languageCode, repoCode, line
let numVersesThisChapter, haveGoodChapterNumber;
if (C.length) {
if (C !== givenC)
- addNoticePartial({ priority: 976, message: "Wrong chapter number", details: `expected '${givenC}'`, fieldName: 'Chapter', rowID, excerpt: C, location: ourRowLocation });
+ addNoticePartial({ priority: 976, message: "Wrong chapter number", details: `expected ‘${givenC}’`, fieldName: 'Chapter', rowID, excerpt: C, location: ourRowLocation });
if (C === 'front') { }
else if (/^\d+$/.test(C)) {
let intC = Number(C);
@@ -358,7 +358,7 @@ export async function checkTN_TSV9DataRow(username, languageCode, repoCode, line
if (V.length) {
if (V !== givenV)
- addNoticePartial({ priority: 975, message: "Wrong verse number", details: `expected '${givenV}'`, rowID, fieldName: 'Verse', excerpt: V, location: ourRowLocation });
+ addNoticePartial({ priority: 975, message: "Wrong verse number", details: `expected ‘${givenV}’`, rowID, fieldName: 'Verse', excerpt: V, location: ourRowLocation });
if (bookID === 'OBS' || V === 'intro') { }
else if (/^\d+$/.test(V)) {
let intV = Number(V);
@@ -439,7 +439,7 @@ export async function checkTN_TSV9DataRow(username, languageCode, repoCode, line
}
} else // TODO: Find more details about when these fields are really compulsory (and when they're not, e.g., for 'intro') ???
if (V !== 'intro' && occurrence !== '0') {
- addNoticePartial({ priority: 919, message: "Missing OrigQuote field", details: `should Occurrence be zero instead of ${occurrence} with SR='${supportReference}'`, fieldName: 'OrigQuote', rowID, location: ourRowLocation });
+ addNoticePartial({ priority: 919, message: "Missing OrigQuote field", details: `should Occurrence be zero instead of ${occurrence} with SR=‘${supportReference}’`, fieldName: 'OrigQuote', rowID, location: ourRowLocation });
}
if (occurrence.length) { // This should usually be a digit
@@ -500,7 +500,7 @@ export async function checkTN_TSV9DataRow(username, languageCode, repoCode, line
foundSR = true;
}
if (linksList.length && V !== 'intro') {
- let details = supportReference ? `SR='${supportReference}'` : "empty SR field"
+ let details = supportReference ? `SR=‘${supportReference}’` : "empty SR field"
if (linksList.length > 1) details += `—found ${linksList.length} TA links`;
const excerpt = linksList.length > 1 ? JSON.stringify(linksList) : linksList[0];
if (foundSR) {
diff --git a/src/core/tn-tsv9-table-check.js b/src/core/tn-tsv9-table-check.js
index 77233606..2c47c27e 100644
--- a/src/core/tn-tsv9-table-check.js
+++ b/src/core/tn-tsv9-table-check.js
@@ -6,7 +6,7 @@ import { checkTN_TSV9DataRow } from './tn-tsv9-row-check';
import { debugLog, parameterAssert, aboutToOverwrite } from './utilities';
-const TN_TABLE_TEXT_VALIDATOR_VERSION_STRING = '0.5.0';
+const TN_TABLE_TEXT_VALIDATOR_VERSION_STRING = '1.0.0';
const NUM_EXPECTED_TN_TSV_FIELDS = 9; // so expects 8 tabs per line
const EXPECTED_TN_HEADING_LINE = 'Book\tChapter\tVerse\tID\tSupportReference\tOrigQuote\tOccurrence\tGLQuote\tOccurrenceNote';
@@ -135,7 +135,7 @@ export async function internalCheckTN_TSV9Table(username, languageCode, repoCode
if (lines[0] === EXPECTED_TN_HEADING_LINE)
addSuccessMessage(`Checked TSV header ${ourLocation}`);
else
- addNoticePartial({ priority: 988, message: "Bad TSV header", details: `expected '${EXPECTED_TN_HEADING_LINE}'`, excerpt: lines[0], lineNumber: 1, location: ourLocation });
+ addNoticePartial({ priority: 988, message: "Bad TSV header", details: `expected ‘${EXPECTED_TN_HEADING_LINE}’`, excerpt: lines[0], lineNumber: 1, location: ourLocation });
}
else // not the header
{
@@ -208,7 +208,7 @@ export async function internalCheckTN_TSV9Table(username, languageCode, repoCode
if (/^\d+$/.test(lastC)) {
let lastintC = Number(lastC);
if (intC < lastintC)
- addNoticePartial({ priority: 736, C, V, message: "Receding chapter number", details: `'${C}' after '${lastC}'`, rowID, lineNumber: n + 1, location: ourLocation });
+ addNoticePartial({ priority: 736, C, V, message: "Receding chapter number", details: `'${C}' after '${lastC}’`, rowID, lineNumber: n + 1, location: ourLocation });
else if (intC > lastintC + 1)
addNoticePartial({ priority: 735, C, V, message: "Advancing chapter number", details: `'${C}' after '${lastC}'`.rowID, lineNumber: n + 1, location: ourLocation });
}
@@ -236,7 +236,7 @@ export async function internalCheckTN_TSV9Table(username, languageCode, repoCode
}
}
else
- addNoticePartial({ priority: 738, C, V, message: "Bad verse number", rowID, lineNumber: n + 1, location: ourLocation });
+ addNoticePartial({ priority: 794, C, V, message: "Bad verse number", rowID, lineNumber: n + 1, location: ourLocation });
}
else
diff --git a/src/core/twl-tsv6-row-check.js b/src/core/twl-tsv6-row-check.js
index efc09ddc..cbfdce27 100644
--- a/src/core/twl-tsv6-row-check.js
+++ b/src/core/twl-tsv6-row-check.js
@@ -280,7 +280,7 @@ export async function checkTWL_TSV6DataRow(username, languageCode, repoCode, lin
let numVersesThisChapter, haveGoodChapterNumber;
if (C.length) {
if (C !== givenC)
- addNoticePartial({ priority: 976, message: "Wrong chapter number", details: `expected '${givenC}'`, fieldName: 'Reference', rowID, excerpt: C, location: ourRowLocation });
+ addNoticePartial({ priority: 976, message: "Wrong chapter number", details: `expected ‘${givenC}’`, fieldName: 'Reference', rowID, excerpt: C, location: ourRowLocation });
if (C === 'front') { }
else if (/^\d+$/.test(C)) {
let intC = Number(C);
@@ -316,7 +316,7 @@ export async function checkTWL_TSV6DataRow(username, languageCode, repoCode, lin
if (V?.length) { // can be undefined if no colon at split above
if (V !== givenV)
- addNoticePartial({ priority: 975, message: "Wrong verse number", details: `expected '${givenV}'`, rowID, fieldName: 'Reference', excerpt: V, location: ourRowLocation });
+ addNoticePartial({ priority: 975, message: "Wrong verse number", details: `expected ‘${givenV}’`, rowID, fieldName: 'Reference', excerpt: V, location: ourRowLocation });
if (bookID === 'OBS' || V === 'intro') { }
else if (/^\d+$/.test(V)) {
let intV = Number(V);
@@ -364,7 +364,7 @@ export async function checkTWL_TSV6DataRow(username, languageCode, repoCode, lin
let tagsList = tags.split('; ');
for (const thisTag of tagsList) {
if (thisTag !== 'keyterm' && thisTag !== 'name')
- addNoticePartial({ priority: 740, message: "Unrecognized tag", details: `found '${thisTag}' but expected 'keyterm' or 'name'`, excerpt: tags, fieldName: 'Tags', rowID, location: ourRowLocation });
+ addNoticePartial({ priority: 740, message: "Unrecognized tag", details: `found '${thisTag}' but expected 'keyterm' or 'name’`, excerpt: tags, fieldName: 'Tags', rowID, location: ourRowLocation });
}
}
@@ -422,14 +422,14 @@ export async function checkTWL_TSV6DataRow(username, languageCode, repoCode, lin
else { // More than just whitespace
if (!TWLink.startsWith('rc://*/tw/dict/bible/')) {
const excerpt = (characterIndex > excerptHalfLength ? '…' : '') + TWLink.substring(characterIndex - excerptHalfLength, characterIndex + excerptHalfLengthPlus) + (characterIndex + excerptHalfLengthPlus < TWLink.length ? '…' : '')
- addNoticePartial({ priority: 798, message: "Field doesn’t contain expected TW link", details: `should start with 'rc://*/tw/dict/bible/'`, fieldName: 'TWLink', rowID, excerpt, location: ourRowLocation });
+ addNoticePartial({ priority: 798, message: "Field doesn’t contain expected TW link", details: `should start with ‘rc://*/tw/dict/bible/’`, fieldName: 'TWLink', rowID, excerpt, location: ourRowLocation });
} else { // it starts correctly
const bits = TWLink.slice('rc://*/tw/dict/bible/'.length).split('/'); // Get the last two bits of the link path
// debugLog(`checkTWL_TSV6DataRow checking ${bookID} ${rowID} TWLink='${TWLink}' got bits=${JSON.stringify(bits)}`);
if (bits[0] !== 'kt' && bits[0] !== 'names' && bits[0] !== 'other') {
characterIndex = 'rc://*/tw/dict/bible/'.length;
const excerpt = (characterIndex > excerptHalfLength ? '…' : '') + TWLink.substring(characterIndex - excerptHalfLength, characterIndex + excerptHalfLengthPlus) + (characterIndex + excerptHalfLengthPlus < TWLink.length ? '…' : '')
- addNoticePartial({ priority: 797, message: "Field doesn’t contain proper TW link", details: `should be 'kt', 'names', or 'other'`, fieldName: 'TWLink', rowID, characterIndex, excerpt, location: ourRowLocation });
+ addNoticePartial({ priority: 797, message: "Field doesn’t contain proper TW link", details: `should be ‘kt', ‘names', or ‘other’`, fieldName: 'TWLink', rowID, characterIndex, excerpt, location: ourRowLocation });
} else { // all good so far
// debugLog(`checkTWL_TSV6DataRow looking up ${bookID} ${rowID} TWLink='${TWLink}' got bits=${JSON.stringify(bits)}`);
await ourCheckNotesLinksToOutside(rowID, 'TWLink', TWLink, ourRowLocation, linkCheckingOptions);
diff --git a/src/core/twl-tsv6-table-check.js b/src/core/twl-tsv6-table-check.js
index 54538cd4..f6c6d8e3 100644
--- a/src/core/twl-tsv6-table-check.js
+++ b/src/core/twl-tsv6-table-check.js
@@ -6,7 +6,7 @@ import { checkTWL_TSV6DataRow } from './twl-tsv6-row-check';
import { parameterAssert, aboutToOverwrite } from './utilities';
-const TWL_TABLE_VALIDATOR_VERSION_STRING = '0.2.1';
+const TWL_TABLE_VALIDATOR_VERSION_STRING = '1.0.0';
const NUM_EXPECTED_TWL_TSV_FIELDS = 6; // so expects 5 tabs per line
const EXPECTED_TWL_HEADING_LINE = 'Reference\tID\tTags\tOrigWords\tOccurrence\tTWLink';
@@ -127,7 +127,7 @@ export async function internalCheckTWL_TSV6Table(username, languageCode, repoCod
if (lines[0] === EXPECTED_TWL_HEADING_LINE)
addSuccessMessage(`Checked TSV header ${ourLocation}`);
else
- addNoticePartial({ priority: 988, message: "Bad TSV header", details: `expected '${EXPECTED_TWL_HEADING_LINE}'`, excerpt: lines[0], lineNumber: 1, location: ourLocation });
+ addNoticePartial({ priority: 988, message: "Bad TSV header", details: `expected ‘${EXPECTED_TWL_HEADING_LINE}’`, excerpt: lines[0], lineNumber: 1, location: ourLocation });
}
else // not the header
{
@@ -197,7 +197,7 @@ export async function internalCheckTWL_TSV6Table(username, languageCode, repoCod
if (/^\d+$/.test(lastC)) {
let lastintC = Number(lastC);
if (intC < lastintC)
- addNoticePartial({ priority: 736, C, V, message: "Receding chapter number", details: `'${C}' after '${lastC}'`, rowID, lineNumber: n + 1, location: ourLocation });
+ addNoticePartial({ priority: 736, C, V, message: "Receding chapter number", details: `'${C}' after '${lastC}’`, rowID, lineNumber: n + 1, location: ourLocation });
else if (intC > lastintC + 1)
addNoticePartial({ priority: 735, C, V, message: "Advancing chapter number", details: `'${C}' after '${lastC}'`.rowID, lineNumber: n + 1, location: ourLocation });
}
@@ -240,7 +240,7 @@ export async function internalCheckTWL_TSV6Table(username, languageCode, repoCod
}
}
else
- addNoticePartial({ priority: 738, C, V, message: "Bad verse number", rowID, lineNumber: n + 1, excerpt: reference, location: ourLocation });
+ addNoticePartial({ priority: 794, C, V, message: "Bad verse number", rowID, lineNumber: n + 1, excerpt: reference, location: ourLocation });
}
else
diff --git a/src/core/usfm-helpers.js b/src/core/usfm-helpers.js
new file mode 100644
index 00000000..e59f7d45
--- /dev/null
+++ b/src/core/usfm-helpers.js
@@ -0,0 +1,80 @@
+// eslint-disable-next-line no-unused-vars
+import { CLOSING_PUNCTUATION_CHARACTERS, HEBREW_CANTILLATION_REGEX, PAIRED_PUNCTUATION_OPENERS, PAIRED_PUNCTUATION_CLOSERS } from './text-handling-functions';
+// eslint-disable-next-line no-unused-vars
+import { functionLog, debugLog, parameterAssert, logicAssert, dataAssert, ourParseInt, aboutToOverwrite } from './utilities';
+
+export function extractTextFromComplexUSFM(usfmText) {
+ // functionLog(`extractTextFromComplexUSFM(${usfmText.length} chars)…`)
+ // Do initial global replaces
+ usfmText = usfmText.replace(/\\zaln-e\\\*/g, ''); // Remove \zaln-e self-closed milestones
+ usfmText = usfmText.replace(/\\k-e\\\*/g, ''); // Remove \k-e self-closed milestones
+ // debugLog(` extractTextFromComplexUSFM: got verse text1: (${usfmText.length}) '${usfmText}'`);
+ usfmText = usfmText.replace(/\\zaln-s.+?\\\*/g, ''); // Remove \zaln-s self-closed milestones
+ usfmText = usfmText.replace(/\\k-s.+?\\\*/g, ''); // Remove \k-s self-closed milestones
+ // debugLog(` extractTextFromComplexUSFM: got verse text2: (${usfmText.length}) '${usfmText}'`);
+ usfmText = usfmText.replace(/\\w (.+?)\|.+?\\w\*/g, '$1'); // Replace word fields with just the word
+ // debugLog(` extractTextFromComplexUSFM: got verse text3a: (${usfmText.length}) '${usfmText}'`);
+ usfmText = usfmText.replace(/{|}/g, ''); // Replace (ST) "added" markers
+ // debugLog(` extractTextFromComplexUSFM: got verse text3b: (${usfmText.length}) '${usfmText}'`);
+
+ // Remove lines we don't want
+ const hadTrailingNewline = usfmText.slice(-1) === '\n';
+ const newLines = [];
+ for (let line of usfmText.split('\n')) {
+ if (!line.length) continue;
+ if (line.startsWith('\\id ')) continue;
+ if (line.startsWith('\\usfm ')) continue;
+ if (line.startsWith('\\ide ')) continue;
+ if (line.startsWith('\\h ')) continue;
+ if (line.startsWith('\\toc')) continue;
+ if (line === '\\ts\\*' || line === '\\ts\\* ') continue; // Handle known trailing spaces
+ if (line.startsWith('\\rem ')) continue;
+ // debugLog(` extractTextFromComplexUSFM got line text4a: (${line.length}) '${line}'`);
+ if (line.startsWith('\\c ')) line = `[C${line.slice(3)}]`;
+ if (line.startsWith('\\v ')) {
+ const rest = line.slice(3);
+ const restBits = rest.split(' ');
+ const vNum = restBits[0];
+ let more = rest.slice(vNum.length + 1);
+ if (more === undefined) more = '';
+ if (more.length && more[0] !== ' ') more = ` ${more}`;
+ line = `‹v${vNum}›${more}`;
+ }
+ // debugLog(` extractTextFromComplexUSFM got line text4z: (${line.length}) '${line}'`);
+ if (line.startsWith('\\p ') && line.trim() === '\\p') line = '\\p'; // Handle known trailing spaces
+ newLines.push(line);
+ }
+ usfmText = newLines.join(' ').replace(/\\p /g, '\n')
+ // debugLog(` extractTextFromComplexUSFM got verse text5: (${usfmText.length}) '${usfmText}'`);
+ if (hadTrailingNewline) usfmText += '\n';
+ // debugLog(` extractTextFromComplexUSFM got verse text5b: (${usfmText.length}) '${usfmText}'`);
+ logicAssert(hadTrailingNewline === (usfmText.slice(-1) === '\n'), `extractTextFromComplexUSFM hadTrailingNewline was ${hadTrailingNewline} now different!`);
+
+ usfmText = usfmText.replace(/ ‹v\d{1,3}›/g, ''); // Remove (now-adjusted) verse numbers inside the text so we get the flowing text
+
+ usfmText = usfmText.replace(/ {2,}/g, ' ') // Eliminate multiple spaces
+ // debugLog(` extractTextFromComplexUSFM got verse text6: (${usfmText.length}) '${usfmText}'`);
+
+
+ // Remove footnotes
+ // NOTE: If there's two footnotes and no closer on the first one, this replace will swallow intervening text
+ // but this isn't the place to worry about bad USFM in the original languages
+ // so the quote match will possibly fail as a consequential error
+ usfmText = usfmText.replace(/\\f (.+?)\\f\*/g, '');
+ // Remove alternative versifications
+ usfmText = usfmText.replace(/\\va (.+?)\\va\*/g, '');
+ // debugLog(`Got verse text3: '${usfmText}'`);
+
+ // Final clean-up (shouldn’t be necessary, but just in case)
+ usfmText = usfmText.replace(/ {2,}/g, ' '); // Eliminate multiple spaces
+ logicAssert(usfmText.indexOf(' ') === -1, `getOriginalVerse: Should be no double spaces left in '${usfmText}'`);
+ //logicAssert(usfmText.indexOf('\\w') === -1, `getOriginalVerse: Should be no \\w in ${bookID} ${C}:${V} '${usfmText}'`);
+ //logicAssert(usfmText.indexOf('\\k') === -1, `getOriginalVerse: Should be no \\k in ${bookID} ${C}:${V} '${usfmText}'`);
+ //logicAssert(usfmText.indexOf('x-') === -1, `getOriginalVerse: Should be no x- in ${bookID} ${C}:${V} '${usfmText}'`);
+ //logicAssert(usfmText.indexOf('\\f') === -1, `getOriginalVerse: Should be no \\f in ${bookID} ${C}:${V} '${usfmText}'`);
+ //logicAssert(usfmText.indexOf('\\x') === -1, `getOriginalVerse: Should be no \\x in ${bookID} ${C}:${V} '${usfmText}'`);
+
+ // debugLog(` extractTextFromComplexUSFM is returning (${usfmText.length}) '${usfmText}'`);
+ // debugLog(` extractTextFromComplexUSFM is returning (${usfmText.length}) characters`);
+ return usfmText;
+}
diff --git a/src/core/usfm-text-check.js b/src/core/usfm-text-check.js
index 7f7b9ed7..905d193e 100644
--- a/src/core/usfm-text-check.js
+++ b/src/core/usfm-text-check.js
@@ -2,22 +2,23 @@
import { DEFAULT_EXCERPT_LENGTH, REPO_CODES_LIST } from './defaults'
import { isWhitespace, countOccurrencesInString, ourDeleteAll, HEBREW_CANTILLATION_REGEX } from './text-handling-functions'
import * as books from './books/books';
-import { cachedGetFile } from './getApi';
+import { cachedGetFile, cacheSegment, fetchSegmentIfCached } from './getApi';
import { checkTextField } from './field-text-check';
import { checkTextfileContents } from './file-text-check';
import { checkStrongsField } from './strongs-field-check'; // and this may call checkLexiconFileContents()
import { runUsfmJsCheck } from './usfm-js-check';
import { runBCSGrammarCheck } from './BCS-usfm-grammar-check';
import { checkNotesLinksToOutside } from './notes-links-check';
+import { extractTextFromComplexUSFM } from './usfm-helpers';
// eslint-disable-next-line no-unused-vars
import { userLog, functionLog, debugLog, parameterAssert, logicAssert, dataAssert, ourParseInt, aboutToOverwrite } from './utilities';
import { removeDisabledNotices } from './disabled-notices';
-// const USFM_VALIDATOR_VERSION_STRING = '1.0.0';
+// const USFM_VALIDATOR_VERSION_STRING = '1.2.2';
-const VALID_LINE_START_CHARACTERS = `([“‘—`; // Last one is em-dash — '{' gets added later for STs
+const VALID_LINE_START_CHARACTERS = `([“‘—`; // Last one is em-dash — '{' gets added later for LTs and STs
// See http://ubsicap.github.io/usfm/master/index.html
// const COMPULSORY_MARKERS = ['id', 'ide']; // These are specifically checked for by the code near the start of mainUSFMCheck()
@@ -252,7 +253,7 @@ export async function checkUSFMText(username, languageCode, repoCode, bookID, fi
const lowercaseBookID = bookID.toLowerCase();
let validLineStartCharacters = VALID_LINE_START_CHARACTERS;
- if (repoCode === 'ST') validLineStartCharacters += '{';
+ if (repoCode === 'LT' || repoCode === 'ST') validLineStartCharacters += '{';
const usfmResultObject = { successList: [], noticeList: [] };
@@ -292,8 +293,9 @@ export async function checkUSFMText(username, languageCode, repoCode, bookID, fi
//parameterAssert(incompleteNoticeObject.message.indexOf("Mismatched {}") === -1 || incompleteNoticeObject.lineNumber === undefined, `checkUSFMText addNoticePartial: got bad notice: ${noticeObjectString}`);
//parameterAssert(noticeObjectString.indexOf('NONE') === -1 && noticeObjectString.indexOf('SPECIAL') === -1, `checkUSFMText addNoticePartial: 'NONE' & 'SPECIAL' shouldn’t make it thru to end user: ${noticeObjectString}`)
if (incompleteNoticeObject.debugChain) incompleteNoticeObject.debugChain = `checkUSFMText ${incompleteNoticeObject.debugChain}`;
- aboutToOverwrite('checkUSFMText', ['bookID', 'filename'], incompleteNoticeObject, { bookID, filename });
- usfmResultObject.noticeList.push({ ...incompleteNoticeObject, bookID, filename });
+ aboutToOverwrite('checkUSFMText', ['bookID'], incompleteNoticeObject, { bookID });
+ if (incompleteNoticeObject.filename === undefined) incompleteNoticeObject.filename = filename; // Don't want to override "text extracted from..." filenames
+ usfmResultObject.noticeList.push({ ...incompleteNoticeObject, bookID });
}
@@ -375,89 +377,89 @@ export async function checkUSFMText(username, languageCode, repoCode, bookID, fi
function hasText(verseObjects) {
let gotDeep = false;
for (const someObject of verseObjects) {
- // debugLog("someObject", JSON.stringify(someObject));
- if (someObject['type'] === 'text' && someObject['text'].length > MINIMUM_TEXT_WORDS)
+ // debugLog(`CVCheck someObject=${JSON.stringify(someObject)}``);
+ if (someObject['type'] === 'text' && someObject['text'].length >= MINIMUM_TEXT_WORDS)
return true;
- if (someObject['type'] === 'word' && someObject['text'].length > MINIMUM_WORD_LENGTH)
+ if (someObject['type'] === 'word' && someObject['text'].length >= MINIMUM_WORD_LENGTH)
return true;
if (someObject['type'] === 'milestone')
for (const someSubobject of someObject['children']) {
// debugLog("someSubobject", JSON.stringify(someSubobject));
- if (someSubobject['type'] === 'text' && someSubobject['text'].length > MINIMUM_TEXT_WORDS)
+ if (someSubobject['type'] === 'text' && someSubobject['text'].length >= MINIMUM_TEXT_WORDS)
return true;
- if (someSubobject['type'] === 'word' && someSubobject['text'].length > MINIMUM_WORD_LENGTH)
+ if (someSubobject['type'] === 'word' && someSubobject['text'].length >= MINIMUM_WORD_LENGTH)
return true;
if (someSubobject['type'] === 'milestone')
for (const someSub2object of someSubobject['children']) {
// debugLog("someSub2object", JSON.stringify(someSub2object));
- if (someSub2object['type'] === 'text' && someSub2object['text'].length > MINIMUM_TEXT_WORDS)
+ if (someSub2object['type'] === 'text' && someSub2object['text'].length >= MINIMUM_TEXT_WORDS)
return true;
- if (someSub2object['type'] === 'word' && someSub2object['text'].length > MINIMUM_WORD_LENGTH)
+ if (someSub2object['type'] === 'word' && someSub2object['text'].length >= MINIMUM_WORD_LENGTH)
return true;
if (someSub2object['type'] === 'milestone')
for (const someSub3object of someSub2object['children']) {
// debugLog("someSub3object", JSON.stringify(someSub3object));
- if (someSub3object['type'] === 'text' && someSub3object['text'].length > MINIMUM_TEXT_WORDS)
+ if (someSub3object['type'] === 'text' && someSub3object['text'].length >= MINIMUM_TEXT_WORDS)
return true;
- if (someSub3object['type'] === 'word' && someSub3object['text'].length > MINIMUM_WORD_LENGTH)
+ if (someSub3object['type'] === 'word' && someSub3object['text'].length >= MINIMUM_WORD_LENGTH)
return true;
if (someSub3object['type'] === 'milestone')
for (const someSub4object of someSub3object['children']) {
// debugLog("someSub4object", JSON.stringify(someSub4object));
- if (someSub4object['type'] === 'text' && someSub4object['text'].length > MINIMUM_TEXT_WORDS)
+ if (someSub4object['type'] === 'text' && someSub4object['text'].length >= MINIMUM_TEXT_WORDS)
return true;
- if (someSub4object['type'] === 'word' && someSub4object['text'].length > MINIMUM_WORD_LENGTH)
+ if (someSub4object['type'] === 'word' && someSub4object['text'].length >= MINIMUM_WORD_LENGTH)
return true;
if (someSub4object['type'] === 'milestone')
for (const someSub5object of someSub4object['children']) {
// debugLog("someSub5object", JSON.stringify(someSub5object));
- if (someSub5object['type'] === 'text' && someSub5object['text'].length > MINIMUM_TEXT_WORDS)
+ if (someSub5object['type'] === 'text' && someSub5object['text'].length >= MINIMUM_TEXT_WORDS)
return true;
- if (someSub5object['type'] === 'word' && someSub5object['text'].length > MINIMUM_WORD_LENGTH)
+ if (someSub5object['type'] === 'word' && someSub5object['text'].length >= MINIMUM_WORD_LENGTH)
return true;
if (someSub5object['type'] === 'milestone')
for (const someSub6object of someSub5object['children']) {
// debugLog("someSub6object", bookID, CVlocation, JSON.stringify(someSub6object));
- if (someSub6object['type'] === 'text' && someSub6object['text'].length > MINIMUM_TEXT_WORDS)
+ if (someSub6object['type'] === 'text' && someSub6object['text'].length >= MINIMUM_TEXT_WORDS)
return true;
- if (someSub6object['type'] === 'word' && someSub6object['text'].length > MINIMUM_WORD_LENGTH)
+ if (someSub6object['type'] === 'word' && someSub6object['text'].length >= MINIMUM_WORD_LENGTH)
return true;
if (someSub6object['type'] === 'milestone')
for (const someSub7object of someSub6object['children']) {
// debugLog("someSub7object", bookID, CVlocation, JSON.stringify(someSub7object));
- if (someSub7object['type'] === 'text' && someSub7object['text'].length > MINIMUM_TEXT_WORDS)
+ if (someSub7object['type'] === 'text' && someSub7object['text'].length >= MINIMUM_TEXT_WORDS)
return true;
- if (someSub7object['type'] === 'word' && someSub7object['text'].length > MINIMUM_WORD_LENGTH)
+ if (someSub7object['type'] === 'word' && someSub7object['text'].length >= MINIMUM_WORD_LENGTH)
return true;
if (someSub7object['type'] === 'milestone')
// UST Luke 15:3 has eight levels of nesting !!!
for (const someSub8object of someSub7object['children']) {
// debugLog("someSub8object", bookID, CVlocation, JSON.stringify(someSub8object));
- if (someSub8object['type'] === 'text' && someSub8object['text'].length > MINIMUM_TEXT_WORDS)
+ if (someSub8object['type'] === 'text' && someSub8object['text'].length >= MINIMUM_TEXT_WORDS)
return true;
- if (someSub8object['type'] === 'word' && someSub8object['text'].length > MINIMUM_WORD_LENGTH)
+ if (someSub8object['type'] === 'word' && someSub8object['text'].length >= MINIMUM_WORD_LENGTH)
return true;
if (someSub8object['type'] === 'milestone')
for (const someSub9object of someSub8object['children']) {
// debugLog("someSub9object", bookID, CVlocation, JSON.stringify(someSub9object));
- if (someSub9object['type'] === 'text' && someSub9object['text'].length > MINIMUM_TEXT_WORDS)
+ if (someSub9object['type'] === 'text' && someSub9object['text'].length >= MINIMUM_TEXT_WORDS)
return true;
- if (someSub9object['type'] === 'word' && someSub9object['text'].length > MINIMUM_WORD_LENGTH)
+ if (someSub9object['type'] === 'word' && someSub9object['text'].length >= MINIMUM_WORD_LENGTH)
return true;
if (someSub9object['type'] === 'milestone')
for (const someSub10object of someSub9object['children']) {
// debugLog("someSub10object", bookID, CVlocation, JSON.stringify(someSub10object));
- if (someSub10object['type'] === 'text' && someSub10object['text'].length > MINIMUM_TEXT_WORDS)
+ if (someSub10object['type'] === 'text' && someSub10object['text'].length >= MINIMUM_TEXT_WORDS)
return true;
- if (someSub10object['type'] === 'word' && someSub10object['text'].length > MINIMUM_WORD_LENGTH)
+ if (someSub10object['type'] === 'word' && someSub10object['text'].length >= MINIMUM_WORD_LENGTH)
return true;
if (someSub10object['type'] === 'milestone')
// UST Obadiah 1:8 has eleven levels of nesting !!!
for (const someSub11object of someSub10object['children']) {
// debugLog("someSub11object", bookID, CVlocation, JSON.stringify(someSub11object));
- if (someSub11object['type'] === 'text' && someSub11object['text'].length > MINIMUM_TEXT_WORDS)
+ if (someSub11object['type'] === 'text' && someSub11object['text'].length >= MINIMUM_TEXT_WORDS)
return true;
- if (someSub11object['type'] === 'word' && someSub11object['text'].length > MINIMUM_WORD_LENGTH)
+ if (someSub11object['type'] === 'word' && someSub11object['text'].length >= MINIMUM_WORD_LENGTH)
return true;
if (someSub11object['type'] === 'milestone')
gotDeep = true;
@@ -645,6 +647,11 @@ export async function checkUSFMText(username, languageCode, repoCode, bookID, fi
// process results line by line
for (const noticeEntry of resultObject.noticeList) {
logicAssert(Object.keys(noticeEntry).length >= 5, `USFM ourBasicFileChecks notice length=${Object.keys(noticeEntry).length}`);
+ if (filename.startsWith('text extracted from')) {
+ // The line number, etc. will be useless/misleading
+ delete noticeEntry.lineNumber;
+ delete noticeEntry.characterIndex;
+ }
addNoticePartial(noticeEntry);
}
}
@@ -680,7 +687,8 @@ export async function checkUSFMText(username, languageCode, repoCode, bookID, fi
}
- // Now do the general global checks (e.g., for general punctuation)
+ // Now do the general global checks (e.g., for general punctuation) -- this is the raw USFM code
+ // debugLog(`checkUSFMFileContents doing basic file checks on ${repoCode} (${fileText.length}) ${fileText}`);
ourBasicFileChecks(filename, fileText, fileLocation, checkingOptions);
for (const expectedMarker of EXPECTED_MARKERS_LIST)
@@ -699,6 +707,16 @@ export async function checkUSFMText(username, languageCode, repoCode, bookID, fi
for (const deprecatedMarker of DEPRECATED_MARKERS_LIST)
if (markerSet.has(deprecatedMarker))
addNoticePartial({ priority: 218, message: "Using deprecated USFM marker", excerpt: `\\${deprecatedMarker}`, location: fileLocation });
+
+ // Now check how the text looks overall
+ // but not worried about double spaces, etc, here -- more on word/punctuation stuff
+ let cleanishText = extractTextFromComplexUSFM(fileText);
+ // debugLog(`checkUSFMFileContents got ${repoCode} cleanishText (${cleanishText.length}) ${cleanishText}`);
+ if (!cleanishText.endsWith('\n')) cleanishText += '\n'; // Don't want duplicated "file ends without newline" warnings
+ // debugLog(`checkUSFMFileContents doing basic file checks on ${repoCode} (${fileText.length}) ${cleanishText}`);
+ // NOTE: This could conceivably get some notice double-ups, but it's a quite different text being checked than in the above call
+ // NOTE: The exact wording below much match RenderFileDetails() in RenderProcessedResults.js
+ ourBasicFileChecks(`text extracted from ${filename}`, cleanishText, fileLocation, checkingOptions);
}
// end of checkUSFMFileContents function
@@ -730,25 +748,25 @@ export async function checkUSFMText(username, languageCode, repoCode, bookID, fi
debugLog(`checkUSFMLineText 865: ${bookID} ${C}:${V} line ${lineNumber} got BAD character before shin/sin dot regexMatchObject: (${regexMatchObject.length}) ${JSON.stringify(regexMatchObject)}`);
const characterIndex = regexMatchObject.index;
const excerpt = (characterIndex > excerptHalfLength ? '…' : '') + rest.substring(characterIndex - excerptHalfLength, characterIndex + excerptHalfLengthPlus) + (characterIndex + excerptHalfLengthPlus < rest.length ? '…' : '')
- addNoticePartial({ priority: 865, message: "Unexpected Hebrew character before shin/sin dot", details: `found ${regexMatchObject.length} '${regexMatchObject}'`, lineNumber, C, V, characterIndex, excerpt, location: lineLocation });
+ addNoticePartial({ priority: 865, message: "Unexpected Hebrew character before shin/sin dot", details: `found ${regexMatchObject.length} ‘${regexMatchObject}’`, lineNumber, C, V, characterIndex, excerpt, location: lineLocation });
}
else if ((regexMatchObject = BAD_HEBREW_VOWEL_DAGESH_REGEX.exec(rest))) { // it’s null if no matches
// debugLog(`checkUSFMLineText 864: ${bookID} ${C}:${V} line ${lineNumber} got BAD dagesh after vowel character order regexMatchObject: (${regexMatchObject.length}) ${JSON.stringify(regexMatchObject)}`);
const characterIndex = regexMatchObject.index;
const excerpt = (characterIndex > excerptHalfLength ? '…' : '') + rest.substring(characterIndex - excerptHalfLength, characterIndex + excerptHalfLengthPlus) + (characterIndex + excerptHalfLengthPlus < rest.length ? '…' : '')
- addNoticePartial({ priority: 864, message: "Unexpected Hebrew dagesh after vowel", details: `found ${regexMatchObject.length} '${regexMatchObject}'`, lineNumber, C, V, characterIndex, excerpt, location: lineLocation });
+ addNoticePartial({ priority: 864, message: "Unexpected Hebrew dagesh after vowel", details: `found ${regexMatchObject.length} ‘${regexMatchObject}’`, lineNumber, C, V, characterIndex, excerpt, location: lineLocation });
}
else if ((regexMatchObject = BAD_HEBREW_DAGESH_MAPIQ_REGEX.exec(rest))) { // it’s null if no matches
debugLog(`checkUSFMLineText 863: ${bookID} ${C}:${V} line ${lineNumber} got BAD character before dagesh regexMatchObject: (${regexMatchObject.length}) ${JSON.stringify(regexMatchObject)}`);
const characterIndex = regexMatchObject.index;
const excerpt = (characterIndex > excerptHalfLength ? '…' : '') + rest.substring(characterIndex - excerptHalfLength, characterIndex + excerptHalfLengthPlus) + (characterIndex + excerptHalfLengthPlus < rest.length ? '…' : '')
- addNoticePartial({ priority: 863, message: "Unexpected Hebrew character before dagesh or mappiq", details: `found ${regexMatchObject.length} '${regexMatchObject}'`, lineNumber, C, V, characterIndex, excerpt, location: lineLocation });
+ addNoticePartial({ priority: 863, message: "Unexpected Hebrew character before dagesh or mappiq", details: `found ${regexMatchObject.length} ‘${regexMatchObject}’`, lineNumber, C, V, characterIndex, excerpt, location: lineLocation });
}
else if ((regexMatchObject = BAD_HEBREW_CANTILLATION_DAGESH_REGEX.exec(rest))) { // it’s null if no matches
debugLog(`checkUSFMLineText 862: ${bookID} ${C}:${V} line ${lineNumber} got BAD cantillation mark character before dagesh regexMatchObject: (${regexMatchObject.length}) ${JSON.stringify(regexMatchObject)}`);
const characterIndex = regexMatchObject.index;
const excerpt = (characterIndex > excerptHalfLength ? '…' : '') + rest.substring(characterIndex - excerptHalfLength, characterIndex + excerptHalfLengthPlus) + (characterIndex + excerptHalfLengthPlus < rest.length ? '…' : '')
- addNoticePartial({ priority: 862, message: "Unexpected Hebrew cantillation mark before dagesh", details: `found ${regexMatchObject.length} '${regexMatchObject}'`, lineNumber, C, V, characterIndex, excerpt, location: lineLocation });
+ addNoticePartial({ priority: 862, message: "Unexpected Hebrew cantillation mark before dagesh", details: `found ${regexMatchObject.length} ‘${regexMatchObject}’`, lineNumber, C, V, characterIndex, excerpt, location: lineLocation });
}
else if ((regexMatchObject = BAD_HEBREW_CANTILLATION_VOWEL_REGEX.exec(rest)) // it’s null if no matches
// These are the actual accents that occur before the hiriq vowel (5B4) -- others could conceivable occur also
@@ -761,7 +779,7 @@ export async function checkUSFMText(username, languageCode, repoCode, bookID, fi
debugLog(`checkUSFMLineText 861: ${bookID} ${C}:${V} line ${lineNumber} got BAD vowel after cantillation mark character order regexMatchObject: (${regexMatchObject.length}) ${JSON.stringify(regexMatchObject)}`);
const characterIndex = regexMatchObject.index;
const excerpt = (characterIndex > excerptHalfLength ? '…' : '') + rest.substring(characterIndex - excerptHalfLength, characterIndex + excerptHalfLengthPlus) + (characterIndex + excerptHalfLengthPlus < rest.length ? '…' : '')
- addNoticePartial({ priority: 861, message: "Unexpected Hebrew vowel after cantillation mark", details: `found ${regexMatchObject.length} '${regexMatchObject}'`, lineNumber, C, V, characterIndex, excerpt, location: lineLocation });
+ addNoticePartial({ priority: 861, message: "Unexpected Hebrew vowel after cantillation mark", details: `found ${regexMatchObject.length} ‘${regexMatchObject}’`, lineNumber, C, V, characterIndex, excerpt, location: lineLocation });
}
else if ((regexMatchObject = BAD_HEBREW_FINAL_CONSONANT_REGEX.exec(rest))) { // it’s null if no matches
// debugLog(`checkUSFMLineText 860 regexMatchObject: ${typeof regexMatchObject} (${regexMatchObject.length}) '${regexMatchObject}' ${JSON.stringify(regexMatchObject)}`);
@@ -771,7 +789,7 @@ export async function checkUSFMText(username, languageCode, repoCode, bookID, fi
const characterIndex = regexMatchObject.index;
const excerpt = (characterIndex > excerptHalfLength ? '…' : '') + rest.substring(characterIndex - excerptHalfLength, characterIndex + excerptHalfLengthPlus) + (characterIndex + excerptHalfLengthPlus < rest.length ? '…' : '')
if (excerpt.indexOf('ןׄ') === -1) // Allow this one exception for ְׄאַׄהֲׄרֹ֛ׄןׄ in Num 3:39
- addNoticePartial({ priority: 860, message: "Unexpected Hebrew final consonant not at word end", details: `found ${regexMatchObject.length} '${regexMatchObject}'`, lineNumber, C, V, characterIndex, excerpt, location: lineLocation });
+ addNoticePartial({ priority: 860, message: "Unexpected Hebrew final consonant not at word end", details: `found ${regexMatchObject.length} ‘${regexMatchObject}’`, lineNumber, C, V, characterIndex, excerpt, location: lineLocation });
}
}
@@ -944,12 +962,12 @@ export async function checkUSFMText(username, languageCode, repoCode, bookID, fi
if (adjustedRest) {
let characterIndex;
if ((characterIndex = adjustedRest.indexOf('"')) !== -1) {
- const excerpt = (characterIndex > excerptHalfLength ? '…' : '') + adjustedRest.substring(characterIndex - excerptHalfLength, characterIndex + excerptHalfLengthPlus).replace(/ /g, '␣') + (characterIndex + excerptHalfLengthPlus < adjustedRest.length ? '…' : '')
+ const excerpt = (characterIndex > excerptHalfLength ? '…' : '') + adjustedRest.substring(characterIndex - excerptHalfLength, characterIndex + excerptHalfLengthPlus) + (characterIndex + excerptHalfLengthPlus < adjustedRest.length ? '…' : '')
addNoticePartial({ priority: 776, message: 'Unexpected " straight quote character', details, lineNumber, C, V, excerpt, location: lineLocation });
// debugLog(`ERROR 776: in ${marker} '${adjustedRest}' from '${rest}'`);
}
if ((characterIndex = adjustedRest.indexOf("'")) >= 0) {
- const excerpt = (characterIndex > excerptHalfLength ? '…' : '') + adjustedRest.substring(characterIndex - excerptHalfLength, characterIndex + excerptHalfLengthPlus).replace(/ /g, '␣') + (characterIndex + excerptHalfLengthPlus < adjustedRest.length ? '…' : '')
+ const excerpt = (characterIndex > excerptHalfLength ? '…' : '') + adjustedRest.substring(characterIndex - excerptHalfLength, characterIndex + excerptHalfLengthPlus) + (characterIndex + excerptHalfLengthPlus < adjustedRest.length ? '…' : '')
addNoticePartial({ priority: 775, message: "Unexpected ' straight quote character", details, lineNumber, C, V, excerpt, location: lineLocation });
// debugLog(`ERROR 775: in ${marker} '${adjustedRest}' from '${rest}'`);
}
@@ -1082,7 +1100,7 @@ export async function checkUSFMText(username, languageCode, repoCode, bookID, fi
const regexMatchObject = HEBREW_CANTILLATION_REGEX.exec(attributeValue);
if (regexMatchObject) { // it’s null if no matches
// debugLog(`Got cantillation regexMatchObject: (${regexMatchObject.length}) ${JSON.stringify(regexMatchObject)}`);
- addNoticePartial({ priority: 905, message: "Unexpected Hebrew cantillation mark in lemma field", details: `found ${regexMatchObject.length} '${regexMatchObject}'`, lineNumber, C, V, excerpt: attributeValue, location: lineLocation });
+ addNoticePartial({ priority: 905, message: "Unexpected Hebrew cantillation mark in lemma field", details: `found ${regexMatchObject.length} ‘${regexMatchObject}’`, lineNumber, C, V, excerpt: attributeValue, location: lineLocation });
}
} else if (attributeName === 'x-morph'
&& ((repoCode === 'UHB' && !attributeValue.startsWith('He,') && !attributeValue.startsWith('Ar,'))
@@ -1119,14 +1137,14 @@ export async function checkUSFMText(username, languageCode, repoCode, bookID, fi
* @param {Object} checkingOptions
*/
async function getOriginalWordLists(bookID, C, V, checkingOptions) {
- // TODO: Cache these ???
// functionLog(`getOriginalWordLists(${bookID}, ${C}:${V}, )…`);
- let username;
+ // TODO: Why not calculate and cache all of these at once
+ let originalLanguageRepoUsername;
try {
- username = checkingOptions?.originalLanguageRepoUsername;
+ originalLanguageRepoUsername = checkingOptions?.originalLanguageRepoUsername;
} catch (qcoError) { }
- if (!username) username = languageCode === 'en' ? 'unfoldingWord' : 'Door43-Catalog'; // ??? !!!
+ if (!originalLanguageRepoUsername) originalLanguageRepoUsername = languageCode === 'en' ? 'unfoldingWord' : 'Door43-Catalog'; // ??? !!!
let branch;
try {
branch = checkingOptions?.originalLanguageRepoBranch;
@@ -1134,7 +1152,11 @@ export async function checkUSFMText(username, languageCode, repoCode, bookID, fi
if (!branch) branch = 'master';
const getFile_ = (checkingOptions && checkingOptions?.getFile) ? checkingOptions?.getFile : cachedGetFile;
- const verseWordList = [], verseWordObjectList = [];
+ const uniqueCacheID = `${originalLanguageRepoUsername}_${languageCode}_${repoCode}_${branch}-${bookID}_${C}:${V}`;
+ const cachedWordLists = await fetchSegmentIfCached(uniqueCacheID);
+ if (cachedWordLists !== null) return cachedWordLists;
+
+ const originalLanguageVerseWordList = [], originalLanguageVerseWordObjectList = [];
const bookNumberAndName = books.usfmNumberName(bookID);
let whichTestament;
try {
@@ -1153,42 +1175,43 @@ export async function checkUSFMText(username, languageCode, repoCode, bookID, fi
// debugLog(`Need to check against ${originalLanguageRepoCode}`);
if (originalLanguageRepoCode === 'UHB') {
try {
- originalUSFM = await getFile_({ username, repository: originalLanguageRepoName, path: filename, branch });
+ originalUSFM = await getFile_({ username: originalLanguageRepoUsername, repository: originalLanguageRepoName, path: filename, branch });
// debugLog("Fetched fileContent for", repoName, filename, typeof originalUSFM, originalUSFM.length);
} catch (gcUHBerror) { // NOTE: The error can depend on whether the zipped repo is cached or not
- console.error(`getOriginalPassage(${bookID}, ${C}:${V}, ${JSON.stringify(checkingOptions)}) failed to load UHB`, username, originalLanguageRepoCode, filename, branch, gcUHBerror.message);
- addNoticePartial({ priority: 601, message: "Unable to load file", details: `error=${gcUHBerror}`, username, filename, location: ourLocation, extra: originalLanguageRepoName });
+ console.error(`getOriginalPassage(${bookID}, ${C}:${V}, ${JSON.stringify(checkingOptions)}) failed to load UHB`, originalLanguageRepoUsername, originalLanguageRepoCode, filename, branch, gcUHBerror.message);
+ addNoticePartial({ priority: 601, message: "Unable to load file", details: `error=${gcUHBerror}`, username: originalLanguageRepoUsername, filename, location: ourLocation, extra: originalLanguageRepoName });
}
} else if (originalLanguageRepoCode === 'UGNT') {
try {
- originalUSFM = await getFile_({ username, repository: originalLanguageRepoName, path: filename, branch });
+ originalUSFM = await getFile_({ username: originalLanguageRepoUsername, repository: originalLanguageRepoName, path: filename, branch });
// debugLog("Fetched fileContent for", repoName, filename, typeof originalUSFM, originalUSFM.length);
} catch (gcUGNTerror) { // NOTE: The error can depend on whether the zipped repo is cached or not
- console.error(`getOriginalPassage(${bookID}, ${C}:${V}, ${JSON.stringify(checkingOptions)}) failed to load UGNT`, username, originalLanguageRepoCode, filename, branch, gcUGNTerror.message);
- addNoticePartial({ priority: 601, message: "Unable to load file", details: `error=${gcUGNTerror}`, username, filename, location: ourLocation, extra: originalLanguageRepoName });
+ console.error(`getOriginalPassage(${bookID}, ${C}:${V}, ${JSON.stringify(checkingOptions)}) failed to load UGNT`, originalLanguageRepoUsername, originalLanguageRepoCode, filename, branch, gcUGNTerror.message);
+ addNoticePartial({ priority: 601, message: "Unable to load file", details: `error=${gcUGNTerror}`, username: originalLanguageRepoUsername, filename, location: ourLocation, extra: originalLanguageRepoName });
}
}
if (!originalUSFM) {
- debugLog(`Oops: getOriginalWordLists(${bookID}, ${C}:${V}, ) didn’t find a file!!!`);
- return null;
+ debugLog(`Oops: getOriginalWordLists(${bookID}, ${C}:${V}, ) didn’t find a file from ${originalLanguageRepoUsername} ${originalLanguageRepoName} ${filename} ${branch}!!!`);
+ const wordLists = { originalLanguageRepoCode, originalLanguageVerseWordList, originalLanguageVerseWordObjectList };
+ cacheSegment(wordLists, uniqueCacheID); // Don't bother (a)waiting
+ return wordLists;
}
-
- // Do global fixes
- // originalUSFM = originalUSFM.replace(/\\k-e\\\*/g, ''); // Remove \k-e self-closed milestones
- // originalUSFM = originalUSFM.replace(/\\k-s.+?\\\*/g, ''); // Remove \k-s self-closed milestones
-
+ // Ok, we now have the USFM for the entire book
const V1 = V.split('-')[0]; // Usually identical to V
let V2, intV2;
if (V1 !== V) {
V2 = V.split('-')[1];
intV2 = Number(V2);
// debugLog(`getOriginalWordLists got verse range ${V1} and ${V2} (${intV2})`)
+ // Since we have a verse bridge, save some extra pointers so we can separate the verses later
+ originalLanguageVerseWordList.push(`v=${V1}`);
+ originalLanguageVerseWordObjectList.push(`v=${V1}`);
}
// Now find the desired C:V
let foundChapter = false, foundVerse = false;
- let wLinesVerseText = '';
+ // let wLinesVerseText = '';
for (let bookLine of originalUSFM.split('\n')) {
// debugLog("bookLine", bookLine);
if (!foundChapter && bookLine === `\\c ${C}`) {
@@ -1205,28 +1228,34 @@ export async function checkUSFMText(username, languageCode, repoCode, bookID, fi
if (!V2) // no range requested
break; // Don’t go into the next verse or chapter
else { // there is a range requested
- const intV = Number(bookLine.slice(3));
+ const thisV = bookLine.slice(3);
+ const intV = Number(thisV);
// debugLog(`getOriginalWordLists got verse number ${intV} for range ${V1} and ${V2} (${intV2})`)
if (intV > intV2) break; // we're past the bit we want
+ // Since we have a verse bridge, save some extra pointers so we can separate the verses later
+ originalLanguageVerseWordList.push(`v=${thisV}`);
+ originalLanguageVerseWordObjectList.push(`v=${thisV}`);
}
- if (bookLine.indexOf('\\w ') !== -1 || bookLine.indexOf('\\+w ') !== -1)
- wLinesVerseText += bookLine;
+ if (bookLine.indexOf('\\w ') !== -1 || bookLine.indexOf('\\+w ') !== -1) {
+ // Get each \w field out
+ let regexMatchObject1;
+ while ((regexMatchObject1 = W_FIELDS_REGEX.exec(bookLine))) {
+ // debugLog(`Got ${repoCode} wFields Regex in ${bookID} ${C}:${V}: (${regexMatchObject1.length}) ${JSON.stringify(regexMatchObject1)}`);
+ // eslint-disable-next-line no-unused-vars
+ const [_totalLink, word, lemma, strongs, morph] = regexMatchObject1;
+ originalLanguageVerseWordList.push(word);
+ originalLanguageVerseWordObjectList.push({ lemma, strongs, morph });
+ }
+ // wLinesVerseText += bookLine;
+ }
}
}
// debugLog(`getOriginalWordLists: Got verse words: '${wLinesVerseText}'`);
- // Get each \w field out
- let regexMatchObject1;
- while ((regexMatchObject1 = W_FIELDS_REGEX.exec(wLinesVerseText))) {
- // debugLog(`Got ${repoCode} wFields Regex in ${bookID} ${C}:${V}: (${regexMatchObject1.length}) ${JSON.stringify(regexMatchObject1)}`);
- // eslint-disable-next-line no-unused-vars
- const [_totalLink, word, lemma, strongs, morph] = regexMatchObject1;
- verseWordList.push(word);
- verseWordObjectList.push({ lemma, strongs, morph });
- }
-
// debugLog(` getOriginalWordLists(${bookID} ${C}:${V}) is returning (${verseWordList.length}) ${verseWordList} (${verseWordObjectList.length}) ${JSON.stringify(verseWordObjectList)}`);
- return { originalLanguageRepoCode, verseWordList, verseWordObjectList };
+ const wordLists = { originalLanguageRepoCode, originalLanguageVerseWordList, originalLanguageVerseWordObjectList };
+ cacheSegment(wordLists, uniqueCacheID); // Don't bother (a)waiting
+ return wordLists;
}
// end of getOriginalWordLists function
@@ -1238,15 +1267,17 @@ export async function checkUSFMText(username, languageCode, repoCode, bookID, fi
*/
async function checkZALNAttributes(zalnContents) {
// functionLog(`checkWAttributes(${zalnContents})…`);
+ // zaln fields are custom USFM fields with word/phrase alignment information
+ // i.e., they occur in aligned translations (not in the UHB or UGNT)
// The parameter normally starts with a |
dataAssert(repoCode !== 'UHB' && repoCode !== 'UGNT', `checkZALNAttributes did not expect an original language repo: '${repoCode}'`);
let zalnSuggestion, regexMatchObject, attributeCounter = 0;
- const attributes = {};
+ const zalnAttributes = {};
while ((regexMatchObject = ATTRIBUTE_REGEX.exec(zalnContents))) {
attributeCounter += 1;
// debugLog(` Got attribute Regex in \\zaln-s: ${attributeCounter} '${JSON.stringify(regexMatchObject2)}`);
const attributeName = regexMatchObject[1], attributeValue = regexMatchObject[2];
- attributes[attributeName] = attributeValue;
+ zalnAttributes[attributeName] = attributeValue;
if (attributeCounter === 1) {
if (attributeName !== 'x-strong')
addNoticePartial({ priority: 830, message: "Unexpected first \\zaln-s attribute", details, lineNumber, C, V, excerpt: regexMatchObject[0], location: lineLocation });
@@ -1265,27 +1296,38 @@ export async function checkUSFMText(username, languageCode, repoCode, bookID, fi
} else if (attributeCounter === 6) {
if (attributeName !== 'x-content')
addNoticePartial({ priority: 825, message: "Unexpected sixth \\zaln-s attribute", details, lineNumber, C, V, excerpt: regexMatchObject[0], location: lineLocation });
- } else // #7 or more
+ } else if (attributeCounter === 7) {
+ if (attributeName !== 'x-ref') // For aligning of bridged verses
+ addNoticePartial({ priority: 819, message: "Unexpected seventh \\zaln-s attribute", details, lineNumber, C, V, excerpt: regexMatchObject[0], location: lineLocation });
+ } else // #8 or more
addNoticePartial({ priority: 833, message: "Unexpected extra \\zaln-s attribute", details, lineNumber, C, V, excerpt: regexMatchObject[0], location: lineLocation });
}
if (attributeCounter < 6)
- addNoticePartial({ priority: 834, message: "Seems too few translation \\zaln-s attributes", details: `expected six attributes but only found ${attributeCounter}`, lineNumber, C, V, excerpt: regexMatchObject1[0], location: lineLocation });
+ addNoticePartial({ priority: 834, message: "Seems too few translation \\zaln-s attributes", details: `expected 6-7 attributes but only found ${attributeCounter}`, lineNumber, C, V, excerpt: regexMatchObject1[0], location: lineLocation });
// debugLog(`checkZALNAttributes has ${bookID} ${C}:${V} attributes: ${JSON.stringify(attributes)}`);
// The Strongs, lemma and morph fields are copied from the original UHB/UGNT files
- // during alignment by tC
+ // into the translation USFM during alignment by tC
// so we need to check them as it’s possible for them to get out of sync
if (checkingOptions?.disableAllLinkFetchingFlag !== true) {
- const wordListResult = await getOriginalWordLists(bookID, C, V, checkingOptions);
- const { originalLanguageRepoCode, verseWordList, verseWordObjectList } = wordListResult;
- // debugLog(`checkZALNAttributes has '${originalLanguageRepoCode}' ${bookID} ${C}:${V} ${verseWordList} ${JSON.stringify(verseWordObjectList)}`);
+ const { originalLanguageRepoCode, originalLanguageVerseWordList, originalLanguageVerseWordObjectList } = await getOriginalWordLists(bookID, C, V, checkingOptions);
+ // if (V.indexOf('-') !== -1)
+ // debugLog(`checkZALNAttributes has '${originalLanguageRepoCode}' ${bookID} ${C}:${V} ${originalLanguageVerseWordList} ${JSON.stringify(originalLanguageVerseWordObjectList)}`);
- let oWord, oOccurrence, oOccurrences, oStrong, oLemma, oMorph;
+ let oWord, oOccurrence, oOccurrences, oStrong, oLemma, oMorph, oRef, oC, oV;
try { // Could fail here if any of those attributes were missing (already notified, so don’t worry here)
- oWord = attributes['x-content'];
- oOccurrence = attributes['x-occurrence']; oOccurrences = attributes['x-occurrences'];
- oStrong = attributes['x-strong']; oLemma = attributes['x-lemma']; oMorph = attributes['x-morph'];
- // debugLog(`checkZALNAttributes has ${bookID} ${C}:${V} '${oWord}' ${oOccurrence}/${oOccurrences} ${oStrong} '${oLemma}' ${oMorph}`);
+ oWord = zalnAttributes['x-content'];
+ oOccurrence = zalnAttributes['x-occurrence']; oOccurrences = zalnAttributes['x-occurrences'];
+ oStrong = zalnAttributes['x-strong']; oLemma = zalnAttributes['x-lemma']; oMorph = zalnAttributes['x-morph'];
+ oRef = zalnAttributes['x-ref']; // usually undefined
+ if (oRef) {
+ if (oRef.indexOf(':') === -1)
+ addNoticePartial({ priority: 807, message: "Aligned x-ref should contain C:V", lineNumber, C, V, excerpt: zalnContents, location: lineLocation });
+ [oC, oV] = oRef.split(':');
+ if (oC !== C) // This theoretically is not a problem -- just that we haven't written the code for it here yet!
+ addNoticePartial({ priority: 795, message: "Aligned x-ref expected to be in the same chapter", details: `found x-ref="${oRef}" but C=${C}`, lineNumber, C, V, excerpt: zalnContents, location: lineLocation });
+ }
+ // debugLog(`checkZALNAttributes has ${bookID} ${C}:${V} '${oWord}' ${oOccurrence}/${oOccurrences} ${oStrong} '${oLemma}' ${oMorph} ${oRef}`);
const oOccurrenceInt = parseInt(oOccurrence), oOccurrencesInt = parseInt(oOccurrences);
// debugLog(`checkZALNAttributes has ${bookID} ${C}:${V} ${oOccurrenceInt}/${oOccurrencesInt}`);
if (oOccurrenceInt > oOccurrencesInt)
@@ -1295,36 +1337,51 @@ export async function checkUSFMText(username, languageCode, repoCode, bookID, fi
if (oWordCount < oOccurrenceInt)
addNoticePartial({ priority: 802, message: "AAA Aligned x-occurrence for original word is too high", details: `only found ${oWordCount} occurrences of '${oWord}' instead of ${oOccurrence}`, lineNumber, C, V, excerpt: zalnContents, location: lineLocation });
*/
+
// Find the index of the correct occurrence of the word (index into the original language verse words list)
- let ix, gotCount = 0;
- for (ix = 0; ix < verseWordList.length; ix++) {
- if (verseWordList[ix] === oWord)
- if (++gotCount === oOccurrenceInt) break;
+ let originalLanguageWordIndex, gotCount = 0, wordTotalCount = 0;
+ let listV;
+ for (let ix = 0; ix < originalLanguageVerseWordList.length; ix++) {
+ const thisWord = originalLanguageVerseWordList[ix];
+ if (thisWord.startsWith('v='))
+ listV = thisWord.slice(2);
+ else if ((oV === undefined || listV === oV)
+ && thisWord === oWord) {
+ ++wordTotalCount;
+ if (originalLanguageWordIndex === undefined && ++gotCount === oOccurrenceInt)
+ originalLanguageWordIndex = ix;
+ }
}
+ // if (oV)
+ // debugLog(`checkZALNAttributes has ${bookID} oRef='${oRef}' oC=${oC} oV=${oV} oWord='${oWord}' oOccurrence=${oOccurrence} gotCount=${gotCount} originalLanguageWordIndex=${originalLanguageWordIndex} oOccurrences=${oOccurrences} wordTotalCount=${wordTotalCount}`);
+ // First, check that the given number of occurrences really are there
+ if (wordTotalCount !== oOccurrencesInt)
+ addNoticePartial({ priority: 602, message: "Aligned word occurrences in original text is wrong", details: V.indexOf('-') === -1 || oRef ? `found ${wordTotalCount} occurrences of '${oWord}' instead of ${oOccurrences} from ${originalLanguageVerseWordList.join(', ')}` : "THIS TEXT NEEDS RE-ALIGNING", lineNumber, C, V, excerpt: zalnContents, location: lineLocation });
+ // Now, check that the given occurrence is correct
if (gotCount !== oOccurrenceInt) // Can’t do checks below coz ix is invalid
if (gotCount === 0)
- addNoticePartial({ priority: 803, message: "Word can’t be found in original text", details: `found NO occurrences of '${oWord}' instead of ${oOccurrence} from ${verseWordList.join(', ')}`, lineNumber, C, V, excerpt: zalnContents, location: lineLocation });
+ addNoticePartial({ priority: 803, message: "Aligned word can’t be found in original text", details: `found NO occurrences of '${oWord}' instead of ${oOccurrence} from ${originalLanguageVerseWordList.join(', ')}`, lineNumber, C, V, excerpt: zalnContents, location: lineLocation });
else
- addNoticePartial({ priority: 802, message: "Aligned x-occurrence for original word is too high", details: `only found ${gotCount} occurrence${gotCount === 1 ? '' : 's'} of '${oWord}' instead of ${oOccurrence} from ${verseWordList.join(', ')}`, lineNumber, C, V, excerpt: zalnContents, location: lineLocation });
+ addNoticePartial({ priority: 802, message: "Aligned x-occurrence for original word is too high", details: `only found ${gotCount} occurrence${gotCount === 1 ? '' : 's'} of '${oWord}' instead of ${oOccurrence} from ${originalLanguageVerseWordList.join(', ')}`, lineNumber, C, V, excerpt: zalnContents, location: lineLocation });
else {
- const vwolStrongs = verseWordObjectList[ix]?.strongs;
+ const vwolStrongs = originalLanguageVerseWordObjectList[originalLanguageWordIndex]?.strongs;
if (vwolStrongs !== oStrong) {
- addNoticePartial({ priority: 805, message: "Aligned x-strong number doesn’t match original", details: `${originalLanguageRepoCode} had '${vwolStrongs}'`, lineNumber, C, V, excerpt: zalnContents, location: lineLocation });
+ addNoticePartial({ priority: 805, message: "Aligned x-strong number doesn’t match original", details: `${originalLanguageRepoCode} had ‘${vwolStrongs}’`, lineNumber, C, V, excerpt: zalnContents, location: lineLocation });
zalnSuggestion = zalnContents.replace(`"${oStrong}"`, `"${vwolStrongs}"`);
}
- const vwolLemma = verseWordObjectList[ix]?.lemma;
+ const vwolLemma = originalLanguageVerseWordObjectList[originalLanguageWordIndex]?.lemma;
if (vwolLemma !== oLemma) {
- addNoticePartial({ priority: 806, message: "Aligned x-lemma doesn’t match original", details: `${originalLanguageRepoCode} had '${vwolLemma}'`, lineNumber, C, V, excerpt: zalnContents, location: lineLocation });
+ addNoticePartial({ priority: 806, message: "Aligned x-lemma doesn’t match original", details: `${originalLanguageRepoCode} had ‘${vwolLemma}’`, lineNumber, C, V, excerpt: zalnContents, location: lineLocation });
zalnSuggestion = zalnContents.replace(`"${oLemma}"`, `"${vwolLemma}"`);
}
- const vwolMorph = verseWordObjectList[ix]?.morph;
+ const vwolMorph = originalLanguageVerseWordObjectList[originalLanguageWordIndex]?.morph;
if (vwolMorph !== oMorph) {
- addNoticePartial({ priority: 804, message: "Aligned x-morph doesn’t match original", details: `${originalLanguageRepoCode} had '${vwolMorph}'`, lineNumber, C, V, excerpt: zalnContents, location: lineLocation });
+ addNoticePartial({ priority: 804, message: "Aligned x-morph doesn’t match original", details: `${originalLanguageRepoCode} had ‘${vwolMorph}’`, lineNumber, C, V, excerpt: zalnContents, location: lineLocation });
zalnSuggestion = zalnContents.replace(`"${oMorph}"`, `"${vwolMorph}"`);
}
}
} catch (e) {
- debugLog(`checkZALNAttributes1: why couldn’t we get word attributes out of ${JSON.stringify(attributes)}: ${e.message}`);
+ debugLog(`checkZALNAttributes1: why couldn’t we get word attributes out of ${JSON.stringify(zalnAttributes)}: ${e.message}`);
}
}
return zalnSuggestion;
@@ -1497,7 +1554,7 @@ export async function checkUSFMText(username, languageCode, repoCode, bookID, fi
// eslint-disable-next-line no-unused-vars
let numChaptersThisBook = 0;
try {
- logicAssert(lowercaseBookID !== 'obs', "Shouldn’t happen in usfm-text-check2");
+ logicAssert(lowercaseBookID !== 'obs', "OBS shouldn't get as far as mainUSFMCheck");
numChaptersThisBook = books.chaptersInBook(bookID);
}
catch {
@@ -1526,13 +1583,13 @@ export async function checkUSFMText(username, languageCode, repoCode, bookID, fi
}
let lines = givenText.split('\n');
- // debugLog(` '${ourLocation}' has ${lines.length.toLocaleString()} total lines`);
+ // debugLog(` '${ourLocation}' has ${lines.length.toLocaleString()} total USFM lines`);
if (lines.length === 0 || !lines[0].startsWith('\\id ') || lines[0].length < 7 || !books.isValidBookID(lines[0].slice(4, 7)))
addNoticePartial({ priority: 994, message: "USFM file must start with a valid \\id line", lineNumber: 1, location: ourLocation });
const haveUSFM3Line = lines.length > 1 && lines[1] === '\\usfm 3.0';
const ideIndex = haveUSFM3Line ? 2 : 1;
- if (lines.length < ideIndex || !lines[ideIndex].startsWith('\\ide ') || lines[ideIndex].length < 7)
+ if (lines.length <= ideIndex || !lines[ideIndex].startsWith('\\ide ') || lines[ideIndex].length < 7)
addNoticePartial({ priority: 719, message: "USFM file is recommended to have \\ide line", lineNumber: ideIndex + 1, location: ourLocation });
else if (!lines[ideIndex].endsWith(' UTF-8'))
addNoticePartial({ priority: 619, message: "USFM \\ide field is recommended to be set to 'UTF-8'", lineNumber: ideIndex + 1, characterIndex: 5, excerpt: lines[ideIndex], location: ourLocation });
@@ -1648,25 +1705,25 @@ export async function checkUSFMText(username, languageCode, repoCode, bookID, fi
if (marker === 'id' && !rest.startsWith(bookID)) {
const thisLength = Math.max(4, excerptLength);
const excerpt = `${rest.slice(0, thisLength)}${rest.length > thisLength ? '…' : ''}`;
- addNoticePartial({ priority: 987, C, V, message: "Expected \\id line to start with book identifier", lineNumber: n, characterIndex: 4, excerpt, location: ourLocation });
+ addNoticePartial({ priority: 987, C, V, message: "Expected USFM \\id line to start with book identifier", details: `expected bookID='${bookID}'`, lineNumber: n, characterIndex: 4, excerpt, location: ourLocation });
}
// Check the order of markers
// In headers
if (marker === 'toc2' && lastMarker !== 'toc1')
- addNoticePartial({ priority: 87, C, V, message: "Expected \\toc2 line to follow \\toc1", lineNumber: n, characterIndex: 1, details: `not '\\${lastMarker}'`, location: ourLocation });
+ addNoticePartial({ priority: 87, C, V, message: "Expected USFM \\toc2 line to follow \\toc1", lineNumber: n, characterIndex: 1, details: `not '\\${lastMarker}’`, location: ourLocation });
else if (marker === 'toc3' && lastMarker !== 'toc2')
- addNoticePartial({ priority: 87, C, V, message: "Expected \\toc3 line to follow \\toc2", lineNumber: n, characterIndex: 1, details: `not '\\${lastMarker}'`, location: ourLocation });
+ addNoticePartial({ priority: 87, C, V, message: "Expected USFM \\toc3 line to follow \\toc2", lineNumber: n, characterIndex: 1, details: `not '\\${lastMarker}’`, location: ourLocation });
// In chapters
else if ((PARAGRAPH_MARKERS_LIST.includes(marker) || marker === 's5' || marker === 'ts\\*')
&& PARAGRAPH_MARKERS_LIST.includes(lastMarker)
&& !lastRest)
- addNoticePartial({ priority: 399, C, V, message: "Useless paragraph marker", lineNumber: n, characterIndex: 1, details: `'\\${lastMarker}' before '\\${marker}'`, location: ourLocation });
+ addNoticePartial({ priority: 399, C, V, message: "Useless USFM paragraph marker", lineNumber: n, characterIndex: 1, details: `'\\${lastMarker}' before '\\${marker}’`, location: ourLocation });
else if (['c', 'ca', 'cl'].includes(lastMarker) && marker === 'v'
&& (rest === '1' || rest.startsWith('1 ')))
- addNoticePartial({ priority: C === '1' ? 657 : 457, C, V, message: "Paragraph marker expected before first verse", lineNumber: n, characterIndex: 1, details: `'\\${marker}' after '\\${lastMarker}'`, location: ourLocation });
+ addNoticePartial({ priority: C === '1' ? 657 : 457, C, V, message: "Paragraph marker expected before first verse", lineNumber: n, characterIndex: 1, details: `'\\${marker}' after '\\${lastMarker}’`, location: ourLocation });
else if (TEXT_MARKERS_WITHOUT_CONTENT_LIST.includes(lastMarker) && ['w', 'v', 'zaln-s', 'k-s'].includes(marker))
- addNoticePartial({ priority: 899, C, V, message: "Have USFM text not in a paragraph", lineNumber: n, characterIndex: 1, details: `'\\${lastMarker}' before '\\${marker}'`, location: ourLocation });
+ addNoticePartial({ priority: 899, C, V, message: "Have USFM text not in a paragraph", lineNumber: n, characterIndex: 1, details: `'\\${lastMarker}' before '\\${marker}’`, location: ourLocation });
// Do general checks
await checkUSFMLineContents(n, C, V, marker, rest, ourLocation, checkingOptions);
diff --git a/src/demos/RenderProcessedResults.js b/src/demos/RenderProcessedResults.js
index c57642fa..16ea2671 100644
--- a/src/demos/RenderProcessedResults.js
+++ b/src/demos/RenderProcessedResults.js
@@ -42,7 +42,7 @@ const tableIcons = {
};
-// const RENDER_PROCESSED_RESULTS_VERSION = '1.0.0';
+// const RENDER_PROCESSED_RESULTS_VERSION = '1.0.2';
/**
@@ -346,9 +346,12 @@ function RenderBCV({ bookID, C, V }) {
* @return {String} - rendered HTML for the given reference
*/
function RenderFileDetails({ givenEntry }) {
- // These are all optional parameters - they may be undefined or blank if irrelevant
+ // The fields are all optional parameters - they may be undefined or blank if irrelevant
+ //
+ // TODO: I'm sure this function can be rewritten and greatly simplified (but barely worth it???) -- maybe write some test cases first
+ //
// functionLog(`RenderFileDetails(${JSON.stringify(givenEntry)})`);
- // debugLog(`RenderFileDetails(${username}, ${repoName}, ${branch}, ${filename}, ${lineNumber}, ${rowID}, ${fieldName})`);
+ // debugLog(`RenderFileDetails(${JSON.stringify(givenEntry)})`);
if (!givenEntry.repoName && !givenEntry.filename && !givenEntry.lineNumber && !givenEntry.rowID && !givenEntry.fieldName)
return null; // They're all undefined or blank!
@@ -370,23 +373,29 @@ function RenderFileDetails({ givenEntry }) {
let resultStart = '', lineResult = '', resultEnd = '', fileLineLink = '', fileLink = '';
if (adjustedRepoName?.length) resultStart += ` in ${adjustedRepoName} repository`;
if (givenEntry.username && adjustedRepoName && givenEntry.filename) {
+ const useFilename = givenEntry.filename.startsWith('text extracted from ') ? givenEntry.filename.slice('text extracted from '.length) : givenEntry.filename;
try { // use blame so we can see the actual line!
- if (givenEntry.filename.endsWith('.tsv') || givenEntry.filename.endsWith('.md')) {
+ if (useFilename.endsWith('.tsv') || useFilename.endsWith('.md')) {
let folder = '';
- if (givenEntry.filename !== 'README.md' && givenEntry.filename !== 'LICENSE.md') {
+ if (useFilename !== 'README.md' && useFilename !== 'LICENSE.md') {
if (adjustedRepoName.endsWith('_obs')) folder = 'content/';
- else if (adjustedRepoName.endsWith('_tw') && !givenEntry.filename.startsWith('bible/')) {
+ else if (adjustedRepoName.endsWith('_tw') && !useFilename.startsWith('bible/')) {
folder = 'bible/';
- dataAssert(givenEntry.filename.split('/').length === 2, `RenderFileDetails expected TW filename '${givenEntry.filename}' to contain subfolder`); // filename actually contains the subfolder
+ dataAssert(useFilename.split('/').length === 2, `RenderFileDetails expected TW filename '${useFilename}' to contain subfolder`); // filename actually contains the subfolder
}
}
- fileLink = `https://git.door43.org/${givenEntry.username}/${adjustedRepoName}/blame/branch/${givenEntry.branch}/${folder}${givenEntry.filename}`;
+ fileLink = `https://git.door43.org/${givenEntry.username}/${adjustedRepoName}/blame/branch/${givenEntry.branch}/${folder}${useFilename}`;
} else // not TSV or MD
- fileLink = `https://git.door43.org/${givenEntry.username}/${adjustedRepoName}/src/branch/${givenEntry.branch}/${givenEntry.filename}`;
+ fileLink = `https://git.door43.org/${givenEntry.username}/${adjustedRepoName}/src/branch/${givenEntry.branch}/${useFilename}`;
} catch (someErr) { debugLog(`What was someErr here: ${someErr}`); }
- if (givenEntry?.filename.length) resultStart += ` in file ${givenEntry.filename}`;
+ // // NOTE: WHY WAS " && !fileLink" in the next line?
+ // if (givenEntry?.filename.length) {
+ // let adjustedFilename = givenEntry.filename;
+ // if (adjustedFilename.startsWith('bible/')) adjustedFilename = adjustedFilename.slice(6); // drop that first foldername
+ // resultStart += ` in FILE ${adjustedFilename}`;
+ // }
if (givenEntry.lineNumber) {
- resultStart += ' on ';
+ // resultStart += ' on ';
if (fileLink && givenEntry.lineNumber)
fileLineLink = `${fileLink}#L${givenEntry.lineNumber}`;
lineResult = `line ${givenEntry.lineNumber.toLocaleString()}`;
@@ -401,19 +410,25 @@ function RenderFileDetails({ givenEntry }) {
if (givenEntry.fieldName && givenEntry.fieldName.length)
resultEnd = <>{resultEnd} in {givenEntry.fieldName} field>;
+ let adjustedFilename = givenEntry.filename;// could be undefined
+ if (adjustedFilename.startsWith('bible/')) adjustedFilename = adjustedFilename.slice(6); // drop that first foldername
+ let inFileBit = adjustedFilename ? ` in file ${adjustedFilename}` : '';
+
// debugLog(`RenderFileDetails got resultStart='${resultStart}'`);
+ // debugLog(`RenderFileDetails got adjustedFilename='${adjustedFilename}'`);
+ // debugLog(`RenderFileDetails got inFileBit='${inFileBit}'`);
// debugLog(`RenderFileDetails got lineResult='${lineResult}'`);
// debugLog(`RenderFileDetails got fileLineLink='${fileLineLink}'`);
// debugLog(`RenderFileDetails got fileLink='${fileLink}'`);
// debugLog(`RenderFileDetails got resultEnd='${resultEnd}'`);
- if (fileLineLink.length)
- return <>{resultStart}{lineResult}{resultEnd}>;
- else if (fileLink.length)
+ if (fileLineLink.length) // we know the filename and the line number
+ return <>{resultStart}{inFileBit} on {lineResult}{resultEnd}>;
+ else if (fileLink.length) // we know the filename but not the line number
return <>{resultStart} in file {givenEntry.filename}{resultEnd}>;
- else if (lineResult.length)
- return <>{resultStart}{lineResult}{resultEnd}>;
- else
- return <>{resultStart} with file {givenEntry.filename}{resultEnd}>;
+ else if (lineResult.length) // we know the line number -- how can this happen
+ return <> [DEBUG-CC] {resultStart}{inFileBit}{lineResult}{resultEnd}>;
+ else // we know the filename -- isn't that already covered above ???
+ return <> [DEBUG-DD] {resultStart} with file {givenEntry.filename}{resultEnd}>;
}
// end of RenderFileDetails
@@ -465,7 +480,7 @@ function RenderOneEntry({ color, entry }) {
- {entry.characterIndex > 0 ? " (at character " + (entry.characterIndex + 1) + ")" : ""}
+ {entry.characterIndex > 0 ? " (at character " + (entry.characterIndex + 1).toLocaleString() + ")" : ""}
{entry.location}
>;
diff --git a/src/demos/book-package-check/README.md b/src/demos/book-package-check/README.md
index 0a87b290..46ee8dc4 100644
--- a/src/demos/book-package-check/README.md
+++ b/src/demos/book-package-check/README.md
@@ -32,7 +32,7 @@ import BookPackageCheck from './BookPackageCheck';
languageCode='en'
// bookID can be a USFM bookID, e.g., 'GEN', 'MAT', '3JN'
// and can also be 'OBS' (for Open Bible Stories)
- bookID='2PE'
+ bookID='PHM'
// We can choose the forthcoming new TSV formats or the existing formats
// dataSet='BOTH' // 'OLD' (Markdown TQ1, TSV9 TN, etc.), 'NEW' (TSV7 TQ, TSV7 TN2, etc.), 'DEFAULT', or 'BOTH'
diff --git a/src/demos/book-package-check/checkBookPackage.js b/src/demos/book-package-check/checkBookPackage.js
index ff725759..915ffe12 100644
--- a/src/demos/book-package-check/checkBookPackage.js
+++ b/src/demos/book-package-check/checkBookPackage.js
@@ -9,7 +9,7 @@ import { checkRepo } from '../repo-check/checkRepo';
import { userLog, functionLog, debugLog, parameterAssert, logicAssert, aboutToOverwrite } from '../../core/utilities';
-// const BP_VALIDATOR_VERSION_STRING = '0.9.7';
+// const BP_VALIDATOR_VERSION_STRING = '1.0.0';
const STANDARD_MANIFEST_FILENAME = 'manifest.yaml';
@@ -136,7 +136,7 @@ export async function checkBookPackage(username, languageCode, bookID, setResult
let adjustedLanguageCode = languageCode;
// if (repoCode === 'UHB') adjustedLanguageCode = 'hbo'; // NO -- we need the languageCode of the BP being checked (so we can resolve TW links with * for language) !!!
// else if (repoCode === 'UGNT') adjustedLanguageCode = 'el-x-koine';
- const cfcResultObject = await checkFileContents(username, adjustedLanguageCode, repoCode, repoBranch, cfFilename, fileContent, fileLocation, checkingOptions);
+ const cfcResultObject = await checkFileContents(username, adjustedLanguageCode, repoCode, repoName, repoBranch, cfFilename, fileContent, fileLocation, checkingOptions);
// debugLog("checkFileContents() returned", cfResultObject.successList.length, "success message(s) and", cfResultObject.noticeList.length, "notice(s)");
// for (const successEntry of cfResultObject.successList) debugLog(" ourCheckBPFileContents:", successEntry);
// debugLog("cfcResultObject", JSON.stringify(cfcResultObject));
@@ -145,8 +145,11 @@ export async function checkBookPackage(username, languageCode, bookID, setResult
for (const cfcNoticeEntry of cfcResultObject.noticeList) // noticeEntry is an object
if (cfcNoticeEntry.extra) // it must be an indirect check on a TA/TW article from a TN2 check or UHAL/UGL lexicon check
checkBookPackageResult.noticeList.push(cfcNoticeEntry); // Just copy the complete notice as is
- else // For our direct checks, we add the repoCode as an extra value (unless it’s already there from a TA or TW check)
- addNoticePartial({ ...cfcNoticeEntry, repoCode, repoName, branch: repoBranch, filename: cfFilename, extra: cfcNoticeEntry.extra ? cfcNoticeEntry.extra : repoCode });
+ else {// For our direct checks, we add the repoCode as an extra value (unless it’s already there from a TA or TW check)
+ if (cfcNoticeEntry.filename === undefined) cfcNoticeEntry.filename = cfFilename;
+ aboutToOverwrite('ourCheckBPFileContents', ['repoCode', 'repoName', 'branch', 'extra'], cfcNoticeEntry, { repoCode, repoName, branch: repoBranch, extra: cfcNoticeEntry.extra ? cfcNoticeEntry.extra : repoCode });
+ addNoticePartial({ ...cfcNoticeEntry, repoCode, repoName, branch: repoBranch, extra: cfcNoticeEntry.extra ? cfcNoticeEntry.extra : repoCode });
+ }
// The following is needed coz we might be checking the linked TA/TW articles from TN2 TSV files or UHAL/UGL entries
if (cfcResultObject.checkedFileCount && cfcResultObject.checkedFileCount > 0) {
@@ -291,7 +294,7 @@ export async function checkBookPackage(username, languageCode, bookID, setResult
// debugLog(`Year ${fullYearString} is ${typeof fullYearString}`);
if (markdownFileContent.indexOf(fullYearString) === -1 && markdownFileContent.indexOf(`${thisYear - 1}`) === -1) // Can’t find this year or previous year in file
// NOTE: We don’t use addNoticePartial, because it adds a misleading BookID
- checkBookPackageResult.noticeList.push({ priority: 256, message: "Possibly missing current copyright year", details: `possibly expecting '${fullYearString}'`, username, repoName, filename, location: markdownLocation, extra: repoCode });
+ checkBookPackageResult.noticeList.push({ priority: 256, message: "Possibly missing current copyright year", details: `possibly expecting ‘${fullYearString}’`, username, repoName, filename, location: markdownLocation, extra: repoCode });
}
return markdownFileContent.length;
@@ -617,7 +620,7 @@ async function checkMarkdownBook(username, languageCode, repoCode, repoName, bra
//parameterAssert(typeof incompleteNoticeObject.location === 'string', `cTQ addNoticePartial: 'location' parameter should be a string not a '${typeof incompleteNoticeObject.location}'`);
//parameterAssert(incompleteNoticeObject.extra !== undefined, "cTQ addNoticePartial: 'extra' parameter should be defined");
//parameterAssert(typeof incompleteNoticeObject.extra === 'string', `cTQ addNoticePartial: 'extra' parameter should be a string not a '${typeof incompleteNoticeObject.extra}'`);
- aboutToOverwrite('checkMarkdownBook', ['username', 'repoCode', 'repoName', 'bookID'], incompleteNoticeObject, { username, repoCode, repoName, bookID });
+ aboutToOverwrite('checkBookPackage checkMarkdownBook', ['username', 'repoCode', 'repoName', 'bookID'], incompleteNoticeObject, { username, repoCode, repoName, bookID });
ctqResult.noticeList.push({ ...incompleteNoticeObject, username, repoCode, repoName, bookID });
}
@@ -648,7 +651,7 @@ async function checkMarkdownBook(username, languageCode, repoCode, repoName, bra
//parameterAssert(typeof fileLocation === 'string', `cTQ ourCheckFileContents: 'fileLocation' parameter should be a string not a '${typeof fileLocation}'`);
//parameterAssert(checkingOptions !== undefined, "cTQ ourCheckFileContents: 'checkingOptions' parameter should be defined");
- const cfResultObject = await checkFileContents(username, languageCode, repoCode, branch, cfFilename, fileContent, fileLocation, checkingOptions);
+ const cfResultObject = await checkFileContents(username, languageCode, repoCode, repoName, branch, cfFilename, fileContent, fileLocation, checkingOptions);
// debugLog("checkFileContents() returned", cfResultObject.successList.length, "success message(s) and", cfResultObject.noticeList.length, "notice(s)");
// for (const successEntry of cfResultObject.successList) debugLog(" ourCheckFileContents:", successEntry);
@@ -657,6 +660,7 @@ async function checkMarkdownBook(username, languageCode, repoCode, repoName, bra
// noticeEntry is an array of eight fields: 1=priority, 2=bookID, 3=C, 4=V, 5=msg, 6=characterIndex, 7=excerpt, 8=location
// parameterAssert(Object.keys(noticeEntry).length === 5, `cTQ ourCheckFileContents notice length=${Object.keys(noticeEntry).length}`);
// We add the repoCode as an extra value
+ aboutToOverwrite('checkBookPackage checkMarkdownBook ourCheckFileContents', ['bookID', 'C', 'V', 'extra'], noticeEntry, { bookID, C, V, extra: repoCode });
addNoticePartial({ ...noticeEntry, bookID, C, V, extra: repoCode });
}
}
diff --git a/src/demos/book-packages-check/README.md b/src/demos/book-packages-check/README.md
index 80e66ffc..46fa4edc 100644
--- a/src/demos/book-packages-check/README.md
+++ b/src/demos/book-packages-check/README.md
@@ -32,10 +32,10 @@ import BookPackagesCheck from './BookPackagesCheck';
languageCode='en'
// Enter a string containing UPPERCASE USFM book identifiers separated only by commas
// and can also include OBS (for Open Bible Stories)
- bookIDs='RUT,EZR,NEH,EST,OBA,JON, LUK,EPH,1TI,2TI,TIT,JAS,2PE,1JN,2JN,3JN, OBS'
+ // bookIDs='RUT,EZR,NEH,EST,OBA,JON, LUK,EPH,1TI,2TI,TIT,PHM,JAS,2PE,1JN,2JN,3JN,JUD, OBS' // Uncomment if you're interested in OT and NT
// The above English book packages should all be finished or well along the way
// bookIDs='RUT,EZR,NEH,EST,OBA,JON' // Uncomment if you're interested in OT only
- // bookIDs='LUK,EPH,1TI,2TI,TIT,JAS,2PE,1JN,2JN,3JN, OBS' // Uncomment if you're interested in NT and OBS only
+ bookIDs='LUK,GAL,EPH,PHP,COL,1TI,2TI,TIT,PHM,JAS,2PE,1JN,2JN,3JN,JUD, OBS' // If you're interested in NT and OBS only
// We can choose the forthcoming new TSV formats or the existing formats
// dataSet='OLD' // 'OLD' (Markdown TQ1, TSV TN, etc.), 'NEW' (TSV TQ, TN2, etc.), 'DEFAULT', or 'BOTH'
diff --git a/src/demos/file-check/FileCheck.js b/src/demos/file-check/FileCheck.js
index e1dea860..7ff0e265 100644
--- a/src/demos/file-check/FileCheck.js
+++ b/src/demos/file-check/FileCheck.js
@@ -5,10 +5,10 @@ import { processNoticesToErrorsWarnings, processNoticesToSevereMediumLow, proces
import { RenderSuccessesErrorsWarnings, RenderSuccessesSevereMediumLow, RenderSuccessesNoticesGradient, RenderElapsedTime } from '../RenderProcessedResults';
import { checkFileContents } from './checkFileContents';
// eslint-disable-next-line no-unused-vars
-import { debugLog, userLog } from '../../core/utilities';
+import { debugLog, userLog, aboutToOverwrite } from '../../core/utilities';
-// const FILE_CHECK_VERSION_STRING = '0.4.3';
+// const FILE_CHECK_VERSION_STRING = '1.0.0';
function FileCheck(props) {
@@ -107,12 +107,13 @@ function FileCheck(props) {
// else debugLog(`RepoCheck preloaded repos ${repoCode} and ${repoPreloadList}`)
}
- rawCFResults = await checkFileContents(username, languageCode, repoCodeGuess, branchOrRelease, filename, fileContent, givenLocation, checkingOptions);
+ rawCFResults = await checkFileContents(username, languageCode, repoCodeGuess, repoName, branchOrRelease, filename, fileContent, givenLocation, checkingOptions);
// debugLog(`rawCFResults=${JSON.stringify(rawCFResults)}`);
// Because we know here that we're only checking one file, we don’t need the filename field in the notices
// WRONG: We want the filename so that the lineNumber can be made into a live link
function addFields(notice) {
+ aboutToOverwrite('FileCheck', ['username', 'repoName', 'repoCode'], notice, { username, repoName, repoCode: repoCodeGuess });
notice.username = username; notice.repoName = repoName; notice.repoCode = repoCodeGuess;
if (!notice.extra) notice.extra = repoCodeGuess;
return notice;
diff --git a/src/demos/file-check/README.md b/src/demos/file-check/README.md
index 806eb873..4baac91b 100644
--- a/src/demos/file-check/README.md
+++ b/src/demos/file-check/README.md
@@ -19,8 +19,8 @@ and then validates the content of one file selected from the repo.
// If you're checking and then editing & saving files, ensure that it's set to Y before you recheck
reloadAllFilesFirst='Y' // 'Y' (for Yes -- same as ClearCache in menu) or 'N' (for No)
- // username='Door43-Catalog'
username='unfoldingWord'
+ // username='Door43-Catalog'
// Lines starting with // are ignored -- you can add or remove // as desired
// repoName='hbo_uhb' // OT books only
diff --git a/src/demos/file-check/checkFileContents.js b/src/demos/file-check/checkFileContents.js
index b6b7153d..9c751fd2 100644
--- a/src/demos/file-check/checkFileContents.js
+++ b/src/demos/file-check/checkFileContents.js
@@ -3,15 +3,14 @@ import * as books from '../../core/books/books';
import {
// eslint-disable-next-line no-unused-vars
REPO_CODES_LIST,
- formRepoName,
checkUSFMText, checkMarkdownFileContents, checkLexiconFileContents, checkPlainText, checkYAMLText, checkManifestText,
internalCheckTN_TSV9Table, checkNotesTSV7Table, checkQuestionsTSV7Table, internalCheckTWL_TSV6Table,
} from '../../core';
// eslint-disable-next-line no-unused-vars
-import { userLog, debugLog, functionLog, parameterAssert, logicAssert } from '../../core';
+import { userLog, debugLog, functionLog, parameterAssert, logicAssert, aboutToOverwrite } from '../../core';
-// const CHECK_FILE_CONTENTS_VERSION_STRING = '0.6.0';
+// const CHECK_FILE_CONTENTS_VERSION_STRING = '1.0.3';
/**
@@ -19,13 +18,14 @@ import { userLog, debugLog, functionLog, parameterAssert, logicAssert } from '..
* @param {string} username for Door43.org
* @param {string} languageCode, e.g., 'en'
* @param {string} repoCode, e.g., 'LT', 'TN', 'TN2', 'TQ', 'TWL', etc.
+ * @param {string} repoName, e.g., 'en_ult', 'ru_gst', etc.
* @param {string} branch, e.g., 'master'
* @param {string} filepath -- often just a filename
* @param {string} fileContent
* @param {string} givenLocation
* @param {Object} givenCheckingOptions
*/
-export async function checkFileContents(username, languageCode, repoCode, branch, filepath, fileContent, givenLocation, givenCheckingOptions) {
+export async function checkFileContents(username, languageCode, repoCode, repoName, branch, filepath, fileContent, givenLocation, givenCheckingOptions) {
// Determine the file type from the filename extension
// and return the results of checking that kind of file text
// functionLog(`checkFileContents(un='${username}', lC='${languageCode}', rC='${repoCode}', rBr='${branch}', fn='${filepath}', ${fileContent.length} chars, ${givenLocation}, ${JSON.stringify(givenCheckingOptions)})…`);
@@ -55,10 +55,9 @@ export async function checkFileContents(username, languageCode, repoCode, branch
const filename = filebits[filebits.length - 1];
// debugLog(`checkFileContents from filepath='${filepath}' got (${filebits.length}) ${filebits} and then '${filename}'`);
const filenameLower = filename.toLowerCase();
- const repoName = formRepoName(languageCode, repoCode);
const newCheckingOptions = givenCheckingOptions ? { ...givenCheckingOptions } : {}; // clone before modify
- if (!newCheckingOptions.originalLanguageRepoUsername) newCheckingOptions.originalLanguageRepoUsername = username;
+ // if (!newCheckingOptions.originalLanguageRepoUsername) newCheckingOptions.originalLanguageRepoUsername = username;
if (!newCheckingOptions.taRepoUsername) newCheckingOptions.taRepoUsername = username;
if (!newCheckingOptions.twRepoUsername) newCheckingOptions.twRepoUsername = username;
@@ -91,7 +90,7 @@ export async function checkFileContents(username, languageCode, repoCode, branch
else if (filenameLower.endsWith('.usfm')) {
const filenameMain = filepath.slice(0, filepath.length - 5); // drop .usfm
// debugLog(`Have USFM filenameMain=${filenameMain}`);
- const bookID = filenameMain.slice(filenameMain.length - 3);
+ const bookID = filenameMain.endsWith('_book') ? filenameMain.slice(filenameMain.length - 8, filenameMain.length - 5).toUpperCase() : filenameMain.slice(filenameMain.length - 3);
// debugLog(`Have USFM bookcode=${bookID}`);
//parameterAssert(books.isValidBookID(bookID), `checkFileContents: '${bookID}' is not a valid USFM book identifier`);
checkFileResultObject = await checkUSFMText(username, languageCode, repoCode, bookID, filepath, fileContent, ourCFLocation, newCheckingOptions);
@@ -125,13 +124,19 @@ export async function checkFileContents(username, languageCode, repoCode, branch
// debugLog(`checkFileContents got initial results with ${checkFileResult.successList.length} success message(s) and ${checkFileResult.noticeList.length} notice(s)`);
// Make sure that we have the filename in all of our notices (in case other files are being checked as well)
+ /*
function addFilenameField(noticeObjectParameter) {
if (noticeObjectParameter.debugChain) noticeObjectParameter.debugChain = `checkFileContents ${noticeObjectParameter.debugChain}`;
if (noticeObjectParameter.fieldName === filepath) delete noticeObjectParameter.fieldName;
+ // aboutToOverwrite('checkFileContents', ['filename'], noticeObjectParameter, { filename: filepath });
// TODO: Might we need to add username, repoName, or branch here ???
return noticeObjectParameter.extra ? noticeObjectParameter : { ...noticeObjectParameter, filename: filepath }; // NOTE: might be an indirect check on a TA/TW article or UHAL/UGL entry
}
checkFileResultObject.noticeList = checkFileResultObject.noticeList.map(addFilenameField);
+ */
+ for (const noticeObject of checkFileResultObject.noticeList) {
+ if (noticeObject.filename === undefined) noticeObject.filename = filepath;
+ }
// Add some extra fields to our checkFileResult object
// in case we need this information again later
diff --git a/src/demos/repo-check/README.md b/src/demos/repo-check/README.md
index c46f3da5..ae9ef517 100644
--- a/src/demos/repo-check/README.md
+++ b/src/demos/repo-check/README.md
@@ -22,8 +22,8 @@ import RepoCheck from './RepoCheck';
// If you're checking and then editing & saving files, ensure that it's set to Y before you recheck
reloadAllFilesFirst='Y' // 'Y' (for Yes -- same as ClearCache in menu) or 'N' (for No)
- // username = 'Door43-Catalog'
username = 'unfoldingWord'
+ // username = 'Door43-Catalog'
// Lines starting with // are ignored -- you can add or remove // as desired
// NOTE: Some of these whole repository checks can take a looong time!
diff --git a/src/demos/repo-check/checkRepo.js b/src/demos/repo-check/checkRepo.js
index c8786b71..db354fb7 100644
--- a/src/demos/repo-check/checkRepo.js
+++ b/src/demos/repo-check/checkRepo.js
@@ -8,7 +8,7 @@ import { repositoryExistsOnDoor43, getFileListFromZip, cachedGetFile, cachedGetR
import { userLog, functionLog, debugLog, logicAssert, parameterAssert, aboutToOverwrite } from '../../core/utilities';
-// const REPO_VALIDATOR_VERSION_STRING = '0.6.6';
+// const REPO_VALIDATOR_VERSION_STRING = '1.0.0';
/**
@@ -147,7 +147,7 @@ export async function checkRepo(username, repoName, repoBranch, givenLocation, s
if (/*filename === 'manifest.yaml' || */cfFilename === 'LICENSE.md'
|| ((languageCode === 'el-x-koine' || languageCode === 'hbo') && cfFilename === 'README.md'))
adjustedLanguageCode = 'en'; // Correct the language for these auxilliary files
- const cfcResultObject = await checkFileContents(username, adjustedLanguageCode, repoCode, repoBranch, cfFilename, cfFileContent, cfFileLocation, cfCheckingOptions);
+ const cfcResultObject = await checkFileContents(username, adjustedLanguageCode, repoCode, repoName, repoBranch, cfFilename, cfFileContent, cfFileLocation, cfCheckingOptions);
// debugLog("checkFileContents() returned", resultObject.successList.length, "success message(s) and", resultObject.noticeList.length, "notice(s)");
// for (const successEntry of resultObject.successList)
// userLog(" ", successEntry);
@@ -158,6 +158,7 @@ export async function checkRepo(username, repoName, repoBranch, givenLocation, s
if (cfcNoticeEntry.extra)
checkRepoResult.noticeList.push(cfcNoticeEntry); // Add this notice directly
else { // no extra field yet
+ aboutToOverwrite('ourCheckRepoFileContents', ['bookID'], cfcResultObject, { bookID: cfBookID });
// addNoticePartial({ ...cfcNoticeEntry, bookID: cfBookID, extra: bookOrFileCode.toUpperCase() });
// const newNoticeObject = { ...cfcNoticeEntry, bookID: cfBookID };
if (cfBookID.length) cfcNoticeEntry.bookID = cfBookID;
@@ -212,6 +213,10 @@ export async function checkRepo(username, repoName, repoBranch, givenLocation, s
// Update our "waiting" message
setResultValue(Fetching zipped files from {username}/{repoName} repository…
);
+ const repoNamePart2 = repoName.split('_')[1]
+ if ((username !== 'unfoldingWord' || languageCode !== 'en') && repoNamePart2.startsWith('u'))
+ addNoticePartial({ priority: 980, message: "Unexpected repo name", details: `expected ‘g${repoNamePart2.slice(1)}’`, excerpt: repoNamePart2, location: ourLocation });
+
// Let’s fetch the zipped repo since it should be much more efficient than individual fetches
// functionLog(`checkRepo: fetch zip file for ${repoName}…`);
const fetchRepositoryZipFile_ = givenCheckingOptions?.fetchRepositoryZipFile ? givenCheckingOptions.fetchRepositoryZipFile : cachedGetRepositoryZipFile;
diff --git a/yarn.lock b/yarn.lock
index 49707dc2..61efe3d9 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -39,10 +39,10 @@
dependencies:
"@babel/highlight" "^7.16.0"
-"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.0", "@babel/compat-data@^7.9.0":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.0.tgz#ea269d7f78deb3a7826c39a4048eecda541ebdaa"
- integrity sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==
+"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.0", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.9.0":
+ version "7.16.4"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e"
+ integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==
"@babel/core@7.9.0":
version "7.9.0"
@@ -111,14 +111,14 @@
"@babel/helper-explode-assignable-expression" "^7.16.0"
"@babel/types" "^7.16.0"
-"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.0", "@babel/helper-compilation-targets@^7.8.7":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.0.tgz#01d615762e796c17952c29e3ede9d6de07d235a8"
- integrity sha512-S7iaOT1SYlqK0sQaCi21RX4+13hmdmnxIEAnQUB/eh7GeAnRjOUgTYpLkUOiRXzD+yog1JxP0qyAQZ7ZxVxLVg==
+"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.0", "@babel/helper-compilation-targets@^7.16.3", "@babel/helper-compilation-targets@^7.8.7":
+ version "7.16.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz#5b480cd13f68363df6ec4dc8ac8e2da11363cbf0"
+ integrity sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==
dependencies:
"@babel/compat-data" "^7.16.0"
"@babel/helper-validator-option" "^7.14.5"
- browserslist "^4.16.6"
+ browserslist "^4.17.5"
semver "^6.3.0"
"@babel/helper-create-class-features-plugin@^7.16.0", "@babel/helper-create-class-features-plugin@^7.8.3":
@@ -141,10 +141,10 @@
"@babel/helper-annotate-as-pure" "^7.16.0"
regexpu-core "^4.7.1"
-"@babel/helper-define-polyfill-provider@^0.2.4":
- version "0.2.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz#8867aed79d3ea6cade40f801efb7ac5c66916b10"
- integrity sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==
+"@babel/helper-define-polyfill-provider@^0.3.0":
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz#c5b10cf4b324ff840140bb07e05b8564af2ae971"
+ integrity sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==
dependencies:
"@babel/helper-compilation-targets" "^7.13.0"
"@babel/helper-module-imports" "^7.12.13"
@@ -225,10 +225,10 @@
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9"
integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==
-"@babel/helper-remap-async-to-generator@^7.16.0":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.0.tgz#d5aa3b086e13a5fe05238ff40c3a5a0c2dab3ead"
- integrity sha512-MLM1IOMe9aQBqMWxcRw8dcb9jlM86NIw7KA0Wri91Xkfied+dE0QuBFSBjMNvqzmS0OSIDsMNC24dBEkPUi7ew==
+"@babel/helper-remap-async-to-generator@^7.16.0", "@babel/helper-remap-async-to-generator@^7.16.4":
+ version "7.16.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz#5d7902f61349ff6b963e07f06a389ce139fbfe6e"
+ integrity sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA==
dependencies:
"@babel/helper-annotate-as-pure" "^7.16.0"
"@babel/helper-wrap-function" "^7.16.0"
@@ -286,12 +286,12 @@
"@babel/types" "^7.16.0"
"@babel/helpers@^7.16.0", "@babel/helpers@^7.9.0":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.0.tgz#875519c979c232f41adfbd43a3b0398c2e388183"
- integrity sha512-dVRM0StFMdKlkt7cVcGgwD8UMaBfWJHl3A83Yfs8GQ3MO0LHIIIMvK7Fa0RGOGUQ10qikLaX6D7o5htcQWgTMQ==
+ version "7.16.3"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.3.tgz#27fc64f40b996e7074dc73128c3e5c3e7f55c43c"
+ integrity sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==
dependencies:
"@babel/template" "^7.16.0"
- "@babel/traverse" "^7.16.0"
+ "@babel/traverse" "^7.16.3"
"@babel/types" "^7.16.0"
"@babel/highlight@^7.0.0", "@babel/highlight@^7.16.0", "@babel/highlight@^7.8.3":
@@ -303,15 +303,15 @@
chalk "^2.0.0"
js-tokens "^4.0.0"
-"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.9.0":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.0.tgz#cf147d7ada0a3655e79bf4b08ee846f00a00a295"
- integrity sha512-TEHWXf0xxpi9wKVyBCmRcSSDjbJ/cl6LUdlbYUHEaNQUJGhreJbZrXT6sR4+fZLxVUJqNRB4KyOvjuy/D9009A==
+"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.0", "@babel/parser@^7.16.3", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.9.0":
+ version "7.16.4"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.4.tgz#d5f92f57cf2c74ffe9b37981c0e72fee7311372e"
+ integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==
-"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.0":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.0.tgz#efb7f147042aca34ce8156a055906a7abaadeaf0"
- integrity sha512-djyecbGMEh4rOb/Tc1M5bUW2Ih1IZRa9PoubnPOCzM+DRE89uGUHR1Y+3aDdTMW4drjGRZ2ol8dt1JUFg6hJLQ==
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.2":
+ version "7.16.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz#2977fca9b212db153c195674e57cfab807733183"
+ integrity sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
@@ -324,13 +324,13 @@
"@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
"@babel/plugin-proposal-optional-chaining" "^7.16.0"
-"@babel/plugin-proposal-async-generator-functions@^7.16.0", "@babel/plugin-proposal-async-generator-functions@^7.8.3":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.0.tgz#11425d47a60364352f668ad5fbc1d6596b2c5caf"
- integrity sha512-nyYmIo7ZqKsY6P4lnVmBlxp9B3a96CscbLotlsNuktMHahkDwoPYEjXrZHU0Tj844Z9f1IthVxQln57mhkcExw==
+"@babel/plugin-proposal-async-generator-functions@^7.16.4", "@babel/plugin-proposal-async-generator-functions@^7.8.3":
+ version "7.16.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz#e606eb6015fec6fa5978c940f315eae4e300b081"
+ integrity sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
- "@babel/helper-remap-async-to-generator" "^7.16.0"
+ "@babel/helper-remap-async-to-generator" "^7.16.4"
"@babel/plugin-syntax-async-generators" "^7.8.4"
"@babel/plugin-proposal-class-properties@7.8.3":
@@ -810,10 +810,10 @@
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/helper-replace-supers" "^7.16.0"
-"@babel/plugin-transform-parameters@^7.16.0", "@babel/plugin-transform-parameters@^7.8.7":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.0.tgz#1b50765fc421c229819dc4c7cdb8911660b3c2d7"
- integrity sha512-XgnQEm1CevKROPx+udOi/8f8TiGhrUWiHiaUCIp47tE0tpFDjzXNTZc9E5CmCwxNjXTWEVqvRfWZYOTFvMa/ZQ==
+"@babel/plugin-transform-parameters@^7.16.0", "@babel/plugin-transform-parameters@^7.16.3", "@babel/plugin-transform-parameters@^7.8.7":
+ version "7.16.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz#fa9e4c874ee5223f891ee6fa8d737f4766d31d15"
+ integrity sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
@@ -910,15 +910,15 @@
semver "^5.5.1"
"@babel/plugin-transform-runtime@^7.12.1":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.0.tgz#3fe0da36c2f0834bef7c4d3e7f2b2db0ee0c8909"
- integrity sha512-zlPf1/XFn5+vWdve3AAhf+Sxl+MVa5VlwTwWgnLx23u4GlatSRQJ3Eoo9vllf0a9il3woQsT4SK+5Z7c06h8ag==
+ version "7.16.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.4.tgz#f9ba3c7034d429c581e1bd41b4952f3db3c2c7e8"
+ integrity sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A==
dependencies:
"@babel/helper-module-imports" "^7.16.0"
"@babel/helper-plugin-utils" "^7.14.5"
- babel-plugin-polyfill-corejs2 "^0.2.3"
- babel-plugin-polyfill-corejs3 "^0.3.0"
- babel-plugin-polyfill-regenerator "^0.2.3"
+ babel-plugin-polyfill-corejs2 "^0.3.0"
+ babel-plugin-polyfill-corejs3 "^0.4.0"
+ babel-plugin-polyfill-regenerator "^0.3.0"
semver "^6.3.0"
"@babel/plugin-transform-shorthand-properties@^7.16.0", "@babel/plugin-transform-shorthand-properties@^7.8.3":
@@ -1048,17 +1048,17 @@
semver "^5.5.0"
"@babel/preset-env@^7.12.1", "@babel/preset-env@^7.4.5":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.0.tgz#97228393d217560d6a1c6c56f0adb9d12bca67f5"
- integrity sha512-cdTu/W0IrviamtnZiTfixPfIncr2M1VqRrkjzZWlr1B4TVYimCFK5jkyOdP4qw2MrlKHi+b3ORj6x8GoCew8Dg==
+ version "7.16.4"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.4.tgz#4f6ec33b2a3fe72d6bfdcdf3859500232563a2e3"
+ integrity sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==
dependencies:
- "@babel/compat-data" "^7.16.0"
- "@babel/helper-compilation-targets" "^7.16.0"
+ "@babel/compat-data" "^7.16.4"
+ "@babel/helper-compilation-targets" "^7.16.3"
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/helper-validator-option" "^7.14.5"
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.0"
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.2"
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.0"
- "@babel/plugin-proposal-async-generator-functions" "^7.16.0"
+ "@babel/plugin-proposal-async-generator-functions" "^7.16.4"
"@babel/plugin-proposal-class-properties" "^7.16.0"
"@babel/plugin-proposal-class-static-block" "^7.16.0"
"@babel/plugin-proposal-dynamic-import" "^7.16.0"
@@ -1108,7 +1108,7 @@
"@babel/plugin-transform-named-capturing-groups-regex" "^7.16.0"
"@babel/plugin-transform-new-target" "^7.16.0"
"@babel/plugin-transform-object-super" "^7.16.0"
- "@babel/plugin-transform-parameters" "^7.16.0"
+ "@babel/plugin-transform-parameters" "^7.16.3"
"@babel/plugin-transform-property-literals" "^7.16.0"
"@babel/plugin-transform-regenerator" "^7.16.0"
"@babel/plugin-transform-reserved-words" "^7.16.0"
@@ -1121,10 +1121,10 @@
"@babel/plugin-transform-unicode-regex" "^7.16.0"
"@babel/preset-modules" "^0.1.5"
"@babel/types" "^7.16.0"
- babel-plugin-polyfill-corejs2 "^0.2.3"
- babel-plugin-polyfill-corejs3 "^0.3.0"
- babel-plugin-polyfill-regenerator "^0.2.3"
- core-js-compat "^3.19.0"
+ babel-plugin-polyfill-corejs2 "^0.3.0"
+ babel-plugin-polyfill-corejs3 "^0.4.0"
+ babel-plugin-polyfill-regenerator "^0.3.0"
+ core-js-compat "^3.19.1"
semver "^6.3.0"
"@babel/preset-modules@^0.1.3", "@babel/preset-modules@^0.1.5":
@@ -1171,9 +1171,9 @@
"@babel/plugin-transform-typescript" "^7.9.0"
"@babel/runtime-corejs3@^7.10.2", "@babel/runtime-corejs3@^7.12.1":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.16.0.tgz#58a7fb00e6948508f12f53a303993e8b6e2f6c70"
- integrity sha512-Oi2qwQ21X7/d9gn3WiwkDTJmq3TQtYNz89lRnoFy8VeZpWlsyXvzSwiRrRZ8cXluvSwqKxqHJ6dBd9Rv+p0ZGQ==
+ version "7.16.3"
+ resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.16.3.tgz#1e25de4fa994c57c18e5fdda6cc810dac70f5590"
+ integrity sha512-IAdDC7T0+wEB4y2gbIL0uOXEYpiZEeuFUTVbdGq+UwCcF35T/tS8KrmMomEwEc5wBbyfH3PJVpTSUqrhPDXFcQ==
dependencies:
core-js-pure "^3.19.0"
regenerator-runtime "^0.13.4"
@@ -1185,10 +1185,10 @@
dependencies:
regenerator-runtime "^0.13.4"
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.0.tgz#e27b977f2e2088ba24748bf99b5e1dece64e4f0b"
- integrity sha512-Nht8L0O8YCktmsDV6FqFue7vQLRx3Hb0B37lS5y0jDRqRxlBG4wIJHnf9/bgSE2UyipKFA01YtS+npRdTWBUyw==
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
+ version "7.16.3"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5"
+ integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==
dependencies:
regenerator-runtime "^0.13.4"
@@ -1201,17 +1201,17 @@
"@babel/parser" "^7.16.0"
"@babel/types" "^7.16.0"
-"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.9.0":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.0.tgz#965df6c6bfc0a958c1e739284d3c9fa4a6e3c45b"
- integrity sha512-qQ84jIs1aRQxaGaxSysII9TuDaguZ5yVrEuC0BN2vcPlalwfLovVmCjbFDPECPXcYM/wLvNFfp8uDOliLxIoUQ==
+"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.0", "@babel/traverse@^7.16.3", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.9.0":
+ version "7.16.3"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.3.tgz#f63e8a938cc1b780f66d9ed3c54f532ca2d14787"
+ integrity sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==
dependencies:
"@babel/code-frame" "^7.16.0"
"@babel/generator" "^7.16.0"
"@babel/helper-function-name" "^7.16.0"
"@babel/helper-hoist-variables" "^7.16.0"
"@babel/helper-split-export-declaration" "^7.16.0"
- "@babel/parser" "^7.16.0"
+ "@babel/parser" "^7.16.3"
"@babel/types" "^7.16.0"
debug "^4.1.0"
globals "^11.1.0"
@@ -1306,7 +1306,7 @@
dependencies:
"@hapi/hoek" "^8.3.0"
-"@isaacs/string-locale-compare@*", "@isaacs/string-locale-compare@^1.0.1":
+"@isaacs/string-locale-compare@*", "@isaacs/string-locale-compare@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz#291c227e93fd407a96ecd59879a35809120e432b"
integrity sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==
@@ -1748,17 +1748,17 @@
integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
"@npmcli/arborist@*", "@npmcli/arborist@^4.0.0":
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-4.0.3.tgz#5e1632192f970c3a4e43c4699ad875089418bed0"
- integrity sha512-gFz/dNJtpv2bYXlupcUpEaWlFDRUNmvVnQNbE6dY4ild6beZ2SkG4R5/CM4GZZwj9HD2TyfGjO350Ja+xlLzuA==
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-4.1.1.tgz#a36202f85b0b8d47f5fc0e056e9836282bc5a38c"
+ integrity sha512-sASzHngGWt8l6ic1VP0Qf3+ral/RL8L+MculTp2w8NYjjkDiurByOT39KiYmLwpeJ2GQoDR/rdhEwnII8wZQ9g==
dependencies:
- "@isaacs/string-locale-compare" "^1.0.1"
+ "@isaacs/string-locale-compare" "^1.1.0"
"@npmcli/installed-package-contents" "^1.0.7"
"@npmcli/map-workspaces" "^2.0.0"
"@npmcli/metavuln-calculator" "^2.0.0"
"@npmcli/move-file" "^1.1.0"
"@npmcli/name-from-folder" "^1.0.1"
- "@npmcli/node-gyp" "^1.0.1"
+ "@npmcli/node-gyp" "^1.0.3"
"@npmcli/package-json" "^1.0.1"
"@npmcli/run-script" "^2.0.0"
bin-links "^2.3.0"
@@ -1772,8 +1772,8 @@
npm-package-arg "^8.1.5"
npm-pick-manifest "^6.1.0"
npm-registry-fetch "^11.0.0"
- pacote "^12.0.0"
- parse-conflict-json "^1.1.1"
+ pacote "^12.0.2"
+ parse-conflict-json "^2.0.1"
proc-log "^1.0.0"
promise-all-reject-late "^1.0.0"
promise-call-limit "^1.0.1"
@@ -1791,9 +1791,9 @@
integrity sha512-3BGrt6FLjqM6br5AhWRKTr3u5GIVkjRYeAFrMp3HjnfICrg4xOrVRwFavKT6tsp++bq5dluL5t8ME/Nha/6c1Q==
"@npmcli/config@*":
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/@npmcli/config/-/config-2.3.0.tgz#364fbe942037e562a832a113206e14ccb651f7bc"
- integrity sha512-yjiC1xv7KTmUTqfRwN2ZL7BHV160ctGF0fLXmKkkMXj40UOvBe45Apwvt5JsFRtXSoHkUYy1ouzscziuWNzklg==
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/@npmcli/config/-/config-2.3.2.tgz#6027efc132fcc809abef749c2f2e13dc4dcd6e0b"
+ integrity sha512-2/9dj143BFgQR8qxJbYptd8k+4+Po2uHYq3H6498ynZcRu4LrsDlngov5HGrvo2+f0pe0fBJwDEP2rRtaW8bkw==
dependencies:
ini "^2.0.0"
mkdirp-infer-owner "^2.0.0"
@@ -1809,9 +1809,9 @@
ansi-styles "^4.3.0"
"@npmcli/fs@^1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.0.0.tgz#589612cfad3a6ea0feafcb901d29c63fd52db09f"
- integrity sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.0.tgz#bec1d1b89c170d40e1b73ad6c943b0b75e7d2951"
+ integrity sha512-VhP1qZLXcrXRIaPoqb4YA55JQxLNF3jNR4T55IdOJa3+IFJKNYHtPvtXx8slmeMavj37vCzCfrqQM1vWLsYKLA==
dependencies:
"@gar/promisify" "^1.0.1"
semver "^7.3.5"
@@ -1871,7 +1871,7 @@
resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz#77ecd0a4fcb772ba6fe927e2e2e155fbec2e6b1a"
integrity sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==
-"@npmcli/node-gyp@^1.0.1", "@npmcli/node-gyp@^1.0.2":
+"@npmcli/node-gyp@^1.0.2", "@npmcli/node-gyp@^1.0.3":
version "1.0.3"
resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz#a912e637418ffc5f2db375e93b85837691a43a33"
integrity sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==
@@ -2033,9 +2033,9 @@
integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.0", "@types/babel__core@^7.1.7":
- version "7.1.16"
- resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.16.tgz#bc12c74b7d65e82d29876b5d0baf5c625ac58702"
- integrity sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==
+ version "7.1.17"
+ resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.17.tgz#f50ac9d20d64153b510578d84f9643f9a3afbe64"
+ integrity sha512-6zzkezS9QEIL8yCBvXWxPTJPNuMeECJVxSOhxNY/jfq9LxOTHivaYTqr37n9LknWWRTIkzqH2UilS5QFvfa90A==
dependencies:
"@babel/parser" "^7.1.0"
"@babel/types" "^7.0.0"
@@ -2143,9 +2143,9 @@
integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==
"@types/node@*":
- version "16.11.6"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae"
- integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==
+ version "16.11.12"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.12.tgz#ac7fb693ac587ee182c3780c26eb65546a1a3c10"
+ integrity sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==
"@types/normalize-package-data@^2.4.0":
version "2.4.1"
@@ -2158,9 +2158,9 @@
integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
"@types/prettier@^2.0.0":
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.1.tgz#e1303048d5389563e130f5bdd89d37a99acb75eb"
- integrity sha512-Fo79ojj3vdEZOHg3wR9ksAMRz4P3S5fDB5e/YWZiFnyFQI1WY2Vftu9XoXVVtJfxB7Bpce/QTqWSSntkz2Znrw==
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.2.tgz#4c62fae93eb479660c3bd93f9d24d561597a8281"
+ integrity sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==
"@types/prop-types@*":
version "15.7.4"
@@ -2195,9 +2195,9 @@
"@types/react" "*"
"@types/react@*":
- version "17.0.33"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.33.tgz#e01ae3de7613dac1094569880bb3792732203ad5"
- integrity sha512-pLWntxXpDPaU+RTAuSGWGSEL2FRTNyRQOjSWDke/rxRg14ncsZvx8AKWMWZqvc1UOaJIAoObdZhAWvRaHFi5rw==
+ version "17.0.37"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.37.tgz#6884d0aa402605935c397ae689deed115caad959"
+ integrity sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg==
dependencies:
"@types/prop-types" "*"
"@types/scheduler" "*"
@@ -2703,9 +2703,9 @@ acorn@^7.1.1:
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
acorn@^8.2.4:
- version "8.5.0"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2"
- integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==
+ version "8.6.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.6.0.tgz#e3692ba0eb1a0c83eaa4f37f5fa7368dd7142895"
+ integrity sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==
address@1.1.2, address@^1.0.1:
version "1.1.2"
@@ -2786,6 +2786,11 @@ ansi-escapes@^4.2.1:
dependencies:
type-fest "^0.21.3"
+ansi-html-community@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41"
+ integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==
+
ansi-html@0.0.7:
version "0.0.7"
resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
@@ -2982,7 +2987,7 @@ array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.5:
define-properties "^1.1.3"
es-abstract "^1.19.0"
-array.prototype.flatmap@^1.2.4:
+array.prototype.flatmap@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz#908dc82d8a406930fdf38598d51e7411d18d4446"
integrity sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==
@@ -3012,9 +3017,9 @@ asn1.js@^5.2.0:
safer-buffer "^2.1.0"
asn1@~0.2.3:
- version "0.2.4"
- resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
- integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d"
+ integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==
dependencies:
safer-buffer "~2.1.0"
@@ -3111,7 +3116,7 @@ aws4@^1.8.0:
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
-axe-core@^4.0.2:
+axe-core@^4.3.5:
version "4.3.5"
resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.3.5.tgz#78d6911ba317a8262bfee292aeafcc1e04b49cc5"
integrity sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==
@@ -3261,29 +3266,29 @@ babel-plugin-named-asset-import@^0.3.6:
resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz#156cd55d3f1228a5765774340937afc8398067dd"
integrity sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==
-babel-plugin-polyfill-corejs2@^0.2.3:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz#6ed8e30981b062f8fe6aca8873a37ebcc8cc1c0f"
- integrity sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==
+babel-plugin-polyfill-corejs2@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz#407082d0d355ba565af24126fb6cb8e9115251fd"
+ integrity sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==
dependencies:
"@babel/compat-data" "^7.13.11"
- "@babel/helper-define-polyfill-provider" "^0.2.4"
+ "@babel/helper-define-polyfill-provider" "^0.3.0"
semver "^6.1.1"
-babel-plugin-polyfill-corejs3@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.3.0.tgz#fa7ca3d1ee9ddc6193600ffb632c9785d54918af"
- integrity sha512-JLwi9vloVdXLjzACL80j24bG6/T1gYxwowG44dg6HN/7aTPdyPbJJidf6ajoA3RPHHtW0j9KMrSOLpIZpAnPpg==
+babel-plugin-polyfill-corejs3@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz#0b571f4cf3d67f911512f5c04842a7b8e8263087"
+ integrity sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==
dependencies:
- "@babel/helper-define-polyfill-provider" "^0.2.4"
+ "@babel/helper-define-polyfill-provider" "^0.3.0"
core-js-compat "^3.18.0"
-babel-plugin-polyfill-regenerator@^0.2.3:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz#2e9808f5027c4336c994992b48a4262580cb8d6d"
- integrity sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==
+babel-plugin-polyfill-regenerator@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz#9ebbcd7186e1a33e21c5e20cae4e7983949533be"
+ integrity sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==
dependencies:
- "@babel/helper-define-polyfill-provider" "^0.2.4"
+ "@babel/helper-define-polyfill-provider" "^0.3.0"
babel-plugin-syntax-object-rest-spread@^6.8.0:
version "6.13.0"
@@ -3631,13 +3636,13 @@ browserslist@4.7.0:
electron-to-chromium "^1.3.247"
node-releases "^1.1.29"
-browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.6.2, browserslist@^4.6.4, browserslist@^4.9.1:
- version "4.17.5"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.5.tgz#c827bbe172a4c22b123f5e337533ceebadfdd559"
- integrity sha512-I3ekeB92mmpctWBoLXe0d5wPS2cBuRvvW0JyyJHMrk9/HmP2ZjrTboNAZ8iuGqaEIlKguljbQY32OkOJIRrgoA==
+browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.17.5, browserslist@^4.18.1, browserslist@^4.6.2, browserslist@^4.6.4, browserslist@^4.9.1:
+ version "4.18.1"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.18.1.tgz#60d3920f25b6860eb917c6c7b185576f4d8b017f"
+ integrity sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==
dependencies:
- caniuse-lite "^1.0.30001271"
- electron-to-chromium "^1.3.878"
+ caniuse-lite "^1.0.30001280"
+ electron-to-chromium "^1.3.896"
escalade "^3.1.1"
node-releases "^2.0.1"
picocolors "^1.0.0"
@@ -3871,9 +3876,9 @@ camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1:
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
camelcase@^6.0.0:
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809"
- integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.1.tgz#250fd350cfd555d0d2160b1d51510eaf8326e86e"
+ integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==
caniuse-api@^3.0.0:
version "3.0.0"
@@ -3885,10 +3890,10 @@ caniuse-api@^3.0.0:
lodash.memoize "^4.1.2"
lodash.uniq "^4.5.0"
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30000989, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001271:
- version "1.0.30001274"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001274.tgz#26ca36204d15b17601ba6fc35dbdad950a647cc7"
- integrity sha512-+Nkvv0fHyhISkiMIjnyjmf5YJcQ1IQHZN6U9TLUMroWR38FNwpsC51Gb68yueafX1V6ifOisInSgP9WJFS13ew==
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30000989, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001280:
+ version "1.0.30001286"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz#3e9debad420419618cfdf52dc9b6572b28a8fff6"
+ integrity sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ==
canvg@^3.0.6:
version "3.0.9"
@@ -3926,13 +3931,10 @@ ccount@^1.0.0:
resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043"
integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==
-chalk@*, chalk@^4.0.0, chalk@^4.1.0:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
- integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
- dependencies:
- ansi-styles "^4.1.0"
- supports-color "^7.1.0"
+chalk@*:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.0.0.tgz#bd96c6bb8e02b96e08c0c3ee2a9d90e050c7b832"
+ integrity sha512-/duVOqst+luxCQRKEo4bNxinsOQtMP80ZYm7mMqzuh5PociNL0PvmHFvREJ9ueYL2TxlHjBcmLCdmocx9Vg+IQ==
chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2:
version "2.4.2"
@@ -3954,6 +3956,14 @@ chalk@^1.1.3:
strip-ansi "^3.0.0"
supports-color "^2.0.0"
+chalk@^4.0.0, chalk@^4.1.0:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
char-regex@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf"
@@ -4275,9 +4285,9 @@ color-name@^1.0.0, color-name@~1.1.4:
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
color-string@^1.6.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312"
- integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.0.tgz#63b6ebd1bec11999d1df3a79a7569451ac2be8aa"
+ integrity sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==
dependencies:
color-name "^1.0.0"
simple-swizzle "^0.2.2"
@@ -4353,9 +4363,9 @@ common-sequence@^1.0.2:
integrity sha1-MOB/P49vf5s97oVPILLTnu4Ibeg=
common-tags@^1.7.2, common-tags@^1.8.0:
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937"
- integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6"
+ integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==
commondir@^1.0.1:
version "1.0.1"
@@ -4511,18 +4521,18 @@ copy-webpack-plugin@^4.6.0:
p-limit "^1.0.0"
serialize-javascript "^1.4.0"
-core-js-compat@^3.18.0, core-js-compat@^3.19.0, core-js-compat@^3.6.2:
- version "3.19.0"
- resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.19.0.tgz#b3b93f93c8721b3ed52b91f12f964cc410967f8b"
- integrity sha512-R09rKZ56ccGBebjTLZHvzDxhz93YPT37gBm6qUhnwj3Kt7aCjjZWD1injyNbyeFHxNKfeZBSyds6O9n3MKq1sw==
+core-js-compat@^3.18.0, core-js-compat@^3.19.1, core-js-compat@^3.6.2:
+ version "3.19.3"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.19.3.tgz#de75e5821c5ce924a0a1e7b7d5c2cb973ff388aa"
+ integrity sha512-59tYzuWgEEVU9r+SRgceIGXSSUn47JknoiXW6Oq7RW8QHjXWz3/vp8pa7dbtuVu40sewz3OP3JmQEcDdztrLhA==
dependencies:
- browserslist "^4.17.5"
+ browserslist "^4.18.1"
semver "7.0.0"
core-js-pure@^3.19.0:
- version "3.19.0"
- resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.19.0.tgz#db6fdadfdd4dc280ec93b64c3c2e8460e6f10094"
- integrity sha512-UEQk8AxyCYvNAs6baNoPqDADv7BX0AmBLGxVsrAifPPx/C8EAzV4Q+2ZUJqVzfI2TQQEZITnwUkWcHpgc/IubQ==
+ version "3.19.3"
+ resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.19.3.tgz#c69b2b36b58927317824994b532ec3f0f7e49607"
+ integrity sha512-N3JruInmCyt7EJj5mAq3csCgGYgiSqu7p7TQp2KOztr180/OAIxyIvL1FCjzgmQk/t3Yniua50Fsak7FShI9lA==
core-js@^2.4.0:
version "2.6.12"
@@ -4530,9 +4540,9 @@ core-js@^2.4.0:
integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
core-js@^3.0.0, core-js@^3.5.0, core-js@^3.6.0, core-js@^3.8.3:
- version "3.19.0"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.19.0.tgz#9e40098a9bc326c7e81b486abbd5e12b9d275176"
- integrity sha512-L1TpFRWXZ76vH1yLM+z6KssLZrP8Z6GxxW4auoCj+XiViOzNPJCAuTIkn03BGdFe6Z5clX5t64wRIRypsZQrUg==
+ version "3.19.3"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.19.3.tgz#6df8142a996337503019ff3235a7022d7cdf4559"
+ integrity sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==
core-util-is@1.0.2:
version "1.0.2"
@@ -4915,14 +4925,14 @@ cssstyle@^2.3.0:
cssom "~0.3.6"
csstype@^2.5.2:
- version "2.6.18"
- resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.18.tgz#980a8b53085f34af313410af064f2bd241784218"
- integrity sha512-RSU6Hyeg14am3Ah4VZEmeX8H7kLwEEirXe6aU2IPfKNvhXwTflK5HQRDNI0ypQXoqmm+QPyG2IaPuQE5zMwSIQ==
+ version "2.6.19"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.19.tgz#feeb5aae89020bb389e1f63669a5ed490e391caa"
+ integrity sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==
csstype@^3.0.2:
- version "3.0.9"
- resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.9.tgz#6410af31b26bd0520933d02cbc64fce9ce3fbf0b"
- integrity sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==
+ version "3.0.10"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5"
+ integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==
cyclist@^1.0.1:
version "1.0.1"
@@ -4937,7 +4947,7 @@ d@1, d@^1.0.1:
es5-ext "^0.10.50"
type "^1.0.1"
-damerau-levenshtein@^1.0.4, damerau-levenshtein@^1.0.6:
+damerau-levenshtein@^1.0.4, damerau-levenshtein@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz#64368003512a1a6992593741a09a9d31a836f55d"
integrity sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==
@@ -4985,9 +4995,9 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9:
ms "2.0.0"
debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1:
- version "4.3.2"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
- integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
+ integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
dependencies:
ms "2.1.2"
@@ -5299,16 +5309,16 @@ domexception@^2.0.1:
webidl-conversions "^5.0.0"
domhandler@^4.0, domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.2.2:
- version "4.2.2"
- resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.2.tgz#e825d721d19a86b8c201a35264e226c678ee755f"
- integrity sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626"
+ integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==
dependencies:
domelementtype "^2.2.0"
dompurify@^2.0.12:
- version "2.3.3"
- resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.3.tgz#c1af3eb88be47324432964d8abc75cf4b98d634c"
- integrity sha512-dqnqRkPMAjOZE0FogZ+ceJNM2dZ3V/yNOuFB7+39qpO93hHhfRpHw3heYQC7DPK9FqbQTfBKUJhiSfz4MvXYwg==
+ version "2.3.4"
+ resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.4.tgz#1cf5cf0105ccb4debdf6db162525bd41e6ddacc6"
+ integrity sha512-6BVcgOAVFXjI0JTjEvZy901Rghm+7fDQOrNIcxB4+gdhj6Kwp6T9VBhBY/AbagKHJocRkDYGd6wvI+p4/10xtQ==
domutils@^1.7.0:
version "1.7.0"
@@ -5380,10 +5390,10 @@ ee-first@1.1.1:
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
-electron-to-chromium@^1.3.247, electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.878:
- version "1.3.885"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.885.tgz#c8cec32fbc61364127849ae00f2395a1bae7c454"
- integrity sha512-JXKFJcVWrdHa09n4CNZYfYaK6EW5aAew7/wr3L1OnsD1L+JHL+RCtd7QgIsxUbFPeTwPlvnpqNNTOLkoefmtXg==
+electron-to-chromium@^1.3.247, electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.896:
+ version "1.4.15"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.15.tgz#4bd144d9d13f8b375c65e1a593e7f4a90bd01b90"
+ integrity sha512-WDw2IUL3k4QpbzInV3JZK+Zd1NjWJPDZ28oUSchWb/kf6AVj7/niaAlgcJlvojFa1d7pJSyQ/KSZsEtq5W7aGQ==
elliptic@^6.5.3:
version "6.5.4"
@@ -5418,7 +5428,7 @@ emoji-regex@^8.0.0:
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
-emoji-regex@^9.0.0:
+emoji-regex@^9.2.2:
version "9.2.2"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
@@ -5641,7 +5651,7 @@ eslint-loader@3.0.3:
object-hash "^2.0.1"
schema-utils "^2.6.1"
-eslint-module-utils@^2.4.1, eslint-module-utils@^2.7.0:
+eslint-module-utils@^2.4.1, eslint-module-utils@^2.7.1:
version "2.7.1"
resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz#b435001c9f8dd4ab7f6d0efcae4b9696d4c24b7c"
integrity sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==
@@ -5684,18 +5694,18 @@ eslint-plugin-import@2.20.1:
resolve "^1.12.0"
eslint-plugin-import@^2.22.0:
- version "2.25.2"
- resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.2.tgz#b3b9160efddb702fc1636659e71ba1d10adbe9e9"
- integrity sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g==
+ version "2.25.3"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.3.tgz#a554b5f66e08fb4f6dc99221866e57cfff824766"
+ integrity sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg==
dependencies:
array-includes "^3.1.4"
array.prototype.flat "^1.2.5"
debug "^2.6.9"
doctrine "^2.1.0"
eslint-import-resolver-node "^0.3.6"
- eslint-module-utils "^2.7.0"
+ eslint-module-utils "^2.7.1"
has "^1.0.3"
- is-core-module "^2.7.0"
+ is-core-module "^2.8.0"
is-glob "^4.0.3"
minimatch "^3.0.4"
object.values "^1.1.5"
@@ -5725,21 +5735,22 @@ eslint-plugin-jsx-a11y@6.2.3:
jsx-ast-utils "^2.2.1"
eslint-plugin-jsx-a11y@^6.3.1:
- version "6.4.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz#a2d84caa49756942f42f1ffab9002436391718fd"
- integrity sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==
+ version "6.5.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz#cdbf2df901040ca140b6ec14715c988889c2a6d8"
+ integrity sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==
dependencies:
- "@babel/runtime" "^7.11.2"
+ "@babel/runtime" "^7.16.3"
aria-query "^4.2.2"
- array-includes "^3.1.1"
+ array-includes "^3.1.4"
ast-types-flow "^0.0.7"
- axe-core "^4.0.2"
+ axe-core "^4.3.5"
axobject-query "^2.2.0"
- damerau-levenshtein "^1.0.6"
- emoji-regex "^9.0.0"
+ damerau-levenshtein "^1.0.7"
+ emoji-regex "^9.2.2"
has "^1.0.3"
- jsx-ast-utils "^3.1.0"
+ jsx-ast-utils "^3.2.1"
language-tags "^1.0.5"
+ minimatch "^3.0.4"
eslint-plugin-react-hooks@^1.6.1:
version "1.7.0"
@@ -5747,9 +5758,9 @@ eslint-plugin-react-hooks@^1.6.1:
integrity sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==
eslint-plugin-react-hooks@^4.1.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz#8c229c268d468956334c943bb45fc860280f5556"
- integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz#318dbf312e06fab1c835a4abef00121751ac1172"
+ integrity sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==
eslint-plugin-react@7.19.0:
version "7.19.0"
@@ -5770,24 +5781,24 @@ eslint-plugin-react@7.19.0:
xregexp "^4.3.0"
eslint-plugin-react@^7.20.6:
- version "7.26.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.26.1.tgz#41bcfe3e39e6a5ac040971c1af94437c80daa40e"
- integrity sha512-Lug0+NOFXeOE+ORZ5pbsh6mSKjBKXDXItUD2sQoT+5Yl0eoT82DqnXeTMfUare4QVCn9QwXbfzO/dBLjLXwVjQ==
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.27.1.tgz#469202442506616f77a854d91babaae1ec174b45"
+ integrity sha512-meyunDjMMYeWr/4EBLTV1op3iSG3mjT/pz5gti38UzfM4OPpNc2m0t2xvKCOMU5D6FSdd34BIMFOvQbW+i8GAA==
dependencies:
- array-includes "^3.1.3"
- array.prototype.flatmap "^1.2.4"
+ array-includes "^3.1.4"
+ array.prototype.flatmap "^1.2.5"
doctrine "^2.1.0"
- estraverse "^5.2.0"
+ estraverse "^5.3.0"
jsx-ast-utils "^2.4.1 || ^3.0.0"
minimatch "^3.0.4"
- object.entries "^1.1.4"
- object.fromentries "^2.0.4"
- object.hasown "^1.0.0"
- object.values "^1.1.4"
+ object.entries "^1.1.5"
+ object.fromentries "^2.0.5"
+ object.hasown "^1.1.0"
+ object.values "^1.1.5"
prop-types "^15.7.2"
resolve "^2.0.0-next.3"
semver "^6.3.0"
- string.prototype.matchall "^4.0.5"
+ string.prototype.matchall "^4.0.6"
eslint-scope@^4.0.0, eslint-scope@^4.0.3:
version "4.0.3"
@@ -5905,7 +5916,7 @@ estraverse@^4.1.1, estraverse@^4.2.0:
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
-estraverse@^5.1.0, estraverse@^5.2.0:
+estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
@@ -6117,9 +6128,9 @@ extsprintf@1.3.0:
integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
extsprintf@^1.2.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
- integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07"
+ integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==
fast-deep-equal@2.0.1:
version "2.0.1"
@@ -6379,9 +6390,9 @@ flush-write-stream@^1.0.0:
readable-stream "^2.3.6"
follow-redirects@^1.0.0, follow-redirects@^1.14.0:
- version "1.14.5"
- resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.5.tgz#f09a5848981d3c772b5392309778523f8d85c381"
- integrity sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==
+ version "1.14.6"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.6.tgz#8cfb281bbc035b3c067d6cd975b0f6ade6e855cd"
+ integrity sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==
for-each@^0.3.3:
version "0.3.3"
@@ -6570,19 +6581,19 @@ functional-red-black-tree@^1.0.1:
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
-gauge@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.1.tgz#4bea07bcde3782f06dced8950e51307aa0f4a346"
- integrity sha512-6STz6KdQgxO4S/ko+AbjlFGGdGcknluoqU+79GOFCDqqyYj5OanQf9AjxwN0jCidtT+ziPMmPSt9E4hfQ0CwIQ==
+gauge@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.0.tgz#afba07aa0374a93c6219603b1fb83eaa2264d8f8"
+ integrity sha512-F8sU45yQpjQjxKkm1UOAhf0U/O0aFt//Fl7hsrNVto+patMHjs7dPI9mFOGUKbhrgKm0S3EjW3scMFuQmWSROw==
dependencies:
+ ansi-regex "^5.0.1"
aproba "^1.0.3 || ^2.0.0"
color-support "^1.1.2"
console-control-strings "^1.0.0"
has-unicode "^2.0.1"
- object-assign "^4.1.1"
signal-exit "^3.0.0"
- string-width "^1.0.1 || ^2.0.0"
- strip-ansi "^3.0.1 || ^4.0.0"
+ string-width "^4.2.3"
+ strip-ansi "^6.0.1"
wide-align "^1.1.2"
gauge@~2.7.3:
@@ -7036,9 +7047,9 @@ html-webpack-plugin@4.0.0-beta.11:
util.promisify "1.0.0"
html2canvas@^1.0.0-rc.5:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/html2canvas/-/html2canvas-1.3.2.tgz#951cc8388a3ce939fdac02131007ee28124afc27"
- integrity sha512-4+zqv87/a1LsaCrINV69wVLGG8GBZcYBboz1JPWEgiXcWoD9kroLzccsBRU/L9UlfV2MAZ+3J92U9IQPVMDeSQ==
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/html2canvas/-/html2canvas-1.3.3.tgz#f01531f9bf7c73a771c5ee73b4a5cab6576bf876"
+ integrity sha512-nQi0ayEY1cMiUMbq/F5hRwMAqsRMo7NIP6VaCqaXnXO6b/FfZO49oSfIJjdyRha28EuY8D6FBCzQOXPQV0TCrA==
dependencies:
css-line-break "2.0.1"
text-segmentation "^1.0.2"
@@ -7054,9 +7065,9 @@ htmlparser2@^6.1.0:
entities "^2.0.0"
htmlparser2@^7.0:
- version "7.1.2"
- resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-7.1.2.tgz#587923d38f03bc89e03076e00cba2c7473f37f7c"
- integrity sha512-d6cqsbJba2nRdg8WW2okyD4ceonFHn9jLFxhwlNcLhQWcFPdxXeJulgOLjLKtAK9T6ahd+GQNZwG9fjmGW7lyg==
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-7.2.0.tgz#8817cdea38bbc324392a90b1990908e81a65f5a5"
+ integrity sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==
dependencies:
domelementtype "^2.0.1"
domhandler "^4.2.2"
@@ -7106,9 +7117,9 @@ http-errors@~1.7.2:
toidentifier "1.0.0"
http-parser-js@>=0.5.1:
- version "0.5.3"
- resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9"
- integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.5.tgz#d7c30d5d3c90d865b4a2e870181f9d6f22ac7ac5"
+ integrity sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==
http-proxy-agent@^4.0.1:
version "4.0.1"
@@ -7592,7 +7603,7 @@ is-color-stop@^1.0.0:
rgb-regex "^1.0.1"
rgba-regex "^1.0.0"
-is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.7.0:
+is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.8.0:
version "2.8.0"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548"
integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==
@@ -7999,9 +8010,9 @@ istanbul-reports@^2.2.6:
html-escaper "^2.0.0"
istanbul-reports@^3.0.2:
- version "3.0.5"
- resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.5.tgz#a2580107e71279ea6d661ddede929ffc6d693384"
- integrity sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.1.tgz#7085857f17d2441053c6ce5c3b8fdf6882289397"
+ integrity sha512-q1kvhAXWSsXfMjCdNHNPKZZv94OlspKnoGv+R9RGbnqOOQ0VbNfLFgQDVgi7hHenKsndGq3/o0OBdzDXthWcNw==
dependencies:
html-escaper "^2.0.0"
istanbul-lib-report "^3.0.0"
@@ -8924,10 +8935,10 @@ json-schema-traverse@^0.4.1:
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
-json-schema@0.2.3:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
- integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
+json-schema@0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5"
+ integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==
json-stable-stringify-without-jsonify@^1.0.1:
version "1.0.1"
@@ -9011,13 +9022,13 @@ jspdf@2.1.0:
html2canvas "^1.0.0-rc.5"
jsprim@^1.2.2:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
- integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb"
+ integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==
dependencies:
assert-plus "1.0.0"
extsprintf "1.3.0"
- json-schema "0.2.3"
+ json-schema "0.4.0"
verror "1.10.0"
jss-camel-case@^6.1.0:
@@ -9059,69 +9070,69 @@ jss-nested@^6.0.1:
warning "^3.0.0"
jss-plugin-camel-case@^10.5.1:
- version "10.8.2"
- resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.8.2.tgz#8d7f915c8115afaff8cbde08faf610ec9892fba6"
- integrity sha512-2INyxR+1UdNuKf4v9It3tNfPvf7IPrtkiwzofeKuMd5D58/dxDJVUQYRVg/n460rTlHUfsEQx43hDrcxi9dSPA==
+ version "10.9.0"
+ resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.9.0.tgz#4921b568b38d893f39736ee8c4c5f1c64670aaf7"
+ integrity sha512-UH6uPpnDk413/r/2Olmw4+y54yEF2lRIV8XIZyuYpgPYTITLlPOsq6XB9qeqv+75SQSg3KLocq5jUBXW8qWWww==
dependencies:
"@babel/runtime" "^7.3.1"
hyphenate-style-name "^1.0.3"
- jss "10.8.2"
+ jss "10.9.0"
jss-plugin-default-unit@^10.5.1:
- version "10.8.2"
- resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.8.2.tgz#c66f12e02e0815d911b85c02c2a979ee7b4ce69a"
- integrity sha512-UZ7cwT9NFYSG+SEy7noRU50s4zifulFdjkUNKE+u6mW7vFP960+RglWjTgMfh79G6OENZmaYnjHV/gcKV4nSxg==
+ version "10.9.0"
+ resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.9.0.tgz#bb23a48f075bc0ce852b4b4d3f7582bc002df991"
+ integrity sha512-7Ju4Q9wJ/MZPsxfu4T84mzdn7pLHWeqoGd/D8O3eDNNJ93Xc8PxnLmV8s8ZPNRYkLdxZqKtm1nPQ0BM4JRlq2w==
dependencies:
"@babel/runtime" "^7.3.1"
- jss "10.8.2"
+ jss "10.9.0"
jss-plugin-global@^10.5.1:
- version "10.8.2"
- resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.8.2.tgz#1a35632a693cf50113bcc5ffe6b51969df79c4ec"
- integrity sha512-UaYMSPsYZ7s/ECGoj4KoHC2jwQd5iQ7K+FFGnCAILdQrv7hPmvM2Ydg45ThT/sH46DqktCRV2SqjRuxeBH8nRA==
+ version "10.9.0"
+ resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.9.0.tgz#fc07a0086ac97aca174e37edb480b69277f3931f"
+ integrity sha512-4G8PHNJ0x6nwAFsEzcuVDiBlyMsj2y3VjmFAx/uHk/R/gzJV+yRHICjT4MKGGu1cJq2hfowFWCyrr/Gg37FbgQ==
dependencies:
"@babel/runtime" "^7.3.1"
- jss "10.8.2"
+ jss "10.9.0"
jss-plugin-nested@^10.5.1:
- version "10.8.2"
- resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.8.2.tgz#79f3c7f75ea6a36ae72fe52e777035bb24d230c7"
- integrity sha512-acRvuPJOb930fuYmhkJaa994EADpt8TxI63Iyg96C8FJ9T2xRyU5T6R1IYKRwUiqZo+2Sr7fdGzRTDD4uBZaMA==
+ version "10.9.0"
+ resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.9.0.tgz#cc1c7d63ad542c3ccc6e2c66c8328c6b6b00f4b3"
+ integrity sha512-2UJnDrfCZpMYcpPYR16oZB7VAC6b/1QLsRiAutOt7wJaaqwCBvNsosLEu/fUyKNQNGdvg2PPJFDO5AX7dwxtoA==
dependencies:
"@babel/runtime" "^7.3.1"
- jss "10.8.2"
+ jss "10.9.0"
tiny-warning "^1.0.2"
jss-plugin-props-sort@^10.5.1:
- version "10.8.2"
- resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.8.2.tgz#e25a7471868652c394562b6dc5433dcaea7dff6f"
- integrity sha512-wqdcjayKRWBZnNpLUrXvsWqh+5J5YToAQ+8HNBNw0kZxVvCDwzhK2Nx6AKs7p+5/MbAh2PLgNW5Ym/ysbVAuqQ==
+ version "10.9.0"
+ resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.9.0.tgz#30e9567ef9479043feb6e5e59db09b4de687c47d"
+ integrity sha512-7A76HI8bzwqrsMOJTWKx/uD5v+U8piLnp5bvru7g/3ZEQOu1+PjHvv7bFdNO3DwNPC9oM0a//KwIJsIcDCjDzw==
dependencies:
"@babel/runtime" "^7.3.1"
- jss "10.8.2"
+ jss "10.9.0"
jss-plugin-rule-value-function@^10.5.1:
- version "10.8.2"
- resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.8.2.tgz#55354b55f1b2968a15976729968f767f02d64049"
- integrity sha512-bW0EKAs+0HXpb6BKJhrn94IDdiWb0CnSluTkh0rGEgyzY/nmD1uV/Wf6KGlesGOZ9gmJzQy+9FFdxIUID1c9Ug==
+ version "10.9.0"
+ resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.9.0.tgz#379fd2732c0746fe45168011fe25544c1a295d67"
+ integrity sha512-IHJv6YrEf8pRzkY207cPmdbBstBaE+z8pazhPShfz0tZSDtRdQua5jjg6NMz3IbTasVx9FdnmptxPqSWL5tyJg==
dependencies:
"@babel/runtime" "^7.3.1"
- jss "10.8.2"
+ jss "10.9.0"
tiny-warning "^1.0.2"
jss-plugin-vendor-prefixer@^10.5.1:
- version "10.8.2"
- resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.8.2.tgz#ebb4a482642f34091e454901e21176441dd5f475"
- integrity sha512-DeGv18QsSiYLSVIEB2+l0af6OToUe0JB+trpzUxyqD2QRC/5AzzDrCrYffO5AHZ81QbffYvSN/pkfZaTWpRXlg==
+ version "10.9.0"
+ resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.9.0.tgz#aa9df98abfb3f75f7ed59a3ec50a5452461a206a"
+ integrity sha512-MbvsaXP7iiVdYVSEoi+blrW+AYnTDvHTW6I6zqi7JcwXdc6I9Kbm234nEblayhF38EftoenbM+5218pidmC5gA==
dependencies:
"@babel/runtime" "^7.3.1"
css-vendor "^2.0.8"
- jss "10.8.2"
+ jss "10.9.0"
-jss@10.8.2, jss@^10.5.1:
- version "10.8.2"
- resolved "https://registry.yarnpkg.com/jss/-/jss-10.8.2.tgz#4b2a30b094b924629a64928236017a52c7c97505"
- integrity sha512-FkoUNxI329CKQ9OQC8L72MBF9KPf5q8mIupAJ5twU7G7XREW7ahb+7jFfrjZ4iy1qvhx1HwIWUIvkZBDnKkEdQ==
+jss@10.9.0, jss@^10.5.1:
+ version "10.9.0"
+ resolved "https://registry.yarnpkg.com/jss/-/jss-10.9.0.tgz#7583ee2cdc904a83c872ba695d1baab4b59c141b"
+ integrity sha512-YpzpreB6kUunQBbrlArlsMpXYyndt9JATbt95tajx0t4MTJJcCJdd4hdNpHmOIDiUJrF/oX5wtVFrS3uofWfGw==
dependencies:
"@babel/runtime" "^7.3.1"
csstype "^3.0.2"
@@ -9145,7 +9156,7 @@ jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3:
array-includes "^3.1.1"
object.assign "^4.1.0"
-"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.1.0:
+"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz#720b97bfe7d901b927d87c3773637ae8ea48781b"
integrity sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==
@@ -9163,15 +9174,15 @@ jszip@^3.5.0:
readable-stream "~2.3.6"
set-immediate-shim "~1.0.1"
-just-diff-apply@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-3.1.0.tgz#400a3a1c8e169e9087d39f227945e04dc132587c"
- integrity sha512-fkpeq7isgxggMy86MfjM25LRqtAnkhEfS22qfkkjZ+PIjGHScv/0CpLMJ30G+ARanX5E77JyL4+1IXK1qXHkEg==
+just-diff-apply@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-4.0.1.tgz#da89c5a4ccb14aa8873c70e2c3b6695cef45dab5"
+ integrity sha512-AKOkzB5P6FkfP21UlZVX/OPXx/sC2GagpLX9cBxqHqDuRjwmZ/AJRKSNrB9jHPpRW1W1ONs6gly1gW46t055nQ==
-just-diff@^3.0.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-3.1.1.tgz#d50c597c6fd4776495308c63bdee1b6839082647"
- integrity sha512-sdMWKjRq8qWZEjDcVA6llnUT8RDEBIfOiGpYFPYa9u+2c39JCsejktSP7mj5eRid5EIvTzIpQ2kDOCw1Nq9BjQ==
+just-diff@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-5.0.1.tgz#db8fe1cfeea1156f2374bfb289826dca28e7e390"
+ integrity sha512-X00TokkRIDotUIf3EV4xUm6ELc/IkqhS/vPSHdWnsM5y0HoNMfEqrazizI7g78lpHvnRSRt/PFfKtRqJCOGIuQ==
killable@^1.0.1:
version "1.0.1"
@@ -9404,9 +9415,9 @@ lie@~3.3.0:
immediate "~3.0.5"
lines-and-columns@^1.1.6:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
- integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
+ integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
listify@^1.0.0:
version "1.0.3"
@@ -9465,9 +9476,9 @@ loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0:
json5 "^1.0.1"
loader-utils@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.1.tgz#3b8d4386f42378d6434d32d7bc08e7a52d39575e"
- integrity sha512-g4miPa9uUrZz4iElkaVJgDFwKJGh8aQGM7pUL4ejXl6cu7kSb30seQOVGNMP6sW8j7DW77X68hJZ+GM7UGhXeQ==
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129"
+ integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==
dependencies:
big.js "^5.2.2"
emojis-list "^3.0.0"
@@ -9576,9 +9587,9 @@ log-symbols@^2.2.0:
chalk "^2.0.1"
loglevel@^1.6.8:
- version "1.7.1"
- resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197"
- integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114"
+ integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==
longest-streak@^2.0.1:
version "2.0.4"
@@ -9874,17 +9885,17 @@ miller-rabin@^4.0.0:
bn.js "^4.0.0"
brorand "^1.0.1"
-mime-db@1.50.0, "mime-db@>= 1.43.0 < 2":
- version "1.50.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f"
- integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==
+mime-db@1.51.0, "mime-db@>= 1.43.0 < 2":
+ version "1.51.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c"
+ integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==
mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24:
- version "2.1.33"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.33.tgz#1fa12a904472fafd068e48d9e8401f74d3f70edb"
- integrity sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==
+ version "2.1.34"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24"
+ integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==
dependencies:
- mime-db "1.50.0"
+ mime-db "1.51.0"
mime@1.6.0:
version "1.6.0"
@@ -9892,9 +9903,9 @@ mime@1.6.0:
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
mime@^2.4.4:
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe"
- integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367"
+ integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==
mimic-fn@^1.0.0:
version "1.2.0"
@@ -9993,9 +10004,9 @@ minipass-sized@^1.0.3:
minipass "^3.0.0"
minipass@*, minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3:
- version "3.1.5"
- resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.5.tgz#71f6251b0a33a49c01b3cf97ff77eda030dff732"
- integrity sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==
+ version "3.1.6"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee"
+ integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==
dependencies:
yallist "^4.0.0"
@@ -10204,16 +10215,16 @@ node-forge@^0.10.0:
integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==
node-gyp@*, node-gyp@^8.2.0:
- version "8.3.0"
- resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.3.0.tgz#ebc36a146d45095e1c6af6ccb0e47d1c8fc3fe69"
- integrity sha512-e+vmKyTiybKgrmvs4M2REFKCnOd+NcrAAnn99Yko6NQA+zZdMlRvbIUHojfsHrSQ1CddLgZnHicnEVgDHziJzA==
+ version "8.4.1"
+ resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937"
+ integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==
dependencies:
env-paths "^2.2.0"
glob "^7.1.4"
graceful-fs "^4.2.6"
make-fetch-happen "^9.1.0"
nopt "^5.0.0"
- npmlog "^4.1.2"
+ npmlog "^6.0.0"
rimraf "^3.0.2"
semver "^7.3.5"
tar "^6.1.2"
@@ -10269,11 +10280,6 @@ node-libs-browser@^2.2.1:
util "^0.11.0"
vm-browserify "^1.0.1"
-node-modules-regexp@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40"
- integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=
-
node-notifier@^5.4.2:
version "5.4.5"
resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.5.tgz#0cbc1a2b0f658493b4025775a13ad938e96091ef"
@@ -10438,7 +10444,19 @@ npm-profile@*:
dependencies:
npm-registry-fetch "^11.0.0"
-npm-registry-fetch@*, npm-registry-fetch@^11.0.0:
+npm-registry-fetch@*:
+ version "12.0.0"
+ resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-12.0.0.tgz#53d8c94f7c37293707b23728864710b76d3a3ca5"
+ integrity sha512-nd1I90UHoETjgWpo3GbcoM1l2S4JCUpzDcahU4x/GVCiDQ6yRiw2KyDoPVD8+MqODbPtWwHHGiyc4O5sgdEqPQ==
+ dependencies:
+ make-fetch-happen "^9.0.1"
+ minipass "^3.1.3"
+ minipass-fetch "^1.3.0"
+ minipass-json-stream "^1.0.1"
+ minizlib "^2.0.0"
+ npm-package-arg "^8.0.0"
+
+npm-registry-fetch@^11.0.0:
version "11.0.0"
resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz#68c1bb810c46542760d62a6a965f85a702d43a76"
integrity sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==
@@ -10545,14 +10563,14 @@ npm@^7.20.1:
which "^2.0.2"
write-file-atomic "^3.0.3"
-npmlog@*:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0"
- integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==
+npmlog@*, npmlog@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.0.tgz#ba9ef39413c3d936ea91553db7be49c34ad0520c"
+ integrity sha512-03ppFRGlsyUaQFbGC2C8QWJN/C/K7PsfyD9aQdhVKAQIH4sQBc8WASqFBP7O+Ut4d2oo5LoeoboB3cGdBZSp6Q==
dependencies:
are-we-there-yet "^2.0.0"
console-control-strings "^1.1.0"
- gauge "^3.0.0"
+ gauge "^4.0.0"
set-blocking "^2.0.0"
npmlog@^4.1.2:
@@ -10619,9 +10637,9 @@ object-hash@^2.0.1:
integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==
object-inspect@^1.11.0, object-inspect@^1.9.0:
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1"
- integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.1.tgz#d4bd7d7de54b9a75599f59a00bd698c1f1c6549b"
+ integrity sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA==
object-is@^1.0.1:
version "1.1.5"
@@ -10653,7 +10671,7 @@ object.assign@^4.1.0, object.assign@^4.1.2:
has-symbols "^1.0.1"
object-keys "^1.1.1"
-object.entries@^1.1.0, object.entries@^1.1.1, object.entries@^1.1.4:
+object.entries@^1.1.0, object.entries@^1.1.1, object.entries@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861"
integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==
@@ -10662,7 +10680,7 @@ object.entries@^1.1.0, object.entries@^1.1.1, object.entries@^1.1.4:
define-properties "^1.1.3"
es-abstract "^1.19.1"
-object.fromentries@^2.0.2, object.fromentries@^2.0.4:
+object.fromentries@^2.0.2, object.fromentries@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251"
integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==
@@ -10680,7 +10698,7 @@ object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0
define-properties "^1.1.3"
es-abstract "^1.19.1"
-object.hasown@^1.0.0:
+object.hasown@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.0.tgz#7232ed266f34d197d15cac5880232f7a4790afe5"
integrity sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==
@@ -10695,7 +10713,7 @@ object.pick@^1.3.0:
dependencies:
isobject "^3.0.1"
-object.values@^1.1.0, object.values@^1.1.1, object.values@^1.1.4, object.values@^1.1.5:
+object.values@^1.1.0, object.values@^1.1.1, object.values@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac"
integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==
@@ -10924,7 +10942,7 @@ p-try@^2.0.0:
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
-pacote@*, pacote@^12.0.0:
+pacote@*, pacote@^12.0.0, pacote@^12.0.2:
version "12.0.2"
resolved "https://registry.yarnpkg.com/pacote/-/pacote-12.0.2.tgz#14ae30a81fe62ec4fc18c071150e6763e932527c"
integrity sha512-Ar3mhjcxhMzk+OVZ8pbnXdb0l8+pimvlsqBGRNkble2NVgyqOGE3yrCGi/lAYq7E7NRDMz89R1Wx5HIMCGgeYg==
@@ -11014,14 +11032,14 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5:
pbkdf2 "^3.0.3"
safe-buffer "^5.1.1"
-parse-conflict-json@*, parse-conflict-json@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-1.1.1.tgz#54ec175bde0f2d70abf6be79e0e042290b86701b"
- integrity sha512-4gySviBiW5TRl7XHvp1agcS7SOe0KZOjC//71dzZVWJrY9hCrgtvl5v3SyIxCZ4fZF47TxD9nfzmxcx76xmbUw==
+parse-conflict-json@*, parse-conflict-json@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-2.0.1.tgz#76647dd072e6068bcaff20be6ccea68a18e1fb58"
+ integrity sha512-Y7nYw+QaSGBto1LB9lgwOR05Rtz5SbuTf+Oe7HJ6SYQ/DHsvRjQ8O03oWdJbvkt6GzDWospgyZbGmjDYL0sDgA==
dependencies:
- json-parse-even-better-errors "^2.3.0"
- just-diff "^3.0.1"
- just-diff-apply "^3.0.0"
+ json-parse-even-better-errors "^2.3.1"
+ just-diff "^5.0.1"
+ just-diff-apply "^4.0.1"
parse-entities@^1.0.2, parse-entities@^1.1.0:
version "1.2.2"
@@ -11228,11 +11246,9 @@ pinkie@^2.0.0:
integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
pirates@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87"
- integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==
- dependencies:
- node-modules-regexp "^1.0.0"
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.4.tgz#07df81e61028e402735cdd49db701e4885b4e6e6"
+ integrity sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==
pkg-dir@^1.0.0:
version "1.0.0"
@@ -11903,9 +11919,9 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4:
uniq "^1.0.1"
postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2:
- version "6.0.6"
- resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea"
- integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==
+ version "6.0.7"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.7.tgz#48404830a635113a71fd79397de8209ed05a66fc"
+ integrity sha512-U+b/Deoi4I/UmE6KOVPpnhS7I7AYdKbhGcat+qTQ27gycvaACvNEw11ba6RrkwVmDVRW7sigWgLj4/KbbJjeDA==
dependencies:
cssesc "^3.0.0"
util-deprecate "^1.0.2"
@@ -11934,9 +11950,9 @@ postcss-value-parser@^3.0.0:
integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
- integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
+ integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1:
version "2.0.1"
@@ -13534,9 +13550,9 @@ side-channel@^1.0.4:
object-inspect "^1.9.0"
signal-exit@^3.0.0, signal-exit@^3.0.2:
- version "3.0.5"
- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f"
- integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af"
+ integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==
simple-swizzle@^0.2.2:
version "0.2.2"
@@ -13643,18 +13659,18 @@ sockjs@0.3.20:
websocket-driver "0.6.5"
sockjs@^0.3.21:
- version "0.3.21"
- resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz#b34ffb98e796930b60a0cfa11904d6a339a7d417"
- integrity sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==
+ version "0.3.24"
+ resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce"
+ integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==
dependencies:
faye-websocket "^0.11.3"
- uuid "^3.4.0"
+ uuid "^8.3.2"
websocket-driver "^0.7.4"
socks-proxy-agent@^6.0.0:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.0.tgz#869cf2d7bd10fea96c7ad3111e81726855e285c3"
- integrity sha512-57e7lwCN4Tzt3mXz25VxOErJKXlPfXmkMLnk310v/jwW20jWRVcgsOit+xNkN3eIEdB47GwnfAEBLacZ/wVIKg==
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz#e664e8f1aaf4e1fb3df945f09e3d94f911137f87"
+ integrity sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==
dependencies:
agent-base "^6.0.2"
debug "^4.3.1"
@@ -13692,9 +13708,9 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2:
urix "^0.1.0"
source-map-support@^0.5.6, source-map-support@~0.5.12:
- version "0.5.20"
- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9"
- integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==
+ version "0.5.21"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
dependencies:
buffer-from "^1.0.0"
source-map "^0.6.0"
@@ -13751,9 +13767,9 @@ spdx-expression-parse@^3.0.0:
spdx-license-ids "^3.0.0"
spdx-license-ids@^3.0.0:
- version "3.0.10"
- resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz#0d9becccde7003d6c658d487dd48a32f0bf3014b"
- integrity sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==
+ version "3.0.11"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95"
+ integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==
spdy-transport@^3.0.0:
version "3.0.0"
@@ -13956,14 +13972,6 @@ string-width@^1.0.1:
is-fullwidth-code-point "^1.0.0"
strip-ansi "^3.0.0"
-"string-width@^1.0.1 || ^2.0.0", string-width@^2.1.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
- integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
- dependencies:
- is-fullwidth-code-point "^2.0.0"
- strip-ansi "^4.0.0"
-
"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
@@ -13973,6 +13981,14 @@ string-width@^1.0.1:
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
+string-width@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
string-width@^3.0.0, string-width@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
@@ -13982,7 +13998,7 @@ string-width@^3.0.0, string-width@^3.1.0:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^5.1.0"
-string.prototype.matchall@^4.0.2, string.prototype.matchall@^4.0.5:
+string.prototype.matchall@^4.0.2, string.prototype.matchall@^4.0.6:
version "4.0.6"
resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa"
integrity sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==
@@ -14071,7 +14087,7 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1:
dependencies:
ansi-regex "^2.0.0"
-"strip-ansi@^3.0.1 || ^4.0.0", strip-ansi@^4.0.0:
+strip-ansi@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
@@ -14366,9 +14382,9 @@ timsort@^0.3.0:
integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
tiny-invariant@^1.0.6:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875"
- integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9"
+ integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==
tiny-relative-date@*:
version "1.3.0"
@@ -14516,9 +14532,9 @@ ts-pnp@^1.1.6:
integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==
tsconfig-paths@^3.11.0:
- version "3.11.0"
- resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz#954c1fe973da6339c78e06b03ce2e48810b65f36"
- integrity sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz#19769aca6ee8f6a1a341e38c8fa45dd9fb18899b"
+ integrity sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==
dependencies:
"@types/json5" "^0.0.29"
json5 "^1.0.1"
@@ -14927,7 +14943,7 @@ uuid@^3.3.2, uuid@^3.4.0:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
-uuid@^8.3.0:
+uuid@^8.3.0, uuid@^8.3.2:
version "8.3.2"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
@@ -15165,11 +15181,11 @@ webpack-dev-server@3.11.0:
yargs "^13.3.2"
webpack-dev-server@^3.2.1:
- version "3.11.2"
- resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz#695ebced76a4929f0d5de7fd73fafe185fe33708"
- integrity sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==
+ version "3.11.3"
+ resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz#8c86b9d2812bf135d3c9bce6f07b718e30f7c3d3"
+ integrity sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==
dependencies:
- ansi-html "0.0.7"
+ ansi-html-community "0.0.8"
bonjour "^3.5.0"
chokidar "^2.1.8"
compression "^1.7.4"
@@ -15623,9 +15639,9 @@ ws@^6.1.2, ws@^6.2.1:
async-limiter "~1.0.0"
ws@^7.4.6:
- version "7.5.5"
- resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881"
- integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==
+ version "7.5.6"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b"
+ integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==
x-is-string@^0.1.0:
version "0.1.0"
@@ -15700,10 +15716,10 @@ yargs-parser@^18.1.2:
camelcase "^5.0.0"
decamelize "^1.2.0"
-yargs-parser@^20.2.2:
- version "20.2.9"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
- integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
+yargs-parser@^21.0.0:
+ version "21.0.0"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.0.tgz#a485d3966be4317426dd56bdb6a30131b281dc55"
+ integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==
yargs@^13.3.0, yargs@^13.3.2:
version "13.3.2"
@@ -15739,14 +15755,14 @@ yargs@^15.4.1:
yargs-parser "^18.1.2"
yargs@^17.0.1:
- version "17.2.1"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.2.1.tgz#e2c95b9796a0e1f7f3bf4427863b42e0418191ea"
- integrity sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==
+ version "17.3.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.3.0.tgz#295c4ffd0eef148ef3e48f7a2e0f58d0e4f26b1c"
+ integrity sha512-GQl1pWyDoGptFPJx9b9L6kmR33TGusZvXIZUT+BOz9f7X2L94oeAskFYLEg/FkhV06zZPBYLvLZRWeYId29lew==
dependencies:
cliui "^7.0.2"
escalade "^3.1.1"
get-caller-file "^2.0.5"
require-directory "^2.1.1"
- string-width "^4.2.0"
+ string-width "^4.2.3"
y18n "^5.0.5"
- yargs-parser "^20.2.2"
+ yargs-parser "^21.0.0"