@igojs/signal 6.0.0-beta.13 → 6.0.0-beta.15
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/index.js +0 -2
- package/package.json +1 -1
- package/src/client/SignalComponent.js +18 -29
- package/src/client/index.js +16 -7
- package/test/client/SignalComponentTest.js +10 -7
package/index.js
CHANGED
|
@@ -2,12 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
// Server-side exports
|
|
4
4
|
const server = require('./src/server/index.js');
|
|
5
|
-
const SignalComponent = require('./src/client/SignalComponent.js');
|
|
6
5
|
|
|
7
6
|
module.exports = {
|
|
8
7
|
middleware: server.middleware,
|
|
9
8
|
templates: server.templates,
|
|
10
9
|
configure: server.configure,
|
|
11
10
|
serialize: server.serialize,
|
|
12
|
-
SignalComponent,
|
|
13
11
|
};
|
package/package.json
CHANGED
|
@@ -41,7 +41,13 @@ class Igo2Component {
|
|
|
41
41
|
|
|
42
42
|
// Server-side rendering: compute derived values (getters) for Dust templates
|
|
43
43
|
static ssr(props) {
|
|
44
|
-
const instance = new this(null
|
|
44
|
+
const instance = new this(null);
|
|
45
|
+
props = props || {};
|
|
46
|
+
instance._props = props;
|
|
47
|
+
instance.props = props;
|
|
48
|
+
if (props.form) {
|
|
49
|
+
instance._state.form = props.form;
|
|
50
|
+
}
|
|
45
51
|
|
|
46
52
|
const derived = {};
|
|
47
53
|
const descriptors = Object.getOwnPropertyDescriptors(this.prototype);
|
|
@@ -61,7 +67,7 @@ class Igo2Component {
|
|
|
61
67
|
return derived;
|
|
62
68
|
}
|
|
63
69
|
|
|
64
|
-
constructor(element, template
|
|
70
|
+
constructor(element, template) {
|
|
65
71
|
|
|
66
72
|
this.template = template;
|
|
67
73
|
|
|
@@ -86,22 +92,18 @@ class Igo2Component {
|
|
|
86
92
|
this._isTracking = false;
|
|
87
93
|
this._trackedDeps = [];
|
|
88
94
|
|
|
89
|
-
|
|
90
|
-
|
|
95
|
+
this._state = {};
|
|
96
|
+
this._derivedValues = {};
|
|
91
97
|
|
|
92
98
|
if (isServer) {
|
|
93
|
-
|
|
94
|
-
initialProps = props || {};
|
|
99
|
+
this.state = this._state;
|
|
95
100
|
} else {
|
|
96
|
-
// Browser: hydrate from window and element
|
|
101
|
+
// Browser: hydrate props from window and element
|
|
97
102
|
const globalProps = window.__signal_props || {};
|
|
98
103
|
let localProps = {};
|
|
99
104
|
|
|
100
|
-
// Hydrate local props from data-props attribute (serialized with devalue)
|
|
101
105
|
if (this.element.dataset.props) {
|
|
102
106
|
try {
|
|
103
|
-
// devalue produces a JS expression, so we need to evaluate it
|
|
104
|
-
// new Function is safer than eval because it creates a local scope
|
|
105
107
|
const hydrate = new Function('return ' + this.element.dataset.props);
|
|
106
108
|
localProps = hydrate();
|
|
107
109
|
} catch (e) {
|
|
@@ -109,26 +111,14 @@ class Igo2Component {
|
|
|
109
111
|
}
|
|
110
112
|
}
|
|
111
113
|
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
this._props = initialProps;
|
|
116
|
-
this._state = {};
|
|
117
|
-
this._derivedValues = {};
|
|
114
|
+
this._props = { ...globalProps, ...localProps };
|
|
118
115
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
}
|
|
116
|
+
if (this._props.form) {
|
|
117
|
+
this._state.form = this._props.form;
|
|
118
|
+
}
|
|
123
119
|
|
|
124
|
-
// Props (simple object in SSR, tracking proxy in browser)
|
|
125
|
-
if (isServer) {
|
|
126
|
-
this.props = this._props;
|
|
127
|
-
this.state = this._state;
|
|
128
|
-
} else {
|
|
129
120
|
this.props = this._createTrackingProxy(this._props, 'props');
|
|
130
|
-
this.
|
|
131
|
-
this.state = this._stateProxy.create(this._state);
|
|
121
|
+
this.state = new StateProxy(this, 'state').create(this._state);
|
|
132
122
|
}
|
|
133
123
|
|
|
134
124
|
// Initialize component (browser only, async fire-and-forget)
|
|
@@ -137,7 +127,6 @@ class Igo2Component {
|
|
|
137
127
|
}
|
|
138
128
|
}
|
|
139
129
|
|
|
140
|
-
// Create a tracking proxy for dependency detection
|
|
141
130
|
_createTrackingProxy(target, namespace) {
|
|
142
131
|
return new Proxy(target, {
|
|
143
132
|
get: (target, property) => {
|
|
@@ -380,7 +369,7 @@ class Igo2Component {
|
|
|
380
369
|
this._dustTemplateFn = null;
|
|
381
370
|
this._eventBinder = null;
|
|
382
371
|
this._derivedCache = null;
|
|
383
|
-
|
|
372
|
+
|
|
384
373
|
this._state = {};
|
|
385
374
|
this._derivedValues = {};
|
|
386
375
|
this._trackedDeps = [];
|
package/src/client/index.js
CHANGED
|
@@ -9,14 +9,21 @@
|
|
|
9
9
|
* });
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
require('./dust/i18n.js');
|
|
13
|
-
|
|
14
12
|
const SignalComponent = require('./SignalComponent.js');
|
|
13
|
+
|
|
14
|
+
const isServer = typeof window === 'undefined';
|
|
15
|
+
|
|
16
|
+
if (!isServer) {
|
|
17
|
+
require('./dust/i18n.js');
|
|
18
|
+
}
|
|
19
|
+
|
|
15
20
|
const Utils = require('./dust/Utils.js');
|
|
16
21
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
22
|
+
if (!isServer) {
|
|
23
|
+
window.__signal = {
|
|
24
|
+
IgoDustUtils: Utils
|
|
25
|
+
};
|
|
26
|
+
}
|
|
20
27
|
|
|
21
28
|
let registry = {};
|
|
22
29
|
|
|
@@ -68,6 +75,8 @@ function start(config = {}) {
|
|
|
68
75
|
}
|
|
69
76
|
}
|
|
70
77
|
|
|
71
|
-
|
|
78
|
+
if (!isServer) {
|
|
79
|
+
window.__signal.mountElement = mountElement;
|
|
80
|
+
}
|
|
72
81
|
|
|
73
|
-
module.exports = { SignalComponent, start
|
|
82
|
+
module.exports = { SignalComponent, start };
|
|
@@ -5,16 +5,19 @@ describe('SignalComponent', () => {
|
|
|
5
5
|
|
|
6
6
|
it('should initialize with props in SSR mode', () => {
|
|
7
7
|
const props = { products: [{ id: 1 }] };
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
class TestComponent extends SignalComponent {}
|
|
9
|
+
const derived = TestComponent.ssr(props);
|
|
10
|
+
// ssr() returns derived getters, but we verify props are accessible
|
|
11
|
+
assert.ok(derived);
|
|
11
12
|
});
|
|
12
13
|
|
|
13
|
-
it('should initialize form state from props.form', () => {
|
|
14
|
+
it('should initialize form state from props.form via ssr()', () => {
|
|
14
15
|
const props = { form: { search: 'test' } };
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
class TestComponent extends SignalComponent {
|
|
17
|
+
get formSearch() { return this.state.form?.search; }
|
|
18
|
+
}
|
|
19
|
+
const derived = TestComponent.ssr(props);
|
|
20
|
+
assert.strictEqual(derived.formSearch, 'test');
|
|
18
21
|
});
|
|
19
22
|
|
|
20
23
|
it('should compute derived values via ssr()', () => {
|