@delmaredigital/payload-experiments 0.1.0-rc.6 → 0.2.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -0
- package/dist/admin/LayerUsage.d.ts +1 -1
- package/dist/admin/LayerUsage.js +23 -11
- package/dist/admin/MetricSourceSelect.js +2 -1
- package/dist/admin/TestsNavLink.d.ts +1 -0
- package/dist/admin/TestsNavLink.js +30 -0
- package/dist/admin/allocation.model.js +1 -1
- package/dist/admin/copy/actions.d.ts +0 -2
- package/dist/admin/copy/actions.js +0 -2
- package/dist/admin/copy/advanced.d.ts +55 -0
- package/dist/admin/copy/advanced.js +55 -0
- package/dist/admin/copy/armSelect.js +1 -1
- package/dist/admin/copy/arms.d.ts +0 -13
- package/dist/admin/copy/arms.js +0 -13
- package/dist/admin/copy/{who.d.ts → audience.d.ts} +1 -9
- package/dist/admin/copy/{who.js → audience.js} +1 -9
- package/dist/admin/copy/history.d.ts +0 -4
- package/dist/admin/copy/history.js +3 -7
- package/dist/admin/copy/metrics.d.ts +2 -2
- package/dist/admin/copy/metrics.js +2 -2
- package/dist/admin/copy/newTest.d.ts +32 -0
- package/dist/admin/copy/newTest.js +32 -0
- package/dist/admin/copy/readiness.d.ts +45 -0
- package/dist/admin/copy/readiness.js +50 -0
- package/dist/admin/copy/recommendation.d.ts +26 -0
- package/dist/admin/copy/recommendation.js +25 -0
- package/dist/admin/copy/results.d.ts +0 -1
- package/dist/admin/copy/results.js +0 -1
- package/dist/admin/copy/review.d.ts +0 -17
- package/dist/admin/copy/review.js +1 -112
- package/dist/admin/copy/setting.d.ts +10 -0
- package/dist/admin/copy/setting.js +10 -0
- package/dist/admin/copy/surface.d.ts +36 -0
- package/dist/admin/copy/surface.js +47 -0
- package/dist/admin/copy/testPage.d.ts +88 -0
- package/dist/admin/copy/testPage.js +88 -0
- package/dist/admin/paths.d.ts +5 -13
- package/dist/admin/paths.js +5 -13
- package/dist/admin/review/review.model.d.ts +3 -26
- package/dist/admin/review/review.model.js +3 -30
- package/dist/admin/surface/ResultsRoute.d.ts +7 -0
- package/dist/admin/surface/ResultsRoute.js +58 -0
- package/dist/admin/surface/SurfaceShell.d.ts +6 -0
- package/dist/admin/surface/SurfaceShell.js +35 -0
- package/dist/admin/surface/TestsHome.d.ts +4 -0
- package/dist/admin/surface/TestsHome.js +212 -0
- package/dist/admin/surface/TestsSurface.d.ts +2 -0
- package/dist/admin/surface/TestsSurface.js +36 -0
- package/dist/admin/surface/contracts.d.ts +48 -0
- package/dist/admin/surface/contracts.js +8 -0
- package/dist/admin/surface/home.model.d.ts +41 -0
- package/dist/admin/surface/home.model.js +59 -0
- package/dist/admin/surface/newTest/NewTest.d.ts +7 -0
- package/dist/admin/surface/newTest/NewTest.js +355 -0
- package/dist/admin/surface/newTest/newTest.css +9 -0
- package/dist/admin/surface/pageBlock/pageBlock.model.d.ts +6 -0
- package/dist/admin/surface/pageBlock/pageBlock.model.js +8 -0
- package/dist/admin/surface/pageBlock/parts.d.ts +2 -0
- package/dist/admin/surface/pageBlock/parts.js +64 -0
- package/dist/admin/surface/readiness/ActionDialogs.d.ts +15 -0
- package/dist/admin/surface/readiness/ActionDialogs.js +274 -0
- package/dist/admin/surface/readiness/Banner.d.ts +2 -0
- package/dist/admin/surface/readiness/Banner.js +138 -0
- package/dist/admin/surface/readiness/SaveStatus.d.ts +4 -0
- package/dist/admin/surface/readiness/SaveStatus.js +50 -0
- package/dist/admin/surface/readiness/parts.d.ts +2 -0
- package/dist/admin/surface/readiness/parts.js +9 -0
- package/dist/admin/surface/readiness/readiness.model.d.ts +22 -0
- package/dist/admin/surface/readiness/readiness.model.js +107 -0
- package/dist/admin/surface/readiness/useTransition.d.ts +10 -0
- package/dist/admin/surface/readiness/useTransition.js +34 -0
- package/dist/admin/surface/results/ResultsBody.d.ts +7 -0
- package/dist/admin/surface/results/ResultsBody.js +262 -0
- package/dist/admin/surface/results/recommendation.model.d.ts +12 -0
- package/dist/admin/surface/results/recommendation.model.js +59 -0
- package/dist/admin/surface/results/useResults.d.ts +56 -0
- package/dist/admin/surface/results/useResults.js +183 -0
- package/dist/admin/surface/setting/parts.d.ts +3 -0
- package/dist/admin/surface/setting/parts.js +263 -0
- package/dist/admin/surface/setting/setting.css +29 -0
- package/dist/admin/surface/setting/setting.model.d.ts +8 -0
- package/dist/admin/surface/setting/setting.model.js +25 -0
- package/dist/admin/surface/surface.css +50 -0
- package/dist/admin/surface/test/AdvancedSection.d.ts +2 -0
- package/dist/admin/surface/test/AdvancedSection.js +153 -0
- package/dist/admin/surface/test/GoalSection.d.ts +2 -0
- package/dist/admin/surface/test/GoalSection.js +198 -0
- package/dist/admin/surface/test/LengthSection.d.ts +2 -0
- package/dist/admin/surface/test/LengthSection.js +87 -0
- package/dist/admin/surface/test/Section.d.ts +7 -0
- package/dist/admin/surface/test/Section.js +27 -0
- package/dist/admin/surface/test/TargetingSection.d.ts +2 -0
- package/dist/admin/surface/test/TargetingSection.js +164 -0
- package/dist/admin/surface/test/TestHeader.d.ts +4 -0
- package/dist/admin/surface/test/TestHeader.js +69 -0
- package/dist/admin/surface/test/TestPage.d.ts +7 -0
- package/dist/admin/surface/test/TestPage.js +84 -0
- package/dist/admin/surface/test/VersionsSection.d.ts +4 -0
- package/dist/admin/surface/test/VersionsSection.js +208 -0
- package/dist/admin/surface/test/fields.d.ts +55 -0
- package/dist/admin/surface/test/fields.js +185 -0
- package/dist/admin/surface/test/pageParts.d.ts +2 -0
- package/dist/admin/surface/test/pageParts.js +39 -0
- package/dist/admin/surface/test/testPage.css +23 -0
- package/dist/admin/surface/test/testPage.model.d.ts +17 -0
- package/dist/admin/surface/test/testPage.model.js +53 -0
- package/dist/admin/surface/testDocument.model.d.ts +39 -0
- package/dist/admin/surface/testDocument.model.js +61 -0
- package/dist/admin/surface/useTestDocument.d.ts +22 -0
- package/dist/admin/surface/useTestDocument.js +345 -0
- package/dist/admin/targeting/targeting.model.js +2 -2
- package/dist/admin/useLayerUsage.d.ts +0 -5
- package/dist/admin/useLayerUsage.js +1 -39
- package/dist/admin/views/CollectionEditRedirect.d.ts +4 -0
- package/dist/admin/views/CollectionEditRedirect.js +14 -0
- package/dist/admin/views/CollectionListRedirect.d.ts +2 -0
- package/dist/admin/views/CollectionListRedirect.js +8 -0
- package/dist/admin/views/ExperimentsRootView.d.ts +2 -0
- package/dist/admin/views/ExperimentsRootView.js +175 -0
- package/dist/admin/views/access.model.d.ts +7 -0
- package/dist/admin/views/access.model.js +5 -0
- package/dist/collections/experiments/config.js +18 -125
- package/dist/collections/experiments/createDefaults.js +6 -0
- package/dist/collections/experiments/flagControlParams.js +8 -14
- package/dist/collections/layers.js +45 -13
- package/dist/collections/metrics.js +70 -14
- package/dist/collections/serialize.js +4 -1
- package/dist/db/snapshots.d.ts +2 -1
- package/dist/db/snapshots.js +2 -2
- package/dist/endpoints/results.js +7 -0
- package/dist/endpoints/summary.d.ts +1 -1
- package/dist/endpoints/summary.js +37 -1
- package/dist/exports/adminClient.d.ts +2 -13
- package/dist/exports/adminClient.js +2 -13
- package/dist/exports/index.d.ts +1 -1
- package/dist/exports/rsc.d.ts +3 -0
- package/dist/exports/rsc.js +3 -0
- package/dist/options.js +29 -0
- package/dist/plugin.js +25 -0
- package/dist/puck/editor/CreateExperimentDrawer.d.ts +2 -1
- package/dist/puck/editor/CreateExperimentDrawer.js +17 -57
- package/dist/puck/editor/ExperimentSlotEditor.js +6 -0
- package/dist/puck/editor/copy.d.ts +10 -9
- package/dist/puck/editor/copy.js +11 -10
- package/dist/puck/editor/createTest.d.ts +7 -0
- package/dist/puck/editor/createTest.js +50 -0
- package/dist/puck/editor/editor.model.d.ts +28 -1
- package/dist/puck/editor/editor.model.js +61 -0
- package/dist/results/analyse.js +4 -1
- package/dist/results/verdict.d.ts +1 -0
- package/dist/results/verdict.js +7 -4
- package/dist/transitions/checkStart.d.ts +1 -0
- package/dist/transitions/placements.d.ts +5 -1
- package/dist/transitions/placements.js +14 -7
- package/dist/transitions/preflightData.d.ts +7 -1
- package/dist/transitions/preflightData.js +199 -148
- package/dist/transitions/start.js +2 -2
- package/dist/types/admin.d.ts +1 -0
- package/dist/types/contracts.d.ts +17 -0
- package/dist/types/endpoints.d.ts +11 -1
- package/dist/types/snapshot.d.ts +1 -0
- package/dist/types/surface.d.ts +29 -0
- package/dist/types/surface.js +1 -0
- package/package.json +1 -1
- package/dist/access.d.ts +0 -1
- package/dist/access.js +0 -2
- package/dist/admin/AllocationField.d.ts +0 -2
- package/dist/admin/AllocationField.js +0 -80
- package/dist/admin/FlagPointSelect.d.ts +0 -2
- package/dist/admin/FlagPointSelect.js +0 -54
- package/dist/admin/LockedFieldNotice.d.ts +0 -2
- package/dist/admin/LockedFieldNotice.js +0 -26
- package/dist/admin/PhaseHistory.d.ts +0 -2
- package/dist/admin/PhaseHistory.js +0 -76
- package/dist/admin/StatusCell.d.ts +0 -3
- package/dist/admin/StatusCell.js +0 -19
- package/dist/admin/SummaryCell.d.ts +0 -2
- package/dist/admin/SummaryCell.js +0 -32
- package/dist/admin/actions/AddMetricDialog.d.ts +0 -6
- package/dist/admin/actions/AddMetricDialog.js +0 -138
- package/dist/admin/actions/AllocateDialog.d.ts +0 -6
- package/dist/admin/actions/AllocateDialog.js +0 -81
- package/dist/admin/actions/ExperimentActions.d.ts +0 -3
- package/dist/admin/actions/ExperimentActions.js +0 -110
- package/dist/admin/arms/ArmsField.d.ts +0 -2
- package/dist/admin/arms/ArmsField.js +0 -310
- package/dist/admin/arms/ParamsEditor.d.ts +0 -16
- package/dist/admin/arms/ParamsEditor.js +0 -79
- package/dist/admin/copy/tabs.d.ts +0 -7
- package/dist/admin/copy/tabs.js +0 -7
- package/dist/admin/permissions.model.d.ts +0 -10
- package/dist/admin/permissions.model.js +0 -4
- package/dist/admin/phaseHistory.model.d.ts +0 -19
- package/dist/admin/phaseHistory.model.js +0 -19
- package/dist/admin/results/ResultsView.d.ts +0 -3
- package/dist/admin/results/ResultsView.js +0 -312
- package/dist/admin/review/ReviewPanel.d.ts +0 -2
- package/dist/admin/review/ReviewPanel.js +0 -268
- package/dist/admin/summaryBatcher.d.ts +0 -8
- package/dist/admin/summaryBatcher.js +0 -33
- package/dist/admin/targeting/TargetingAttributeField.d.ts +0 -2
- package/dist/admin/targeting/TargetingAttributeField.js +0 -31
- package/dist/admin/targeting/TargetingOpField.d.ts +0 -2
- package/dist/admin/targeting/TargetingOpField.js +0 -45
- package/dist/admin/targeting/TargetingValueField.d.ts +0 -2
- package/dist/admin/targeting/TargetingValueField.js +0 -142
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -4
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# @delmaredigital/payload-experiments
|
|
2
2
|
|
|
3
|
+
> ⚠️ Upgrading to 0.2? After upgrading, run `payload generate:importmap`: the Tests surface is registered through admin.dependencies, and without it the Tests routes show a 'not installed' message instead of the Tests screen. The old experiments edit-form components are gone from `/admin/client`, and the `xp-experiments` admin list and edit views now redirect to the Tests surface.
|
|
4
|
+
|
|
3
5
|
A/B testing for Payload CMS and Next.js, with results inside the admin and data
|
|
4
6
|
in your own Postgres database. Editors can test blocks, whole pages and
|
|
5
7
|
registered flag points, choose a winner, and make it the permanent content.
|
|
@@ -387,6 +389,32 @@ are recorded with `trackConversion`. Beacon conversions for a non-writable name
|
|
|
387
389
|
are dropped silently. Only listed names become `events:<name>` sources. They
|
|
388
390
|
support visitor and user units and do not represent counts or revenue in v1.
|
|
389
391
|
|
|
392
|
+
### `admin` options
|
|
393
|
+
|
|
394
|
+
Host links and kind descriptions are optional. For a host using payload-puck's
|
|
395
|
+
editor route and a `puck-templates` collection, pass:
|
|
396
|
+
|
|
397
|
+
```ts
|
|
398
|
+
admin: {
|
|
399
|
+
editorUrl: ({ collection, id, draft }) =>
|
|
400
|
+
`/admin/puck-editor/${encodeURIComponent(collection)}/${encodeURIComponent(String(id))}`,
|
|
401
|
+
previewUrl: ({ id }) => `/preview/template/${encodeURIComponent(String(id))}`,
|
|
402
|
+
descriptions: {
|
|
403
|
+
block: 'Try different content on a landing page.',
|
|
404
|
+
document: 'Try different versions of a donation ask.',
|
|
405
|
+
setting: 'Try a different signup or donation prompt.',
|
|
406
|
+
},
|
|
407
|
+
}
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
Use your host's preview route for `previewUrl`. Preflight resolves both URL
|
|
411
|
+
callbacks on the server for block placements; it passes only URL strings to the
|
|
412
|
+
client. Missing or failed callbacks leave the URL unset, and the client uses the
|
|
413
|
+
admin collection route when no editor URL is supplied. Kind descriptions are
|
|
414
|
+
available to the server views through `config.custom.xp`.
|
|
415
|
+
|
|
416
|
+
A flag point can also declare `description?: string` to explain the setting below its label.
|
|
417
|
+
|
|
390
418
|
## Security
|
|
391
419
|
|
|
392
420
|
The unit cookie, assignments header, request-context header and preview tokens
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import type { UIFieldClientProps } from 'payload';
|
|
2
|
-
export declare function LayerUsage(
|
|
2
|
+
export declare function LayerUsage({ field, path }: UIFieldClientProps): import("react").JSX.Element;
|
package/dist/admin/LayerUsage.js
CHANGED
|
@@ -1,24 +1,36 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useDocumentInfo } from '@payloadcms/ui';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { FieldDescription, FieldLabel, useDocumentInfo } from '@payloadcms/ui';
|
|
4
4
|
import { useLayerExperiments } from './useLayerUsage.js';
|
|
5
5
|
import { statusLabel } from './labels.js';
|
|
6
6
|
import { HISTORY_COPY, layerRow, layerSummary } from './copy/history.js';
|
|
7
|
-
export function LayerUsage(
|
|
7
|
+
export function LayerUsage({ field, path }) {
|
|
8
8
|
const { id } = useDocumentInfo();
|
|
9
9
|
const usage = useLayerExperiments(id ?? null);
|
|
10
|
-
if (id == null || !usage) return null;
|
|
11
10
|
return /*#__PURE__*/ _jsxs("section", {
|
|
12
11
|
"aria-label": HISTORY_COPY.layers,
|
|
13
12
|
children: [
|
|
14
|
-
/*#__PURE__*/ _jsx(
|
|
15
|
-
|
|
13
|
+
/*#__PURE__*/ _jsx(FieldLabel, {
|
|
14
|
+
as: "h3",
|
|
15
|
+
label: field.label,
|
|
16
|
+
path: path
|
|
16
17
|
}),
|
|
17
|
-
/*#__PURE__*/ _jsx(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
/*#__PURE__*/ _jsx(FieldDescription, {
|
|
19
|
+
description: field.admin?.description,
|
|
20
|
+
path: path
|
|
21
|
+
}),
|
|
22
|
+
usage ? /*#__PURE__*/ _jsxs(_Fragment, {
|
|
23
|
+
children: [
|
|
24
|
+
/*#__PURE__*/ _jsx("p", {
|
|
25
|
+
children: layerSummary(usage.used, usage.free)
|
|
26
|
+
}),
|
|
27
|
+
/*#__PURE__*/ _jsx("ul", {
|
|
28
|
+
children: usage.rows.map((row, index)=>/*#__PURE__*/ _jsx("li", {
|
|
29
|
+
children: layerRow(row.name, statusLabel(row.status), row.slices)
|
|
30
|
+
}, index))
|
|
31
|
+
})
|
|
32
|
+
]
|
|
33
|
+
}) : null
|
|
22
34
|
]
|
|
23
35
|
});
|
|
24
36
|
}
|
|
@@ -15,7 +15,8 @@ export function MetricSourceSelect({ path, field, readOnly }) {
|
|
|
15
15
|
/*#__PURE__*/ _jsx(SelectInput, {
|
|
16
16
|
path: path,
|
|
17
17
|
name: path,
|
|
18
|
-
label: METRICS_COPY.source,
|
|
18
|
+
label: field.label ?? METRICS_COPY.source,
|
|
19
|
+
description: field.admin?.description,
|
|
19
20
|
required: field.required,
|
|
20
21
|
options: metricSourceOptions(sources),
|
|
21
22
|
value: value ?? '',
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function TestsNavLink(): import("react").JSX.Element;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Link, useConfig } from '@payloadcms/ui';
|
|
4
|
+
import { formatAdminURL } from 'payload/shared';
|
|
5
|
+
import { usePathname } from 'next/navigation.js';
|
|
6
|
+
import { SURFACE_COPY } from './copy/surface.js';
|
|
7
|
+
export function TestsNavLink() {
|
|
8
|
+
const { config } = useConfig();
|
|
9
|
+
const path = usePathname();
|
|
10
|
+
const href = formatAdminURL({
|
|
11
|
+
adminRoute: config.routes.admin,
|
|
12
|
+
path: '/experiments'
|
|
13
|
+
});
|
|
14
|
+
const base = href.replace(/\/$/, '');
|
|
15
|
+
const active = path === base || path?.startsWith(`${base}/`);
|
|
16
|
+
return /*#__PURE__*/ _jsxs(Link, {
|
|
17
|
+
href: href,
|
|
18
|
+
className: "nav__link",
|
|
19
|
+
"aria-current": active ? 'page' : undefined,
|
|
20
|
+
children: [
|
|
21
|
+
active ? /*#__PURE__*/ _jsx("div", {
|
|
22
|
+
className: "nav__link-indicator"
|
|
23
|
+
}) : null,
|
|
24
|
+
/*#__PURE__*/ _jsx("span", {
|
|
25
|
+
className: "nav__link-label",
|
|
26
|
+
children: SURFACE_COPY.title
|
|
27
|
+
})
|
|
28
|
+
]
|
|
29
|
+
});
|
|
30
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { armLabel } from './labels.js';
|
|
2
2
|
import { LOCKED_MESSAGES } from './copy/common.js';
|
|
3
|
-
import { eachVersion, groupShare, holdoutClause, layerSentence, participation, peopleLabel, uncounted } from './copy/
|
|
3
|
+
import { eachVersion, groupShare, holdoutClause, layerSentence, participation, peopleLabel, uncounted } from './copy/audience.js';
|
|
4
4
|
const percent = (value)=>String(Math.round(value * 10) / 10);
|
|
5
5
|
export function allocationSentence({ allocation, unitType, arms, layer, status }) {
|
|
6
6
|
const groups = arms.filter((group)=>group.kind !== 'holdout');
|
|
@@ -8,8 +8,6 @@ export declare const ACTIONS_COPY: {
|
|
|
8
8
|
readonly finish: "Finish archiving";
|
|
9
9
|
readonly archive: "Archive";
|
|
10
10
|
readonly discard: "Discard winner";
|
|
11
|
-
readonly deleteNoteArchived: "Deleting removes this experiment's records and results. A winner that was already made permanent stays in place.";
|
|
12
|
-
readonly deleteNoteDraft: "Deleting removes this experiment and its settings.";
|
|
13
11
|
readonly startBody: "Start this experiment?";
|
|
14
12
|
readonly restartBody: "Starting again begins a new round; results restart.";
|
|
15
13
|
readonly stopBody: "Everyone will see the Original. Starting again begins a new round; results restart.";
|
|
@@ -8,8 +8,6 @@ export const ACTIONS_COPY = {
|
|
|
8
8
|
finish: 'Finish archiving',
|
|
9
9
|
archive: 'Archive',
|
|
10
10
|
discard: 'Discard winner',
|
|
11
|
-
deleteNoteArchived: "Deleting removes this experiment's records and results. A winner that was already made permanent stays in place.",
|
|
12
|
-
deleteNoteDraft: 'Deleting removes this experiment and its settings.',
|
|
13
11
|
startBody: 'Start this experiment?',
|
|
14
12
|
restartBody: 'Starting again begins a new round; results restart.',
|
|
15
13
|
stopBody: 'Everyone will see the Original. Starting again begins a new round; results restart.',
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export declare const ADVANCED_COPY: {
|
|
2
|
+
readonly exposurePolicy: {
|
|
3
|
+
readonly label: "Exposure policy";
|
|
4
|
+
readonly help: "Choose when a person is counted as seeing a version.";
|
|
5
|
+
};
|
|
6
|
+
readonly policies: {
|
|
7
|
+
readonly render: "When rendered";
|
|
8
|
+
readonly viewport: "When visible";
|
|
9
|
+
readonly pageview: "On a page visit";
|
|
10
|
+
readonly manual: "When the host records it";
|
|
11
|
+
};
|
|
12
|
+
readonly method: {
|
|
13
|
+
readonly label: "Analysis method";
|
|
14
|
+
readonly help: "Sequential testing supports ongoing checks; Bayesian testing compares probabilities.";
|
|
15
|
+
};
|
|
16
|
+
readonly cuped: {
|
|
17
|
+
readonly label: "CUPED";
|
|
18
|
+
readonly help: "Use earlier activity when available to reduce noise in the results.";
|
|
19
|
+
};
|
|
20
|
+
readonly minExposuresPerArm: {
|
|
21
|
+
readonly label: "Minimum people per version";
|
|
22
|
+
readonly help: "Wait for at least this many people in each version before a decision.";
|
|
23
|
+
};
|
|
24
|
+
readonly attributionWindowHours: {
|
|
25
|
+
readonly label: "Attribution window (hours)";
|
|
26
|
+
readonly help: "Count outcomes within this many hours after someone first sees a version.";
|
|
27
|
+
};
|
|
28
|
+
readonly sequentialTuningParameter: {
|
|
29
|
+
readonly label: "Sequential tuning parameter";
|
|
30
|
+
readonly help: "Set the expected sample size used to tune sequential testing.";
|
|
31
|
+
};
|
|
32
|
+
readonly layer: {
|
|
33
|
+
readonly label: "Layer";
|
|
34
|
+
readonly help: "A layer keeps tests from sharing the same people and is chosen at creation.";
|
|
35
|
+
};
|
|
36
|
+
readonly slug: {
|
|
37
|
+
readonly label: "Slug";
|
|
38
|
+
readonly help: "This permanent identifier connects the test to its content.";
|
|
39
|
+
};
|
|
40
|
+
readonly kind: {
|
|
41
|
+
readonly label: "Kind";
|
|
42
|
+
readonly help: "The kind determines where versions live and is chosen at creation.";
|
|
43
|
+
};
|
|
44
|
+
readonly unitType: {
|
|
45
|
+
readonly label: "Unit type";
|
|
46
|
+
readonly help: "Count visitors or signed-in users, as chosen at creation.";
|
|
47
|
+
};
|
|
48
|
+
readonly inheritedWindow: "Use each goal's window";
|
|
49
|
+
readonly automaticTuning: "Automatic (5,000)";
|
|
50
|
+
readonly sequential: "Sequential";
|
|
51
|
+
readonly bayesian: "Bayesian";
|
|
52
|
+
readonly auto: "Automatic";
|
|
53
|
+
readonly off: "Off";
|
|
54
|
+
readonly none: "None";
|
|
55
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export const ADVANCED_COPY = {
|
|
2
|
+
exposurePolicy: {
|
|
3
|
+
label: 'Exposure policy',
|
|
4
|
+
help: 'Choose when a person is counted as seeing a version.'
|
|
5
|
+
},
|
|
6
|
+
policies: {
|
|
7
|
+
render: 'When rendered',
|
|
8
|
+
viewport: 'When visible',
|
|
9
|
+
pageview: 'On a page visit',
|
|
10
|
+
manual: 'When the host records it'
|
|
11
|
+
},
|
|
12
|
+
method: {
|
|
13
|
+
label: 'Analysis method',
|
|
14
|
+
help: 'Sequential testing supports ongoing checks; Bayesian testing compares probabilities.'
|
|
15
|
+
},
|
|
16
|
+
cuped: {
|
|
17
|
+
label: 'CUPED',
|
|
18
|
+
help: 'Use earlier activity when available to reduce noise in the results.'
|
|
19
|
+
},
|
|
20
|
+
minExposuresPerArm: {
|
|
21
|
+
label: 'Minimum people per version',
|
|
22
|
+
help: 'Wait for at least this many people in each version before a decision.'
|
|
23
|
+
},
|
|
24
|
+
attributionWindowHours: {
|
|
25
|
+
label: 'Attribution window (hours)',
|
|
26
|
+
help: 'Count outcomes within this many hours after someone first sees a version.'
|
|
27
|
+
},
|
|
28
|
+
sequentialTuningParameter: {
|
|
29
|
+
label: 'Sequential tuning parameter',
|
|
30
|
+
help: 'Set the expected sample size used to tune sequential testing.'
|
|
31
|
+
},
|
|
32
|
+
layer: {
|
|
33
|
+
label: 'Layer',
|
|
34
|
+
help: 'A layer keeps tests from sharing the same people and is chosen at creation.'
|
|
35
|
+
},
|
|
36
|
+
slug: {
|
|
37
|
+
label: 'Slug',
|
|
38
|
+
help: 'This permanent identifier connects the test to its content.'
|
|
39
|
+
},
|
|
40
|
+
kind: {
|
|
41
|
+
label: 'Kind',
|
|
42
|
+
help: 'The kind determines where versions live and is chosen at creation.'
|
|
43
|
+
},
|
|
44
|
+
unitType: {
|
|
45
|
+
label: 'Unit type',
|
|
46
|
+
help: 'Count visitors or signed-in users, as chosen at creation.'
|
|
47
|
+
},
|
|
48
|
+
inheritedWindow: "Use each goal's window",
|
|
49
|
+
automaticTuning: 'Automatic (5,000)',
|
|
50
|
+
sequential: 'Sequential',
|
|
51
|
+
bayesian: 'Bayesian',
|
|
52
|
+
auto: 'Automatic',
|
|
53
|
+
off: 'Off',
|
|
54
|
+
none: 'None'
|
|
55
|
+
};
|
|
@@ -6,6 +6,6 @@ export const ARM_SELECT_COPY = {
|
|
|
6
6
|
unavailable: "Experiments couldn't be loaded. Reload and try again.",
|
|
7
7
|
loading: 'Loading experiments…',
|
|
8
8
|
running: 'Changing this content mid-test mixes two versions in one result',
|
|
9
|
-
noFlagPoint: 'No
|
|
9
|
+
noFlagPoint: 'No setting is configured for this field.'
|
|
10
10
|
};
|
|
11
11
|
export const staleExperiment = (name)=>`This was set for an earlier experiment${name ? ` (${name})` : ''} and won't be used now.`;
|
|
@@ -8,22 +8,9 @@ export declare const GROUP_LABELS: {
|
|
|
8
8
|
readonly holdout: "Holdout";
|
|
9
9
|
};
|
|
10
10
|
export declare const ARMS_COPY: {
|
|
11
|
-
readonly groups: "Groups";
|
|
12
|
-
readonly label: "Group label";
|
|
13
|
-
readonly weight: "Weight (%)";
|
|
14
|
-
readonly slot: "Content slot";
|
|
15
|
-
readonly addVariant: "Add a variant";
|
|
16
|
-
readonly addHoldout: "Add a holdout";
|
|
17
|
-
readonly removeHoldout: "Remove holdout";
|
|
18
|
-
readonly removeVariant: "Remove variant";
|
|
19
|
-
readonly splitEvenly: "Split evenly";
|
|
20
11
|
readonly holdout: "The holdout sees the Original and is measured but not compared during the test. After you decide, it keeps seeing the Original so the winner can be compared with it.";
|
|
21
|
-
readonly pagePath: "Page path";
|
|
22
|
-
readonly holdoutPage: "Sees the Original's page";
|
|
23
12
|
readonly pageRequired: "Enter a page path for this group.";
|
|
24
13
|
readonly pageInvalid: "Use a page path starting with /, without a host, query or fragment.";
|
|
25
|
-
readonly flagPoint: "Flag point";
|
|
26
|
-
readonly controlParams: "The Original uses this flag point's current defaults. These values are checked again at Start.";
|
|
27
14
|
readonly paramRequired: "Enter a value for {label}.";
|
|
28
15
|
readonly paramNumber: "Enter a number for {label}.";
|
|
29
16
|
readonly paramMin: "{label} must be at least {min}.";
|
package/dist/admin/copy/arms.js
CHANGED
|
@@ -18,22 +18,9 @@ export const GROUP_LABELS = {
|
|
|
18
18
|
holdout: 'Holdout'
|
|
19
19
|
};
|
|
20
20
|
export const ARMS_COPY = {
|
|
21
|
-
groups: 'Groups',
|
|
22
|
-
label: 'Group label',
|
|
23
|
-
weight: 'Weight (%)',
|
|
24
|
-
slot: 'Content slot',
|
|
25
|
-
addVariant: 'Add a variant',
|
|
26
|
-
addHoldout: 'Add a holdout',
|
|
27
|
-
removeHoldout: 'Remove holdout',
|
|
28
|
-
removeVariant: 'Remove variant',
|
|
29
|
-
splitEvenly: 'Split evenly',
|
|
30
21
|
holdout: 'The holdout sees the Original and is measured but not compared during the test. After you decide, it keeps seeing the Original so the winner can be compared with it.',
|
|
31
|
-
pagePath: 'Page path',
|
|
32
|
-
holdoutPage: "Sees the Original's page",
|
|
33
22
|
pageRequired: 'Enter a page path for this group.',
|
|
34
23
|
pageInvalid: 'Use a page path starting with /, without a host, query or fragment.',
|
|
35
|
-
flagPoint: 'Flag point',
|
|
36
|
-
controlParams: "The Original uses this flag point's current defaults. These values are checked again at Start.",
|
|
37
24
|
paramRequired: 'Enter a value for {label}.',
|
|
38
25
|
paramNumber: 'Enter a number for {label}.',
|
|
39
26
|
paramMin: '{label} must be at least {min}.',
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
export declare const
|
|
2
|
-
readonly allocation: "Who takes part (%)";
|
|
3
|
-
readonly attribute: "Attribute";
|
|
4
|
-
readonly operator: "Comparison";
|
|
5
|
-
readonly value: "Value";
|
|
6
|
-
readonly true: "Yes";
|
|
7
|
-
readonly false: "No";
|
|
8
|
-
readonly caseNote: "Letter case doesn't matter.";
|
|
9
|
-
readonly listNote: "Separate values with commas.";
|
|
1
|
+
export declare const AUDIENCE_COPY: {
|
|
10
2
|
readonly emptyListNote: "Add at least one value — an empty list can't be saved.";
|
|
11
3
|
};
|
|
12
4
|
export declare const STRING_OP_LABELS: {
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
export const
|
|
2
|
-
allocation: 'Who takes part (%)',
|
|
3
|
-
attribute: 'Attribute',
|
|
4
|
-
operator: 'Comparison',
|
|
5
|
-
value: 'Value',
|
|
6
|
-
true: 'Yes',
|
|
7
|
-
false: 'No',
|
|
8
|
-
caseNote: "Letter case doesn't matter.",
|
|
9
|
-
listNote: 'Separate values with commas.',
|
|
1
|
+
export const AUDIENCE_COPY = {
|
|
10
2
|
emptyListNote: "Add at least one value — an empty list can't be saved."
|
|
11
3
|
};
|
|
12
4
|
export const STRING_OP_LABELS = {
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
export declare const HISTORY_COPY: {
|
|
2
2
|
layers: string;
|
|
3
|
-
rounds: string;
|
|
4
|
-
now: string;
|
|
5
|
-
decided: string;
|
|
6
3
|
};
|
|
7
4
|
export declare const layerSummary: (used: number, free: number) => string;
|
|
8
5
|
export declare const layerRow: (name: string, status: string, slices: number) => string;
|
|
9
|
-
export declare const roundRow: (phase: number, kind: string, from: string, to: string, weights: string) => string;
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
export const HISTORY_COPY = {
|
|
2
|
-
layers: '
|
|
3
|
-
rounds: 'Rounds',
|
|
4
|
-
now: 'now',
|
|
5
|
-
decided: 'Decided by an editor'
|
|
2
|
+
layers: 'Tests in this group'
|
|
6
3
|
};
|
|
7
|
-
export const layerSummary = (used, free)=>`${used} of
|
|
8
|
-
export const layerRow = (name, status, slices)=>`${name} · ${status} · ${slices}
|
|
9
|
-
export const roundRow = (phase, kind, from, to, weights)=>`Round ${phase} · ${kind} · ${from} – ${to} · ${weights}`;
|
|
4
|
+
export const layerSummary = (used, free)=>`${used}% of people in this group are in a test; ${free}% are free.`;
|
|
5
|
+
export const layerRow = (name, status, slices)=>`${name} · ${status} · ${slices}%`;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export declare const METRICS_COPY: {
|
|
2
|
-
readonly source: "
|
|
3
|
-
readonly revenueHint: "
|
|
2
|
+
readonly source: "Measured by";
|
|
3
|
+
readonly revenueHint: "Very large amounts are counted only up to the level that the top 1% of amounts reached in the 90 days before the test starts; totals are always shown in full.";
|
|
4
4
|
};
|
|
5
5
|
export declare const METRIC_KIND_LABELS: {
|
|
6
6
|
readonly binomial: "yes/no";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export const METRICS_COPY = {
|
|
2
|
-
source: '
|
|
3
|
-
revenueHint: '
|
|
2
|
+
source: 'Measured by',
|
|
3
|
+
revenueHint: 'Very large amounts are counted only up to the level that the top 1% of amounts reached in the 90 days before the test starts; totals are always shown in full.'
|
|
4
4
|
};
|
|
5
5
|
export const METRIC_KIND_LABELS = {
|
|
6
6
|
binomial: 'yes/no',
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export declare const NEW_TEST_COPY: {
|
|
2
|
+
readonly question: "What do you want to test?";
|
|
3
|
+
readonly block: "A block on a page";
|
|
4
|
+
readonly setting: "A setting";
|
|
5
|
+
readonly blockMeaning: "Compare different versions of content on a page.";
|
|
6
|
+
readonly settingMeaning: "Compare different choices for a setting on your site.";
|
|
7
|
+
readonly unavailable: "A developer needs to set up pages or settings before you can create a test.";
|
|
8
|
+
readonly handoff: "Open the page, add an Experiment block where you want the test, and choose Test this block.";
|
|
9
|
+
readonly noPages: "There are no pages yet.";
|
|
10
|
+
readonly recentPages: "Showing the 50 most recently edited.";
|
|
11
|
+
readonly open: "Open";
|
|
12
|
+
readonly chooseSetting: "Which setting do you want to test?";
|
|
13
|
+
readonly people: "Count people as:";
|
|
14
|
+
readonly visitors: "Visitors";
|
|
15
|
+
readonly users: "Signed-in users";
|
|
16
|
+
readonly peopleHelp: "Count each browser as a visitor, or each signed-in account as one person.";
|
|
17
|
+
readonly advanced: "Advanced";
|
|
18
|
+
readonly group: "Put this test in a group (optional)";
|
|
19
|
+
readonly noGroup: "No group";
|
|
20
|
+
readonly groupHelp: "The group keeps tests from sharing the same people and can't be changed later.";
|
|
21
|
+
readonly groupsError: "Couldn't load groups. Try again.";
|
|
22
|
+
readonly groupsLoading: "Loading groups…";
|
|
23
|
+
readonly retry: "Try again";
|
|
24
|
+
readonly nameQuestion: "What will you call this test?";
|
|
25
|
+
readonly name: "Name";
|
|
26
|
+
readonly hypothesis: "Why are you testing this? (optional)";
|
|
27
|
+
readonly back: "Back";
|
|
28
|
+
readonly next: "Next";
|
|
29
|
+
readonly createTest: "Create";
|
|
30
|
+
readonly creating: "Creating…";
|
|
31
|
+
readonly createError: "Couldn't create the test. Try again.";
|
|
32
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export const NEW_TEST_COPY = {
|
|
2
|
+
question: 'What do you want to test?',
|
|
3
|
+
block: 'A block on a page',
|
|
4
|
+
setting: 'A setting',
|
|
5
|
+
blockMeaning: 'Compare different versions of content on a page.',
|
|
6
|
+
settingMeaning: 'Compare different choices for a setting on your site.',
|
|
7
|
+
unavailable: 'A developer needs to set up pages or settings before you can create a test.',
|
|
8
|
+
handoff: 'Open the page, add an Experiment block where you want the test, and choose Test this block.',
|
|
9
|
+
noPages: 'There are no pages yet.',
|
|
10
|
+
recentPages: 'Showing the 50 most recently edited.',
|
|
11
|
+
open: 'Open',
|
|
12
|
+
chooseSetting: 'Which setting do you want to test?',
|
|
13
|
+
people: 'Count people as:',
|
|
14
|
+
visitors: 'Visitors',
|
|
15
|
+
users: 'Signed-in users',
|
|
16
|
+
peopleHelp: 'Count each browser as a visitor, or each signed-in account as one person.',
|
|
17
|
+
advanced: 'Advanced',
|
|
18
|
+
group: 'Put this test in a group (optional)',
|
|
19
|
+
noGroup: 'No group',
|
|
20
|
+
groupHelp: "The group keeps tests from sharing the same people and can't be changed later.",
|
|
21
|
+
groupsError: "Couldn't load groups. Try again.",
|
|
22
|
+
groupsLoading: 'Loading groups…',
|
|
23
|
+
retry: 'Try again',
|
|
24
|
+
nameQuestion: 'What will you call this test?',
|
|
25
|
+
name: 'Name',
|
|
26
|
+
hypothesis: 'Why are you testing this? (optional)',
|
|
27
|
+
back: 'Back',
|
|
28
|
+
next: 'Next',
|
|
29
|
+
createTest: 'Create',
|
|
30
|
+
creating: 'Creating…',
|
|
31
|
+
createError: "Couldn't create the test. Try again."
|
|
32
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export declare const READINESS_COPY: {
|
|
2
|
+
readonly ready: "Ready to start.";
|
|
3
|
+
readonly saveFirst: "Save your changes first.";
|
|
4
|
+
readonly saving: "Saving…";
|
|
5
|
+
readonly saved: "Saved";
|
|
6
|
+
readonly saveError: "Couldn't save — see the highlighted field";
|
|
7
|
+
readonly checkError: "Couldn't check readiness. Try again.";
|
|
8
|
+
readonly checking: "Checking readiness…";
|
|
9
|
+
readonly retry: "Try again";
|
|
10
|
+
readonly archived: "Archived.";
|
|
11
|
+
readonly running: "Running";
|
|
12
|
+
readonly stopped: "Stopped";
|
|
13
|
+
readonly decided: "Decided";
|
|
14
|
+
readonly addMetric: "Add a guardrail or something to watch";
|
|
15
|
+
readonly allocate: "Let more people in";
|
|
16
|
+
readonly everyone: "Everyone already takes part.";
|
|
17
|
+
readonly participation: "How many people take part (%)";
|
|
18
|
+
readonly noPlacements: "Not on a page yet. Open a page, add an Experiment block and choose this test.";
|
|
19
|
+
readonly noPoint: "Choose the setting to test.";
|
|
20
|
+
readonly busy: "Another test is already running on this setting. Stop it first.";
|
|
21
|
+
readonly noGoal: "Choose a goal.";
|
|
22
|
+
readonly unknownGoal: "This goal's data source isn't available. Choose another goal.";
|
|
23
|
+
readonly noDuration: "Choose how long to run it.";
|
|
24
|
+
readonly noReach: "Enter how many people reach this per day.";
|
|
25
|
+
readonly full: "This test's group is full. Lower how many people take part, or create the test again without the group.";
|
|
26
|
+
readonly differentPeople: "This test's group counts different people. Create the test again without the group.";
|
|
27
|
+
readonly noTargets: "Add a page address for each version.";
|
|
28
|
+
readonly pageVisitors: "Whole-page tests count visitors. Create the test again counting visitors.";
|
|
29
|
+
readonly ruleFallback: "check the value";
|
|
30
|
+
readonly versionFallback: "check the group settings";
|
|
31
|
+
readonly groupFallback: "each version";
|
|
32
|
+
readonly parameterFallback: "each setting";
|
|
33
|
+
readonly attributeFallback: "this attribute";
|
|
34
|
+
};
|
|
35
|
+
export declare const nextCopy: (sentence: string) => string;
|
|
36
|
+
export declare const versionsNext: (detail: string) => string;
|
|
37
|
+
export declare const contentNext: (group: string) => string;
|
|
38
|
+
export declare const parameterNext: (parameter: string, group: string) => string;
|
|
39
|
+
export declare const placementNext: (group: string, detail: string) => string;
|
|
40
|
+
export declare const goalPeopleNext: (people: string) => string;
|
|
41
|
+
export declare const ruleNext: (detail: string) => string;
|
|
42
|
+
export declare const attributeNext: (attribute: string) => string;
|
|
43
|
+
export declare const stoppedCopy: (date: string | null) => string;
|
|
44
|
+
export declare const decidedCopy: (date: string | null, winner: string) => string;
|
|
45
|
+
export declare const runningCopy: (date: string | null, people: number | null, days: number | null) => string;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export const READINESS_COPY = {
|
|
2
|
+
ready: 'Ready to start.',
|
|
3
|
+
saveFirst: 'Save your changes first.',
|
|
4
|
+
saving: 'Saving…',
|
|
5
|
+
saved: 'Saved',
|
|
6
|
+
saveError: "Couldn't save — see the highlighted field",
|
|
7
|
+
checkError: "Couldn't check readiness. Try again.",
|
|
8
|
+
checking: 'Checking readiness…',
|
|
9
|
+
retry: 'Try again',
|
|
10
|
+
archived: 'Archived.',
|
|
11
|
+
running: 'Running',
|
|
12
|
+
stopped: 'Stopped',
|
|
13
|
+
decided: 'Decided',
|
|
14
|
+
addMetric: 'Add a guardrail or something to watch',
|
|
15
|
+
allocate: 'Let more people in',
|
|
16
|
+
everyone: 'Everyone already takes part.',
|
|
17
|
+
participation: 'How many people take part (%)',
|
|
18
|
+
noPlacements: 'Not on a page yet. Open a page, add an Experiment block and choose this test.',
|
|
19
|
+
noPoint: 'Choose the setting to test.',
|
|
20
|
+
busy: 'Another test is already running on this setting. Stop it first.',
|
|
21
|
+
noGoal: 'Choose a goal.',
|
|
22
|
+
unknownGoal: "This goal's data source isn't available. Choose another goal.",
|
|
23
|
+
noDuration: 'Choose how long to run it.',
|
|
24
|
+
noReach: 'Enter how many people reach this per day.',
|
|
25
|
+
full: "This test's group is full. Lower how many people take part, or create the test again without the group.",
|
|
26
|
+
differentPeople: "This test's group counts different people. Create the test again without the group.",
|
|
27
|
+
noTargets: 'Add a page address for each version.',
|
|
28
|
+
pageVisitors: 'Whole-page tests count visitors. Create the test again counting visitors.',
|
|
29
|
+
ruleFallback: 'check the value',
|
|
30
|
+
versionFallback: 'check the group settings',
|
|
31
|
+
groupFallback: 'each version',
|
|
32
|
+
parameterFallback: 'each setting',
|
|
33
|
+
attributeFallback: 'this attribute'
|
|
34
|
+
};
|
|
35
|
+
const withoutPeriod = (value)=>value.trim().replace(/[.!?]+$/, '');
|
|
36
|
+
export const nextCopy = (sentence)=>`Next: ${sentence}`;
|
|
37
|
+
export const versionsNext = (detail)=>`Fix the versions: ${withoutPeriod(detail)}.`;
|
|
38
|
+
export const contentNext = (group)=>`Add content for ${group} on the page.`;
|
|
39
|
+
export const parameterNext = (parameter, group)=>`Set a value for ${parameter} on ${group}.`;
|
|
40
|
+
export const placementNext = (group, detail)=>`Add content for ${group} wherever this setting is used${detail.trim() ? `: ${withoutPeriod(detail)}` : ''}.`;
|
|
41
|
+
export const goalPeopleNext = (people)=>`This goal can't be measured for ${people}. Choose another goal.`;
|
|
42
|
+
export const ruleNext = (detail)=>`Fix the rule: ${withoutPeriod(detail)}.`;
|
|
43
|
+
export const attributeNext = (attribute)=>`Remove the rule on ${attribute}: it isn't available.`;
|
|
44
|
+
export const stoppedCopy = (date)=>`Stopped${date ? ` ${date}` : ''}. Edit the versions, goal, audience or length below, then start again (results restart).`;
|
|
45
|
+
export const decidedCopy = (date, winner)=>`Decided${date ? ` ${date}` : ''}: ${winner}.`;
|
|
46
|
+
export const runningCopy = (date, people, days)=>[
|
|
47
|
+
date ? `Running since ${date}` : READINESS_COPY.running,
|
|
48
|
+
people === null ? null : `${people.toLocaleString('en-US')} people so far`,
|
|
49
|
+
days === null ? null : `about ${days} days to go`
|
|
50
|
+
].filter(Boolean).join(' · ');
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare const RECOMMENDATION_COPY: {
|
|
2
|
+
readonly unavailable: "Results aren't available right now. Recompute, and ask a developer if it keeps happening.";
|
|
3
|
+
readonly dataProblem: "Stop: the data looks unbalanced, check the setup.";
|
|
4
|
+
readonly collecting: "Too early to tell. Keep it running.";
|
|
5
|
+
readonly stoppedCollecting: "Stopped before enough people took part to tell.";
|
|
6
|
+
readonly originalBetter: "The Original is best. Keep the Original.";
|
|
7
|
+
readonly noDifference: "No difference found. Keep the Original, or test a bigger change.";
|
|
8
|
+
readonly keepRunning: "No difference so far. Keep running.";
|
|
9
|
+
readonly longDuration: "No clear difference, and a clear answer would take more than 3 months at this traffic. Consider a bigger change.";
|
|
10
|
+
readonly group: "Variant";
|
|
11
|
+
readonly guardrail: "an important outcome";
|
|
12
|
+
readonly winner: "the winner";
|
|
13
|
+
};
|
|
14
|
+
export declare const guardrailRecommendation: (group: string, guardrail: string) => string;
|
|
15
|
+
export declare const collectingRecommendation: (people: string) => string;
|
|
16
|
+
export declare const worseRecommendation: (group: string) => string;
|
|
17
|
+
export declare const winnerRecommendation: (group: string) => string;
|
|
18
|
+
export declare const mixedRecommendation: (better: string, worse: string) => string;
|
|
19
|
+
export declare const runningRecommendation: (date: string) => string;
|
|
20
|
+
export declare const rolloutCollectingRecommendation: (winner: string) => string;
|
|
21
|
+
export declare const rolloutReadoutRecommendation: (winner: string, lift: string) => string;
|
|
22
|
+
export declare const RESULTS_SURFACE_COPY: {
|
|
23
|
+
readonly missing: "This test couldn't be found.";
|
|
24
|
+
};
|
|
25
|
+
/** Matches the stored server finding; it is not a new statistical decision. */
|
|
26
|
+
export declare const storedGuardrailFinding: (group: string, guardrail: string) => string;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export const RECOMMENDATION_COPY = {
|
|
2
|
+
unavailable: "Results aren't available right now. Recompute, and ask a developer if it keeps happening.",
|
|
3
|
+
dataProblem: 'Stop: the data looks unbalanced, check the setup.',
|
|
4
|
+
collecting: 'Too early to tell. Keep it running.',
|
|
5
|
+
stoppedCollecting: 'Stopped before enough people took part to tell.',
|
|
6
|
+
originalBetter: 'The Original is best. Keep the Original.',
|
|
7
|
+
noDifference: 'No difference found. Keep the Original, or test a bigger change.',
|
|
8
|
+
keepRunning: 'No difference so far. Keep running.',
|
|
9
|
+
longDuration: 'No clear difference, and a clear answer would take more than 3 months at this traffic. Consider a bigger change.',
|
|
10
|
+
group: 'Variant',
|
|
11
|
+
guardrail: 'an important outcome',
|
|
12
|
+
winner: 'the winner'
|
|
13
|
+
};
|
|
14
|
+
export const guardrailRecommendation = (group, guardrail)=>`Stop: ${group} is making ${guardrail} worse.`;
|
|
15
|
+
export const collectingRecommendation = (people)=>`Too early to tell. About ${people} more people needed to be sure.`;
|
|
16
|
+
export const worseRecommendation = (group)=>`No version beats the Original, and ${group} does worse. Keep the Original.`;
|
|
17
|
+
export const winnerRecommendation = (group)=>`${group} is most likely to be best.`;
|
|
18
|
+
export const mixedRecommendation = (better, worse)=>`Mixed: ${better} does better, ${worse} does worse. Review before deciding.`;
|
|
19
|
+
export const runningRecommendation = (date)=>`No difference so far. Keep running until ${date}.`;
|
|
20
|
+
export const rolloutCollectingRecommendation = (winner)=>`Since shipping ${winner}: still collecting data.`;
|
|
21
|
+
export const rolloutReadoutRecommendation = (winner, lift)=>`Since shipping ${winner}: ${lift} compared with the holdout.`;
|
|
22
|
+
export const RESULTS_SURFACE_COPY = {
|
|
23
|
+
missing: "This test couldn't be found."
|
|
24
|
+
};
|
|
25
|
+
/** Matches the stored server finding; it is not a new statistical decision. */ export const storedGuardrailFinding = (group, guardrail)=>`Stop: ${group} harms ${guardrail}.`;
|
|
@@ -75,4 +75,3 @@ export declare const conflictCopy: (share: string) => string;
|
|
|
75
75
|
export declare const metricUnavailable: (name: string, reason: string) => string;
|
|
76
76
|
export declare const chartSummary: (metric: string, groups: string, from: string, to: string, changes?: string[]) => string;
|
|
77
77
|
export declare const contentChangeTitle: (date: string) => string;
|
|
78
|
-
export declare const summaryLine: (exposures: string, days: string, verdict: string) => string;
|