thunderous 2.1.1 → 2.3.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.
package/dist/index.cjs CHANGED
@@ -744,7 +744,12 @@ You must set an initial value before calling a property signal's getter.
744
744
  setFromProp = false;
745
745
  }
746
746
  });
747
- return [getter, setter];
747
+ const publicSignal = [getter, setter];
748
+ publicSignal.init = (value) => {
749
+ _setter(value);
750
+ return [getter, setter];
751
+ };
752
+ return publicSignal;
748
753
  },
749
754
  set: () => {
750
755
  console.error("Signals must be assigned via setters.");
package/dist/index.d.cts CHANGED
@@ -46,7 +46,7 @@ type RenderArgs<Props extends CustomElementProps> = {
46
46
  customCallback: (fn: () => void) => `this.getRootNode().host.__customCallbackFns.get('${string}')(event)` | '';
47
47
  attrSignals: Record<string, Signal<string | null>>;
48
48
  propSignals: {
49
- [K in keyof Props]: Signal<Props[K]>;
49
+ [K in keyof Props]: SignalWithInit<Props[K]>;
50
50
  };
51
51
  refs: Record<string, HTMLElement | null>;
52
52
  adoptStyleSheet: (stylesheet: Styles) => void;
@@ -102,10 +102,16 @@ type SignalGetter<T> = {
102
102
  type SignalSetter<T> = (newValue: T, options?: SignalOptions) => void;
103
103
  type Signal<T = unknown> = [SignalGetter<T>, SignalSetter<T>];
104
104
 
105
+ // TODO: add `| undefined` to the uninitialized signal.
106
+ // The reason I didn't do it yet is that it's a breaking change. I'll wait for the next major version.
107
+ type SignalWithInit<T = unknown> = Signal<T> & { init: (value: T) => Signal<T> };
108
+
105
109
  // Flexible typing is necessary to support generic functions
106
110
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
107
111
  type AnyFn = (...args: any[]) => any;
108
112
 
113
+ type HTMLCustomElement<T extends Record<PropertyKey, unknown>> = Omit<HTMLElement, keyof T> & T;
114
+
109
115
  /**
110
116
  * Create a custom element that can be defined for use in the DOM.
111
117
  * @example
@@ -176,4 +182,4 @@ declare const createEffect: (fn: () => void) => void;
176
182
  declare const html: (strings: TemplateStringsArray, ...values: unknown[]) => DocumentFragment;
177
183
  declare const css: (strings: TemplateStringsArray, ...values: unknown[]) => Styles;
178
184
 
179
- export { type RenderArgs, type RenderFunction, type Signal, type SignalGetter, type SignalSetter, clientOnlyCallback, createEffect, createRegistry, createSignal, css, customElement, derived, html, insertTemplates, onServerDefine };
185
+ export { type HTMLCustomElement, type RenderArgs, type RenderFunction, type Signal, type SignalGetter, type SignalSetter, clientOnlyCallback, createEffect, createRegistry, createSignal, css, customElement, derived, html, insertTemplates, onServerDefine };
package/dist/index.d.ts CHANGED
@@ -46,7 +46,7 @@ type RenderArgs<Props extends CustomElementProps> = {
46
46
  customCallback: (fn: () => void) => `this.getRootNode().host.__customCallbackFns.get('${string}')(event)` | '';
47
47
  attrSignals: Record<string, Signal<string | null>>;
48
48
  propSignals: {
49
- [K in keyof Props]: Signal<Props[K]>;
49
+ [K in keyof Props]: SignalWithInit<Props[K]>;
50
50
  };
51
51
  refs: Record<string, HTMLElement | null>;
52
52
  adoptStyleSheet: (stylesheet: Styles) => void;
@@ -102,10 +102,16 @@ type SignalGetter<T> = {
102
102
  type SignalSetter<T> = (newValue: T, options?: SignalOptions) => void;
103
103
  type Signal<T = unknown> = [SignalGetter<T>, SignalSetter<T>];
104
104
 
105
+ // TODO: add `| undefined` to the uninitialized signal.
106
+ // The reason I didn't do it yet is that it's a breaking change. I'll wait for the next major version.
107
+ type SignalWithInit<T = unknown> = Signal<T> & { init: (value: T) => Signal<T> };
108
+
105
109
  // Flexible typing is necessary to support generic functions
106
110
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
107
111
  type AnyFn = (...args: any[]) => any;
108
112
 
113
+ type HTMLCustomElement<T extends Record<PropertyKey, unknown>> = Omit<HTMLElement, keyof T> & T;
114
+
109
115
  /**
110
116
  * Create a custom element that can be defined for use in the DOM.
111
117
  * @example
@@ -176,4 +182,4 @@ declare const createEffect: (fn: () => void) => void;
176
182
  declare const html: (strings: TemplateStringsArray, ...values: unknown[]) => DocumentFragment;
177
183
  declare const css: (strings: TemplateStringsArray, ...values: unknown[]) => Styles;
178
184
 
179
- export { type RenderArgs, type RenderFunction, type Signal, type SignalGetter, type SignalSetter, clientOnlyCallback, createEffect, createRegistry, createSignal, css, customElement, derived, html, insertTemplates, onServerDefine };
185
+ export { type HTMLCustomElement, type RenderArgs, type RenderFunction, type Signal, type SignalGetter, type SignalSetter, clientOnlyCallback, createEffect, createRegistry, createSignal, css, customElement, derived, html, insertTemplates, onServerDefine };
package/dist/index.js CHANGED
@@ -709,7 +709,12 @@ You must set an initial value before calling a property signal's getter.
709
709
  setFromProp = false;
710
710
  }
711
711
  });
712
- return [getter, setter];
712
+ const publicSignal = [getter, setter];
713
+ publicSignal.init = (value) => {
714
+ _setter(value);
715
+ return [getter, setter];
716
+ };
717
+ return publicSignal;
713
718
  },
714
719
  set: () => {
715
720
  console.error("Signals must be assigned via setters.");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thunderous",
3
- "version": "2.1.1",
3
+ "version": "2.3.0",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",