sygnal 5.3.4 → 5.3.6

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.
@@ -132,6 +132,13 @@ function processSSRTree(vnode, context, parentState) {
132
132
  if (typeof vnode === 'string' || vnode.text != null)
133
133
  return vnode;
134
134
  const sel = vnode.sel;
135
+ // Fragment: no selector, recurse into children
136
+ if (!sel && vnode.children && Array.isArray(vnode.children)) {
137
+ vnode.children = vnode.children
138
+ .map((c) => processSSRTree(c, context, parentState))
139
+ .filter((c) => c != null);
140
+ return vnode;
141
+ }
135
142
  // Portal: render children inline (no target container on server)
136
143
  if (sel === 'portal') {
137
144
  const children = vnode.children || [];
@@ -511,6 +518,10 @@ function vnodeToHtml(vnode) {
511
518
  if (!sel) {
512
519
  if (vnode.text != null)
513
520
  return escapeHtml(String(vnode.text));
521
+ // Fragment: no selector, but has children — concatenate child HTML
522
+ if (vnode.children && Array.isArray(vnode.children)) {
523
+ return vnode.children.map((c) => vnodeToHtml(c)).join('');
524
+ }
514
525
  return '';
515
526
  }
516
527
  // Parse selector: tag#id.class1.class2
@@ -128,6 +128,13 @@ function processSSRTree(vnode, context, parentState) {
128
128
  if (typeof vnode === 'string' || vnode.text != null)
129
129
  return vnode;
130
130
  const sel = vnode.sel;
131
+ // Fragment: no selector, recurse into children
132
+ if (!sel && vnode.children && Array.isArray(vnode.children)) {
133
+ vnode.children = vnode.children
134
+ .map((c) => processSSRTree(c, context, parentState))
135
+ .filter((c) => c != null);
136
+ return vnode;
137
+ }
131
138
  // Portal: render children inline (no target container on server)
132
139
  if (sel === 'portal') {
133
140
  const children = vnode.children || [];
@@ -507,6 +514,10 @@ function vnodeToHtml(vnode) {
507
514
  if (!sel) {
508
515
  if (vnode.text != null)
509
516
  return escapeHtml(String(vnode.text));
517
+ // Fragment: no selector, but has children — concatenate child HTML
518
+ if (vnode.children && Array.isArray(vnode.children)) {
519
+ return vnode.children.map((c) => vnodeToHtml(c)).join('');
520
+ }
510
521
  return '';
511
522
  }
512
523
  // Parse selector: tag#id.class1.class2
package/dist/index.cjs.js CHANGED
@@ -6505,6 +6505,13 @@ function processSSRTree(vnode, context, parentState) {
6505
6505
  if (typeof vnode === 'string' || vnode.text != null)
6506
6506
  return vnode;
6507
6507
  const sel = vnode.sel;
6508
+ // Fragment: no selector, recurse into children
6509
+ if (!sel && vnode.children && Array.isArray(vnode.children)) {
6510
+ vnode.children = vnode.children
6511
+ .map((c) => processSSRTree(c, context, parentState))
6512
+ .filter((c) => c != null);
6513
+ return vnode;
6514
+ }
6508
6515
  // Portal: render children inline (no target container on server)
6509
6516
  if (sel === 'portal') {
6510
6517
  const children = vnode.children || [];
@@ -6884,6 +6891,10 @@ function vnodeToHtml(vnode) {
6884
6891
  if (!sel) {
6885
6892
  if (vnode.text != null)
6886
6893
  return escapeHtml(String(vnode.text));
6894
+ // Fragment: no selector, but has children — concatenate child HTML
6895
+ if (vnode.children && Array.isArray(vnode.children)) {
6896
+ return vnode.children.map((c) => vnodeToHtml(c)).join('');
6897
+ }
6887
6898
  return '';
6888
6899
  }
6889
6900
  // Parse selector: tag#id.class1.class2
package/dist/index.d.ts CHANGED
@@ -42,11 +42,13 @@ type NextFunction<ACTIONS = any> = ACTIONS extends object
42
42
  ) => void
43
43
  : (action: string, data?: any, delay?: number) => void
44
44
 
45
- type Reducer<STATE, PROPS, ACTIONS = any, DATA = any, RETURN = any> = (
45
+ type ReducerExtras<PROPS, CONTEXT> = PROPS & { context: CONTEXT; children?: JSX.Element | JSX.Element[]; slots?: Record<string, JSX.Element[]> }
46
+
47
+ type Reducer<STATE, PROPS, ACTIONS = any, DATA = any, RETURN = any, CONTEXT = {}> = (
46
48
  state: STATE,
47
49
  args: DATA,
48
50
  next: NextFunction<ACTIONS>,
49
- props: PROPS
51
+ props: ReducerExtras<PROPS, CONTEXT>
50
52
  ) => RETURN | ABORT | undefined
51
53
 
52
54
  export type ExactShape<EXPECTED, ACTUAL extends EXPECTED> = ACTUAL &
@@ -76,24 +78,24 @@ type ResolvedNonStateSinkReturns<SINK_RETURNS extends NonStateSinkReturns = {}>
76
78
  * - true: Whatever value is received from the intent for this action is passed on as-is.
77
79
  * - Function: A reducer
78
80
  */
79
- type SinkValue<STATE, PROPS, ACTIONS, DATA, RETURN, CALCULATED> =
81
+ type SinkValue<STATE, PROPS, ACTIONS, DATA, RETURN, CALCULATED, CONTEXT = {}> =
80
82
  | true
81
- | Reducer<STATE & CALCULATED, PROPS, ACTIONS, DATA, RETURN>
83
+ | Reducer<STATE & CALCULATED, PROPS, ACTIONS, DATA, RETURN, CONTEXT>
82
84
 
83
- type EffectReducer<STATE, PROPS, ACTIONS, DATA, CALCULATED> =
84
- | ((state: STATE & CALCULATED, args: DATA, next: NextFunction<ACTIONS>, props: PROPS) => void)
85
+ type EffectReducer<STATE, PROPS, ACTIONS, DATA, CALCULATED, CONTEXT = {}> =
86
+ | ((state: STATE & CALCULATED, args: DATA, next: NextFunction<ACTIONS>, props: ReducerExtras<PROPS, CONTEXT>) => void)
85
87
 
86
- type DefaultSinks<STATE, PROPS, ACTIONS, DATA, CALCULATED, SINK_RETURNS extends NonStateSinkReturns = {}> = {
87
- STATE?: SinkValue<STATE, PROPS, ACTIONS, DATA, STATE, CALCULATED>;
88
- EVENTS?: SinkValue<STATE, PROPS, ACTIONS, DATA, ResolvedNonStateSinkReturns<SINK_RETURNS>['EVENTS'], CALCULATED>;
89
- LOG?: SinkValue<STATE, PROPS, ACTIONS, DATA, ResolvedNonStateSinkReturns<SINK_RETURNS>['LOG'], CALCULATED>;
90
- PARENT?: SinkValue<STATE, PROPS, ACTIONS, DATA, ResolvedNonStateSinkReturns<SINK_RETURNS>['PARENT'], CALCULATED>;
91
- EFFECT?: EffectReducer<STATE, PROPS, ACTIONS, DATA, CALCULATED>;
88
+ type DefaultSinks<STATE, PROPS, ACTIONS, DATA, CALCULATED, SINK_RETURNS extends NonStateSinkReturns = {}, CONTEXT = {}> = {
89
+ STATE?: SinkValue<STATE, PROPS, ACTIONS, DATA, STATE, CALCULATED, CONTEXT>;
90
+ EVENTS?: SinkValue<STATE, PROPS, ACTIONS, DATA, ResolvedNonStateSinkReturns<SINK_RETURNS>['EVENTS'], CALCULATED, CONTEXT>;
91
+ LOG?: SinkValue<STATE, PROPS, ACTIONS, DATA, ResolvedNonStateSinkReturns<SINK_RETURNS>['LOG'], CALCULATED, CONTEXT>;
92
+ PARENT?: SinkValue<STATE, PROPS, ACTIONS, DATA, ResolvedNonStateSinkReturns<SINK_RETURNS>['PARENT'], CALCULATED, CONTEXT>;
93
+ EFFECT?: EffectReducer<STATE, PROPS, ACTIONS, DATA, CALCULATED, CONTEXT>;
92
94
  }
93
95
 
94
- type CustomDriverSinks<STATE, PROPS, DRIVERS, ACTIONS, ACTION_ENTRY, CALCULATED> = keyof DRIVERS extends never
96
+ type CustomDriverSinks<STATE, PROPS, DRIVERS, ACTIONS, ACTION_ENTRY, CALCULATED, CONTEXT = {}> = keyof DRIVERS extends never
95
97
  ? {
96
- [driver: string]: SinkValue<STATE, PROPS, ACTIONS, any, any, CALCULATED>
98
+ [driver: string]: SinkValue<STATE, PROPS, ACTIONS, any, any, CALCULATED, CONTEXT>
97
99
  }
98
100
  : {
99
101
  [DRIVER_KEY in keyof DRIVERS]: SinkValue<
@@ -102,15 +104,16 @@ type CustomDriverSinks<STATE, PROPS, DRIVERS, ACTIONS, ACTION_ENTRY, CALCULATED>
102
104
  ACTIONS,
103
105
  ACTION_ENTRY,
104
106
  DRIVERS[DRIVER_KEY] extends { source: any; sink: any } ? DRIVERS[DRIVER_KEY]['sink'] : any,
105
- CALCULATED
107
+ CALCULATED,
108
+ CONTEXT
106
109
  >
107
110
  }
108
111
 
109
- type ModelEntry<STATE, PROPS, DRIVERS, ACTIONS, ACTION_ENTRY, CALCULATED, SINK_RETURNS extends NonStateSinkReturns = {}> =
110
- | SinkValue<STATE, PROPS, ACTIONS, ACTION_ENTRY, STATE, CALCULATED>
112
+ type ModelEntry<STATE, PROPS, DRIVERS, ACTIONS, ACTION_ENTRY, CALCULATED, SINK_RETURNS extends NonStateSinkReturns = {}, CONTEXT = {}> =
113
+ | SinkValue<STATE, PROPS, ACTIONS, ACTION_ENTRY, STATE, CALCULATED, CONTEXT>
111
114
  | Partial<
112
- DefaultSinks<STATE, PROPS, ACTIONS, ACTION_ENTRY, CALCULATED, SINK_RETURNS> &
113
- CustomDriverSinks<STATE, PROPS, DRIVERS, ACTIONS, ACTION_ENTRY, CALCULATED>
115
+ DefaultSinks<STATE, PROPS, ACTIONS, ACTION_ENTRY, CALCULATED, SINK_RETURNS, CONTEXT> &
116
+ CustomDriverSinks<STATE, PROPS, DRIVERS, ACTIONS, ACTION_ENTRY, CALCULATED, CONTEXT>
114
117
  >
115
118
 
116
119
  type WithDefaultActions<STATE, ACTIONS> = ACTIONS & {
@@ -120,7 +123,7 @@ type WithDefaultActions<STATE, ACTIONS> = ACTIONS & {
120
123
  DISPOSE?: never;
121
124
  }
122
125
 
123
- type ComponentModel<STATE, PROPS, DRIVERS, ACTIONS, CALCULATED, SINK_RETURNS extends NonStateSinkReturns = {}> = keyof ACTIONS extends never
126
+ type ComponentModel<STATE, PROPS, DRIVERS, ACTIONS, CALCULATED, SINK_RETURNS extends NonStateSinkReturns = {}, CONTEXT = {}> = keyof ACTIONS extends never
124
127
  ? {
125
128
  [action: string]: ModelEntry<
126
129
  STATE,
@@ -129,7 +132,8 @@ type ComponentModel<STATE, PROPS, DRIVERS, ACTIONS, CALCULATED, SINK_RETURNS ext
129
132
  WithDefaultActions<STATE, { [action: string]: any }>,
130
133
  any,
131
134
  CALCULATED,
132
- SINK_RETURNS
135
+ SINK_RETURNS,
136
+ CONTEXT
133
137
  >
134
138
  }
135
139
  : {
@@ -140,7 +144,8 @@ type ComponentModel<STATE, PROPS, DRIVERS, ACTIONS, CALCULATED, SINK_RETURNS ext
140
144
  WithDefaultActions<STATE, ACTIONS>,
141
145
  WithDefaultActions<STATE, ACTIONS>[ACTION_KEY],
142
146
  CALCULATED,
143
- SINK_RETURNS
147
+ SINK_RETURNS,
148
+ CONTEXT
144
149
  >
145
150
  }
146
151
 
@@ -259,7 +264,7 @@ export type Component<
259
264
  DOMSourceName?: string;
260
265
  stateSourceName?: string;
261
266
  requestSourceName?: string;
262
- model?: ComponentModel<STATE, PROPS, FixDrivers<DRIVERS>, ACTIONS, CALCULATED, SINK_RETURNS>;
267
+ model?: ComponentModel<STATE, PROPS, FixDrivers<DRIVERS>, ACTIONS, CALCULATED, SINK_RETURNS, CONTEXT>;
263
268
  intent?: ComponentIntent<STATE & CALCULATED, FixDrivers<DRIVERS>, ACTIONS>;
264
269
  initialState?: STATE;
265
270
  calculated?: Calculated<STATE, CALCULATED>;
package/dist/index.esm.js CHANGED
@@ -6488,6 +6488,13 @@ function processSSRTree(vnode, context, parentState) {
6488
6488
  if (typeof vnode === 'string' || vnode.text != null)
6489
6489
  return vnode;
6490
6490
  const sel = vnode.sel;
6491
+ // Fragment: no selector, recurse into children
6492
+ if (!sel && vnode.children && Array.isArray(vnode.children)) {
6493
+ vnode.children = vnode.children
6494
+ .map((c) => processSSRTree(c, context, parentState))
6495
+ .filter((c) => c != null);
6496
+ return vnode;
6497
+ }
6491
6498
  // Portal: render children inline (no target container on server)
6492
6499
  if (sel === 'portal') {
6493
6500
  const children = vnode.children || [];
@@ -6867,6 +6874,10 @@ function vnodeToHtml(vnode) {
6867
6874
  if (!sel) {
6868
6875
  if (vnode.text != null)
6869
6876
  return escapeHtml(String(vnode.text));
6877
+ // Fragment: no selector, but has children — concatenate child HTML
6878
+ if (vnode.children && Array.isArray(vnode.children)) {
6879
+ return vnode.children.map((c) => vnodeToHtml(c)).join('');
6880
+ }
6870
6881
  return '';
6871
6882
  }
6872
6883
  // Parse selector: tag#id.class1.class2