@delmaredigital/payload-experiments 0.1.0-rc.7 → 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.
Files changed (207) hide show
  1. package/README.md +28 -0
  2. package/dist/admin/LayerUsage.d.ts +1 -1
  3. package/dist/admin/LayerUsage.js +23 -11
  4. package/dist/admin/MetricSourceSelect.js +2 -1
  5. package/dist/admin/TestsNavLink.d.ts +1 -0
  6. package/dist/admin/TestsNavLink.js +30 -0
  7. package/dist/admin/allocation.model.js +1 -1
  8. package/dist/admin/copy/actions.d.ts +0 -2
  9. package/dist/admin/copy/actions.js +0 -2
  10. package/dist/admin/copy/advanced.d.ts +55 -0
  11. package/dist/admin/copy/advanced.js +55 -0
  12. package/dist/admin/copy/armSelect.js +1 -1
  13. package/dist/admin/copy/arms.d.ts +0 -13
  14. package/dist/admin/copy/arms.js +0 -13
  15. package/dist/admin/copy/{who.d.ts → audience.d.ts} +1 -9
  16. package/dist/admin/copy/{who.js → audience.js} +1 -9
  17. package/dist/admin/copy/history.d.ts +0 -4
  18. package/dist/admin/copy/history.js +3 -7
  19. package/dist/admin/copy/metrics.d.ts +2 -2
  20. package/dist/admin/copy/metrics.js +2 -2
  21. package/dist/admin/copy/newTest.d.ts +32 -0
  22. package/dist/admin/copy/newTest.js +32 -0
  23. package/dist/admin/copy/readiness.d.ts +45 -0
  24. package/dist/admin/copy/readiness.js +50 -0
  25. package/dist/admin/copy/recommendation.d.ts +26 -0
  26. package/dist/admin/copy/recommendation.js +25 -0
  27. package/dist/admin/copy/results.d.ts +0 -1
  28. package/dist/admin/copy/results.js +0 -1
  29. package/dist/admin/copy/review.d.ts +0 -17
  30. package/dist/admin/copy/review.js +1 -112
  31. package/dist/admin/copy/setting.d.ts +10 -0
  32. package/dist/admin/copy/setting.js +10 -0
  33. package/dist/admin/copy/surface.d.ts +36 -0
  34. package/dist/admin/copy/surface.js +47 -0
  35. package/dist/admin/copy/testPage.d.ts +88 -0
  36. package/dist/admin/copy/testPage.js +88 -0
  37. package/dist/admin/paths.d.ts +5 -13
  38. package/dist/admin/paths.js +5 -13
  39. package/dist/admin/review/review.model.d.ts +3 -26
  40. package/dist/admin/review/review.model.js +3 -30
  41. package/dist/admin/surface/ResultsRoute.d.ts +7 -0
  42. package/dist/admin/surface/ResultsRoute.js +58 -0
  43. package/dist/admin/surface/SurfaceShell.d.ts +6 -0
  44. package/dist/admin/surface/SurfaceShell.js +35 -0
  45. package/dist/admin/surface/TestsHome.d.ts +4 -0
  46. package/dist/admin/surface/TestsHome.js +212 -0
  47. package/dist/admin/surface/TestsSurface.d.ts +2 -0
  48. package/dist/admin/surface/TestsSurface.js +36 -0
  49. package/dist/admin/surface/contracts.d.ts +48 -0
  50. package/dist/admin/surface/contracts.js +8 -0
  51. package/dist/admin/surface/home.model.d.ts +41 -0
  52. package/dist/admin/surface/home.model.js +59 -0
  53. package/dist/admin/surface/newTest/NewTest.d.ts +7 -0
  54. package/dist/admin/surface/newTest/NewTest.js +355 -0
  55. package/dist/admin/surface/newTest/newTest.css +9 -0
  56. package/dist/admin/surface/pageBlock/pageBlock.model.d.ts +6 -0
  57. package/dist/admin/surface/pageBlock/pageBlock.model.js +8 -0
  58. package/dist/admin/surface/pageBlock/parts.d.ts +2 -0
  59. package/dist/admin/surface/pageBlock/parts.js +64 -0
  60. package/dist/admin/surface/readiness/ActionDialogs.d.ts +15 -0
  61. package/dist/admin/surface/readiness/ActionDialogs.js +274 -0
  62. package/dist/admin/surface/readiness/Banner.d.ts +2 -0
  63. package/dist/admin/surface/readiness/Banner.js +138 -0
  64. package/dist/admin/surface/readiness/SaveStatus.d.ts +4 -0
  65. package/dist/admin/surface/readiness/SaveStatus.js +50 -0
  66. package/dist/admin/surface/readiness/parts.d.ts +2 -0
  67. package/dist/admin/surface/readiness/parts.js +9 -0
  68. package/dist/admin/surface/readiness/readiness.model.d.ts +22 -0
  69. package/dist/admin/surface/readiness/readiness.model.js +107 -0
  70. package/dist/admin/surface/readiness/useTransition.d.ts +10 -0
  71. package/dist/admin/surface/readiness/useTransition.js +34 -0
  72. package/dist/admin/surface/results/ResultsBody.d.ts +7 -0
  73. package/dist/admin/surface/results/ResultsBody.js +262 -0
  74. package/dist/admin/surface/results/recommendation.model.d.ts +12 -0
  75. package/dist/admin/surface/results/recommendation.model.js +59 -0
  76. package/dist/admin/surface/results/useResults.d.ts +56 -0
  77. package/dist/admin/surface/results/useResults.js +183 -0
  78. package/dist/admin/surface/setting/parts.d.ts +3 -0
  79. package/dist/admin/surface/setting/parts.js +263 -0
  80. package/dist/admin/surface/setting/setting.css +29 -0
  81. package/dist/admin/surface/setting/setting.model.d.ts +8 -0
  82. package/dist/admin/surface/setting/setting.model.js +25 -0
  83. package/dist/admin/surface/surface.css +50 -0
  84. package/dist/admin/surface/test/AdvancedSection.d.ts +2 -0
  85. package/dist/admin/surface/test/AdvancedSection.js +153 -0
  86. package/dist/admin/surface/test/GoalSection.d.ts +2 -0
  87. package/dist/admin/surface/test/GoalSection.js +198 -0
  88. package/dist/admin/surface/test/LengthSection.d.ts +2 -0
  89. package/dist/admin/surface/test/LengthSection.js +87 -0
  90. package/dist/admin/surface/test/Section.d.ts +7 -0
  91. package/dist/admin/surface/test/Section.js +27 -0
  92. package/dist/admin/surface/test/TargetingSection.d.ts +2 -0
  93. package/dist/admin/surface/test/TargetingSection.js +164 -0
  94. package/dist/admin/surface/test/TestHeader.d.ts +4 -0
  95. package/dist/admin/surface/test/TestHeader.js +69 -0
  96. package/dist/admin/surface/test/TestPage.d.ts +7 -0
  97. package/dist/admin/surface/test/TestPage.js +84 -0
  98. package/dist/admin/surface/test/VersionsSection.d.ts +4 -0
  99. package/dist/admin/surface/test/VersionsSection.js +208 -0
  100. package/dist/admin/surface/test/fields.d.ts +55 -0
  101. package/dist/admin/surface/test/fields.js +185 -0
  102. package/dist/admin/surface/test/pageParts.d.ts +2 -0
  103. package/dist/admin/surface/test/pageParts.js +39 -0
  104. package/dist/admin/surface/test/testPage.css +23 -0
  105. package/dist/admin/surface/test/testPage.model.d.ts +17 -0
  106. package/dist/admin/surface/test/testPage.model.js +53 -0
  107. package/dist/admin/surface/testDocument.model.d.ts +39 -0
  108. package/dist/admin/surface/testDocument.model.js +61 -0
  109. package/dist/admin/surface/useTestDocument.d.ts +22 -0
  110. package/dist/admin/surface/useTestDocument.js +345 -0
  111. package/dist/admin/targeting/targeting.model.js +2 -2
  112. package/dist/admin/useLayerUsage.d.ts +0 -5
  113. package/dist/admin/useLayerUsage.js +1 -39
  114. package/dist/admin/views/CollectionEditRedirect.d.ts +4 -0
  115. package/dist/admin/views/CollectionEditRedirect.js +14 -0
  116. package/dist/admin/views/CollectionListRedirect.d.ts +2 -0
  117. package/dist/admin/views/CollectionListRedirect.js +8 -0
  118. package/dist/admin/views/ExperimentsRootView.d.ts +2 -0
  119. package/dist/admin/views/ExperimentsRootView.js +175 -0
  120. package/dist/admin/views/access.model.d.ts +7 -0
  121. package/dist/admin/views/access.model.js +5 -0
  122. package/dist/collections/experiments/config.js +18 -125
  123. package/dist/collections/experiments/createDefaults.js +6 -0
  124. package/dist/collections/layers.js +43 -12
  125. package/dist/collections/metrics.js +70 -14
  126. package/dist/collections/serialize.js +4 -1
  127. package/dist/db/snapshots.d.ts +2 -1
  128. package/dist/db/snapshots.js +2 -2
  129. package/dist/endpoints/results.js +7 -0
  130. package/dist/endpoints/summary.d.ts +1 -1
  131. package/dist/endpoints/summary.js +37 -1
  132. package/dist/exports/adminClient.d.ts +2 -13
  133. package/dist/exports/adminClient.js +2 -13
  134. package/dist/exports/index.d.ts +1 -1
  135. package/dist/exports/rsc.d.ts +3 -0
  136. package/dist/exports/rsc.js +3 -0
  137. package/dist/options.js +29 -0
  138. package/dist/plugin.js +25 -0
  139. package/dist/puck/editor/CreateExperimentDrawer.d.ts +2 -1
  140. package/dist/puck/editor/CreateExperimentDrawer.js +17 -57
  141. package/dist/puck/editor/ExperimentSlotEditor.js +6 -0
  142. package/dist/puck/editor/copy.d.ts +10 -9
  143. package/dist/puck/editor/copy.js +11 -10
  144. package/dist/puck/editor/createTest.d.ts +7 -0
  145. package/dist/puck/editor/createTest.js +50 -0
  146. package/dist/puck/editor/editor.model.d.ts +28 -1
  147. package/dist/puck/editor/editor.model.js +61 -0
  148. package/dist/results/analyse.js +4 -1
  149. package/dist/results/verdict.d.ts +1 -0
  150. package/dist/results/verdict.js +7 -4
  151. package/dist/transitions/checkStart.d.ts +1 -0
  152. package/dist/transitions/placements.d.ts +5 -1
  153. package/dist/transitions/placements.js +14 -7
  154. package/dist/transitions/preflightData.d.ts +7 -1
  155. package/dist/transitions/preflightData.js +199 -148
  156. package/dist/transitions/start.js +2 -2
  157. package/dist/types/admin.d.ts +1 -0
  158. package/dist/types/contracts.d.ts +17 -0
  159. package/dist/types/endpoints.d.ts +11 -1
  160. package/dist/types/snapshot.d.ts +1 -0
  161. package/dist/types/surface.d.ts +29 -0
  162. package/dist/types/surface.js +1 -0
  163. package/package.json +1 -1
  164. package/dist/access.d.ts +0 -1
  165. package/dist/access.js +0 -2
  166. package/dist/admin/AllocationField.d.ts +0 -2
  167. package/dist/admin/AllocationField.js +0 -80
  168. package/dist/admin/FlagPointSelect.d.ts +0 -2
  169. package/dist/admin/FlagPointSelect.js +0 -54
  170. package/dist/admin/LockedFieldNotice.d.ts +0 -2
  171. package/dist/admin/LockedFieldNotice.js +0 -26
  172. package/dist/admin/PhaseHistory.d.ts +0 -2
  173. package/dist/admin/PhaseHistory.js +0 -76
  174. package/dist/admin/StatusCell.d.ts +0 -3
  175. package/dist/admin/StatusCell.js +0 -19
  176. package/dist/admin/SummaryCell.d.ts +0 -2
  177. package/dist/admin/SummaryCell.js +0 -32
  178. package/dist/admin/actions/AddMetricDialog.d.ts +0 -6
  179. package/dist/admin/actions/AddMetricDialog.js +0 -138
  180. package/dist/admin/actions/AllocateDialog.d.ts +0 -6
  181. package/dist/admin/actions/AllocateDialog.js +0 -81
  182. package/dist/admin/actions/ExperimentActions.d.ts +0 -3
  183. package/dist/admin/actions/ExperimentActions.js +0 -110
  184. package/dist/admin/arms/ArmsField.d.ts +0 -2
  185. package/dist/admin/arms/ArmsField.js +0 -310
  186. package/dist/admin/arms/ParamsEditor.d.ts +0 -16
  187. package/dist/admin/arms/ParamsEditor.js +0 -79
  188. package/dist/admin/copy/tabs.d.ts +0 -7
  189. package/dist/admin/copy/tabs.js +0 -7
  190. package/dist/admin/permissions.model.d.ts +0 -10
  191. package/dist/admin/permissions.model.js +0 -4
  192. package/dist/admin/phaseHistory.model.d.ts +0 -19
  193. package/dist/admin/phaseHistory.model.js +0 -19
  194. package/dist/admin/results/ResultsView.d.ts +0 -3
  195. package/dist/admin/results/ResultsView.js +0 -312
  196. package/dist/admin/review/ReviewPanel.d.ts +0 -2
  197. package/dist/admin/review/ReviewPanel.js +0 -268
  198. package/dist/admin/summaryBatcher.d.ts +0 -8
  199. package/dist/admin/summaryBatcher.js +0 -33
  200. package/dist/admin/targeting/TargetingAttributeField.d.ts +0 -2
  201. package/dist/admin/targeting/TargetingAttributeField.js +0 -31
  202. package/dist/admin/targeting/TargetingOpField.d.ts +0 -2
  203. package/dist/admin/targeting/TargetingOpField.js +0 -45
  204. package/dist/admin/targeting/TargetingValueField.d.ts +0 -2
  205. package/dist/admin/targeting/TargetingValueField.js +0 -142
  206. package/dist/index.d.ts +0 -1
  207. package/dist/index.js +0 -4
@@ -1,45 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx } from "react/jsx-runtime";
3
- import { SelectInput, useField, useFormFields } from '@payloadcms/ui';
4
- import { useEffect, useRef } from 'react';
5
- import { isEditable } from '../../collections/experiments/editability.js';
6
- import { isOpValid } from '../../targeting/ops.js';
7
- import { WHO_COPY } from '../copy/who.js';
8
- import { opLabel, opsFor, rowPath } from './targeting.model.js';
9
- export function TargetingOpField({ path, field, readOnly }) {
10
- const { value, setValue } = useField({
11
- path
12
- });
13
- const row = rowPath(path);
14
- const attribute = useFormFields(([fields])=>fields[`${row}.attribute`]?.value);
15
- const status = useFormFields(([fields])=>fields.status?.value ?? 'draft');
16
- const keys = field.admin?.custom?.attributeKeys ?? {};
17
- const type = keys[attribute ?? '']?.type;
18
- const previousType = useRef(type);
19
- const locked = Boolean(readOnly || field.admin?.readOnly || !isEditable(status, 'targeting'));
20
- useEffect(()=>{
21
- const changed = previousType.current !== type;
22
- previousType.current = type;
23
- if (!locked && type && (changed || !isOpValid(type, value ?? ''))) setValue(opsFor(type)[0]);
24
- }, [
25
- type,
26
- value,
27
- locked,
28
- setValue
29
- ]);
30
- return /*#__PURE__*/ _jsx(SelectInput, {
31
- path: path,
32
- name: path,
33
- label: WHO_COPY.operator,
34
- required: field.required,
35
- options: opsFor(type).map((op)=>({
36
- label: opLabel(type, op),
37
- value: op
38
- })),
39
- value: value ?? '',
40
- readOnly: locked || !type,
41
- onChange: (option)=>{
42
- if (!locked) setValue(option && !Array.isArray(option) ? option.value : null);
43
- }
44
- });
45
- }
@@ -1,2 +0,0 @@
1
- import type { JSONFieldClientProps } from 'payload';
2
- export declare function TargetingValueField({ path, field, readOnly }: JSONFieldClientProps): import("react").JSX.Element;
@@ -1,142 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { FieldError, SelectInput, TextInput, useField, useFormFields } from '@payloadcms/ui';
4
- import { useEffect, useRef, useState } from 'react';
5
- import { isEditable } from '../../collections/experiments/editability.js';
6
- import { isOpValid } from '../../targeting/ops.js';
7
- import { WHO_COPY } from '../copy/who.js';
8
- import { coerceValue, emptyListHint, rowPath, valueInput } from './targeting.model.js';
9
- // Preserve an unfinished comma list while the form receives its typed JSON value.
10
- function CommaList({ path, value, setValue, readOnly, required }) {
11
- const formatted = Array.isArray(value) ? value.join(', ') : String(value ?? '');
12
- const [text, setText] = useState(formatted);
13
- const lastWritten = useRef(undefined);
14
- useEffect(()=>{
15
- if (JSON.stringify(value) !== lastWritten.current) setText(formatted);
16
- }, [
17
- value,
18
- formatted
19
- ]);
20
- return /*#__PURE__*/ _jsx(TextInput, {
21
- path: path,
22
- label: WHO_COPY.value,
23
- value: text,
24
- readOnly: readOnly,
25
- required: required,
26
- onChange: (event)=>{
27
- if (readOnly) return;
28
- setText(event.target.value);
29
- const next = coerceValue('string', 'in', event.target.value);
30
- lastWritten.current = JSON.stringify(next);
31
- setValue(next);
32
- }
33
- });
34
- }
35
- export function TargetingValueField({ path, field, readOnly }) {
36
- const { value, setValue } = useField({
37
- path
38
- });
39
- const row = rowPath(path);
40
- const attribute = useFormFields(([fields])=>fields[`${row}.attribute`]?.value);
41
- const op = useFormFields(([fields])=>fields[`${row}.op`]?.value);
42
- const status = useFormFields(([fields])=>fields.status?.value ?? 'draft');
43
- const keys = field.admin?.custom?.attributeKeys ?? {};
44
- const definition = keys[attribute ?? ''];
45
- const candidate = op ?? '';
46
- const valid = Boolean(definition && isOpValid(definition.type, candidate));
47
- const operator = definition && isOpValid(definition.type, candidate) ? candidate : 'eq';
48
- const input = valueInput(definition, operator);
49
- const locked = Boolean(readOnly || field.admin?.readOnly || !isEditable(status, 'targeting') || !valid);
50
- const type = definition?.type;
51
- useEffect(()=>{
52
- if (locked || !type || !isOpValid(type, candidate) || value == null) return;
53
- const next = coerceValue(type, candidate, value);
54
- if (JSON.stringify(next) !== JSON.stringify(value)) setValue(next);
55
- }, [
56
- type,
57
- candidate,
58
- value,
59
- locked,
60
- setValue
61
- ]);
62
- const write = (raw)=>{
63
- if (!locked && definition && isOpValid(definition.type, operator)) setValue(coerceValue(definition.type, operator, raw));
64
- };
65
- const many = operator === 'in' || operator === 'nin';
66
- const hint = emptyListHint(operator, value);
67
- const props = {
68
- path,
69
- label: WHO_COPY.value,
70
- readOnly: locked,
71
- required: field.required
72
- };
73
- // position: relative anchors Payload's absolutely positioned FieldError tooltip to this field.
74
- return /*#__PURE__*/ _jsxs("div", {
75
- style: {
76
- position: 'relative'
77
- },
78
- children: [
79
- input.kind === 'select' || input.kind === 'multiselect' || input.kind === 'boolean' ? /*#__PURE__*/ _jsx(SelectInput, {
80
- ...props,
81
- name: path,
82
- hasMany: input.kind === 'multiselect',
83
- options: input.kind === 'boolean' ? [
84
- {
85
- label: WHO_COPY.true,
86
- value: 'true'
87
- },
88
- {
89
- label: WHO_COPY.false,
90
- value: 'false'
91
- }
92
- ] : input.options,
93
- value: many ? Array.isArray(value) ? value.map(String) : [] : value == null ? '' : String(value),
94
- onChange: (option)=>write(Array.isArray(option) ? option.map((item)=>item.value) : option?.value)
95
- }) : input.kind === 'number' ? /*#__PURE__*/ _jsxs(_Fragment, {
96
- children: [
97
- /*#__PURE__*/ _jsx("label", {
98
- htmlFor: path,
99
- children: WHO_COPY.value
100
- }),
101
- /*#__PURE__*/ _jsx("input", {
102
- id: path,
103
- name: path,
104
- type: "number",
105
- step: "any",
106
- required: field.required,
107
- readOnly: locked,
108
- value: typeof value === 'number' || typeof value === 'string' ? value : '',
109
- style: {
110
- display: 'block',
111
- color: 'var(--theme-text)',
112
- background: 'var(--theme-input-bg)',
113
- border: '1px solid var(--theme-elevation-200)',
114
- padding: '0.5rem'
115
- },
116
- onChange: (event)=>write(event.target.value)
117
- }),
118
- /*#__PURE__*/ _jsx(FieldError, {
119
- path: path
120
- })
121
- ]
122
- }) : many ? /*#__PURE__*/ _jsx(CommaList, {
123
- ...props,
124
- value: value,
125
- setValue: write
126
- }, `${path}:${attribute}:${operator}`) : /*#__PURE__*/ _jsx(TextInput, {
127
- ...props,
128
- value: typeof value === 'string' ? value : '',
129
- onChange: (event)=>write(event.target.value)
130
- }),
131
- definition?.type === 'string' ? /*#__PURE__*/ _jsx("p", {
132
- children: WHO_COPY.caseNote
133
- }) : null,
134
- many && input.kind === 'text' ? /*#__PURE__*/ _jsx("p", {
135
- children: WHO_COPY.listNote
136
- }) : null,
137
- hint ? /*#__PURE__*/ _jsx("p", {
138
- children: hint
139
- }) : null
140
- ]
141
- });
142
- }
package/dist/index.d.ts DELETED
@@ -1 +0,0 @@
1
- export declare const PLUGIN_NAME: "@delmaredigital/payload-experiments";
package/dist/index.js DELETED
@@ -1,4 +0,0 @@
1
- // @delmaredigital/payload-experiments
2
- // Public surface is defined in docs/plans/2026-10-30-payload-experiments-design.md §7.
3
- // Implementation lands by lane; this file only pins the package until then.
4
- export const PLUGIN_NAME = '@delmaredigital/payload-experiments';