[SPARK-35175][BUILD] Add linter for JavaScript source files

### What changes were proposed in this pull request?

This PR proposes to add linter for JavaScript source files.
[ESLint](https://eslint.org/) seems to be a popular linter for JavaScript so I choose it.

### Why are the changes needed?

Linter enables us to check style and keeps code clean.

### Does this PR introduce _any_ user-facing change?

No.

### How was this patch tested?

Manually run `dev/lint-js` (Node.js and npm are required).

In this PR, mainly indentation style is also fixed an linter passes.

Closes #32274 from sarutak/introduce-eslint.

Authored-by: Kousuke Saruta <sarutak@oss.nttdata.com>
Signed-off-by: Kousuke Saruta <sarutak@oss.nttdata.com>
This commit is contained in:
Kousuke Saruta 2021-05-07 21:55:08 +09:00
parent d3b92eec45
commit 2634dbac35
19 changed files with 3491 additions and 2358 deletions

4
.gitignore vendored
View file

@ -54,6 +54,7 @@ sql/docs
sql/site
lib_managed/
lint-r-report.log
lint-js-report.log
log/
logs/
out/
@ -105,3 +106,6 @@ spark-warehouse/
# For SBT
.jvmopts
# For Node.js
node_modules

View file

@ -15,11 +15,17 @@
* limitations under the License.
*/
/* global $, Mustache, createRESTEndPointForExecutorsPage, createRESTEndPointForMiscellaneousProcess, */
/* global createTemplateURI, formatBytes, formatDuration, formatLogsCells, getStandAloneAppId, */
/* global jQuery, setDataTableDefaults */
var threadDumpEnabled = false;
/* eslint-disable no-unused-vars */
function setThreadDumpEnabled(val) {
threadDumpEnabled = val;
}
/* eslint-enable no-unused-vars */
function getThreadDumpEnabled() {
return threadDumpEnabled;
@ -53,7 +59,7 @@ function formatResourceCells(resources) {
if (count > 0) {
result += ", "
}
result += name + ': [' + resInfo.addresses.join(", ") + ']'
result += name + ': [' + resInfo.addresses.join(", ") + ']';
count += 1
});
return result
@ -61,7 +67,7 @@ function formatResourceCells(resources) {
jQuery.extend(jQuery.fn.dataTableExt.oSort, {
"title-numeric-pre": function (a) {
var x = a.match(/title="*(-?[0-9\.]+)/)[1];
var x = a.match(/title="*(-?[0-9.]+)/)[1];
return parseFloat(x);
},
@ -154,7 +160,7 @@ $(document).ready(function () {
getStandAloneAppId(function (appId) {
var endPoint = createRESTEndPointForExecutorsPage(appId);
$.getJSON(endPoint, function (response, status, jqXHR) {
$.getJSON(endPoint, function (response, _ignored_status, _ignored_jqXHR) {
var allExecCnt = 0;
var allRDDBlocks = 0;
var allMemoryUsed = 0;
@ -229,6 +235,8 @@ $(document).ready(function () {
totalOffHeapStorageMemory: 0
};
// TODO: Replace hasOwnProperty with prototype.hasOwnProperty after we find it's safe to do.
/* eslint-disable no-prototype-builtins */
exec.memoryMetrics = exec.hasOwnProperty('memoryMetrics') ? exec.memoryMetrics : memoryMetrics;
});
@ -497,7 +505,7 @@ $(document).ready(function () {
{name: 'resourceProfileIdCol', data: 'resourceProfileId'},
{
data: 'activeTasks',
"fnCreatedCell": function (nTd, sData, oData, iRow, iCol) {
"fnCreatedCell": function (nTd, sData, oData, _ignored_iRow, _ignored_iCol) {
if (sData > 0) {
$(nTd).css('color', 'white');
$(nTd).css('background', activeTasksStyle(oData.activeTasks, oData.maxTasks));
@ -506,7 +514,7 @@ $(document).ready(function () {
},
{
data: 'failedTasks',
"fnCreatedCell": function (nTd, sData, oData, iRow, iCol) {
"fnCreatedCell": function (nTd, sData, oData, _ignored_iRow, _ignored_iCol) {
if (sData > 0) {
$(nTd).css('color', 'white');
$(nTd).css('background', failedTasksStyle(oData.failedTasks, oData.totalTasks));
@ -519,7 +527,7 @@ $(document).ready(function () {
data: function (row, type) {
return type === 'display' ? (formatDuration(row.totalDuration) + ' (' + formatDuration(row.totalGCTime) + ')') : row.totalDuration
},
"fnCreatedCell": function (nTd, sData, oData, iRow, iCol) {
"fnCreatedCell": function (nTd, sData, oData, _ignored_iRow, _ignored_iCol) {
if (oData.totalDuration > 0) {
$(nTd).css('color', totalDurationColor(oData.totalGCTime, oData.totalDuration));
$(nTd).css('background', totalDurationStyle(oData.totalGCTime, oData.totalDuration));
@ -557,9 +565,9 @@ $(document).ready(function () {
$('#active-executors [data-toggle="tooltip"]').tooltip();
// This section should be visible once API gives the response.
$('.active-process-container').hide()
$('.active-process-container').hide();
var endPoint = createRESTEndPointForMiscellaneousProcess(appId);
$.getJSON(endPoint, function( response, status, jqXHR ) {
$.getJSON(endPoint, function( response, _ignored_status, _ignored_jqXHR ) {
if (response.length) {
var processSummaryResponse = response;
var processSummaryConf = {
@ -603,7 +611,7 @@ $(document).ready(function () {
"columns": [
{
data: 'execCnt',
"fnCreatedCell": function (nTd, sData, oData, iRow, iCol) {
"fnCreatedCell": function (nTd, _ignored_sData, _ignored_oData, _ignored_iRow, _ignored_iCol) {
$(nTd).css('font-weight', 'bold');
}
},
@ -611,7 +619,7 @@ $(document).ready(function () {
{
data: function (row, type) {
if (type !== 'display')
return row.allMemoryUsed
return row.allMemoryUsed;
else
return (formatBytes(row.allMemoryUsed, type) + ' / ' +
formatBytes(row.allMaxMemory, type));
@ -639,7 +647,7 @@ $(document).ready(function () {
{data: 'allTotalCores'},
{
data: 'allActiveTasks',
"fnCreatedCell": function (nTd, sData, oData, iRow, iCol) {
"fnCreatedCell": function (nTd, sData, oData, _ignored_iRow, _ignored_iCol) {
if (sData > 0) {
$(nTd).css('color', 'white');
$(nTd).css('background', activeTasksStyle(oData.allActiveTasks, oData.allMaxTasks));
@ -648,7 +656,7 @@ $(document).ready(function () {
},
{
data: 'allFailedTasks',
"fnCreatedCell": function (nTd, sData, oData, iRow, iCol) {
"fnCreatedCell": function (nTd, sData, oData, _ignored_iRow, _ignored_iCol) {
if (sData > 0) {
$(nTd).css('color', 'white');
$(nTd).css('background', failedTasksStyle(oData.allFailedTasks, oData.allTotalTasks));
@ -661,7 +669,7 @@ $(document).ready(function () {
data: function (row, type) {
return type === 'display' ? (formatDuration(row.allTotalDuration) + ' (' + formatDuration(row.allTotalGCTime) + ')') : row.allTotalDuration
},
"fnCreatedCell": function (nTd, sData, oData, iRow, iCol) {
"fnCreatedCell": function (nTd, sData, oData, _ignored_iRow, _ignored_iCol) {
if (oData.allTotalDuration > 0) {
$(nTd).css('color', totalDurationColor(oData.allTotalGCTime, oData.allTotalDuration));
$(nTd).css('background', totalDurationStyle(oData.allTotalGCTime, oData.allTotalDuration));

View file

@ -15,6 +15,8 @@
* limitations under the License.
*/
/* global $, formatTimeMillis, getTimeZone */
$(document).ready(function() {
if ($('#last-updated').length) {
var lastUpdatedMillis = Number($('#last-updated').text());

View file

@ -15,11 +15,15 @@
* limitations under the License.
*/
/* global $, Mustache, formatDuration, formatTimeMillis, jQuery, uiRoot */
var appLimit = -1;
/* eslint-disable no-unused-vars */
function setAppLimit(val) {
appLimit = val;
}
/* eslint-enable no-unused-vars*/
function makeIdNumeric(id) {
var strs = id.split("_");
@ -57,7 +61,7 @@ function getColumnIndex(columns, columnName) {
jQuery.extend( jQuery.fn.dataTableExt.oSort, {
"title-numeric-pre": function ( a ) {
var x = a.match(/title="*(-?[0-9\.]+)/)[1];
var x = a.match(/title="*(-?[0-9.]+)/)[1];
return parseFloat( x );
},
@ -68,11 +72,11 @@ jQuery.extend( jQuery.fn.dataTableExt.oSort, {
"title-numeric-desc": function ( a, b ) {
return ((a < b) ? 1 : ((a > b) ? -1 : 0));
}
} );
});
jQuery.extend( jQuery.fn.dataTableExt.oSort, {
"appid-numeric-pre": function ( a ) {
var x = a.match(/title="*(-?[0-9a-zA-Z\-\_]+)/)[1];
var x = a.match(/title="*(-?[0-9a-zA-Z\-_]+)/)[1];
return makeIdNumeric(x);
},
@ -83,13 +87,13 @@ jQuery.extend( jQuery.fn.dataTableExt.oSort, {
"appid-numeric-desc": function ( a, b ) {
return ((a < b) ? 1 : ((a > b) ? -1 : 0));
}
} );
});
jQuery.extend( jQuery.fn.dataTableExt.ofnSearch, {
"appid-numeric": function ( a ) {
return a.replace(/[\r\n]/g, " ").replace(/<.*?>/g, "");
}
} );
});
$(document).ajaxStop($.unblockUI);
$(document).ajaxStart(function(){
@ -113,7 +117,7 @@ $(document).ready(function() {
status: (requestedIncomplete ? "running" : "completed")
};
$.getJSON(uiRoot + "/api/v1/applications", appParams, function(response,status,jqXHR) {
$.getJSON(uiRoot + "/api/v1/applications", appParams, function(response, _ignored_status, _ignored_jqXHR) {
var array = [];
var hasMultipleAttempts = false;
for (var i in response) {
@ -131,6 +135,8 @@ $(document).ready(function() {
hasMultipleAttempts = true;
}
// TODO: Replace hasOwnProperty with prototype.hasOwnProperty after we find it's safe to do.
/* eslint-disable no-prototype-builtins */
for (var j in app["attempts"]) {
var attempt = app["attempts"][j];
attempt["startTime"] = formatTimeMillis(attempt["startTimeEpoch"]);
@ -145,9 +151,9 @@ $(document).ready(function() {
attempt["version"] = version;
attempt["attemptUrl"] = uiRoot + "/history/" + id + "/" +
(attempt.hasOwnProperty("attemptId") ? attempt["attemptId"] + "/" : "") + "jobs/";
array.push(attempt);
}
/* eslint-enable no-prototype-builtins */
}
if(array.length < 20) {
$.fn.dataTable.defaults.paging = false;
@ -192,13 +198,13 @@ $(document).ready(function() {
{
name: 'eventLog',
data: 'log',
render: (log, type, row) => `<a href="${log}" class="btn btn-info btn-mini">Download</a>`
render: (log, _ignored_type, _ignored_row) => `<a href="${log}" class="btn btn-info btn-mini">Download</a>`
},
],
"aoColumnDefs": [
{
aTargets: [0, 1, 2],
fnCreatedCell: (nTd, sData, oData, iRow, iCol) => {
fnCreatedCell: (nTd, _ignored_sData, _ignored_oData, _ignored_iRow, _ignored_iCol) => {
if (hasMultipleAttempts) {
$(nTd).css('background-color', '#fff');
}

View file

@ -15,6 +15,8 @@
* limitations under the License.
*/
/* global $ */
$(document).ready(function(){
$("[data-toggle=tooltip]").tooltip({container: 'body'});
});

View file

@ -15,6 +15,8 @@
* limitations under the License.
*/
/* global $ */
var baseParams;
var curLogLength;
@ -64,6 +66,7 @@ function getRESTEndPoint() {
return "/log"
}
/* eslint-disable no-unused-vars */
function loadMore() {
var offset = Math.max(startByte - byteLength, 0);
var moreByteLength = Math.min(byteLength, startByte);
@ -140,3 +143,4 @@ function initLogPage(params, logLen, start, end, totLogLen, defaultLen) {
disableMoreButton();
}
}
/* eslint-enable no-unused-vars */

View file

@ -51,6 +51,8 @@
* since it was forked (commit 101503833a8ce5fe369547f6addf3e71172ce10b).
*/
/* global $, appBasePath, d3, dagreD3, graphlibDot, uiRoot */
var VizConstants = {
svgMarginX: 16,
svgMarginY: 16,
@ -166,7 +168,7 @@ function renderDagViz(forJob) {
}
// Find cached RDDs and mark them as such
metadataContainer().selectAll(".cached-rdd").each(function(v) {
metadataContainer().selectAll(".cached-rdd").each(function(_ignored_v) {
var rddId = d3.select(this).text().trim();
var nodeId = VizConstants.nodePrefix + rddId;
svg.selectAll("g." + nodeId).classed("cached", true);
@ -180,7 +182,7 @@ function renderDagViz(forJob) {
svg.selectAll("g[id=" + stageClusterId + "] g." + opClusterId).classed("barrier", true)
});
metadataContainer().selectAll(".indeterminate-rdd").each(function(v) {
metadataContainer().selectAll(".indeterminate-rdd").each(function(_ignored_v) {
var rddId = d3.select(this).text().trim();
var nodeId = VizConstants.nodePrefix + rddId;
svg.selectAll("g." + nodeId).classed("indeterminate", true);
@ -275,7 +277,7 @@ function renderDagVizForJob(svgContainer) {
// If there are any incoming edges into this graph, keep track of them to render
// them separately later. Note that we cannot draw them now because we need to
// put these edges in a separate container that is on top of all stage graphs.
metadata.selectAll(".incoming-edge").each(function(v) {
metadata.selectAll(".incoming-edge").each(function(_ignored_v) {
var edge = d3.select(this).text().trim().split(","); // e.g. 3,4 => [3, 4]
crossStageEdges.push(edge);
});

View file

@ -15,6 +15,10 @@
* limitations under the License.
*/
/* global $, ConvertDurationString, Mustache, createRESTEndPointForExecutorsPage */
/* global createTemplateURI, formatBytes, formatDate, formatDuration, formatLogsCells */
/* global getStandAloneAppId, setDataTableDefaults, uiRoot */
var shouldBlockUI = true;
$(document).ajaxStop(function () {
@ -61,7 +65,7 @@ $.extend( $.fn.dataTable.ext.type.order, {
b = parseFloat(b);
return ((a < b) ? 1 : ((a > b) ? -1 : 0));
}
} );
});
// This function will only parse the URL under certain format
// e.g. (history) https://domain:50509/history/application_1536254569791_3806251/1/stages/stage/?id=4&attempt=1
@ -71,16 +75,17 @@ function stageEndPoint(appId) {
var words = document.baseURI.split('/');
var indexOfProxy = words.indexOf("proxy");
var stageId = queryString[1].split("&").filter(word => word.includes("id="))[0].split("=")[1];
var newBaseURI;
if (indexOfProxy > 0) {
var appId = words[indexOfProxy + 1];
var newBaseURI = words.slice(0, words.indexOf("proxy") + 2).join('/');
appId = words[indexOfProxy + 1];
newBaseURI = words.slice(0, words.indexOf("proxy") + 2).join('/');
return newBaseURI + "/api/v1/applications/" + appId + "/stages/" + stageId;
}
var indexOfHistory = words.indexOf("history");
if (indexOfHistory > 0) {
var appId = words[indexOfHistory + 1];
appId = words[indexOfHistory + 1];
var appAttemptId = words[indexOfHistory + 2];
var newBaseURI = words.slice(0, words.indexOf("history")).join('/');
newBaseURI = words.slice(0, words.indexOf("history")).join('/');
if (isNaN(appAttemptId) || appAttemptId == "0") {
return newBaseURI + "/api/v1/applications/" + appId + "/stages/" + stageId;
} else {
@ -146,37 +151,38 @@ function getColumnNameForTaskMetricSummary(columnKey) {
}
function displayRowsForSummaryMetricsTable(row, type, columnIndex) {
var str;
switch(row.columnKey) {
case 'inputMetrics':
var str = formatBytes(row.data.bytesRead[columnIndex], type) + " / " +
str = formatBytes(row.data.bytesRead[columnIndex], type) + " / " +
row.data.recordsRead[columnIndex];
return str;
case 'outputMetrics':
var str = formatBytes(row.data.bytesWritten[columnIndex], type) + " / " +
str = formatBytes(row.data.bytesWritten[columnIndex], type) + " / " +
row.data.recordsWritten[columnIndex];
return str;
case 'shuffleReadMetrics':
var str = formatBytes(row.data.readBytes[columnIndex], type) + " / " +
str = formatBytes(row.data.readBytes[columnIndex], type) + " / " +
row.data.readRecords[columnIndex];
return str;
case 'shuffleReadBlockedTime':
var str = formatDuration(row.data.fetchWaitTime[columnIndex]);
str = formatDuration(row.data.fetchWaitTime[columnIndex]);
return str;
case 'shuffleRemoteReads':
var str = formatBytes(row.data.remoteBytesRead[columnIndex], type);
str = formatBytes(row.data.remoteBytesRead[columnIndex], type);
return str;
case 'shuffleWriteMetrics':
var str = formatBytes(row.data.writeBytes[columnIndex], type) + " / " +
str = formatBytes(row.data.writeBytes[columnIndex], type) + " / " +
row.data.writeRecords[columnIndex];
return str;
case 'shuffleWriteTime':
var str = formatDuration(row.data.writeTime[columnIndex] / 1000000.0);
str = formatDuration(row.data.writeTime[columnIndex] / 1000000.0);
return str;
default:
@ -265,8 +271,9 @@ function reselectCheckboxesBasedOnTaskTableState() {
var allTaskSummaryChecked = true;
var allExecutorSummaryChecked = true;
var taskSummaryMetricsTableCurrentFilteredArray = taskSummaryMetricsTableCurrentStateArray.slice();
var k;
if (typeof taskTableSelector !== 'undefined' && taskSummaryMetricsTableCurrentStateArray.length > 0) {
for (var k = 0; k < optionalColumns.length; k++) {
for (k = 0; k < optionalColumns.length; k++) {
if (taskTableSelector.column(optionalColumns[k]).visible()) {
taskSummaryHasSelected = true;
$("#box-"+optionalColumns[k]).prop('checked', true);
@ -280,7 +287,7 @@ function reselectCheckboxesBasedOnTaskTableState() {
}
if (typeof executorSummaryTableSelector !== 'undefined') {
for (var k = 0; k < executorOptionalColumns.length; k++) {
for (k = 0; k < executorOptionalColumns.length; k++) {
if (executorSummaryTableSelector.column(executorOptionalColumns[k]).visible()) {
executorSummaryHasSelected = true;
$("#executor-box-"+executorOptionalColumns[k]).prop('checked', true);
@ -392,7 +399,7 @@ $(document).ready(function () {
var endPoint = stageEndPoint(appId);
var stageAttemptId = getStageAttemptId();
$.getJSON(endPoint + "/" + stageAttemptId, function(response, status, jqXHR) {
$.getJSON(endPoint + "/" + stageAttemptId, function(response, _ignored_status, _ignored_jqXHR) {
var responseBody = response;
var dataToShow = {};
@ -426,7 +433,7 @@ $(document).ready(function () {
// prepare data for executor summary table
var stageExecutorSummaryInfoKeys = Object.keys(responseBody.executorSummary);
$.getJSON(createRESTEndPointForExecutorsPage(appId),
function(executorSummaryResponse, status, jqXHR) {
function(executorSummaryResponse, _ignored_status, _ignored_jqXHR) {
var executorDetailsMap = {};
executorSummaryResponse.forEach(function (executorDetail) {
executorDetailsMap[executorDetail.id] = executorDetail;
@ -650,16 +657,20 @@ $(document).ready(function () {
var quantiles = "0,0.25,0.5,0.75,1.0";
$.getJSON(endPoint + "/" + stageAttemptId + "/taskSummary?quantiles=" + quantiles,
function(taskMetricsResponse, status, jqXHR) {
function(taskMetricsResponse, _ignored_status, _ignored_jqXHR) {
var taskMetricKeys = Object.keys(taskMetricsResponse);
taskMetricKeys.forEach(function (columnKey) {
var row;
var row1;
var row2;
var row3;
switch(columnKey) {
case "shuffleReadMetrics":
var row1 = createRowMetadataForColumn(
row1 = createRowMetadataForColumn(
columnKey, taskMetricsResponse[columnKey], 3);
var row2 = createRowMetadataForColumn(
row2 = createRowMetadataForColumn(
"shuffleReadBlockedTime", taskMetricsResponse[columnKey], 13);
var row3 = createRowMetadataForColumn(
row3 = createRowMetadataForColumn(
"shuffleRemoteReads", taskMetricsResponse[columnKey], 14);
if (dataToShow.showShuffleReadData) {
taskSummaryMetricsTableArray.push(row1);
@ -669,37 +680,37 @@ $(document).ready(function () {
break;
case "schedulerDelay":
var row = createRowMetadataForColumn(
row = createRowMetadataForColumn(
columnKey, taskMetricsResponse[columnKey], 11);
taskSummaryMetricsTableArray.push(row);
break;
case "executorDeserializeTime":
var row = createRowMetadataForColumn(
row = createRowMetadataForColumn(
columnKey, taskMetricsResponse[columnKey], 12);
taskSummaryMetricsTableArray.push(row);
break;
case "resultSerializationTime":
var row = createRowMetadataForColumn(
row = createRowMetadataForColumn(
columnKey, taskMetricsResponse[columnKey], 15);
taskSummaryMetricsTableArray.push(row);
break;
case "gettingResultTime":
var row = createRowMetadataForColumn(
row = createRowMetadataForColumn(
columnKey, taskMetricsResponse[columnKey], 16);
taskSummaryMetricsTableArray.push(row);
break;
case "peakExecutionMemory":
var row = createRowMetadataForColumn(
row = createRowMetadataForColumn(
columnKey, taskMetricsResponse[columnKey], 17);
taskSummaryMetricsTableArray.push(row);
break;
case "inputMetrics":
var row = createRowMetadataForColumn(
row = createRowMetadataForColumn(
columnKey, taskMetricsResponse[columnKey], 1);
if (dataToShow.showInputData) {
taskSummaryMetricsTableArray.push(row);
@ -707,7 +718,7 @@ $(document).ready(function () {
break;
case "outputMetrics":
var row = createRowMetadataForColumn(
row = createRowMetadataForColumn(
columnKey, taskMetricsResponse[columnKey], 2);
if (dataToShow.showOutputData) {
taskSummaryMetricsTableArray.push(row);
@ -715,9 +726,9 @@ $(document).ready(function () {
break;
case "shuffleWriteMetrics":
var row1 = createRowMetadataForColumn(
row1 = createRowMetadataForColumn(
columnKey, taskMetricsResponse[columnKey], 4);
var row2 = createRowMetadataForColumn(
row2 = createRowMetadataForColumn(
"shuffleWriteTime", taskMetricsResponse[columnKey], 21);
if (dataToShow.showShuffleWriteData) {
taskSummaryMetricsTableArray.push(row1);
@ -726,7 +737,7 @@ $(document).ready(function () {
break;
case "diskBytesSpilled":
var row = createRowMetadataForColumn(
row = createRowMetadataForColumn(
columnKey, taskMetricsResponse[columnKey], 5);
if (dataToShow.showBytesSpilledData) {
taskSummaryMetricsTableArray.push(row);
@ -734,7 +745,7 @@ $(document).ready(function () {
break;
case "memoryBytesSpilled":
var row = createRowMetadataForColumn(
row = createRowMetadataForColumn(
columnKey, taskMetricsResponse[columnKey], 6);
if (dataToShow.showBytesSpilledData) {
taskSummaryMetricsTableArray.push(row);
@ -743,7 +754,7 @@ $(document).ready(function () {
default:
if (getColumnNameForTaskMetricSummary(columnKey) != "NA") {
var row = createRowMetadataForColumn(
row = createRowMetadataForColumn(
columnKey, taskMetricsResponse[columnKey], 0);
taskSummaryMetricsTableArray.push(row);
}
@ -805,14 +816,15 @@ $(document).ready(function () {
var tasksToShow = JSON.parse(jsonStr);
return tasksToShow.aaData;
},
"error": function (jqXHR, textStatus, errorThrown) {
"error": function (_ignored_jqXHR, _ignored_textStatus, _ignored_errorThrown) {
alert("Unable to connect to the server. Looks like the Spark " +
"application must have ended. Please Switch to the history UI.");
$("#active-tasks-table_processing").css("display","none");
}
},
"columns": [
{data: function (row, type) {
{
data: function (row, type) {
return type !== 'display' ? (isNaN(row.index) ? 0 : row.index ) : row.index;
},
name: "Index"
@ -916,7 +928,7 @@ $(document).ready(function () {
name: "Peak Execution Memory"
},
{
data : function (row, type) {
data : function (row, _ignored_type) {
if (accumulatorTable.length > 0 && row.accumulatorUpdates.length > 0) {
var allAccums = "";
row.accumulatorUpdates.forEach(function(accumulator) {
@ -1018,7 +1030,7 @@ $(document).ready(function () {
name: "Spill (Disk)"
},
{
data : function (row, type) {
data : function (row, _ignored_type) {
var msg = row.errorMessage;
if (typeof msg === 'undefined') {
return "";
@ -1049,7 +1061,7 @@ $(document).ready(function () {
taskTableSelector = $(taskTable).DataTable(taskConf);
$('#active-tasks-table_filter input').unbind();
var searchEvent;
$('#active-tasks-table_filter input').bind('keyup', function(e) {
$('#active-tasks-table_filter input').bind('keyup', function(_ignored_e) {
if (typeof searchEvent !== 'undefined') {
window.clearTimeout(searchEvent);
}
@ -1060,7 +1072,8 @@ $(document).ready(function () {
reselectCheckboxesBasedOnTaskTableState();
// hide or show columns dynamically event
$('input.toggle-vis').on('click', function(e){
$('input.toggle-vis').on('click', function(_ignored_e){
var taskSummaryMetricsTableFilteredArray;
// Get the column
var para = $(this).attr('data-column');
if (para == "0") {
@ -1075,17 +1088,18 @@ $(document).ready(function () {
$(".toggle-vis").prop('checked', false);
allColumns.visible(false);
executorAllColumns.visible(false);
var taskSummaryMetricsTableFilteredArray =
taskSummaryMetricsTableFilteredArray =
taskSummaryMetricsTableArray.filter(row => row.checkboxId < 11);
createDataTableForTaskSummaryMetricsTable(taskSummaryMetricsTableFilteredArray);
}
} else {
var dataMetricsType = $(this).attr("data-metrics-type");
var column;
if (dataMetricsType === 'task') {
var column = taskTableSelector.column(para);
column = taskTableSelector.column(para);
// Toggle the visibility
column.visible(!column.visible());
var taskSummaryMetricsTableFilteredArray = [];
taskSummaryMetricsTableFilteredArray = [];
if ($(this).is(":checked")) {
taskSummaryMetricsTableCurrentStateArray.push(taskSummaryMetricsTableArray.filter(row => (row.checkboxId).toString() == para)[0]);
taskSummaryMetricsTableFilteredArray = taskSummaryMetricsTableCurrentStateArray.slice();
@ -1096,7 +1110,7 @@ $(document).ready(function () {
createDataTableForTaskSummaryMetricsTable(taskSummaryMetricsTableFilteredArray);
}
if (dataMetricsType === "executor") {
var column = executorSummaryTableSelector.column(para);
column = executorSummaryTableSelector.column(para);
column.visible(!column.visible());
}
}

View file

@ -15,6 +15,7 @@
* limitations under the License.
*/
/* global $, d3, timeFormat, timeTipStrings */
// timeFormat: StreamingPage.scala will generate a global "timeFormat" dictionary to store the time
// and its formatted string. Because we cannot specify a timezone in JavaScript, to make sure the
@ -46,6 +47,7 @@ function hideBootstrapTooltip(node) {
$(node).tooltip("dispose");
}
/* eslint-disable no-unused-vars */
// Return the function to scroll to the corresponding
// row on clicking a point of batch in the timeline.
function getOnClickTimelineFunction() {
@ -103,6 +105,7 @@ function registerHistogram(values, minY, maxY) {
var maxX = d3.max(data, function(d) { return d.y; });
maxXForHistogram = maxX > maxXForHistogram ? maxX : maxXForHistogram;
}
/* eslint-enable no-unused-vars */
// Draw a line between (x1, y1) and (x2, y2)
function drawLine(svg, xFunc, yFunc, x1, y1, x2, y2) {
@ -118,6 +121,7 @@ function drawLine(svg, xFunc, yFunc, x1, y1, x2, y2) {
.attr("d", line);
}
/* eslint-disable no-unused-vars */
/**
* @param id the `id` used in the html `div` tag
* @param data the data for the timeline graph
@ -133,7 +137,6 @@ function drawTimeline(id, data, minX, maxX, minY, maxY, unitY, batchInterval) {
d3.select(d3.select(id).node().parentNode)
.style("padding", "8px 0 8px 8px")
.style("border-right", "0px solid white");
var margin = {top: 20, right: 27, bottom: 30, left: maxMarginLeftForTimeline};
var width = 500 - margin.left - margin.right;
var height = 150 - margin.top - margin.bottom;
@ -179,7 +182,6 @@ function drawTimeline(id, data, minX, maxX, minY, maxY, unitY, batchInterval) {
.attr("transform", "translate(0," + unitLabelYOffset + ")")
.text(unitY);
if (batchInterval && batchInterval <= maxY) {
drawLine(svg, x, y, minX, batchInterval, maxX, batchInterval);
}
@ -188,7 +190,6 @@ function drawTimeline(id, data, minX, maxX, minY, maxY, unitY, batchInterval) {
.datum(data)
.attr("class", "line")
.attr("d", line);
// If the user click one point in the graphs, jump to the batch row and highlight it. And
// recovery the batch row after 3 seconds if necessary.
// We need to remember the last clicked batch so that we can recovery it.
@ -316,6 +317,7 @@ function drawHistogram(id, values, minY, maxY, unitY, batchInterval) {
});
}
}
/* eslint-enable no-unused-vars */
$(function() {
var status = window.localStorage && window.localStorage.getItem("show-streams-detail") == "true";

View file

@ -15,9 +15,11 @@
* limitations under the License.
*/
/* global d3, formattedTimeTipStrings, formattedTimeToValues, hideBootstrapTooltip, maxMarginLeftForTimeline, showBootstrapTooltip, unitLabelYOffset */
// pre-define some colors for legends.
var colorPool = ["#F8C471", "#F39C12", "#B9770E", "#73C6B6", "#16A085", "#117A65", "#B2BABB", "#7F8C8D", "#616A6B"];
/* eslint-disable no-unused-vars */
function drawAreaStack(id, labels, values, minX, maxX, minY, maxY) {
d3.select(d3.select(id).node().parentNode)
.style("padding", "8px 0 8px 8px")
@ -46,7 +48,6 @@ function drawAreaStack(id, labels, values, minX, maxX, minY, maxY) {
});
}));
// Set x, y and colors
var x = d3.scale.ordinal()
.domain(dataset[0].map(function(d) { return d.x; }))
@ -56,7 +57,7 @@ function drawAreaStack(id, labels, values, minX, maxX, minY, maxY) {
.domain([0, d3.max(dataset, function(d) { return d3.max(d, function(d) { return d.y0 + d.y; }); })])
.range([height, 0]);
var colors = colorPool.slice(0, labels.length)
var colors = colorPool.slice(0, labels.length);
// Define and draw axes
var yAxis = d3.svg.axis()
@ -71,9 +72,9 @@ function drawAreaStack(id, labels, values, minX, maxX, minY, maxY) {
.tickFormat(d3.time.format("%H:%M:%S.%L"));
// Only show the first and last time in the graph
var xline = []
xline.push(x.domain()[0])
xline.push(x.domain()[x.domain().length - 1])
var xline = [];
xline.push(x.domain()[0]);
xline.push(x.domain()[x.domain().length - 1]);
xAxis.tickValues(xline);
svg.append("g")
@ -124,7 +125,6 @@ function drawAreaStack(id, labels, values, minX, maxX, minY, maxY) {
tooltip.select("text").text(d.y);
});
// Draw legend
var legend = svg.selectAll(".legend")
.data(colors)
@ -138,7 +138,7 @@ function drawAreaStack(id, labels, values, minX, maxX, minY, maxY) {
.attr("height", 18)
.style("fill", function(d, i) {return colors.slice().reverse()[i];})
.on('mouseover', function(d, i) {
var len = labels.length
var len = labels.length;
showBootstrapTooltip(d3.select(this).node(), labels[len - 1 - i]);
})
.on('mouseout', function() {
@ -169,3 +169,4 @@ function drawAreaStack(id, labels, values, minX, maxX, minY, maxY) {
.attr("font-size", "12px")
.attr("font-weight", "bold");
}
/* eslint-enable no-unused-vars */

View file

@ -15,6 +15,8 @@
* limitations under the License.
*/
/* global $ */
/* eslint-disable no-unused-vars */
/* Adds background colors to stripe table rows in the summary table (on the stage page). This is
* necessary (instead of using css or the table striping provided by bootstrap) because the summary
* table has hidden rows.
@ -30,12 +32,13 @@ function stripeSummaryTable() {
}
});
}
/* eslint-enable no-unused-vars */
function toggleThreadStackTrace(threadId, forceAdd) {
var stackTrace = $("#" + threadId + "_stacktrace")
var stackTrace = $("#" + threadId + "_stacktrace");
if (stackTrace.length == 0) {
var stackTraceText = $('#' + threadId + "_td_stacktrace").html()
var threadCell = $("#thread_" + threadId + "_tr")
var stackTraceText = $('#' + threadId + "_td_stacktrace").html();
var threadCell = $("#thread_" + threadId + "_tr");
threadCell.after("<tr id=\"" + threadId +"_stacktrace\" class=\"accordion-body\"><td colspan=\"4\"><pre>" +
stackTraceText + "</pre></td></tr>")
} else {
@ -45,29 +48,31 @@ function toggleThreadStackTrace(threadId, forceAdd) {
}
}
/* eslint-disable no-unused-vars */
function expandAllThreadStackTrace(toggleButton) {
$('.accordion-heading').each(function() {
//get thread ID
if (!$(this).hasClass("d-none")) {
var trId = $(this).attr('id').match(/thread_([0-9]+)_tr/m)[1]
var trId = $(this).attr('id').match(/thread_([0-9]+)_tr/m)[1];
toggleThreadStackTrace(trId, true)
}
})
});
if (toggleButton) {
$('.expandbutton').toggleClass('d-none')
}
}
/* eslint-enable no-unused-vars */
function collapseAllThreadStackTrace(toggleButton) {
$('.accordion-body').each(function() {
$(this).remove()
})
});
if (toggleButton) {
$('.expandbutton').toggleClass('d-none');
}
}
/* eslint-disable no-unused-vars */
// inOrOut - true: over, false: out
function onMouseOverAndOut(threadId) {
$("#" + threadId + "_td_id").toggleClass("threaddump-td-mouseover");
@ -79,7 +84,7 @@ function onMouseOverAndOut(threadId) {
function onSearchStringChange() {
var searchString = $('#search').val().toLowerCase();
//remove the stacktrace
collapseAllThreadStackTrace(false)
collapseAllThreadStackTrace(false);
if (searchString.length == 0) {
$('tr').each(function() {
$(this).removeClass('d-none')
@ -87,11 +92,11 @@ function onSearchStringChange() {
} else {
$('tr').each(function(){
if($(this).attr('id') && $(this).attr('id').match(/thread_[0-9]+_tr/) ) {
var children = $(this).children()
var found = false
var children = $(this).children();
var found = false;
for (var i = 0; i < children.length; i++) {
if (children.eq(i).text().toLowerCase().indexOf(searchString) >= 0) {
found = true
found = true;
}
}
if (found) {
@ -103,3 +108,4 @@ function onSearchStringChange() {
});
}
}
/* eslint-enable no-unused-vars */

View file

@ -15,6 +15,8 @@
* limitations under the License.
*/
/* global $, vis, uiRoot, appBasePath */
/* eslint-disable no-unused-vars */
function drawApplicationTimeline(groupArray, eventObjArray, startTime, offset) {
var groups = new vis.DataSet(groupArray);
var items = new vis.DataSet(eventObjArray);
@ -280,6 +282,7 @@ function setupExecutorEventAction() {
);
});
}
/* eslint-enable no-unused-vars */
function setupZoomable(id, timeline) {
$(id + ' > input[type="checkbox"]').click(function() {

View file

@ -15,6 +15,8 @@
* limitations under the License.
*/
/* global $, uiRoot */
/* eslint-disable no-unused-vars */
// this function works exactly the same as UIUtils.formatDuration
function formatDuration(milliseconds) {
if (milliseconds < 100) {
@ -46,11 +48,13 @@ function formatBytes(bytes, type) {
var i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
}
/* eslint-enable no-unused-vars */
function padZeroes(num) {
return ("0" + num).slice(-2);
}
/* eslint-disable no-unused-vars */
function formatTimeMillis(timeMillis) {
if (timeMillis <= 0) {
return "-";
@ -59,6 +63,7 @@ function formatTimeMillis(timeMillis) {
return formatDateString(dt);
}
}
/* eslint-enable no-unused-vars */
function formatDateString(dt) {
return dt.getFullYear() + "-" +
@ -69,6 +74,7 @@ function formatDateString(dt) {
padZeroes(dt.getSeconds());
}
/* eslint-disable no-unused-vars */
function getTimeZone() {
try {
return Intl.DateTimeFormat().resolvedOptions().timeZone;
@ -92,14 +98,15 @@ function formatLogsCells(execLogs, type) {
function getStandAloneAppId(cb) {
var words = document.baseURI.split('/');
var ind = words.indexOf("proxy");
var appId;
if (ind > 0) {
var appId = words[ind + 1];
appId = words[ind + 1];
cb(appId);
return;
}
ind = words.indexOf("history");
if (ind > 0) {
var appId = words[ind + 1];
appId = words[ind + 1];
cb(appId);
return;
}
@ -119,7 +126,7 @@ function getStandAloneAppId(cb) {
// It will convert the string into integer for correct ordering
function ConvertDurationString(data) {
data = data.toString();
var units = data.replace(/[\d\.]/g, '' )
var units = data.replace(/[\d.]/g, '' )
.replace(' ', '')
.toLowerCase();
var multiplier = 1;
@ -143,13 +150,14 @@ function ConvertDurationString(data) {
function createTemplateURI(appId, templateName) {
var words = document.baseURI.split('/');
var ind = words.indexOf("proxy");
var baseURI;
if (ind > 0) {
var baseURI = words.slice(0, ind + 1).join('/') + '/' + appId + '/static/' + templateName + '-template.html';
baseURI = words.slice(0, ind + 1).join('/') + '/' + appId + '/static/' + templateName + '-template.html';
return baseURI;
}
ind = words.indexOf("history");
if(ind > 0) {
var baseURI = words.slice(0, ind).join('/') + '/static/' + templateName + '-template.html';
baseURI = words.slice(0, ind).join('/') + '/static/' + templateName + '-template.html';
return baseURI;
}
return uiRoot + "/static/" + templateName + "-template.html";
@ -177,16 +185,17 @@ function formatDate(date) {
function createRESTEndPointForExecutorsPage(appId) {
var words = document.baseURI.split('/');
var ind = words.indexOf("proxy");
var newBaseURI;
if (ind > 0) {
var appId = words[ind + 1];
var newBaseURI = words.slice(0, ind + 2).join('/');
appId = words[ind + 1];
newBaseURI = words.slice(0, ind + 2).join('/');
return newBaseURI + "/api/v1/applications/" + appId + "/allexecutors";
}
ind = words.indexOf("history");
if (ind > 0) {
var appId = words[ind + 1];
appId = words[ind + 1];
var attemptId = words[ind + 2];
var newBaseURI = words.slice(0, ind).join('/');
newBaseURI = words.slice(0, ind).join('/');
if (isNaN(attemptId)) {
return newBaseURI + "/api/v1/applications/" + appId + "/allexecutors";
} else {
@ -199,16 +208,17 @@ function createRESTEndPointForExecutorsPage(appId) {
function createRESTEndPointForMiscellaneousProcess(appId) {
var words = document.baseURI.split('/');
var ind = words.indexOf("proxy");
var newBaseURI;
if (ind > 0) {
var appId = words[ind + 1];
var newBaseURI = words.slice(0, ind + 2).join('/');
appId = words[ind + 1];
newBaseURI = words.slice(0, ind + 2).join('/');
return newBaseURI + "/api/v1/applications/" + appId + "/allmiscellaneousprocess";
}
ind = words.indexOf("history");
if (ind > 0) {
var appId = words[ind + 1];
appId = words[ind + 1];
var attemptId = words[ind + 2];
var newBaseURI = words.slice(0, ind).join('/');
newBaseURI = words.slice(0, ind).join('/');
if (isNaN(attemptId)) {
return newBaseURI + "/api/v1/applications/" + appId + "/allmiscellaneousprocess";
} else {
@ -217,3 +227,4 @@ function createRESTEndPointForMiscellaneousProcess(appId) {
}
return uiRoot + "/api/v1/applications/" + appId + "/allmiscellaneousprocess";
}
/* eslint-enable no-unused-vars */

View file

@ -15,6 +15,8 @@
* limitations under the License.
*/
/* global $ */
/* eslint-disable no-unused-vars */
var uiRoot = "";
var appBasePath = "";
@ -25,6 +27,7 @@ function setUIRoot(val) {
function setAppBasePath(path) {
appBasePath = path;
}
/* eslint-enable no-unused-vars */
function collapseTablePageLoad(name, table){
if (window.localStorage.getItem(name) == "true") {

View file

@ -134,3 +134,4 @@ flights_tiny.txt.1
over1k
over10k
exported_table/*
node_modules

24
dev/eslint.json Normal file
View file

@ -0,0 +1,24 @@
{
"env": {
"browser": true,
"es6": true
},
"extends": "eslint:recommended",
"rules": {
"indent": [
"error",
2,
{
"SwitchCase": 1,
"MemberExpression": "off"
}
],
"no-unused-vars": ["error", {"argsIgnorePattern": "^_ignored_.*"}]
},
"ignorePatterns": [
"*.min.js",
"sorttable.js",
"jquery.mustache.js",
"dataTables.rowsGroup.js"
]
}

56
dev/lint-js Executable file
View file

@ -0,0 +1,56 @@
#!/usr/bin/env bash
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
set -o pipefail
SCRIPT_DIR="$( cd "$( dirname "$0" )" && pwd )"
SPARK_ROOT_DIR="$(dirname $SCRIPT_DIR)"
LINT_JS_REPORT_FILE_NAME="$SPARK_ROOT_DIR/dev/lint-js-report.log"
LINT_TARGET_FILES=(
"$SPARK_ROOT_DIR/core/src/main/resources/org/apache/spark/ui/static/"
"$SPARK_ROOT_DIR/sql/core/src/main/resources/org/apache/spark/sql/execution/ui/static/"
"$SPARK_ROOT_DIR/docs/js"
)
if ! type "npm" > /dev/null; then
echo "ERROR: You should install npm"
exit 1
fi
if ! type "npx" > /dev/null; then
echo "ERROR: You should install npx"
exit 1
fi
cd $SCRIPT_DIR
if ! npm ls eslint > /dev/null; then
npm ci eslint
fi
npx eslint -c "$SPARK_ROOT_DIR/dev/eslint.json" $LINT_TARGET_FILES | tee "$LINT_JS_REPORT_FILE_NAME"
lint_status=$?
if [ "$lint_status" = "0" ] ; then
echo "lint-js checks passed."
else
echo "lint-js checks failed."
fi
exit "$lint_status"

979
dev/package-lock.json generated Normal file
View file

@ -0,0 +1,979 @@
{
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"@babel/code-frame": {
"version": "7.12.11",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
"integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
"dev": true,
"requires": {
"@babel/highlight": "^7.10.4"
}
},
"@babel/helper-validator-identifier": {
"version": "7.14.0",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz",
"integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==",
"dev": true
},
"@babel/highlight": {
"version": "7.14.0",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz",
"integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==",
"dev": true,
"requires": {
"@babel/helper-validator-identifier": "^7.14.0",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
},
"dependencies": {
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
}
}
},
"@eslint/eslintrc": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz",
"integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==",
"dev": true,
"requires": {
"ajv": "^6.12.4",
"debug": "^4.1.1",
"espree": "^7.3.0",
"globals": "^12.1.0",
"ignore": "^4.0.6",
"import-fresh": "^3.2.1",
"js-yaml": "^3.13.1",
"minimatch": "^3.0.4",
"strip-json-comments": "^3.1.1"
},
"dependencies": {
"globals": {
"version": "12.4.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
"integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
"dev": true,
"requires": {
"type-fest": "^0.8.1"
}
}
}
},
"acorn": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true
},
"acorn-jsx": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
"integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
"dev": true
},
"ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
"ansi-colors": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
"integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
"dev": true
},
"ansi-regex": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"dev": true
},
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
}
},
"argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
"requires": {
"sprintf-js": "~1.0.2"
}
},
"astral-regex": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
"integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
"dev": true
},
"balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true
},
"chalk": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
"integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"requires": {
"color-name": "1.1.3"
}
},
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
"cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"dev": true,
"requires": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
"which": "^2.0.1"
}
},
"debug": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
"ms": "2.1.2"
}
},
"deep-is": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
"dev": true
},
"doctrine": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
"integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
"dev": true,
"requires": {
"esutils": "^2.0.2"
}
},
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
"enquirer": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
"integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
"dev": true,
"requires": {
"ansi-colors": "^4.1.1"
}
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
"eslint": {
"version": "7.25.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.25.0.tgz",
"integrity": "sha512-TVpSovpvCNpLURIScDRB6g5CYu/ZFq9GfX2hLNIV4dSBKxIWojeDODvYl3t0k0VtMxYeR8OXPCFE5+oHMlGfhw==",
"dev": true,
"requires": {
"@babel/code-frame": "7.12.11",
"@eslint/eslintrc": "^0.4.0",
"ajv": "^6.10.0",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
"debug": "^4.0.1",
"doctrine": "^3.0.0",
"enquirer": "^2.3.5",
"eslint-scope": "^5.1.1",
"eslint-utils": "^2.1.0",
"eslint-visitor-keys": "^2.0.0",
"espree": "^7.3.1",
"esquery": "^1.4.0",
"esutils": "^2.0.2",
"file-entry-cache": "^6.0.1",
"functional-red-black-tree": "^1.0.1",
"glob-parent": "^5.0.0",
"globals": "^13.6.0",
"ignore": "^4.0.6",
"import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
"js-yaml": "^3.13.1",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.4.1",
"lodash": "^4.17.21",
"minimatch": "^3.0.4",
"natural-compare": "^1.4.0",
"optionator": "^0.9.1",
"progress": "^2.0.0",
"regexpp": "^3.1.0",
"semver": "^7.2.1",
"strip-ansi": "^6.0.0",
"strip-json-comments": "^3.1.0",
"table": "^6.0.4",
"text-table": "^0.2.0",
"v8-compile-cache": "^2.0.3"
}
},
"eslint-scope": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
"integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
"dev": true,
"requires": {
"esrecurse": "^4.3.0",
"estraverse": "^4.1.1"
}
},
"eslint-utils": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
"integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
"dev": true,
"requires": {
"eslint-visitor-keys": "^1.1.0"
},
"dependencies": {
"eslint-visitor-keys": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
"integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
"dev": true
}
}
},
"eslint-visitor-keys": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
"integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
"dev": true
},
"espree": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
"integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
"dev": true,
"requires": {
"acorn": "^7.4.0",
"acorn-jsx": "^5.3.1",
"eslint-visitor-keys": "^1.3.0"
},
"dependencies": {
"eslint-visitor-keys": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
"integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
"dev": true
}
}
},
"esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true
},
"esquery": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
"integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
"dev": true,
"requires": {
"estraverse": "^5.1.0"
},
"dependencies": {
"estraverse": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
"integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
"dev": true
}
}
},
"esrecurse": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
"requires": {
"estraverse": "^5.2.0"
},
"dependencies": {
"estraverse": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
"integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
"dev": true
}
}
},
"estraverse": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
"dev": true
},
"esutils": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true
},
"fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
"fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"dev": true
},
"fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
"dev": true
},
"file-entry-cache": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
"integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
"dev": true,
"requires": {
"flat-cache": "^3.0.4"
}
},
"flat-cache": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
"integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
"dev": true,
"requires": {
"flatted": "^3.1.0",
"rimraf": "^3.0.2"
}
},
"flatted": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
"integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
"dev": true
},
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
"functional-red-black-tree": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
"dev": true
},
"glob": {
"version": "7.1.6",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
"integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
"dev": true,
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
}
},
"glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"requires": {
"is-glob": "^4.0.1"
}
},
"globals": {
"version": "13.8.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz",
"integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==",
"dev": true,
"requires": {
"type-fest": "^0.20.2"
},
"dependencies": {
"type-fest": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
"integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
"dev": true
}
}
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
"ignore": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
"integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
"dev": true
},
"import-fresh": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
"integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
"dev": true,
"requires": {
"parent-module": "^1.0.0",
"resolve-from": "^4.0.0"
}
},
"imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
"dev": true
},
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"requires": {
"once": "^1.3.0",
"wrappy": "1"
}
},
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
},
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
"dev": true
},
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
"is-glob": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
"integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
"dev": true,
"requires": {
"is-extglob": "^2.1.1"
}
},
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
"dev": true
},
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true
},
"js-yaml": {
"version": "3.14.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dev": true,
"requires": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
}
},
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
},
"json-stable-stringify-without-jsonify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
"dev": true
},
"levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
"integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"dev": true,
"requires": {
"prelude-ls": "^1.2.1",
"type-check": "~0.4.0"
}
},
"lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
"lodash.clonedeep": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
"dev": true
},
"lodash.flatten": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
"integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=",
"dev": true
},
"lodash.truncate": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
"integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
"dev": true
},
"lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
"requires": {
"yallist": "^4.0.0"
}
},
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
"natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
"dev": true
},
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"requires": {
"wrappy": "1"
}
},
"optionator": {
"version": "0.9.1",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
"integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
"dev": true,
"requires": {
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
"levn": "^0.4.1",
"prelude-ls": "^1.2.1",
"type-check": "^0.4.0",
"word-wrap": "^1.2.3"
}
},
"parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
"dev": true,
"requires": {
"callsites": "^3.0.0"
}
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true
},
"path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true
},
"prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true
},
"progress": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
"dev": true
},
"punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"dev": true
},
"regexpp": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
"integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
"dev": true
},
"require-from-string": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
"dev": true
},
"resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"dev": true
},
"rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"requires": {
"glob": "^7.1.3"
}
},
"semver": {
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"dev": true,
"requires": {
"lru-cache": "^6.0.0"
}
},
"shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
"requires": {
"shebang-regex": "^3.0.0"
}
},
"shebang-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true
},
"slice-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
"integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
"dev": true,
"requires": {
"ansi-styles": "^4.0.0",
"astral-regex": "^2.0.0",
"is-fullwidth-code-point": "^3.0.0"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
}
}
},
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
"dev": true
},
"string-width": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
"integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
"dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.0"
}
},
"strip-ansi": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
"dev": true,
"requires": {
"ansi-regex": "^5.0.0"
}
},
"strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
},
"table": {
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/table/-/table-6.6.0.tgz",
"integrity": "sha512-iZMtp5tUvcnAdtHpZTWLPF0M7AgiQsURR2DwmxnJwSy8I3+cY+ozzVvYha3BOLG2TB+L0CqjIz+91htuj6yCXg==",
"dev": true,
"requires": {
"ajv": "^8.0.1",
"lodash.clonedeep": "^4.5.0",
"lodash.flatten": "^4.4.0",
"lodash.truncate": "^4.4.2",
"slice-ansi": "^4.0.0",
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0"
},
"dependencies": {
"ajv": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz",
"integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
}
},
"json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true
}
}
},
"text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
"integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
"dev": true
},
"type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
"requires": {
"prelude-ls": "^1.2.1"
}
},
"type-fest": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
"dev": true
},
"uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dev": true,
"requires": {
"punycode": "^2.1.0"
}
},
"v8-compile-cache": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
"integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
"dev": true
},
"which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"requires": {
"isexe": "^2.0.0"
}
},
"word-wrap": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
"dev": true
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
"yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
}
}
}

5
dev/package.json Normal file
View file

@ -0,0 +1,5 @@
{
"devDependencies": {
"eslint": "^7.25.0"
}
}