Add glean.js analytics to home page (#11402)

This commit is contained in:
Alex Gibson 2022-05-16 10:14:14 +01:00 коммит произвёл GitHub
Родитель 518e0d7a0e
Коммит b3b8a2bdc5
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
32 изменённых файлов: 1789 добавлений и 177 удалений

Просмотреть файл

@ -25,7 +25,7 @@ jobs:
test_js:
docker:
- image: "circleci/node:16-browsers"
- image: "circleci/python:3.9-node-browsers"
auth:
username: $DOCKERHUB_USERNAME
password: $DOCKERHUB_PASSWORD

1
.gitignore поставляемый
Просмотреть файл

@ -57,3 +57,4 @@ static_final
static
assets
npm-debug.log
media/js/libs/glean

Просмотреть файл

@ -1,25 +1,3 @@
########
# assets builder and dev server
#
FROM node:16-slim AS assets
ENV PATH=/app/node_modules/.bin:$PATH
WORKDIR /app
# copy dependency definitions
COPY package.json package-lock.json ./
# install dependencies
RUN npm ci
# copy supporting files and media
COPY .eslintrc.js .eslintignore .stylelintrc .prettierrc.json .prettierignore webpack.config.js webpack.static.config.js ./
COPY ./media ./media
COPY ./tests/unit ./tests/unit
RUN npm run build
########
# Python dependencies builder
#
@ -41,6 +19,36 @@ COPY requirements/prod.txt ./requirements/
RUN pip install --require-hashes --no-cache-dir -r requirements/prod.txt
########
# assets builder and dev server
#
FROM node:16-slim AS assets
ENV PATH=/app/node_modules/.bin:$PATH
WORKDIR /app
# copy dependency definitions
COPY package.json package-lock.json ./
# install dependencies
RUN npm ci
# copy supporting files and media
COPY .eslintrc.js .eslintignore .stylelintrc .prettierrc.json .prettierignore webpack.config.js webpack.static.config.js ./
COPY ./media ./media
COPY ./tests/unit ./tests/unit
COPY ./glean ./glean
# Required for required glean_parser dependencies
COPY docker/bin/apt-install /usr/local/bin/
RUN apt-install python3 python3-venv
RUN python3 -m venv /.venv
COPY --from=python-builder /venv /.venv
ENV PATH="/.venv/bin:$PATH"
RUN npm run build
########
# django app container
#

Просмотреть файл

@ -144,7 +144,7 @@ test_infra/fixtures/tls.json:
build-ci: .docker-build-pull
${DC_CI} build --pull release
# tag intermediate images using cache
${DC_CI} build app assets builder app-base
${DC_CI} build app builder assets app-base
touch .docker-build-ci
test-ci: .docker-build-ci

Просмотреть файл

@ -143,6 +143,8 @@
{% endblock %}
<!--[if !IE]><!-->
{% block glean %}{% endblock %}
{% block js %}{% endblock %}
{% if self.structured_data()|trim|length %}

Просмотреть файл

@ -33,3 +33,9 @@
{% block structured_data %}
{% include 'includes/structured-data/organizations/mozilla-corporation-organisation.json' %}
{% endblock %}
{% block glean %}
{% if switch('glean-analytics') %}
{{ js_bundle('glean') }}
{% endif %}
{% endblock %}

Просмотреть файл

@ -159,4 +159,109 @@ click with the following structure:
| Event Action: {{data-cta-type}} click
| Event Label: {{data-cta-name}}
Glean
-----
Currently in an evaluation phase, bedrock is now capable of running a parallel
first-party analytics implementation alongside :abbr:`GTM (Google Tag Manager)`,
using Mozilla's own `Glean`_ telemetry :abbr:`SDK (Software Development Kit)`.
See the `Glean Book`_ for more developer reference documentation.
Glean is currently behind a feature switch called ``SWITCH_GLEAN_ANALYTICS``.
When the switch is enabled pages will load the Glean JavaScript bundle,
which will do things like register page views and capture link clicks. Our
implementation leverages the same HTML data attributes that we use for
:abbr:`GTM (Google Tag Manager)` when tracking link clicks, so any attributes
you add for :abbr:`GTM (Google Tag Manager)` should also be captured by Glean
automatically.
Debugging Pings
~~~~~~~~~~~~~~~
For all non-production environments, bedrock will automatically set a debug
view tag for all pings. This means that when running on localhost, on a demo,
or on a staging environment, ping data will not be sent to the production data
pipeline. Instead, it will be sent to the `Glean debug dashboard`_ which can
be used to test that pings are working correctly. All bedrock debug pings will
register in the debug dashboard with the tag name ``moz-bedrock``.
Logging Pings in the Console
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
When running bedrock locally, you can also set the following environment variable
in your ``.env``` file to automatically log pings in the browser's web console.
This can be especially useful when making updates to analytics code.
.. code-block::
GLEAN_LOG_PINGS=True
Defining Metrics and Pings
~~~~~~~~~~~~~~~~~~~~~~~~~~
All of the data we send to the Glean pipeline is defined in
:abbr:`YAML (Yet Another Markup Language)` schema files in the ``./glean/``
project root directory. The ``metrics.yaml`` file defines all the different
metrics types we record, and the ``pings.yaml`` file defines the name of each
ping event we use to send collections of individual metrics. These are all
automatically documented in ``./glean/docs/``.
.. Note::
Before running any Glean commands locally, always make sure you have first
activated your virtual environment by running ``pyenv activate bedrock``.
When bedrock starts, we automatically run ``npm run glean`` which parses these
schema files and then generates some JavaScript library code in
``./media/js/libs/glean/``. This library code is not committed to the repository
on purpose, in order to avoid people altering it and becoming out of sync with
the schema. This library code is then imported into our Glean analytics code in
``./media/js/glean/``, which is where we initiate page views and capture click
events.
Running ``npm run glean`` can also be performed independently of starting bedrock.
It will also do things such as lint schema files and automatically generate the
schema docs.
.. Important::
All metrics and pings we record using Glean must first undergo a `data review`_
before being made active in production. Therefore anytime we make new additions
to these files, those changes should also undergo review.
Using Glean pings in individual page bundles
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
All of our analytics code for Glean lives in a single bundle in the base template,
which is intended to be shared across all web pages. There may be times where we
want to send a ping from some JavaScript that exists only in a certain page
specific bundle however. For instances like this, there is a global ``pageEventPing``
helper available, which you can call from inside any custom event handler you write.
For user initiated events, such as clicks:
.. code-block:: javascript
if (typeof window.Mozilla.Glean !== 'undefined') {
window.Mozilla.Glean.pageEventPing({
label: 'Newsletters: mozilla-and-you',
type: 'Newsletter Signup Success'
});
}
For non-interaction events that are not user initiated:
.. code-block:: javascript
if (typeof window.Mozilla.Glean !== 'undefined') {
window.Mozilla.Glean.pageEventPing({
label: 'Auto Play',
type: 'Video'
nonInteraction: true
});
}
.. _Glean: https://docs.telemetry.mozilla.org/concepts/glean/glean.html
.. _Glean Book: https://mozilla.github.io/glean/book/index.html
.. _Glean debug dashboard: https://debug-ping-preview.firebaseapp.com/
.. _data revreview: https://wiki.mozilla.org/Data_Collection

Просмотреть файл

@ -23,29 +23,34 @@ Installation
------------
First follow the :ref:`installation instructions for bedrock<install>`, which
will install the specific versions of Jasmine/Karma which are needed to run the
unit tests, and guide you through installing pip and setting up a virtual
environment for the functional tests. The additional requirements can then be
installed by using the following commands:
will install the dependencies required to run the various front-end test suites.
.. code-block:: bash
$ source venv/bin/activate
.. code-block:: bash
$ pip install -r requirements/dev.txt
Running Jasmine tests using Karma
---------------------------------
To perform a single run of the Jasmine test suite using Firefox, type the
following command:
To perform a single run of the Jasmine test suite using Firefox and Chrome,
first make sure you have both browsers installed locally, and then activate
your bedrock virtual env.
.. code-block:: bash
$ pyenv activate bedrock
You can then run the tests with the following command:
.. code-block:: bash
$ npm run test
This will run all our front-end linters and formatting checks before running
the Jasmine test suite. If you only want to run the tests themselves, you can
run:
.. code-block:: bash
$ npm run karma
See the `Jasmine`_ documentation for tips on how to write JS behavioral or unit
tests. We also use `Sinon`_ for creating test spies, stubs and mocks.

105
glean/docs/metrics.md Normal file
Просмотреть файл

@ -0,0 +1,105 @@
<!-- AUTOGENERATED BY glean_parser. DO NOT EDIT. -->
# Metrics
This document enumerates the metrics collected by this project using the [Glean SDK](https://mozilla.github.io/glean/book/index.html).
This project may depend on other projects which also collect metrics.
This means you might have to go searching through the dependency tree to get a full picture of everything collected by this project.
# Pings
- [interaction](#interaction)
- [non-interaction](#non-interaction)
- [page-view](#page-view)
## interaction
A ping which is sent when a page element is
interacted with.
This ping includes the [client id](https://mozilla.github.io/glean/book/user/pings/index.html#the-client_info-section).
**Data reviews for this ping:**
- <https://bugzilla.mozilla.org/show_bug.cgi?id=1767442>
**Bugs related to this ping:**
- <https://github.com/mozilla/bedrock/issues/10746>
All Glean pings contain built-in metrics in the [`ping_info`](https://mozilla.github.io/glean/book/user/pings/index.html#the-ping_info-section) and [`client_info`](https://mozilla.github.io/glean/book/user/pings/index.html#the-client_info-section) sections.
In addition to those built-in metrics, the following metrics are added to the ping:
| Name | Type | Description | Data reviews | Extras | Expiration | [Data Sensitivity](https://wiki.mozilla.org/Firefox/Data_Collection) |
| --- | --- | --- | --- | --- | --- | --- |
| element.clicked |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |An event containing metrics related to which element in the page was clicked. |[Bug 1767442](https://bugzilla.mozilla.org/show_bug.cgi?id=1767442)|<ul><li>label: Description of the page element that was clicked. Examples: 'Download Firefox', 'Get Mozilla VPN'. </li><li>position: The position of the element in the page. Examples: 'Primary', 'Secondary', 'Navigation', 'Footer'. </li><li>type: The type of element that was clicked. Examples: 'Button', 'Link'. </li></ul>|never |3 |
| page.locale |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |The locale of the page that was viewed. |[Bug 1767442](https://bugzilla.mozilla.org/show_bug.cgi?id=1767442)||never |3 |
| page.page_event |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |An event containing metrics related to a page level completion or state that want to measure. This can be sent in either an interaction and non-interaction ping, depending upon the use-case. Examples: form completion, scroll events, banner impressions. |[Bug 1767442](https://bugzilla.mozilla.org/show_bug.cgi?id=1767442)|<ul><li>label: The label used to describe the event. Example: 'Newsletters: mozilla-and-you' </li><li>type: The type of event. Example: 'Newsletter Signup Success' </li></ul>|never |3 |
| page.path |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |The URL path of the page that was viewed, excluding locale. |[Bug 1767442](https://bugzilla.mozilla.org/show_bug.cgi?id=1767442)||never |3 |
| page.query_params |[labeled_string](https://mozilla.github.io/glean/book/user/metrics/labeled_strings.html) |Query parameters associated with the URL of the page that was viewed. |[Bug 1767442](https://bugzilla.mozilla.org/show_bug.cgi?id=1767442)|<ul><li>utm_source</li><li>utm_campaign</li><li>utm_medium</li><li>utm_content</li><li>entrypoint_experiment</li><li>entrypoing_variation</li><li>experiment</li><li>variation</li><li>v</li><li>xv</li></ul>|never | |
| page.referrer |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |The referring URL that linked to the page that was viewed. |[Bug 1767442](https://bugzilla.mozilla.org/show_bug.cgi?id=1767442)||never |3 |
| page.viewed |[datetime](https://mozilla.github.io/glean/book/user/metrics/datetime.html) |The time a page was viewed. |[Bug 1767442](https://bugzilla.mozilla.org/show_bug.cgi?id=1767442)||never |3 |
## non-interaction
A ping which is sent when a non-user initiated event
occurs. Examples: a specific banner impression is
displayed, a video auto-plays on scroll.
This ping includes the [client id](https://mozilla.github.io/glean/book/user/pings/index.html#the-client_info-section).
**Data reviews for this ping:**
- <https://bugzilla.mozilla.org/show_bug.cgi?id=1767442>
**Bugs related to this ping:**
- <https://github.com/mozilla/bedrock/issues/10746>
All Glean pings contain built-in metrics in the [`ping_info`](https://mozilla.github.io/glean/book/user/pings/index.html#the-ping_info-section) and [`client_info`](https://mozilla.github.io/glean/book/user/pings/index.html#the-client_info-section) sections.
In addition to those built-in metrics, the following metrics are added to the ping:
| Name | Type | Description | Data reviews | Extras | Expiration | [Data Sensitivity](https://wiki.mozilla.org/Firefox/Data_Collection) |
| --- | --- | --- | --- | --- | --- | --- |
| page.locale |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |The locale of the page that was viewed. |[Bug 1767442](https://bugzilla.mozilla.org/show_bug.cgi?id=1767442)||never |3 |
| page.page_event |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |An event containing metrics related to a page level completion or state that want to measure. This can be sent in either an interaction and non-interaction ping, depending upon the use-case. Examples: form completion, scroll events, banner impressions. |[Bug 1767442](https://bugzilla.mozilla.org/show_bug.cgi?id=1767442)|<ul><li>label: The label used to describe the event. Example: 'Newsletters: mozilla-and-you' </li><li>type: The type of event. Example: 'Newsletter Signup Success' </li></ul>|never |3 |
| page.path |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |The URL path of the page that was viewed, excluding locale. |[Bug 1767442](https://bugzilla.mozilla.org/show_bug.cgi?id=1767442)||never |3 |
| page.query_params |[labeled_string](https://mozilla.github.io/glean/book/user/metrics/labeled_strings.html) |Query parameters associated with the URL of the page that was viewed. |[Bug 1767442](https://bugzilla.mozilla.org/show_bug.cgi?id=1767442)|<ul><li>utm_source</li><li>utm_campaign</li><li>utm_medium</li><li>utm_content</li><li>entrypoint_experiment</li><li>entrypoing_variation</li><li>experiment</li><li>variation</li><li>v</li><li>xv</li></ul>|never | |
| page.referrer |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |The referring URL that linked to the page that was viewed. |[Bug 1767442](https://bugzilla.mozilla.org/show_bug.cgi?id=1767442)||never |3 |
| page.viewed |[datetime](https://mozilla.github.io/glean/book/user/metrics/datetime.html) |The time a page was viewed. |[Bug 1767442](https://bugzilla.mozilla.org/show_bug.cgi?id=1767442)||never |3 |
## page-view
A ping which is sent everytime a page is viewed.
This ping includes the [client id](https://mozilla.github.io/glean/book/user/pings/index.html#the-client_info-section).
**Data reviews for this ping:**
- <https://bugzilla.mozilla.org/show_bug.cgi?id=1767442>
**Bugs related to this ping:**
- <https://github.com/mozilla/bedrock/issues/10746>
All Glean pings contain built-in metrics in the [`ping_info`](https://mozilla.github.io/glean/book/user/pings/index.html#the-ping_info-section) and [`client_info`](https://mozilla.github.io/glean/book/user/pings/index.html#the-client_info-section) sections.
In addition to those built-in metrics, the following metrics are added to the ping:
| Name | Type | Description | Data reviews | Extras | Expiration | [Data Sensitivity](https://wiki.mozilla.org/Firefox/Data_Collection) |
| --- | --- | --- | --- | --- | --- | --- |
| page.locale |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |The locale of the page that was viewed. |[Bug 1767442](https://bugzilla.mozilla.org/show_bug.cgi?id=1767442)||never |3 |
| page.path |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |The URL path of the page that was viewed, excluding locale. |[Bug 1767442](https://bugzilla.mozilla.org/show_bug.cgi?id=1767442)||never |3 |
| page.query_params |[labeled_string](https://mozilla.github.io/glean/book/user/metrics/labeled_strings.html) |Query parameters associated with the URL of the page that was viewed. |[Bug 1767442](https://bugzilla.mozilla.org/show_bug.cgi?id=1767442)|<ul><li>utm_source</li><li>utm_campaign</li><li>utm_medium</li><li>utm_content</li><li>entrypoint_experiment</li><li>entrypoing_variation</li><li>experiment</li><li>variation</li><li>v</li><li>xv</li></ul>|never | |
| page.referrer |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |The referring URL that linked to the page that was viewed. |[Bug 1767442](https://bugzilla.mozilla.org/show_bug.cgi?id=1767442)||never |3 |
| page.viewed |[datetime](https://mozilla.github.io/glean/book/user/metrics/datetime.html) |The time a page was viewed. |[Bug 1767442](https://bugzilla.mozilla.org/show_bug.cgi?id=1767442)||never |3 |
Data categories are [defined here](https://wiki.mozilla.org/Firefox/Data_Collection).
<!-- AUTOGENERATED BY glean_parser. DO NOT EDIT. -->

173
glean/metrics.yaml Normal file
Просмотреть файл

@ -0,0 +1,173 @@
---
$schema: moz://mozilla.org/schemas/glean/metrics/2-0-0
page:
viewed:
type: datetime
lifetime: application
send_in_pings:
- page-view
- interaction
- non-interaction
description: |
The time a page was viewed.
data_sensitivity:
- web_activity
bugs:
- https://github.com/mozilla/bedrock/issues/10746
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1767442
notification_emails:
- marketing-websites-team@mozilla.com
expires: never
path:
type: string
lifetime: application
send_in_pings:
- page-view
- interaction
- non-interaction
description: |
The URL path of the page that was viewed, excluding locale.
data_sensitivity:
- web_activity
bugs:
- https://github.com/mozilla/bedrock/issues/10746
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1767442
notification_emails:
- marketing-websites-team@mozilla.com
expires: never
locale:
type: string
lifetime: application
send_in_pings:
- page-view
- interaction
- non-interaction
description: |
The locale of the page that was viewed.
data_sensitivity:
- web_activity
bugs:
- https://github.com/mozilla/bedrock/issues/10746
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1767442
notification_emails:
- marketing-websites-team@mozilla.com
expires: never
query_params:
type: labeled_string
lifetime: application
send_in_pings:
- page-view
- interaction
- non-interaction
description: |
Query parameters associated with the URL of
the page that was viewed.
bugs:
- https://github.com/mozilla/bedrock/issues/10746
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1767442
notification_emails:
- marketing-websites-team@mozilla.com
expires: never
labels:
- utm_source
- utm_campaign
- utm_medium
- utm_content
- entrypoint_experiment
- entrypoing_variation
- experiment
- variation
- v
- xv
referrer:
type: string
lifetime: application
send_in_pings:
- page-view
- interaction
- non-interaction
description: |
The referring URL that linked to the page that was viewed.
data_sensitivity:
- web_activity
bugs:
- https://github.com/mozilla/bedrock/issues/10746
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1767442
notification_emails:
- marketing-websites-team@mozilla.com
expires: never
page_event:
type: event
lifetime: ping
send_in_pings:
- interaction
- non-interaction
description: |
An event containing metrics related to a page level
completion or state that want to measure. This can be
sent in either an interaction and non-interaction ping,
depending upon the use-case. Examples: form completion,
scroll events, banner impressions.
data_sensitivity:
- web_activity
bugs:
- https://github.com/mozilla/bedrock/issues/10746
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1767442
notification_emails:
- marketing-websites-team@mozilla.com
expires: never
extra_keys:
label:
description: |
The label used to describe the event.
Example: 'Newsletters: mozilla-and-you'
type: string
type:
description: |
The type of event.
Example: 'Newsletter Signup Success'
type: string
element:
clicked:
type: event
lifetime: ping
send_in_pings:
- interaction
description: |
An event containing metrics related to which element
in the page was clicked.
data_sensitivity:
- web_activity
bugs:
- https://github.com/mozilla/bedrock/issues/10746
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1767442
notification_emails:
- marketing-websites-team@mozilla.com
expires: never
extra_keys:
label:
description: |
Description of the page element that was
clicked. Examples: 'Download Firefox',
'Get Mozilla VPN'.
type: string
type:
description: |
The type of element that was clicked.
Examples: 'Button', 'Link'.
type: string
position:
description: |
The position of the element in the page.
Examples: 'Primary', 'Secondary',
'Navigation', 'Footer'.
type: string

41
glean/pings.yaml Normal file
Просмотреть файл

@ -0,0 +1,41 @@
---
$schema: moz://mozilla.org/schemas/glean/pings/2-0-0
page-view:
description: |
A ping which is sent everytime a page is viewed.
include_client_id: true
send_if_empty: false
bugs:
- https://github.com/mozilla/bedrock/issues/10746
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1767442
notification_emails:
- marketing-websites-team@mozilla.com
interaction:
description: |
A ping which is sent when a page element is
interacted with.
include_client_id: true
send_if_empty: false
bugs:
- https://github.com/mozilla/bedrock/issues/10746
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1767442
notification_emails:
- marketing-websites-team@mozilla.com
non-interaction:
description: |
A ping which is sent when a non-user initiated event
occurs. Examples: a specific banner impression is
displayed, a video auto-plays on scroll.
include_client_id: true
send_if_empty: false
bugs:
- https://github.com/mozilla/bedrock/issues/10746
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1767442
notification_emails:
- marketing-websites-team@mozilla.com

Просмотреть файл

@ -49,6 +49,14 @@ if (typeof window.Mozilla === 'undefined') {
'data-banner-name': Banner.id,
'data-banner-dismissal': '1'
});
// Track event in Glean.
if (typeof window.Mozilla.Glean !== 'undefined') {
window.Mozilla.Glean.pageEventPing({
label: Banner.id,
type: 'Banner Dismissal'
});
}
};
Banner.show = function (renderAtTopOfPage) {

Просмотреть файл

@ -20,5 +20,13 @@
languageSelected: newLanguage,
previousLanguage: previousLanguage
});
// Track event in Glean.
if (typeof window.Mozilla.Glean !== 'undefined') {
window.Mozilla.Glean.pageEventPing({
label: 'Language Selected: ' + newLanguage,
type: 'Change Language'
});
}
});
})();

Просмотреть файл

@ -0,0 +1,103 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { interaction as interactionPing } from '../libs/glean/pings.js';
import * as element from '../libs/glean/element.js';
function interaction(obj) {
if (typeof obj !== 'object' && typeof obj.label !== 'string') {
return;
}
const data = {
label: obj.label
};
if (typeof obj.type === 'string') {
data['type'] = obj.type;
}
if (typeof obj.position === 'string') {
data['position'] = obj.position;
}
element.clicked.record(data);
interactionPing.submit();
}
function getElementAttributes(e) {
let el = e.target;
// If the node isn't a link or button, traverse upward
// in case this is a nested child element.
if (
(el.nodeName !== 'A' || el.nodeName !== 'BUTTON') &&
Element.prototype.closest
) {
el = el.closest('a') || el.closest('button');
}
// Check all link and button elements for data attributes.
if (el && (el.nodeName === 'A' || el.nodeName === 'BUTTON')) {
const ctaText = el.getAttribute('data-cta-text');
const linkName = el.getAttribute('data-link-name');
const linkType = el.getAttribute('data-link-type');
// CTA link clicks
if (ctaText) {
const type = el.getAttribute('data-cta-type');
const position = el.getAttribute('data-cta-position');
interaction({
label: ctaText,
type: type,
position: position
});
return;
}
// Firefox Download link clicks
if (linkType && linkType === 'download') {
const os = el.getAttribute('data-download-os');
const name = el.getAttribute('data-display-name');
const position = el.getAttribute('data-download-location');
if (os) {
const label = `Firefox Download ${os}`;
interaction({
label: label,
type: name,
position: position
});
return;
}
}
// Older format links
if (linkName) {
const position = el.getAttribute('data-link-position');
interaction({
label: linkName,
type: linkType,
position: position
});
return;
}
}
}
function bindElementClicks() {
document
.querySelector('body')
.addEventListener('click', getElementAttributes, false);
}
function unbindElementClicks() {
document
.querySelector('body')
.removeEventListener('click', getElementAttributes, false);
}
export { bindElementClicks, unbindElementClicks };

Просмотреть файл

@ -0,0 +1,49 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import Glean from '@mozilla/glean/web';
import { initPageView, pageEventPing } from './page.es6';
import { bindElementClicks } from './elements.es6';
import Utils from './utils.es6';
function initGlean() {
// Automatically console.log() pings.
// eslint-disable-next-line no-undef
if (process.env.GLEAN_LOG_PINGS === 'True') {
Glean.setLogPings(true);
}
// Enable debug view for all non-production environments.
// https://debug-ping-preview.firebaseapp.com/
if (window.location.href.indexOf('https://www.mozilla.org/') === -1) {
Glean.setDebugViewTag('moz-bedrock');
}
// Ensure telemetry coming from automated testing is tagged
// https://mozilla.github.io/glean/book/reference/debug/sourceTags.html
if (window.location.href.indexOf('automation=true') !== -1) {
Glean.setSourceTags(['automation']);
}
Glean.initialize('moz-bedrock', Utils.isTelemetryEnabled(), {
maxEvents: 1 // Set max events to 1 so pings are sent as soon as registered.
});
}
function initPageEventHelper() {
if (typeof window.Mozilla === 'undefined') {
window.Mozilla = {};
}
// Create a global for external bundles to fire interaction pings.
window.Mozilla.Glean = { pageEventPing };
}
initGlean();
initPageView();
initPageEventHelper();
bindElementClicks();

Просмотреть файл

@ -0,0 +1,81 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import * as page from '../libs/glean/page.js';
import Utils from './utils.es6';
import {
pageView as pageViewPing,
interaction as interactionPing,
nonInteraction as nonInteractionPing
} from '../libs/glean/pings.js';
const validParams = [
'utm_source',
'utm_campaign',
'utm_medium',
'utm_content',
'entrypoint_experiment',
'entrypoint_variation',
'experiment',
'variation',
'v', // short param for 'variation'
'xv' // short param for 'experience version'.
];
function initPageView() {
page.viewed.set();
page.path.set(Utils.getPathFromUrl());
page.locale.set(Utils.getLocaleFromUrl());
page.referrer.set(Utils.getReferrer());
const params = Utils.getQueryParamsFromURL();
if (params) {
// validate only known & trusted query params
// for inclusion in Glean metrics.
for (const param in validParams) {
const allowedChars = /^[\w/.%-]+$/;
const p = validParams[param];
let v = params.get(p);
if (v) {
v = decodeURIComponent(v);
if (allowedChars.test(v)) {
page.queryParams[p].set(v);
}
}
}
}
pageViewPing.submit();
}
function pageEventPing(obj) {
if (typeof obj !== 'object' && typeof obj.label !== 'string') {
return;
}
const data = {
label: obj.label
};
if (typeof obj.type === 'string') {
data['type'] = obj.type;
}
page.pageEvent.record(data);
if (
typeof obj.nonInteraction === 'boolean' &&
obj.nonInteraction === true
) {
nonInteractionPing.submit();
} else {
interactionPing.submit();
}
}
export { initPageView, pageEventPing };

Просмотреть файл

@ -0,0 +1,45 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
const Utils = {
getPathFromUrl: function (path) {
const pathName = path ? path : document.location.pathname;
return pathName.replace(/^(\/\w{2}-\w{2}\/|\/\w{2,3}\/)/, '/');
},
getLocaleFromUrl: function (path) {
const pathName = path ? path : document.location.pathname;
const locale = pathName.match(/^\/(\w{2}-\w{2}|\w{2,3})\//);
// If there's no locale in the path then assume language is `en-US`;
return locale && locale.length > 0 ? locale[1] : 'en-US';
},
getQueryParamsFromURL: function (qs) {
const query = typeof qs === 'string' ? qs : window.location.search;
if (typeof window._SearchParams !== 'undefined') {
return new window._SearchParams(query);
}
return false;
},
getReferrer: function (ref) {
return typeof ref === 'string' ? ref : document.referrer;
},
isTelemetryEnabled: function () {
if (
typeof Mozilla.Cookies !== 'undefined' &&
Mozilla.Cookies.enabled()
) {
return !Mozilla.Cookies.hasItem('moz-1st-party-data-opt-out');
}
return true;
}
};
export default Utils;

Просмотреть файл

@ -178,6 +178,20 @@
newsletter: newsletters
});
}
const newsletterLabel = newsletters
.map((n) => {
return n;
})
.join(', ');
// Track event in Glean.
if (typeof window.Mozilla.Glean !== 'undefined') {
window.Mozilla.Glean.pageEventPing({
label: `Newsletters: ${newsletterLabel}`,
type: 'Newsletter Signup Success'
});
}
} else {
if (response.errors) {
for (let i = 0; i < response.errors.length; i++) {

Просмотреть файл

@ -1129,6 +1129,12 @@
],
"name": "site"
},
{
"files": [
"js/glean/init.es6.js"
],
"name": "glean"
},
{
"files": [
"protocol/js/protocol-modal.js",

136
package-lock.json сгенерированный
Просмотреть файл

@ -12,6 +12,7 @@
"@babel/core": "^7.17.9",
"@babel/preset-env": "^7.16.11",
"@mozilla-protocol/core": "16.0.0",
"@mozilla/glean": "^1.0.0",
"@sentry/browser": "^6.19.0",
"babel-loader": "^8.2.4",
"clean-webpack-plugin": "^4.0.0",
@ -29,6 +30,7 @@
"browser-sync": "^2.27.9",
"browser-sync-webpack-plugin": "^2.2.2",
"concurrently": "^7.1.0",
"dotenv-webpack": "^7.1.0",
"eslint": "^8.11.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-json": "^3.1.0",
@ -1601,6 +1603,37 @@
"resolved": "https://registry.npmjs.org/@mozilla-protocol/core/-/core-16.0.0.tgz",
"integrity": "sha512-2eICrBcKvm9GpKy7yv90YIVbR/iscyVpjfaeMt+n25lj0svNknDBPmQJR0njgOemzEr8IFdnqL8oj0+JhMGj8g=="
},
"node_modules/@mozilla/glean": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@mozilla/glean/-/glean-1.0.0.tgz",
"integrity": "sha512-2RzkubrxaCV7mkmCXgBmD16XbDuK4SVqlMdLv3zez2lb3WXnLo6j+C+IKIgBke/f/iGgz6O4SISjTAhkaPvgNQ==",
"dependencies": {
"fflate": "^0.7.1",
"jose": "^4.0.4",
"tslib": "^2.3.1",
"uuid": "^8.3.2"
},
"bin": {
"glean": "dist/cli/cli.js"
},
"engines": {
"node": ">=12.20.0",
"npm": ">=7.0.0"
}
},
"node_modules/@mozilla/glean/node_modules/tslib": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
"integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
},
"node_modules/@mozilla/glean/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/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@ -3815,6 +3848,39 @@
"url": "https://github.com/fb55/domutils?sponsor=1"
}
},
"node_modules/dotenv": {
"version": "8.6.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz",
"integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==",
"dev": true,
"engines": {
"node": ">=10"
}
},
"node_modules/dotenv-defaults": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/dotenv-defaults/-/dotenv-defaults-2.0.2.tgz",
"integrity": "sha512-iOIzovWfsUHU91L5i8bJce3NYK5JXeAwH50Jh6+ARUdLiiGlYWfGw6UkzsYqaXZH/hjE/eCd/PlfM/qqyK0AMg==",
"dev": true,
"dependencies": {
"dotenv": "^8.2.0"
}
},
"node_modules/dotenv-webpack": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-7.1.0.tgz",
"integrity": "sha512-+aUOe+nqgLerA/n611oyC15fY79BIkGm2fOxJAcHDonMZ7AtDpnzv/Oe591eHAenIE0t6w03UyxDnLs/YUxx5Q==",
"dev": true,
"dependencies": {
"dotenv-defaults": "^2.0.2"
},
"engines": {
"node": ">=10"
},
"peerDependencies": {
"webpack": "^4 || ^5"
}
},
"node_modules/easy-extender": {
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz",
@ -4447,6 +4513,11 @@
"reusify": "^1.0.4"
}
},
"node_modules/fflate": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.3.tgz",
"integrity": "sha512-0Zz1jOzJWERhyhsimS54VTqOteCNwRtIlh8isdL0AXLo0g7xNTfTL7oWrkmCnPhZGocKIkWHBistBrrpoNH3aw=="
},
"node_modules/file-entry-cache": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
@ -5387,6 +5458,14 @@
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
"node_modules/jose": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/jose/-/jose-4.6.1.tgz",
"integrity": "sha512-EFnufEivlIB6j7+JwaenYQzdUDs/McajDr9WnhT6EI0WxbexnfuZimpWX1GnobF6OnQsUFmWFXUXdWyZHWdQow==",
"funding": {
"url": "https://github.com/sponsors/panva"
}
},
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@ -10869,6 +10948,29 @@
"resolved": "https://registry.npmjs.org/@mozilla-protocol/core/-/core-16.0.0.tgz",
"integrity": "sha512-2eICrBcKvm9GpKy7yv90YIVbR/iscyVpjfaeMt+n25lj0svNknDBPmQJR0njgOemzEr8IFdnqL8oj0+JhMGj8g=="
},
"@mozilla/glean": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@mozilla/glean/-/glean-1.0.0.tgz",
"integrity": "sha512-2RzkubrxaCV7mkmCXgBmD16XbDuK4SVqlMdLv3zez2lb3WXnLo6j+C+IKIgBke/f/iGgz6O4SISjTAhkaPvgNQ==",
"requires": {
"fflate": "^0.7.1",
"jose": "^4.0.4",
"tslib": "^2.3.1",
"uuid": "^8.3.2"
},
"dependencies": {
"tslib": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
"integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
},
"uuid": {
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
}
}
},
"@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@ -12572,6 +12674,30 @@
"domhandler": "^4.2.0"
}
},
"dotenv": {
"version": "8.6.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz",
"integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==",
"dev": true
},
"dotenv-defaults": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/dotenv-defaults/-/dotenv-defaults-2.0.2.tgz",
"integrity": "sha512-iOIzovWfsUHU91L5i8bJce3NYK5JXeAwH50Jh6+ARUdLiiGlYWfGw6UkzsYqaXZH/hjE/eCd/PlfM/qqyK0AMg==",
"dev": true,
"requires": {
"dotenv": "^8.2.0"
}
},
"dotenv-webpack": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-7.1.0.tgz",
"integrity": "sha512-+aUOe+nqgLerA/n611oyC15fY79BIkGm2fOxJAcHDonMZ7AtDpnzv/Oe591eHAenIE0t6w03UyxDnLs/YUxx5Q==",
"dev": true,
"requires": {
"dotenv-defaults": "^2.0.2"
}
},
"easy-extender": {
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz",
@ -13059,6 +13185,11 @@
"reusify": "^1.0.4"
}
},
"fflate": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.3.tgz",
"integrity": "sha512-0Zz1jOzJWERhyhsimS54VTqOteCNwRtIlh8isdL0AXLo0g7xNTfTL7oWrkmCnPhZGocKIkWHBistBrrpoNH3aw=="
},
"file-entry-cache": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
@ -13745,6 +13876,11 @@
}
}
},
"jose": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/jose/-/jose-4.6.1.tgz",
"integrity": "sha512-EFnufEivlIB6j7+JwaenYQzdUDs/McajDr9WnhT6EI0WxbexnfuZimpWX1GnobF6OnQsUFmWFXUXdWyZHWdQow=="
},
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",

Просмотреть файл

@ -7,6 +7,7 @@
"@babel/core": "^7.17.9",
"@babel/preset-env": "^7.16.11",
"@mozilla-protocol/core": "16.0.0",
"@mozilla/glean": "^1.0.0",
"@sentry/browser": "^6.19.0",
"babel-loader": "^8.2.4",
"clean-webpack-plugin": "^4.0.0",
@ -33,6 +34,7 @@
"browser-sync": "^2.27.9",
"browser-sync-webpack-plugin": "^2.2.2",
"concurrently": "^7.1.0",
"dotenv-webpack": "^7.1.0",
"eslint": "^8.11.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-json": "^3.1.0",
@ -51,23 +53,28 @@
"tinypng-cli": "^0.0.7"
},
"scripts": {
"prestart": "npm run glean",
"start": "concurrently --kill-others \"python manage.py runserver 0.0.0.0:8080\" \"npm run watch\"",
"in-pocket-mode": "SITE_MODE=Pocket npm start",
"lint-js": "./node_modules/.bin/eslint \"media/js/**/*.js\" \"tests/unit/spec/**/*.js\" webpack.config.js webpack.static.config.js",
"lint-css": "./node_modules/.bin/stylelint \"media/css/**/*.{css,scss}\"",
"lint-json": "./node_modules/.bin/eslint \"bedrock/base/templates/includes/structured-data/**/*.json\"",
"lint": "npm run lint-js && npm run lint-css && npm run lint-json && npm run prettier-check",
"pretest": "npm run lint",
"test": "./node_modules/.bin/karma start ./tests/unit/karma.conf.js",
"test": "npm run glean && npm run lint && npm run karma",
"karma": "./node_modules/.bin/karma start ./tests/unit/karma.conf.js",
"static": "webpack --config webpack.static.config.js --mode=production --bail",
"prebuild": "npm run static",
"prebuild": "npm run glean && npm run static",
"build": "webpack --mode=production --bail",
"prewatch": "npm run static",
"watch": "webpack --mode=development --watch",
"prettier": "prettier --write .",
"prettier-check": "prettier --check .",
"stylelint-fix": "./node_modules/.bin/stylelint \"media/css/**/*.{css,scss}\" --fix",
"format": "npm run prettier && npm run stylelint-fix"
"format": "npm run prettier && npm run stylelint-fix",
"glean-docs": "glean translate glean/metrics.yaml glean/pings.yaml -f markdown -o glean/docs/",
"glean-lint": "glean glinter glean/metrics.yaml glean/pings.yaml",
"preglean": "npm run glean-lint && npm run glean-docs",
"glean": "glean translate glean/metrics.yaml glean/pings.yaml -f javascript -o media/js/libs/glean/"
},
"browserslist": [
"defaults",

Просмотреть файл

@ -22,4 +22,4 @@ selenium==4.1.3
translate-toolkit==3.6.0
# Related to moz-l10n-lint, used in CI
cl-ext.lang==0.1.0
compare-locales==7.6.0
compare-locales==7.6.0

Просмотреть файл

@ -4,6 +4,12 @@
#
# $ make compile-requirements
#
appdirs==1.4.4 \
--hash=sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41 \
--hash=sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128
# via
# -r requirements/prod.txt
# glean-parser
apscheduler==3.9.1 \
--hash=sha256:65e6574b6395498d371d045f2a8a7e4f7d50c6ad21ef7313d15b1c7cf20df1e3 \
--hash=sha256:ddc25a0ddd899de44d7f451f4375fb971887e65af51e41e5dcf681f59b8b2c9a
@ -26,6 +32,7 @@ attrs==21.4.0 \
# via
# -r requirements/prod.txt
# fluent-runtime
# jsonschema
# outcome
# pytest
# trio
@ -177,10 +184,13 @@ cl-ext-lang==0.1.0 \
--hash=sha256:662fcccc1ff77063dd9d6bad770c26d1345cf4cf01e679eab136e80f3ec2935c \
--hash=sha256:90b94aaee4afecbf2a9be3cd65656940f38edea3ddde14b93a02a9e1ee5d1f72
# via -r requirements/dev.in
click==8.0.4 \
--hash=sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1 \
--hash=sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb
# via black
click==8.1.3 \
--hash=sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e \
--hash=sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48
# via
# -r requirements/prod.txt
# black
# glean-parser
commonware==0.6.0 \
--hash=sha256:0e9520986e292f2bf8cdf80b32f21ef01e4058fd7baa61d2d282d21ed7085b1f \
--hash=sha256:f596962fd11bc53b5453ffa766dc99f297895021946096d3e6b4826f9ae075ea
@ -315,6 +325,12 @@ deprecated==1.2.13 \
dirsync==2.2.5 \
--hash=sha256:1e3a4cd2b639a2eae5afc03c2b8a003fc43d56a0da5114db579386da9a14a8be
# via -r requirements/prod.txt
diskcache==5.4.0 \
--hash=sha256:8879eb8c9b4a2509a5e633d2008634fb2b0b35c2b36192d89655dbde02419644 \
--hash=sha256:af3ec6d7f167bbef7b6c33d9ee22f86d3e8f2dd7131eb7c4703d8d91ccdc0cc4
# via
# -r requirements/prod.txt
# glean-parser
django==3.2.13 \
--hash=sha256:6d93497a0a9bf6ba0e0b1a29cccdc40efbfc76297255b1309b3a884a688ec4b6 \
--hash=sha256:b896ca61edc079eb6bbaa15cf6071eb69d6aac08cce5211583cfb41515644fdf
@ -410,6 +426,10 @@ fluent-syntax==0.17.0 \
# via
# compare-locales
# fluent-runtime
glean-parser==5.1.0 \
--hash=sha256:68c22006e961190541e267ab896d0d52a848e3a3caa1ef8ae38447b7447abe1a \
--hash=sha256:f2831b686b16e4b930f4e96e36c5d77b620135b8dea086fdbc38d53adfae1d1d
# via -r requirements/prod.txt
greenlet==0.4.17 \
--hash=sha256:1023d7b43ca11264ab7052cb09f5635d4afdb43df55e0854498fc63070a0b206 \
--hash=sha256:124a3ae41215f71dc91d1a3d45cbf2f84e46b543e5d60b99ecc20e24b4c8f272 \
@ -477,6 +497,7 @@ jinja2==3.0.3 \
# via
# -r requirements/prod.txt
# django-jinja
# glean-parser
jmespath==0.10.0 \
--hash=sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9 \
--hash=sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f
@ -484,6 +505,12 @@ jmespath==0.10.0 \
# -r requirements/prod.txt
# boto3
# botocore
jsonschema==4.5.1 \
--hash=sha256:71b5e39324422543546572954ce71c67728922c104902cb7ce252e522235b33f \
--hash=sha256:7c6d882619340c3347a1bf7315e147e6d3dae439033ae6383d6acb908c101dfc
# via
# -r requirements/prod.txt
# glean-parser
lxml==4.8.0 \
--hash=sha256:078306d19a33920004addeb5f4630781aaeabb6a8d01398045fcde085091a169 \
--hash=sha256:0c1978ff1fd81ed9dcbba4f91cf09faf1f8082c9d72eb122e92294716c605428 \
@ -557,49 +584,79 @@ markdown==3.3.6 \
# -r requirements/prod.txt
# django-jinja-markdown
# mdx-outline
markupsafe==2.1.1 \
--hash=sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003 \
--hash=sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88 \
--hash=sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5 \
--hash=sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7 \
--hash=sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a \
--hash=sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603 \
--hash=sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1 \
--hash=sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135 \
--hash=sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247 \
--hash=sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6 \
--hash=sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601 \
--hash=sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77 \
--hash=sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02 \
--hash=sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e \
--hash=sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63 \
--hash=sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f \
--hash=sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980 \
--hash=sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b \
--hash=sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812 \
--hash=sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff \
--hash=sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96 \
--hash=sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1 \
--hash=sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925 \
--hash=sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a \
--hash=sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6 \
--hash=sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e \
--hash=sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f \
--hash=sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4 \
--hash=sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f \
--hash=sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3 \
--hash=sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c \
--hash=sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a \
--hash=sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417 \
--hash=sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a \
--hash=sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a \
--hash=sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37 \
--hash=sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452 \
--hash=sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933 \
--hash=sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a \
--hash=sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7
markupsafe==2.0.1 \
--hash=sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298 \
--hash=sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64 \
--hash=sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b \
--hash=sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194 \
--hash=sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567 \
--hash=sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff \
--hash=sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724 \
--hash=sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74 \
--hash=sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646 \
--hash=sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35 \
--hash=sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6 \
--hash=sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a \
--hash=sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6 \
--hash=sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad \
--hash=sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26 \
--hash=sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38 \
--hash=sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac \
--hash=sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7 \
--hash=sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6 \
--hash=sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047 \
--hash=sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75 \
--hash=sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f \
--hash=sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b \
--hash=sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135 \
--hash=sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8 \
--hash=sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a \
--hash=sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a \
--hash=sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1 \
--hash=sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9 \
--hash=sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864 \
--hash=sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914 \
--hash=sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee \
--hash=sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f \
--hash=sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18 \
--hash=sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8 \
--hash=sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2 \
--hash=sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d \
--hash=sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b \
--hash=sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b \
--hash=sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86 \
--hash=sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6 \
--hash=sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f \
--hash=sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb \
--hash=sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833 \
--hash=sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28 \
--hash=sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e \
--hash=sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415 \
--hash=sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902 \
--hash=sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f \
--hash=sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d \
--hash=sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9 \
--hash=sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d \
--hash=sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145 \
--hash=sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066 \
--hash=sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c \
--hash=sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1 \
--hash=sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a \
--hash=sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207 \
--hash=sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f \
--hash=sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53 \
--hash=sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd \
--hash=sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134 \
--hash=sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85 \
--hash=sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9 \
--hash=sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5 \
--hash=sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94 \
--hash=sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509 \
--hash=sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51 \
--hash=sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872
# via
# -r requirements/prod.txt
# glean-parser
# jinja2
mccabe==0.6.1 \
--hash=sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42 \
@ -658,7 +715,10 @@ parsimonious==0.8.1 \
pathspec==0.9.0 \
--hash=sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a \
--hash=sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1
# via black
# via
# -r requirements/prod.txt
# black
# yamllint
phonenumberslite==8.12.46 \
--hash=sha256:752555fb0cb9e442054c93fd23ab2ac1b741aea30e6e990be560ef75cac55c21 \
--hash=sha256:93aa86c9e9e4b15dda89c4b0e7b9a3b6b854e009441a941a29d3b0202fa575bd
@ -782,6 +842,31 @@ pyquery==1.4.3 \
--hash=sha256:1fc33b7699455ed25c75282bc8f80ace1ac078b0dda5a933dacbd8b1c1f83963 \
--hash=sha256:a388eefb6bc4a55350de0316fbd97cda999ae669b6743ae5b99102ba54f5aa72
# via -r requirements/dev.in
pyrsistent==0.18.1 \
--hash=sha256:0e3e1fcc45199df76053026a51cc59ab2ea3fc7c094c6627e93b7b44cdae2c8c \
--hash=sha256:1b34eedd6812bf4d33814fca1b66005805d3640ce53140ab8bbb1e2651b0d9bc \
--hash=sha256:4ed6784ceac462a7d6fcb7e9b663e93b9a6fb373b7f43594f9ff68875788e01e \
--hash=sha256:5d45866ececf4a5fff8742c25722da6d4c9e180daa7b405dc0a2a2790d668c26 \
--hash=sha256:636ce2dc235046ccd3d8c56a7ad54e99d5c1cd0ef07d9ae847306c91d11b5fec \
--hash=sha256:6455fc599df93d1f60e1c5c4fe471499f08d190d57eca040c0ea182301321286 \
--hash=sha256:6bc66318fb7ee012071b2792024564973ecc80e9522842eb4e17743604b5e045 \
--hash=sha256:7bfe2388663fd18bd8ce7db2c91c7400bf3e1a9e8bd7d63bf7e77d39051b85ec \
--hash=sha256:7ec335fc998faa4febe75cc5268a9eac0478b3f681602c1f27befaf2a1abe1d8 \
--hash=sha256:914474c9f1d93080338ace89cb2acee74f4f666fb0424896fcfb8d86058bf17c \
--hash=sha256:b568f35ad53a7b07ed9b1b2bae09eb15cdd671a5ba5d2c66caee40dbf91c68ca \
--hash=sha256:cdfd2c361b8a8e5d9499b9082b501c452ade8bbf42aef97ea04854f4a3f43b22 \
--hash=sha256:d1b96547410f76078eaf66d282ddca2e4baae8964364abb4f4dcdde855cd123a \
--hash=sha256:d4d61f8b993a7255ba714df3aca52700f8125289f84f704cf80916517c46eb96 \
--hash=sha256:d7a096646eab884bf8bed965bad63ea327e0d0c38989fc83c5ea7b8a87037bfc \
--hash=sha256:df46c854f490f81210870e509818b729db4488e1f30f2a1ce1698b2295a878d1 \
--hash=sha256:e24a828f57e0c337c8d8bb9f6b12f09dfdf0273da25fda9e314f0b684b415a07 \
--hash=sha256:e4f3149fd5eb9b285d6bfb54d2e5173f6a116fe19172686797c056672689daf6 \
--hash=sha256:e92a52c166426efbe0d1ec1332ee9119b6d32fc1f0bbfd55d5c1088070e7fc1b \
--hash=sha256:f87cc2863ef33c709e237d4b5f4502a62a00fab450c9e020892e8e2ede5847f5 \
--hash=sha256:fd8da6d0124efa2f67d86fa70c851022f87c98e205f0594e1fae044e7119a5a6
# via
# -r requirements/prod.txt
# jsonschema
pysocks==1.7.1 \
--hash=sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299 \
--hash=sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5 \
@ -917,7 +1002,10 @@ pyyaml==6.0 \
--hash=sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a \
--hash=sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174 \
--hash=sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5
# via -r requirements/prod.txt
# via
# -r requirements/prod.txt
# glean-parser
# yamllint
qrcode==7.3.1 \
--hash=sha256:375a6ff240ca9bd41adc070428b5dfc1dcfbb0f2507f1ac848f6cded38956578
# via -r requirements/prod.txt
@ -1164,6 +1252,11 @@ wsproto==1.1.0 \
--hash=sha256:2218cb57952d90b9fca325c0dcfb08c3bda93e8fd8070b0a17f048e2e47a521b \
--hash=sha256:a2e56bfd5c7cd83c1369d83b5feccd6d37798b74872866e62616e0ecf111bda8
# via trio-websocket
yamllint==1.26.3 \
--hash=sha256:3934dcde484374596d6b52d8db412929a169f6d9e52e20f9ade5bf3523d9b96e
# via
# -r requirements/prod.txt
# glean-parser
zipp==3.7.0 \
--hash=sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d \
--hash=sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375

Просмотреть файл

@ -1,6 +1,7 @@
chardet==4.0.0
fluent.pygments==0.1.0
fluent.syntax==0.17.0 # hard-pinned subdep to avoid compatibility issues
markupsafe==2.0.1
myst-parser==0.17.2
Sphinx==4.5.0
sphinx-autobuild==2021.3.14

Просмотреть файл

@ -76,48 +76,79 @@ markdown-it-py==2.0.1 \
# via
# mdit-py-plugins
# myst-parser
markupsafe==2.1.0 \
--hash=sha256:023af8c54fe63530545f70dd2a2a7eed18d07a9a77b94e8bf1e2ff7f252db9a3 \
--hash=sha256:09c86c9643cceb1d87ca08cdc30160d1b7ab49a8a21564868921959bd16441b8 \
--hash=sha256:142119fb14a1ef6d758912b25c4e803c3ff66920635c44078666fe7cc3f8f759 \
--hash=sha256:1d1fb9b2eec3c9714dd936860850300b51dbaa37404209c8d4cb66547884b7ed \
--hash=sha256:204730fd5fe2fe3b1e9ccadb2bd18ba8712b111dcabce185af0b3b5285a7c989 \
--hash=sha256:24c3be29abb6b34052fd26fc7a8e0a49b1ee9d282e3665e8ad09a0a68faee5b3 \
--hash=sha256:290b02bab3c9e216da57c1d11d2ba73a9f73a614bbdcc027d299a60cdfabb11a \
--hash=sha256:3028252424c72b2602a323f70fbf50aa80a5d3aa616ea6add4ba21ae9cc9da4c \
--hash=sha256:30c653fde75a6e5eb814d2a0a89378f83d1d3f502ab710904ee585c38888816c \
--hash=sha256:3cace1837bc84e63b3fd2dfce37f08f8c18aeb81ef5cf6bb9b51f625cb4e6cd8 \
--hash=sha256:4056f752015dfa9828dce3140dbadd543b555afb3252507348c493def166d454 \
--hash=sha256:454ffc1cbb75227d15667c09f164a0099159da0c1f3d2636aa648f12675491ad \
--hash=sha256:598b65d74615c021423bd45c2bc5e9b59539c875a9bdb7e5f2a6b92dfcfc268d \
--hash=sha256:599941da468f2cf22bf90a84f6e2a65524e87be2fce844f96f2dd9a6c9d1e635 \
--hash=sha256:5ddea4c352a488b5e1069069f2f501006b1a4362cb906bee9a193ef1245a7a61 \
--hash=sha256:62c0285e91414f5c8f621a17b69fc0088394ccdaa961ef469e833dbff64bd5ea \
--hash=sha256:679cbb78914ab212c49c67ba2c7396dc599a8479de51b9a87b174700abd9ea49 \
--hash=sha256:6e104c0c2b4cd765b4e83909cde7ec61a1e313f8a75775897db321450e928cce \
--hash=sha256:736895a020e31b428b3382a7887bfea96102c529530299f426bf2e636aacec9e \
--hash=sha256:75bb36f134883fdbe13d8e63b8675f5f12b80bb6627f7714c7d6c5becf22719f \
--hash=sha256:7d2f5d97fcbd004c03df8d8fe2b973fe2b14e7bfeb2cfa012eaa8759ce9a762f \
--hash=sha256:80beaf63ddfbc64a0452b841d8036ca0611e049650e20afcb882f5d3c266d65f \
--hash=sha256:84ad5e29bf8bab3ad70fd707d3c05524862bddc54dc040982b0dbcff36481de7 \
--hash=sha256:8da5924cb1f9064589767b0f3fc39d03e3d0fb5aa29e0cb21d43106519bd624a \
--hash=sha256:961eb86e5be7d0973789f30ebcf6caab60b844203f4396ece27310295a6082c7 \
--hash=sha256:96de1932237abe0a13ba68b63e94113678c379dca45afa040a17b6e1ad7ed076 \
--hash=sha256:a0a0abef2ca47b33fb615b491ce31b055ef2430de52c5b3fb19a4042dbc5cadb \
--hash=sha256:b2a5a856019d2833c56a3dcac1b80fe795c95f401818ea963594b345929dffa7 \
--hash=sha256:b8811d48078d1cf2a6863dafb896e68406c5f513048451cd2ded0473133473c7 \
--hash=sha256:c532d5ab79be0199fa2658e24a02fce8542df196e60665dd322409a03db6a52c \
--hash=sha256:d3b64c65328cb4cd252c94f83e66e3d7acf8891e60ebf588d7b493a55a1dbf26 \
--hash=sha256:d4e702eea4a2903441f2735799d217f4ac1b55f7d8ad96ab7d4e25417cb0827c \
--hash=sha256:d5653619b3eb5cbd35bfba3c12d575db2a74d15e0e1c08bf1db788069d410ce8 \
--hash=sha256:d66624f04de4af8bbf1c7f21cc06649c1c69a7f84109179add573ce35e46d448 \
--hash=sha256:e67ec74fada3841b8c5f4c4f197bea916025cb9aa3fe5abf7d52b655d042f956 \
--hash=sha256:e6f7f3f41faffaea6596da86ecc2389672fa949bd035251eab26dc6697451d05 \
--hash=sha256:f02cf7221d5cd915d7fa58ab64f7ee6dd0f6cddbb48683debf5d04ae9b1c2cc1 \
--hash=sha256:f0eddfcabd6936558ec020130f932d479930581171368fd728efcfb6ef0dd357 \
--hash=sha256:fabbe18087c3d33c5824cb145ffca52eccd053061df1d79d4b66dafa5ad2a5ea \
--hash=sha256:fc3150f85e2dbcf99e65238c842d1cfe69d3e7649b19864c1cc043213d9cd730
# via jinja2
markupsafe==2.0.1 \
--hash=sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298 \
--hash=sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64 \
--hash=sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b \
--hash=sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194 \
--hash=sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567 \
--hash=sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff \
--hash=sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724 \
--hash=sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74 \
--hash=sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646 \
--hash=sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35 \
--hash=sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6 \
--hash=sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a \
--hash=sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6 \
--hash=sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad \
--hash=sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26 \
--hash=sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38 \
--hash=sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac \
--hash=sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7 \
--hash=sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6 \
--hash=sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047 \
--hash=sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75 \
--hash=sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f \
--hash=sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b \
--hash=sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135 \
--hash=sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8 \
--hash=sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a \
--hash=sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a \
--hash=sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1 \
--hash=sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9 \
--hash=sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864 \
--hash=sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914 \
--hash=sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee \
--hash=sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f \
--hash=sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18 \
--hash=sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8 \
--hash=sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2 \
--hash=sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d \
--hash=sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b \
--hash=sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b \
--hash=sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86 \
--hash=sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6 \
--hash=sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f \
--hash=sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb \
--hash=sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833 \
--hash=sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28 \
--hash=sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e \
--hash=sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415 \
--hash=sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902 \
--hash=sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f \
--hash=sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d \
--hash=sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9 \
--hash=sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d \
--hash=sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145 \
--hash=sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066 \
--hash=sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c \
--hash=sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1 \
--hash=sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a \
--hash=sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207 \
--hash=sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f \
--hash=sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53 \
--hash=sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd \
--hash=sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134 \
--hash=sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85 \
--hash=sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9 \
--hash=sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5 \
--hash=sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94 \
--hash=sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509 \
--hash=sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51 \
--hash=sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872
# via
# -r requirements/docs.in
# jinja2
mdit-py-plugins==0.3.0 \
--hash=sha256:b1279701cee2dbf50e188d3da5f51fee8d78d038cdf99be57c6b9d1aa93b4073 \
--hash=sha256:ecc24f51eeec6ab7eecc2f9724e8272c2fb191c2e93cf98109120c2cace69750

Просмотреть файл

@ -26,6 +26,7 @@ envcat==0.1.1
everett==3.0.0
fluent.runtime==0.3
fluent.syntax==0.17.0 # hard-pinned subdep to avoid compatibility issues
glean-parser==5.1.0 # Must match the required version in the Glean NPM package.
greenlet==0.4.17 # Pinned for stability but subdep of Meinheld
gunicorn==19.7.1
honcho==1.1.0

Просмотреть файл

@ -4,6 +4,10 @@
#
# $ make compile-requirements
#
appdirs==1.4.4 \
--hash=sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41 \
--hash=sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128
# via glean-parser
apscheduler==3.9.1 \
--hash=sha256:65e6574b6395498d371d045f2a8a7e4f7d50c6ad21ef7313d15b1c7cf20df1e3 \
--hash=sha256:ddc25a0ddd899de44d7f451f4375fb971887e65af51e41e5dcf681f59b8b2c9a
@ -15,7 +19,9 @@ asgiref==3.5.0 \
attrs==21.4.0 \
--hash=sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4 \
--hash=sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd
# via fluent.runtime
# via
# fluent.runtime
# jsonschema
babel==2.9.1 \
--hash=sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9 \
--hash=sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0
@ -114,6 +120,10 @@ charset-normalizer==2.0.12 \
--hash=sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597 \
--hash=sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df
# via requests
click==8.1.3 \
--hash=sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e \
--hash=sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48
# via glean-parser
commonware==0.6.0 \
--hash=sha256:0e9520986e292f2bf8cdf80b32f21ef01e4058fd7baa61d2d282d21ed7085b1f \
--hash=sha256:f596962fd11bc53b5453ffa766dc99f297895021946096d3e6b4826f9ae075ea
@ -154,6 +164,10 @@ deprecated==1.2.13 \
dirsync==2.2.5 \
--hash=sha256:1e3a4cd2b639a2eae5afc03c2b8a003fc43d56a0da5114db579386da9a14a8be
# via -r requirements/prod.in
diskcache==5.4.0 \
--hash=sha256:8879eb8c9b4a2509a5e633d2008634fb2b0b35c2b36192d89655dbde02419644 \
--hash=sha256:af3ec6d7f167bbef7b6c33d9ee22f86d3e8f2dd7131eb7c4703d8d91ccdc0cc4
# via glean-parser
django==3.2.13 \
--hash=sha256:6d93497a0a9bf6ba0e0b1a29cccdc40efbfc76297255b1309b3a884a688ec4b6 \
--hash=sha256:b896ca61edc079eb6bbaa15cf6071eb69d6aac08cce5211583cfb41515644fdf
@ -233,6 +247,10 @@ fluent-syntax==0.17.0 \
# via
# -r requirements/prod.in
# fluent.runtime
glean-parser==5.1.0 \
--hash=sha256:68c22006e961190541e267ab896d0d52a848e3a3caa1ef8ae38447b7447abe1a \
--hash=sha256:f2831b686b16e4b930f4e96e36c5d77b620135b8dea086fdbc38d53adfae1d1d
# via -r requirements/prod.in
greenlet==0.4.17 \
--hash=sha256:1023d7b43ca11264ab7052cb09f5635d4afdb43df55e0854498fc63070a0b206 \
--hash=sha256:124a3ae41215f71dc91d1a3d45cbf2f84e46b543e5d60b99ecc20e24b4c8f272 \
@ -278,13 +296,19 @@ importlib-metadata==4.11.3 \
jinja2==3.0.3 \
--hash=sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8 \
--hash=sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7
# via django-jinja
# via
# django-jinja
# glean-parser
jmespath==0.10.0 \
--hash=sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9 \
--hash=sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f
# via
# boto3
# botocore
jsonschema==4.5.1 \
--hash=sha256:71b5e39324422543546572954ce71c67728922c104902cb7ce252e522235b33f \
--hash=sha256:7c6d882619340c3347a1bf7315e147e6d3dae439033ae6383d6acb908c101dfc
# via glean-parser
lxml==4.8.0 \
--hash=sha256:078306d19a33920004addeb5f4630781aaeabb6a8d01398045fcde085091a169 \
--hash=sha256:0c1978ff1fd81ed9dcbba4f91cf09faf1f8082c9d72eb122e92294716c605428 \
@ -355,48 +379,79 @@ markdown==3.3.6 \
# -r requirements/prod.in
# django-jinja-markdown
# mdx-outline
markupsafe==2.1.1 \
--hash=sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003 \
--hash=sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88 \
--hash=sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5 \
--hash=sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7 \
--hash=sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a \
--hash=sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603 \
--hash=sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1 \
--hash=sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135 \
--hash=sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247 \
--hash=sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6 \
--hash=sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601 \
--hash=sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77 \
--hash=sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02 \
--hash=sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e \
--hash=sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63 \
--hash=sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f \
--hash=sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980 \
--hash=sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b \
--hash=sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812 \
--hash=sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff \
--hash=sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96 \
--hash=sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1 \
--hash=sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925 \
--hash=sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a \
--hash=sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6 \
--hash=sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e \
--hash=sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f \
--hash=sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4 \
--hash=sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f \
--hash=sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3 \
--hash=sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c \
--hash=sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a \
--hash=sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417 \
--hash=sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a \
--hash=sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a \
--hash=sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37 \
--hash=sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452 \
--hash=sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933 \
--hash=sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a \
--hash=sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7
# via jinja2
markupsafe==2.0.1 \
--hash=sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298 \
--hash=sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64 \
--hash=sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b \
--hash=sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194 \
--hash=sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567 \
--hash=sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff \
--hash=sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724 \
--hash=sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74 \
--hash=sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646 \
--hash=sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35 \
--hash=sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6 \
--hash=sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a \
--hash=sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6 \
--hash=sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad \
--hash=sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26 \
--hash=sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38 \
--hash=sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac \
--hash=sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7 \
--hash=sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6 \
--hash=sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047 \
--hash=sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75 \
--hash=sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f \
--hash=sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b \
--hash=sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135 \
--hash=sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8 \
--hash=sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a \
--hash=sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a \
--hash=sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1 \
--hash=sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9 \
--hash=sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864 \
--hash=sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914 \
--hash=sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee \
--hash=sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f \
--hash=sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18 \
--hash=sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8 \
--hash=sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2 \
--hash=sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d \
--hash=sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b \
--hash=sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b \
--hash=sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86 \
--hash=sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6 \
--hash=sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f \
--hash=sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb \
--hash=sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833 \
--hash=sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28 \
--hash=sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e \
--hash=sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415 \
--hash=sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902 \
--hash=sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f \
--hash=sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d \
--hash=sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9 \
--hash=sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d \
--hash=sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145 \
--hash=sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066 \
--hash=sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c \
--hash=sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1 \
--hash=sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a \
--hash=sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207 \
--hash=sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f \
--hash=sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53 \
--hash=sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd \
--hash=sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134 \
--hash=sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85 \
--hash=sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9 \
--hash=sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5 \
--hash=sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94 \
--hash=sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509 \
--hash=sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51 \
--hash=sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872
# via
# glean-parser
# jinja2
mdx_outline @ https://github.com/mozmeao/mdx_outline/archive/refs/tags/python-3.9-compat.tar.gz \
--hash=sha256:c37385f222866684a0a92e3b38588003c6d8c3dbcf55aea854cf543baae425c5
# via -r requirements/prod.in
@ -428,6 +483,10 @@ oauthlib==3.2.0 \
--hash=sha256:23a8208d75b902797ea29fd31fa80a15ed9dc2c6c16fe73f5d346f83f6fa27a2 \
--hash=sha256:6db33440354787f9b7f3a6dbd4febf5d0f93758354060e802f6c06cb493022fe
# via requests-oauthlib
pathspec==0.9.0 \
--hash=sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a \
--hash=sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1
# via yamllint
phonenumberslite==8.12.46 \
--hash=sha256:752555fb0cb9e442054c93fd23ab2ac1b741aea30e6e990be560ef75cac55c21 \
--hash=sha256:93aa86c9e9e4b15dda89c4b0e7b9a3b6b854e009441a941a29d3b0202fa575bd
@ -502,6 +561,29 @@ pyopenssl==22.0.0 \
--hash=sha256:660b1b1425aac4a1bea1d94168a85d99f0b3144c869dd4390d27629d0087f1bf \
--hash=sha256:ea252b38c87425b64116f808355e8da644ef9b07e429398bfece610f893ee2e0
# via -r requirements/prod.in
pyrsistent==0.18.1 \
--hash=sha256:0e3e1fcc45199df76053026a51cc59ab2ea3fc7c094c6627e93b7b44cdae2c8c \
--hash=sha256:1b34eedd6812bf4d33814fca1b66005805d3640ce53140ab8bbb1e2651b0d9bc \
--hash=sha256:4ed6784ceac462a7d6fcb7e9b663e93b9a6fb373b7f43594f9ff68875788e01e \
--hash=sha256:5d45866ececf4a5fff8742c25722da6d4c9e180daa7b405dc0a2a2790d668c26 \
--hash=sha256:636ce2dc235046ccd3d8c56a7ad54e99d5c1cd0ef07d9ae847306c91d11b5fec \
--hash=sha256:6455fc599df93d1f60e1c5c4fe471499f08d190d57eca040c0ea182301321286 \
--hash=sha256:6bc66318fb7ee012071b2792024564973ecc80e9522842eb4e17743604b5e045 \
--hash=sha256:7bfe2388663fd18bd8ce7db2c91c7400bf3e1a9e8bd7d63bf7e77d39051b85ec \
--hash=sha256:7ec335fc998faa4febe75cc5268a9eac0478b3f681602c1f27befaf2a1abe1d8 \
--hash=sha256:914474c9f1d93080338ace89cb2acee74f4f666fb0424896fcfb8d86058bf17c \
--hash=sha256:b568f35ad53a7b07ed9b1b2bae09eb15cdd671a5ba5d2c66caee40dbf91c68ca \
--hash=sha256:cdfd2c361b8a8e5d9499b9082b501c452ade8bbf42aef97ea04854f4a3f43b22 \
--hash=sha256:d1b96547410f76078eaf66d282ddca2e4baae8964364abb4f4dcdde855cd123a \
--hash=sha256:d4d61f8b993a7255ba714df3aca52700f8125289f84f704cf80916517c46eb96 \
--hash=sha256:d7a096646eab884bf8bed965bad63ea327e0d0c38989fc83c5ea7b8a87037bfc \
--hash=sha256:df46c854f490f81210870e509818b729db4488e1f30f2a1ce1698b2295a878d1 \
--hash=sha256:e24a828f57e0c337c8d8bb9f6b12f09dfdf0273da25fda9e314f0b684b415a07 \
--hash=sha256:e4f3149fd5eb9b285d6bfb54d2e5173f6a116fe19172686797c056672689daf6 \
--hash=sha256:e92a52c166426efbe0d1ec1332ee9119b6d32fc1f0bbfd55d5c1088070e7fc1b \
--hash=sha256:f87cc2863ef33c709e237d4b5f4502a62a00fab450c9e020892e8e2ede5847f5 \
--hash=sha256:fd8da6d0124efa2f67d86fa70c851022f87c98e205f0594e1fae044e7119a5a6
# via jsonschema
python-dateutil==2.8.2 \
--hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \
--hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9
@ -559,7 +641,10 @@ pyyaml==6.0 \
--hash=sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a \
--hash=sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174 \
--hash=sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5
# via -r requirements/prod.in
# via
# -r requirements/prod.in
# glean-parser
# yamllint
qrcode==7.3.1 \
--hash=sha256:375a6ff240ca9bd41adc070428b5dfc1dcfbb0f2507f1ac848f6cded38956578
# via -r requirements/prod.in
@ -722,6 +807,9 @@ wrapt==1.14.0 \
--hash=sha256:f0408e2dbad9e82b4c960274214af533f856a199c9274bd4aff55d4634dedc33 \
--hash=sha256:f2f3bc7cd9c9fcd39143f11342eb5963317bd54ecc98e3650ca22704b69d9653
# via deprecated
yamllint==1.26.3 \
--hash=sha256:3934dcde484374596d6b52d8db412929a169f6d9e52e20f9ade5bf3523d9b96e
# via glean-parser
zipp==3.7.0 \
--hash=sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d \
--hash=sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375

Просмотреть файл

@ -65,6 +65,9 @@ module.exports = function (config) {
'tests/unit/spec/firefox/all/all-downloads-unified.js',
'tests/unit/spec/firefox/new/common/thanks.js',
'tests/unit/spec/pocket/mobile-nav.js',
'tests/unit/spec/glean/elements.js',
'tests/unit/spec/glean/page.js',
'tests/unit/spec/glean/utils.js',
'tests/unit/spec/products/vpn/affiliate-attribution.js',
{
pattern: 'node_modules/sinon/pkg/sinon.js',
@ -150,6 +153,11 @@ module.exports = function (config) {
// If browser does not capture in given timeout [ms], kill it
captureTimeout: 60000,
// Supress console logs triggered in code.
client: {
captureConsole: false
},
// Continuous Integration mode
// if true, it capture browsers, run tests and exit
singleRun: true

Просмотреть файл

@ -0,0 +1,170 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
/* For reference read the Jasmine and Sinon docs
* Jasmine docs: https://jasmine.github.io/
* Sinon docs: http://sinonjs.org/docs/
*/
import { testResetGlean } from '@mozilla/glean/testing';
import {
bindElementClicks,
unbindElementClicks
} from '../../../../media/js/glean/elements.es6';
import * as element from '../../../../media/js/libs/glean/element.js';
import { interaction as interactionPing } from '../../../../media/js/libs/glean/pings.js';
describe('elements.js', function () {
beforeEach(async function () {
await testResetGlean('moz-bedrock-test');
bindElementClicks();
});
afterEach(function () {
unbindElementClicks();
});
describe('Element Click (data-cta)', function () {
beforeEach(async function () {
const link =
'<button type="button" class="mzp-c-button glean-test-element" data-cta-text="Subscribe" data-cta-type="button" data-cta-position="primary">Subscribe</button>';
document.body.insertAdjacentHTML('beforeend', link);
});
afterEach(function () {
document
.querySelectorAll('.glean-test-element')
.forEach(function (e) {
e.parentNode.removeChild(e);
});
});
it('should send an interaction ping when element is clicked containing data-cta attributes', async function () {
const ping = interactionPing.testBeforeNextSubmit(
async function () {
const snapshot = await element.clicked.testGetValue();
expect(snapshot.length).toEqual(1);
const click = snapshot[0];
expect(click.extra.label).toEqual('Subscribe');
expect(click.extra.type).toEqual('button');
expect(click.extra.position).toEqual('primary');
}
);
document.querySelector('.glean-test-element').click();
// Wait for the validation to finish.
await expectAsync(ping).toBeResolved();
});
});
describe('Element Click (data-link)', function () {
beforeEach(async function () {
const link =
'<button type="button" class="mzp-c-button glean-test-element" data-link-name="Submit" data-link-type="button" data-link-position="primary">Submit</button>';
document.body.insertAdjacentHTML('beforeend', link);
});
afterEach(function () {
document
.querySelectorAll('.glean-test-element')
.forEach(function (e) {
e.parentNode.removeChild(e);
});
});
it('should send an interaction ping when element is clicked containing data-link attributes', async function () {
const ping = interactionPing.testBeforeNextSubmit(
async function () {
const snapshot = await element.clicked.testGetValue();
expect(snapshot.length).toEqual(1);
const click = snapshot[0];
expect(click.extra.label).toEqual('Submit');
expect(click.extra.type).toEqual('button');
expect(click.extra.position).toEqual('primary');
}
);
document.querySelector('.glean-test-element').click();
// Wait for the validation to finish.
await expectAsync(ping).toBeResolved();
});
});
describe('Firefox Download Click', function () {
beforeEach(async function () {
const link =
'<button type="button" class="mzp-c-button glean-test-element" data-link-type="download" data-download-os="Desktop" data-display-name="macOS" data-download-version="osx" data-download-location="primary">Submit</button>';
document.body.insertAdjacentHTML('beforeend', link);
});
afterEach(function () {
document
.querySelectorAll('.glean-test-element')
.forEach(function (e) {
e.parentNode.removeChild(e);
});
});
it('should send an interaction ping when element is clicked containing data-link attributes', async function () {
const ping = interactionPing.testBeforeNextSubmit(
async function () {
const snapshot = await element.clicked.testGetValue();
expect(snapshot.length).toEqual(1);
const click = snapshot[0];
expect(click.extra.label).toEqual(
'Firefox Download Desktop'
);
expect(click.extra.type).toEqual('macOS');
expect(click.extra.position).toEqual('primary');
}
);
document.querySelector('.glean-test-element').click();
// Wait for the validation to finish.
await expectAsync(ping).toBeResolved();
});
});
describe('Nested element click (data-cta)', function () {
beforeEach(async function () {
const link = `<button type="button" class="mzp-c-button glean-test-element" data-cta-text="Subscribe" data-cta-type="button" data-cta-position="primary">
<span class="child-element">Subscribe</span>
</button>`;
document.body.insertAdjacentHTML('beforeend', link);
});
afterEach(function () {
document
.querySelectorAll('.glean-test-element')
.forEach(function (e) {
e.parentNode.removeChild(e);
});
});
it('should send an interaction ping for a parent element when element a child element is clicked', async function () {
const ping = interactionPing.testBeforeNextSubmit(
async function () {
const snapshot = await element.clicked.testGetValue();
expect(snapshot.length).toEqual(1);
const click = snapshot[0];
expect(click.extra.label).toEqual('Subscribe');
expect(click.extra.type).toEqual('button');
expect(click.extra.position).toEqual('primary');
}
);
document
.querySelector('.glean-test-element > .child-element')
.click();
// Wait for the validation to finish.
await expectAsync(ping).toBeResolved();
});
});
});

Просмотреть файл

@ -0,0 +1,227 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
/* For reference read the Jasmine and Sinon docs
* Jasmine docs: https://jasmine.github.io/
* Sinon docs: http://sinonjs.org/docs/
*/
import * as page from '../../../../media/js/libs/glean/page.js';
import Utils from '../../../../media/js/glean/utils.es6';
import {
initPageView,
pageEventPing
} from '../../../../media/js/glean/page.es6';
import {
pageView as pageViewPing,
interaction as interactionPing,
nonInteraction as nonInteractionPing
} from '../../../../media/js/libs/glean/pings.js';
import { testResetGlean } from '@mozilla/glean/testing';
describe('page.js', function () {
beforeEach(async function () {
await testResetGlean('moz-bedrock-test');
spyOn(Utils, 'getPathFromUrl').and.returnValue('/firefox/new/');
spyOn(Utils, 'getLocaleFromUrl').and.returnValue('en-US');
spyOn(Utils, 'getReferrer').and.returnValue('https://google.com/');
});
it('should register a page view correctly', async function () {
const ping = pageViewPing.testBeforeNextSubmit(async function () {
const path = await page.path.testGetValue();
expect(path).toEqual('/firefox/new/');
const locale = await page.locale.testGetValue();
expect(locale).toEqual('en-US');
const referrer = await page.referrer.testGetValue();
expect(referrer).toEqual('https://google.com/');
});
initPageView();
// Wait for the validation to finish.
await expectAsync(ping).toBeResolved();
});
it('should record specific query parameters in the page view', async function () {
const query =
'utm_source=test-source&utm_campaign=test-campaign&utm_medium=test-medium&utm_content=test-content&entrypoint_experiment=test_entrypoint_experiment&entrypoint_variation=1&experiment=test-experiment&variation=1&v=1&xv=test-xv';
spyOn(Utils, 'getQueryParamsFromURL').and.returnValue(
new window._SearchParams(query)
);
const ping = pageViewPing.testBeforeNextSubmit(async function () {
const source = await page.queryParams['utm_source'].testGetValue();
expect(source).toEqual('test-source');
const campaign = await page.queryParams[
'utm_campaign'
].testGetValue();
expect(campaign).toEqual('test-campaign');
const medium = await page.queryParams['utm_medium'].testGetValue();
expect(medium).toEqual('test-medium');
const content = await page.queryParams[
'utm_content'
].testGetValue();
expect(content).toEqual('test-content');
const entrypointExperiment = await page.queryParams[
'entrypoint_experiment'
].testGetValue();
expect(entrypointExperiment).toEqual('test_entrypoint_experiment');
const entrypointVariation = await page.queryParams[
'entrypoint_variation'
].testGetValue();
expect(entrypointVariation).toEqual('1');
const experiment = await page.queryParams[
'experiment'
].testGetValue();
expect(experiment).toEqual('test-experiment');
const variation = await page.queryParams[
'variation'
].testGetValue();
expect(variation).toEqual('1');
const v = await page.queryParams['v'].testGetValue();
expect(v).toEqual('1');
const xv = await page.queryParams['xv'].testGetValue();
expect(xv).toEqual('test-xv');
});
initPageView();
// Wait for the validation to finish.
await expectAsync(ping).toBeResolved();
});
it('should not record unspecified query params in the page view', async function () {
const query =
'unspecified_param=test-unspecified-param&utm_content=test-content';
spyOn(Utils, 'getQueryParamsFromURL').and.returnValue(
new window._SearchParams(query)
);
const ping = pageViewPing.testBeforeNextSubmit(async function () {
const unspecifiedParam = await page.queryParams[
'unspecified_param'
].testGetValue();
expect(unspecifiedParam).toBeUndefined();
const content = await page.queryParams[
'utm_content'
].testGetValue();
expect(content).toEqual('test-content');
});
initPageView();
// Wait for the validation to finish.
await expectAsync(ping).toBeResolved();
});
it('should decode known params', async function () {
const query = 'utm_source=%25&utm_campaign=%2F';
spyOn(Utils, 'getQueryParamsFromURL').and.returnValue(
new window._SearchParams(query)
);
const ping = pageViewPing.testBeforeNextSubmit(async function () {
const source = await page.queryParams['utm_source'].testGetValue();
expect(source).toEqual('%');
const campaign = await page.queryParams[
'utm_campaign'
].testGetValue();
expect(campaign).toEqual('/');
});
initPageView();
// Wait for the validation to finish.
await expectAsync(ping).toBeResolved();
});
it('should not record known params that contain bad values', async function () {
const query =
'utm_source=<script>yikes</script>&utm_campaign=%5Ctest&utm_medium=%3Ctest&utm_content=test-content&experiment';
spyOn(Utils, 'getQueryParamsFromURL').and.returnValue(
new window._SearchParams(query)
);
const ping = pageViewPing.testBeforeNextSubmit(async function () {
const source = await page.queryParams['utm_source'].testGetValue();
expect(source).toBeUndefined();
const campaign = await page.queryParams[
'utm_campaign'
].testGetValue();
expect(campaign).toBeUndefined();
const medium = await page.queryParams['utm_medium'].testGetValue();
expect(medium).toBeUndefined();
const content = await page.queryParams[
'utm_content'
].testGetValue();
expect(content).toEqual('test-content');
const experiment = await page.queryParams[
'experiment'
].testGetValue();
expect(experiment).toBeUndefined();
});
initPageView();
// Wait for the validation to finish.
await expectAsync(ping).toBeResolved();
});
it('should send a page event (interaction)', async function () {
const ping = interactionPing.testBeforeNextSubmit(async function () {
const snapshot = await page.pageEvent.testGetValue();
expect(snapshot.length).toEqual(1);
const event = snapshot[0];
expect(event.extra.label).toEqual('Newsletter: mozilla-and-you');
expect(event.extra.type).toEqual('Newsletter Signup Success');
});
pageEventPing({
label: 'Newsletter: mozilla-and-you',
type: 'Newsletter Signup Success'
});
// Wait for the validation to finish.
await expectAsync(ping).toBeResolved();
});
it('should send a page event (non-interaction)', async function () {
const ping = nonInteractionPing.testBeforeNextSubmit(async function () {
const snapshot = await page.pageEvent.testGetValue();
expect(snapshot.length).toEqual(1);
const event = snapshot[0];
expect(event.extra.label).toEqual('Auto Play');
expect(event.extra.type).toEqual('Video');
});
pageEventPing({
label: 'Auto Play',
type: 'Video',
nonInteraction: true
});
// Wait for the validation to finish.
await expectAsync(ping).toBeResolved();
});
});

Просмотреть файл

@ -0,0 +1,88 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
/* For reference read the Jasmine and Sinon docs
* Jasmine docs: https://jasmine.github.io/
* Sinon docs: http://sinonjs.org/docs/
*/
import Utils from '../../../../media/js/glean/utils.es6';
describe('utilsjs', function () {
describe('getPathFromUrl', function () {
it('should return the path from a page URL excluding locale', function () {
expect(Utils.getPathFromUrl('/en-US/firefox/new/')).toEqual(
'/firefox/new/'
);
expect(Utils.getPathFromUrl('/de/firefox/new/')).toEqual(
'/firefox/new/'
);
expect(Utils.getPathFromUrl('/kab/firefox/new/')).toEqual(
'/firefox/new/'
);
expect(Utils.getPathFromUrl('/fr/')).toEqual('/');
});
it('should return original path when there is no locale', function () {
expect(Utils.getPathFromUrl('/locales/')).toEqual('/locales/');
});
});
describe('getLocaleFromUrl', function () {
it('should return the locale from a page URL excluding path', function () {
expect(Utils.getLocaleFromUrl('/en-US/firefox/new/')).toEqual(
'en-US'
);
expect(Utils.getLocaleFromUrl('/de/firefox/new/')).toEqual('de');
expect(Utils.getLocaleFromUrl('/kab/firefox/new/')).toEqual('kab');
expect(Utils.getLocaleFromUrl('/fr/')).toEqual('fr');
});
it('should return `en-US` for language when there is no locale', function () {
expect(Utils.getLocaleFromUrl('/locales/')).toEqual('en-US');
});
});
describe('getQueryParamsFromURL', function () {
it('should return an object made up of params from a query string', function () {
const query =
'utm_source=test-source&utm_campaign=test-campaign&utm_medium=test-medium&utm_content=test-content&entrypoint_experiment=test_entrypoint_experiment&entrypoint_variation=1&experiment=test-experiment&variation=1&v=1&xv=test-xv';
expect(Utils.getQueryParamsFromURL(query).params).toEqual({
utm_source: 'test-source',
utm_campaign: 'test-campaign',
utm_medium: 'test-medium',
utm_content: 'test-content',
entrypoint_experiment: 'test_entrypoint_experiment',
entrypoint_variation: 1,
experiment: 'test-experiment',
variation: 1,
v: 1,
xv: 'test-xv'
});
});
});
describe('isTelemetryEnabled', function () {
it('should return true if opt out cookie does not exist', function () {
spyOn(Mozilla.Cookies, 'hasItem').and.returnValue(false);
const result = Utils.isTelemetryEnabled();
expect(Mozilla.Cookies.hasItem).toHaveBeenCalledWith(
'moz-1st-party-data-opt-out'
);
expect(result).toBeTrue();
});
it('should return false if opt out cookie exists', function () {
spyOn(Mozilla.Cookies, 'hasItem').and.returnValue(true);
const result = Utils.isTelemetryEnabled();
expect(Mozilla.Cookies.hasItem).toHaveBeenCalledWith(
'moz-1st-party-data-opt-out'
);
expect(result).toBeFalse();
});
});
});

Просмотреть файл

@ -9,6 +9,7 @@
const BrowserSyncPlugin = require('browser-sync-webpack-plugin');
const CopyPlugin = require('copy-webpack-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const Dotenv = require('dotenv-webpack');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const path = require('path');
const staticBundles = require('./media/static-bundles.json');
@ -97,7 +98,8 @@ const jsConfig = {
to: 'js/careers/libs/'
}
]
})
}),
new Dotenv()
]
};