Source code
Revision control
Copy as Markdown
Other Tools
/* 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,
export const ActionSchemas = {
"console-log": {
title: "Log a message to the console",
type: "object",
required: ["message"],
properties: {
message: {
description: "Message to log to the console",
type: "string",
default: "",
},
},
},
"messaging-experiment": {
title: "Messaging Experiment",
type: "object",
required: ["slug", "branches", "isEnrollmentPaused"],
properties: {
slug: {
description: "Unique identifier for this experiment",
type: "string",
pattern: "^[A-Za-z0-9\\-_]+$",
},
isEnrollmentPaused: {
description: "If true, new users will not be enrolled in the study.",
type: "boolean",
default: true,
},
branches: {
description: "List of experimental branches",
type: "array",
minItems: 1,
items: {
type: "object",
required: ["slug", "value", "ratio", "groups"],
properties: {
slug: {
description:
"Unique identifier for this branch of the experiment.",
type: "string",
pattern: "^[A-Za-z0-9\\-_]+$",
},
value: {
description: "Message content.",
type: "object",
properties: {},
},
ratio: {
description:
"Ratio of users who should be grouped into this branch.",
type: "integer",
minimum: 1,
},
groups: {
description:
"A list of experiment groups that can be used to exclude or select related experiments. May be empty.",
type: "array",
items: {
type: "string",
description: "Identifier of the group",
},
},
},
},
},
},
},
"preference-rollout": {
title: "Change preferences permanently",
type: "object",
required: ["slug", "preferences"],
properties: {
slug: {
description:
"Unique identifer for the rollout, used in telemetry and rollbacks",
type: "string",
pattern: "^[a-z0-9\\-_]+$",
},
preferences: {
description: "The preferences to change, and their values",
type: "array",
minItems: 1,
items: {
type: "object",
required: ["preferenceName", "value"],
properties: {
preferenceName: {
description: "Full dotted-path of the preference being changed",
type: "string",
},
value: {
description: "Value to set the preference to",
type: ["string", "integer", "boolean"],
},
},
},
},
},
},
"preference-rollback": {
title: "Undo a preference rollout",
type: "object",
required: ["rolloutSlug"],
properties: {
rolloutSlug: {
description: "Unique identifer for the rollout to undo",
type: "string",
pattern: "^[a-z0-9\\-_]+$",
},
},
},
"addon-study": {
title: "Enroll a user in an opt-out SHIELD study",
type: "object",
required: [
"name",
"description",
"addonUrl",
"extensionApiId",
"isEnrollmentPaused",
],
properties: {
name: {
description: "User-facing name of the study",
type: "string",
minLength: 1,
},
description: {
description: "User-facing description of the study",
type: "string",
minLength: 1,
},
addonUrl: {
description: "URL of the add-on XPI file",
type: "string",
format: "uri",
minLength: 1,
},
extensionApiId: {
description:
"The record ID of the extension used for Normandy API calls.",
type: "integer",
},
isEnrollmentPaused: {
description: "If true, new users will not be enrolled in the study.",
type: "boolean",
default: true,
},
},
},
"addon-rollout": {
title: "Install add-on permanently",
type: "object",
required: ["extensionApiId", "slug"],
properties: {
extensionApiId: {
description:
"The record ID of the extension used for Normandy API calls.",
type: "integer",
},
slug: {
description:
"Unique identifer for the rollout, used in telemetry and rollbacks.",
type: "string",
pattern: "^[a-z0-9\\-_]+$",
},
},
},
"addon-rollback": {
title: "Undo an add-on rollout",
type: "object",
required: ["rolloutSlug"],
properties: {
rolloutSlug: {
description: "Unique identifer for the rollout to undo.",
type: "string",
pattern: "^[a-z0-9\\-_]+$",
},
},
},
"branched-addon-study": {
title: "Enroll a user in an add-on experiment, with managed branches",
type: "object",
required: [
"slug",
"userFacingName",
"userFacingDescription",
"branches",
"isEnrollmentPaused",
],
properties: {
slug: {
description: "Machine-readable identifier",
type: "string",
minLength: 1,
},
userFacingName: {
description: "User-facing name of the study",
type: "string",
minLength: 1,
},
userFacingDescription: {
description: "User-facing description of the study",
type: "string",
minLength: 1,
},
isEnrollmentPaused: {
description: "If true, new users will not be enrolled in the study.",
type: "boolean",
default: true,
},
branches: {
description: "List of experimental branches",
type: "array",
minItems: 1,
items: {
type: "object",
required: ["slug", "ratio", "extensionApiId"],
properties: {
slug: {
description:
"Unique identifier for this branch of the experiment.",
type: "string",
pattern: "^[A-Za-z0-9\\-_]+$",
},
ratio: {
description:
"Ratio of users who should be grouped into this branch.",
type: "integer",
minimum: 1,
},
extensionApiId: {
description:
"The record ID of the add-on uploaded to the Normandy server. May be null, in which case no add-on will be installed.",
type: ["number", "null"],
default: null,
},
},
},
},
},
},
"show-heartbeat": {
title: "Show a Heartbeat survey.",
description: "This action shows a single survey.",
type: "object",
required: [
"surveyId",
"message",
"thanksMessage",
"postAnswerUrl",
"learnMoreMessage",
"learnMoreUrl",
],
properties: {
repeatOption: {
type: "string",
enum: ["once", "xdays", "nag"],
description: "Determines how often a prompt is shown executes.",
default: "once",
},
repeatEvery: {
description:
"For repeatOption=xdays, how often (in days) the prompt is displayed.",
default: null,
type: ["number", "null"],
},
includeTelemetryUUID: {
type: "boolean",
description: "Include unique user ID in post-answer-url and Telemetry",
default: false,
},
surveyId: {
type: "string",
description: "Slug uniquely identifying this survey in telemetry",
},
message: {
description: "Message to show to the user",
type: "string",
},
engagementButtonLabel: {
description:
"Text for the engagement button. If specified, this button will be shown instead of rating stars.",
default: null,
type: ["string", "null"],
},
thanksMessage: {
description:
"Thanks message to show to the user after they've rated Firefox",
type: "string",
},
postAnswerUrl: {
description:
"URL to redirect the user to after rating Firefox or clicking the engagement button",
default: null,
type: ["string", "null"],
},
learnMoreMessage: {
description: "Message to show to the user to learn more",
default: null,
type: ["string", "null"],
},
learnMoreUrl: {
description: "URL to show to the user when they click Learn More",
default: null,
type: ["string", "null"],
},
},
},
"multi-preference-experiment": {
title: "Run a feature experiment activated by a set of preferences.",
type: "object",
required: [
"slug",
"userFacingName",
"userFacingDescription",
"branches",
"isEnrollmentPaused",
],
properties: {
slug: {
description: "Unique identifier for this experiment",
type: "string",
pattern: "^[A-Za-z0-9\\-_]+$",
},
userFacingName: {
description: "User-facing name of the experiment",
type: "string",
minLength: 1,
},
userFacingDescription: {
description: "User-facing description of the experiment",
type: "string",
minLength: 1,
},
experimentDocumentUrl: {
description: "URL of a document describing the experiment",
type: "string",
format: "uri",
default: "",
},
isHighPopulation: {
description:
"Marks the preference experiment as a high population experiment, that should be excluded from certain types of telemetry",
type: "boolean",
default: "false",
},
isEnrollmentPaused: {
description: "If true, new users will not be enrolled in the study.",
type: "boolean",
default: true,
},
branches: {
description: "List of experimental branches",
type: "array",
minItems: 1,
items: {
type: "object",
required: ["slug", "ratio", "preferences"],
properties: {
slug: {
description:
"Unique identifier for this branch of the experiment",
type: "string",
pattern: "^[A-Za-z0-9\\-_]+$",
},
ratio: {
description:
"Ratio of users who should be grouped into this branch",
type: "integer",
minimum: 1,
},
preferences: {
description:
"The set of preferences to be set if this branch is chosen",
type: "object",
patternProperties: {
".*": {
type: "object",
properties: {
preferenceType: {
description:
"Data type of the preference that controls this experiment",
type: "string",
enum: ["string", "integer", "boolean"],
},
preferenceBranchType: {
description:
"Controls whether the default or user value of the preference is modified",
type: "string",
enum: ["user", "default"],
default: "default",
},
preferenceValue: {
description:
"Value for this preference when this branch is chosen",
type: ["string", "number", "boolean"],
},
},
required: [
"preferenceType",
"preferenceBranchType",
"preferenceValue",
],
},
},
},
},
},
},
},
},
"single-preference-experiment": {
title: "Run a feature experiment activated by a preference.",
type: "object",
required: [
"slug",
"preferenceName",
"preferenceType",
"branches",
"isEnrollmentPaused",
],
properties: {
slug: {
description: "Unique identifier for this experiment",
type: "string",
pattern: "^[A-Za-z0-9\\-_]+$",
},
experimentDocumentUrl: {
description: "URL of a document describing the experiment",
type: "string",
format: "uri",
default: "",
},
preferenceName: {
description:
"Full dotted-path of the preference that controls this experiment",
type: "string",
},
preferenceType: {
description:
"Data type of the preference that controls this experiment",
type: "string",
enum: ["string", "integer", "boolean"],
},
preferenceBranchType: {
description:
"Controls whether the default or user value of the preference is modified",
type: "string",
enum: ["user", "default"],
default: "default",
},
isHighPopulation: {
description:
"Marks the preference experiment as a high population experiment, that should be excluded from certain types of telemetry",
type: "boolean",
default: "false",
},
isEnrollmentPaused: {
description: "If true, new users will not be enrolled in the study.",
type: "boolean",
default: true,
},
branches: {
description: "List of experimental branches",
type: "array",
minItems: 1,
items: {
type: "object",
required: ["slug", "value", "ratio"],
properties: {
slug: {
description:
"Unique identifier for this branch of the experiment",
type: "string",
pattern: "^[A-Za-z0-9\\-_]+$",
},
value: {
description: "Value to set the preference to for this branch",
type: ["string", "number", "boolean"],
},
ratio: {
description:
"Ratio of users who should be grouped into this branch",
type: "integer",
minimum: 1,
},
},
},
},
},
},
};
// Legacy name used on Normandy server
ActionSchemas["opt-out-study"] = ActionSchemas["addon-study"];
// If running in Node.js, export the schemas.
if (typeof module !== "undefined") {
/* globals module */
module.exports = ActionSchemas;
}