From 4ef093e5fff762374aa66189d14418a75af09f81 Mon Sep 17 00:00:00 2001 From: ttsukagoshi Date: Sun, 8 Aug 2021 01:40:40 +0900 Subject: [PATCH 01/12] #20: Add menu for setting up reminder notification Pending message localization --- src/i18n.js | 11 ++-- src/websiteMonitoring.js | 112 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 111 insertions(+), 12 deletions(-) diff --git a/src/i18n.js b/src/i18n.js index 39b25e6..1e7cf95 100644 --- a/src/i18n.js +++ b/src/i18n.js @@ -22,6 +22,7 @@ const MESSAGES = { menuTriggers: 'Triggers', menuSetStatusCheckTrigger: 'Set Status Check Trigger', menuSetLogExtractionTrigger: 'Set Log Extraction Trigger', + menuSetReminderTrigger: 'Set Reminder Trigger', menuDeleteTriggers: 'Delete Triggers', menuCheckStatus: 'Check Status', menuExtractStatusLogs: 'Extract Status Logs', @@ -55,7 +56,7 @@ const MESSAGES = { '\nChanges to website status have been emailed to {{myEmail}}', alertTitleCompleteStatusCheck: '[Website Status] Complete: Status Check', mailSubErrorStatusCheck: '[Website Status] Error: Status Check', - mailBodyErrorStatusCheck: + mailBodyError: '{{errorStack}}\n\n-----\nThis notice is managed by the following spreadsheet:\n{{spreadsheetUrl}}', alertTitleError: 'ERROR', errorHeaderNameTargetUrlNotFound: @@ -112,7 +113,7 @@ const MESSAGES = { alertTitleCompleteStatusCheck: '[サイト公開ステータス] 完了:ステータス確認', mailSubErrorStatusCheck: '[サイト公開ステータス] エラー:ステータス確認', - mailBodyErrorStatusCheck: + mailBodyError: '{{errorStack}}\n\n-----\nこの通知は次のGoogleスプレッドシートによって管理されています:\n{{spreadsheetUrl}}', alertTitleError: 'エラー', errorHeaderNameTargetUrlNotFound: @@ -324,13 +325,13 @@ class LocalizedMessage { return text; } /** - * Replace placeholder string in this.messageList.mailBodyErrorStatusCheck + * Replace placeholder string in this.messageList.mailBodyError * @param {String} errorStack * @param {String} spreadsheetUrl * @returns {String} The replaced text. */ - replaceMailBodyErrorStatusCheck(errorStack, spreadsheetUrl) { - let text = this.messageList.mailBodyErrorStatusCheck; + replaceMailBodyError(errorStack, spreadsheetUrl) { + let text = this.messageList.mailBodyError; let placeholderValues = [ { regexp: '{{errorStack}}', diff --git a/src/websiteMonitoring.js b/src/websiteMonitoring.js index bb32082..ca17c53 100644 --- a/src/websiteMonitoring.js +++ b/src/websiteMonitoring.js @@ -19,7 +19,9 @@ deleteTimeBasedTriggers, extractStatusLogsTriggered, onOpen, +sendReminder, setupLogExtractionTrigger, +setupReminderTrigger, setupStatusCheckTrigger, websiteMonitoringTriggered */ @@ -62,6 +64,10 @@ function onOpen() { localMessage.messageList.menuSetLogExtractionTrigger, 'setupLogExtractionTrigger' ) + .addItem( + localMessage.messageList.menuSetReminderTrigger, + 'setupReminderTrigger' + ) .addSeparator() .addItem( localMessage.messageList.menuDeleteTriggers, @@ -84,7 +90,7 @@ function setupStatusCheckTrigger() { const handlerFunction = 'websiteMonitoringTriggered'; const frequencyKey = 'TRIGGER_MINUTE_FREQUENCY_STATUS_CHECK'; const frequencyUnit = 'minute'; - setupTrigger(handlerFunction, frequencyKey, frequencyUnit); + setupTrigger_(handlerFunction, frequencyKey, frequencyUnit); } /** @@ -95,7 +101,7 @@ function setupLogExtractionTrigger() { const handlerFunction = 'extractStatusLogsTriggered'; const frequencyKey = 'TRIGGER_DAYS_FREQUENCY_LOG_EXTRACTION'; const frequencyUnit = 'day'; - setupTrigger(handlerFunction, frequencyKey, frequencyUnit); + setupTrigger_(handlerFunction, frequencyKey, frequencyUnit); } /** @@ -105,7 +111,7 @@ function setupLogExtractionTrigger() { * @param {String} frequencyKey Key in the options sheet that refers to the trigger frequency for this handler function. * @param {String} frequencyUnit Unit of the value of frequencyKey, i.e., minute, hour, day, or week. */ -function setupTrigger(handlerFunction, frequencyKey, frequencyUnit) { +function setupTrigger_(handlerFunction, frequencyKey, frequencyUnit) { const ui = SpreadsheetApp.getUi(); const myEmail = Session.getActiveUser().getEmail(); const ss = SpreadsheetApp.getActiveSpreadsheet(); @@ -200,6 +206,24 @@ function setupTrigger(handlerFunction, frequencyKey, frequencyUnit) { } } +/** + * Set time-based trigger for sending monthly reminders + * of active time-based triggers set by this user in this script. + * Trigger will be set for the first day of each month. + */ +function setupReminderTrigger() { + // UI alert message /////// + const handlerFunction = 'sendReminder'; + // Delete existing trigger for the same handler function. + ScriptApp.getProjectTriggers().forEach((trigger) => { + if (trigger.getHandlerFunction() === handlerFunction) { + ScriptApp.deleteTrigger(trigger); + } + }); + // Set new trigger + ScriptApp.newTrigger(handlerFunction).timeBased().onMonthDay(1).create(); +} + /** * Delete existing trigger(s). */ @@ -540,10 +564,7 @@ function websiteMonitoring(triggered = false) { 'NA', ]); let messageSub = localMessage.messageList.mailSubErrorStatusCheck; - let messageBody = localMessage.replaceMailBodyErrorStatusCheck( - e.stack, - ss.getUrl() - ); + let messageBody = localMessage.replaceMailBodyError(e.stack, ss.getUrl()); if (options.ENABLE_CHAT_NOTIFICATION) { // Post on Google Chat postToChat_( @@ -740,6 +761,83 @@ function extractStatusLogs(triggered = false) { } } +function sendReminder() { + const triggers = ScriptApp.getProjectTriggers(); + if (triggers.length > 0) { + const ss = SpreadsheetApp.getActiveSpreadsheet(); + const localMessage = new LocalizedMessage(ss.getSpreadsheetLocale()); + const myEmail = Session.getActiveUser().getEmail(); + // Parse options data from spreadsheet + const optionsArr = ss + .getSheetByName(SHEET_NAME_OPTIONS) + .getDataRange() + .getValues(); + optionsArr.shift(); + const options = optionsArr.reduce((obj, row) => { + let [key, value] = [row[1], row[2]]; // Assuming that the keys and their options are set in columns B and C, respectively. + if (key) { + obj[key] = value; + } + return obj; + }, {}); + var messageSub = '[Website Status] '; + var messageBody = ''; + try { + messageSub += 'Reminder: Active Triggers'; + let triggerInfo = triggers + .reduce((info, trigger) => { + if (trigger.getHandlerFunction() === 'websiteMonitoringTriggered') { + // Get the list of target websites to monitor + const targetWebsitesSheet = ss.getSheetByName(SHEET_NAME_DASHBOARD); + const targetWebsitesArr = targetWebsitesSheet + .getRange( + TARGET_WEBSITES_RANGE_POSITION.row, + TARGET_WEBSITES_RANGE_POSITION.col, + targetWebsitesSheet.getLastRow() - + TARGET_WEBSITES_RANGE_POSITION.row + + 1, + TARGET_WEBSITES_COL_NUM + ) + .getValues(); + targetWebsitesArr.shift(); + info.push( + `Website Monitoring:\n${targetWebsitesArr + .map((website) => `- ${website.join(' ')}`) + .join('\n')}` + ); + } else if ( + trigger.getHandlerFunction() === 'extractStatusLogsTriggered' + ) { + info.push('Trigger for periodical status log extraction is set.'); + } + return info; + }, []) + .join('\n'); + messageBody = `This is a monthly reminder of the time-based triggers set for this website monitoring script:\n\n${triggerInfo}\n\n-----\nThis notice is managed by the following spreadsheet:\n${ss.getUrl()}`; ////// + } catch (e) { + console.error(e.stack); + messageSub = '[Website Status] Error: Send Reminder'; // localMessage.messageList.mailSubErrorSendReminder; + messageBody = localMessage.replaceMailBodyError(e.stack, ss.getUrl()); + } finally { + if (options.ENABLE_CHAT_NOTIFICATION) { + // Post on Google Chat + postToChat_( + options.CHAT_WEBHOOK_URL, + `*${messageSub}*\n\n${messageBody}` + ); + } + if ( + !options.ENABLE_CHAT_NOTIFICATION || + !options.DISABLE_MAIL_NOTIFICATION + ) { + // If chat notification is disabled OR mail notification is NOT disabled + // send email notification + MailApp.sendEmail(myEmail, messageSub, messageBody); + } + } + } +} + /** * Parse a given array of HTTP reponse codes (in strings) into actual codes. * For example, ["201", "30x"] will be converted into the following array of codes: From ac9dd71e1529ca11fe02071ace9267e6f6df3775 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Aug 2021 11:05:45 +0000 Subject: [PATCH 02/12] npm(deps-dev): bump @typescript-eslint/parser from 4.28.5 to 4.29.0 Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 4.28.5 to 4.29.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.29.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 306 +++++++--------------------------------------- package.json | 2 +- 2 files changed, 48 insertions(+), 260 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1c90872..b334b13 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "@google/clasp": "^2.4.0", "@types/google-apps-script": "^1.0.37", "@typescript-eslint/eslint-plugin": "^4.29.0", - "@typescript-eslint/parser": "^4.28.5", + "@typescript-eslint/parser": "^4.29.0", "eslint": "^7.32.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^3.4.0", @@ -354,53 +354,6 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.0.tgz", - "integrity": "sha512-HPq7XAaDMM3DpmuijxLV9Io8/6pQnliiXMQUcAdjpJJSR+fdmbD/zHCd7hMkjJn04UQtCQBtshgxClzg6NIS2w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.29.0", - "@typescript-eslint/visitor-keys": "4.29.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.0.tgz", - "integrity": "sha512-2YJM6XfWfi8pgU2HRhTp7WgRw78TCRO3dOmSpAvIQ8MOv4B46JD2chnhpNT7Jq8j0APlIbzO1Bach734xxUl4A==", - "dev": true, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.0.tgz", - "integrity": "sha512-LoaofO1C/jAJYs0uEpYMXfHboGXzOJeV118X4OsZu9f7rG7Pr9B3+4HTU8+err81rADa4xfQmAxnRnPAI2jp+Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.29.0", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -440,80 +393,6 @@ "eslint": "*" } }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.0.tgz", - "integrity": "sha512-HPq7XAaDMM3DpmuijxLV9Io8/6pQnliiXMQUcAdjpJJSR+fdmbD/zHCd7hMkjJn04UQtCQBtshgxClzg6NIS2w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.29.0", - "@typescript-eslint/visitor-keys": "4.29.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/types": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.0.tgz", - "integrity": "sha512-2YJM6XfWfi8pgU2HRhTp7WgRw78TCRO3dOmSpAvIQ8MOv4B46JD2chnhpNT7Jq8j0APlIbzO1Bach734xxUl4A==", - "dev": true, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.0.tgz", - "integrity": "sha512-8ZpNHDIOyqzzgZrQW9+xQ4k5hM62Xy2R4RPO3DQxMc5Rq5QkCdSpk/drka+DL9w6sXNzV5nrdlBmf8+x495QXQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.29.0", - "@typescript-eslint/visitor-keys": "4.29.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.0.tgz", - "integrity": "sha512-LoaofO1C/jAJYs0uEpYMXfHboGXzOJeV118X4OsZu9f7rG7Pr9B3+4HTU8+err81rADa4xfQmAxnRnPAI2jp+Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.29.0", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-utils": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", @@ -532,30 +411,15 @@ "eslint": ">=5" } }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/parser": { - "version": "4.28.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.28.5.tgz", - "integrity": "sha512-NPCOGhTnkXGMqTznqgVbA5LqVsnw+i3+XA1UKLnAb+MG1Y1rP4ZSK9GX0kJBmAZTMIktf+dTwXToT6kFwyimbw==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.29.0.tgz", + "integrity": "sha512-+92YRNHFdXgq+GhWQPT2bmjX09X7EH36JfgN2/4wmhtwV/HPxozpCNst8jrWcngLtEVd/4zAwA6BKojAlf+YqA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "4.28.5", - "@typescript-eslint/types": "4.28.5", - "@typescript-eslint/typescript-estree": "4.28.5", + "@typescript-eslint/scope-manager": "4.29.0", + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/typescript-estree": "4.29.0", "debug": "^4.3.1" }, "engines": { @@ -575,13 +439,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "4.28.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.5.tgz", - "integrity": "sha512-PHLq6n9nTMrLYcVcIZ7v0VY1X7dK309NM8ya9oL/yG8syFINIMHxyr2GzGoBYUdv3NUfCOqtuqps0ZmcgnZTfQ==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.0.tgz", + "integrity": "sha512-HPq7XAaDMM3DpmuijxLV9Io8/6pQnliiXMQUcAdjpJJSR+fdmbD/zHCd7hMkjJn04UQtCQBtshgxClzg6NIS2w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.28.5", - "@typescript-eslint/visitor-keys": "4.28.5" + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/visitor-keys": "4.29.0" }, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" @@ -592,9 +456,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "4.28.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.5.tgz", - "integrity": "sha512-MruOu4ZaDOLOhw4f/6iudyks/obuvvZUAHBDSW80Trnc5+ovmViLT2ZMDXhUV66ozcl6z0LJfKs1Usldgi/WCA==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.0.tgz", + "integrity": "sha512-2YJM6XfWfi8pgU2HRhTp7WgRw78TCRO3dOmSpAvIQ8MOv4B46JD2chnhpNT7Jq8j0APlIbzO1Bach734xxUl4A==", "dev": true, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" @@ -605,13 +469,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.28.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.5.tgz", - "integrity": "sha512-FzJUKsBX8poCCdve7iV7ShirP8V+ys2t1fvamVeD1rWpiAnIm550a+BX/fmTHrjEpQJ7ZAn+Z7ZZwJjytk9rZw==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.0.tgz", + "integrity": "sha512-8ZpNHDIOyqzzgZrQW9+xQ4k5hM62Xy2R4RPO3DQxMc5Rq5QkCdSpk/drka+DL9w6sXNzV5nrdlBmf8+x495QXQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.28.5", - "@typescript-eslint/visitor-keys": "4.28.5", + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/visitor-keys": "4.29.0", "debug": "^4.3.1", "globby": "^11.0.3", "is-glob": "^4.0.1", @@ -647,12 +511,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.28.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.5.tgz", - "integrity": "sha512-dva/7Rr+EkxNWdJWau26xU/0slnFlkh88v3TsyTgRS/IIYFi5iIfpCFM4ikw0vQTFUR9FYSSyqgK4w64gsgxhg==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.0.tgz", + "integrity": "sha512-LoaofO1C/jAJYs0uEpYMXfHboGXzOJeV118X4OsZu9f7rG7Pr9B3+4HTU8+err81rADa4xfQmAxnRnPAI2jp+Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.28.5", + "@typescript-eslint/types": "4.29.0", "eslint-visitor-keys": "^2.0.0" }, "engines": { @@ -4500,32 +4364,6 @@ "tsutils": "^3.21.0" }, "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.0.tgz", - "integrity": "sha512-HPq7XAaDMM3DpmuijxLV9Io8/6pQnliiXMQUcAdjpJJSR+fdmbD/zHCd7hMkjJn04UQtCQBtshgxClzg6NIS2w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.29.0", - "@typescript-eslint/visitor-keys": "4.29.0" - } - }, - "@typescript-eslint/types": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.0.tgz", - "integrity": "sha512-2YJM6XfWfi8pgU2HRhTp7WgRw78TCRO3dOmSpAvIQ8MOv4B46JD2chnhpNT7Jq8j0APlIbzO1Bach734xxUl4A==", - "dev": true - }, - "@typescript-eslint/visitor-keys": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.0.tgz", - "integrity": "sha512-LoaofO1C/jAJYs0uEpYMXfHboGXzOJeV118X4OsZu9f7rG7Pr9B3+4HTU8+err81rADa4xfQmAxnRnPAI2jp+Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.29.0", - "eslint-visitor-keys": "^2.0.0" - } - }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -4551,47 +4389,6 @@ "eslint-utils": "^3.0.0" }, "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.0.tgz", - "integrity": "sha512-HPq7XAaDMM3DpmuijxLV9Io8/6pQnliiXMQUcAdjpJJSR+fdmbD/zHCd7hMkjJn04UQtCQBtshgxClzg6NIS2w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.29.0", - "@typescript-eslint/visitor-keys": "4.29.0" - } - }, - "@typescript-eslint/types": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.0.tgz", - "integrity": "sha512-2YJM6XfWfi8pgU2HRhTp7WgRw78TCRO3dOmSpAvIQ8MOv4B46JD2chnhpNT7Jq8j0APlIbzO1Bach734xxUl4A==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.0.tgz", - "integrity": "sha512-8ZpNHDIOyqzzgZrQW9+xQ4k5hM62Xy2R4RPO3DQxMc5Rq5QkCdSpk/drka+DL9w6sXNzV5nrdlBmf8+x495QXQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.29.0", - "@typescript-eslint/visitor-keys": "4.29.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.0.tgz", - "integrity": "sha512-LoaofO1C/jAJYs0uEpYMXfHboGXzOJeV118X4OsZu9f7rG7Pr9B3+4HTU8+err81rADa4xfQmAxnRnPAI2jp+Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.29.0", - "eslint-visitor-keys": "^2.0.0" - } - }, "eslint-utils": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", @@ -4600,54 +4397,45 @@ "requires": { "eslint-visitor-keys": "^2.0.0" } - }, - "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" - } } } }, "@typescript-eslint/parser": { - "version": "4.28.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.28.5.tgz", - "integrity": "sha512-NPCOGhTnkXGMqTznqgVbA5LqVsnw+i3+XA1UKLnAb+MG1Y1rP4ZSK9GX0kJBmAZTMIktf+dTwXToT6kFwyimbw==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.29.0.tgz", + "integrity": "sha512-+92YRNHFdXgq+GhWQPT2bmjX09X7EH36JfgN2/4wmhtwV/HPxozpCNst8jrWcngLtEVd/4zAwA6BKojAlf+YqA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.28.5", - "@typescript-eslint/types": "4.28.5", - "@typescript-eslint/typescript-estree": "4.28.5", + "@typescript-eslint/scope-manager": "4.29.0", + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/typescript-estree": "4.29.0", "debug": "^4.3.1" } }, "@typescript-eslint/scope-manager": { - "version": "4.28.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.5.tgz", - "integrity": "sha512-PHLq6n9nTMrLYcVcIZ7v0VY1X7dK309NM8ya9oL/yG8syFINIMHxyr2GzGoBYUdv3NUfCOqtuqps0ZmcgnZTfQ==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.0.tgz", + "integrity": "sha512-HPq7XAaDMM3DpmuijxLV9Io8/6pQnliiXMQUcAdjpJJSR+fdmbD/zHCd7hMkjJn04UQtCQBtshgxClzg6NIS2w==", "dev": true, "requires": { - "@typescript-eslint/types": "4.28.5", - "@typescript-eslint/visitor-keys": "4.28.5" + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/visitor-keys": "4.29.0" } }, "@typescript-eslint/types": { - "version": "4.28.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.5.tgz", - "integrity": "sha512-MruOu4ZaDOLOhw4f/6iudyks/obuvvZUAHBDSW80Trnc5+ovmViLT2ZMDXhUV66ozcl6z0LJfKs1Usldgi/WCA==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.0.tgz", + "integrity": "sha512-2YJM6XfWfi8pgU2HRhTp7WgRw78TCRO3dOmSpAvIQ8MOv4B46JD2chnhpNT7Jq8j0APlIbzO1Bach734xxUl4A==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.28.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.5.tgz", - "integrity": "sha512-FzJUKsBX8poCCdve7iV7ShirP8V+ys2t1fvamVeD1rWpiAnIm550a+BX/fmTHrjEpQJ7ZAn+Z7ZZwJjytk9rZw==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.0.tgz", + "integrity": "sha512-8ZpNHDIOyqzzgZrQW9+xQ4k5hM62Xy2R4RPO3DQxMc5Rq5QkCdSpk/drka+DL9w6sXNzV5nrdlBmf8+x495QXQ==", "dev": true, "requires": { - "@typescript-eslint/types": "4.28.5", - "@typescript-eslint/visitor-keys": "4.28.5", + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/visitor-keys": "4.29.0", "debug": "^4.3.1", "globby": "^11.0.3", "is-glob": "^4.0.1", @@ -4667,12 +4455,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "4.28.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.5.tgz", - "integrity": "sha512-dva/7Rr+EkxNWdJWau26xU/0slnFlkh88v3TsyTgRS/IIYFi5iIfpCFM4ikw0vQTFUR9FYSSyqgK4w64gsgxhg==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.0.tgz", + "integrity": "sha512-LoaofO1C/jAJYs0uEpYMXfHboGXzOJeV118X4OsZu9f7rG7Pr9B3+4HTU8+err81rADa4xfQmAxnRnPAI2jp+Q==", "dev": true, "requires": { - "@typescript-eslint/types": "4.28.5", + "@typescript-eslint/types": "4.29.0", "eslint-visitor-keys": "^2.0.0" } }, diff --git a/package.json b/package.json index d5fec10..285482d 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "@google/clasp": "^2.4.0", "@types/google-apps-script": "^1.0.37", "@typescript-eslint/eslint-plugin": "^4.29.0", - "@typescript-eslint/parser": "^4.28.5", + "@typescript-eslint/parser": "^4.29.0", "eslint": "^7.32.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^3.4.0", From 33649c56e1ab04e55499408fcab9f569f8b97883 Mon Sep 17 00:00:00 2001 From: ttsukagoshi Date: Sun, 8 Aug 2021 01:40:40 +0900 Subject: [PATCH 03/12] #20: Add menu for setting up reminder notification Pending message localization --- src/i18n.js | 11 ++-- src/websiteMonitoring.js | 112 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 111 insertions(+), 12 deletions(-) diff --git a/src/i18n.js b/src/i18n.js index 39b25e6..1e7cf95 100644 --- a/src/i18n.js +++ b/src/i18n.js @@ -22,6 +22,7 @@ const MESSAGES = { menuTriggers: 'Triggers', menuSetStatusCheckTrigger: 'Set Status Check Trigger', menuSetLogExtractionTrigger: 'Set Log Extraction Trigger', + menuSetReminderTrigger: 'Set Reminder Trigger', menuDeleteTriggers: 'Delete Triggers', menuCheckStatus: 'Check Status', menuExtractStatusLogs: 'Extract Status Logs', @@ -55,7 +56,7 @@ const MESSAGES = { '\nChanges to website status have been emailed to {{myEmail}}', alertTitleCompleteStatusCheck: '[Website Status] Complete: Status Check', mailSubErrorStatusCheck: '[Website Status] Error: Status Check', - mailBodyErrorStatusCheck: + mailBodyError: '{{errorStack}}\n\n-----\nThis notice is managed by the following spreadsheet:\n{{spreadsheetUrl}}', alertTitleError: 'ERROR', errorHeaderNameTargetUrlNotFound: @@ -112,7 +113,7 @@ const MESSAGES = { alertTitleCompleteStatusCheck: '[サイト公開ステータス] 完了:ステータス確認', mailSubErrorStatusCheck: '[サイト公開ステータス] エラー:ステータス確認', - mailBodyErrorStatusCheck: + mailBodyError: '{{errorStack}}\n\n-----\nこの通知は次のGoogleスプレッドシートによって管理されています:\n{{spreadsheetUrl}}', alertTitleError: 'エラー', errorHeaderNameTargetUrlNotFound: @@ -324,13 +325,13 @@ class LocalizedMessage { return text; } /** - * Replace placeholder string in this.messageList.mailBodyErrorStatusCheck + * Replace placeholder string in this.messageList.mailBodyError * @param {String} errorStack * @param {String} spreadsheetUrl * @returns {String} The replaced text. */ - replaceMailBodyErrorStatusCheck(errorStack, spreadsheetUrl) { - let text = this.messageList.mailBodyErrorStatusCheck; + replaceMailBodyError(errorStack, spreadsheetUrl) { + let text = this.messageList.mailBodyError; let placeholderValues = [ { regexp: '{{errorStack}}', diff --git a/src/websiteMonitoring.js b/src/websiteMonitoring.js index bb32082..ca17c53 100644 --- a/src/websiteMonitoring.js +++ b/src/websiteMonitoring.js @@ -19,7 +19,9 @@ deleteTimeBasedTriggers, extractStatusLogsTriggered, onOpen, +sendReminder, setupLogExtractionTrigger, +setupReminderTrigger, setupStatusCheckTrigger, websiteMonitoringTriggered */ @@ -62,6 +64,10 @@ function onOpen() { localMessage.messageList.menuSetLogExtractionTrigger, 'setupLogExtractionTrigger' ) + .addItem( + localMessage.messageList.menuSetReminderTrigger, + 'setupReminderTrigger' + ) .addSeparator() .addItem( localMessage.messageList.menuDeleteTriggers, @@ -84,7 +90,7 @@ function setupStatusCheckTrigger() { const handlerFunction = 'websiteMonitoringTriggered'; const frequencyKey = 'TRIGGER_MINUTE_FREQUENCY_STATUS_CHECK'; const frequencyUnit = 'minute'; - setupTrigger(handlerFunction, frequencyKey, frequencyUnit); + setupTrigger_(handlerFunction, frequencyKey, frequencyUnit); } /** @@ -95,7 +101,7 @@ function setupLogExtractionTrigger() { const handlerFunction = 'extractStatusLogsTriggered'; const frequencyKey = 'TRIGGER_DAYS_FREQUENCY_LOG_EXTRACTION'; const frequencyUnit = 'day'; - setupTrigger(handlerFunction, frequencyKey, frequencyUnit); + setupTrigger_(handlerFunction, frequencyKey, frequencyUnit); } /** @@ -105,7 +111,7 @@ function setupLogExtractionTrigger() { * @param {String} frequencyKey Key in the options sheet that refers to the trigger frequency for this handler function. * @param {String} frequencyUnit Unit of the value of frequencyKey, i.e., minute, hour, day, or week. */ -function setupTrigger(handlerFunction, frequencyKey, frequencyUnit) { +function setupTrigger_(handlerFunction, frequencyKey, frequencyUnit) { const ui = SpreadsheetApp.getUi(); const myEmail = Session.getActiveUser().getEmail(); const ss = SpreadsheetApp.getActiveSpreadsheet(); @@ -200,6 +206,24 @@ function setupTrigger(handlerFunction, frequencyKey, frequencyUnit) { } } +/** + * Set time-based trigger for sending monthly reminders + * of active time-based triggers set by this user in this script. + * Trigger will be set for the first day of each month. + */ +function setupReminderTrigger() { + // UI alert message /////// + const handlerFunction = 'sendReminder'; + // Delete existing trigger for the same handler function. + ScriptApp.getProjectTriggers().forEach((trigger) => { + if (trigger.getHandlerFunction() === handlerFunction) { + ScriptApp.deleteTrigger(trigger); + } + }); + // Set new trigger + ScriptApp.newTrigger(handlerFunction).timeBased().onMonthDay(1).create(); +} + /** * Delete existing trigger(s). */ @@ -540,10 +564,7 @@ function websiteMonitoring(triggered = false) { 'NA', ]); let messageSub = localMessage.messageList.mailSubErrorStatusCheck; - let messageBody = localMessage.replaceMailBodyErrorStatusCheck( - e.stack, - ss.getUrl() - ); + let messageBody = localMessage.replaceMailBodyError(e.stack, ss.getUrl()); if (options.ENABLE_CHAT_NOTIFICATION) { // Post on Google Chat postToChat_( @@ -740,6 +761,83 @@ function extractStatusLogs(triggered = false) { } } +function sendReminder() { + const triggers = ScriptApp.getProjectTriggers(); + if (triggers.length > 0) { + const ss = SpreadsheetApp.getActiveSpreadsheet(); + const localMessage = new LocalizedMessage(ss.getSpreadsheetLocale()); + const myEmail = Session.getActiveUser().getEmail(); + // Parse options data from spreadsheet + const optionsArr = ss + .getSheetByName(SHEET_NAME_OPTIONS) + .getDataRange() + .getValues(); + optionsArr.shift(); + const options = optionsArr.reduce((obj, row) => { + let [key, value] = [row[1], row[2]]; // Assuming that the keys and their options are set in columns B and C, respectively. + if (key) { + obj[key] = value; + } + return obj; + }, {}); + var messageSub = '[Website Status] '; + var messageBody = ''; + try { + messageSub += 'Reminder: Active Triggers'; + let triggerInfo = triggers + .reduce((info, trigger) => { + if (trigger.getHandlerFunction() === 'websiteMonitoringTriggered') { + // Get the list of target websites to monitor + const targetWebsitesSheet = ss.getSheetByName(SHEET_NAME_DASHBOARD); + const targetWebsitesArr = targetWebsitesSheet + .getRange( + TARGET_WEBSITES_RANGE_POSITION.row, + TARGET_WEBSITES_RANGE_POSITION.col, + targetWebsitesSheet.getLastRow() - + TARGET_WEBSITES_RANGE_POSITION.row + + 1, + TARGET_WEBSITES_COL_NUM + ) + .getValues(); + targetWebsitesArr.shift(); + info.push( + `Website Monitoring:\n${targetWebsitesArr + .map((website) => `- ${website.join(' ')}`) + .join('\n')}` + ); + } else if ( + trigger.getHandlerFunction() === 'extractStatusLogsTriggered' + ) { + info.push('Trigger for periodical status log extraction is set.'); + } + return info; + }, []) + .join('\n'); + messageBody = `This is a monthly reminder of the time-based triggers set for this website monitoring script:\n\n${triggerInfo}\n\n-----\nThis notice is managed by the following spreadsheet:\n${ss.getUrl()}`; ////// + } catch (e) { + console.error(e.stack); + messageSub = '[Website Status] Error: Send Reminder'; // localMessage.messageList.mailSubErrorSendReminder; + messageBody = localMessage.replaceMailBodyError(e.stack, ss.getUrl()); + } finally { + if (options.ENABLE_CHAT_NOTIFICATION) { + // Post on Google Chat + postToChat_( + options.CHAT_WEBHOOK_URL, + `*${messageSub}*\n\n${messageBody}` + ); + } + if ( + !options.ENABLE_CHAT_NOTIFICATION || + !options.DISABLE_MAIL_NOTIFICATION + ) { + // If chat notification is disabled OR mail notification is NOT disabled + // send email notification + MailApp.sendEmail(myEmail, messageSub, messageBody); + } + } + } +} + /** * Parse a given array of HTTP reponse codes (in strings) into actual codes. * For example, ["201", "30x"] will be converted into the following array of codes: From 36bcff7aa4b23dbbd5139eaa73c09101525e6e82 Mon Sep 17 00:00:00 2001 From: ttsukagoshi Date: Tue, 10 Aug 2021 01:01:43 +0900 Subject: [PATCH 04/12] Close #20: Reminder message localization --- src/i18n.js | 58 ++++++++++++++++++++++++++++++++++++++++ src/websiteMonitoring.js | 34 ++++++++++++++++++----- 2 files changed, 85 insertions(+), 7 deletions(-) diff --git a/src/i18n.js b/src/i18n.js index 1e7cf95..6ece903 100644 --- a/src/i18n.js +++ b/src/i18n.js @@ -39,6 +39,8 @@ const MESSAGES = { alertTitleCompleteTriggerSetup: 'Complete ({{handlerFunction}})', alertMessageCompleteTriggerSetup: 'Trigger set at {{frequency}}-{{frequencyUnit}} interval.', + alertMessageCompleteReminderTriggerSetup: + 'Monthly reminder to notify {{myEmail}} of the website status settings is now set up. You will be notified of the monitoring status on the first day of each month.', alertTitleContinueTriggerDelete: 'Deleting All Triggers', alertMessageContinueTriggerDelete: 'Deleting all existing trigger(s) on this spreadsheet/script set by {{myEmail}}. Are you sure you want to continue?', @@ -71,12 +73,21 @@ const MESSAGES = { '[Website Status] Error in Status Log Extraction:\n{{errorStack}}', errorInvalidResponseCode: 'Invalid response code "{{code}}" at ALLOWED_RESPONSE_CODES or ERROR_RESPONSE_CODES.', + mailSubSendReminderPrefix: '[Website Status] ', + mailSubSendReminder: 'Reminder: Active Triggers', + mailBodySendReminder: + 'This is a monthly reminder, sent automatically, of the time-based triggers set for this website monitoring script:\n\n{{triggerInfo}}\n\n-----\nThis notice is managed by the following spreadsheet:\n{{spreadsheetUrl}}', + mailSubErrorSendReminder: 'Error: Send Reminder', + messageMonitoredSitesPrefix: 'Monitored Websites', + messageTriggerLogExtractionIsSet: + 'Trigger for periodical status log extraction is set.', }, ja_JP: { menuTitle: 'サイト公開ステータス', menuTriggers: 'トリガー', menuSetStatusCheckTrigger: 'トリガー設定(ステータス確認)', menuSetLogExtractionTrigger: 'トリガー設定(ログ抽出)', + menuSetReminderTrigger: 'トリガー設定(リマインダー)', menuDeleteTriggers: 'トリガー削除', menuCheckStatus: 'ステータス確認', menuExtractStatusLogs: '確認ログを抽出', @@ -94,6 +105,8 @@ const MESSAGES = { alertTitleCompleteTriggerSetup: '完了({{handlerFunction}})', alertMessageCompleteTriggerSetup: 'トリガー設定完了:{{frequency}}-{{frequencyUnit}}間隔.', + alertMessageCompleteReminderTriggerSetup: + '{{myEmail}}宛にサイト公開ステータス監視の設定状況をリマインドするトリガーの設定が完了しました。毎月1日に、公開監視状況の設定が通知されます。', alertTitleContinueTriggerDelete: '全てのトリガーを削除します', alertMessageContinueTriggerDelete: 'このスプレッドシート/スクリプトで {{myEmail}} によって設定された全てのトリガーを削除します。このまま続けますか?', @@ -128,6 +141,14 @@ const MESSAGES = { '[サイト公開ステータス] ログ抽出エラー:\n{{errorStack}}', errorInvalidResponseCode: '無効なレスポンスコード「{{code}}」が ALLOWED_RESPONSE_CODES または ERROR_RESPONSE_CODES にて指定されています。', + mailSubSendReminderPrefix: '[サイト公開ステータス] ', + mailSubSendReminder: 'リマインダー:設定されているトリガー', + mailBodySendReminder: + 'これは、サイト公開ステータス監視のトリガー設定状況をお知らせするため、毎月1日に自動的に送信されるリマインダーです。\n\n{{triggerInfo}}\n\n-----\nこの通知は次のGoogleスプレッドシートによって管理されています:\n{{spreadsheetUrl}}', + mailSubErrorSendReminder: 'エラー:リマインダー送信', + messageMonitoredSitesPrefix: '公開ステータスの監視対象サイト', + messageTriggerLogExtractionIsSet: + '公開ステータスログを定期的に抽出するトリガーが設定されています。', }, }; @@ -425,4 +446,41 @@ class LocalizedMessage { text = this.replacePlaceholders_(text, placeholderValues); return text; } + /** + * Replace placeholder string in this.messageList.alertMessageCompleteReminderTriggerSetup + * @param {String} myEmail + * @returns {String} The replaced text. + */ + replaceAlertMessageCompleteReminderTriggerSetup(myEmail) { + let text = this.messageList.alertMessageCompleteReminderTriggerSetup; + let placeholderValues = [ + { + regexp: '{{myEmail}}', + value: myEmail, + }, + ]; + text = this.replacePlaceholders_(text, placeholderValues); + return text; + } + /** + * Replace placeholder string in this.messageList.mailBodySendReminder + * @param {String} triggerInfo + * @param {String} spreadsheetUrl + * @returns {String} The replaced text. + */ + replaceMailBodySendReminder(triggerInfo, spreadsheetUrl) { + let text = this.messageList.mailBodySendReminder; + let placeholderValues = [ + { + regexp: '{{triggerInfo}}', + value: triggerInfo, + }, + { + regexp: '{{spreadsheetUrl}}', + value: spreadsheetUrl, + }, + ]; + text = this.replacePlaceholders_(text, placeholderValues); + return text; + } } diff --git a/src/websiteMonitoring.js b/src/websiteMonitoring.js index ca17c53..7c98d22 100644 --- a/src/websiteMonitoring.js +++ b/src/websiteMonitoring.js @@ -212,7 +212,10 @@ function setupTrigger_(handlerFunction, frequencyKey, frequencyUnit) { * Trigger will be set for the first day of each month. */ function setupReminderTrigger() { - // UI alert message /////// + const ui = SpreadsheetApp.getUi(); + const localMessage = new LocalizedMessage( + SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetLocale() + ); const handlerFunction = 'sendReminder'; // Delete existing trigger for the same handler function. ScriptApp.getProjectTriggers().forEach((trigger) => { @@ -222,6 +225,13 @@ function setupReminderTrigger() { }); // Set new trigger ScriptApp.newTrigger(handlerFunction).timeBased().onMonthDay(1).create(); + ui.alert( + localMessage.replaceAlertTitleCompleteTriggerSetup(handlerFunction), + localMessage.replaceAlertMessageCompleteReminderTriggerSetup( + Session.getActiveUser().getEmail() + ), + ui.ButtonSet.OK + ); } /** @@ -761,6 +771,9 @@ function extractStatusLogs(triggered = false) { } } +/** + * Send a reminder to the user on the website status monitoring settings. + */ function sendReminder() { const triggers = ScriptApp.getProjectTriggers(); if (triggers.length > 0) { @@ -780,10 +793,9 @@ function sendReminder() { } return obj; }, {}); - var messageSub = '[Website Status] '; + var messageSub = localMessage.messageList.mailSubSendReminderPrefix; var messageBody = ''; try { - messageSub += 'Reminder: Active Triggers'; let triggerInfo = triggers .reduce((info, trigger) => { if (trigger.getHandlerFunction() === 'websiteMonitoringTriggered') { @@ -801,22 +813,30 @@ function sendReminder() { .getValues(); targetWebsitesArr.shift(); info.push( - `Website Monitoring:\n${targetWebsitesArr + `${ + localMessage.messageList.messageMonitoredSitesPrefix + }:\n${targetWebsitesArr .map((website) => `- ${website.join(' ')}`) .join('\n')}` ); } else if ( trigger.getHandlerFunction() === 'extractStatusLogsTriggered' ) { - info.push('Trigger for periodical status log extraction is set.'); + info.push( + localMessage.messageList.messageTriggerLogExtractionIsSet + ); } return info; }, []) .join('\n'); - messageBody = `This is a monthly reminder of the time-based triggers set for this website monitoring script:\n\n${triggerInfo}\n\n-----\nThis notice is managed by the following spreadsheet:\n${ss.getUrl()}`; ////// + messageSub += localMessage.messageList.mailSubSendReminder; + messageBody = localMessage.replaceMailBodySendReminder( + triggerInfo, + ss.getUrl() + ); } catch (e) { console.error(e.stack); - messageSub = '[Website Status] Error: Send Reminder'; // localMessage.messageList.mailSubErrorSendReminder; + messageSub += localMessage.messageList.mailSubErrorSendReminder; messageBody = localMessage.replaceMailBodyError(e.stack, ss.getUrl()); } finally { if (options.ENABLE_CHAT_NOTIFICATION) { From 11d98acec641c77f69d85b4cbce84103342f40fe Mon Sep 17 00:00:00 2001 From: ttsukagoshi Date: Tue, 10 Aug 2021 01:06:51 +0900 Subject: [PATCH 05/12] Add message to refer to the managing spreadsheet for the latest and detailed info on website status --- src/i18n.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n.js b/src/i18n.js index 6ece903..2e5342c 100644 --- a/src/i18n.js +++ b/src/i18n.js @@ -76,7 +76,7 @@ const MESSAGES = { mailSubSendReminderPrefix: '[Website Status] ', mailSubSendReminder: 'Reminder: Active Triggers', mailBodySendReminder: - 'This is a monthly reminder, sent automatically, of the time-based triggers set for this website monitoring script:\n\n{{triggerInfo}}\n\n-----\nThis notice is managed by the following spreadsheet:\n{{spreadsheetUrl}}', + 'This is a monthly reminder, sent automatically, of the time-based triggers set for this website monitoring script:\n\n{{triggerInfo}}\nSee the managing spreadsheet for details on the latest website status.\n\n-----\nThis notice is managed by the following spreadsheet:\n{{spreadsheetUrl}}', mailSubErrorSendReminder: 'Error: Send Reminder', messageMonitoredSitesPrefix: 'Monitored Websites', messageTriggerLogExtractionIsSet: @@ -144,7 +144,7 @@ const MESSAGES = { mailSubSendReminderPrefix: '[サイト公開ステータス] ', mailSubSendReminder: 'リマインダー:設定されているトリガー', mailBodySendReminder: - 'これは、サイト公開ステータス監視のトリガー設定状況をお知らせするため、毎月1日に自動的に送信されるリマインダーです。\n\n{{triggerInfo}}\n\n-----\nこの通知は次のGoogleスプレッドシートによって管理されています:\n{{spreadsheetUrl}}', + 'これは、サイト公開ステータス監視のトリガー設定状況をお知らせするため、毎月1日に自動的に送信されるリマインダーです。\n\n{{triggerInfo}}\n最新のサイト公開ステータスについては、管理スプレッドシートをご確認ください。\n\n-----\nこの通知は次のGoogleスプレッドシートによって管理されています:\n{{spreadsheetUrl}}', mailSubErrorSendReminder: 'エラー:リマインダー送信', messageMonitoredSitesPrefix: '公開ステータスの監視対象サイト', messageTriggerLogExtractionIsSet: From e25b8370928a05b3bc2d73500a92153a12ca7002 Mon Sep 17 00:00:00 2001 From: ttsukagoshi Date: Tue, 10 Aug 2021 01:24:26 +0900 Subject: [PATCH 06/12] Fix #38: Avoid sending reminders if no triggers aside from the reminder is set --- src/websiteMonitoring.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/websiteMonitoring.js b/src/websiteMonitoring.js index 7c98d22..a57f7f7 100644 --- a/src/websiteMonitoring.js +++ b/src/websiteMonitoring.js @@ -776,7 +776,13 @@ function extractStatusLogs(triggered = false) { */ function sendReminder() { const triggers = ScriptApp.getProjectTriggers(); - if (triggers.length > 0) { + if ( + triggers.length > 0 && + !( + triggers.length === 1 && + triggers[0].getHandlerFunction() === 'sendReminder' + ) + ) { const ss = SpreadsheetApp.getActiveSpreadsheet(); const localMessage = new LocalizedMessage(ss.getSpreadsheetLocale()); const myEmail = Session.getActiveUser().getEmail(); From ecd967c6fea47431443c03ee761b00e572ee0e60 Mon Sep 17 00:00:00 2001 From: ttsukagoshi Date: Tue, 10 Aug 2021 01:48:38 +0900 Subject: [PATCH 07/12] Add CodeQL badge to README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c0bc295..b85ae1c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Website Status Monitoring -[![GitHub Super-Linter](https://github.com/ttsukagoshi/website-monitoring-by-gas/workflows/Lint%20Code%20Base/badge.svg)](https://github.com/marketplace/actions/super-linter) [![clasp](https://img.shields.io/badge/built%20with-clasp-4285f4.svg?style=flat-square)](https://github.com/google/clasp) [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier) +[![clasp](https://img.shields.io/badge/built%20with-clasp-4285f4.svg?style=flat-square)](https://github.com/google/clasp) [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier) [![CodeQL](https://github.com/ttsukagoshi/website-monitoring-by-gas/workflows/CodeQL/badge.svg)](https://github.com/ttsukagoshi/website-monitoring-by-gas/actions?query=workflow%3ACodeQL) [![GitHub Super-Linter](https://github.com/ttsukagoshi/website-monitoring-by-gas/workflows/Lint%20Code%20Base/badge.svg)](https://github.com/marketplace/actions/super-linter) Website status monitoring using Google Sheets and Google Apps Script. From b72b6ede183cd5aac534d3b43bc4f5f986d1a526 Mon Sep 17 00:00:00 2001 From: ttsukagoshi Date: Tue, 10 Aug 2021 02:00:29 +0900 Subject: [PATCH 08/12] Closes #42: Remove debugging logs --- src/websiteMonitoring.js | 47 +++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/src/websiteMonitoring.js b/src/websiteMonitoring.js index a57f7f7..242fcd1 100644 --- a/src/websiteMonitoring.js +++ b/src/websiteMonitoring.js @@ -112,6 +112,7 @@ function setupLogExtractionTrigger() { * @param {String} frequencyUnit Unit of the value of frequencyKey, i.e., minute, hour, day, or week. */ function setupTrigger_(handlerFunction, frequencyKey, frequencyUnit) { + console.info(`[setupTrigger_] Setting trigger for ${handlerFunction}...`); const ui = SpreadsheetApp.getUi(); const myEmail = Session.getActiveUser().getEmail(); const ss = SpreadsheetApp.getActiveSpreadsheet(); @@ -193,6 +194,7 @@ function setupTrigger_(handlerFunction, frequencyKey, frequencyUnit) { localMessage.replaceErrorInvalidFrequencyUnit(frequencyUnit) ); } + console.info('[setupTrigger_] Trigger set up complete.'); ui.alert( localMessage.replaceAlertTitleCompleteTriggerSetup(handlerFunction), localMessage.replaceAlertMessageCompleteTriggerSetup( @@ -202,6 +204,7 @@ function setupTrigger_(handlerFunction, frequencyKey, frequencyUnit) { ui.ButtonSet.OK ); } catch (e) { + console.error(e.stack); ui.alert(e.stack); } } @@ -212,32 +215,42 @@ function setupTrigger_(handlerFunction, frequencyKey, frequencyUnit) { * Trigger will be set for the first day of each month. */ function setupReminderTrigger() { + console.info( + '[setupReminderTrigger] Setting trigger for the monthly reminder...' + ); const ui = SpreadsheetApp.getUi(); const localMessage = new LocalizedMessage( SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetLocale() ); const handlerFunction = 'sendReminder'; - // Delete existing trigger for the same handler function. - ScriptApp.getProjectTriggers().forEach((trigger) => { - if (trigger.getHandlerFunction() === handlerFunction) { - ScriptApp.deleteTrigger(trigger); - } - }); - // Set new trigger - ScriptApp.newTrigger(handlerFunction).timeBased().onMonthDay(1).create(); - ui.alert( - localMessage.replaceAlertTitleCompleteTriggerSetup(handlerFunction), - localMessage.replaceAlertMessageCompleteReminderTriggerSetup( - Session.getActiveUser().getEmail() - ), - ui.ButtonSet.OK - ); + try { + // Delete existing trigger for the same handler function. + ScriptApp.getProjectTriggers().forEach((trigger) => { + if (trigger.getHandlerFunction() === handlerFunction) { + ScriptApp.deleteTrigger(trigger); + } + }); + // Set new trigger + ScriptApp.newTrigger(handlerFunction).timeBased().onMonthDay(1).create(); + console.info('[setupReminderTrigger] Trigger set up complete.'); + ui.alert( + localMessage.replaceAlertTitleCompleteTriggerSetup(handlerFunction), + localMessage.replaceAlertMessageCompleteReminderTriggerSetup( + Session.getActiveUser().getEmail() + ), + ui.ButtonSet.OK + ); + } catch (e) { + console.error(e.stack); + ui.alert(e.stack); + } } /** * Delete existing trigger(s). */ function deleteTimeBasedTriggers() { + console.info('[deleteTimeBasedTriggers] Deleting triggers...'); const ui = SpreadsheetApp.getUi(); const myEmail = Session.getActiveUser().getEmail(); const localMessage = new LocalizedMessage( @@ -256,12 +269,14 @@ function deleteTimeBasedTriggers() { ScriptApp.getProjectTriggers().forEach((trigger) => ScriptApp.deleteTrigger(trigger) ); + console.info('[deleteTimeBasedTriggers] Deleted triggers.'); ui.alert( localMessage.messageList.alertTitleComplete, localMessage.messageList.alertMessageTriggerDelete, ui.ButtonSet.OK ); } catch (e) { + console.error(e.stack); ui.alert(e.stack); } } @@ -402,7 +417,6 @@ function websiteMonitoring(triggered = false) { RESPONSE_CODE_WILDCARD, spreadsheetLocale ); - console.log(JSON.stringify(options)); ////////////////// // Get the actual HTTP response codes let dashboardStatus = []; // Array to record on the dashboard worksheet let statusChange = targetWebsites.reduce( @@ -474,7 +488,6 @@ function websiteMonitoring(triggered = false) { .shift(); latestStatusSheet.getDataRange().clearContent(); dashboardStatus = [existingStatusHeader].concat(dashboardStatus); - console.log(dashboardStatus); latestStatusSheet .getRange(1, 1, dashboardStatus.length, dashboardStatus[0].length) .setValues(dashboardStatus); From 0d43ac65e34e26c46e83fcd99601891dc1ead33d Mon Sep 17 00:00:00 2001 From: ttsukagoshi Date: Tue, 10 Aug 2021 02:13:45 +0900 Subject: [PATCH 09/12] Closes #43: Activate the monthly reminder when triggers for website status checks and/or status log extraction is set --- src/websiteMonitoring.js | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/websiteMonitoring.js b/src/websiteMonitoring.js index 242fcd1..5c45b0e 100644 --- a/src/websiteMonitoring.js +++ b/src/websiteMonitoring.js @@ -194,6 +194,8 @@ function setupTrigger_(handlerFunction, frequencyKey, frequencyUnit) { localMessage.replaceErrorInvalidFrequencyUnit(frequencyUnit) ); } + // Set up a trigger for monthly reminders + setupReminderTrigger(true); console.info('[setupTrigger_] Trigger set up complete.'); ui.alert( localMessage.replaceAlertTitleCompleteTriggerSetup(handlerFunction), @@ -213,12 +215,15 @@ function setupTrigger_(handlerFunction, frequencyKey, frequencyUnit) { * Set time-based trigger for sending monthly reminders * of active time-based triggers set by this user in this script. * Trigger will be set for the first day of each month. + * @param {Boolean} muteUi Will not show any UI alerts when true. Defaults to false. */ -function setupReminderTrigger() { +function setupReminderTrigger(muteUi = false) { console.info( '[setupReminderTrigger] Setting trigger for the monthly reminder...' ); - const ui = SpreadsheetApp.getUi(); + if (!muteUi) { + var ui = SpreadsheetApp.getUi(); + } const localMessage = new LocalizedMessage( SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetLocale() ); @@ -233,16 +238,22 @@ function setupReminderTrigger() { // Set new trigger ScriptApp.newTrigger(handlerFunction).timeBased().onMonthDay(1).create(); console.info('[setupReminderTrigger] Trigger set up complete.'); - ui.alert( - localMessage.replaceAlertTitleCompleteTriggerSetup(handlerFunction), - localMessage.replaceAlertMessageCompleteReminderTriggerSetup( - Session.getActiveUser().getEmail() - ), - ui.ButtonSet.OK - ); + if (!muteUi) { + ui.alert( + localMessage.replaceAlertTitleCompleteTriggerSetup(handlerFunction), + localMessage.replaceAlertMessageCompleteReminderTriggerSetup( + Session.getActiveUser().getEmail() + ), + ui.ButtonSet.OK + ); + } } catch (e) { console.error(e.stack); - ui.alert(e.stack); + if (!muteUi) { + ui.alert(e.stack); + } else { + throw e; + } } } From 6d28012c37066e8eb9fb4247eb4d9fab705d514f Mon Sep 17 00:00:00 2001 From: ttsukagoshi Date: Tue, 10 Aug 2021 02:20:39 +0900 Subject: [PATCH 10/12] Change target branch of dependabot to main --- .github/dependabot.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 842de61..5cfb56c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -14,7 +14,7 @@ updates: commit-message: prefix: 'github-actions' include: 'scope' - target-branch: 'dev' + target-branch: 'main' - package-ecosystem: 'npm' directory: '/' schedule: @@ -24,4 +24,4 @@ updates: commit-message: prefix: 'npm' include: 'scope' - target-branch: 'dev' + target-branch: 'main' From e3e2d2bad33ad87576d8ee436708112d1fef703c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Aug 2021 17:26:31 +0000 Subject: [PATCH 11/12] npm(deps-dev): bump @typescript-eslint/parser from 4.29.0 to 4.29.1 Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 4.29.0 to 4.29.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.29.1/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 167 ++++++++++++++++++++++++++++++++++++++++++---- package.json | 2 +- 2 files changed, 155 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index b334b13..e044c13 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "@google/clasp": "^2.4.0", "@types/google-apps-script": "^1.0.37", "@typescript-eslint/eslint-plugin": "^4.29.0", - "@typescript-eslint/parser": "^4.29.0", + "@typescript-eslint/parser": "^4.29.1", "eslint": "^7.32.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^3.4.0", @@ -412,14 +412,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.29.0.tgz", - "integrity": "sha512-+92YRNHFdXgq+GhWQPT2bmjX09X7EH36JfgN2/4wmhtwV/HPxozpCNst8jrWcngLtEVd/4zAwA6BKojAlf+YqA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.29.1.tgz", + "integrity": "sha512-3fL5iN20hzX3Q4OkG7QEPFjZV2qsVGiDhEwwh+EkmE/w7oteiOvUNzmpu5eSwGJX/anCryONltJ3WDmAzAoCMg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "4.29.0", - "@typescript-eslint/types": "4.29.0", - "@typescript-eslint/typescript-estree": "4.29.0", + "@typescript-eslint/scope-manager": "4.29.1", + "@typescript-eslint/types": "4.29.1", + "@typescript-eslint/typescript-estree": "4.29.1", "debug": "^4.3.1" }, "engines": { @@ -438,6 +438,95 @@ } } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.1.tgz", + "integrity": "sha512-Hzv/uZOa9zrD/W5mftZa54Jd5Fed3tL6b4HeaOpwVSabJK8CJ+2MkDasnX/XK4rqP5ZTWngK1ZDeCi6EnxPQ7A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.29.1", + "@typescript-eslint/visitor-keys": "4.29.1" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.1.tgz", + "integrity": "sha512-Jj2yu78IRfw4nlaLtKjVaGaxh/6FhofmQ/j8v3NXmAiKafbIqtAPnKYrf0sbGjKdj0hS316J8WhnGnErbJ4RCA==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.1.tgz", + "integrity": "sha512-lIkkrR9E4lwZkzPiRDNq0xdC3f2iVCUjw/7WPJ4S2Sl6C3nRWkeE1YXCQ0+KsiaQRbpY16jNaokdWnm9aUIsfw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.29.1", + "@typescript-eslint/visitor-keys": "4.29.1", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.1.tgz", + "integrity": "sha512-zLqtjMoXvgdZY/PG6gqA73V8BjqPs4af1v2kiiETBObp+uC6gRYnJLmJHxC0QyUrrHDLJPIWNYxoBV3wbcRlag==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.29.1", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/scope-manager": { "version": "4.29.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.0.tgz", @@ -4401,15 +4490,67 @@ } }, "@typescript-eslint/parser": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.29.0.tgz", - "integrity": "sha512-+92YRNHFdXgq+GhWQPT2bmjX09X7EH36JfgN2/4wmhtwV/HPxozpCNst8jrWcngLtEVd/4zAwA6BKojAlf+YqA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.29.1.tgz", + "integrity": "sha512-3fL5iN20hzX3Q4OkG7QEPFjZV2qsVGiDhEwwh+EkmE/w7oteiOvUNzmpu5eSwGJX/anCryONltJ3WDmAzAoCMg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.29.0", - "@typescript-eslint/types": "4.29.0", - "@typescript-eslint/typescript-estree": "4.29.0", + "@typescript-eslint/scope-manager": "4.29.1", + "@typescript-eslint/types": "4.29.1", + "@typescript-eslint/typescript-estree": "4.29.1", "debug": "^4.3.1" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.1.tgz", + "integrity": "sha512-Hzv/uZOa9zrD/W5mftZa54Jd5Fed3tL6b4HeaOpwVSabJK8CJ+2MkDasnX/XK4rqP5ZTWngK1ZDeCi6EnxPQ7A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.29.1", + "@typescript-eslint/visitor-keys": "4.29.1" + } + }, + "@typescript-eslint/types": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.1.tgz", + "integrity": "sha512-Jj2yu78IRfw4nlaLtKjVaGaxh/6FhofmQ/j8v3NXmAiKafbIqtAPnKYrf0sbGjKdj0hS316J8WhnGnErbJ4RCA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.1.tgz", + "integrity": "sha512-lIkkrR9E4lwZkzPiRDNq0xdC3f2iVCUjw/7WPJ4S2Sl6C3nRWkeE1YXCQ0+KsiaQRbpY16jNaokdWnm9aUIsfw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.29.1", + "@typescript-eslint/visitor-keys": "4.29.1", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.1.tgz", + "integrity": "sha512-zLqtjMoXvgdZY/PG6gqA73V8BjqPs4af1v2kiiETBObp+uC6gRYnJLmJHxC0QyUrrHDLJPIWNYxoBV3wbcRlag==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.29.1", + "eslint-visitor-keys": "^2.0.0" + } + }, + "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" + } + } } }, "@typescript-eslint/scope-manager": { diff --git a/package.json b/package.json index 285482d..93771e6 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "@google/clasp": "^2.4.0", "@types/google-apps-script": "^1.0.37", "@typescript-eslint/eslint-plugin": "^4.29.0", - "@typescript-eslint/parser": "^4.29.0", + "@typescript-eslint/parser": "^4.29.1", "eslint": "^7.32.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^3.4.0", From 7476d14c34dfec08276f2eb7912c71cd46def3b6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Aug 2021 17:31:20 +0000 Subject: [PATCH 12/12] npm(deps-dev): bump @typescript-eslint/eslint-plugin Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 4.29.0 to 4.29.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.29.1/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 235 ++++++++++------------------------------------ package.json | 2 +- 2 files changed, 48 insertions(+), 189 deletions(-) diff --git a/package-lock.json b/package-lock.json index e044c13..f469bf8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "devDependencies": { "@google/clasp": "^2.4.0", "@types/google-apps-script": "^1.0.37", - "@typescript-eslint/eslint-plugin": "^4.29.0", + "@typescript-eslint/eslint-plugin": "^4.29.1", "@typescript-eslint/parser": "^4.29.1", "eslint": "^7.32.0", "eslint-config-prettier": "^8.3.0", @@ -324,13 +324,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.0.tgz", - "integrity": "sha512-eiREtqWRZ8aVJcNru7cT/AMVnYd9a2UHsfZT8MR1dW3UUEg6jDv9EQ9Cq4CUPZesyQ58YUpoAADGv71jY8RwgA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.1.tgz", + "integrity": "sha512-AHqIU+SqZZgBEiWOrtN94ldR3ZUABV5dUG94j8Nms9rQnHFc8fvDOue/58K4CFz6r8OtDDc35Pw9NQPWo0Ayrw==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "4.29.0", - "@typescript-eslint/scope-manager": "4.29.0", + "@typescript-eslint/experimental-utils": "4.29.1", + "@typescript-eslint/scope-manager": "4.29.1", "debug": "^4.3.1", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.1.0", @@ -370,15 +370,15 @@ } }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.0.tgz", - "integrity": "sha512-FpNVKykfeaIxlArLUP/yQfv/5/3rhl1ov6RWgud4OgbqWLkEq7lqgQU9iiavZRzpzCRQV4XddyFz3wFXdkiX9w==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.1.tgz", + "integrity": "sha512-kl6QG6qpzZthfd2bzPNSJB2YcZpNOrP6r9jueXupcZHnL74WiuSjaft7WSu17J9+ae9zTlk0KJMXPUj0daBxMw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.29.0", - "@typescript-eslint/types": "4.29.0", - "@typescript-eslint/typescript-estree": "4.29.0", + "@typescript-eslint/scope-manager": "4.29.1", + "@typescript-eslint/types": "4.29.1", + "@typescript-eslint/typescript-estree": "4.29.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -438,7 +438,7 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "node_modules/@typescript-eslint/scope-manager": { "version": "4.29.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.1.tgz", "integrity": "sha512-Hzv/uZOa9zrD/W5mftZa54Jd5Fed3tL6b4HeaOpwVSabJK8CJ+2MkDasnX/XK4rqP5ZTWngK1ZDeCi6EnxPQ7A==", @@ -455,7 +455,7 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "node_modules/@typescript-eslint/types": { "version": "4.29.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.1.tgz", "integrity": "sha512-Jj2yu78IRfw4nlaLtKjVaGaxh/6FhofmQ/j8v3NXmAiKafbIqtAPnKYrf0sbGjKdj0hS316J8WhnGnErbJ4RCA==", @@ -468,7 +468,7 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "node_modules/@typescript-eslint/typescript-estree": { "version": "4.29.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.1.tgz", "integrity": "sha512-lIkkrR9E4lwZkzPiRDNq0xdC3f2iVCUjw/7WPJ4S2Sl6C3nRWkeE1YXCQ0+KsiaQRbpY16jNaokdWnm9aUIsfw==", @@ -495,95 +495,6 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.1.tgz", - "integrity": "sha512-zLqtjMoXvgdZY/PG6gqA73V8BjqPs4af1v2kiiETBObp+uC6gRYnJLmJHxC0QyUrrHDLJPIWNYxoBV3wbcRlag==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.29.1", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.0.tgz", - "integrity": "sha512-HPq7XAaDMM3DpmuijxLV9Io8/6pQnliiXMQUcAdjpJJSR+fdmbD/zHCd7hMkjJn04UQtCQBtshgxClzg6NIS2w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.29.0", - "@typescript-eslint/visitor-keys": "4.29.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.0.tgz", - "integrity": "sha512-2YJM6XfWfi8pgU2HRhTp7WgRw78TCRO3dOmSpAvIQ8MOv4B46JD2chnhpNT7Jq8j0APlIbzO1Bach734xxUl4A==", - "dev": true, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.0.tgz", - "integrity": "sha512-8ZpNHDIOyqzzgZrQW9+xQ4k5hM62Xy2R4RPO3DQxMc5Rq5QkCdSpk/drka+DL9w6sXNzV5nrdlBmf8+x495QXQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.29.0", - "@typescript-eslint/visitor-keys": "4.29.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -600,12 +511,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.0.tgz", - "integrity": "sha512-LoaofO1C/jAJYs0uEpYMXfHboGXzOJeV118X4OsZu9f7rG7Pr9B3+4HTU8+err81rADa4xfQmAxnRnPAI2jp+Q==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.1.tgz", + "integrity": "sha512-zLqtjMoXvgdZY/PG6gqA73V8BjqPs4af1v2kiiETBObp+uC6gRYnJLmJHxC0QyUrrHDLJPIWNYxoBV3wbcRlag==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/types": "4.29.1", "eslint-visitor-keys": "^2.0.0" }, "engines": { @@ -4439,13 +4350,13 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.0.tgz", - "integrity": "sha512-eiREtqWRZ8aVJcNru7cT/AMVnYd9a2UHsfZT8MR1dW3UUEg6jDv9EQ9Cq4CUPZesyQ58YUpoAADGv71jY8RwgA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.1.tgz", + "integrity": "sha512-AHqIU+SqZZgBEiWOrtN94ldR3ZUABV5dUG94j8Nms9rQnHFc8fvDOue/58K4CFz6r8OtDDc35Pw9NQPWo0Ayrw==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.29.0", - "@typescript-eslint/scope-manager": "4.29.0", + "@typescript-eslint/experimental-utils": "4.29.1", + "@typescript-eslint/scope-manager": "4.29.1", "debug": "^4.3.1", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.1.0", @@ -4465,15 +4376,15 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.0.tgz", - "integrity": "sha512-FpNVKykfeaIxlArLUP/yQfv/5/3rhl1ov6RWgud4OgbqWLkEq7lqgQU9iiavZRzpzCRQV4XddyFz3wFXdkiX9w==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.1.tgz", + "integrity": "sha512-kl6QG6qpzZthfd2bzPNSJB2YcZpNOrP6r9jueXupcZHnL74WiuSjaft7WSu17J9+ae9zTlk0KJMXPUj0daBxMw==", "dev": true, "requires": { "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.29.0", - "@typescript-eslint/types": "4.29.0", - "@typescript-eslint/typescript-estree": "4.29.0", + "@typescript-eslint/scope-manager": "4.29.1", + "@typescript-eslint/types": "4.29.1", + "@typescript-eslint/typescript-estree": "4.29.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -4499,84 +4410,32 @@ "@typescript-eslint/types": "4.29.1", "@typescript-eslint/typescript-estree": "4.29.1", "debug": "^4.3.1" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.1.tgz", - "integrity": "sha512-Hzv/uZOa9zrD/W5mftZa54Jd5Fed3tL6b4HeaOpwVSabJK8CJ+2MkDasnX/XK4rqP5ZTWngK1ZDeCi6EnxPQ7A==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.29.1", - "@typescript-eslint/visitor-keys": "4.29.1" - } - }, - "@typescript-eslint/types": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.1.tgz", - "integrity": "sha512-Jj2yu78IRfw4nlaLtKjVaGaxh/6FhofmQ/j8v3NXmAiKafbIqtAPnKYrf0sbGjKdj0hS316J8WhnGnErbJ4RCA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.1.tgz", - "integrity": "sha512-lIkkrR9E4lwZkzPiRDNq0xdC3f2iVCUjw/7WPJ4S2Sl6C3nRWkeE1YXCQ0+KsiaQRbpY16jNaokdWnm9aUIsfw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.29.1", - "@typescript-eslint/visitor-keys": "4.29.1", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.1.tgz", - "integrity": "sha512-zLqtjMoXvgdZY/PG6gqA73V8BjqPs4af1v2kiiETBObp+uC6gRYnJLmJHxC0QyUrrHDLJPIWNYxoBV3wbcRlag==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.29.1", - "eslint-visitor-keys": "^2.0.0" - } - }, - "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" - } - } } }, "@typescript-eslint/scope-manager": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.0.tgz", - "integrity": "sha512-HPq7XAaDMM3DpmuijxLV9Io8/6pQnliiXMQUcAdjpJJSR+fdmbD/zHCd7hMkjJn04UQtCQBtshgxClzg6NIS2w==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.1.tgz", + "integrity": "sha512-Hzv/uZOa9zrD/W5mftZa54Jd5Fed3tL6b4HeaOpwVSabJK8CJ+2MkDasnX/XK4rqP5ZTWngK1ZDeCi6EnxPQ7A==", "dev": true, "requires": { - "@typescript-eslint/types": "4.29.0", - "@typescript-eslint/visitor-keys": "4.29.0" + "@typescript-eslint/types": "4.29.1", + "@typescript-eslint/visitor-keys": "4.29.1" } }, "@typescript-eslint/types": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.0.tgz", - "integrity": "sha512-2YJM6XfWfi8pgU2HRhTp7WgRw78TCRO3dOmSpAvIQ8MOv4B46JD2chnhpNT7Jq8j0APlIbzO1Bach734xxUl4A==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.1.tgz", + "integrity": "sha512-Jj2yu78IRfw4nlaLtKjVaGaxh/6FhofmQ/j8v3NXmAiKafbIqtAPnKYrf0sbGjKdj0hS316J8WhnGnErbJ4RCA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.0.tgz", - "integrity": "sha512-8ZpNHDIOyqzzgZrQW9+xQ4k5hM62Xy2R4RPO3DQxMc5Rq5QkCdSpk/drka+DL9w6sXNzV5nrdlBmf8+x495QXQ==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.1.tgz", + "integrity": "sha512-lIkkrR9E4lwZkzPiRDNq0xdC3f2iVCUjw/7WPJ4S2Sl6C3nRWkeE1YXCQ0+KsiaQRbpY16jNaokdWnm9aUIsfw==", "dev": true, "requires": { - "@typescript-eslint/types": "4.29.0", - "@typescript-eslint/visitor-keys": "4.29.0", + "@typescript-eslint/types": "4.29.1", + "@typescript-eslint/visitor-keys": "4.29.1", "debug": "^4.3.1", "globby": "^11.0.3", "is-glob": "^4.0.1", @@ -4596,12 +4455,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.0.tgz", - "integrity": "sha512-LoaofO1C/jAJYs0uEpYMXfHboGXzOJeV118X4OsZu9f7rG7Pr9B3+4HTU8+err81rADa4xfQmAxnRnPAI2jp+Q==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.1.tgz", + "integrity": "sha512-zLqtjMoXvgdZY/PG6gqA73V8BjqPs4af1v2kiiETBObp+uC6gRYnJLmJHxC0QyUrrHDLJPIWNYxoBV3wbcRlag==", "dev": true, "requires": { - "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/types": "4.29.1", "eslint-visitor-keys": "^2.0.0" } }, diff --git a/package.json b/package.json index 93771e6..f780209 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "devDependencies": { "@google/clasp": "^2.4.0", "@types/google-apps-script": "^1.0.37", - "@typescript-eslint/eslint-plugin": "^4.29.0", + "@typescript-eslint/eslint-plugin": "^4.29.1", "@typescript-eslint/parser": "^4.29.1", "eslint": "^7.32.0", "eslint-config-prettier": "^8.3.0",