@kywi-software/core 0.12.1 → 0.13.0

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 (95) hide show
  1. package/AGENT-PATTERNS.md +54 -39
  2. package/dist/admin/layout-editor/component-actions.d.ts +21 -1
  3. package/dist/admin/layout-editor/component-actions.d.ts.map +1 -1
  4. package/dist/admin/layout-editor/component-actions.js +41 -1
  5. package/dist/admin/layout-editor/component-actions.js.map +1 -1
  6. package/dist/admin/layout-editor/component-fork.d.ts.map +1 -1
  7. package/dist/admin/layout-editor/component-fork.js +23 -1
  8. package/dist/admin/layout-editor/component-fork.js.map +1 -1
  9. package/dist/admin/layout-editor/editor-canvas.d.ts +17 -0
  10. package/dist/admin/layout-editor/editor-canvas.d.ts.map +1 -1
  11. package/dist/admin/layout-editor/editor-canvas.js +178 -38
  12. package/dist/admin/layout-editor/editor-canvas.js.map +1 -1
  13. package/dist/admin/layout-editor/editor-state.d.ts +62 -2
  14. package/dist/admin/layout-editor/editor-state.d.ts.map +1 -1
  15. package/dist/admin/layout-editor/editor-state.js +181 -11
  16. package/dist/admin/layout-editor/editor-state.js.map +1 -1
  17. package/dist/admin/layout-editor/editor.css +59 -0
  18. package/dist/admin/layout-editor/layout-editor.d.ts.map +1 -1
  19. package/dist/admin/layout-editor/layout-editor.js +67 -3
  20. package/dist/admin/layout-editor/layout-editor.js.map +1 -1
  21. package/dist/admin/layout-editor/module-overlay.d.ts +21 -1
  22. package/dist/admin/layout-editor/module-overlay.d.ts.map +1 -1
  23. package/dist/admin/layout-editor/module-overlay.js +4 -4
  24. package/dist/admin/layout-editor/module-overlay.js.map +1 -1
  25. package/dist/admin/layout-editor/module-palette.d.ts +1 -0
  26. package/dist/admin/layout-editor/module-palette.d.ts.map +1 -1
  27. package/dist/admin/layout-editor/module-palette.js +6 -3
  28. package/dist/admin/layout-editor/module-palette.js.map +1 -1
  29. package/dist/admin/layout-editor/module-variant-container-config.d.ts +51 -0
  30. package/dist/admin/layout-editor/module-variant-container-config.d.ts.map +1 -0
  31. package/dist/admin/layout-editor/module-variant-container-config.js +51 -0
  32. package/dist/admin/layout-editor/module-variant-container-config.js.map +1 -0
  33. package/dist/admin/layout-editor/node-lookup.d.ts +38 -1
  34. package/dist/admin/layout-editor/node-lookup.d.ts.map +1 -1
  35. package/dist/admin/layout-editor/node-lookup.js +62 -5
  36. package/dist/admin/layout-editor/node-lookup.js.map +1 -1
  37. package/dist/admin/layout-editor/overlay-shell.d.ts.map +1 -1
  38. package/dist/admin/layout-editor/overlay-shell.js +45 -2
  39. package/dist/admin/layout-editor/overlay-shell.js.map +1 -1
  40. package/dist/admin/layout-editor/props-panel.d.ts +50 -3
  41. package/dist/admin/layout-editor/props-panel.d.ts.map +1 -1
  42. package/dist/admin/layout-editor/props-panel.js +93 -8
  43. package/dist/admin/layout-editor/props-panel.js.map +1 -1
  44. package/dist/admin/layout-editor/section-overlay.d.ts +5 -0
  45. package/dist/admin/layout-editor/section-overlay.d.ts.map +1 -1
  46. package/dist/admin/layout-editor/section-overlay.js +1 -1
  47. package/dist/admin/layout-editor/section-overlay.js.map +1 -1
  48. package/dist/admin/layout-editor/section-variant-container-config.d.ts +9 -0
  49. package/dist/admin/layout-editor/section-variant-container-config.d.ts.map +1 -1
  50. package/dist/admin/layout-editor/section-variant-container-config.js +9 -2
  51. package/dist/admin/layout-editor/section-variant-container-config.js.map +1 -1
  52. package/dist/admin/layout-editor/use-component-connect.d.ts.map +1 -1
  53. package/dist/admin/layout-editor/use-component-connect.js +55 -1
  54. package/dist/admin/layout-editor/use-component-connect.js.map +1 -1
  55. package/dist/admin/surfaces/components/definition-canvas.d.ts.map +1 -1
  56. package/dist/admin/surfaces/components/definition-canvas.js +30 -0
  57. package/dist/admin/surfaces/components/definition-canvas.js.map +1 -1
  58. package/dist/audiences/deletion-guard.js +2 -2
  59. package/dist/audiences/deletion-guard.js.map +1 -1
  60. package/dist/config/types.d.ts +7 -0
  61. package/dist/config/types.d.ts.map +1 -1
  62. package/dist/config/types.js.map +1 -1
  63. package/dist/layout/component-refs.d.ts.map +1 -1
  64. package/dist/layout/component-refs.js +10 -18
  65. package/dist/layout/component-refs.js.map +1 -1
  66. package/dist/layout/feed-hydration.js +2 -3
  67. package/dist/layout/feed-hydration.js.map +1 -1
  68. package/dist/layout/index.d.ts +2 -1
  69. package/dist/layout/index.d.ts.map +1 -1
  70. package/dist/layout/index.js +4 -1
  71. package/dist/layout/index.js.map +1 -1
  72. package/dist/layout/module-permissions.js +2 -2
  73. package/dist/layout/module-permissions.js.map +1 -1
  74. package/dist/layout/nav-hydration.js +2 -3
  75. package/dist/layout/nav-hydration.js.map +1 -1
  76. package/dist/layout/personalization.d.ts +29 -0
  77. package/dist/layout/personalization.d.ts.map +1 -1
  78. package/dist/layout/personalization.js +78 -0
  79. package/dist/layout/personalization.js.map +1 -1
  80. package/dist/layout/registry.d.ts.map +1 -1
  81. package/dist/layout/registry.js +15 -1
  82. package/dist/layout/registry.js.map +1 -1
  83. package/dist/layout/renderer.d.ts +2 -12
  84. package/dist/layout/renderer.d.ts.map +1 -1
  85. package/dist/layout/renderer.js +29 -25
  86. package/dist/layout/renderer.js.map +1 -1
  87. package/dist/layout/types.d.ts +91 -1
  88. package/dist/layout/types.d.ts.map +1 -1
  89. package/dist/layout/types.js +160 -1
  90. package/dist/layout/types.js.map +1 -1
  91. package/dist/layout/variant-selection.d.ts +43 -0
  92. package/dist/layout/variant-selection.d.ts.map +1 -0
  93. package/dist/layout/variant-selection.js +41 -0
  94. package/dist/layout/variant-selection.js.map +1 -0
  95. package/package.json +1 -1
@@ -1,10 +1,11 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { createContext, useContext } from 'react';
4
- import { isLayoutSection } from './types.js';
4
+ import { isLayoutSection, isModuleVariantContainer } from './types.js';
5
5
  import { applySectionPlacement, applyVariantContainerPlacement, resolveModulePlacement, } from './component-refs.js';
6
6
  import { BUILT_IN_MODULE_COMPONENTS } from './modules.js';
7
7
  import { resolveSectionStyle } from './theme-css.js';
8
+ import { selectVariantArm } from './variant-selection.js';
8
9
  const PersonalizationContext = createContext(null);
9
10
  const ComponentResolverContext = createContext(null);
10
11
  const SectionComponentResolverContext = createContext(null);
@@ -43,31 +44,11 @@ export function KywiRegion({ name, fallback }) {
43
44
  }
44
45
  // ── Variant Container (audience + A/B experiment) ────────────────────────────
45
46
  /**
46
- * Choose which VariantEntry a container renders for the current visitor.
47
- * Precedence: a matched audience variant always wins (coexistence with A/B);
48
- * otherwise, in A/B mode, a locked winner or the visitor's experiment
49
- * assignment selects the arm. Returns null to render the Default sections.
47
+ * Which VariantEntry a section-level container renders. Thin wrapper over the
48
+ * shared {@link selectVariantArm} so the two container kinds cannot drift.
50
49
  */
51
50
  function selectVariantEntry(container, state) {
52
- // Audience precedence — a personalized variant beats the A/B split.
53
- if (state?.resolvedAudienceId) {
54
- const byAudience = container.variants.find(v => v.audienceId === state.resolvedAudienceId);
55
- if (byAudience)
56
- return byAudience;
57
- }
58
- if (container.mode === 'ab_test') {
59
- // A completed experiment routes all traffic to its winner.
60
- if (container.winnerId) {
61
- return container.variants.find(v => v.audienceId === container.winnerId) ?? null;
62
- }
63
- // Otherwise use the server-resolved experiment assignment for this visitor.
64
- if (container.experimentId && state) {
65
- const key = state.experimentAssignments[container.experimentId];
66
- if (key)
67
- return container.variants.find(v => v.audienceId === key) ?? null;
68
- }
69
- }
70
- return null;
51
+ return selectVariantArm(container.variants, container, state);
71
52
  }
72
53
  function VariantContainerRenderer({ container }) {
73
54
  const state = useContext(PersonalizationContext);
@@ -94,6 +75,27 @@ function VariantContainerRenderer({ container }) {
94
75
  const variantKey = selected ? selected.audienceId : 'default';
95
76
  return (_jsx("div", { className: "kywi-variant-container", "data-variant-container-id": container.id, "data-variant": variantKey, ...(effective.experimentId ? { 'data-experiment': effective.experimentId } : {}), ...(container.componentId ? { 'data-component-id': container.componentId } : {}), children: sections.map(section => _jsx(SectionRenderer, { section: section }, section.id)) }));
96
77
  }
78
+ /**
79
+ * A MODULE-level variant container: one module in a column that varies by
80
+ * audience or A/B arm (kywi-cms#161).
81
+ *
82
+ * Entirely server-resolved, exactly like its section-level sibling — no
83
+ * client-side arm swapping, so the first paint is already correct and the page
84
+ * is complete with JavaScript off. The winning arm's module renders through the
85
+ * ordinary `ModuleRenderer`, so a promoted module is byte-identical to the one
86
+ * it replaced apart from this wrapper.
87
+ */
88
+ function ModuleVariantContainerRenderer({ container }) {
89
+ const state = useContext(PersonalizationContext);
90
+ const selected = selectVariantArm(container.variants, container, state);
91
+ const node = selected ? selected.module : container.defaultModule;
92
+ // `selected.audienceId` is always set, and never empty: `selectVariantArm`
93
+ // only ever returns an arm it MATCHED by that field — against the resolved
94
+ // audience, the locked winner, or the experiment assignment — so an arm with
95
+ // no binding (`''`, the draft spelling) cannot be the one selected here.
96
+ const variantKey = selected ? selected.audienceId : 'default';
97
+ return (_jsx("div", { className: "kywi-module-variant-container", "data-module-variant-container-id": container.id, "data-variant": variantKey, ...(container.experimentId ? { 'data-experiment': container.experimentId } : {}), children: _jsx(ModuleRenderer, { node: node }) }));
98
+ }
97
99
  function SectionRenderer({ section }) {
98
100
  const sectionResolver = useContext(SectionComponentResolverContext);
99
101
  // A connected section (`componentId`) renders its source component's
@@ -119,7 +121,9 @@ function SectionRenderer({ section }) {
119
121
  return (_jsxs("div", { className: "kywi-section", "data-kywi-section": "", "data-section-id": section.id, ...(section.componentId ? { 'data-component-id': section.componentId } : {}), style: Object.keys(base).length > 0 ? base : undefined, children: [responsiveCss && _jsx("style", { dangerouslySetInnerHTML: { __html: responsiveCss } }), _jsx("div", { className: "kywi-section-columns", children: effective.columns.map(col => _jsx(ColumnRenderer, { column: col }, col.id)) })] }));
120
122
  }
121
123
  function ColumnRenderer({ column }) {
122
- return (_jsx("div", { className: `kywi-column kywi-col-${column.width}`, "data-kywi-column": "", "data-kywi-col-width": column.width, "data-column-id": column.id, children: column.nodes.map(node => _jsx(ModuleRenderer, { node: node }, node.id)) }));
124
+ return (_jsx("div", { className: `kywi-column kywi-col-${column.width}`, "data-kywi-column": "", "data-kywi-col-width": column.width, "data-column-id": column.id, children: column.nodes.map(node => isModuleVariantContainer(node)
125
+ ? _jsx(ModuleVariantContainerRenderer, { container: node }, node.id)
126
+ : _jsx(ModuleRenderer, { node: node }, node.id)) }));
123
127
  }
124
128
  /**
125
129
  * The documented semantic hooks a module wrapper carries so a front-end
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/layout/renderer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/layout/renderer.tsx"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ export interface ModuleNode {
9
9
  export interface LayoutColumn {
10
10
  id: string;
11
11
  width: number;
12
- nodes: ModuleNode[];
12
+ nodes: ColumnNode[];
13
13
  }
14
14
  export interface LayoutSection {
15
15
  id: string;
@@ -26,6 +26,84 @@ export interface LayoutSection {
26
26
  */
27
27
  componentId?: string;
28
28
  }
29
+ /**
30
+ * One arm of a MODULE-level variant container (kywi-cms module-variants).
31
+ *
32
+ * Exactly one module per arm, and the modules may be of DIFFERENT types across
33
+ * arms — an image hero against a text hero is a legitimate A/B. `audienceId` is
34
+ * used in `personalization` mode and as the experiment's variant key in
35
+ * `ab_test` mode (same dual role the section-level `VariantEntry.audienceId`
36
+ * plays); `weight` is advisory, mirroring the section-level container's.
37
+ *
38
+ * `audienceId` is REQUIRED, matching the section-level `VariantEntry`. An
39
+ * OPTIONAL field would give one state two shapes: the shared selector matches
40
+ * arms by `audienceId`, so an arm with the field absent validates and then can
41
+ * never be selected by anything. `''` is the single legal spelling of "unbound
42
+ * draft arm" — it matches no resolved audience, no winner and no assignment
43
+ * key, so the arm is inert until an author binds it, but it is still real
44
+ * content that every walker sees.
45
+ */
46
+ export interface ModuleVariantEntry {
47
+ id: string;
48
+ label: string;
49
+ audienceId: string;
50
+ weight?: number;
51
+ module: ModuleNode;
52
+ }
53
+ /**
54
+ * A wrapper node that lets ONE module inside a column vary by audience or by
55
+ * A/B arm, without turning its whole section into a personalized band.
56
+ *
57
+ * CONTAINERS NEVER NEST — the same contract the section-level `VariantContainer`
58
+ * carries (`admin/layout-editor/node-lookup.ts`). Its arms hold plain
59
+ * `ModuleNode`s, and one of these may not sit inside a section-level container's
60
+ * arm; `validateLayoutDocument` rejects both shapes.
61
+ */
62
+ export interface ModuleVariantContainer {
63
+ id: string;
64
+ type: 'moduleVariantContainer';
65
+ mode: 'personalization' | 'ab_test';
66
+ experimentId?: string;
67
+ winnerId?: string;
68
+ defaultModule: ModuleNode;
69
+ variants: ModuleVariantEntry[];
70
+ }
71
+ /** What a column's `nodes` array may hold. */
72
+ export type ColumnNode = ModuleNode | ModuleVariantContainer;
73
+ /**
74
+ * Narrow a column node to a module-level variant container.
75
+ *
76
+ * Structural, not a bare `type ===`: a module's `type` is a registry name a host
77
+ * pack chooses, so a custom module registered as `moduleVariantContainer` would
78
+ * otherwise be misread (the same reasoning as `isRegionNodeShape` in
79
+ * `admin/layout-editor/component-actions.ts`).
80
+ */
81
+ export declare function isModuleVariantContainer(node: ColumnNode): node is ModuleVariantContainer;
82
+ /** Narrow a column node to a plain module (the complement of the above). */
83
+ export declare function isModuleNode(node: ColumnNode): node is ModuleNode;
84
+ /** Every module a container holds: the Default arm first, then each variant arm. */
85
+ export declare function moduleVariantModules(container: ModuleVariantContainer): ModuleNode[];
86
+ /**
87
+ * Every ModuleNode in a column, arm modules included, in document order.
88
+ *
89
+ * THE seam. Every pass that used to read `column.nodes` as a flat module list —
90
+ * the admin-only gate, feed/nav hydration, the audience deletion guard, the
91
+ * linked-component index — reads this instead, so a module inside an arm is
92
+ * governed by exactly the rules a module beside it is.
93
+ *
94
+ * `nodes` is guarded because those passes run over STORED documents that never
95
+ * went through `validateLayoutDocument` — `api/layout-write-guard.ts` types its
96
+ * `stored` as `LayoutDocument | null | undefined` over raw DB JSON. A legacy row
97
+ * with a column missing `nodes` yielded nothing before this function existed;
98
+ * throwing here would 500 the save and leave that page permanently unsavable.
99
+ */
100
+ export declare function columnModules(column: LayoutColumn): ModuleNode[];
101
+ /**
102
+ * Rebuild a column node by applying `fn` to every ModuleNode it holds — itself
103
+ * for a plain module, each arm's module for a container. The container's own
104
+ * identity (`id`, `mode`, experiment binding, arm ids/labels) is untouched.
105
+ */
106
+ export declare function mapColumnNode(node: ColumnNode, fn: (module: ModuleNode) => ModuleNode): ColumnNode;
29
107
  export interface VariantEntry {
30
108
  id: string;
31
109
  audienceId: string;
@@ -118,4 +196,16 @@ export declare function validateLayoutSection(input: unknown): LayoutSectionVali
118
196
  * default and variant section.
119
197
  */
120
198
  export declare function validateVariantContainer(input: unknown): VariantContainerValidationResult;
199
+ export type ModuleVariantContainerValidationResult = {
200
+ success: true;
201
+ data: ModuleVariantContainer;
202
+ } | {
203
+ success: false;
204
+ error: string;
205
+ };
206
+ /**
207
+ * The module-level counterpart of {@link validateVariantContainer}: schema, the
208
+ * ab_test/experimentId rule, and unique arm ids.
209
+ */
210
+ export declare function validateModuleVariantContainer(input: unknown): ModuleVariantContainerValidationResult;
121
211
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/layout/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/layout/types.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,67 @@
1
1
  import { z } from 'zod';
2
+ /**
3
+ * Narrow a column node to a module-level variant container.
4
+ *
5
+ * Structural, not a bare `type ===`: a module's `type` is a registry name a host
6
+ * pack chooses, so a custom module registered as `moduleVariantContainer` would
7
+ * otherwise be misread (the same reasoning as `isRegionNodeShape` in
8
+ * `admin/layout-editor/component-actions.ts`).
9
+ */
10
+ export function isModuleVariantContainer(node) {
11
+ return (node.type === 'moduleVariantContainer' &&
12
+ Array.isArray(node.variants) &&
13
+ typeof node.defaultModule === 'object' &&
14
+ // `typeof null === 'object'`: without this a `defaultModule: null` node
15
+ // narrows to a container, and `columnModules` pushes that null into a
16
+ // `ModuleNode[]` every downstream walker then dereferences.
17
+ node.defaultModule !== null);
18
+ }
19
+ /** Narrow a column node to a plain module (the complement of the above). */
20
+ export function isModuleNode(node) {
21
+ return !isModuleVariantContainer(node);
22
+ }
23
+ /** Every module a container holds: the Default arm first, then each variant arm. */
24
+ export function moduleVariantModules(container) {
25
+ return [container.defaultModule, ...container.variants.map(v => v.module)];
26
+ }
27
+ /**
28
+ * Every ModuleNode in a column, arm modules included, in document order.
29
+ *
30
+ * THE seam. Every pass that used to read `column.nodes` as a flat module list —
31
+ * the admin-only gate, feed/nav hydration, the audience deletion guard, the
32
+ * linked-component index — reads this instead, so a module inside an arm is
33
+ * governed by exactly the rules a module beside it is.
34
+ *
35
+ * `nodes` is guarded because those passes run over STORED documents that never
36
+ * went through `validateLayoutDocument` — `api/layout-write-guard.ts` types its
37
+ * `stored` as `LayoutDocument | null | undefined` over raw DB JSON. A legacy row
38
+ * with a column missing `nodes` yielded nothing before this function existed;
39
+ * throwing here would 500 the save and leave that page permanently unsavable.
40
+ */
41
+ export function columnModules(column) {
42
+ const out = [];
43
+ for (const node of column.nodes ?? []) {
44
+ if (isModuleVariantContainer(node))
45
+ out.push(...moduleVariantModules(node));
46
+ else
47
+ out.push(node);
48
+ }
49
+ return out;
50
+ }
51
+ /**
52
+ * Rebuild a column node by applying `fn` to every ModuleNode it holds — itself
53
+ * for a plain module, each arm's module for a container. The container's own
54
+ * identity (`id`, `mode`, experiment binding, arm ids/labels) is untouched.
55
+ */
56
+ export function mapColumnNode(node, fn) {
57
+ if (!isModuleVariantContainer(node))
58
+ return fn(node);
59
+ return {
60
+ ...node,
61
+ defaultModule: fn(node.defaultModule),
62
+ variants: node.variants.map(v => ({ ...v, module: fn(v.module) })),
63
+ };
64
+ }
2
65
  /** Narrow a RegionNode to a LayoutSection (as opposed to a VariantContainer). */
3
66
  export function isLayoutSection(node) {
4
67
  return node.type === 'section';
@@ -16,10 +79,44 @@ const ModuleNodeSchema = z.object({
16
79
  style: z.record(z.string()),
17
80
  componentId: z.string().optional(),
18
81
  });
82
+ const ModuleVariantEntrySchema = z.object({
83
+ id: z.string(),
84
+ label: z.string(),
85
+ // Required, not `.optional()` — see ModuleVariantEntry: `''` is the unbound
86
+ // draft arm, and an absent field is a second shape for that same state that
87
+ // the selector could never match.
88
+ audienceId: z.string(),
89
+ weight: z.number().optional(),
90
+ module: ModuleNodeSchema,
91
+ });
92
+ /**
93
+ * The module-variant-container field list. A bare `ZodObject` for the same
94
+ * reason `VariantContainerObjectSchema` is one: it has to compose into the
95
+ * column-node union below, so the ab_test/experimentId rule lives on the
96
+ * exported wrapper and in `validateModuleVariantContainerNode`, which runs on
97
+ * every container `validateLayoutDocument` walks.
98
+ */
99
+ const ModuleVariantContainerObjectSchema = z.object({
100
+ id: z.string(),
101
+ type: z.literal('moduleVariantContainer'),
102
+ mode: z.enum(['personalization', 'ab_test']),
103
+ experimentId: z.string().optional(),
104
+ winnerId: z.string().optional(),
105
+ defaultModule: ModuleNodeSchema,
106
+ variants: z.array(ModuleVariantEntrySchema),
107
+ });
108
+ // Container FIRST: a container object cannot satisfy ModuleNodeSchema (no
109
+ // instanceId/props/style), but matching on the literal `type` before the
110
+ // open-ended module shape is what makes the union's failure messages readable.
111
+ const ColumnNodeSchema = z.union([
112
+ ModuleVariantContainerObjectSchema,
113
+ ModuleNodeSchema,
114
+ ]);
115
+ const ModuleVariantContainerSchema = ModuleVariantContainerObjectSchema.refine((val) => val.mode !== 'ab_test' || (val.experimentId != null && val.experimentId.length > 0), { message: 'experimentId is required when mode is ab_test' });
19
116
  const LayoutColumnSchema = z.object({
20
117
  id: z.string(),
21
118
  width: z.number().int().min(1).max(12),
22
- nodes: z.array(ModuleNodeSchema),
119
+ nodes: z.array(ColumnNodeSchema),
23
120
  });
24
121
  // Cast as ZodType for the same exactOptionalPropertyTypes reason as
25
122
  // ModuleNodeSchema above: `.optional()` infers `componentId?: string | undefined`
@@ -101,6 +198,42 @@ function validateSectionColumns(section, context) {
101
198
  }
102
199
  return null;
103
200
  }
201
+ /** The module-level container's own rules: ab_test binding, unique arm ids. */
202
+ function validateModuleVariantContainerNode(container, context) {
203
+ if (container.mode === 'ab_test' && !container.experimentId) {
204
+ return `${context} moduleVariantContainer '${container.id}' with mode ab_test requires experimentId`;
205
+ }
206
+ const seen = new Set();
207
+ for (const variant of container.variants) {
208
+ if (seen.has(variant.id)) {
209
+ return `${context} moduleVariantContainer '${container.id}' has duplicate variant id '${variant.id}'`;
210
+ }
211
+ seen.add(variant.id);
212
+ }
213
+ return null;
214
+ }
215
+ /**
216
+ * Every module-level container a section's columns hold.
217
+ *
218
+ * `allowed` is false for the sections inside a SECTION-level variant container's
219
+ * arms: containers never nest, so a module container there is refused outright
220
+ * rather than validated.
221
+ */
222
+ function validateSectionColumnNodes(section, context, allowed) {
223
+ for (const column of section.columns) {
224
+ for (const node of column.nodes) {
225
+ if (!isModuleVariantContainer(node))
226
+ continue;
227
+ if (!allowed) {
228
+ return `${context} section '${section.id}' holds moduleVariantContainer '${node.id}' inside a variantContainer arm — containers never nest`;
229
+ }
230
+ const err = validateModuleVariantContainerNode(node, `${context} section '${section.id}'`);
231
+ if (err)
232
+ return err;
233
+ }
234
+ }
235
+ return null;
236
+ }
104
237
  /**
105
238
  * Validate all sections inside a variantContainer (default + all variants).
106
239
  */
@@ -109,12 +242,18 @@ function validateVariantContainerSections(vc, context) {
109
242
  const err = validateSectionColumns(section, `${context} variantContainer '${vc.id}' default`);
110
243
  if (err)
111
244
  return err;
245
+ const nested = validateSectionColumnNodes(section, `${context} variantContainer '${vc.id}'`, false);
246
+ if (nested)
247
+ return nested;
112
248
  }
113
249
  for (const variant of vc.variants) {
114
250
  for (const section of variant.sections) {
115
251
  const err = validateSectionColumns(section, `${context} variantContainer '${vc.id}' variant '${variant.id}'`);
116
252
  if (err)
117
253
  return err;
254
+ const nested = validateSectionColumnNodes(section, `${context} variantContainer '${vc.id}'`, false);
255
+ if (nested)
256
+ return nested;
118
257
  }
119
258
  }
120
259
  // ab_test mode requires experimentId (belt-and-suspenders: schema refine already checks)
@@ -134,6 +273,9 @@ function validateRegionNodes(regions, contextPrefix) {
134
273
  const err = validateSectionColumns(node, `${contextPrefix} region '${regionName}'`);
135
274
  if (err)
136
275
  return err;
276
+ const nodeErr = validateSectionColumnNodes(node, `${contextPrefix} region '${regionName}'`, true);
277
+ if (nodeErr)
278
+ return nodeErr;
137
279
  }
138
280
  else if (node.type === 'variantContainer') {
139
281
  const err = validateVariantContainerSections(node, `${contextPrefix} region '${regionName}'`);
@@ -199,6 +341,9 @@ export function validateLayoutSection(input) {
199
341
  const columnsErr = validateSectionColumns(parsed.data, '');
200
342
  if (columnsErr)
201
343
  return { success: false, error: columnsErr.trim() };
344
+ const nodeErr = validateSectionColumnNodes(parsed.data, '', true);
345
+ if (nodeErr)
346
+ return { success: false, error: nodeErr.trim() };
202
347
  return { success: true, data: parsed.data };
203
348
  }
204
349
  /**
@@ -216,4 +361,18 @@ export function validateVariantContainer(input) {
216
361
  return { success: false, error: err.trim() };
217
362
  return { success: true, data: parsed.data };
218
363
  }
364
+ /**
365
+ * The module-level counterpart of {@link validateVariantContainer}: schema, the
366
+ * ab_test/experimentId rule, and unique arm ids.
367
+ */
368
+ export function validateModuleVariantContainer(input) {
369
+ const parsed = ModuleVariantContainerSchema.safeParse(input);
370
+ if (!parsed.success) {
371
+ return { success: false, error: parsed.error.errors.map(e => e.message).join('; ') };
372
+ }
373
+ const err = validateModuleVariantContainerNode(parsed.data, '');
374
+ if (err)
375
+ return { success: false, error: err.trim() };
376
+ return { success: true, data: parsed.data };
377
+ }
219
378
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/layout/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/layout/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * variant-selection.ts
3
+ * ONE answer to "which arm does this visitor get", shared by the section-level
4
+ * `VariantContainer` and the module-level `ModuleVariantContainer`.
5
+ *
6
+ * Two containers with two copies of this precedence is how a personalized band
7
+ * and a personalized module inside it end up disagreeing about the same visitor.
8
+ * Dependency-free (no React, no ./types.js) so both the client renderer and any
9
+ * server-side pass can import it.
10
+ */
11
+ /**
12
+ * Server-resolved personalization state threaded into the renderer. Both fields
13
+ * are plain serializable values so they can cross the server→client boundary as
14
+ * props.
15
+ */
16
+ export interface PersonalizationState {
17
+ /** Winning audience id for this visitor, or null when unpersonalized. */
18
+ resolvedAudienceId: string | null;
19
+ /** experimentId → chosen variant key; null = Default. */
20
+ experimentAssignments: Record<string, string | null>;
21
+ }
22
+ /** The container fields selection reads — everything else about it is irrelevant here. */
23
+ export interface VariantSelectionBinding {
24
+ mode: 'personalization' | 'ab_test';
25
+ experimentId?: string | undefined;
26
+ winnerId?: string | undefined;
27
+ }
28
+ /**
29
+ * Choose which arm renders for the current visitor. Returns null for "the
30
+ * Default arm".
31
+ *
32
+ * Precedence, in order:
33
+ * 1. a matched AUDIENCE arm always wins (coexistence with A/B — see
34
+ * `experiments/engine.ts`'s `resolveVariant`, which reaches the same answer
35
+ * from the experiment side);
36
+ * 2. in ab_test mode, a locked `winnerId` routes all traffic to that arm;
37
+ * 3. otherwise the visitor's server-resolved assignment for `experimentId`;
38
+ * 4. Default.
39
+ */
40
+ export declare function selectVariantArm<T extends {
41
+ audienceId?: string | undefined;
42
+ }>(arms: readonly T[], binding: VariantSelectionBinding, state: PersonalizationState | null): T | null;
43
+ //# sourceMappingURL=variant-selection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variant-selection.d.ts","sourceRoot":"","sources":["../../src/layout/variant-selection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,yEAAyE;IACzE,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,yDAAyD;IACzD,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;CACrD;AAED,0FAA0F;AAC1F,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,iBAAiB,GAAG,SAAS,CAAA;IACnC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS;IAAE,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,EAC5E,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,oBAAoB,GAAG,IAAI,GACjC,CAAC,GAAG,IAAI,CAiBV"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * variant-selection.ts
3
+ * ONE answer to "which arm does this visitor get", shared by the section-level
4
+ * `VariantContainer` and the module-level `ModuleVariantContainer`.
5
+ *
6
+ * Two containers with two copies of this precedence is how a personalized band
7
+ * and a personalized module inside it end up disagreeing about the same visitor.
8
+ * Dependency-free (no React, no ./types.js) so both the client renderer and any
9
+ * server-side pass can import it.
10
+ */
11
+ /**
12
+ * Choose which arm renders for the current visitor. Returns null for "the
13
+ * Default arm".
14
+ *
15
+ * Precedence, in order:
16
+ * 1. a matched AUDIENCE arm always wins (coexistence with A/B — see
17
+ * `experiments/engine.ts`'s `resolveVariant`, which reaches the same answer
18
+ * from the experiment side);
19
+ * 2. in ab_test mode, a locked `winnerId` routes all traffic to that arm;
20
+ * 3. otherwise the visitor's server-resolved assignment for `experimentId`;
21
+ * 4. Default.
22
+ */
23
+ export function selectVariantArm(arms, binding, state) {
24
+ if (state?.resolvedAudienceId) {
25
+ const byAudience = arms.find(a => a.audienceId === state.resolvedAudienceId);
26
+ if (byAudience)
27
+ return byAudience;
28
+ }
29
+ if (binding.mode === 'ab_test') {
30
+ if (binding.winnerId) {
31
+ return arms.find(a => a.audienceId === binding.winnerId) ?? null;
32
+ }
33
+ if (binding.experimentId && state) {
34
+ const key = state.experimentAssignments[binding.experimentId];
35
+ if (key)
36
+ return arms.find(a => a.audienceId === key) ?? null;
37
+ }
38
+ }
39
+ return null;
40
+ }
41
+ //# sourceMappingURL=variant-selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variant-selection.js","sourceRoot":"","sources":["../../src/layout/variant-selection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAqBH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAkB,EAClB,OAAgC,EAChC,KAAkC;IAElC,IAAI,KAAK,EAAE,kBAAkB,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,KAAK,CAAC,kBAAkB,CAAC,CAAA;QAC5E,IAAI,UAAU;YAAE,OAAO,UAAU,CAAA;IACnC,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAA;QAClE,CAAC;QACD,IAAI,OAAO,CAAC,YAAY,IAAI,KAAK,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,KAAK,CAAC,qBAAqB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;YAC7D,IAAI,GAAG;gBAAE,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,GAAG,CAAC,IAAI,IAAI,CAAA;QAC9D,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kywi-software/core",
3
- "version": "0.12.1",
3
+ "version": "0.13.0",
4
4
  "description": "Kywi CMS core — schema generator, REST API, and admin UI for Next.js.",
5
5
  "type": "module",
6
6
  "license": "AGPL-3.0-only",