diff --git a/.github/workflows/cancel-event.yml b/.github/workflows/cancel-event.yml
new file mode 100644
index 000000000..f7270584f
--- /dev/null
+++ b/.github/workflows/cancel-event.yml
@@ -0,0 +1,33 @@
+name: Cancel event when issue was closed before it took place
+
+on:
+ issues:
+ types:
+ - closed
+
+jobs:
+
+ cancel_event:
+ env:
+ CALENDAR_ID: ${{ secrets.CALENDAR_ID }}
+ CALENDAR_SERVICE_ACCOUNT: ${{ secrets.CALENDAR_SERVICE_ACCOUNT }}
+ name: Remove event from calendar
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v2
+ - name: Setup Node.js
+ uses: actions/setup-node@v2
+ with:
+ node-version: 16
+ cache: 'npm'
+ cache-dependency-path: '**/package-lock.json'
+ - name: Install deps
+ run: npm install
+ working-directory: ./.github/workflows/create-event-helpers
+ - name: Remove Google Calendar entry
+ uses: actions/github-script@v4
+ with:
+ script: |
+ const { deleteEvent } = require('./.github/workflows/create-event-helpers/calendar/index.js');
+ deleteEvent('${{ github.event.issue.number }}', '${{ github.event.issue.closed_at }}');
\ No newline at end of file
diff --git a/.github/workflows/create-event-ad-hoc.yml b/.github/workflows/create-event-ad-hoc.yml
new file mode 100644
index 000000000..dcbadc6ee
--- /dev/null
+++ b/.github/workflows/create-event-ad-hoc.yml
@@ -0,0 +1,39 @@
+name: Schedule Ad Hoc Meeting
+
+on:
+ workflow_dispatch:
+ inputs:
+ time:
+ description: 'Info about meeting hour in UTC time zone, like: 08 or 16. No PM or AM versions.'
+ required: true
+ date:
+ description: 'Date in a form like: 2022-04-05 where 04 is a month and 05 is a day number.'
+ required: true
+ name:
+ description: 'Provide short title for the meeting.'
+ required: true
+ desc:
+ description: 'Provide description that explains the purpose of the meeting'
+ required: true
+
+jobs:
+
+ setup-ad-hoc:
+ uses: ./.github/workflows/create-event-workflow-reusable.yml
+ with:
+ time: ${{ github.event.inputs.time }}
+ date: ${{ github.event.inputs.date }}
+ meeting_name: ${{ github.event.inputs.name }}
+ meeting_desc: ${{ github.event.inputs.desc }}
+ host: lpgornicki@gmail.com
+ alternative_host: fmvilas@gmail.com
+ issue_template_path: .github/workflows/create-event-helpers/issues_templates/ad-hoc.md
+ create_zoom: true
+ secrets:
+ GH_TOKEN: ${{ secrets.GH_TOKEN }}
+ ZOOM_API_KEY: ${{ secrets.ZOOM_API_KEY }}
+ ZOOM_API_SECRET: ${{ secrets.ZOOM_API_SECRET }}
+ STREAM_URL: ${{ secrets.STREAM_URL }}
+ STREAM_KEY: ${{ secrets.STREAM_KEY }}
+ CALENDAR_ID: ${{ secrets.CALENDAR_ID }}
+ CALENDAR_SERVICE_ACCOUNT: ${{ secrets.CALENDAR_SERVICE_ACCOUNT }}
\ No newline at end of file
diff --git a/.github/workflows/create-event-community-meeting.yml b/.github/workflows/create-event-community-meeting.yml
new file mode 100644
index 000000000..afdc0336c
--- /dev/null
+++ b/.github/workflows/create-event-community-meeting.yml
@@ -0,0 +1,33 @@
+name: Schedule Community Meeting
+
+on:
+ workflow_dispatch:
+ inputs:
+ time:
+ description: 'Info about meeting hour in UTC time zone, like: 08 or 16. No PM or AM versions.'
+ required: true
+ date:
+ description: 'Date in a form like: 2022-04-05 where 04 is a month and 05 is a day number.'
+ required: true
+
+jobs:
+
+ setup-community-meeting:
+ uses: ./.github/workflows/create-event-workflow-reusable.yml
+ with:
+ time: ${{ github.event.inputs.time }}
+ date: ${{ github.event.inputs.date }}
+ meeting_name: Community Meeting
+ meeting_desc: This is a community meeting to regularly talk in open about important topics around AsyncAPI Initiative.
+ host: lpgornicki@gmail.com
+ alternative_host: fmvilas@gmail.com
+ issue_template_path: .github/workflows/create-event-helpers/issues_templates/community.md
+ create_zoom: true
+ secrets:
+ GH_TOKEN: ${{ secrets.GH_TOKEN }}
+ ZOOM_API_KEY: ${{ secrets.ZOOM_API_KEY }}
+ ZOOM_API_SECRET: ${{ secrets.ZOOM_API_SECRET }}
+ STREAM_URL: ${{ secrets.STREAM_URL }}
+ STREAM_KEY: ${{ secrets.STREAM_KEY }}
+ CALENDAR_ID: ${{ secrets.CALENDAR_ID }}
+ CALENDAR_SERVICE_ACCOUNT: ${{ secrets.CALENDAR_SERVICE_ACCOUNT }}
\ No newline at end of file
diff --git a/.github/workflows/create-event-helpers/calendar/index.js b/.github/workflows/create-event-helpers/calendar/index.js
new file mode 100644
index 000000000..85f1c23a1
--- /dev/null
+++ b/.github/workflows/create-event-helpers/calendar/index.js
@@ -0,0 +1,155 @@
+const { google } = require('googleapis')
+const core = require('@actions/core');
+
+module.exports = { addEvent, deleteEvent, listEvents }
+
+const auth = new google.auth.GoogleAuth({
+ scopes: ['https://www.googleapis.com/auth/calendar'],
+ credentials: JSON.parse(process.env.CALENDAR_SERVICE_ACCOUNT)
+});
+
+const calendar = google.calendar({ version: 'v3', auth });
+
+/**
+ * Adds new single-occuring event
+ * All events are being linked to their GitHub issues
+ * @param {String} zoomUrl Zoom url of the meeting
+ * @param {String} startDate ex. 2022-04-05
+ * @param {String} startTime ex. 08 or 16
+ * @param {Number} issueNumber GitHub issue number of the event, to find event later
+ */
+async function addEvent(zoomUrl, startDate, startTime, issueNumber) {
+
+ const communityIssuesUrl = 'https://github.com/asyncapi/community/issues/';
+ const title = process.env.MEETING_NAME;
+ const suffix = process.env.MEETING_NAME_SUFFIX;
+ const description = process.env.MEETING_DESC;
+ const guest = process.env.GUEST;
+ const summary = suffix ? `${title} ${suffix}` : title;
+
+ try {
+
+ //helper to create end time which is always 1h later
+ const getEndTime = (startTime) => {
+ const time = Number(startTime);
+ if (time < 10) return '0' + (time + 1)
+
+ return (time + 1) + ''
+ }
+
+ //helper to build meeting description
+ //there is a use case that meeting has no connection over zoom available as it is pure live stream
+ const getDescription = (description, communityIssuesUrl, issueNumber, zoomUrl, guest) => {
+
+ const zoomDetails = zoomUrl && `Zoom: Meeting Link`;
+ const agendaDetails = `Agenda and more options to join the meeting: GitHub Issue Link.`;
+ const guestDetails = guest ? `Special guest: ${ guest }` : '';
+ return `${ description }
${ zoomDetails }
${ agendaDetails }
${ guestDetails }`
+ };
+
+ await calendar.events.insert({
+ calendarId: process.env.CALENDAR_ID,
+ requestBody: {
+ summary,
+ description: getDescription(description, communityIssuesUrl, issueNumber, zoomUrl, guest),
+ start: {
+ dateTime: `${ startDate }T${ startTime }:00:00Z`
+ },
+ end: {
+ dateTime: `${ startDate }T${ getEndTime(startTime) }:00:00Z`
+ },
+ location: zoomUrl,
+ extendedProperties: {
+ private: {
+ 'ISSUE_ID': `${issueNumber}`
+ }
+ }
+ }
+ })
+
+ core.info('Event created')
+ } catch (error) {
+ core.setFailed(`Faild creating event in Google Calendar: ${ JSON.stringify(error) }`)
+ }
+}
+
+/**
+ * Deletes a single-occuring event from issue number
+ * @param {Number} issueNumber GitHub issue number of the meeting to delete
+ * @param {Number} closeDate Date when issue was closed
+ */
+async function deleteEvent(issueNumber, closeDate) {
+ let events
+
+ try {
+ events = (await calendar.events.list({
+ calendarId: process.env.CALENDAR_ID,
+ privateExtendedProperty: `ISSUE_ID=${issueNumber}`
+ })).data;
+ } catch (error) {
+ return core.setFailed(`Failed to fetch events for issue numer ${ issueNumber }: ${ JSON.stringify(error) }`)
+ }
+
+ const eventsItems = events.items;
+
+ if (eventsItems.length > 0) {
+
+ const meetingId = eventsItems[0].id;
+ const eventStartDate = new Date(eventsItems[0].start.dateTime);
+ const issueCloseDate = new Date(closeDate);
+
+ try {
+ //in case of issue was closed after the event, we do not remove it from calendar
+ if (eventStartDate.getTime() < issueCloseDate.getTime()) return core.info('Event not removed as related issue was closed after the event took place.');
+
+ await calendar.events.delete({
+ calendarId: process.env.CALENDAR_ID,
+ eventId: meetingId
+ })
+
+ core.info('Event deleted from calendar')
+ } catch (error) {
+ core.setFailed(`Failed to delete event for issue number ${ issueNumber }: ${ JSON.stringify(error) }`)
+ }
+ } else {
+ core.info('Event not found in calendar')
+ }
+}
+
+/**
+ * Lists all events including single-occuring and recurring
+ */
+async function listEvents() {
+
+ let eventsItems;
+
+ try {
+ //this runs always on friday midnight
+ const currentTime = new Date(Date.now()).toISOString();
+ //we check moday
+ const timeIn2Days = new Date(Date.parse(currentTime) + 2 * 24 * 60 * 60 * 1000).toISOString();
+ //till friday
+ const timeIn8Days = new Date(Date.parse(currentTime) + 8 * 24 * 60 * 60 * 1000).toISOString();
+
+ const eventsList = await calendar.events.list({
+ calendarId: process.env.CALENDAR_ID,
+ timeMax: timeIn8Days,
+ timeMin: timeIn2Days
+ })
+
+ eventsItems = eventsList.data.items.map((e) => {
+ return {
+ title: e.summary,
+ issueId: e.extendedProperties.private.ISSUE_ID,
+ date: new Date(e.start.dateTime).toUTCString()
+ }
+ })
+
+ core.info(`List of all events: ${ JSON.stringify(eventsList.data, null, 4) }`)
+ } catch (error) {
+ return core.setFailed(`Faild fetching events from Google Calendar API: ${ JSON.stringify(error) }`)
+ }
+
+ return eventsItems;
+
+}
\ No newline at end of file
diff --git a/.github/workflows/create-event-helpers/issues_templates/ad-hoc.md b/.github/workflows/create-event-helpers/issues_templates/ad-hoc.md
new file mode 100644
index 000000000..22ec7cad7
--- /dev/null
+++ b/.github/workflows/create-event-helpers/issues_templates/ad-hoc.md
@@ -0,0 +1,75 @@
+---
+title: "{{ env.MEETING_NAME }}, {{ env.FULL_DATE | date('H:mm [UTC] dddd MMMM Do YYYY') }}"
+---
+
+
+
+
+## Agenda
+
+> Don't wait for the meeting to discuss topics that already have issues. Feel free to comment on them earlier.
+
+1. Q&A
+1. _Place for your topic_
+1. Q&A
+
+## Notes
+
+_Add notes here after the meeting._
diff --git a/.github/workflows/create-event-helpers/issues_templates/community.md b/.github/workflows/create-event-helpers/issues_templates/community.md
new file mode 100644
index 000000000..437296d7e
--- /dev/null
+++ b/.github/workflows/create-event-helpers/issues_templates/community.md
@@ -0,0 +1,75 @@
+---
+title: "{{ env.MEETING_NAME }}, {{ env.FULL_DATE | date('H:mm [UTC] dddd MMMM Do YYYY') }}"
+---
+
+
+
+
+## Agenda
+
+> Don't wait for the meeting to discuss topics that already have issues. Feel free to comment on them earlier.
+
+1. Q&A
+1. _Place for your topic_
+1. Q&A
+
+## Notes
+
+_Add notes here after the meeting._
\ No newline at end of file
diff --git a/.github/workflows/create-event-helpers/issues_templates/lets-talk-about-contrib.md b/.github/workflows/create-event-helpers/issues_templates/lets-talk-about-contrib.md
new file mode 100644
index 000000000..37636c492
--- /dev/null
+++ b/.github/workflows/create-event-helpers/issues_templates/lets-talk-about-contrib.md
@@ -0,0 +1,62 @@
+---
+title: "{{ env.MEETING_NAME }}, {{ env.FULL_DATE | date('H:mm [UTC] dddd MMMM Do YYYY') }} {{ env.MEETING_NAME_SUFFIX }}"
+---
+
+
\ No newline at end of file
diff --git a/.github/workflows/create-event-helpers/issues_templates/spec-3-0.md b/.github/workflows/create-event-helpers/issues_templates/spec-3-0.md
new file mode 100644
index 000000000..1b0d8f78d
--- /dev/null
+++ b/.github/workflows/create-event-helpers/issues_templates/spec-3-0.md
@@ -0,0 +1,74 @@
+---
+title: "{{ env.MEETING_NAME }}, {{ env.FULL_DATE | date('H:mm [UTC] dddd MMMM Do YYYY') }}"
+---
+
+
+
+## Agenda
+
+> Don't wait for the meeting to discuss topics that already have issues. Feel free to comment on them earlier.
+
+1. Q&A
+1. _Place for your topic_
+1. Q&A
+
+## Notes
+
+_Add notes here after the meeting._
\ No newline at end of file
diff --git a/.github/workflows/create-event-helpers/issues_templates/thinking-out-loud.md b/.github/workflows/create-event-helpers/issues_templates/thinking-out-loud.md
new file mode 100644
index 000000000..c75230f9e
--- /dev/null
+++ b/.github/workflows/create-event-helpers/issues_templates/thinking-out-loud.md
@@ -0,0 +1,66 @@
+---
+title: "{{ env.MEETING_NAME }}, {{ env.FULL_DATE | date('H:mm [UTC] dddd MMMM Do YYYY') }} {{ env.MEETING_NAME_SUFFIX }}"
+---
+
+
\ No newline at end of file
diff --git a/.github/workflows/create-event-helpers/mailchimp/htmlContent.js b/.github/workflows/create-event-helpers/mailchimp/htmlContent.js
new file mode 100644
index 000000000..b0c60b967
--- /dev/null
+++ b/.github/workflows/create-event-helpers/mailchimp/htmlContent.js
@@ -0,0 +1,512 @@
+module.exports = (list) => {
+
+ const meetingsList = (events) => {
+
+ const communityIssuesUrl = 'https://github.com/asyncapi/community/issues/';
+ let bulletPoints = ''
+
+ for (const item of events) {
+ bulletPoints += `${ item.title } on ${ item.date}.
See more details on meeting agenda and connection details in this GitHub issue`
+ }
+
+ return bulletPoints;
+ }
+
+ return `
+
+
+
+
+
+
+
+ *|MC:SUBJECT|*
+
+
+
+
+ *|MC_PREVIEW_TEXT|*
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${ meetingsList(list) }
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Best,
+Fran Mendez
+AsyncAPI Initiative
+ |
+
+
+
+
+
+ |
+
+
+ |
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+`
+}
\ No newline at end of file
diff --git a/.github/workflows/create-event-helpers/mailchimp/index.js b/.github/workflows/create-event-helpers/mailchimp/index.js
new file mode 100644
index 000000000..b183c3859
--- /dev/null
+++ b/.github/workflows/create-event-helpers/mailchimp/index.js
@@ -0,0 +1,71 @@
+const mailchimp = require('@mailchimp/mailchimp_marketing');
+const core = require('@actions/core');
+const htmlContent = require('./htmlContent.js');
+const { listEvents } = require('../calendar/index.js');
+
+/**
+ * Listing events from Google Calendar and sending them to Newsletter subscribers.
+ * This code is not triggered separately in workflow, in 2 separate steps a GitHub actions have issues when doing code.setOutput with complex JSON in String.
+ */
+module.exports = async () => {
+
+ const events = await listEvents();
+ if (!events.length) return core.info('No events scheduled for next week so no email will be sent');
+ core.info(`Formatted list of events: ${ JSON.stringify(events, null, 4) }`)
+
+ let newCampaign;
+
+ mailchimp.setConfig({
+ apiKey: process.env.MAILCHIMP_API_KEY,
+ server: 'us12'
+ });
+
+ /*
+ * First we create campaign
+ */
+ try {
+ newCampaign = await mailchimp.campaigns.create({
+ type: 'regular',
+ recipients: {
+ list_id: '6e3e437abe'
+ },
+ settings: {
+ subject_line: 'AsyncAPI meetings scheduled for next week.',
+ preview_text: 'Check out what AsyncAPI meetings are scheduled for next week and learn how to join them.',
+ title: `Meetings info - ${ new Date(Date.now()).toUTCString()}`,
+ from_name: 'Fran Mendez',
+ reply_to: 'info@asyncapi.io',
+ }
+ });
+ } catch (error) {
+ return core.setFailed(`Failed creating campaign: ${ JSON.stringify(error) }`);
+ }
+
+ /*
+ * Content of the email is added separately after campaign creation
+ */
+ try {
+ await mailchimp.campaigns.setContent(newCampaign.id, { html: htmlContent(events) });
+ } catch (error) {
+ return core.setFailed(`Failed adding content to campaign: ${ JSON.stringify(error) }`);
+ }
+
+ /*
+ * We schedule an email, we do not send it at midnight immediately but use schedule with `timewarp` to basically send email at the same time for anyone no matter what time zone they live in
+ */
+ try {
+ const scheduleDate = new Date(Date.now());
+ scheduleDate.setUTCHours(11);
+ scheduleDate.setUTCMinutes(00);
+
+
+ await mailchimp.campaigns.schedule(newCampaign.id, {
+ schedule_time: scheduleDate.toISOString(),
+ timewarp: true
+ });
+ } catch (error) {
+ return core.setFailed(`Failed scheduling email: ${ JSON.stringify(error) }`);
+ }
+
+ core.info(`New email campaign created`);
+}
\ No newline at end of file
diff --git a/.github/workflows/create-event-helpers/package-lock.json b/.github/workflows/create-event-helpers/package-lock.json
new file mode 100644
index 000000000..8685660ca
--- /dev/null
+++ b/.github/workflows/create-event-helpers/package-lock.json
@@ -0,0 +1,1345 @@
+{
+ "name": "events-creation-automation",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "events-creation-automation",
+ "license": "Apache 2.0",
+ "dependencies": {
+ "@actions/core": "^1.6.0",
+ "@mailchimp/mailchimp_marketing": "^3.0.74",
+ "googleapis": "^99.0.0",
+ "jsonwebtoken": "^8.5.1",
+ "node-fetch": "2.6.1"
+ }
+ },
+ "node_modules/@actions/core": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.6.0.tgz",
+ "integrity": "sha512-NB1UAZomZlCV/LmJqkLhNTqtKfFXJZAUPcfl/zqG7EfsQdeUJtaWO98SGbuQ3pydJ3fHl2CvI/51OKYlCYYcaw==",
+ "dependencies": {
+ "@actions/http-client": "^1.0.11"
+ }
+ },
+ "node_modules/@actions/http-client": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.11.tgz",
+ "integrity": "sha512-VRYHGQV1rqnROJqdMvGUbY/Kn8vriQe/F9HR2AlYHzmKuM/p3kjNuXhmdBfcVgsvRWTz5C5XW5xvndZrVBuAYg==",
+ "dependencies": {
+ "tunnel": "0.0.6"
+ }
+ },
+ "node_modules/@mailchimp/mailchimp_marketing": {
+ "version": "3.0.74",
+ "resolved": "https://registry.npmjs.org/@mailchimp/mailchimp_marketing/-/mailchimp_marketing-3.0.74.tgz",
+ "integrity": "sha512-039iu4GRr7wpXqweBLuS05wvOBtPxSa31cjxgftBYSt7031f0sHEi8Up2DicfbSuQK0AynPDeVyuxrb31Lx+yQ==",
+ "dependencies": {
+ "dotenv": "^8.2.0",
+ "superagent": "3.8.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/abort-controller": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+ "dependencies": {
+ "event-target-shim": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=6.5"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/arrify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/bignumber.js": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz",
+ "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/component-emitter": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
+ },
+ "node_modules/cookiejar": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz",
+ "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ=="
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "8.6.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz",
+ "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/event-target-shim": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+ },
+ "node_modules/fast-text-encoding": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz",
+ "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig=="
+ },
+ "node_modules/form-data": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
+ "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 0.12"
+ }
+ },
+ "node_modules/formidable": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz",
+ "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==",
+ "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau",
+ "funding": {
+ "url": "https://ko-fi.com/tunnckoCore/commissions"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "node_modules/gaxios": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz",
+ "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==",
+ "dependencies": {
+ "abort-controller": "^3.0.0",
+ "extend": "^3.0.2",
+ "https-proxy-agent": "^5.0.0",
+ "is-stream": "^2.0.0",
+ "node-fetch": "^2.6.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/gcp-metadata": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz",
+ "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==",
+ "dependencies": {
+ "gaxios": "^4.0.0",
+ "json-bigint": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/google-auth-library": {
+ "version": "7.14.1",
+ "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.14.1.tgz",
+ "integrity": "sha512-5Rk7iLNDFhFeBYc3s8l1CqzbEBcdhwR193RlD4vSNFajIcINKI8W8P0JLmBpwymHqqWbX34pJDQu39cSy/6RsA==",
+ "dependencies": {
+ "arrify": "^2.0.0",
+ "base64-js": "^1.3.0",
+ "ecdsa-sig-formatter": "^1.0.11",
+ "fast-text-encoding": "^1.0.0",
+ "gaxios": "^4.0.0",
+ "gcp-metadata": "^4.2.0",
+ "gtoken": "^5.0.4",
+ "jws": "^4.0.0",
+ "lru-cache": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/google-auth-library/node_modules/jwa": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz",
+ "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==",
+ "dependencies": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/google-auth-library/node_modules/jws": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz",
+ "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==",
+ "dependencies": {
+ "jwa": "^2.0.0",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/google-p12-pem": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.3.tgz",
+ "integrity": "sha512-MC0jISvzymxePDVembypNefkAQp+DRP7dBE+zNUPaIjEspIlYg0++OrsNr248V9tPbz6iqtZ7rX1hxWA5B8qBQ==",
+ "dependencies": {
+ "node-forge": "^1.0.0"
+ },
+ "bin": {
+ "gp12-pem": "build/src/bin/gp12-pem.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/googleapis": {
+ "version": "99.0.0",
+ "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-99.0.0.tgz",
+ "integrity": "sha512-ZS+iFrNvvZykpGBgTgaj0FgmKCZnC+0tmbs8b5+vJnVcaaHMp8IPUWruNSFqZjg6M8Yey8/aJxhT5mT5Ja2+VQ==",
+ "dependencies": {
+ "google-auth-library": "^7.0.2",
+ "googleapis-common": "^5.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/googleapis-common": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-5.1.0.tgz",
+ "integrity": "sha512-RXrif+Gzhq1QAzfjxulbGvAY3FPj8zq/CYcvgjzDbaBNCD6bUl+86I7mUs4DKWHGruuK26ijjR/eDpWIDgNROA==",
+ "dependencies": {
+ "extend": "^3.0.2",
+ "gaxios": "^4.0.0",
+ "google-auth-library": "^7.14.0",
+ "qs": "^6.7.0",
+ "url-template": "^2.0.8",
+ "uuid": "^8.0.0"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/gtoken": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.3.2.tgz",
+ "integrity": "sha512-gkvEKREW7dXWF8NV8pVrKfW7WqReAmjjkMBh6lNCCGOM4ucS0r0YyXXl0r/9Yj8wcW/32ISkfc8h5mPTDbtifQ==",
+ "dependencies": {
+ "gaxios": "^4.0.0",
+ "google-p12-pem": "^3.1.3",
+ "jws": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/gtoken/node_modules/jwa": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz",
+ "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==",
+ "dependencies": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/gtoken/node_modules/jws": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz",
+ "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==",
+ "dependencies": {
+ "jwa": "^2.0.0",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
+ "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ },
+ "node_modules/json-bigint": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
+ "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
+ "dependencies": {
+ "bignumber.js": "^9.0.0"
+ }
+ },
+ "node_modules/jsonwebtoken": {
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
+ "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+ "dependencies": {
+ "jws": "^3.2.2",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=4",
+ "npm": ">=1.4.28"
+ }
+ },
+ "node_modules/jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "dependencies": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "dependencies": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
+ },
+ "node_modules/lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
+ },
+ "node_modules/lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
+ },
+ "node_modules/lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
+ },
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
+ },
+ "node_modules/lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
+ },
+ "node_modules/lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
+ },
+ "node_modules/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==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "node_modules/node-fetch": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
+ "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==",
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ }
+ },
+ "node_modules/node-forge": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz",
+ "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==",
+ "engines": {
+ "node": ">= 6.13.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
+ "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
+ "node_modules/qs": {
+ "version": "6.10.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
+ "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/readable-stream/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/string_decoder/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "node_modules/superagent": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.1.tgz",
+ "integrity": "sha512-VMBFLYgFuRdfeNQSMLbxGSLfmXL/xc+OO+BZp41Za/NRDBet/BNbkRJrYzCUu0u4GU0i/ml2dtT8b9qgkw9z6Q==",
+ "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .",
+ "dependencies": {
+ "component-emitter": "^1.2.0",
+ "cookiejar": "^2.1.0",
+ "debug": "^3.1.0",
+ "extend": "^3.0.0",
+ "form-data": "^2.3.1",
+ "formidable": "^1.1.1",
+ "methods": "^1.1.1",
+ "mime": "^1.4.1",
+ "qs": "^6.5.1",
+ "readable-stream": "^2.0.5"
+ },
+ "engines": {
+ "node": ">= 4.0"
+ }
+ },
+ "node_modules/superagent/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/tunnel": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
+ "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
+ "engines": {
+ "node": ">=0.6.11 <=0.7.0 || >=0.7.3"
+ }
+ },
+ "node_modules/url-template": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz",
+ "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE="
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ }
+ },
+ "dependencies": {
+ "@actions/core": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.6.0.tgz",
+ "integrity": "sha512-NB1UAZomZlCV/LmJqkLhNTqtKfFXJZAUPcfl/zqG7EfsQdeUJtaWO98SGbuQ3pydJ3fHl2CvI/51OKYlCYYcaw==",
+ "requires": {
+ "@actions/http-client": "^1.0.11"
+ }
+ },
+ "@actions/http-client": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.11.tgz",
+ "integrity": "sha512-VRYHGQV1rqnROJqdMvGUbY/Kn8vriQe/F9HR2AlYHzmKuM/p3kjNuXhmdBfcVgsvRWTz5C5XW5xvndZrVBuAYg==",
+ "requires": {
+ "tunnel": "0.0.6"
+ }
+ },
+ "@mailchimp/mailchimp_marketing": {
+ "version": "3.0.74",
+ "resolved": "https://registry.npmjs.org/@mailchimp/mailchimp_marketing/-/mailchimp_marketing-3.0.74.tgz",
+ "integrity": "sha512-039iu4GRr7wpXqweBLuS05wvOBtPxSa31cjxgftBYSt7031f0sHEi8Up2DicfbSuQK0AynPDeVyuxrb31Lx+yQ==",
+ "requires": {
+ "dotenv": "^8.2.0",
+ "superagent": "3.8.1"
+ }
+ },
+ "abort-controller": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+ "requires": {
+ "event-target-shim": "^5.0.0"
+ }
+ },
+ "agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "requires": {
+ "debug": "4"
+ }
+ },
+ "arrify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug=="
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+ },
+ "base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+ },
+ "bignumber.js": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz",
+ "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw=="
+ },
+ "buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
+ },
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "component-emitter": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
+ },
+ "cookiejar": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz",
+ "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ=="
+ },
+ "core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+ },
+ "debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "requires": {
+ "ms": "2.1.2"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ }
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+ },
+ "dotenv": {
+ "version": "8.6.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz",
+ "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g=="
+ },
+ "ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "event-target-shim": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+ },
+ "fast-text-encoding": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz",
+ "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig=="
+ },
+ "form-data": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
+ "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "formidable": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz",
+ "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ=="
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "gaxios": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz",
+ "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==",
+ "requires": {
+ "abort-controller": "^3.0.0",
+ "extend": "^3.0.2",
+ "https-proxy-agent": "^5.0.0",
+ "is-stream": "^2.0.0",
+ "node-fetch": "^2.6.1"
+ }
+ },
+ "gcp-metadata": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz",
+ "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==",
+ "requires": {
+ "gaxios": "^4.0.0",
+ "json-bigint": "^1.0.0"
+ }
+ },
+ "get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "google-auth-library": {
+ "version": "7.14.1",
+ "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.14.1.tgz",
+ "integrity": "sha512-5Rk7iLNDFhFeBYc3s8l1CqzbEBcdhwR193RlD4vSNFajIcINKI8W8P0JLmBpwymHqqWbX34pJDQu39cSy/6RsA==",
+ "requires": {
+ "arrify": "^2.0.0",
+ "base64-js": "^1.3.0",
+ "ecdsa-sig-formatter": "^1.0.11",
+ "fast-text-encoding": "^1.0.0",
+ "gaxios": "^4.0.0",
+ "gcp-metadata": "^4.2.0",
+ "gtoken": "^5.0.4",
+ "jws": "^4.0.0",
+ "lru-cache": "^6.0.0"
+ },
+ "dependencies": {
+ "jwa": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz",
+ "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==",
+ "requires": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "jws": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz",
+ "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==",
+ "requires": {
+ "jwa": "^2.0.0",
+ "safe-buffer": "^5.0.1"
+ }
+ }
+ }
+ },
+ "google-p12-pem": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.3.tgz",
+ "integrity": "sha512-MC0jISvzymxePDVembypNefkAQp+DRP7dBE+zNUPaIjEspIlYg0++OrsNr248V9tPbz6iqtZ7rX1hxWA5B8qBQ==",
+ "requires": {
+ "node-forge": "^1.0.0"
+ }
+ },
+ "googleapis": {
+ "version": "99.0.0",
+ "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-99.0.0.tgz",
+ "integrity": "sha512-ZS+iFrNvvZykpGBgTgaj0FgmKCZnC+0tmbs8b5+vJnVcaaHMp8IPUWruNSFqZjg6M8Yey8/aJxhT5mT5Ja2+VQ==",
+ "requires": {
+ "google-auth-library": "^7.0.2",
+ "googleapis-common": "^5.0.2"
+ }
+ },
+ "googleapis-common": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-5.1.0.tgz",
+ "integrity": "sha512-RXrif+Gzhq1QAzfjxulbGvAY3FPj8zq/CYcvgjzDbaBNCD6bUl+86I7mUs4DKWHGruuK26ijjR/eDpWIDgNROA==",
+ "requires": {
+ "extend": "^3.0.2",
+ "gaxios": "^4.0.0",
+ "google-auth-library": "^7.14.0",
+ "qs": "^6.7.0",
+ "url-template": "^2.0.8",
+ "uuid": "^8.0.0"
+ }
+ },
+ "gtoken": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.3.2.tgz",
+ "integrity": "sha512-gkvEKREW7dXWF8NV8pVrKfW7WqReAmjjkMBh6lNCCGOM4ucS0r0YyXXl0r/9Yj8wcW/32ISkfc8h5mPTDbtifQ==",
+ "requires": {
+ "gaxios": "^4.0.0",
+ "google-p12-pem": "^3.1.3",
+ "jws": "^4.0.0"
+ },
+ "dependencies": {
+ "jwa": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz",
+ "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==",
+ "requires": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "jws": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz",
+ "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==",
+ "requires": {
+ "jwa": "^2.0.0",
+ "safe-buffer": "^5.0.1"
+ }
+ }
+ }
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+ },
+ "https-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
+ "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
+ "requires": {
+ "agent-base": "6",
+ "debug": "4"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ },
+ "json-bigint": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
+ "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
+ "requires": {
+ "bignumber.js": "^9.0.0"
+ }
+ },
+ "jsonwebtoken": {
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
+ "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+ "requires": {
+ "jws": "^3.2.2",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^5.6.0"
+ }
+ },
+ "jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "requires": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "requires": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
+ },
+ "lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
+ },
+ "lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
+ },
+ "lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
+ },
+ "lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
+ },
+ "lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
+ },
+ "lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
+ },
+ "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==",
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
+ },
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+ },
+ "mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
+ },
+ "mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "requires": {
+ "mime-db": "1.52.0"
+ }
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "node-fetch": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
+ "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
+ },
+ "node-forge": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz",
+ "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA=="
+ },
+ "object-inspect": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
+ "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g=="
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
+ "qs": {
+ "version": "6.10.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
+ "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
+ "requires": {
+ "side-channel": "^1.0.4"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ },
+ "dependencies": {
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ }
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ },
+ "side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ },
+ "dependencies": {
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ }
+ }
+ },
+ "superagent": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.1.tgz",
+ "integrity": "sha512-VMBFLYgFuRdfeNQSMLbxGSLfmXL/xc+OO+BZp41Za/NRDBet/BNbkRJrYzCUu0u4GU0i/ml2dtT8b9qgkw9z6Q==",
+ "requires": {
+ "component-emitter": "^1.2.0",
+ "cookiejar": "^2.1.0",
+ "debug": "^3.1.0",
+ "extend": "^3.0.0",
+ "form-data": "^2.3.1",
+ "formidable": "^1.1.1",
+ "methods": "^1.1.1",
+ "mime": "^1.4.1",
+ "qs": "^6.5.1",
+ "readable-stream": "^2.0.5"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ }
+ }
+ },
+ "tunnel": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
+ "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg=="
+ },
+ "url-template": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz",
+ "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE="
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ }
+ }
+}
diff --git a/.github/workflows/create-event-helpers/package.json b/.github/workflows/create-event-helpers/package.json
new file mode 100644
index 000000000..c7bef2fbf
--- /dev/null
+++ b/.github/workflows/create-event-helpers/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "events-creation-automation",
+ "description": "This code is responsible for handling automation of meetings creation",
+ "license": "Apache 2.0",
+ "dependencies": {
+ "@actions/core": "^1.6.0",
+ "@mailchimp/mailchimp_marketing": "^3.0.74",
+ "googleapis": "^99.0.0",
+ "jsonwebtoken": "^8.5.1",
+ "node-fetch": "2.6.1"
+ }
+}
diff --git a/.github/workflows/create-event-helpers/zoom/index.js b/.github/workflows/create-event-helpers/zoom/index.js
new file mode 100644
index 000000000..160d85ff4
--- /dev/null
+++ b/.github/workflows/create-event-helpers/zoom/index.js
@@ -0,0 +1,90 @@
+const fetch = require('node-fetch');
+const jwt = require('jsonwebtoken');
+const core = require('@actions/core');
+
+/**
+ * @param {string} date Date as YYYY-MM-DD
+ * @param {string} time Number that represents hour, 2-digit format
+ * @param {string} host email address of meeting host
+ * @param {string} cohost coma-separated list of email addresses of alternative hosts
+ */
+module.exports = async(date, time, host, cohost) => {
+
+ const meetingTitle = process.env.MEETING_NAME;
+ let meetingDetails;
+
+ const tokenConfig = {
+ iss: process.env.ZOOM_API_KEY,
+ exp: ((new Date()).getTime() + 5000)
+ }
+
+ const token = jwt.sign(tokenConfig, process.env.ZOOM_API_SECRET);
+
+ const zoomSettings = JSON.stringify({
+ topic: meetingTitle,
+ type: '2',
+ start_time: `${ date }T${ time }:00:00`,
+ duration: '60',
+ timezone: 'UTC',
+ settings: {
+ alternative_hosts: cohost,
+ alternative_hosts_email_notification: false,
+ contact_email: 'info@asyncapi.io',
+ email_notification: false,
+ host_video: true,
+ mute_upon_entry: true,
+ participant_video: true,
+ join_before_host: false
+ }
+ })
+
+ const fetchMeetingCreationOptions = {
+ method: 'POST',
+
+ headers: {
+ 'User-Agent': 'Zoom-api-Jwt-Request',
+ 'content-type': 'application/json',
+ Authorization: `bearer ${ token }`
+ },
+
+ body: zoomSettings
+ }
+
+ try {
+ const meetingCreationResponse = await fetch(`https://api.zoom.us/v2/users/${ host }/meetings`, fetchMeetingCreationOptions);
+ meetingDetails = await meetingCreationResponse.json();
+ } catch (error) {
+ return core.setFailed(`Meeting creation failed: ${ error }`)
+ }
+
+ //core.debug(JSON.stringify(meetingDetails));
+ const meetingId = meetingDetails.id;
+ const meetingUrl = meetingDetails.join_url;
+
+ const streamOptions = JSON.stringify({
+ page_url: 'https://www.youtube.com/asyncapi',
+ stream_key: process.env.STREAM_KEY,
+ stream_url: process.env.STREAM_URL
+ })
+
+ const fetchMeetingUpdateOptions = {
+ method: 'PATCH',
+
+ headers: {
+ 'content-type': 'application/json',
+ Authorization: `bearer ${ token }`
+ },
+
+ body: streamOptions
+ }
+
+ try {
+ await fetch(`https://api.zoom.us/v2/meetings/${ meetingId }/livestream`, fetchMeetingUpdateOptions);
+ } catch (error) {
+ return core.setFailed(`Meeting update with streaming info failed: ${ error }`)
+ }
+
+ if (!meetingId) return core.setFailed('meetingId is not available which means something went wrong in communication with Zoom. Most probably the host that you defined is not yet part of related Zoom account');
+ core.info(`Created meeting ${ meetingId } that you can join at ${ meetingUrl }`);
+ core.setOutput('meetingUrl', meetingUrl);
+}
\ No newline at end of file
diff --git a/.github/workflows/create-event-issue-community-meeting.yml b/.github/workflows/create-event-issue-community-meeting.yml
deleted file mode 100644
index 7e8751c67..000000000
--- a/.github/workflows/create-event-issue-community-meeting.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-name: Schedule Community Meeting
-
-on:
- workflow_dispatch:
- inputs:
- time:
- description: 'Info about meeting hour in UTC time zone, like: 08 or 16. No PM or AM versions.'
- required: true
- date:
- description: 'Date in a form like: 2022-04-05 where 04 is a month and 05 is a day number.'
- required: true
-
-jobs:
-
- setup-community-meeting:
- env:
- GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
- name: Setup Community meeting
- runs-on: ubuntu-latest
- steps:
- - name: Checkout repository
- uses: actions/checkout@v2
- - name: Create issue content
- uses: actions/github-script@v4
- id: date
- with:
- script: |
- const { getMeetingIssueContent } = require('./.github/workflows/event_issue_templates/meetings/community.js');
- const setupMeeting = require('./.github/workflows/event_issue_templates/index.js');
- setupMeeting('${{ github.event.inputs.date }}', '${{ github.event.inputs.time }}', core, getMeetingIssueContent);
- - name: Create issue with meeting details
- run: gh issue create -l meeting -t "Community Meeting, ${{steps.date.outputs.hour}}:00 UTC ${{steps.date.outputs.fullDate}}" -F content.md
\ No newline at end of file
diff --git a/.github/workflows/create-event-issue-lets-talk-about.yml b/.github/workflows/create-event-issue-lets-talk-about.yml
deleted file mode 100644
index ebbf2bd02..000000000
--- a/.github/workflows/create-event-issue-lets-talk-about.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-name: Schedule Lets talk about contributing Meeting
-
-on:
- workflow_dispatch:
- inputs:
- time:
- description: 'Info about meeting hour in UTC time zone, like: 08 or 16. No PM or AM versions.'
- required: true
- date:
- description: 'Date in a form like: 2022-04-05 where 04 is a month and 05 is a day number.'
- required: true
- descSuffix:
- description: 'You can specify additional text that appears at the end of generated issue title, like: - Product Design'
- required: false
- default: ''
-
-jobs:
-
- setup-lets-talk-about-contrib-stream:
- env:
- GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
- name: Setup Lets talk about contributing live stream
- runs-on: ubuntu-latest
- steps:
- - name: Checkout repository
- uses: actions/checkout@v2
- - name: Create issue content
- uses: actions/github-script@v4
- id: date
- with:
- script: |
- const { getMeetingIssueContent } = require('./.github/workflows/event_issue_templates/meetings/lets-talk-about-contrib.js');
- const setupMeeting = require('./.github/workflows/event_issue_templates/index.js');
- setupMeeting('${{ github.event.inputs.date }}', '${{ github.event.inputs.time }}', core, getMeetingIssueContent);
- - name: Create issue with meeting details
- run: gh issue create -l meeting -t "Let's talk about contributing, ${{steps.date.outputs.hour}}:00 UTC ${{steps.date.outputs.fullDate}} ${{ github.event.inputs.descSuffix }}" -F content.md
\ No newline at end of file
diff --git a/.github/workflows/create-event-issue-spec-3-0.yml b/.github/workflows/create-event-issue-spec-3-0.yml
deleted file mode 100644
index efb501cd6..000000000
--- a/.github/workflows/create-event-issue-spec-3-0.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-name: Schedule Spec 3.0 Meeting
-
-on:
- workflow_dispatch:
- inputs:
- time:
- description: 'Info about meeting hour in UTC time zone, like: 08 or 16. No PM or AM versions.'
- required: true
- date:
- description: 'Date in a form like: 2022-04-05 where 04 is a month and 05 is a day number.'
- required: true
-
-jobs:
-
- setup-spec-3-0-meeting:
- env:
- GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
- name: Setup 3.0 spec meeting
- runs-on: ubuntu-latest
- steps:
- - name: Checkout repository
- uses: actions/checkout@v2
- - name: Create issue content
- uses: actions/github-script@v4
- id: date
- with:
- script: |
- const { getMeetingIssueContent } = require('./.github/workflows/event_issue_templates/meetings/spec-3-0.js');
- const setupMeeting = require('./.github/workflows/event_issue_templates/index.js');
- setupMeeting('${{ github.event.inputs.date }}', '${{ github.event.inputs.time }}', core, getMeetingIssueContent);
- - name: Create issue with meeting details
- run: gh issue create -l meeting -t "Spec 3.0 Meeting, ${{steps.date.outputs.hour}}:00 UTC ${{steps.date.outputs.fullDate}}" -F content.md
\ No newline at end of file
diff --git a/.github/workflows/create-event-lets-talk-about.yml b/.github/workflows/create-event-lets-talk-about.yml
new file mode 100644
index 000000000..474ebf1d1
--- /dev/null
+++ b/.github/workflows/create-event-lets-talk-about.yml
@@ -0,0 +1,38 @@
+name: Schedule Lets talk about contributing Meeting
+
+on:
+ workflow_dispatch:
+ inputs:
+ time:
+ description: 'Info about meeting hour in UTC time zone, like: 08 or 16. No PM or AM versions.'
+ required: true
+ date:
+ description: 'Date in a form like: 2022-04-05 where 04 is a month and 05 is a day number.'
+ required: true
+ descSuffix:
+ description: 'You can specify additional text that appears at the end of generated issue title, like: - Product Design'
+ required: false
+ default: ''
+
+jobs:
+
+ setup-lets-talk-about-contrib-stream:
+ uses: ./.github/workflows/create-event-workflow-reusable.yml
+ with:
+ time: ${{ github.event.inputs.time }}
+ date: ${{ github.event.inputs.date }}
+ meeting_name: Let's talk about contributing
+ meeting_name_suffix: ${{ github.event.inputs.descSuffix }}
+ meeting_desc: The purpose of this meeting is to focus on contributors, focus on people that want to contribute to AsyncAPI Initiative but do not know how to do it.
+ host: lpgornicki@gmail.com
+ alternative_host: fmvilas@gmail.com
+ issue_template_path: .github/workflows/create-event-helpers/issues_templates/lets-talk-about-contrib.md
+ create_zoom: false
+ secrets:
+ GH_TOKEN: ${{ secrets.GH_TOKEN }}
+ ZOOM_API_KEY: ${{ secrets.ZOOM_API_KEY }}
+ ZOOM_API_SECRET: ${{ secrets.ZOOM_API_SECRET }}
+ STREAM_URL: ${{ secrets.STREAM_URL }}
+ STREAM_KEY: ${{ secrets.STREAM_KEY }}
+ CALENDAR_ID: ${{ secrets.CALENDAR_ID }}
+ CALENDAR_SERVICE_ACCOUNT: ${{ secrets.CALENDAR_SERVICE_ACCOUNT }}
\ No newline at end of file
diff --git a/.github/workflows/create-event-spec-3-0.yml b/.github/workflows/create-event-spec-3-0.yml
new file mode 100644
index 000000000..4b648b8e2
--- /dev/null
+++ b/.github/workflows/create-event-spec-3-0.yml
@@ -0,0 +1,35 @@
+name: Schedule Spec 3.0 Meeting
+
+on:
+ workflow_dispatch:
+ inputs:
+ time:
+ description: 'Info about meeting hour in UTC time zone, like: 08 or 16. No PM or AM versions.'
+ required: true
+ date:
+ description: 'Date in a form like: 2022-04-05 where 04 is a month and 05 is a day number.'
+ required: true
+
+jobs:
+
+ setup-spec-3-0-meeting:
+ uses: ./.github/workflows/create-event-workflow-reusable.yml
+ with:
+ time: ${{ github.event.inputs.time }}
+ date: ${{ github.event.inputs.date }}
+ meeting_name: Spec 3.0 Meeting
+ meeting_desc: This is the meeting for community member involved in works related to 3.0 release of AsyncAPI Specification.
+ host: jonas-lt@live.dk
+ alternative_host: fmvilas@gmail.com
+ issue_template_path: .github/workflows/create-event-helpers/issues_templates/spec-3-0.md
+ create_zoom: true
+ secrets:
+ GH_TOKEN: ${{ secrets.GH_TOKEN }}
+ ZOOM_API_KEY: ${{ secrets.ZOOM_API_KEY }}
+ ZOOM_API_SECRET: ${{ secrets.ZOOM_API_SECRET }}
+ STREAM_URL: ${{ secrets.STREAM_URL }}
+ STREAM_KEY: ${{ secrets.STREAM_KEY }}
+ CALENDAR_ID: ${{ secrets.CALENDAR_ID }}
+ CALENDAR_SERVICE_ACCOUNT: ${{ secrets.CALENDAR_SERVICE_ACCOUNT }}
+
+
\ No newline at end of file
diff --git a/.github/workflows/create-event-thinking-out-loud.yml b/.github/workflows/create-event-thinking-out-loud.yml
new file mode 100644
index 000000000..00aa664d2
--- /dev/null
+++ b/.github/workflows/create-event-thinking-out-loud.yml
@@ -0,0 +1,41 @@
+name: Schedule Thinking Out Loud
+
+on:
+ workflow_dispatch:
+ inputs:
+ time:
+ description: 'Info about meeting hour in UTC time zone, like: 08 or 16. No PM or AM versions.'
+ required: true
+ date:
+ description: 'Date in a form like: 2022-04-05 where 04 is a month and 05 is a day number.'
+ required: true
+ desc:
+ description: 'Put short description what is this episode about. Is it about building community or JSON Schema or anything else.'
+ required: true
+ guest:
+ description: 'Provide the name of the guest.'
+ required: true
+
+jobs:
+
+ setup-thinking-out-loud:
+ uses: ./.github/workflows/create-event-workflow-reusable.yml
+ with:
+ time: ${{ github.event.inputs.time }}
+ date: ${{ github.event.inputs.date }}
+ meeting_name: Thinking Out Loud
+ meeting_desc: ${{ github.event.inputs.desc }}
+ guest: ${{ github.event.inputs.guest }}
+ host: fmvilas@gmail.com
+ issue_template_path: .github/workflows/create-event-helpers/issues_templates/thinking-out-loud.md
+ create_zoom: true
+ secrets:
+ GH_TOKEN: ${{ secrets.GH_TOKEN }}
+ ZOOM_API_KEY: ${{ secrets.ZOOM_API_KEY }}
+ ZOOM_API_SECRET: ${{ secrets.ZOOM_API_SECRET }}
+ STREAM_URL: ${{ secrets.STREAM_URL }}
+ STREAM_KEY: ${{ secrets.STREAM_KEY }}
+ CALENDAR_ID: ${{ secrets.CALENDAR_ID }}
+ CALENDAR_SERVICE_ACCOUNT: ${{ secrets.CALENDAR_SERVICE_ACCOUNT }}
+
+
\ No newline at end of file
diff --git a/.github/workflows/create-event-workflow-reusable.yml b/.github/workflows/create-event-workflow-reusable.yml
new file mode 100644
index 000000000..e44bd9007
--- /dev/null
+++ b/.github/workflows/create-event-workflow-reusable.yml
@@ -0,0 +1,130 @@
+name: Schedule X Template Workflow
+
+on:
+ workflow_call:
+
+ inputs:
+ time:
+ description: 'Info about meeting hour in UTC time zone, like: 08 or 16. No PM or AM versions.'
+ required: true
+ type: string
+ date:
+ description: 'Date in a form like: 2022-04-05 where 04 is a month and 05 is a day number.'
+ required: true
+ type: string
+ meeting_name:
+ description: 'Name of the meeting.'
+ required: true
+ type: string
+ meeting_name_suffix:
+ description: 'Optional additional description added at the end of meeting title to indicate purpose of given meeting.'
+ type: string
+ required: false
+ meeting_desc:
+ description: 'Description of the purpose of the meeting.'
+ required: true
+ type: string
+ host:
+ description: 'Email address of the host of the meeting.'
+ required: true
+ type: string
+ guest:
+ description: 'Name of extra guest for the meeting.'
+ required: false
+ type: string
+ alternative_host:
+ description: 'Email address of alternative hosts of the meeting.'
+ required: false
+ type: string
+ issue_template_path:
+ description: 'Path to the issue template used to create meeting GH issue.'
+ required: true
+ type: string
+ create_zoom:
+ description: 'Boolean information if meeting.'
+ required: true
+ type: boolean
+
+ secrets:
+ GH_TOKEN:
+ required: true
+ ZOOM_API_KEY:
+ required: true
+ ZOOM_API_SECRET:
+ required: true
+ STREAM_URL:
+ required: true
+ STREAM_KEY:
+ required: true
+ CALENDAR_ID:
+ required: true
+ CALENDAR_SERVICE_ACCOUNT:
+ required: true
+
+jobs:
+
+ setup-meeting:
+ env:
+ ZOOM_API_KEY: ${{ secrets.ZOOM_API_KEY }}
+ ZOOM_API_SECRET: ${{ secrets.ZOOM_API_SECRET }}
+ STREAM_URL: ${{ secrets.STREAM_URL }}
+ STREAM_KEY: ${{ secrets.STREAM_KEY }}
+ CALENDAR_ID: ${{ secrets.CALENDAR_ID }}
+ CALENDAR_SERVICE_ACCOUNT: ${{ secrets.CALENDAR_SERVICE_ACCOUNT }}
+ name: Setup meeting
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v2
+ - name: Setup Node.js
+ uses: actions/setup-node@v2
+ with:
+ node-version: 16
+ cache: 'npm'
+ cache-dependency-path: '**/package-lock.json'
+ - name: Install deps
+ run: npm install
+ working-directory: ./.github/workflows/create-event-helpers
+ - if: inputs.create_zoom == true
+ name: Create zoom meeting
+ uses: actions/github-script@v4
+ id: zoom
+ env:
+ MEETING_NAME: ${{ inputs.meeting_name }}
+ with:
+ script: |
+ const setupZoom = require('./.github/workflows/create-event-helpers/zoom/index.js');
+ setupZoom('${{ inputs.date }}', '${{ inputs.time }}', '${{ inputs.host }}', '${{ inputs.alternative_host }}');
+ - name: Create issue with meeting details
+ uses: JasonEtco/create-an-issue@v2
+ id: create-issue
+ env:
+ GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
+ FULL_DATE: ${{ inputs.date }}T${{ inputs.time }}:00:00Z
+ DATE_ONLY: ${{ inputs.date }}
+ ZOOM_LINK: ${{ steps.zoom.outputs.meetingUrl }}
+ MEETING_NAME: ${{ inputs.meeting_name }}
+ MEETING_NAME_SUFFIX: ${{ inputs.meeting_name_suffix }}
+ MEETING_DESC: ${{ inputs.meeting_desc }}
+ GUEST: ${{ inputs.guest }}
+ with:
+ filename: ${{ inputs.issue_template_path }}
+ - name: Create Google Calendar entry with zoom
+ uses: actions/github-script@v4
+ env:
+ MEETING_NAME: ${{ inputs.meeting_name }}
+ MEETING_NAME_SUFFIX: ${{ inputs.meeting_name_suffix }}
+ MEETING_DESC: ${{ inputs.meeting_desc }}
+ GUEST: ${{ inputs.guest }}
+ with:
+ script: |
+ const { addEvent } = require('./.github/workflows/create-event-helpers/calendar/index.js');
+ addEvent('${{ steps.zoom.outputs.meetingUrl }}', '${{ inputs.date }}', '${{ inputs.time }}', '${{ steps.create-issue.outputs.number }}');
+ - name: Publish information about meeting to Twitter
+ uses: m1ner79/Github-Twittction@v1.0.1
+ with:
+ twitter_status: "New meeting scheduled 💪\n\nName: ${{ inputs.meeting_name }}\n\nCheck what is it about and how to connect 👇🏼 https://github.com/asyncapi/community/issues/${{ steps.create-issue.outputs.number }}"
+ twitter_consumer_key: ${{ secrets.TWITTER_CONSUMER_KEY }}
+ twitter_consumer_secret: ${{ secrets.TWITTER_CONSUMER_SECRET }}
+ twitter_access_token_key: ${{ secrets.TWITTER_ACCESS_TOKEN_KEY }}
+ twitter_access_token_secret: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }}
\ No newline at end of file
diff --git a/.github/workflows/event_issue_templates/index.js b/.github/workflows/event_issue_templates/index.js
deleted file mode 100644
index 9de4456c9..000000000
--- a/.github/workflows/event_issue_templates/index.js
+++ /dev/null
@@ -1,28 +0,0 @@
-const { writeFileSync } = require('fs');
-const { getMeetingIssueContent } = require('./meetings/community.js');
-const { parseDate } = require('./utils/date.js');
-
-/**
- * @param {string} date Date as YYYY-MM-DD
- * @param {string} time Number that represents hour, 2-digit format
- * @param {string} code Entire core package helper
- * @param {string} getMeetingIssueContent Function that returns content of the meeting issue
-*/
-module.exports = (date, time, core, getMeetingIssueContent) => {
-
- core.info(`Workflow triggered with the following hour ${time} and date ${date}`);
- const dateDetails = parseDate(`${ date }T${ time }:00:00Z`);
-
- core.info('This is how time and date looks like after parsing:');
- core.info(JSON.stringify(dateDetails));
-
- if (dateDetails === 'Invalid Date') core.setFailed('Invalid date of the event. Make sure that you provided correct hour of the meeting and date in a format described in the meeting input form.')
-
- const issueContent = getMeetingIssueContent(dateDetails.hour, dateDetails.formattedDate);
-
- writeFileSync('content.md', issueContent, { encoding: 'utf8'});
-
- core.setOutput('formattedDate', dateDetails.formattedDate);
- core.setOutput('fullDate', dateDetails.fullDate);
- core.setOutput('hour', dateDetails.hour);
-}
\ No newline at end of file
diff --git a/.github/workflows/event_issue_templates/meetings/community.js b/.github/workflows/event_issue_templates/meetings/community.js
deleted file mode 100644
index 32deabc6a..000000000
--- a/.github/workflows/event_issue_templates/meetings/community.js
+++ /dev/null
@@ -1,28 +0,0 @@
-module.exports.getMeetingIssueContent = (time, date) => {
-
- return `This is the AsyncAPI Community meeting. You're invited to [join us live on Zoom](https://zoom.us/j/165106914) and ask questions. **The meeting takes place on alternate Tuesdays**. Recordings from the previous meetings are available in [this](https://www.youtube.com/playlist?list=PLbi1gRlP7pijUwZJErzyYf_Rc-PWu4lXS) playlist on YouTube.
-
-**This time we meet at ${time}:00 UTC. Check what time is it in your time zone with [time zone converter](https://dateful.com/convert/coordinated-universal-time-utc?t=${time}&d=${date})**
-
-Join [this](https://groups.google.com/forum/#!forum/asyncapi-users) mailing list to get an always-up-to-date invite to the meeting in your calendar. You can also check [AsyncAPI Calendar](https://calendar.google.com/calendar/u/0/embed?src=tbrbfq4de5bcngt8okvev4lstk@group.calendar.google.com).
-
-## Agenda
-
-> Don't wait for the meeting to discuss topics that already have issues. Feel free to comment on them earlier.
-
-1. Q&A
-1. _Place for your topic_
-1. Q&A
-
-## Notes
-
-tbd
-
-## Chat
-
-tbd
-
-## Recording
-
-tbd`
-}
\ No newline at end of file
diff --git a/.github/workflows/event_issue_templates/meetings/lets-talk-about-contrib.js b/.github/workflows/event_issue_templates/meetings/lets-talk-about-contrib.js
deleted file mode 100644
index 38c1f9df6..000000000
--- a/.github/workflows/event_issue_templates/meetings/lets-talk-about-contrib.js
+++ /dev/null
@@ -1,18 +0,0 @@
-module.exports.getMeetingIssueContent = (time, date) => {
-
- return `The purpose of this meeting is to focus on contributors, focus on people that want to contribute to AsyncAPI Initiative but do not know how to do it. AsyncAPI Initiative is a large project, with lots of code, lots of docs, and many many other areas that need help, but it is not easy to start.
-
-Recordings from the previous meetings are available in [this](https://www.youtube.com/playlist?list=PLbi1gRlP7pigPBrBMaNQhUeniR1pdDMiY) playlist on YouTube.
-
-**This time we meet at ${time}:00 UTC. Check what time is it in your time zone with [time zone converter](https://dateful.com/convert/coordinated-universal-time-utc?t=${time}&d=${date})**
-
-Join [this](https://groups.google.com/forum/#!forum/asyncapi-users) mailing list to get an always-up-to-date invite to the meeting in your calendar. You can also check [AsyncAPI Calendar](https://calendar.google.com/calendar/u/0/embed?src=tbrbfq4de5bcngt8okvev4lstk@group.calendar.google.com).
-
-This meatin is a live-stream that goes to the following social media:
-- [YouTube](https://www.youtube.com/asyncapi)
-- [Twitch](https://www.twitch.tv/asyncapi)
-- [Twitter](https://twitter.com/AsyncAPISpec)
-- [LinkedIn](https://www.linkedin.com/company/asyncapi)
-
-To broadcast the live-stream, we are using [Restream](https://restream.io/). You are invited to join us live on the call and not only interact through chats on YouTube and Twitch.`
-}
\ No newline at end of file
diff --git a/.github/workflows/event_issue_templates/meetings/spec-3-0.js b/.github/workflows/event_issue_templates/meetings/spec-3-0.js
deleted file mode 100644
index 4dadd7500..000000000
--- a/.github/workflows/event_issue_templates/meetings/spec-3-0.js
+++ /dev/null
@@ -1,30 +0,0 @@
-module.exports.getMeetingIssueContent = (time, date) => {
-
- return `This is the meeting for community member involved in works related to 3.0 release of AsyncAPI Specification.
-
-**The meeting takes place bi-weekly on Wednesdays**. First and third week every month until release. Recordings from the previous meetings are available in [this](https://www.youtube.com/playlist?list=PLbi1gRlP7pihClJY-kXuTRRJ8n1awb0VV) playlist on YouTube.
-
-**This time we meet at ${time}:00 UTC. Check what time is it in your time zone with [time zone converter](https://dateful.com/convert/coordinated-universal-time-utc?t=${time}&d=${date})**
-
-Join [this mailing list](https://groups.google.com/forum/#!forum/asyncapi-users) to get an always-up-to-date invite to the meeting in your calendar. You can also check [AsyncAPI Calendar](https://calendar.google.com/calendar/u/0/embed?src=tbrbfq4de5bcngt8okvev4lstk@group.calendar.google.com).
-
-This meeting is a live-stream that goes to the following social media:
-- [YouTube](https://www.youtube.com/asyncapi)
-- [Twitch](https://www.twitch.tv/asyncapi)
-- [Twitter](https://twitter.com/AsyncAPISpec)
-- [LinkedIn](https://www.linkedin.com/company/asyncapi)
-
-You can also join live the meeting on [Zoom](https://us02web.zoom.us/j/82566953769).
-
-## Agenda
-
-> Don't wait for the meeting to discuss topics that already have issues. Feel free to comment on them earlier.
-
-1. Q&A
-1. _Place for your topic_
-1. Q&A
-
-## Recording
-
-tbd`
-}
\ No newline at end of file
diff --git a/.github/workflows/event_issue_templates/utils/README.md b/.github/workflows/event_issue_templates/utils/README.md
deleted file mode 100644
index 4a31c9a22..000000000
--- a/.github/workflows/event_issue_templates/utils/README.md
+++ /dev/null
@@ -1 +0,0 @@
-Instead of using `package.json` and building complex build system for scripts that setup AsyncAPI meetings, we keep source code of minified [day.js](https://github.com/iamkun/dayjs) and its UTC-format plugin here in `utils` folder directly. This scripts run on CI, and are not vulerable so do not need `package.json` and regular security updates.
\ No newline at end of file
diff --git a/.github/workflows/event_issue_templates/utils/date.js b/.github/workflows/event_issue_templates/utils/date.js
deleted file mode 100644
index 295975b35..000000000
--- a/.github/workflows/event_issue_templates/utils/date.js
+++ /dev/null
@@ -1,19 +0,0 @@
-const dayjs = require('./dayjs.min.js');
-const utc = require('./utc.js');
-dayjs.extend(utc);
-
-/**
- * @param {string} date Date as 2019-01-25T08:00:00Z
-*/
-module.exports.parseDate = (date) => {
-
- const meetingDate = dayjs(date);
- const formattedDate = meetingDate.utc().format('YYYY-MM-DD');
- const fullDate = meetingDate.utc().format('dddd MMMM D YYYY');
- const hour = meetingDate.utc().format('H');
-
- return { formattedDate, fullDate, hour }
-}
-
-
-
diff --git a/.github/workflows/event_issue_templates/utils/dayjs.min.js b/.github/workflows/event_issue_templates/utils/dayjs.min.js
deleted file mode 100644
index 50c5278a3..000000000
--- a/.github/workflows/event_issue_templates/utils/dayjs.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){"use strict";var t=1e3,e=6e4,n=36e5,r="millisecond",i="second",s="minute",u="hour",a="day",o="week",f="month",h="quarter",c="year",d="date",$="Invalid Date",l=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,y=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_")},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:""+Array(e+1-r.length).join(n)+t},g={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?"+":"-")+m(r,2,"0")+":"+m(i,2,"0")},m:function t(e,n){if(e.date()1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(v=i),i||!r&&v},w=function(t,e){if(p(t))return t.clone();var n="object"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},O=g;O.l=S,O.i=p,O.w=function(t,e){return w(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=S(t.locale,null,!0),this.parse(t)}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(O.u(e))return new Date;if(e instanceof Date)return new Date(e);if("string"==typeof e&&!/Z$/i.test(e)){var r=e.match(l);if(r){var i=r[2]-1||0,s=(r[7]||"0").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.$x=t.x||{},this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return O},m.isValid=function(){return!(this.$d.toString()===$)},m.isSame=function(t,e){var n=w(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return w(t) You need to manually close issues for old meetings and manage pinned issues.
+### What are my responsibilities as meeting host?
-## New events registration
+In case your meeting is Zoom-first, this is what you need to do to kick it off:
+1. Start your meeting by opening a Zoom meeting. Make sure you are logged into Zoom with your AsyncAPI licensed account.
+1. In Zoom, click the `Live Transcript` button to start transcribing the meeting.
+1. Log into [Restream.io](https://app.restream.io/home) and select `Set up for OBS, Zoom, etc.` option.
+1. Click `Update Titles` and set the proper title for the live stream that corresponds with the meeting you just started.
+1. In Zoom, click `More` > `Live on Custom Live Stream Service` to start streaming to Restream and, therefore, to official AsyncAPI social networks.
-* To get a new issue registered in AsyncAPI Calendar, contact the community in the `#events` channel in [Slack](https://www.asyncapi.com/slack-invite),
-* To modify an issue creation workflow to support a new event, add new workflow like [this one](.github/workflows/create-event-issue-community-meeting.yml) and add a new script like [this one](.github/workflows/event_issue_templates/meetings/community.js).
\ No newline at end of file
+> Some meetings, such as the `Thinking Out Loud` live stream, are unavailable on Zoom. This means the community can only join via live chat. Thus, the above instructions do not apply to them.
+
+Once the meeting is over:
+1. Provide related GitHub Issue meeting notes and then close the issue.
+1. Login to YouTube and add the recorded live stream to the respective YouTube Playlist.
+
+### How can I get notified about upcoming meetings?
+
+Subscribe to the [AsyncAPI Newsletter](https://asyncapi.com/newsletter) to get information about upcoming meetings.
+
+We have an automated workflow in place:
+1. Automation starts every Friday at midnight
+1. It gets information from Google Calendar about all the meetings scheduled for the upcoming week
+1. It schedules a MailChimp campaign to send emails with a list of meetings. It's sent on Friday at 11AM in the subscriber's time zone
+
+### Where can I find the AsyncAPI calendar?
+
+- [Main link to calendar](https://calendar.google.com/calendar/embed?src=c_q9tseiglomdsj6njuhvbpts11c%40group.calendar.google.com&ctz=UTC)
+- [iCal/ics file](https://calendar.google.com/calendar/ical/c_q9tseiglomdsj6njuhvbpts11c%40group.calendar.google.com/public/basic.ics)
+
+### How do I cancel a meeting?
+
+If you need to cancel a meeting, simply close the corresponding meeting issue.
+
+We have an automated workflow in place:
+1. Automation starts when the GitHub issue is closed
+1. It checks if a closed issue represents a future event
+1. It removes meetings from the AsyncAPI Google Calendar
+
+### How do I register a new regular meeting?
+
+Start [discussion in community repository](https://github.com/asyncapi/community/discussions). Explain the idea and justify why it requires a separate meeting. We currently have [approval from the Technical Steering Commitee](https://github.com/asyncapi/community/discussions/295) to pay for up to 8 Zoom licenses.
+
+Once a new meeting is approved, add a [new workflow like this one](.github/workflows/create-event-community-meeting.yml) and a [new GitHub issue template like this one](.github/workflows/create-event-helpers/issues_templates/community.md).
+
+
+### How can I become a host?
+
+Once your `Regular` meeting gets approved, contact `Fran Mendez` so that he can give you access to all required tools.