thunderous 2.3.12 → 2.3.13
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/dist/__test__/custom-element.test.js +48 -0
- package/dist/__test__/registry.test.js +60 -0
- package/dist/__test__/render.test.js +48 -0
- package/dist/__test__/server-side.test.js +196 -0
- package/dist/__test__/signals.test.js +247 -0
- package/dist/__test__/utilities.test.js +8 -0
- package/dist/constants.js +13 -0
- package/dist/custom-element.js +391 -0
- package/dist/index.cjs +45 -12
- package/dist/index.js +5 -1007
- package/dist/registry.js +95 -0
- package/dist/render.js +350 -0
- package/dist/server-side.js +136 -0
- package/dist/signals.js +115 -0
- package/dist/utilities.js +9 -0
- package/package.json +6 -3
package/dist/signals.js
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
let subscriber = null;
|
|
2
|
+
/**
|
|
3
|
+
* Create a signal with an initial value.
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* const [getCount, setCount] = createSignal(0);
|
|
7
|
+
* const increment = () => setCount(getCount() + 1);
|
|
8
|
+
* const decrement = () => setCount(getCount() - 1);
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
export const createSignal = (initVal, options) => {
|
|
12
|
+
const subscribers = new Set();
|
|
13
|
+
let value = initVal;
|
|
14
|
+
const getter = (getterOptions) => {
|
|
15
|
+
if (subscriber !== null) {
|
|
16
|
+
subscribers.add(subscriber);
|
|
17
|
+
}
|
|
18
|
+
if (options?.debugMode === true || getterOptions?.debugMode === true) {
|
|
19
|
+
let label = 'anonymous signal';
|
|
20
|
+
if (options?.label !== undefined) {
|
|
21
|
+
label = `(${options.label})`;
|
|
22
|
+
if (getterOptions?.label !== undefined) {
|
|
23
|
+
label += ` ${getterOptions.label}`;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else if (getterOptions?.label !== undefined) {
|
|
27
|
+
label = getterOptions.label;
|
|
28
|
+
}
|
|
29
|
+
console.log('Signal retrieved:', { value, subscribers, label });
|
|
30
|
+
}
|
|
31
|
+
return value;
|
|
32
|
+
};
|
|
33
|
+
getter.getter = true;
|
|
34
|
+
let stackLength = 0;
|
|
35
|
+
const setter = (newValue, setterOptions) => {
|
|
36
|
+
stackLength++;
|
|
37
|
+
queueMicrotask(() => stackLength--);
|
|
38
|
+
if (stackLength > 1000) {
|
|
39
|
+
console.error(new Error('Signal setter stack overflow detected. Possible infinite loop. Bailing out.'));
|
|
40
|
+
stackLength = 0;
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const isObject = typeof newValue === 'object' && newValue !== null;
|
|
44
|
+
if (!isObject && value === newValue)
|
|
45
|
+
return;
|
|
46
|
+
if (isObject && typeof value === 'object' && value !== null) {
|
|
47
|
+
if (JSON.stringify(value) === JSON.stringify(newValue))
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const oldValue = value;
|
|
51
|
+
value = newValue;
|
|
52
|
+
for (const fn of subscribers) {
|
|
53
|
+
try {
|
|
54
|
+
fn();
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
console.error('Error in subscriber:', { error, oldValue, newValue, fn });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (options?.debugMode === true || setterOptions?.debugMode === true) {
|
|
61
|
+
let label = 'anonymous signal';
|
|
62
|
+
if (options?.label !== undefined) {
|
|
63
|
+
label = `(${options.label})`;
|
|
64
|
+
if (setterOptions?.label !== undefined) {
|
|
65
|
+
label += ` ${setterOptions.label}`;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else if (setterOptions?.label !== undefined) {
|
|
69
|
+
label = setterOptions.label;
|
|
70
|
+
}
|
|
71
|
+
console.log('Signal set:', { oldValue, newValue, subscribers, label });
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
return [getter, setter];
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Create a derived signal that depends on other signals.
|
|
78
|
+
* @example
|
|
79
|
+
* ```ts
|
|
80
|
+
* const [getCount, setCount] = createSignal(0);
|
|
81
|
+
* const doubleCount = derived(() => getCount() * 2);
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
export const derived = (fn, options) => {
|
|
85
|
+
const [getter, setter] = createSignal(undefined, options);
|
|
86
|
+
createEffect(() => {
|
|
87
|
+
try {
|
|
88
|
+
setter(fn());
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
console.error('Error in derived signal:', { error, fn });
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
return getter;
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Create an effect that runs when signals change.
|
|
98
|
+
* @example
|
|
99
|
+
* ```ts
|
|
100
|
+
* const [getCount, setCount] = createSignal(0);
|
|
101
|
+
* createEffect(() => {
|
|
102
|
+
* console.log('Count:', getCount());
|
|
103
|
+
* });
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
export const createEffect = (fn) => {
|
|
107
|
+
subscriber = fn;
|
|
108
|
+
try {
|
|
109
|
+
fn();
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
console.error('Error in effect:', { error, fn });
|
|
113
|
+
}
|
|
114
|
+
subscriber = null;
|
|
115
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "thunderous",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.13",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -35,10 +35,13 @@
|
|
|
35
35
|
"www": "cd www && npm run dev",
|
|
36
36
|
"build": "tsup src/index.ts --format cjs,esm --dts --no-clean",
|
|
37
37
|
"test": "find src -name '*.test.ts' | xargs c8 node --import tsx --test",
|
|
38
|
-
"
|
|
38
|
+
"typecheck": "tsc --noEmit",
|
|
39
|
+
"lint": "eslint . && prettier --check .",
|
|
40
|
+
"lint:fix": "eslint . --fix && prettier --write .",
|
|
39
41
|
"version:patch": "npm run build && npm version patch && cd demo && npm version patch && cd ../www && npm version patch && git add -A && git commit -m 'bump version'",
|
|
40
42
|
"version:minor": "npm run build && npm version minor && cd demo && npm version minor && cd ../www && npm version minor && git add -A && git commit -m 'bump version'",
|
|
41
|
-
"version:major": "npm run build && npm version major && cd demo && npm version major && cd ../www && npm version major && git add -A && git commit -m 'bump version'"
|
|
43
|
+
"version:major": "npm run build && npm version major && cd demo && npm version major && cd ../www && npm version major && git add -A && git commit -m 'bump version'",
|
|
44
|
+
"publish": "npm run typecheck && npm run lint && npm test && npm run build && npm publish"
|
|
42
45
|
},
|
|
43
46
|
"devDependencies": {
|
|
44
47
|
"@types/dompurify": "^3.2.0",
|