mise 3.0.0 → 2026.6.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.
@@ -1,59 +0,0 @@
1
- import { create } from '../../../src/vdom/fiber';
2
- import { mockFiber, emptyFiber } from '../../utils';
3
-
4
- describe('fiber tests', () => {
5
- it('should exist', () => {
6
- expect(create).toBeDefined();
7
- });
8
-
9
- describe('creating fibers', () => {
10
- it('should create a fiber', () => {
11
- const {
12
- parent,
13
- element,
14
- next,
15
- previous,
16
- } = mockFiber();
17
-
18
- const fiber = create({
19
- parent,
20
- element,
21
- previous,
22
- next,
23
- });
24
-
25
- expect(fiber).toEqual({
26
- parent,
27
- previous: {
28
- tree: previous,
29
- element,
30
- },
31
- next: {
32
- tree: next,
33
- element: null,
34
- },
35
- });
36
- });
37
-
38
- it('should handle no elements being passed in', () => {
39
- const {
40
- parent,
41
- element,
42
- } = mockFiber();
43
-
44
- const fiber = create({ parent, element });
45
-
46
- expect(fiber).toEqual({
47
- parent,
48
- previous: {
49
- element,
50
- tree: emptyFiber,
51
- },
52
- next: {
53
- element: null,
54
- tree: emptyFiber,
55
- },
56
- });
57
- });
58
- });
59
- });
@@ -1,208 +0,0 @@
1
- import { reconciler } from '../../../src/vdom/reconciler';
2
- import { create, types } from '../../../src/vdom/fiber';
3
- import { paint } from '../../../src/vdom/vdom';
4
-
5
- import {
6
- mockFiber,
7
- requestIdleCallback,
8
- requestAnimationFrame,
9
- getLastMockCall,
10
- } from '../../utils';
11
-
12
- jest.mock('../../../src/vdom/vdom');
13
-
14
- window.requestIdleCallback = requestIdleCallback;
15
- window.requestAnimationFrame = requestAnimationFrame;
16
-
17
- describe('reconciler', () => {
18
- let add;
19
-
20
- beforeEach(() => {
21
- add = reconciler().add;
22
- });
23
-
24
- it('should exist', () => {
25
- expect(add).toBeDefined();
26
- });
27
-
28
- it('should replace', (done) => {
29
- const {
30
- parent,
31
- element,
32
- previous,
33
- next,
34
- } = mockFiber();
35
-
36
- const first = create({
37
- parent,
38
- element,
39
- previous,
40
- next,
41
- });
42
-
43
- next.props.onupdate = () => {};
44
-
45
- add(first);
46
-
47
- setTimeout(() => {
48
- expect(getLastMockCall(paint)[0][0].action).toBe(types.replace);
49
- expect(getLastMockCall(paint)[0][0].lifecycle).toBeDefined();
50
-
51
- done();
52
- }, 25);
53
- });
54
-
55
- it('should update', (done) => {
56
- const {
57
- parent,
58
- element,
59
- previous,
60
- next,
61
- } = mockFiber();
62
-
63
- next.type = 'div';
64
- next.props.onupdate = () => {};
65
-
66
- const first = create({
67
- parent,
68
- element,
69
- previous,
70
- next,
71
- });
72
-
73
- add(first);
74
-
75
- setTimeout(() => {
76
- expect(getLastMockCall(paint)[0][0].action).toBe(types.update);
77
- expect(getLastMockCall(paint)[0][0].lifecycle).toBeDefined();
78
- done();
79
- }, 25);
80
- });
81
-
82
- it('should create', (done) => {
83
- const {
84
- parent,
85
- element,
86
- next,
87
- } = mockFiber();
88
-
89
- next.type = 'div';
90
- next.props.oncreate = () => {};
91
-
92
- const first = create({
93
- parent,
94
- element,
95
- next,
96
- });
97
-
98
- add(first);
99
-
100
- setTimeout(() => {
101
- expect(getLastMockCall(paint)[0][0].action).toBe(types.create);
102
- expect(getLastMockCall(paint)[0][0].lifecycle).toBeDefined();
103
- done();
104
- }, 25);
105
- });
106
-
107
- it('should remove', (done) => {
108
- const {
109
- parent,
110
- element,
111
- previous,
112
- } = mockFiber();
113
-
114
- const first = create({
115
- parent,
116
- element,
117
- previous,
118
- });
119
-
120
- previous.props.onremove = () => {};
121
-
122
- add(first);
123
-
124
- setTimeout(() => {
125
- expect(getLastMockCall(paint)[0][0].action).toBe(types.remove);
126
- expect(getLastMockCall(paint)[0][0].lifecycle).toBeDefined();
127
- done();
128
- }, 25);
129
- });
130
-
131
- it('should handle text nodes, too', (done) => {
132
- const {
133
- parent,
134
- element,
135
- } = mockFiber();
136
-
137
- const previous = 'yep';
138
- const next = 'nope';
139
-
140
- const first = create({
141
- parent,
142
- element,
143
- previous,
144
- next,
145
- });
146
-
147
- add(first);
148
-
149
- setTimeout(() => {
150
- expect(getLastMockCall(paint)[0][0].action).toBe(types.replace);
151
- done();
152
- }, 25);
153
- });
154
-
155
- it('should properly process children', (done) => {
156
- const {
157
- parent,
158
- element,
159
- previous,
160
- next,
161
- } = mockFiber();
162
-
163
- next.children = [{ ...next }, { ...next }, { ...next }];
164
-
165
- const first = create({
166
- parent,
167
- element,
168
- previous,
169
- next,
170
- });
171
-
172
- add(first);
173
-
174
- setTimeout(() => {
175
- expect(getLastMockCall(paint)[0].length).toBe(4);
176
- expect(getLastMockCall(paint)[0][0].action).toBe(types.replace);
177
- expect(getLastMockCall(paint)[0][1].action).toBe(types.create);
178
- expect(getLastMockCall(paint)[0][2].action).toBe(types.create);
179
- expect(getLastMockCall(paint)[0][3].action).toBe(types.create);
180
- done();
181
- }, 25);
182
- });
183
-
184
- it('should request another idle callback if theres too much work to do', (done) => {
185
- const {
186
- parent,
187
- element,
188
- previous,
189
- next,
190
- } = mockFiber();
191
-
192
- next.children = new Array(2500).fill({ ...next });
193
-
194
- const first = create({
195
- parent,
196
- element,
197
- previous,
198
- next,
199
- });
200
-
201
- add(first);
202
-
203
- setTimeout(() => {
204
- expect(getLastMockCall(paint)[0].length).toBe(2501);
205
- done();
206
- }, 400);
207
- });
208
- });
@@ -1,331 +0,0 @@
1
- /* eslint no-useless-escape: 0 */
2
-
3
- import { createElement, paint } from '../../../src/vdom/vdom';
4
- import { dom } from '../../../src';
5
- import { create, types } from '../../../src/vdom/fiber';
6
-
7
- import { mockFiber, requestIdleCallback, requestAnimationFrame } from '../../utils';
8
-
9
- window.requestIdleCallback = requestIdleCallback;
10
- window.requestAnimationFrame = requestAnimationFrame;
11
-
12
- describe('vdom', () => {
13
- describe('create element', () => {
14
- it('should create a simple text node', () => {
15
- const element = createElement('hey');
16
-
17
- expect(element.nodeValue).toBe('hey');
18
- });
19
-
20
- it('should create an empty div if no data is passed', () => {
21
- const element = createElement(dom('h1'));
22
-
23
- expect(element.outerHTML).toBe('<h1></h1>');
24
- });
25
-
26
- it('should make elements for the children, too', () => {
27
- const node = dom(
28
- 'ul',
29
- null,
30
- [
31
- dom('li', null, 'first'),
32
- dom('li', null, 'second'),
33
- dom('li', null, 'third'),
34
- ],
35
- );
36
-
37
- const element = createElement(node);
38
-
39
- expect(element.outerHTML).toBe('<ul><li>first</li><li>second</li><li>third</li></ul>');
40
- });
41
-
42
- it('should properly add props', () => {
43
- const element = createElement(dom('div', { id: 'neato-element' }));
44
- expect(element.outerHTML).toBe('<div id="neato-element"></div>');
45
- });
46
- });
47
-
48
- describe('paint', () => {
49
- describe('create', () => {
50
- it('should create an element if the fiber action is create', () => {
51
- const lifecycle = jest.fn();
52
-
53
- const {
54
- parent,
55
- element,
56
- next,
57
- previous,
58
- } = mockFiber();
59
-
60
- const fiber = create({
61
- parent,
62
- element,
63
- previous,
64
- next,
65
- });
66
-
67
- fiber.action = types.create;
68
- fiber.lifecycle = lifecycle;
69
- fiber.next.element = createElement(fiber.next.tree);
70
-
71
- paint([fiber]);
72
-
73
- const added = parent.querySelector('ul');
74
- expect(added).toBeDefined();
75
- expect(added.outerHTML).toBe('<ul class="b"></ul>');
76
- expect(lifecycle.mock.calls.length).toBe(1);
77
- });
78
- });
79
-
80
- describe('remove', () => {
81
- it('should remove an element if the fiber action is remove', () => {
82
- const {
83
- parent,
84
- element,
85
- next,
86
- previous,
87
- } = mockFiber();
88
-
89
- const fiber = create({
90
- parent,
91
- element,
92
- previous,
93
- next,
94
- });
95
-
96
- fiber.action = types.remove;
97
-
98
- paint([fiber]);
99
-
100
- const removed = parent.querySelector('div');
101
- expect(removed).toBeNull();
102
- });
103
-
104
- it('should run the lifecycle function on remove', () => {
105
- const inner = jest.fn();
106
- const lifecycle = () => inner;
107
-
108
- const {
109
- parent,
110
- element,
111
- next,
112
- previous,
113
- } = mockFiber();
114
-
115
- const fiber = create({
116
- parent,
117
- element,
118
- previous,
119
- next,
120
- });
121
-
122
- fiber.action = types.remove;
123
- fiber.lifecycle = lifecycle;
124
-
125
- paint([fiber]);
126
-
127
- expect(inner.mock.calls.length).toBe(1);
128
- });
129
- });
130
-
131
- describe('replace', () => {
132
- it('should replace an element if the fiber action is replace', () => {
133
- const inner = jest.fn();
134
- const lifecycle = () => inner;
135
-
136
- const {
137
- parent,
138
- element,
139
- next,
140
- previous,
141
- } = mockFiber();
142
-
143
- const fiber = create({
144
- parent,
145
- element,
146
- previous,
147
- next,
148
- });
149
-
150
- fiber.action = types.replace;
151
- fiber.lifecycle = lifecycle;
152
- fiber.next.element = createElement(fiber.next.tree);
153
-
154
- paint([fiber]);
155
-
156
- expect(parent.innerHTML).toBe('<ul class="b"></ul>');
157
- expect(inner.mock.calls.length).toBe(1);
158
- });
159
- });
160
-
161
- describe('update in place', () => {
162
- it('should update an element in place if the action is replace', () => {
163
- const inner = jest.fn();
164
- const lifecycle = () => inner;
165
-
166
- const {
167
- parent,
168
- element,
169
- } = mockFiber();
170
-
171
- const next = {
172
- type: 'div',
173
- props: {
174
- class: 'updated',
175
- style: { textDecoration: 'strike-through' },
176
- },
177
- };
178
-
179
- const previous = {
180
- type: 'div',
181
- props: {
182
- class: 'not-updated',
183
- },
184
- };
185
-
186
- const fiber = create({
187
- parent,
188
- element,
189
- previous,
190
- next,
191
- });
192
-
193
- fiber.action = types.update;
194
- fiber.lifecycle = lifecycle;
195
-
196
- paint([fiber]);
197
-
198
- expect(parent.innerHTML).toBe('<div class="updated" style="text-decoration: strike-through;"></div>');
199
- expect(inner.mock.calls.length).toBe(1);
200
- });
201
-
202
- it('should try intelligently update a boolean value', () => {
203
- const {
204
- parent,
205
- element,
206
- } = mockFiber();
207
-
208
- const next = {
209
- type: 'div',
210
- props: {
211
- disabled: true,
212
- },
213
- };
214
-
215
- const previous = {
216
- type: 'div',
217
- props: {},
218
- };
219
-
220
- const fiber = create({
221
- parent,
222
- element,
223
- previous,
224
- next,
225
- });
226
-
227
- fiber.action = types.update;
228
-
229
- paint([fiber]);
230
-
231
- expect(parent.innerHTML).toBe('<div disabled="true"></div>');
232
- });
233
-
234
- it('should try intelligently update a falsy boolean value', () => {
235
- const {
236
- parent,
237
- element,
238
- } = mockFiber();
239
-
240
- const next = {
241
- type: 'div',
242
- props: {
243
- disabled: false,
244
- },
245
- };
246
-
247
- const previous = {
248
- type: 'div',
249
- props: {},
250
- };
251
-
252
- const fiber = create({
253
- parent,
254
- element,
255
- previous,
256
- next,
257
- });
258
-
259
- fiber.action = types.update;
260
-
261
- paint([fiber]);
262
-
263
- expect(parent.innerHTML).toBe('<div></div>');
264
- });
265
-
266
- it('should try to intelligently update a "value" value', () => {
267
- const parent = document.createElement('div');
268
- const element = document.createElement('input');
269
- parent.appendChild(element);
270
-
271
- const next = {
272
- type: 'input',
273
- props: {
274
- value: 'hello',
275
- },
276
- };
277
-
278
- const previous = {
279
- type: 'input',
280
- props: {},
281
- };
282
-
283
- const fiber = create(
284
- parent,
285
- element,
286
- previous,
287
- next,
288
- );
289
-
290
- fiber.action = types.update;
291
-
292
- paint([fiber]);
293
-
294
- expect(parent.innerHTML).toBe('<input>');
295
- });
296
- });
297
-
298
- it('should do anything if theres no action type', () => {
299
- const {
300
- parent,
301
- element,
302
- } = mockFiber();
303
-
304
- const next = {
305
- type: 'div',
306
- props: {
307
- class: 'updated',
308
- style: { textDecoration: 'strike-through' },
309
- },
310
- };
311
-
312
- const previous = {
313
- type: 'div',
314
- props: {
315
- class: 'not-updated',
316
- },
317
- };
318
-
319
- const fiber = create(
320
- element,
321
- previous,
322
- next,
323
- );
324
-
325
- const finished = [fiber];
326
-
327
- paint(finished);
328
- expect(parent.innerHTML).toBe('<div></div>');
329
- });
330
- });
331
- });
package/test/utils.js DELETED
@@ -1,62 +0,0 @@
1
- const requestAnimationFrame = setTimeout;
2
- const requestIdleCallback = function ric(cb) {
3
- const start = Date.now();
4
- return setTimeout(() => {
5
- cb({
6
- didTimeout: false,
7
- timeRemaining() {
8
- return Math.max(0, 50 - (Date.now() - start));
9
- },
10
- });
11
- }, 1);
12
- };
13
-
14
- const mockFiber = () => {
15
- const parent = document.createElement('div');
16
- const element = document.createElement('div');
17
- parent.appendChild(element);
18
-
19
- const previous = {
20
- type: 'div',
21
- props: {
22
- class: 'a',
23
- onclick() {
24
- console.log('a');
25
- },
26
- },
27
- children: [],
28
- };
29
-
30
- const next = {
31
- type: 'ul',
32
- props: {
33
- class: 'b',
34
- onclick() {
35
- console.log('b');
36
- },
37
- },
38
- children: [],
39
- };
40
-
41
- return {
42
- parent,
43
- element,
44
- previous,
45
- next,
46
- };
47
- };
48
-
49
- const emptyFiber = {
50
- children: [],
51
- empty: true,
52
- };
53
-
54
- const getLastMockCall = mocked => mocked.mock.calls[mocked.mock.calls.length - 1];
55
-
56
- export {
57
- requestIdleCallback,
58
- requestAnimationFrame,
59
- mockFiber,
60
- emptyFiber,
61
- getLastMockCall,
62
- };
package/tsconfig.json DELETED
@@ -1,15 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "removeComments": true,
4
- "allowJs": true,
5
- "allowSyntheticDefaultImports": true,
6
- "baseUrl": "./src"
7
- },
8
- "include": [
9
- "./src/index.d.ts"
10
- ],
11
- "awesomeTypescriptLoaderOptions": {
12
- "useBabel": true,
13
- "useCache": true
14
- }
15
- }
package/webpack.config.js DELETED
@@ -1,39 +0,0 @@
1
- const path = require('path');
2
- const restSpread = require('babel-plugin-transform-object-rest-spread');
3
-
4
- module.exports = {
5
- entry: './src/index',
6
-
7
- output: {
8
- path: path.resolve(__dirname, 'dist'),
9
- filename: 'mise.js',
10
- library: 'mise',
11
- libraryTarget: 'umd',
12
- umdNamedDefine: true,
13
- },
14
-
15
- resolve: {
16
- extensions: ['.ts', '.tsx', '.js', '.jsx'],
17
- },
18
-
19
- module: {
20
- rules: [
21
- {
22
- test: /\.jsx?$/,
23
- exclude: /(node_modules|bower_components)/,
24
- use: {
25
- loader: 'babel-loader',
26
- options: {
27
- presets: ['env'],
28
- plugins: [restSpread],
29
- },
30
- },
31
- },
32
- {
33
- test: /\.tsx?$/,
34
- exclude: /node_modules/,
35
- loader: 'awesome-typescript-loader',
36
- },
37
- ],
38
- },
39
- };