From 0fa6e59a49d5eb6f561fbc15157447e9017ba88d Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Wed, 12 Jun 2024 14:32:25 -0700 Subject: [PATCH 01/19] fetch notification stats by user --- app/assets/javascripts/sampleChartDashboard.js | 18 ++++++++++-------- app/main/views/dashboard.py | 18 ++++++++++++++++-- app/notify_client/service_api_client.py | 10 ++++++++++ app/templates/views/dashboard/dashboard.html | 4 ++-- 4 files changed, 38 insertions(+), 12 deletions(-) diff --git a/app/assets/javascripts/sampleChartDashboard.js b/app/assets/javascripts/sampleChartDashboard.js index d191abef1..5282f7626 100644 --- a/app/assets/javascripts/sampleChartDashboard.js +++ b/app/assets/javascripts/sampleChartDashboard.js @@ -12,7 +12,7 @@ labels: [], datasets: [ { - label: 'Delivered', + label: 'Requested', data: [], backgroundColor: '#0076d6', stack: 'Stack 0' @@ -29,23 +29,24 @@ }); var socket = io(); - var serviceId = ctx.getAttribute('data-service-id'); socket.on('connect', function() { - socket.emit('fetch_daily_stats', serviceId); + socket.emit('fetch_daily_stats_by_user'); + console.log('connected') }); - socket.on('daily_stats_update', function(data) { + socket.on('daily_stats_by_user_update', function(data) { + console.log('Data received:', data); var labels = []; - var deliveredData = []; + var requestedData = []; for (var date in data) { labels.push(date); - deliveredData.push(data[date].sms.delivered); + requestedData.push(data[date].sms.requested); } myBarChart.data.labels = labels; - myBarChart.data.datasets[0].data = deliveredData; + myBarChart.data.datasets[0].data = requestedData; myBarChart.update(); }); @@ -56,7 +57,8 @@ var sevenDaysButton = document.getElementById('sevenDaysButton'); if (sevenDaysButton) { sevenDaysButton.addEventListener('click', function() { - socket.emit('fetch_daily_stats', serviceId); + socket.emit('fetch_daily_stats_by_user'); + console.log('clicked') }); } } diff --git a/app/main/views/dashboard.py b/app/main/views/dashboard.py index a64444dc2..f2a4d6b20 100644 --- a/app/main/views/dashboard.py +++ b/app/main/views/dashboard.py @@ -35,7 +35,8 @@ from notifications_utils.recipients import format_phone_number_human_readable @socketio.on("fetch_daily_stats") -def handle_fetch_daily_stats(service_id): +def handle_fetch_daily_stats(): + service_id = session.get('service_id') if service_id: date_range = get_stats_date_range() daily_stats = service_api_client.get_service_notification_statistics_by_day( @@ -46,6 +47,20 @@ def handle_fetch_daily_stats(service_id): emit("error", {"error": "No service_id provided"}) +@socketio.on("fetch_daily_stats_by_user") +def handle_fetch_daily_stats_by_user(): + service_id = session.get('service_id') + user_id = session.get('user_id') + if service_id and user_id: + date_range = get_stats_date_range() + daily_stats_by_user = service_api_client.get_user_service_notification_statistics_by_day( + service_id, user_id, start_date=date_range["start_date"], days=date_range["days"] + ) + emit("daily_stats_by_user_update", daily_stats_by_user) + else: + emit("error", {"error": "No service_id provided"}) + + @main.route("/services//dashboard") @user_has_permissions("view_activity", "send_messages") def old_service_dashboard(service_id): @@ -98,7 +113,6 @@ def service_dashboard(service_id): partials=get_dashboard_partials(service_id), job_and_notifications=job_and_notifications, service_data_retention_days=service_data_retention_days, - service_id=service_id, ) diff --git a/app/notify_client/service_api_client.py b/app/notify_client/service_api_client.py index 42f54572f..bdb1340b6 100644 --- a/app/notify_client/service_api_client.py +++ b/app/notify_client/service_api_client.py @@ -53,6 +53,16 @@ class ServiceAPIClient(NotifyAdminAPIClient): "/service/{0}/statistics/{1}/{2}".format(service_id, start_date, days), )["data"] + def get_user_service_notification_statistics_by_day( + self, service_id, user_id, start_date=None, days=None + ): + if start_date is None: + start_date = datetime.now().strftime("%Y-%m-%d") + + return self.get( + "/service/{0}/statistics/user/{1}/{2}/{3}".format(service_id, user_id, start_date, days), + )["data"] + def get_services(self, params_dict=None): """ Retrieve a list of services. diff --git a/app/templates/views/dashboard/dashboard.html b/app/templates/views/dashboard/dashboard.html index c1ba46caf..9f45da276 100644 --- a/app/templates/views/dashboard/dashboard.html +++ b/app/templates/views/dashboard/dashboard.html @@ -22,8 +22,8 @@ Messages sent - + + {{ ajax_block(partials, updates_url, 'inbox') }} {{ ajax_block(partials, updates_url, 'totals') }} From 3594694de218874d8e6ee6533a1464fb78d5d18b Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Mon, 17 Jun 2024 12:36:21 -0700 Subject: [PATCH 02/19] added fetch by user --- .../javascripts/sampleChartDashboard.js | 6 +- app/main/views/dashboard.py | 30 +++++-- app/notify_client/service_api_client.py | 4 +- tests/app/main/views/test_dashboard.py | 80 +++++++++++-------- 4 files changed, 77 insertions(+), 43 deletions(-) diff --git a/app/assets/javascripts/sampleChartDashboard.js b/app/assets/javascripts/sampleChartDashboard.js index 5282f7626..a208d1bee 100644 --- a/app/assets/javascripts/sampleChartDashboard.js +++ b/app/assets/javascripts/sampleChartDashboard.js @@ -31,11 +31,11 @@ var socket = io(); socket.on('connect', function() { - socket.emit('fetch_daily_stats_by_user'); + socket.emit('fetch_daily_stats'); console.log('connected') }); - socket.on('daily_stats_by_user_update', function(data) { + socket.on('daily_stats_update', function(data) { console.log('Data received:', data); var labels = []; var requestedData = []; @@ -57,7 +57,7 @@ var sevenDaysButton = document.getElementById('sevenDaysButton'); if (sevenDaysButton) { sevenDaysButton.addEventListener('click', function() { - socket.emit('fetch_daily_stats_by_user'); + socket.emit('fetch_daily_stats'); console.log('clicked') }); } diff --git a/app/main/views/dashboard.py b/app/main/views/dashboard.py index f2a4d6b20..5bb497f3c 100644 --- a/app/main/views/dashboard.py +++ b/app/main/views/dashboard.py @@ -4,7 +4,7 @@ from datetime import datetime from functools import partial from itertools import groupby -from flask import Response, abort, jsonify, render_template, request, session, url_for +from flask import Response, abort, jsonify, render_template, request, session, url_for,Flask, g from flask_login import current_user from flask_socketio import emit from werkzeug.utils import redirect @@ -32,11 +32,23 @@ from app.utils.pagination import generate_next_dict, generate_previous_dict from app.utils.time import get_current_financial_year from app.utils.user import user_has_permissions from notifications_utils.recipients import format_phone_number_human_readable - +from flask_socketio import SocketIO +import app @socketio.on("fetch_daily_stats") def handle_fetch_daily_stats(): service_id = session.get('service_id') + print(''' + + + + + + + service_id ''', + + service_id) + if service_id: date_range = get_stats_date_range() daily_stats = service_api_client.get_service_notification_statistics_by_day( @@ -49,12 +61,18 @@ def handle_fetch_daily_stats(): @socketio.on("fetch_daily_stats_by_user") def handle_fetch_daily_stats_by_user(): - service_id = session.get('service_id') - user_id = session.get('user_id') + service_id = session.get("service_id") + user_id = session.get("user_id") + # print(f"Service ID in handler: {service_id}") if service_id and user_id: date_range = get_stats_date_range() - daily_stats_by_user = service_api_client.get_user_service_notification_statistics_by_day( - service_id, user_id, start_date=date_range["start_date"], days=date_range["days"] + daily_stats_by_user = ( + service_api_client.get_user_service_notification_statistics_by_day( + service_id, + user_id, + start_date=date_range["start_date"], + days=date_range["days"], + ) ) emit("daily_stats_by_user_update", daily_stats_by_user) else: diff --git a/app/notify_client/service_api_client.py b/app/notify_client/service_api_client.py index bdb1340b6..f4f0d9f56 100644 --- a/app/notify_client/service_api_client.py +++ b/app/notify_client/service_api_client.py @@ -60,7 +60,9 @@ class ServiceAPIClient(NotifyAdminAPIClient): start_date = datetime.now().strftime("%Y-%m-%d") return self.get( - "/service/{0}/statistics/user/{1}/{2}/{3}".format(service_id, user_id, start_date, days), + "/service/{0}/statistics/user/{1}/{2}/{3}".format( + service_id, user_id, start_date, days + ), )["data"] def get_services(self, params_dict=None): diff --git a/tests/app/main/views/test_dashboard.py b/tests/app/main/views/test_dashboard.py index 285444b1b..7cd150d6c 100644 --- a/tests/app/main/views/test_dashboard.py +++ b/tests/app/main/views/test_dashboard.py @@ -4,8 +4,10 @@ from datetime import datetime import pytest from flask import Flask, url_for -from flask_socketio import SocketIOTestClient +from flask_socketio import SocketIO, SocketIOTestClient from freezegun import freeze_time +from boto3 import Session +import app from app import create_app, socketio from app.main.views.dashboard import ( @@ -15,6 +17,7 @@ from app.main.views.dashboard import ( format_monthly_stats_to_list, get_dashboard_totals, get_tuples_of_financial_years, + handle_fetch_daily_stats ) from tests import ( organization_json, @@ -1884,6 +1887,12 @@ def test_service_dashboard_shows_batched_jobs( def app_with_socketio(): app = Flask("app") create_app(app) + socketio = SocketIO(app, manage_session=False) + + @socketio.on("fetch_daily_stats") + def fetch_daily_stats_handler(): + handle_fetch_daily_stats() + return app, socketio @@ -1893,26 +1902,26 @@ def app_with_socketio(): ( SERVICE_ONE_ID, {"start_date": "2024-01-01", "days": 7}, - {"service_id": SERVICE_ONE_ID, "start_date": "2024-01-01", "days": 7} + {"service_id": SERVICE_ONE_ID, "start_date": "2024-01-01", "days": 7}, ), ( - SERVICE_TWO_ID, + SERVICE_ONE_ID, {"start_date": "2023-06-01", "days": 7}, {"service_id": SERVICE_TWO_ID, "start_date": "2023-06-01", "days": 7} ), - ] + ], ) def test_fetch_daily_stats( - app_with_socketio, mocker, - service_id, + app_with_socketio, + mocker, service_id, date_range, - expected_call_args + expected_call_args, + client_request, ): app, socketio = app_with_socketio mocker.patch( - "app.main.views.dashboard.get_stats_date_range", - return_value=date_range + "app.main.views.dashboard.get_stats_date_range", return_value=date_range ) mock_service_api = mocker.patch( @@ -1920,34 +1929,39 @@ def test_fetch_daily_stats( return_value={ date_range["start_date"]: { "email": {"delivered": 0, "failure": 0, "requested": 0}, - "sms": {"delivered": 0, "failure": 1, "requested": 1} + "sms": {"delivered": 0, "failure": 1, "requested": 1}, }, - } + }, ) client = SocketIOTestClient(app, socketio) - try: - connected = client.is_connected() - assert connected, "Client should be connected" - client.emit('fetch_daily_stats', service_id) + with client_request.session_transaction() as session: + # service_id = session["service_id"] + try: + connected = client.is_connected() + assert connected, "Client should be connected" - received = client.get_received() - assert received, "Should receive a response message" - assert received[0]['name'] == 'daily_stats_update' - assert received[0]['args'][0] == { - date_range["start_date"]: { - "email": {"delivered": 0, "failure": 0, "requested": 0}, - "sms": {"delivered": 0, "failure": 1, "requested": 1} - }, - } + # service_id = session["service_id"] + client.emit('fetch_daily_stats') + received = client.get_received() + print(f"Received messages: {received}") - mock_service_api.assert_called_once_with( - service_id, - start_date=expected_call_args["start_date"], - days=expected_call_args["days"] - ) - finally: - client.disconnect() - disconnected = not client.is_connected() - assert disconnected, "Client should be disconnected" + assert received, "Should receive a response message" + assert received[0]["name"] == "daily_stats_update" + assert received[0]["args"][0] == { + date_range["start_date"]: { + "email": {"delivered": 0, "failure": 0, "requested": 0}, + "sms": {"delivered": 0, "failure": 1, "requested": 1}, + }, + } + + mock_service_api.assert_called_once_with( + service_id, + start_date=expected_call_args["start_date"], + days=expected_call_args["days"], + ) + finally: + client.disconnect() + disconnected = not client.is_connected() + assert disconnected, "Client should be disconnected" From fc7500932b15075f80542f0e221ad787406a0682 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Mon, 17 Jun 2024 12:39:08 -0700 Subject: [PATCH 03/19] added daily stats by user to js --- app/assets/javascripts/sampleChartDashboard.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/sampleChartDashboard.js b/app/assets/javascripts/sampleChartDashboard.js index a208d1bee..5282f7626 100644 --- a/app/assets/javascripts/sampleChartDashboard.js +++ b/app/assets/javascripts/sampleChartDashboard.js @@ -31,11 +31,11 @@ var socket = io(); socket.on('connect', function() { - socket.emit('fetch_daily_stats'); + socket.emit('fetch_daily_stats_by_user'); console.log('connected') }); - socket.on('daily_stats_update', function(data) { + socket.on('daily_stats_by_user_update', function(data) { console.log('Data received:', data); var labels = []; var requestedData = []; @@ -57,7 +57,7 @@ var sevenDaysButton = document.getElementById('sevenDaysButton'); if (sevenDaysButton) { sevenDaysButton.addEventListener('click', function() { - socket.emit('fetch_daily_stats'); + socket.emit('fetch_daily_stats_by_user'); console.log('clicked') }); } From a1f2deda8f5641f8f3402823449abd46764585e2 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Mon, 17 Jun 2024 17:32:24 -0700 Subject: [PATCH 04/19] added test_fetch_daily_stats_by_user test --- .../javascripts/sampleChartDashboard.js | 6 +- app/main/views/dashboard.py | 19 +-- tests/app/main/views/test_dashboard.py | 147 +++++++++++++----- 3 files changed, 112 insertions(+), 60 deletions(-) diff --git a/app/assets/javascripts/sampleChartDashboard.js b/app/assets/javascripts/sampleChartDashboard.js index 5282f7626..a208d1bee 100644 --- a/app/assets/javascripts/sampleChartDashboard.js +++ b/app/assets/javascripts/sampleChartDashboard.js @@ -31,11 +31,11 @@ var socket = io(); socket.on('connect', function() { - socket.emit('fetch_daily_stats_by_user'); + socket.emit('fetch_daily_stats'); console.log('connected') }); - socket.on('daily_stats_by_user_update', function(data) { + socket.on('daily_stats_update', function(data) { console.log('Data received:', data); var labels = []; var requestedData = []; @@ -57,7 +57,7 @@ var sevenDaysButton = document.getElementById('sevenDaysButton'); if (sevenDaysButton) { sevenDaysButton.addEventListener('click', function() { - socket.emit('fetch_daily_stats_by_user'); + socket.emit('fetch_daily_stats'); console.log('clicked') }); } diff --git a/app/main/views/dashboard.py b/app/main/views/dashboard.py index 5bb497f3c..ae58ff226 100644 --- a/app/main/views/dashboard.py +++ b/app/main/views/dashboard.py @@ -4,7 +4,7 @@ from datetime import datetime from functools import partial from itertools import groupby -from flask import Response, abort, jsonify, render_template, request, session, url_for,Flask, g +from flask import Response, abort, jsonify, render_template, request, session, url_for from flask_login import current_user from flask_socketio import emit from werkzeug.utils import redirect @@ -32,23 +32,11 @@ from app.utils.pagination import generate_next_dict, generate_previous_dict from app.utils.time import get_current_financial_year from app.utils.user import user_has_permissions from notifications_utils.recipients import format_phone_number_human_readable -from flask_socketio import SocketIO -import app + @socketio.on("fetch_daily_stats") def handle_fetch_daily_stats(): service_id = session.get('service_id') - print(''' - - - - - - - service_id ''', - - service_id) - if service_id: date_range = get_stats_date_range() daily_stats = service_api_client.get_service_notification_statistics_by_day( @@ -63,7 +51,6 @@ def handle_fetch_daily_stats(): def handle_fetch_daily_stats_by_user(): service_id = session.get("service_id") user_id = session.get("user_id") - # print(f"Service ID in handler: {service_id}") if service_id and user_id: date_range = get_stats_date_range() daily_stats_by_user = ( @@ -76,7 +63,7 @@ def handle_fetch_daily_stats_by_user(): ) emit("daily_stats_by_user_update", daily_stats_by_user) else: - emit("error", {"error": "No service_id provided"}) + emit("error", {"error": "No service_id or user_id provided"}) @main.route("/services//dashboard") diff --git a/tests/app/main/views/test_dashboard.py b/tests/app/main/views/test_dashboard.py index 7cd150d6c..78889bff2 100644 --- a/tests/app/main/views/test_dashboard.py +++ b/tests/app/main/views/test_dashboard.py @@ -6,10 +6,8 @@ import pytest from flask import Flask, url_for from flask_socketio import SocketIO, SocketIOTestClient from freezegun import freeze_time -from boto3 import Session -import app -from app import create_app, socketio +from app import create_app from app.main.views.dashboard import ( aggregate_notifications_stats, aggregate_status_types, @@ -17,7 +15,8 @@ from app.main.views.dashboard import ( format_monthly_stats_to_list, get_dashboard_totals, get_tuples_of_financial_years, - handle_fetch_daily_stats + handle_fetch_daily_stats, + handle_fetch_daily_stats_by_user, ) from tests import ( organization_json, @@ -29,6 +28,7 @@ from tests.conftest import ( ORGANISATION_ID, SERVICE_ONE_ID, SERVICE_TWO_ID, + USER_ONE_ID, create_active_caseworking_user, create_active_user_view_permissions, normalize_spaces, @@ -1877,7 +1877,6 @@ def test_service_dashboard_shows_batched_jobs( rows = job_table_body.find_all("tbody")[0].find_all("tr") - # # Check if the "Job" table exists assert job_table_body is not None assert len(rows) == 1 @@ -1887,12 +1886,9 @@ def test_service_dashboard_shows_batched_jobs( def app_with_socketio(): app = Flask("app") create_app(app) - socketio = SocketIO(app, manage_session=False) - - @socketio.on("fetch_daily_stats") - def fetch_daily_stats_handler(): - handle_fetch_daily_stats() - + socketio = SocketIO(app) + socketio.on_event("fetch_daily_stats", handle_fetch_daily_stats) + socketio.on_event("fetch_daily_stats_by_user", handle_fetch_daily_stats_by_user) return app, socketio @@ -1905,7 +1901,7 @@ def app_with_socketio(): {"service_id": SERVICE_ONE_ID, "start_date": "2024-01-01", "days": 7}, ), ( - SERVICE_ONE_ID, + SERVICE_TWO_ID, {"start_date": "2023-06-01", "days": 7}, {"service_id": SERVICE_TWO_ID, "start_date": "2023-06-01", "days": 7} ), @@ -1913,10 +1909,10 @@ def app_with_socketio(): ) def test_fetch_daily_stats( app_with_socketio, - mocker, service_id, + mocker, + service_id, date_range, expected_call_args, - client_request, ): app, socketio = app_with_socketio @@ -1933,35 +1929,104 @@ def test_fetch_daily_stats( }, }, ) + with app.test_client() as client: + with client.session_transaction() as sess: + sess['service_id'] = service_id - client = SocketIOTestClient(app, socketio) + socketio_client = SocketIOTestClient(app, socketio, flask_test_client=client) - with client_request.session_transaction() as session: - # service_id = session["service_id"] - try: - connected = client.is_connected() - assert connected, "Client should be connected" + connected = socketio_client.is_connected() + assert connected, "Client should be connected" - # service_id = session["service_id"] - client.emit('fetch_daily_stats') - received = client.get_received() - print(f"Received messages: {received}") + socketio_client.emit('fetch_daily_stats') + received = socketio_client.get_received() - assert received, "Should receive a response message" - assert received[0]["name"] == "daily_stats_update" - assert received[0]["args"][0] == { - date_range["start_date"]: { - "email": {"delivered": 0, "failure": 0, "requested": 0}, - "sms": {"delivered": 0, "failure": 1, "requested": 1}, - }, - } + mock_service_api.assert_called_once_with( + expected_call_args["service_id"], + start_date=expected_call_args["start_date"], + days=expected_call_args["days"], + ) + assert received, "Should receive a response message" + assert received[0]["name"] == "daily_stats_update" + assert received[0]["args"][0] == { + date_range["start_date"]: { + "email": {"delivered": 0, "failure": 0, "requested": 0}, + "sms": {"delivered": 0, "failure": 1, "requested": 1}, + }, + } - mock_service_api.assert_called_once_with( - service_id, - start_date=expected_call_args["start_date"], - days=expected_call_args["days"], - ) - finally: - client.disconnect() - disconnected = not client.is_connected() - assert disconnected, "Client should be disconnected" + socketio_client.disconnect() + disconnected = not socketio_client.is_connected() + assert disconnected, "Client should be disconnected" + + +@pytest.mark.parametrize( + ("service_id", "user_id", "date_range", "expected_call_args", "user"), + [ + ( + SERVICE_ONE_ID, + USER_ONE_ID, + {"start_date": "2024-01-01", "days": 7}, + {"service_id": SERVICE_ONE_ID, "user_id": USER_ONE_ID, "start_date": "2024-01-01", "days": 7}, + {"id": USER_ONE_ID, "name": "Test User"} + ), + ], +) +def test_fetch_daily_stats_by_user( + app_with_socketio, + mocker, + service_id, + user_id, + date_range, + expected_call_args, + user, +): + app, socketio = app_with_socketio + + mocker.patch( + "app.main.views.dashboard.get_stats_date_range", return_value=date_range + ) + + mock_service_api = mocker.patch( + "app.service_api_client.get_user_service_notification_statistics_by_day", + return_value={ + date_range["start_date"]: { + "email": {"delivered": 0, "failure": 0, "requested": 0}, + "sms": {"delivered": 0, "failure": 1, "requested": 1}, + }, + }, + ) + + mocker.patch("app.user_api_client.get_user", return_value=user) + + with app.test_client() as client: + with client.session_transaction() as sess: + sess['service_id'] = service_id + sess['user_id'] = user_id + + socketio_client = SocketIOTestClient(app, socketio, flask_test_client=client) + + connected = socketio_client.is_connected() + assert connected, "Client should be connected" + + socketio_client.emit('fetch_daily_stats_by_user') + received = socketio_client.get_received() + + mock_service_api.assert_called_once_with( + expected_call_args["service_id"], + expected_call_args["user_id"], + start_date=expected_call_args["start_date"], + days=expected_call_args["days"], + ) + assert received, "Should receive a response message" + assert received[0]["name"] == "daily_stats_by_user_update" + assert received[0]["args"][0] == { + date_range["start_date"]: { + "email": {"delivered": 0, "failure": 0, "requested": 0}, + "sms": {"delivered": 0, "failure": 1, "requested": 1}, + }, + } + + socketio_client.disconnect() + disconnected = not socketio_client.is_connected() + assert disconnected, "Client should be disconnected" From 71901f49121cad504901afc650657f636217b4a1 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Mon, 17 Jun 2024 17:34:37 -0700 Subject: [PATCH 05/19] comment out mychart --- app/templates/views/dashboard/dashboard.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/templates/views/dashboard/dashboard.html b/app/templates/views/dashboard/dashboard.html index 9f45da276..dd0279629 100644 --- a/app/templates/views/dashboard/dashboard.html +++ b/app/templates/views/dashboard/dashboard.html @@ -22,8 +22,8 @@ Messages sent - - + {{ ajax_block(partials, updates_url, 'inbox') }} {{ ajax_block(partials, updates_url, 'totals') }} From 6ae2f5b3f19498f7d363438d930b87cdf545a375 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Mon, 17 Jun 2024 17:46:43 -0700 Subject: [PATCH 06/19] fixed lint in js --- app/assets/javascripts/sampleChartDashboard.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/sampleChartDashboard.js b/app/assets/javascripts/sampleChartDashboard.js index a208d1bee..5b6712c70 100644 --- a/app/assets/javascripts/sampleChartDashboard.js +++ b/app/assets/javascripts/sampleChartDashboard.js @@ -32,11 +32,10 @@ socket.on('connect', function() { socket.emit('fetch_daily_stats'); - console.log('connected') }); socket.on('daily_stats_update', function(data) { - console.log('Data received:', data); + // console.log('Data received:', data); var labels = []; var requestedData = []; @@ -51,14 +50,14 @@ }); socket.on('error', function(data) { - console.log('Error:', data); + // console.log('Error:', data); }); var sevenDaysButton = document.getElementById('sevenDaysButton'); if (sevenDaysButton) { sevenDaysButton.addEventListener('click', function() { socket.emit('fetch_daily_stats'); - console.log('clicked') + // console.log('clicked'); }); } } From d54cfdd6c0b17791ac5b39744c9d9afd6cba818d Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Tue, 18 Jun 2024 10:06:57 -0700 Subject: [PATCH 07/19] added utc time --- app/notify_client/service_api_client.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/notify_client/service_api_client.py b/app/notify_client/service_api_client.py index f4f0d9f56..3a0655d9e 100644 --- a/app/notify_client/service_api_client.py +++ b/app/notify_client/service_api_client.py @@ -1,4 +1,4 @@ -from datetime import datetime +from datetime import datetime, timezone from app.extensions import redis_client from app.notify_client import NotifyAdminAPIClient, _attach_current_user, cache @@ -57,7 +57,7 @@ class ServiceAPIClient(NotifyAdminAPIClient): self, service_id, user_id, start_date=None, days=None ): if start_date is None: - start_date = datetime.now().strftime("%Y-%m-%d") + start_date = datetime.now(timezone.utc).strftime("%Y-%m-%d") return self.get( "/service/{0}/statistics/user/{1}/{2}/{3}".format( From 637f3d4b42d4395b64c69df975eb4abf2999146d Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Wed, 19 Jun 2024 10:03:12 -0700 Subject: [PATCH 08/19] added fetch stats user to js --- app/assets/javascripts/sampleChartDashboard.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/sampleChartDashboard.js b/app/assets/javascripts/sampleChartDashboard.js index 5b6712c70..2237e6254 100644 --- a/app/assets/javascripts/sampleChartDashboard.js +++ b/app/assets/javascripts/sampleChartDashboard.js @@ -12,7 +12,7 @@ labels: [], datasets: [ { - label: 'Requested', + label: 'Delivered', data: [], backgroundColor: '#0076d6', stack: 'Stack 0' @@ -31,21 +31,21 @@ var socket = io(); socket.on('connect', function() { - socket.emit('fetch_daily_stats'); + socket.emit('fetch_daily_stats_by_user'); }); - socket.on('daily_stats_update', function(data) { + socket.on('daily_stats_by_user_update', function(data) { // console.log('Data received:', data); var labels = []; - var requestedData = []; + var deliveredData = []; for (var date in data) { labels.push(date); - requestedData.push(data[date].sms.requested); + deliveredData.push(data[date].sms.delivered); } myBarChart.data.labels = labels; - myBarChart.data.datasets[0].data = requestedData; + myBarChart.data.datasets[0].data = deliveredData; myBarChart.update(); }); @@ -56,7 +56,7 @@ var sevenDaysButton = document.getElementById('sevenDaysButton'); if (sevenDaysButton) { sevenDaysButton.addEventListener('click', function() { - socket.emit('fetch_daily_stats'); + socket.emit('fetch_daily_stats_by_user'); // console.log('clicked'); }); } From 5e98ec396efcc7ad6a0bf782d585e839deab6d6f Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Wed, 19 Jun 2024 13:59:39 -0700 Subject: [PATCH 09/19] made changes/fixes to tour flow --- app/assets/sass/uswds/_legacy-styles.scss | 4 +++ app/main/views/tour.py | 2 +- .../views/notifications/preview.html | 32 +++++++++++++------ 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/app/assets/sass/uswds/_legacy-styles.scss b/app/assets/sass/uswds/_legacy-styles.scss index 0f16e8861..bae05d457 100644 --- a/app/assets/sass/uswds/_legacy-styles.scss +++ b/app/assets/sass/uswds/_legacy-styles.scss @@ -66,6 +66,10 @@ h2.sms-message-header { margin-bottom: 0.5rem; } +.usa-prose >*+ h2.message-header { + margin-top: 1em; +} + h2.recipient-list { margin-bottom: 0.5rem; } diff --git a/app/main/views/tour.py b/app/main/views/tour.py index 3a93b7384..7e673c886 100644 --- a/app/main/views/tour.py +++ b/app/main/views/tour.py @@ -195,7 +195,7 @@ def check_tour_notification(service_id, template_id): ) return render_template( - "views/notifications/check.html", + "views/notifications/preview.html", template=template, back_link=back_link, help="2", diff --git a/app/templates/views/notifications/preview.html b/app/templates/views/notifications/preview.html index ce94a606f..df0951980 100644 --- a/app/templates/views/notifications/preview.html +++ b/app/templates/views/notifications/preview.html @@ -9,7 +9,11 @@ {% endblock %} {% block backLink %} - {{ usaBackLink({ "href": back_link_from_preview }) }} + {% if help %} + {{ usaBackLink({ "href": back_link }) }} + {% else %} + {{ usaBackLink({ "href": back_link_from_preview }) }} + {% endif %} {% endblock %} {% block maincolumn_content %} @@ -40,16 +44,26 @@ {% endcall %} {% else %} - {{ page_header('Preview') }} + {% if not help %} + {{ page_header('Preview') }} + {% endif %} + {% endif %} + {% if not help %} +
+

Scheduled: {{ scheduled_for |format_datetime_scheduled_notification if scheduled_for else 'Now'}}

+

Template: {{template.name}}

+

From: {{ template.sender }}

+

To: {{ recipient }}

+
{% endif %} -
-

Scheduled: {{ scheduled_for |format_datetime_scheduled_notification if scheduled_for else 'Now'}}

-

Template: {{template.name}}

-

From: {{ template.sender }}

-

To: {{ recipient }}

-
-

Message

+ {% if help %} +

Example text message

+ {% else %} +

Message

+ {% endif %} + +
{{ template|string }}
From 4b5c77f6c425899e9d5181b9798474abe80e8beb Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Thu, 20 Jun 2024 16:14:07 -0700 Subject: [PATCH 10/19] fixing flake8 error --- gunicorn_config.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gunicorn_config.py b/gunicorn_config.py index 4f928a467..6d9980926 100644 --- a/gunicorn_config.py +++ b/gunicorn_config.py @@ -1,7 +1,8 @@ +import multiprocessing import os import sys import traceback -import multiprocessing + import gunicorn # Let gunicorn figure out the right number of workers From 44baaf665a86369ef30615203022e3ae7ca81090 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Mon, 24 Jun 2024 15:33:48 -0700 Subject: [PATCH 11/19] fixed testing --- app/main/views/tour.py | 2 +- app/templates/views/notifications/preview.html | 17 ++++++++++------- tests/app/main/views/test_tour.py | 8 +++++--- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/app/main/views/tour.py b/app/main/views/tour.py index 7e673c886..0e4b5f344 100644 --- a/app/main/views/tour.py +++ b/app/main/views/tour.py @@ -198,7 +198,7 @@ def check_tour_notification(service_id, template_id): "views/notifications/preview.html", template=template, back_link=back_link, - help="2", + help="3", ) diff --git a/app/templates/views/notifications/preview.html b/app/templates/views/notifications/preview.html index df0951980..5c702a386 100644 --- a/app/templates/views/notifications/preview.html +++ b/app/templates/views/notifications/preview.html @@ -5,7 +5,13 @@ {% from "components/components/button/macro.njk" import usaButton %} {% block service_page_title %} - {{ "Error" if error else "Preview" }} + {% if error %} + {{ "Error" }} + {% elif help %} + {{ "Example text message" }} + {% else %} + {{ "Preview" }} + {% endif %} {% endblock %} {% block backLink %} @@ -44,10 +50,9 @@ {% endcall %}
{% else %} - {% if not help %} - {{ page_header('Preview') }} - {% endif %} + {{ page_header("Example text message" if help else "Preview") }} {% endif %} + {% if not help %}

Scheduled: {{ scheduled_for |format_datetime_scheduled_notification if scheduled_for else 'Now'}}

@@ -57,9 +62,7 @@
{% endif %} - {% if help %} -

Example text message

- {% else %} + {% if not help %}

Message

{% endif %} diff --git a/tests/app/main/views/test_tour.py b/tests/app/main/views/test_tour.py index 749a8097f..4b4aa31f1 100644 --- a/tests/app/main/views/test_tour.py +++ b/tests/app/main/views/test_tour.py @@ -530,10 +530,11 @@ def test_should_200_for_check_tour_notification( assert normalize_spaces(page.select(".banner-tour .heading-medium")[0].text) == ( "Try sending yourself this example" ) - selected_hint = page.select(".banner-tour .grid-row")[1] + selected_hint = page.select(".banner-tour .grid-row")[2] selected_hint_text = normalize_spaces(selected_hint.select(".usa-body")[0].text) + print(selected_hint_text) assert "greyed-out-step" not in selected_hint["class"] - assert selected_hint_text == "The template pulls in the data you provide" + assert selected_hint_text == "Notify delivers the message" assert normalize_spaces(page.select(".sms-message-recipient")[0].text) == ( "To: 202-867-5303" @@ -544,9 +545,10 @@ def test_should_200_for_check_tour_notification( # post to send_notification keeps help argument assert page.form.attrs["action"] == url_for( - "main.preview_notification", + "main.send_notification", service_id=SERVICE_ONE_ID, template_id=fake_uuid, + help=3, ) From e72af9671b7f7f0053ab070afcaa3175ddd549f7 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Mon, 24 Jun 2024 16:54:31 -0700 Subject: [PATCH 12/19] removed print --- tests/app/main/views/test_tour.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/app/main/views/test_tour.py b/tests/app/main/views/test_tour.py index 4b4aa31f1..2916d0887 100644 --- a/tests/app/main/views/test_tour.py +++ b/tests/app/main/views/test_tour.py @@ -532,7 +532,6 @@ def test_should_200_for_check_tour_notification( ) selected_hint = page.select(".banner-tour .grid-row")[2] selected_hint_text = normalize_spaces(selected_hint.select(".usa-body")[0].text) - print(selected_hint_text) assert "greyed-out-step" not in selected_hint["class"] assert selected_hint_text == "Notify delivers the message" From 6e5ca9464323155c193440318eb5dd577e5547cd Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Wed, 26 Jun 2024 16:52:23 -0700 Subject: [PATCH 13/19] commented out get_by_text_ preview --- .../test_send_message_from_existing_template.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/end_to_end/test_send_message_from_existing_template.py b/tests/end_to_end/test_send_message_from_existing_template.py index 56ced9b62..7b5a64ac4 100644 --- a/tests/end_to_end/test_send_message_from_existing_template.py +++ b/tests/end_to_end/test_send_message_from_existing_template.py @@ -256,12 +256,12 @@ def handle_existing_template_case(page): # Check to make sure that we've arrived at the next page. page.wait_for_load_state("domcontentloaded") - preview_button = page.get_by_text("Preview") - expect(preview_button).to_be_visible() - preview_button.click() + # preview_button = page.get_by_text("Preview") + # expect(preview_button).to_be_visible() + # preview_button.click() - # Check to make sure that we've arrived at the next page. - page.wait_for_load_state("domcontentloaded") + # # Check to make sure that we've arrived at the next page. + # page.wait_for_load_state("domcontentloaded") send_button = page.get_by_role("button", name="Send") expect(send_button).to_be_visible() From 83d3b1684fe1c50c427f3433b0889f40d729174c Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Wed, 26 Jun 2024 16:59:12 -0700 Subject: [PATCH 14/19] removed commented preview button --- tests/end_to_end/test_accounts_page.py | 2 ++ .../end_to_end/test_send_message_from_existing_template.py | 6 ------ 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/tests/end_to_end/test_accounts_page.py b/tests/end_to_end/test_accounts_page.py index b6fe8c5ac..591c3eb7c 100644 --- a/tests/end_to_end/test_accounts_page.py +++ b/tests/end_to_end/test_accounts_page.py @@ -21,6 +21,8 @@ def test_add_new_service_workflow(authenticated_page, end_to_end_context): # Check to make sure that we've arrived at the next page. page.wait_for_load_state("domcontentloaded") + print(page.url) + print(page.title()) # Check to make sure that we've arrived at the next page. # Check the page title exists and matches what we expect. diff --git a/tests/end_to_end/test_send_message_from_existing_template.py b/tests/end_to_end/test_send_message_from_existing_template.py index 7b5a64ac4..53b98be55 100644 --- a/tests/end_to_end/test_send_message_from_existing_template.py +++ b/tests/end_to_end/test_send_message_from_existing_template.py @@ -256,12 +256,6 @@ def handle_existing_template_case(page): # Check to make sure that we've arrived at the next page. page.wait_for_load_state("domcontentloaded") - # preview_button = page.get_by_text("Preview") - # expect(preview_button).to_be_visible() - # preview_button.click() - - # # Check to make sure that we've arrived at the next page. - # page.wait_for_load_state("domcontentloaded") send_button = page.get_by_role("button", name="Send") expect(send_button).to_be_visible() From abb011fcb680e7aa2341fe5950c0d68043195208 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Wed, 26 Jun 2024 17:00:00 -0700 Subject: [PATCH 15/19] removed print statements --- tests/end_to_end/test_accounts_page.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/end_to_end/test_accounts_page.py b/tests/end_to_end/test_accounts_page.py index 591c3eb7c..b6fe8c5ac 100644 --- a/tests/end_to_end/test_accounts_page.py +++ b/tests/end_to_end/test_accounts_page.py @@ -21,8 +21,6 @@ def test_add_new_service_workflow(authenticated_page, end_to_end_context): # Check to make sure that we've arrived at the next page. page.wait_for_load_state("domcontentloaded") - print(page.url) - print(page.title()) # Check to make sure that we've arrived at the next page. # Check the page title exists and matches what we expect. From 4fe3e54dd0f01ce499c9649e1bd24b30e8121ab5 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Wed, 26 Jun 2024 17:04:19 -0700 Subject: [PATCH 16/19] removed blank statements --- tests/end_to_end/test_send_message_from_existing_template.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/end_to_end/test_send_message_from_existing_template.py b/tests/end_to_end/test_send_message_from_existing_template.py index 53b98be55..27aa0a08e 100644 --- a/tests/end_to_end/test_send_message_from_existing_template.py +++ b/tests/end_to_end/test_send_message_from_existing_template.py @@ -256,7 +256,6 @@ def handle_existing_template_case(page): # Check to make sure that we've arrived at the next page. page.wait_for_load_state("domcontentloaded") - send_button = page.get_by_role("button", name="Send") expect(send_button).to_be_visible() # send_button.click() From feb879be53ad8851e69bd9538c189e34c92459af Mon Sep 17 00:00:00 2001 From: alexjanousekGSA Date: Tue, 2 Jul 2024 10:49:09 -0600 Subject: [PATCH 17/19] Removed package that seems to be unused that caused a security concern --- gulpfile.js | 1 - package-lock.json | 841 ++++++++++++++++------------------------------ package.json | 1 - poetry.lock | 5 + 4 files changed, 299 insertions(+), 549 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 0e2c1eaac..7c87a2b79 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -17,7 +17,6 @@ plugins.addSrc = require('gulp-add-src'); plugins.babel = require('gulp-babel'); plugins.cleanCSS = require('gulp-clean-css'); plugins.concat = require('gulp-concat'); -plugins.cssUrlAdjuster = require('gulp-css-url-adjuster'); plugins.jshint = require('gulp-jshint'); plugins.prettyerror = require('gulp-prettyerror'); plugins.rollup = require('gulp-better-rollup') diff --git a/package-lock.json b/package-lock.json index 378cb4eb8..4a3baa176 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,7 +35,6 @@ "gulp-better-rollup": "4.0.1", "gulp-clean-css": "4.3.0", "gulp-concat": "2.6.1", - "gulp-css-url-adjuster": "0.2.3", "gulp-include": "2.4.1", "gulp-jshint": "2.1.0", "gulp-prettyerror": "2.0.0", @@ -3165,15 +3164,13 @@ } }, "node_modules/ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, - "dependencies": { - "ansi-wrap": "^0.1.0" - }, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, "node_modules/ansi-cyan": { @@ -3208,6 +3205,7 @@ "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", "integrity": "sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==", "dev": true, + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -3348,15 +3346,6 @@ "node": ">=0.10.0" } }, - "node_modules/array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", @@ -3441,15 +3430,6 @@ "node": ">=8" } }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", @@ -4344,6 +4324,7 @@ "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -4359,6 +4340,7 @@ "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "process-nextick-args": "^2.0.0", @@ -4779,15 +4761,6 @@ "integrity": "sha512-AsElvov3LoNB7tf5k37H2jYSB+ZZPMT5sG2QjJCcdlV5chIv6htBUBUui2IKRjgtKAKtCBN7Zbwa+MtwLjSeNw==", "dev": true }, - "node_modules/dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha512-GODcnWq3YGoTnygPfi02ygEiRxqUxpJwuRHjdhJYuxpcZmDq4rjBiXYmbCCzStxo176ixfLT6i4NPwQooRySnw==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/dayjs": { "version": "1.11.10", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", @@ -5087,39 +5060,6 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "node_modules/duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==", - "dev": true, - "dependencies": { - "readable-stream": "~1.1.9" - } - }, - "node_modules/duplexer2/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "node_modules/duplexer2/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/duplexer2/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, "node_modules/duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -5598,21 +5538,6 @@ "node": ">= 0.4" } }, - "node_modules/fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "dependencies": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -6581,6 +6506,17 @@ "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true }, + "node_modules/gulp-add-src/node_modules/through2": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", + "integrity": "sha512-45Llu+EwHKtAZYTPPVn3XZHBgakWMN3rokhEv5hu596XP+cNgplMg+Gj+1nmAvj+L0K7+N49zBKx5rah5u0QIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~1.0.17", + "xtend": "~2.1.1" + } + }, "node_modules/gulp-babel": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/gulp-babel/-/gulp-babel-8.0.0.tgz", @@ -6599,6 +6535,16 @@ "@babel/core": "^7.0.0" } }, + "node_modules/gulp-babel/node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/gulp-babel/node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -6636,6 +6582,34 @@ "rollup": "^1.4.1" } }, + "node_modules/gulp-better-rollup/node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-better-rollup/node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/gulp-clean-css": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-4.3.0.tgz", @@ -6689,6 +6663,35 @@ "node": ">= 0.10" } }, + "node_modules/gulp-cli/node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/gulp-concat": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", @@ -6703,6 +6706,16 @@ "node": ">= 0.10" } }, + "node_modules/gulp-concat/node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/gulp-concat/node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -6713,6 +6726,24 @@ "xtend": "~4.0.1" } }, + "node_modules/gulp-concat/node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/gulp-concat/node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -6722,52 +6753,6 @@ "node": ">=0.4" } }, - "node_modules/gulp-css-url-adjuster": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/gulp-css-url-adjuster/-/gulp-css-url-adjuster-0.2.3.tgz", - "integrity": "sha512-HUIhwWxnlRwMeQjJyVbGQMFra2A4F/1WiSvW+Y2pi8QougeMb3TTNXdseS8rijPgAjT5YwGFzrW0vgcLLot+nw==", - "dev": true, - "dependencies": { - "gulp-util": "latest", - "rework": "~1.0.1", - "rework-plugin-url": "~1.0.1", - "through2": "~1.0.0" - } - }, - "node_modules/gulp-css-url-adjuster/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "node_modules/gulp-css-url-adjuster/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/gulp-css-url-adjuster/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, - "node_modules/gulp-css-url-adjuster/node_modules/through2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/through2/-/through2-1.0.0.tgz", - "integrity": "sha512-c0/VHHaVPY2007PCtr6AY7BIOx1yvLzO9rPlCuT2qFKYed0bQIJGixLA9xATHfRwXpd1IoorvwMinLJOAIzw9A==", - "dev": true, - "dependencies": { - "readable-stream": "~1.1.10", - "xtend": "~2.1.1" - } - }, "node_modules/gulp-include": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/gulp-include/-/gulp-include-2.4.1.tgz", @@ -6814,6 +6799,16 @@ "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==", "dev": true }, + "node_modules/gulp-include/node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/gulp-include/node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -6845,6 +6840,24 @@ "through": "~2.3.4" } }, + "node_modules/gulp-include/node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/gulp-jshint": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/gulp-jshint/-/gulp-jshint-2.1.0.tgz", @@ -7044,6 +7057,22 @@ "node": ">=0.10.0" } }, + "node_modules/gulp-plumber/node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/gulp-plumber/node_modules/kind-of": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", @@ -7127,6 +7156,22 @@ "postcss": "^8.0.0" } }, + "node_modules/gulp-postcss/node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/gulp-prettyerror": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/gulp-prettyerror/-/gulp-prettyerror-2.0.0.tgz", @@ -7138,15 +7183,6 @@ "gulplog": "^1.0.0" } }, - "node_modules/gulp-prettyerror/node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/gulp-rename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-2.0.0.tgz", @@ -7189,15 +7225,6 @@ "node": ">=12" } }, - "node_modules/gulp-sass/node_modules/replace-ext": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", - "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/gulp-sourcemaps": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-3.0.0.tgz", @@ -7254,6 +7281,50 @@ "node": ">=10.0" } }, + "node_modules/gulp-svgstore/node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-svgstore/node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-svgstore/node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/gulp-uglify": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-3.0.2.tgz", @@ -7328,157 +7399,6 @@ "node": ">=0.4" } }, - "node_modules/gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha512-q5oWPc12lwSFS9h/4VIjG+1NuNDlJ48ywV2JKItY4Ycc/n1fXJeYPVQsfu5ZrhQi7FGSDBalwUCLar/GyHXKGw==", - "deprecated": "gulp-util is deprecated - replace it, following the guidelines at https://medium.com/gulpjs/gulp-util-ca3b1f9f9ac5", - "dev": true, - "dependencies": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/gulp-util/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gulp-util/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gulp-util/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gulp-util/node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/gulp-util/node_modules/clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA==", - "dev": true - }, - "node_modules/gulp-util/node_modules/object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gulp-util/node_modules/replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha512-AFBWBy9EVRTa/LhEcG8QDP3FvpwZqmvN2QFDuJswFeaVhWnZMp8q3E6Zd90SR04PlIwfGdyVjNyLPyen/ek5CQ==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gulp-util/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gulp-util/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/gulp-util/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/gulp-util/node_modules/vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha512-P5zdf3WB9uzr7IFoVQ2wZTmUwHL8cMZWJGzLBNCHNZ3NB6HTMsYABtt7z8tAGIINLXyAob9B9a1yzVGMFOYKEA==", - "dev": true, - "dependencies": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - }, - "engines": { - "node": ">= 0.9" - } - }, - "node_modules/gulp-util/node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, "node_modules/gulplog": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", @@ -10478,60 +10398,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "node_modules/lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", - "dev": true - }, - "node_modules/lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha512-mTzAr1aNAv/i7W43vOR/uD/aJ4ngbtsRaCubp2BfZhlGU/eORUjg/7F6X0orNMdv33JOrdgGybtvMN/po3EWrA==", - "dev": true - }, - "node_modules/lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha512-H94wl5P13uEqlCg7OcNNhMQ8KvWSIyqXzOPusRgHC9DK3o54P6P3xtbXlVbRABG4q5gSmp7EDdJ0MSuW9HX6Mg==", - "dev": true - }, - "node_modules/lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", - "dev": true - }, - "node_modules/lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==", - "dev": true - }, - "node_modules/lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha512-Sjlavm5y+FUVIF3vF3B75GyXrzsfYV8Dlv3L4mEpuB9leg8N6yf/7rU06iLPx9fY0Mv3khVp9p7Dx0mGV6V5OQ==", - "dev": true - }, - "node_modules/lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha512-OrPwdDc65iJiBeUe5n/LIjd7Viy99bKwDdk7Z5ljfZg0uFRFlfQaCy9tZ4YMAag9WAZmlVpe1iZrkIMMSMHD3w==", - "dev": true - }, - "node_modules/lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", - "dev": true - }, - "node_modules/lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ==", - "dev": true - }, "node_modules/lodash.assign": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", @@ -10556,89 +10422,24 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, - "node_modules/lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha512-n1PZMXgaaDWZDSvuNZ/8XOcYO2hOKDqZel5adtR30VKQAtoWs/5AOeFA0vPV8moiPzlqe7F4cP2tzpFewQyelQ==", - "dev": true, - "dependencies": { - "lodash._root": "^3.0.0" - } - }, "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "dev": true }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", - "dev": true - }, - "node_modules/lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", - "dev": true - }, "node_modules/lodash.isobject": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==", "dev": true }, - "node_modules/lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", - "dev": true, - "dependencies": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==", - "dev": true - }, - "node_modules/lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha512-0B4Y53I0OgHUJkt+7RmlDFWKjVAI/YUpWNiL9GQz5ORDr4ttgfQGo+phBWKFLJbBdtOwgMuUkdOHOnPg45jKmQ==", - "dev": true, - "dependencies": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - } - }, - "node_modules/lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha512-TcrlEr31tDYnWkHFWDCV3dHYroKEXpJZ2YJYvJdhN+y4AkWMDZ5I4I8XDtUKqSAyG81N7w+I1mFEJtcED+tGqQ==", - "dev": true, - "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -11234,15 +11035,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha512-7ZxrUybYv9NonoXgwoOqtStIu18D1c3eFZj27hqgf5kBrBF8Q+tE8V0MW8dKM5QLkQPh1JhhbKgHLY9kifov4Q==", - "dev": true, - "dependencies": { - "duplexer2": "0.0.2" - } - }, "node_modules/mute-stdout": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", @@ -11766,6 +11558,7 @@ "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -11975,6 +11768,19 @@ "node": ">= 0.10" } }, + "node_modules/plugin-error/node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/plugin-error/node_modules/extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", @@ -12608,12 +12414,13 @@ } }, "node_modules/replace-ext": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", - "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">= 10" } }, "node_modules/replace-homedir": { @@ -12774,72 +12581,6 @@ "node": ">=0.10.0" } }, - "node_modules/rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha512-eEjL8FdkdsxApd0yWVZgBGzfCQiT8yqSc2H1p4jpZpQdtz7ohETiDMoje5PlM8I9WgkqkreVxFUKYOiJdVWDXw==", - "dev": true, - "dependencies": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" - } - }, - "node_modules/rework-plugin-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/rework-plugin-function/-/rework-plugin-function-1.0.2.tgz", - "integrity": "sha512-kyIphbC2Kuc3iFz1CSAQ5zmt4o/IHquhO+uG0kK0FQTjs4Z5eAxrqmrv3rZMR1KXa77SesaW9KwKyfbYoLMEqw==", - "dev": true, - "dependencies": { - "rework-visit": "^1.0.0" - } - }, - "node_modules/rework-plugin-url": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework-plugin-url/-/rework-plugin-url-1.0.1.tgz", - "integrity": "sha512-ancJA2AG8gI9mCFbfldhKIYoq5pRq/gnNMcjHmLMagnd3f0BVBmXsryW+G6rdkl0cdc+y7PvRLugL0zauoMRKQ==", - "dev": true, - "dependencies": { - "rework-plugin-function": "^1.0.0" - } - }, - "node_modules/rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha512-W6V2fix7nCLUYX1v6eGPrBOZlc03/faqzP4sUxMAJMBMOPYhfV/RyLegTufn5gJKaOITyi+gvf0LXDZ9NzkHnQ==", - "dev": true - }, - "node_modules/rework/node_modules/convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha512-+4nRk0k3oEpwUB7/CalD7xE2z4VmtEnnq0GO2IPTkrooTrAhEsWvuLF5iWP1dXrwluki/azwXV1ve7gtYuPldg==", - "dev": true - }, - "node_modules/rework/node_modules/css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - } - }, - "node_modules/rework/node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -14095,16 +13836,6 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, - "node_modules/through2": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", - "integrity": "sha512-45Llu+EwHKtAZYTPPVn3XZHBgakWMN3rokhEv5hu596XP+cNgplMg+Gj+1nmAvj+L0K7+N49zBKx5rah5u0QIQ==", - "dev": true, - "dependencies": { - "readable-stream": "~1.0.17", - "xtend": "~2.1.1" - } - }, "node_modules/through2-filter": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", @@ -14134,35 +13865,12 @@ "node": ">=0.4" } }, - "node_modules/through2/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, "node_modules/time-stamp": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", "integrity": "sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -14723,23 +14431,6 @@ "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" }, - "node_modules/vinyl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", - "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", - "dev": true, - "dependencies": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/vinyl-fs": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", @@ -14768,6 +14459,16 @@ "node": ">= 0.10" } }, + "node_modules/vinyl-fs/node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/vinyl-fs/node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -14778,6 +14479,24 @@ "xtend": "~4.0.1" } }, + "node_modules/vinyl-fs/node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/vinyl-fs/node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -14817,6 +14536,34 @@ "node": ">=0.10.0" } }, + "node_modules/vinyl-sourcemap/node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap/node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/vinyl-sourcemaps-apply": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", diff --git a/package.json b/package.json index 355a79e8f..a078ab896 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,6 @@ "gulp-better-rollup": "4.0.1", "gulp-clean-css": "4.3.0", "gulp-concat": "2.6.1", - "gulp-css-url-adjuster": "0.2.3", "gulp-include": "2.4.1", "gulp-jshint": "2.1.0", "gulp-prettyerror": "2.0.0", diff --git a/poetry.lock b/poetry.lock index 8654035fc..e03ebada0 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1344,9 +1344,13 @@ files = [ {file = "lxml-5.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196"}, {file = "lxml-5.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184"}, {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f"}, {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61"}, {file = "lxml-5.2.2-cp37-cp37m-win32.whl", hash = "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f"}, {file = "lxml-5.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40"}, @@ -2527,6 +2531,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, From cc6f60353f5f7ef93ba31cf4cef9a32df2476d53 Mon Sep 17 00:00:00 2001 From: Carlo Costino Date: Tue, 2 Jul 2024 17:36:12 -0400 Subject: [PATCH 18/19] Update Python dependencies - 7/2/2024 This changeset updates several Python dependencies that Dependabot had flagged for updates. Signed-off-by: Carlo Costino --- poetry.lock | 34 ++++++++++++++-------------------- pyproject.toml | 6 +++--- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/poetry.lock b/poetry.lock index c4d626881..c5c45a2a1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -182,17 +182,17 @@ files = [ [[package]] name = "boto3" -version = "1.34.135" +version = "1.34.138" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" files = [ - {file = "boto3-1.34.135-py3-none-any.whl", hash = "sha256:6f5d7a20afbe45e3f7c6b5e96071752d36c3942535b1f7924964f1fdf25376a7"}, - {file = "boto3-1.34.135.tar.gz", hash = "sha256:344f635233c85dbb509b87638232ff9132739f90bb5e6bf01fa0e0a521a9107e"}, + {file = "boto3-1.34.138-py3-none-any.whl", hash = "sha256:81518aa95fad71279411fb5c94da4b4a554a5d53fc876faca62b7b5c8737f1cb"}, + {file = "boto3-1.34.138.tar.gz", hash = "sha256:f79c15e33eb7706f197d98d828b193cf0891966682ad3ec5e900f6f9e7362e35"}, ] [package.dependencies] -botocore = ">=1.34.135,<1.35.0" +botocore = ">=1.34.138,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -201,13 +201,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.135" +version = "1.34.138" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" files = [ - {file = "botocore-1.34.135-py3-none-any.whl", hash = "sha256:3aa9e85e7c479babefb5a590e844435449df418085f3c74d604277bc52dc3109"}, - {file = "botocore-1.34.135.tar.gz", hash = "sha256:2e72f37072f75cb1391fca9d7a4c32cecb52a3557d62431d0f59d5311dc7d0cf"}, + {file = "botocore-1.34.138-py3-none-any.whl", hash = "sha256:84e96a954c39a6f09cae4ea95b2ae582b5ae01b5040c92507b60509c9be5377a"}, + {file = "botocore-1.34.138.tar.gz", hash = "sha256:f558bbea96c4a4abbaeeedc477dabb00902311ba1ca6327974a6819b9f384920"}, ] [package.dependencies] @@ -1344,13 +1344,9 @@ files = [ {file = "lxml-5.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196"}, {file = "lxml-5.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8"}, - {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716"}, - {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905"}, - {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184"}, {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6"}, - {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f"}, {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61"}, {file = "lxml-5.2.2-cp37-cp37m-win32.whl", hash = "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f"}, {file = "lxml-5.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40"}, @@ -1581,13 +1577,13 @@ files = [ [[package]] name = "moto" -version = "5.0.9" +version = "5.0.10" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "moto-5.0.9-py2.py3-none-any.whl", hash = "sha256:21a13e02f83d6a18cfcd99949c96abb2e889f4bd51c4c6a3ecc8b78765cb854e"}, - {file = "moto-5.0.9.tar.gz", hash = "sha256:eb71f1cba01c70fff1f16086acb24d6d9aeb32830d646d8989f98a29aeae24ba"}, + {file = "moto-5.0.10-py2.py3-none-any.whl", hash = "sha256:9ffae2f64cc8fe95b9a12d63ae7268a7d6bea9993b922905b5abd8197d852cd0"}, + {file = "moto-5.0.10.tar.gz", hash = "sha256:eff37363221c93ea44f95721ae0ddb56f977fe70437a041b6cc641ee90266279"}, ] [package.dependencies] @@ -1685,7 +1681,6 @@ files = [ {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273"}, {file = "msgpack-1.0.8-cp39-cp39-win32.whl", hash = "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d"}, {file = "msgpack-1.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011"}, - {file = "msgpack-1.0.8-py3-none-any.whl", hash = "sha256:24f727df1e20b9876fa6e95f840a2a2651e34c0ad147676356f4bf5fbb0206ca"}, {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"}, ] @@ -1892,13 +1887,13 @@ files = [ [[package]] name = "phonenumbers" -version = "8.13.39" +version = "8.13.40" description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers." optional = false python-versions = "*" files = [ - {file = "phonenumbers-8.13.39-py2.py3-none-any.whl", hash = "sha256:3ad2d086fa71e7eef409001b9195ac54bebb0c6e3e752209b558ca192c9229a0"}, - {file = "phonenumbers-8.13.39.tar.gz", hash = "sha256:db7ca4970d206b2056231105300753b1a5b229f43416f8c2b3010e63fbb68d77"}, + {file = "phonenumbers-8.13.40-py2.py3-none-any.whl", hash = "sha256:9582752c20a1da5ec4449f7f97542bf8a793c8e2fec0ab57f767177bb8fc0b1d"}, + {file = "phonenumbers-8.13.40.tar.gz", hash = "sha256:f137c2848b8e83dd064b71881b65680584417efa202177fd330e2f7ff6c68113"}, ] [[package]] @@ -2532,7 +2527,6 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -3117,4 +3111,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.12.2" -content-hash = "cc90483c3fdf6d2900f9ec64345b6cb8c2f0f83040a57a0051d500e23f997963" +content-hash = "8ad87349d57d4ff720e720067412e2656326c089ae21d51f6d96215f9546602e" diff --git a/pyproject.toml b/pyproject.toml index 94d6eb97e..70991fdf9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,8 +39,8 @@ wtforms = "~=3.1" markdown = "^3.5.2" async-timeout = "^4.0.3" bleach = "^6.1.0" -boto3 = "^1.34.135" -botocore = "^1.34.135" +boto3 = "^1.34.138" +botocore = "^1.34.138" cachetools = "^5.3.3" cffi = "^1.16.0" cryptography = "^42.0.8" @@ -50,7 +50,7 @@ jmespath = "^1.0.1" mistune = "0.8.4" numpy = "^1.26.4" ordered-set = "^4.1.0" -phonenumbers = "^8.13.39" +phonenumbers = "^8.13.40" pycparser = "^2.22" python-json-logger = "^2.0.7" redis = "^5.0.7" From bd3e8e15c80609c524e53dde1b9b8a0ec5911121 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Tue, 2 Jul 2024 15:55:10 -0700 Subject: [PATCH 19/19] revised e2e --- .../test_send_message_from_existing_template.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/end_to_end/test_send_message_from_existing_template.py b/tests/end_to_end/test_send_message_from_existing_template.py index 27aa0a08e..ef083ea14 100644 --- a/tests/end_to_end/test_send_message_from_existing_template.py +++ b/tests/end_to_end/test_send_message_from_existing_template.py @@ -256,6 +256,15 @@ def handle_existing_template_case(page): # Check to make sure that we've arrived at the next page. page.wait_for_load_state("domcontentloaded") + if "/tour" not in page.url: + # Only execute this part if the current page is not the /tour page + preview_button = page.get_by_text("Preview") + expect(preview_button).to_be_visible() + preview_button.click() + + # Check to make sure that we've arrived at the next page. + page.wait_for_load_state("domcontentloaded") + send_button = page.get_by_role("button", name="Send") expect(send_button).to_be_visible() # send_button.click()