@delmaredigital/payload-experiments 0.0.0-stage → 0.1.0-rc.3
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/LICENSE +21 -0
- package/README.md +582 -2
- package/dist/access.d.ts +1 -0
- package/dist/access.js +2 -0
- package/dist/admin/AllocationField.d.ts +2 -0
- package/dist/admin/AllocationField.js +80 -0
- package/dist/admin/FlagPointSelect.d.ts +2 -0
- package/dist/admin/FlagPointSelect.js +54 -0
- package/dist/admin/LayerUsage.d.ts +2 -0
- package/dist/admin/LayerUsage.js +24 -0
- package/dist/admin/LockedFieldNotice.d.ts +2 -0
- package/dist/admin/LockedFieldNotice.js +26 -0
- package/dist/admin/MetricSourceSelect.d.ts +2 -0
- package/dist/admin/MetricSourceSelect.js +32 -0
- package/dist/admin/PhaseHistory.d.ts +2 -0
- package/dist/admin/PhaseHistory.js +76 -0
- package/dist/admin/PreviewLinks.d.ts +11 -0
- package/dist/admin/PreviewLinks.js +69 -0
- package/dist/admin/StatusCell.d.ts +3 -0
- package/dist/admin/StatusCell.js +19 -0
- package/dist/admin/SummaryCell.d.ts +2 -0
- package/dist/admin/SummaryCell.js +32 -0
- package/dist/admin/actions/AddMetricDialog.d.ts +6 -0
- package/dist/admin/actions/AddMetricDialog.js +138 -0
- package/dist/admin/actions/AllocateDialog.d.ts +6 -0
- package/dist/admin/actions/AllocateDialog.js +81 -0
- package/dist/admin/actions/ConfirmDialog.d.ts +14 -0
- package/dist/admin/actions/ConfirmDialog.js +192 -0
- package/dist/admin/actions/DecideDialog.d.ts +7 -0
- package/dist/admin/actions/DecideDialog.js +173 -0
- package/dist/admin/actions/ExperimentActions.d.ts +3 -0
- package/dist/admin/actions/ExperimentActions.js +110 -0
- package/dist/admin/actions/MakeContentResult.d.ts +6 -0
- package/dist/admin/actions/MakeContentResult.js +50 -0
- package/dist/admin/actions/actions.model.d.ts +37 -0
- package/dist/admin/actions/actions.model.js +71 -0
- package/dist/admin/actions/decide.model.d.ts +21 -0
- package/dist/admin/actions/decide.model.js +38 -0
- package/dist/admin/allocation.model.d.ts +20 -0
- package/dist/admin/allocation.model.js +38 -0
- package/dist/admin/api.d.ts +32 -0
- package/dist/admin/api.js +95 -0
- package/dist/admin/armSelect/ArmSelectField.d.ts +2 -0
- package/dist/admin/armSelect/ArmSelectField.js +185 -0
- package/dist/admin/armSelect/armSelect.model.d.ts +30 -0
- package/dist/admin/armSelect/armSelect.model.js +20 -0
- package/dist/admin/arms/ArmsField.d.ts +2 -0
- package/dist/admin/arms/ArmsField.js +310 -0
- package/dist/admin/arms/ParamsEditor.d.ts +16 -0
- package/dist/admin/arms/ParamsEditor.js +79 -0
- package/dist/admin/arms/arms.model.d.ts +21 -0
- package/dist/admin/arms/arms.model.js +153 -0
- package/dist/admin/arms/pageTarget.model.d.ts +4 -0
- package/dist/admin/arms/pageTarget.model.js +19 -0
- package/dist/admin/arms/params.model.d.ts +7 -0
- package/dist/admin/arms/params.model.js +35 -0
- package/dist/admin/copy/actions.d.ts +38 -0
- package/dist/admin/copy/actions.js +38 -0
- package/dist/admin/copy/armSelect.d.ts +11 -0
- package/dist/admin/copy/armSelect.js +11 -0
- package/dist/admin/copy/arms.d.ts +37 -0
- package/dist/admin/copy/arms.js +47 -0
- package/dist/admin/copy/common.d.ts +20 -0
- package/dist/admin/copy/common.js +27 -0
- package/dist/admin/copy/history.d.ts +9 -0
- package/dist/admin/copy/history.js +9 -0
- package/dist/admin/copy/metrics.d.ts +9 -0
- package/dist/admin/copy/metrics.js +9 -0
- package/dist/admin/copy/results.d.ts +78 -0
- package/dist/admin/copy/results.js +81 -0
- package/dist/admin/copy/review.d.ts +33 -0
- package/dist/admin/copy/review.js +127 -0
- package/dist/admin/copy/status.d.ts +8 -0
- package/dist/admin/copy/status.js +8 -0
- package/dist/admin/copy/tabs.d.ts +7 -0
- package/dist/admin/copy/tabs.js +7 -0
- package/dist/admin/copy/who.d.ts +36 -0
- package/dist/admin/copy/who.js +36 -0
- package/dist/admin/labels.d.ts +45 -0
- package/dist/admin/labels.js +53 -0
- package/dist/admin/layerUsage.model.d.ts +15 -0
- package/dist/admin/layerUsage.model.js +18 -0
- package/dist/admin/lockedNotice.model.d.ts +3 -0
- package/dist/admin/lockedNotice.model.js +18 -0
- package/dist/admin/metricSource.model.d.ts +7 -0
- package/dist/admin/metricSource.model.js +11 -0
- package/dist/admin/paths.d.ts +16 -0
- package/dist/admin/paths.js +16 -0
- package/dist/admin/permissions.model.d.ts +10 -0
- package/dist/admin/permissions.model.js +4 -0
- package/dist/admin/phaseHistory.model.d.ts +19 -0
- package/dist/admin/phaseHistory.model.js +19 -0
- package/dist/admin/reload.d.ts +1 -0
- package/dist/admin/reload.js +1 -0
- package/dist/admin/results/ArmTable.d.ts +8 -0
- package/dist/admin/results/ArmTable.js +112 -0
- package/dist/admin/results/CappedCell.d.ts +4 -0
- package/dist/admin/results/CappedCell.js +24 -0
- package/dist/admin/results/CiChart.d.ts +10 -0
- package/dist/admin/results/CiChart.js +178 -0
- package/dist/admin/results/DataQualityPanel.d.ts +4 -0
- package/dist/admin/results/DataQualityPanel.js +40 -0
- package/dist/admin/results/ResultsView.d.ts +3 -0
- package/dist/admin/results/ResultsView.js +312 -0
- package/dist/admin/results/VerdictCard.d.ts +9 -0
- package/dist/admin/results/VerdictCard.js +49 -0
- package/dist/admin/results/chart.model.d.ts +32 -0
- package/dist/admin/results/chart.model.js +52 -0
- package/dist/admin/results/format.d.ts +10 -0
- package/dist/admin/results/format.js +55 -0
- package/dist/admin/results/results.model.d.ts +105 -0
- package/dist/admin/results/results.model.js +175 -0
- package/dist/admin/review/ReviewPanel.d.ts +2 -0
- package/dist/admin/review/ReviewPanel.js +268 -0
- package/dist/admin/review/review.model.d.ts +31 -0
- package/dist/admin/review/review.model.js +40 -0
- package/dist/admin/status.model.d.ts +16 -0
- package/dist/admin/status.model.js +17 -0
- package/dist/admin/styles.css +10 -0
- package/dist/admin/styles.d.ts +1 -0
- package/dist/admin/styles.js +2 -0
- package/dist/admin/summaryBatcher.d.ts +8 -0
- package/dist/admin/summaryBatcher.js +33 -0
- package/dist/admin/targeting/TargetingAttributeField.d.ts +2 -0
- package/dist/admin/targeting/TargetingAttributeField.js +31 -0
- package/dist/admin/targeting/TargetingOpField.d.ts +2 -0
- package/dist/admin/targeting/TargetingOpField.js +45 -0
- package/dist/admin/targeting/TargetingValueField.d.ts +2 -0
- package/dist/admin/targeting/TargetingValueField.js +142 -0
- package/dist/admin/targeting/targeting.model.d.ts +18 -0
- package/dist/admin/targeting/targeting.model.js +48 -0
- package/dist/admin/useApi.d.ts +20 -0
- package/dist/admin/useApi.js +10 -0
- package/dist/admin/useLayerUsage.d.ts +15 -0
- package/dist/admin/useLayerUsage.js +92 -0
- package/dist/client/ExperimentPageview.d.ts +1 -0
- package/dist/client/ExperimentPageview.js +27 -0
- package/dist/client/ExperimentsProvider.d.ts +6 -0
- package/dist/client/ExperimentsProvider.js +22 -0
- package/dist/client/ViewportExposure.d.ts +9 -0
- package/dist/client/ViewportExposure.js +69 -0
- package/dist/client/beacon.d.ts +17 -0
- package/dist/client/beacon.js +71 -0
- package/dist/client/context.d.ts +2 -0
- package/dist/client/context.js +2 -0
- package/dist/client/idempotency.d.ts +2 -0
- package/dist/client/idempotency.js +13 -0
- package/dist/client/trackConversionBeacon.d.ts +3 -0
- package/dist/client/trackConversionBeacon.js +16 -0
- package/dist/client/useExperiment.d.ts +5 -0
- package/dist/client/useExperiment.js +27 -0
- package/dist/client/useFlagPoint.d.ts +9 -0
- package/dist/client/useFlagPoint.js +32 -0
- package/dist/collections/access.d.ts +21 -0
- package/dist/collections/access.js +25 -0
- package/dist/collections/events.d.ts +3 -0
- package/dist/collections/events.js +117 -0
- package/dist/collections/experiments/armInvariants.d.ts +12 -0
- package/dist/collections/experiments/armInvariants.js +89 -0
- package/dist/collections/experiments/config.d.ts +3 -0
- package/dist/collections/experiments/config.js +574 -0
- package/dist/collections/experiments/createDefaults.d.ts +2 -0
- package/dist/collections/experiments/createDefaults.js +7 -0
- package/dist/collections/experiments/deleteGuard.d.ts +3 -0
- package/dist/collections/experiments/deleteGuard.js +8 -0
- package/dist/collections/experiments/editability.d.ts +4 -0
- package/dist/collections/experiments/editability.js +35 -0
- package/dist/collections/experiments/flagControlParams.d.ts +2 -0
- package/dist/collections/experiments/flagControlParams.js +32 -0
- package/dist/collections/experiments/lockHook.d.ts +2 -0
- package/dist/collections/experiments/lockHook.js +134 -0
- package/dist/collections/identities.d.ts +3 -0
- package/dist/collections/identities.js +30 -0
- package/dist/collections/index.d.ts +6 -0
- package/dist/collections/index.js +24 -0
- package/dist/collections/layers.d.ts +3 -0
- package/dist/collections/layers.js +77 -0
- package/dist/collections/metrics.d.ts +3 -0
- package/dist/collections/metrics.js +115 -0
- package/dist/collections/phases.d.ts +3 -0
- package/dist/collections/phases.js +59 -0
- package/dist/collections/serialize.d.ts +5 -0
- package/dist/collections/serialize.js +40 -0
- package/dist/collections/snapshots.d.ts +3 -0
- package/dist/collections/snapshots.js +47 -0
- package/dist/constants.d.ts +7 -0
- package/dist/constants.js +7 -0
- package/dist/db/adapter.d.ts +3 -0
- package/dist/db/adapter.js +9 -0
- package/dist/db/appends.d.ts +58 -0
- package/dist/db/appends.js +116 -0
- package/dist/db/delete.d.ts +17 -0
- package/dist/db/delete.js +35 -0
- package/dist/db/erase.d.ts +12 -0
- package/dist/db/erase.js +55 -0
- package/dist/db/events.d.ts +21 -0
- package/dist/db/events.js +100 -0
- package/dist/db/executor.d.ts +10 -0
- package/dist/db/executor.js +37 -0
- package/dist/db/identities.d.ts +11 -0
- package/dist/db/identities.js +29 -0
- package/dist/db/locks.d.ts +15 -0
- package/dist/db/locks.js +23 -0
- package/dist/db/manifest.d.ts +8 -0
- package/dist/db/manifest.js +8 -0
- package/dist/db/names.d.ts +271 -0
- package/dist/db/names.js +270 -0
- package/dist/db/pgExecutor.d.ts +41 -0
- package/dist/db/pgExecutor.js +250 -0
- package/dist/db/results.d.ts +53 -0
- package/dist/db/results.js +103 -0
- package/dist/db/slices.d.ts +18 -0
- package/dist/db/slices.js +51 -0
- package/dist/db/snapshots.d.ts +47 -0
- package/dist/db/snapshots.js +89 -0
- package/dist/db/sql.d.ts +5 -0
- package/dist/db/sql.js +5 -0
- package/dist/db/state.d.ts +12 -0
- package/dist/db/state.js +27 -0
- package/dist/db/sweep.d.ts +13 -0
- package/dist/db/sweep.js +90 -0
- package/dist/db/txid.d.ts +7 -0
- package/dist/db/txid.js +12 -0
- package/dist/define.d.ts +3 -0
- package/dist/define.js +6 -0
- package/dist/endpoints/events.d.ts +7 -0
- package/dist/endpoints/events.js +98 -0
- package/dist/endpoints/index.d.ts +18 -0
- package/dist/endpoints/index.js +160 -0
- package/dist/endpoints/manifest.d.ts +7 -0
- package/dist/endpoints/manifest.js +30 -0
- package/dist/endpoints/preflight.d.ts +8 -0
- package/dist/endpoints/preflight.js +25 -0
- package/dist/endpoints/previewToken.d.ts +7 -0
- package/dist/endpoints/previewToken.js +54 -0
- package/dist/endpoints/recompute.d.ts +7 -0
- package/dist/endpoints/recompute.js +41 -0
- package/dist/endpoints/results.d.ts +24 -0
- package/dist/endpoints/results.js +136 -0
- package/dist/endpoints/summary.d.ts +7 -0
- package/dist/endpoints/summary.js +40 -0
- package/dist/endpoints/transitions.d.ts +42 -0
- package/dist/endpoints/transitions.js +154 -0
- package/dist/errors.d.ts +27 -0
- package/dist/errors.js +33 -0
- package/dist/events/body.d.ts +7 -0
- package/dist/events/body.js +43 -0
- package/dist/events/dimensions.d.ts +4 -0
- package/dist/events/dimensions.js +51 -0
- package/dist/events/preview.d.ts +2 -0
- package/dist/events/preview.js +9 -0
- package/dist/events/request.d.ts +3 -0
- package/dist/events/request.js +14 -0
- package/dist/events/rows.d.ts +7 -0
- package/dist/events/rows.js +65 -0
- package/dist/exports/adminClient.d.ts +16 -0
- package/dist/exports/adminClient.js +17 -0
- package/dist/exports/client.d.ts +7 -0
- package/dist/exports/client.js +7 -0
- package/dist/exports/index.d.ts +4 -0
- package/dist/exports/index.js +3 -0
- package/dist/exports/proxy.d.ts +4 -0
- package/dist/exports/proxy.js +3 -0
- package/dist/exports/puck.d.ts +4 -0
- package/dist/exports/puck.js +3 -0
- package/dist/exports/puckEditor.d.ts +1 -0
- package/dist/exports/puckEditor.js +2 -0
- package/dist/exports/rsc.d.ts +13 -0
- package/dist/exports/rsc.js +13 -0
- package/dist/exports/runtimeProxy.d.ts +4 -0
- package/dist/exports/runtimeProxy.js +2 -0
- package/dist/exports/runtimeServer.d.ts +2 -0
- package/dist/exports/runtimeServer.js +1 -0
- package/dist/fields/armSelect.d.ts +7 -0
- package/dist/fields/armSelect.js +33 -0
- package/dist/globals/state.d.ts +3 -0
- package/dist/globals/state.js +31 -0
- package/dist/hooks/contentChanges.d.ts +3 -0
- package/dist/hooks/contentChanges.js +10 -0
- package/dist/hooks/hostHook.d.ts +5 -0
- package/dist/hooks/hostHook.js +20 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +4 -0
- package/dist/manifest/cache.d.ts +10 -0
- package/dist/manifest/cache.js +51 -0
- package/dist/manifest/compile.d.ts +63 -0
- package/dist/manifest/compile.js +237 -0
- package/dist/onInit.d.ts +5 -0
- package/dist/onInit.js +13 -0
- package/dist/options/fromReq.d.ts +3 -0
- package/dist/options/fromReq.js +5 -0
- package/dist/options.d.ts +9 -0
- package/dist/options.js +99 -0
- package/dist/plugin.d.ts +7 -0
- package/dist/plugin.js +62 -0
- package/dist/proxy/apply.d.ts +3 -0
- package/dist/proxy/apply.js +5 -0
- package/dist/proxy/consentFallback.d.ts +5 -0
- package/dist/proxy/consentFallback.js +27 -0
- package/dist/proxy/control.d.ts +6 -0
- package/dist/proxy/control.js +36 -0
- package/dist/proxy/createProxy.d.ts +3 -0
- package/dist/proxy/createProxy.js +15 -0
- package/dist/proxy/pageRewrite.d.ts +4 -0
- package/dist/proxy/pageRewrite.js +41 -0
- package/dist/proxy/resolve.d.ts +13 -0
- package/dist/proxy/resolve.js +163 -0
- package/dist/proxy/skip.d.ts +1 -0
- package/dist/proxy/skip.js +9 -0
- package/dist/puck/ExperimentPicker.d.ts +5 -0
- package/dist/puck/ExperimentPicker.js +88 -0
- package/dist/puck/ExperimentSlot.d.ts +3 -0
- package/dist/puck/ExperimentSlot.js +16 -0
- package/dist/puck/copy.d.ts +14 -0
- package/dist/puck/copy.js +14 -0
- package/dist/puck/editor/CreateExperimentDrawer.d.ts +5 -0
- package/dist/puck/editor/CreateExperimentDrawer.js +120 -0
- package/dist/puck/editor/ExperimentSlotEditor.d.ts +3 -0
- package/dist/puck/editor/ExperimentSlotEditor.js +225 -0
- package/dist/puck/editor/cloneSlot.d.ts +3 -0
- package/dist/puck/editor/cloneSlot.js +41 -0
- package/dist/puck/editor/copy.d.ts +25 -0
- package/dist/puck/editor/copy.js +25 -0
- package/dist/puck/editor/editor.model.d.ts +16 -0
- package/dist/puck/editor/editor.model.js +33 -0
- package/dist/puck/experimentSlotField.d.ts +5 -0
- package/dist/puck/experimentSlotField.js +13 -0
- package/dist/puck/slot.model.d.ts +2 -0
- package/dist/puck/slot.model.js +11 -0
- package/dist/puck/slotConfig.d.ts +5 -0
- package/dist/puck/slotConfig.js +25 -0
- package/dist/results/aggregate.d.ts +34 -0
- package/dist/results/aggregate.js +66 -0
- package/dist/results/analyse.d.ts +79 -0
- package/dist/results/analyse.js +378 -0
- package/dist/results/cuped.d.ts +16 -0
- package/dist/results/cuped.js +31 -0
- package/dist/results/decideGuard.d.ts +3 -0
- package/dist/results/decideGuard.js +8 -0
- package/dist/results/guardrails.d.ts +17 -0
- package/dist/results/guardrails.js +10 -0
- package/dist/results/history.d.ts +13 -0
- package/dist/results/history.js +39 -0
- package/dist/results/identityCredit.d.ts +16 -0
- package/dist/results/identityCredit.js +46 -0
- package/dist/results/power.d.ts +15 -0
- package/dist/results/power.js +60 -0
- package/dist/results/rolloutUnits.d.ts +17 -0
- package/dist/results/rolloutUnits.js +26 -0
- package/dist/results/snapshot.d.ts +9 -0
- package/dist/results/snapshot.js +154 -0
- package/dist/results/srm.d.ts +9 -0
- package/dist/results/srm.js +22 -0
- package/dist/results/verdict.d.ts +82 -0
- package/dist/results/verdict.js +85 -0
- package/dist/runtime/assign.d.ts +23 -0
- package/dist/runtime/assign.js +104 -0
- package/dist/runtime/bot.d.ts +1 -0
- package/dist/runtime/bot.js +7 -0
- package/dist/runtime/cookie.d.ts +17 -0
- package/dist/runtime/cookie.js +35 -0
- package/dist/runtime/eligibility.d.ts +22 -0
- package/dist/runtime/eligibility.js +20 -0
- package/dist/runtime/header.d.ts +17 -0
- package/dist/runtime/header.js +97 -0
- package/dist/runtime/loaders.d.ts +17 -0
- package/dist/runtime/loaders.js +29 -0
- package/dist/runtime/normalisePath.d.ts +7 -0
- package/dist/runtime/normalisePath.js +15 -0
- package/dist/runtime/previewToken.d.ts +9 -0
- package/dist/runtime/previewToken.js +23 -0
- package/dist/runtime/proxyRuntime.d.ts +2 -0
- package/dist/runtime/proxyRuntime.js +22 -0
- package/dist/runtime/seed.d.ts +2 -0
- package/dist/runtime/seed.js +4 -0
- package/dist/runtime/signing.d.ts +3 -0
- package/dist/runtime/signing.js +16 -0
- package/dist/runtime/targeting.d.ts +6 -0
- package/dist/runtime/targeting.js +9 -0
- package/dist/server/context.d.ts +10 -0
- package/dist/server/context.js +59 -0
- package/dist/server/eraseUser.d.ts +7 -0
- package/dist/server/eraseUser.js +4 -0
- package/dist/server/getAssignments.d.ts +9 -0
- package/dist/server/getAssignments.js +227 -0
- package/dist/server/getFlagPoint.d.ts +11 -0
- package/dist/server/getFlagPoint.js +36 -0
- package/dist/server/headerRevision.d.ts +6 -0
- package/dist/server/headerRevision.js +10 -0
- package/dist/server/linkIdentity.d.ts +9 -0
- package/dist/server/linkIdentity.js +34 -0
- package/dist/server/metadata.d.ts +7 -0
- package/dist/server/metadata.js +24 -0
- package/dist/server/previewDraft.d.ts +7 -0
- package/dist/server/previewDraft.js +51 -0
- package/dist/server/recordContentChange.d.ts +7 -0
- package/dist/server/recordContentChange.js +150 -0
- package/dist/server/recordExposures.d.ts +7 -0
- package/dist/server/recordExposures.js +56 -0
- package/dist/server/request.d.ts +7 -0
- package/dist/server/request.js +39 -0
- package/dist/server/resolveExperimentData.d.ts +6 -0
- package/dist/server/resolveExperimentData.js +64 -0
- package/dist/server/runResults.d.ts +22 -0
- package/dist/server/runResults.js +307 -0
- package/dist/server/serverRuntime.d.ts +7 -0
- package/dist/server/serverRuntime.js +20 -0
- package/dist/server/sitemap.d.ts +3 -0
- package/dist/server/sitemap.js +6 -0
- package/dist/server/toClientAssignments.d.ts +7 -0
- package/dist/server/toClientAssignments.js +56 -0
- package/dist/server/trackConversion.d.ts +12 -0
- package/dist/server/trackConversion.js +69 -0
- package/dist/targeting/ops.d.ts +8 -0
- package/dist/targeting/ops.js +58 -0
- package/dist/transitions/addMetric.d.ts +16 -0
- package/dist/transitions/addMetric.js +126 -0
- package/dist/transitions/allocate.d.ts +9 -0
- package/dist/transitions/allocate.js +84 -0
- package/dist/transitions/archive.d.ts +9 -0
- package/dist/transitions/archive.js +46 -0
- package/dist/transitions/checkStart.d.ts +61 -0
- package/dist/transitions/checkStart.js +104 -0
- package/dist/transitions/confirmPhrases.d.ts +5 -0
- package/dist/transitions/confirmPhrases.js +18 -0
- package/dist/transitions/decide.d.ts +9 -0
- package/dist/transitions/decide.js +138 -0
- package/dist/transitions/deleteExperiment.d.ts +5 -0
- package/dist/transitions/deleteExperiment.js +66 -0
- package/dist/transitions/kernel.d.ts +31 -0
- package/dist/transitions/kernel.js +69 -0
- package/dist/transitions/makeContent.d.ts +20 -0
- package/dist/transitions/makeContent.js +411 -0
- package/dist/transitions/phaseRecord.d.ts +27 -0
- package/dist/transitions/phaseRecord.js +81 -0
- package/dist/transitions/placements.d.ts +26 -0
- package/dist/transitions/placements.js +89 -0
- package/dist/transitions/preflightData.d.ts +21 -0
- package/dist/transitions/preflightData.js +317 -0
- package/dist/transitions/releaseHoldout.d.ts +8 -0
- package/dist/transitions/releaseHoldout.js +30 -0
- package/dist/transitions/resolveCaps.d.ts +28 -0
- package/dist/transitions/resolveCaps.js +68 -0
- package/dist/transitions/start.d.ts +26 -0
- package/dist/transitions/start.js +220 -0
- package/dist/transitions/stop.d.ts +8 -0
- package/dist/transitions/stop.js +25 -0
- package/dist/types/admin.d.ts +20 -0
- package/dist/types/admin.js +1 -0
- package/dist/types/assignments.d.ts +57 -0
- package/dist/types/assignments.js +1 -0
- package/dist/types/contracts.d.ts +133 -0
- package/dist/types/contracts.js +2 -0
- package/dist/types/endpoints.d.ts +135 -0
- package/dist/types/endpoints.js +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.js +8 -0
- package/dist/types/manifest.d.ts +42 -0
- package/dist/types/manifest.js +1 -0
- package/dist/types/puck.d.ts +23 -0
- package/dist/types/puck.js +1 -0
- package/dist/types/runtime.d.ts +59 -0
- package/dist/types/runtime.js +1 -0
- package/dist/types/snapshot.d.ts +117 -0
- package/dist/types/snapshot.js +1 -0
- package/package.json +137 -3
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { XP_HEADER, XP_REQUEST_HEADER } from '../constants.js';
|
|
2
|
+
import { createManifestCache } from '../manifest/cache.js';
|
|
3
|
+
import { assign, fillFlagPoints } from '../runtime/assign.js';
|
|
4
|
+
import { sign } from '../runtime/signing.js';
|
|
5
|
+
import { requestAttributes } from '../runtime/normalisePath.js';
|
|
6
|
+
import { isBot } from '../runtime/bot.js';
|
|
7
|
+
import { cookieAttributes, encodeUnitCookie, mintUnitId, verifyUnitCookie } from '../runtime/cookie.js';
|
|
8
|
+
import { encodeAssignmentsHeader } from '../runtime/header.js';
|
|
9
|
+
import { verifyPreviewToken } from '../runtime/previewToken.js';
|
|
10
|
+
import { pageRewrite } from './pageRewrite.js';
|
|
11
|
+
import { skipPath } from './skip.js';
|
|
12
|
+
import { controlAssignments, emptyAssignments } from './control.js';
|
|
13
|
+
import { consentFallback } from './consentFallback.js';
|
|
14
|
+
const caches = new WeakMap();
|
|
15
|
+
export async function resolveExperiments(request, proxyRuntime) {
|
|
16
|
+
const requestHeaders = new Headers(request.headers);
|
|
17
|
+
const result = {
|
|
18
|
+
requestHeaders,
|
|
19
|
+
requestCookies: [],
|
|
20
|
+
setCookies: []
|
|
21
|
+
};
|
|
22
|
+
for (const name of [
|
|
23
|
+
...requestHeaders.keys()
|
|
24
|
+
])if (name.startsWith('x-xp-')) requestHeaders.delete(name);
|
|
25
|
+
if (skipPath(request.nextUrl.pathname, proxyRuntime.apiRoute)) return result;
|
|
26
|
+
let consent = false;
|
|
27
|
+
try {
|
|
28
|
+
consent = proxyRuntime.cookie.consent?.(request) !== false;
|
|
29
|
+
} catch {
|
|
30
|
+
console.error('[payload-experiments] consent failed; treating consent as false');
|
|
31
|
+
}
|
|
32
|
+
const requestContext = `${request.method}|${request.nextUrl.pathname}${request.nextUrl.search}|${consent ? 'c1' : 'c0'}`;
|
|
33
|
+
const signedContext = `${requestContext}|${sign(`xp:request:${requestContext}`, proxyRuntime.secrets)}`;
|
|
34
|
+
if (Buffer.byteLength(signedContext) <= 2048) requestHeaders.set(XP_REQUEST_HEADER, signedContext);
|
|
35
|
+
const name = proxyRuntime.cookie.name;
|
|
36
|
+
let visitorId = consent ? verifyUnitCookie(request.cookies.get(name)?.value, proxyRuntime.secrets) ?? undefined : undefined;
|
|
37
|
+
if (!consent) {
|
|
38
|
+
const cookies = (requestHeaders.get('cookie') ?? '').split(';').map((cookie)=>cookie.trim()).filter((cookie)=>cookie && cookie.split('=', 1)[0]?.trim() !== name);
|
|
39
|
+
if (cookies.length) requestHeaders.set('cookie', cookies.join('; '));
|
|
40
|
+
else requestHeaders.delete('cookie');
|
|
41
|
+
} else if (!visitorId) {
|
|
42
|
+
visitorId = mintUnitId();
|
|
43
|
+
const value = encodeUnitCookie(visitorId, proxyRuntime.secrets);
|
|
44
|
+
result.requestCookies.push({
|
|
45
|
+
name,
|
|
46
|
+
value
|
|
47
|
+
});
|
|
48
|
+
result.setCookies.push({
|
|
49
|
+
name,
|
|
50
|
+
value,
|
|
51
|
+
...cookieAttributes(proxyRuntime, {
|
|
52
|
+
https: request.nextUrl.protocol === 'https:'
|
|
53
|
+
})
|
|
54
|
+
});
|
|
55
|
+
const cookies = (request.headers.get('cookie') ?? '').split(';').map((cookie)=>cookie.trim()).filter((cookie)=>cookie && cookie.split('=', 1)[0] !== name);
|
|
56
|
+
cookies.push(`${name}=${value}`);
|
|
57
|
+
requestHeaders.set('cookie', cookies.join('; '));
|
|
58
|
+
}
|
|
59
|
+
let resolvedUnit = {
|
|
60
|
+
attributes: {}
|
|
61
|
+
};
|
|
62
|
+
try {
|
|
63
|
+
resolvedUnit = await proxyRuntime.getUnit?.(request) ?? resolvedUnit;
|
|
64
|
+
} catch {
|
|
65
|
+
console.error('[payload-experiments] getUnit failed; treating session as unknown');
|
|
66
|
+
resolvedUnit = {
|
|
67
|
+
attributes: {},
|
|
68
|
+
sessionUnknown: true
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const { attributes: unitAttributes, sessionUnknown } = resolvedUnit;
|
|
72
|
+
const userId = consent ? resolvedUnit.userId : undefined;
|
|
73
|
+
const attributes = requestAttributes(unitAttributes, request.nextUrl.pathname);
|
|
74
|
+
let cache = caches.get(proxyRuntime);
|
|
75
|
+
if (!cache && proxyRuntime.loadManifest) {
|
|
76
|
+
cache = createManifestCache(proxyRuntime.loadManifest);
|
|
77
|
+
caches.set(proxyRuntime, cache);
|
|
78
|
+
}
|
|
79
|
+
const manifest = await cache?.get() ?? null;
|
|
80
|
+
const now = Math.floor(Date.now() / 1000);
|
|
81
|
+
const token = verifyPreviewToken(request.nextUrl.searchParams.get('xp_preview') ?? '', proxyRuntime.secrets, now);
|
|
82
|
+
const previewExperiment = token && manifest?.experiments.find((experiment)=>experiment.id === token.e && experiment.phase === token.p && (experiment.status === 'running' || experiment.status === 'decided') && experiment.arms.some((arm)=>arm.key === token.a));
|
|
83
|
+
const currentManifest = manifest ?? {
|
|
84
|
+
v: 1,
|
|
85
|
+
revision: 0,
|
|
86
|
+
experiments: [],
|
|
87
|
+
flagDefaults: {},
|
|
88
|
+
archivedWinners: {},
|
|
89
|
+
archivedPages: {}
|
|
90
|
+
};
|
|
91
|
+
const context = {
|
|
92
|
+
visitorId,
|
|
93
|
+
userId,
|
|
94
|
+
staff: attributes.staff === true,
|
|
95
|
+
bot: isBot(request.headers.get('user-agent')),
|
|
96
|
+
preview: Boolean(previewExperiment),
|
|
97
|
+
sessionUnknown: sessionUnknown ?? false,
|
|
98
|
+
method: request.method
|
|
99
|
+
};
|
|
100
|
+
let assignments;
|
|
101
|
+
let assignmentFailed = false;
|
|
102
|
+
if (!consent) {
|
|
103
|
+
try {
|
|
104
|
+
assignments = consentFallback(currentManifest, attributes, context);
|
|
105
|
+
} catch {
|
|
106
|
+
console.error('[payload-experiments] consent fallback failed; serving non-exposable control');
|
|
107
|
+
assignmentFailed = true;
|
|
108
|
+
try {
|
|
109
|
+
assignments = controlAssignments(currentManifest, context);
|
|
110
|
+
} catch {
|
|
111
|
+
assignments = emptyAssignments(context);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
} else {
|
|
115
|
+
try {
|
|
116
|
+
assignments = assign(currentManifest, {
|
|
117
|
+
visitorId,
|
|
118
|
+
userId,
|
|
119
|
+
sessionUnknown
|
|
120
|
+
}, attributes, {
|
|
121
|
+
...context,
|
|
122
|
+
now
|
|
123
|
+
});
|
|
124
|
+
} catch {
|
|
125
|
+
console.error('[payload-experiments] assign failed; serving non-exposable control');
|
|
126
|
+
assignmentFailed = true;
|
|
127
|
+
try {
|
|
128
|
+
assignments = controlAssignments(currentManifest, context);
|
|
129
|
+
} catch {
|
|
130
|
+
assignments = emptyAssignments(context);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (previewExperiment && token) {
|
|
135
|
+
if (consent && !assignmentFailed) {
|
|
136
|
+
assignments.deferred = assignments.deferred.filter((slug)=>slug !== previewExperiment.slug);
|
|
137
|
+
assignments.bySlug[previewExperiment.slug] = {
|
|
138
|
+
slug: previewExperiment.slug,
|
|
139
|
+
experimentId: previewExperiment.id,
|
|
140
|
+
arm: token.a,
|
|
141
|
+
phase: previewExperiment.phase,
|
|
142
|
+
exposable: false,
|
|
143
|
+
policy: previewExperiment.exposurePolicy,
|
|
144
|
+
source: 'preview'
|
|
145
|
+
};
|
|
146
|
+
fillFlagPoints(assignments, currentManifest);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (token) result.responseHeaders = new Headers({
|
|
150
|
+
'Cache-Control': 'no-store'
|
|
151
|
+
});
|
|
152
|
+
if (manifest && !assignmentFailed) result.rewrite = pageRewrite(manifest, assignments, request.nextUrl);
|
|
153
|
+
try {
|
|
154
|
+
requestHeaders.set(XP_HEADER, encodeAssignmentsHeader(assignments, {
|
|
155
|
+
secrets: proxyRuntime.secrets,
|
|
156
|
+
manifest: manifest ?? undefined
|
|
157
|
+
}));
|
|
158
|
+
} catch {
|
|
159
|
+
// The server recomputes from the signed cookie and request context.
|
|
160
|
+
// Without request context it fails closed; signed c0 keeps recompute identity-free.
|
|
161
|
+
}
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function skipPath(path: string, apiRoute: string): boolean;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
const ASSET_EXTENSION = /\.(?:js|mjs|css|map|png|jpg|jpeg|gif|webp|avif|svg|ico|woff|woff2|ttf|otf|eot|txt|xml|json|pdf|webmanifest|mp4|webm|mp3|wav)$/i;
|
|
2
|
+
export function skipPath(path, apiRoute) {
|
|
3
|
+
const under = (prefix)=>path === prefix || path.startsWith(`${prefix}/`);
|
|
4
|
+
const apiPrefix = apiRoute.replace(/\/+$/, '');
|
|
5
|
+
// Only the last segment's extension counts, and only for known asset types: `/blog/v1.2`
|
|
6
|
+
// and `/users/john.doe` are pages; a path ending in `.js` is treated as a script.
|
|
7
|
+
const asset = ASSET_EXTENSION.test(path.slice(path.lastIndexOf('/') + 1));
|
|
8
|
+
return under('/admin') || under('/_next') || apiPrefix !== '' && under(apiPrefix) || asset;
|
|
9
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
import { pickerCopy } from './copy.js';
|
|
5
|
+
function isExperimentOption(value) {
|
|
6
|
+
if (!value || typeof value !== 'object') return false;
|
|
7
|
+
const doc = value;
|
|
8
|
+
return (typeof doc.id === 'string' || typeof doc.id === 'number') && typeof doc.slug === 'string' && typeof doc.name === 'string' && typeof doc.status === 'string' && Object.hasOwn(pickerCopy.statuses, doc.status);
|
|
9
|
+
}
|
|
10
|
+
export function ExperimentPicker({ value, onChange }) {
|
|
11
|
+
const [experiments, setExperiments] = useState([]);
|
|
12
|
+
const [state, setState] = useState('loading');
|
|
13
|
+
useEffect(()=>{
|
|
14
|
+
let active = true;
|
|
15
|
+
const controller = new AbortController();
|
|
16
|
+
async function load() {
|
|
17
|
+
try {
|
|
18
|
+
const response = await fetch('/api/xp-experiments?where[kind][equals]=block&depth=0&limit=100&sort=-updatedAt', {
|
|
19
|
+
credentials: 'include',
|
|
20
|
+
signal: controller.signal
|
|
21
|
+
});
|
|
22
|
+
if (!active) return;
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
setState(response.status === 403 ? 'forbidden' : 'error');
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const data = await response.json();
|
|
28
|
+
if (!active) return;
|
|
29
|
+
if (!data || typeof data !== 'object' || !('docs' in data) || !Array.isArray(data.docs)) {
|
|
30
|
+
setState('error');
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
setExperiments(data.docs.filter(isExperimentOption));
|
|
34
|
+
setState('ready');
|
|
35
|
+
} catch {
|
|
36
|
+
if (active) setState('error');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
void load();
|
|
40
|
+
return ()=>{
|
|
41
|
+
active = false;
|
|
42
|
+
controller.abort();
|
|
43
|
+
};
|
|
44
|
+
}, []);
|
|
45
|
+
const selected = value ? String(value.id) : '';
|
|
46
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
47
|
+
children: [
|
|
48
|
+
/*#__PURE__*/ _jsxs("select", {
|
|
49
|
+
"aria-label": pickerCopy.label,
|
|
50
|
+
value: selected,
|
|
51
|
+
disabled: state === 'loading',
|
|
52
|
+
onChange: (event)=>{
|
|
53
|
+
const experiment = experiments.find((doc)=>String(doc.id) === event.currentTarget.value);
|
|
54
|
+
onChange(experiment ? {
|
|
55
|
+
id: experiment.id,
|
|
56
|
+
slug: experiment.slug
|
|
57
|
+
} : null);
|
|
58
|
+
},
|
|
59
|
+
children: [
|
|
60
|
+
/*#__PURE__*/ _jsx("option", {
|
|
61
|
+
value: "",
|
|
62
|
+
children: pickerCopy.none
|
|
63
|
+
}),
|
|
64
|
+
value && !experiments.some((doc)=>String(doc.id) === selected) ? /*#__PURE__*/ _jsx("option", {
|
|
65
|
+
value: selected,
|
|
66
|
+
children: value.slug
|
|
67
|
+
}) : null,
|
|
68
|
+
experiments.map((doc)=>/*#__PURE__*/ _jsxs("option", {
|
|
69
|
+
value: String(doc.id),
|
|
70
|
+
children: [
|
|
71
|
+
doc.name,
|
|
72
|
+
" · ",
|
|
73
|
+
pickerCopy.statuses[doc.status]
|
|
74
|
+
]
|
|
75
|
+
}, doc.id))
|
|
76
|
+
]
|
|
77
|
+
}),
|
|
78
|
+
state === 'loading' ? /*#__PURE__*/ _jsx("p", {
|
|
79
|
+
role: "status",
|
|
80
|
+
children: pickerCopy.loading
|
|
81
|
+
}) : null,
|
|
82
|
+
state === 'error' || state === 'forbidden' ? /*#__PURE__*/ _jsx("p", {
|
|
83
|
+
role: "alert",
|
|
84
|
+
children: pickerCopy[state]
|
|
85
|
+
}) : null
|
|
86
|
+
]
|
|
87
|
+
});
|
|
88
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { ViewportExposure } from '../client/ViewportExposure.js';
|
|
3
|
+
import { experimentSlotDefaultProps, experimentSlotFields, experimentSlotLabel } from './slotConfig.js';
|
|
4
|
+
import { slotToRender } from './slot.model.js';
|
|
5
|
+
export const ExperimentSlot = {
|
|
6
|
+
label: experimentSlotLabel,
|
|
7
|
+
fields: experimentSlotFields,
|
|
8
|
+
defaultProps: experimentSlotDefaultProps,
|
|
9
|
+
render: (props)=>{
|
|
10
|
+
const Slot = props[slotToRender(props)];
|
|
11
|
+
return /*#__PURE__*/ _jsx(ViewportExposure, {
|
|
12
|
+
expose: props.xpExpose,
|
|
13
|
+
children: /*#__PURE__*/ _jsx(Slot, {})
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const pickerCopy: {
|
|
2
|
+
readonly label: "Experiment";
|
|
3
|
+
readonly none: "No experiment";
|
|
4
|
+
readonly loading: "Loading experiments…";
|
|
5
|
+
readonly error: "Couldn't load experiments.";
|
|
6
|
+
readonly forbidden: "You can't see experiments. Ask an admin.";
|
|
7
|
+
readonly statuses: {
|
|
8
|
+
readonly draft: "Draft";
|
|
9
|
+
readonly running: "Running";
|
|
10
|
+
readonly stopped: "Stopped";
|
|
11
|
+
readonly decided: "Decided";
|
|
12
|
+
readonly archived: "Archived";
|
|
13
|
+
};
|
|
14
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const pickerCopy = {
|
|
2
|
+
label: 'Experiment',
|
|
3
|
+
none: 'No experiment',
|
|
4
|
+
loading: 'Loading experiments…',
|
|
5
|
+
error: "Couldn't load experiments.",
|
|
6
|
+
forbidden: "You can't see experiments. Ask an admin.",
|
|
7
|
+
statuses: {
|
|
8
|
+
draft: 'Draft',
|
|
9
|
+
running: 'Running',
|
|
10
|
+
stopped: 'Stopped',
|
|
11
|
+
decided: 'Decided',
|
|
12
|
+
archived: 'Archived'
|
|
13
|
+
}
|
|
14
|
+
};
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useId, useState } from 'react';
|
|
4
|
+
import { slugify } from './editor.model.js';
|
|
5
|
+
import { editorCopy } from './copy.js';
|
|
6
|
+
export function CreateExperimentDrawer({ onCreate, onClose }) {
|
|
7
|
+
const titleId = useId();
|
|
8
|
+
const [name, setName] = useState('');
|
|
9
|
+
const [slug, setSlug] = useState('');
|
|
10
|
+
const [slugEdited, setSlugEdited] = useState(false);
|
|
11
|
+
const [pending, setPending] = useState(false);
|
|
12
|
+
const [error, setError] = useState('');
|
|
13
|
+
async function submitNew() {
|
|
14
|
+
setPending(true);
|
|
15
|
+
setError('');
|
|
16
|
+
try {
|
|
17
|
+
const response = await fetch('/api/xp-experiments', {
|
|
18
|
+
method: 'POST',
|
|
19
|
+
credentials: 'include',
|
|
20
|
+
headers: {
|
|
21
|
+
'Content-Type': 'application/json'
|
|
22
|
+
},
|
|
23
|
+
body: JSON.stringify({
|
|
24
|
+
name,
|
|
25
|
+
slug,
|
|
26
|
+
kind: 'block',
|
|
27
|
+
unitType: 'visitor'
|
|
28
|
+
})
|
|
29
|
+
});
|
|
30
|
+
const body = await response.json();
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
setError(typeof body?.errors?.[0]?.message === 'string' ? body.errors[0].message : editorCopy.createError);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const doc = body?.doc;
|
|
36
|
+
if (!doc || typeof doc.id !== 'string' && typeof doc.id !== 'number' || typeof doc.slug !== 'string') {
|
|
37
|
+
setError(editorCopy.createError);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
onCreate({
|
|
41
|
+
id: doc.id,
|
|
42
|
+
slug: doc.slug
|
|
43
|
+
});
|
|
44
|
+
onClose();
|
|
45
|
+
} catch {
|
|
46
|
+
setError(editorCopy.createError);
|
|
47
|
+
} finally{
|
|
48
|
+
setPending(false);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return /*#__PURE__*/ _jsxs("aside", {
|
|
52
|
+
role: "dialog",
|
|
53
|
+
"aria-labelledby": titleId,
|
|
54
|
+
style: {
|
|
55
|
+
padding: 16,
|
|
56
|
+
border: '1px solid #aaa',
|
|
57
|
+
background: 'Canvas',
|
|
58
|
+
color: 'CanvasText'
|
|
59
|
+
},
|
|
60
|
+
children: [
|
|
61
|
+
/*#__PURE__*/ _jsx("h3", {
|
|
62
|
+
id: titleId,
|
|
63
|
+
children: editorCopy.createLabel
|
|
64
|
+
}),
|
|
65
|
+
/*#__PURE__*/ _jsxs("label", {
|
|
66
|
+
style: {
|
|
67
|
+
display: 'block',
|
|
68
|
+
marginBottom: 8
|
|
69
|
+
},
|
|
70
|
+
children: [
|
|
71
|
+
editorCopy.name,
|
|
72
|
+
/*#__PURE__*/ _jsx("input", {
|
|
73
|
+
value: name,
|
|
74
|
+
disabled: pending,
|
|
75
|
+
onChange: (event)=>{
|
|
76
|
+
setName(event.currentTarget.value);
|
|
77
|
+
if (!slugEdited) setSlug(slugify(event.currentTarget.value));
|
|
78
|
+
}
|
|
79
|
+
})
|
|
80
|
+
]
|
|
81
|
+
}),
|
|
82
|
+
/*#__PURE__*/ _jsxs("label", {
|
|
83
|
+
style: {
|
|
84
|
+
display: 'block',
|
|
85
|
+
marginBottom: 8
|
|
86
|
+
},
|
|
87
|
+
children: [
|
|
88
|
+
editorCopy.slug,
|
|
89
|
+
/*#__PURE__*/ _jsx("input", {
|
|
90
|
+
value: slug,
|
|
91
|
+
maxLength: 64,
|
|
92
|
+
disabled: pending,
|
|
93
|
+
onChange: (event)=>{
|
|
94
|
+
setSlugEdited(true);
|
|
95
|
+
setSlug(event.currentTarget.value);
|
|
96
|
+
}
|
|
97
|
+
})
|
|
98
|
+
]
|
|
99
|
+
}),
|
|
100
|
+
error ? /*#__PURE__*/ _jsx("p", {
|
|
101
|
+
role: "alert",
|
|
102
|
+
children: error
|
|
103
|
+
}) : null,
|
|
104
|
+
/*#__PURE__*/ _jsx("button", {
|
|
105
|
+
type: "button",
|
|
106
|
+
disabled: pending || !name.trim() || !slug.trim(),
|
|
107
|
+
onClick: ()=>{
|
|
108
|
+
void submitNew();
|
|
109
|
+
},
|
|
110
|
+
children: pending ? editorCopy.creating : editorCopy.createLabel
|
|
111
|
+
}),
|
|
112
|
+
/*#__PURE__*/ _jsx("button", {
|
|
113
|
+
type: "button",
|
|
114
|
+
disabled: pending,
|
|
115
|
+
onClick: onClose,
|
|
116
|
+
children: editorCopy.cancel
|
|
117
|
+
})
|
|
118
|
+
]
|
|
119
|
+
});
|
|
120
|
+
}
|