tungsten 0.4.13 → 0.4.14

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.
Files changed (42) hide show
  1. package/dist/.build-complete +1 -1
  2. package/dist/Components.d.ts +40 -0
  3. package/dist/Components.d.ts.map +1 -1
  4. package/dist/Components.js +58 -72
  5. package/dist/_client/cjsHelpers.d.ts.map +1 -1
  6. package/dist/_client/cjsHelpers.js +4 -2
  7. package/dist/_client/client.js +0 -14
  8. package/dist/_client/hmr.d.ts +2 -0
  9. package/dist/_client/hmr.d.ts.map +1 -0
  10. package/dist/_client/hmr.js +65 -0
  11. package/dist/_client/liveReload.d.ts +2 -0
  12. package/dist/_client/liveReload.d.ts.map +1 -0
  13. package/dist/_client/liveReload.js +6 -0
  14. package/dist/_client/liveReloadSource.d.ts +3 -0
  15. package/dist/_client/liveReloadSource.d.ts.map +1 -0
  16. package/dist/_client/liveReloadSource.js +25 -0
  17. package/dist/babelPlugins/transformPackageImports/getWebLocationOfPackageFile.js +1 -1
  18. package/dist/build/bundle.d.ts.map +1 -1
  19. package/dist/build/bundle.js +10 -1
  20. package/dist/build/createClientFiles.d.ts.map +1 -1
  21. package/dist/build/createClientFiles.js +4 -8
  22. package/dist/build/getSxyClientPackageAliases.d.ts.map +1 -1
  23. package/dist/build/getSxyClientPackageAliases.js +3 -1
  24. package/dist/componentProxyHandlers.d.ts +20 -13
  25. package/dist/componentProxyHandlers.d.ts.map +1 -1
  26. package/dist/componentProxyHandlers.js +130 -86
  27. package/dist/hydrate/hydrate.d.ts.map +1 -1
  28. package/dist/hydrate/hydrate.js +3 -1
  29. package/dist/indexInner.d.ts +1 -1
  30. package/dist/indexInner.d.ts.map +1 -1
  31. package/dist/indexInner.js +1 -0
  32. package/dist/mutatingFunctions.d.ts +2 -1
  33. package/dist/mutatingFunctions.d.ts.map +1 -1
  34. package/dist/mutatingFunctions.js +7 -1
  35. package/dist/render/processHead.d.ts.map +1 -1
  36. package/dist/render/processHead.js +5 -34
  37. package/dist/signals/tracking.d.ts +33 -0
  38. package/dist/signals/tracking.d.ts.map +1 -0
  39. package/dist/signals/tracking.js +87 -0
  40. package/dist/warnOnFrameworkChange.js +1 -1
  41. package/package.json +6 -6
  42. package/dist/.tsbuildinfo +0 -1
@@ -1,36 +1,43 @@
1
- import { TungstenStatefulComponent, TungstenComponent } from './Components.jsx';
2
- type StatefulComponentWithState<State extends object> = TungstenStatefulComponent<any, State, any> | TungstenComponent<any, State, any>;
3
- type StatefulComponentAny = TungstenStatefulComponent<any, any, any> | TungstenComponent<any, any, any>;
1
+ export type StateOwner = {
2
+ __initialized: boolean;
3
+ __signals: boolean;
4
+ __stateUpdated: () => void;
5
+ constructor: {
6
+ name: string;
7
+ };
8
+ };
4
9
  export declare const $original: unique symbol;
5
10
  export declare const $ownerName: unique symbol;
6
- export declare const getStateProxyHandler: <State extends object>(element: StatefulComponentWithState<State>) => {
11
+ export declare const getStateProxyHandler: <State extends object>(element: StateOwner) => {
7
12
  get: (obj: State, key: string | symbol) => unknown;
8
13
  set: (obj: State, key: string | symbol, value: unknown) => boolean;
9
14
  deleteProperty: (obj: State, key: string | symbol) => boolean;
10
15
  has(obj: State, key: string | symbol): boolean;
16
+ ownKeys(obj: State): (string | symbol)[];
11
17
  };
12
- declare const makeStateObjectProxyHandler: <O extends object>(element: StatefulComponentAny) => {
18
+ declare const makeStateObjectProxyHandler: <O extends object>(element: StateOwner) => {
13
19
  get: (obj: O, key: string | symbol) => unknown;
14
20
  set: (obj: O, key: string | symbol, value: unknown) => boolean;
15
21
  deleteProperty: (obj: O, key: string | symbol) => boolean;
16
22
  has(obj: O, key: string | symbol): boolean;
23
+ ownKeys(obj: O): (string | symbol)[];
17
24
  };
18
- export declare const getStateObjectProxyHandler: <O extends object>(element: StatefulComponentAny) => ReturnType<typeof makeStateObjectProxyHandler<O>>;
19
- export declare const getStateArrayProxyHandler: (element: StatefulComponentAny) => {
25
+ export declare const getStateObjectProxyHandler: <O extends object>(element: StateOwner) => ReturnType<typeof makeStateObjectProxyHandler<O>>;
26
+ export declare const getStateArrayProxyHandler: (element: StateOwner) => {
20
27
  get: (arr: unknown[], key: string | symbol) => any;
21
28
  set: (arr: unknown[], key: string | symbol, value: unknown) => boolean;
22
29
  has(arr: unknown[], key: string | symbol): boolean;
23
30
  deleteProperty(arr: unknown[], key: string | symbol): boolean;
24
31
  };
25
- export declare const getStateMapProxyHandler: (element: StatefulComponentAny) => {
26
- get: (map: Map<unknown, unknown>, key: string | symbol) => any;
32
+ export declare const getStateMapProxyHandler: (element: StateOwner) => {
33
+ get: (map: Map<unknown, unknown>, key: string | symbol, receiver: unknown) => any;
27
34
  has(map: Map<unknown, unknown>, key: string | symbol): boolean;
28
35
  };
29
- export declare const getStateSetProxyHandler: (element: StatefulComponentAny) => {
30
- get: (set: Set<unknown>, key: string | symbol) => any;
36
+ export declare const getStateSetProxyHandler: (element: StateOwner) => {
37
+ get: (set: Set<unknown>, key: string | symbol, receiver: unknown) => any;
31
38
  has(set: Set<unknown>, key: string | symbol): boolean;
32
39
  };
33
- export declare function proxyObjectContent<O extends object>(element: StatefulComponentAny, object: O, adopted?: WeakMap<object, object>): void;
34
- export declare function proxyArrayContent<A extends unknown[]>(element: StatefulComponentAny, array: A, adopted?: WeakMap<object, object>): void;
40
+ export declare function proxyObjectContent<O extends object>(element: StateOwner, object: O, adopted?: WeakMap<object, object>): void;
41
+ export declare function proxyArrayContent<A extends unknown[]>(element: StateOwner, array: A, adopted?: WeakMap<object, object>): void;
35
42
  export {};
36
43
  //# sourceMappingURL=componentProxyHandlers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"componentProxyHandlers.d.ts","sourceRoot":"","sources":["../src/componentProxyHandlers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAO/E,KAAK,0BAA0B,CAAC,KAAK,SAAS,MAAM,IAC9C,yBAAyB,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,GAC1C,iBAAiB,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;AAExC,KAAK,oBAAoB,GAAG,yBAAyB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;AAEvG,eAAO,MAAM,SAAS,eAAqB,CAAA;AAC3C,eAAO,MAAM,UAAU,eAAsB,CAAA;AAE7C,eAAO,MAAM,oBAAoB,GAAI,KAAK,SAAS,MAAM,EACxD,SAAS,0BAA0B,CAAC,KAAK,CAAC;eAC5B,KAAK,OAAO,MAAM,GAAG,MAAM;eAQ3B,KAAK,OAAO,MAAM,GAAG,MAAM,SAAS,OAAO;0BAoChC,KAAK,OAAO,MAAM,GAAG,MAAM;aAQxC,KAAK,OAAO,MAAM,GAAG,MAAM;CAItC,CAAA;AAGF,QAAA,MAAM,2BAA2B,GAAI,CAAC,SAAS,MAAM,EAAE,SAAS,oBAAoB;eACrE,CAAC,OAAO,MAAM,GAAG,MAAM;eAQvB,CAAC,OAAO,MAAM,GAAG,MAAM,SAAS,OAAO;0BAmC5B,CAAC,OAAO,MAAM,GAAG,MAAM;aAQpC,CAAC,OAAO,MAAM,GAAG,MAAM;CAIlC,CAAA;AAuBF,eAAO,MAAM,0BAA0B,GAAI,CAAC,SAAS,MAAM,EAAE,SAAS,oBAAoB,KACzC,UAAU,CAAC,OAAO,2BAA2B,CAAC,CAAC,CAAC,CAAC,CAAA;AAwFlG,eAAO,MAAM,yBAAyB,YArGyC,oBAAoB;eA+ChF,OAAO,EAAE,OAAO,MAAM,GAAG,MAAM;eA9B5B,OAAO,EAAE,OAAO,MAAM,GAAG,MAAM,SAAS,OAAO;aAkEpD,OAAO,EAAE,OAAO,MAAM,GAAG,MAAM;wBAIpB,OAAO,EAAE,OAAO,MAAM,GAAG,MAAM;CAcoB,CAAA;AA4D/E,eAAO,MAAM,uBAAuB,YAjK2C,oBAAoB;eAyGpF,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,MAAM,GAAG,MAAM;aAiD7C,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,MAAM,GAAG,MAAM;CAOmB,CAAA;AAsD3E,eAAO,MAAM,uBAAuB,YAvN2C,oBAAoB;eAqKpF,GAAG,CAAC,OAAO,CAAC,OAAO,MAAM,GAAG,MAAM;aA4CpC,GAAG,CAAC,OAAO,CAAC,OAAO,MAAM,GAAG,MAAM;CAM4B,CAAA;AAgC3E,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,GAAE,OAAO,CAAC,MAAM,EAAE,MAAM,CAAiB,GAC3F,IAAI,CA8BN;AAED,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,OAAO,EAAE,EACjD,OAAO,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,GAAE,OAAO,CAAC,MAAM,EAAE,MAAM,CAAiB,GAC1F,IAAI,CA+BN"}
1
+ {"version":3,"file":"componentProxyHandlers.d.ts","sourceRoot":"","sources":["../src/componentProxyHandlers.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,UAAU,GAAG;IACrB,aAAa,EAAE,OAAO,CAAA;IACtB,SAAS,EAAE,OAAO,CAAA;IAClB,cAAc,EAAE,MAAM,IAAI,CAAA;IAC1B,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAChC,CAAA;AAED,eAAO,MAAM,SAAS,eAAqB,CAAA;AAC3C,eAAO,MAAM,UAAU,eAAsB,CAAA;AAuB7C,eAAO,MAAM,oBAAoB,GAAI,KAAK,SAAS,MAAM,EACxD,SAAS,UAAU;eACL,KAAK,OAAO,MAAM,GAAG,MAAM;eAS3B,KAAK,OAAO,MAAM,GAAG,MAAM,SAAS,OAAO;0BAoChC,KAAK,OAAO,MAAM,GAAG,MAAM;aAOxC,KAAK,OAAO,MAAM,GAAG,MAAM;iBAKvB,KAAK;CAIpB,CAAA;AAGF,QAAA,MAAM,2BAA2B,GAAI,CAAC,SAAS,MAAM,EAAE,SAAS,UAAU;eAC3D,CAAC,OAAO,MAAM,GAAG,MAAM;eASvB,CAAC,OAAO,MAAM,GAAG,MAAM,SAAS,OAAO;0BAmC5B,CAAC,OAAO,MAAM,GAAG,MAAM;aAOpC,CAAC,OAAO,MAAM,GAAG,MAAM;iBAKnB,CAAC;CAIhB,CAAA;AAuBF,eAAO,MAAM,0BAA0B,GAAI,CAAC,SAAS,MAAM,EAAE,SAAS,UAAU,KAC/B,UAAU,CAAC,OAAO,2BAA2B,CAAC,CAAC,CAAC,CAAC,CAAA;AAwFlG,eAAO,MAAM,yBAAyB,YArG+B,UAAU;eA4C5D,OAAO,EAAE,OAAO,MAAM,GAAG,MAAM;eAjB5B,OAAO,EAAE,OAAO,MAAM,GAAG,MAAM,SAAS,OAAO;aA2DpD,OAAO,EAAE,OAAO,MAAM,GAAG,MAAM;wBAKpB,OAAO,EAAE,OAAO,MAAM,GAAG,MAAM;CAUoB,CAAA;AAgE/E,eAAO,MAAM,uBAAuB,YArKiC,UAAU;eA2GhE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,MAAM,GAAG,MAAM,YAAY,OAAO;aAmDhE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,MAAM,GAAG,MAAM;CAOmB,CAAA;AA8D3E,eAAO,MAAM,uBAAuB,YAnOiC,UAAU;eA0KhE,GAAG,CAAC,OAAO,CAAC,OAAO,MAAM,GAAG,MAAM,YAAY,OAAO;aAmDvD,GAAG,CAAC,OAAO,CAAC,OAAO,MAAM,GAAG,MAAM;CAM4B,CAAA;AAgC3E,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,GAAE,OAAO,CAAC,MAAM,EAAE,MAAM,CAAiB,GACjF,IAAI,CA8BN;AAED,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,OAAO,EAAE,EACjD,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,GAAE,OAAO,CAAC,MAAM,EAAE,MAAM,CAAiB,GAChF,IAAI,CA+BN"}
@@ -1,14 +1,34 @@
1
- import { KeyIsArrayMutatingFunction, KeyIsMapMutatingFunction, KeyIsSetMutatingFunction } from './mutatingFunctions.js';
1
+ import { KeyIsArrayMutatingFunction, KeyIsMapMutatingFunction, KeyIsSetMutatingFunction, arrayMutatingFunctionInsertsFrom } from './mutatingFunctions.js';
2
2
  import { objectTypesToProxy } from './objectTypesToProxy.js';
3
3
  import { markChanged } from './stateTracking.js';
4
+ import { ITERATE, notify, notifyAll, track, untracked } from './signals/tracking.js';
4
5
  export const $original = Symbol('original');
5
6
  export const $ownerName = Symbol('ownerName');
7
+ // The one write path behind every trap: stamp for the props dirty check, wake the effects
8
+ // tracking these keys, and wake the owner -- except a signals component, which is only ever
9
+ // woken through its effect, so a write to a key its content never read does not re-render it.
10
+ function changed(element, target, keys) {
11
+ markChanged(target);
12
+ notify(target, ...keys);
13
+ if (!element.__signals && element.__initialized) element.__stateUpdated();
14
+ }
15
+ // for bulk mutations (splice, sort, clear) where working out the affected keys costs more than waking everyone
16
+ function changedAll(element, target) {
17
+ markChanged(target);
18
+ notifyAll(target);
19
+ if (!element.__signals && element.__initialized) element.__stateUpdated();
20
+ }
21
+ function isIndexOrLength(key) {
22
+ const c = key.charCodeAt(0);
23
+ return c >= 48 && c <= 57 || key === 'length';
24
+ }
6
25
  export const getStateProxyHandler = element => ({
7
26
  get: (obj, key) => {
8
27
  if (key === '__original') return obj; // return the internal object if requested
9
28
  if (key === $original) return obj; // return the internal object if requested
10
29
  // owner?
11
30
  if (key === $ownerName) return element.constructor.name;
31
+ if (typeof key === 'string') track(obj, key);
12
32
  return obj[key]; // Proxy typing allowed accessing keys outside of the type.
13
33
  // So act on that obj as an object that accept all string | symbol keys
14
34
  },
@@ -16,6 +36,7 @@ export const getStateProxyHandler = element => ({
16
36
  //console.log('set in proxied state', key, obj)
17
37
  //set: (obj: State, key: string, value: unknown) => {
18
38
  //const isObject = (typeof value === 'object' && value !== null)
39
+ const added = !Object.prototype.hasOwnProperty.call(obj, key);
19
40
  if (Array.isArray(value)) {
20
41
  // arrays
21
42
  obj[key]
@@ -45,21 +66,24 @@ export const getStateProxyHandler = element => ({
45
66
  }
46
67
  //const varKey = key
47
68
  //this.__reactiveUpdate(varKey)
48
- markChanged(obj); // stamp for the props dirty check
49
- if (element.__initialized) element.__stateUpdated();
69
+ changed(element, obj, added ? [key, ITERATE] : [key]);
50
70
  return true;
51
71
  },
52
72
  deleteProperty: (obj, key) => {
53
73
  if (key in obj) {
54
74
  delete obj[key]; // we know key is in obj
55
- markChanged(obj); // stamp for the props dirty check
56
- if (element.__initialized) element.__stateUpdated();
75
+ changed(element, obj, [key, ITERATE]);
57
76
  }
58
77
  return true;
59
78
  },
60
79
  has(obj, key) {
61
80
  if (key === $original || key === '__original' || key === $ownerName) return true;
81
+ if (typeof key === 'string') track(obj, key);
62
82
  return key in obj;
83
+ },
84
+ ownKeys(obj) {
85
+ track(obj, ITERATE);
86
+ return Reflect.ownKeys(obj);
63
87
  }
64
88
  });
65
89
  // intercept get sna dsets within state objects to proxy child objects and trigger component updates
@@ -69,11 +93,13 @@ const makeStateObjectProxyHandler = element => ({
69
93
  if (key === $original) return obj; // return the internal object if requested
70
94
  // owner?
71
95
  if (key === $ownerName) return element.constructor.name;
96
+ if (typeof key === 'string') track(obj, key);
72
97
  return obj[key]; // Proxy typing allowed accessing keys outside of the type.
73
98
  // So act on that obj as an object that accept all string | symbol keys
74
99
  },
75
100
  set: (obj, key, value) => {
76
101
  //console.log('set in proxied object', key, obj)
102
+ const added = !Object.prototype.hasOwnProperty.call(obj, key);
77
103
  if (Array.isArray(value)) {
78
104
  // arrays
79
105
  obj[key]
@@ -103,21 +129,24 @@ const makeStateObjectProxyHandler = element => ({
103
129
  }
104
130
  //const varKey = key
105
131
  //this.__reactiveUpdate(varKey)
106
- markChanged(obj); // stamp for the props dirty check
107
- if (element.__initialized) element.__stateUpdated();
132
+ changed(element, obj, added ? [key, ITERATE] : [key]);
108
133
  return true;
109
134
  },
110
135
  deleteProperty: (obj, key) => {
111
136
  if (key in obj) {
112
137
  delete obj[key]; // we know key is in obj
113
- markChanged(obj); // stamp for the props dirty check
114
- if (element.__initialized) element.__stateUpdated();
138
+ changed(element, obj, [key, ITERATE]);
115
139
  }
116
140
  return true;
117
141
  },
118
142
  has(obj, key) {
119
143
  if (key === $original || key === '__original' || key === $ownerName) return true;
144
+ if (typeof key === 'string') track(obj, key);
120
145
  return key in obj;
146
+ },
147
+ ownKeys(obj) {
148
+ track(obj, ITERATE);
149
+ return Reflect.ownKeys(obj);
121
150
  }
122
151
  });
123
152
  /**
@@ -143,33 +172,28 @@ const getStateObjectProxyHandlerCached = perElement(makeStateObjectProxyHandler)
143
172
  export const getStateObjectProxyHandler = element => getStateObjectProxyHandlerCached(element); // eslint-disable-line @typescript-eslint/no-unsafe-type-assertion -- the generic only types the trap parameters; the handler itself is identical for every O
144
173
  // intercept calls to array prototype funcs that mutate the array, to trigger an update
145
174
  const makeStateArrayProxyHandler = element => {
175
+ // what an array slot ends up holding: data holders are proxied so later writes inside them are seen
176
+ const proxyValue = value => {
177
+ if (Array.isArray(value)) return proxyArray(value, element);
178
+ if (typeof value === 'object' && value !== null && objectTypesToProxy.includes(value.constructor.name) // ensure that it is an object literal or otherwise an approve object type
179
+ ) return proxyObject(value, element);
180
+ return value;
181
+ };
146
182
  const set = (arr, key, value) => {
147
183
  //console.log('set in proxied array', arr, key)
148
- //if (typeof key === 'string') {
149
- if (Array.isArray(value)) {
150
- // arrays
151
- // @ts-ignore // TS doesn't like us accessing array by string key
152
- arr[key]
153
- //= new Proxy(value, getStateArrayProxyHandler as ProxyHandler<unknown[]>) // if an array was set, proxy it too
154
- = proxyArray(value, element);
155
- } else if (typeof value === 'object' && value !== null
156
- // && value.constructor.name === 'Object'
157
- && objectTypesToProxy.includes(value.constructor.name) // ensure that it is an object literal or otherwise an approve object type
158
- ) {
159
- // plain objects
160
- // @ts-ignore // TS doesn't like us accessing array by string key
161
- arr[key]
162
- //= new Proxy(value, getStateObjectProxyHandler) // if an plan object was set, proxy it too. If an object has a class other than Object, we'll leave it alone
163
- = proxyObject(value, element);
164
- } else {
165
- arr[key] = value; // eslint-disable-line @typescript-eslint/no-unsafe-type-assertion
184
+ if (key === 'length') {
185
+ // truncation drops every index above the new length, so wake everyone
186
+ arr.length = value; // eslint-disable-line @typescript-eslint/no-unsafe-type-assertion
187
+ changedAll(element, arr);
188
+ return true;
166
189
  }
190
+ const appended = typeof key === 'string' && Number(key) >= arr.length;
191
+ arr[key] = proxyValue(value); // eslint-disable-line @typescript-eslint/no-unsafe-type-assertion
167
192
  // reactivity
168
193
  //const varKey = key
169
194
  //warn('__stateArrayProxyHandler set __reactiveUpdate key may overlap between strings and numbers')
170
195
  //this.__reactiveUpdate(String(varKey))
171
- markChanged(arr); // stamp for the props dirty check
172
- if (element.__initialized) element.__stateUpdated();
196
+ changed(element, arr, appended ? [key, 'length'] : [key]);
173
197
  return true;
174
198
  };
175
199
  return {
@@ -192,16 +216,22 @@ const makeStateArrayProxyHandler = element => {
192
216
  };else if (KeyIsArrayMutatingFunction(key)) {
193
217
  //console.log('yeah go')
194
218
  return (...args) => {
195
- arr[key](
219
+ // inserted values become elements, so they need the same proxying as a set
220
+ const insertsFrom = arrayMutatingFunctionInsertsFrom[key];
221
+ if (insertsFrom !== undefined) {
222
+ for (let i = insertsFrom; i < args.length; i++) args[i] = proxyValue(args[i]);
223
+ }
224
+ // the method reads length and indexes itself; those reads must not subscribe anyone
225
+ const result = untracked(() => arr[key](
196
226
  // @ts-ignore -- don't wanna deal with args compatibility
197
- ...args);
198
- // reactivity
199
- //const varKey = key
200
- //this.__reactiveUpdate(varKey)
201
- markChanged(arr); // stamp for the props dirty check
202
- if (element.__initialized) element.__stateUpdated();
227
+ ...args));
228
+ changedAll(element, arr);
229
+ return result;
203
230
  };
204
231
  }
232
+ // iteration (map, for..of, includes) reads length and each index through the proxy,
233
+ // so tracking those is enough; method lookups themselves are not dependencies
234
+ else if (isIndexOrLength(key)) track(arr, key);
205
235
  }
206
236
  // @ts-ignore // TS doesn't like us accessing array by string key
207
237
  return arr[key];
@@ -209,67 +239,71 @@ const makeStateArrayProxyHandler = element => {
209
239
  set,
210
240
  has(arr, key) {
211
241
  if (key === $original || key === '__original' || key === $ownerName) return true;
242
+ if (typeof key === 'string' && isIndexOrLength(key)) track(arr, key);
212
243
  return key in arr;
213
244
  },
214
245
  deleteProperty(arr, key) {
215
246
  //console.log('proxy delete')
216
247
  const res = delete arr[key]; // eslint-disable-line @typescript-eslint/no-unsafe-type-assertion
217
- if (element.__initialized) {
218
- //console.log('proxy delete update')
219
- markChanged(arr); // stamp for the props dirty check
220
- element.__stateUpdated();
221
- }
248
+ changed(element, arr, [key]);
222
249
  return res;
223
250
  }
224
251
  };
225
252
  };
226
253
  export const getStateArrayProxyHandler = perElement(makeStateArrayProxyHandler);
227
254
  // intercept calls to array prototype funcs that mutate the array, to trigger an update
255
+ // Map methods run against the raw target (Map internals reject a proxy receiver), so reads
256
+ // cannot be tracked through traps like an array's; each read method tracks explicitly instead.
228
257
  const makeStateMapProxyHandler = element => ({
229
- get: (map, key) => {
258
+ get: (map, key, receiver) => {
230
259
  //console.log('map get', key)
231
260
  if (key === $original) return map; // return the internal object if requested
232
261
  // owner?
233
262
  if (key === $ownerName) return element.constructor.name;
263
+ if (key === Symbol.iterator) {
264
+ track(map, ITERATE);
265
+ return map[Symbol.iterator].bind(map);
266
+ }
234
267
  if (typeof key === 'string') {
235
268
  if (key === '__original') return map; // return the internal object if requested
236
269
  if (KeyIsMapMutatingFunction(key)) {
237
270
  //console.log('map mutating func called', key, map)
238
271
  if (key === 'set') {
239
272
  // SETTING - should we handle nested objects?
240
- return (...args) => {
241
- //console.log('map set')
242
- map[key](
243
- // @ts-ignore -- don't wanna deal with args compatibility
244
- ...args);
245
- // reactivity
246
- //const varKey = key
247
- //this.__reactiveUpdate(varKey)
248
- markChanged(map); // stamp for the props dirty check
249
- if (element.__initialized) element.__stateUpdated();
273
+ return (k, v) => {
274
+ map.set(k, v);
275
+ changed(element, map, [k, ITERATE]); // ITERATE: forEach/values see the new value
276
+ return receiver; // chaining, as the native method returns the map
277
+ };
278
+ } else if (key === 'delete') {
279
+ return k => {
280
+ const result = map.delete(k);
281
+ changed(element, map, [k, ITERATE]);
282
+ return result;
250
283
  };
251
284
  } else {
252
- return (...args) => {
253
- //console.log('map', key)
254
- map[key](
255
- // @ts-ignore -- don't wanna deal with args compatibility
256
- ...args);
257
- // reactivity
258
- //const varKey = key
259
- //this.__reactiveUpdate(varKey)
260
- markChanged(map); // stamp for the props dirty check
261
- if (element.__initialized) element.__stateUpdated();
285
+ return () => {
286
+ map.clear();
287
+ changedAll(element, map);
262
288
  };
263
289
  }
264
290
  }
291
+ if (key === 'get' || key === 'has') {
292
+ return k => {
293
+ track(map, k);
294
+ return map[key](k);
295
+ };
296
+ }
297
+ if (key === 'size') {
298
+ track(map, ITERATE);
299
+ return map.size;
300
+ }
301
+ if (key === 'forEach' || key === 'keys' || key === 'values' || key === 'entries') track(map, ITERATE);
265
302
  }
266
303
  // @ts-ignore // TS doesn't like us accessing array by string key
267
304
  const v = map[key];
268
305
  if (typeof v === 'function') return v.bind(map);
269
306
  return v;
270
- // if (typeof map[key] === 'function') return map[key].bind(map)
271
- // // @ts-ignore // TS doesn't like us accessing array by string key
272
- // return map[key]
273
307
  },
274
308
  has(map, key) {
275
309
  if (key === $original || key === '__original' || key === $ownerName) return true;
@@ -278,42 +312,52 @@ const makeStateMapProxyHandler = element => ({
278
312
  });
279
313
  export const getStateMapProxyHandler = perElement(makeStateMapProxyHandler);
280
314
  // intercept calls to array prototype funcs that mutate the array, to trigger an update
315
+ // see the Map handler: reads are tracked per method, not per trap
281
316
  const makeStateSetProxyHandler = element => ({
282
- get: (set, key) => {
317
+ get: (set, key, receiver) => {
283
318
  //console.log('arr key', typeof key)
284
319
  if (key === $original) return set; // return the internal object if requested
285
320
  // owner?
286
321
  if (key === $ownerName) return element.constructor.name;
322
+ if (key === Symbol.iterator) {
323
+ track(set, ITERATE);
324
+ return set[Symbol.iterator].bind(set);
325
+ }
287
326
  if (typeof key === 'string') {
288
327
  if (key === '__original') return set; // return the internal object if requested
289
328
  if (KeyIsSetMutatingFunction(key)) {
290
329
  //console.log('set mutating func called', key, set)
291
330
  if (key === 'add') {
292
331
  // ADDING - should we handle nested objects?
293
- return (...args) => {
294
- set[key](
295
- // @ts-ignore -- don't wanna deal with args compatibility
296
- ...args);
297
- // reactivity
298
- //const varKey = key
299
- //this.__reactiveUpdate(varKey)
300
- markChanged(set); // stamp for the props dirty check
301
- if (element.__initialized) element.__stateUpdated();
332
+ return v => {
333
+ set.add(v);
334
+ changed(element, set, [v, ITERATE]);
335
+ return receiver; // chaining, as the native method returns the set
336
+ };
337
+ } else if (key === 'delete') {
338
+ return v => {
339
+ const result = set.delete(v);
340
+ changed(element, set, [v, ITERATE]);
341
+ return result;
302
342
  };
303
343
  } else {
304
- //console.log('set in proxied object', key, set)
305
- return (...args) => {
306
- set[key](
307
- // @ts-ignore -- don't wanna deal with args compatibility
308
- ...args);
309
- // reactivity
310
- //const varKey = key
311
- //this.__reactiveUpdate(varKey)
312
- markChanged(set); // stamp for the props dirty check
313
- if (element.__initialized) element.__stateUpdated();
344
+ return () => {
345
+ set.clear();
346
+ changedAll(element, set);
314
347
  };
315
348
  }
316
349
  }
350
+ if (key === 'has') {
351
+ return v => {
352
+ track(set, v);
353
+ return set.has(v);
354
+ };
355
+ }
356
+ if (key === 'size') {
357
+ track(set, ITERATE);
358
+ return set.size;
359
+ }
360
+ if (key === 'forEach' || key === 'keys' || key === 'values' || key === 'entries') track(set, ITERATE);
317
361
  }
318
362
  // @ts-ignore // TS doesn't like us accessing array by string key
319
363
  const v = set[key];
@@ -326,7 +370,7 @@ const makeStateSetProxyHandler = element => ({
326
370
  }
327
371
  });
328
372
  export const getStateSetProxyHandler = perElement(makeStateSetProxyHandler);
329
- // export function proxyStateContent<O extends object>(element: StatefulComponentAny, object: O) {
373
+ // export function proxyStateContent<O extends object>(element: StateOwner, object: O) {
330
374
  // for (const key in object) {
331
375
  // const value = object[key]
332
376
  // if (typeof value === 'object' && value !== null) { // objects, including array
@@ -1 +1 @@
1
- {"version":3,"file":"hydrate.d.ts","sourceRoot":"","sources":["../../src/hydrate/hydrate.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAQnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAmBxD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAM7C,OAAO,EAAE,yBAAyB,EAAoD,MAAM,mBAAmB,CAAA;AAE/G,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAmBlD,OAAO,EAC4B,KAAK,uBAAuB,EAC9D,MAAM,oCAAoC,CAAA;AAQ3C,OAAO,0BAA0B,CAAA;AASjC,MAAM,MAAM,WAAW,GAAG;IACtB,UAAU,EAAE,OAAO,CAAA;IACnB,UAAU,EAAE,uBAAuB,EAAE,CAAA;IAGrC,WAAW,EAAE,OAAO,CAAA;CACvB,CAAA;AACD,wBAAgB,sBAAsB,IAAI,WAAW,CAEpD;AAID,wBAAsB,OAAO,CACzB,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,yBAAyB,GAAG,IAAI,EAC/C,cAAc,EAAE,cAAc,iBA2DjC;AAyBD,wBAAsB,oBAAoB,CACtC,aAAa,SAAS,yBAAyB,CAAC,GAAG,EAAE,GAAG,CAAC,EAEzD,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,WAAW,EAIjB,KAAK,GAAE,YAAY,CAAC,aAAa,CAAC,CAAC,OAAO,CAAM,EAAE,sJAAsJ;AACxM,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,SAAS,CAAC,EAAE,OAAO,GACpB,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CA6DtC"}
1
+ {"version":3,"file":"hydrate.d.ts","sourceRoot":"","sources":["../../src/hydrate/hydrate.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAQnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAmBxD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAM7C,OAAO,EACH,yBAAyB,EAC5B,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAmBlD,OAAO,EAC4B,KAAK,uBAAuB,EAC9D,MAAM,oCAAoC,CAAA;AAQ3C,OAAO,0BAA0B,CAAA;AASjC,MAAM,MAAM,WAAW,GAAG;IACtB,UAAU,EAAE,OAAO,CAAA;IACnB,UAAU,EAAE,uBAAuB,EAAE,CAAA;IAGrC,WAAW,EAAE,OAAO,CAAA;CACvB,CAAA;AACD,wBAAgB,sBAAsB,IAAI,WAAW,CAEpD;AAID,wBAAsB,OAAO,CACzB,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,yBAAyB,GAAG,IAAI,EAC/C,cAAc,EAAE,cAAc,iBA2DjC;AAyBD,wBAAsB,oBAAoB,CACtC,aAAa,SAAS,yBAAyB,CAAC,GAAG,EAAE,GAAG,CAAC,EAEzD,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,WAAW,EAIjB,KAAK,GAAE,YAAY,CAAC,aAAa,CAAC,CAAC,OAAO,CAAM,EAAE,sJAAsJ;AACxM,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,SAAS,CAAC,EAAE,OAAO,GACpB,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CA6DtC"}
@@ -9,7 +9,7 @@ import { DomRegion } from '../DomRegion.js';
9
9
  import { FunctionElement } from '../FunctionComponentStandIn.js';
10
10
  import { getStyledContentFromFunctionComponent } from '../getStyledContentFromFunctionComponent.js';
11
11
  import { StringIsHtmlEvent, htmlEvents } from '../htmlEvents.js';
12
- import { TungstenStatefulComponent } from "../Components.js";
12
+ import { TungstenStatefulComponent, TungstenSignalsComponent } from "../Components.js";
13
13
  import { TungstenError } from '../TungstenError.js';
14
14
  import { Instance } from '../Instance/Instance.js';
15
15
  import { validChildren } from '../validChildren.js';
@@ -175,6 +175,8 @@ function handleRootTitle(rootElement) {
175
175
  if (typeof rootElement.title === 'function') {
176
176
  if (rootElement instanceof TungstenStatefulComponent) {
177
177
  rootElement.__instance.setDefaultTitle(rootElement.title(rootElement.props, rootElement.state).toString());
178
+ } else if (rootElement instanceof TungstenSignalsComponent) {
179
+ rootElement.__instance.setDefaultTitle(rootElement.title(rootElement.props, rootElement.signals).toString());
178
180
  } else {
179
181
  rootElement.__instance.setDefaultTitle(rootElement.title(rootElement.props, undefined).toString());
180
182
  }
@@ -1,7 +1,7 @@
1
1
  export * from './TungstenAppOld.js';
2
2
  export { TungstenSimpleComponent, TungstenSimpleComponent as SimpleComponent, // static component
3
3
  TungstenStatefulComponent, TungstenStatefulComponent as StatefulComponent, // stateful component
4
- TungstenBaseSimpleStoreComponent, TungstenBaseSimpleStoreComponent as BaseSimpleStoreComponent, TungstenBaseStatefulStoreComponent, TungstenBaseStatefulStoreComponent as BaseStatefulStoreComponent, } from './Components.jsx';
4
+ TungstenSignalsComponent as __TungstenSignalsComponent, TungstenSignalsComponent as __SignalsComponent, TungstenBaseSimpleStoreComponent, TungstenBaseSimpleStoreComponent as BaseSimpleStoreComponent, TungstenBaseStatefulStoreComponent, TungstenBaseStatefulStoreComponent as BaseStatefulStoreComponent, } from './Components.jsx';
5
5
  export * from './alive.js';
6
6
  export * from './appOutput.js';
7
7
  export * from './AssignedStyle.js';
@@ -1 +1 @@
1
- {"version":3,"file":"indexInner.d.ts","sourceRoot":"","sources":["../src/indexInner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"indexInner.d.ts","sourceRoot":"","sources":["../src/indexInner.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ export { TungstenSimpleComponent, TungstenSimpleComponent as SimpleComponent,
4
4
  // static component
5
5
  TungstenStatefulComponent, TungstenStatefulComponent as StatefulComponent,
6
6
  // stateful component
7
+ TungstenSignalsComponent as __TungstenSignalsComponent, TungstenSignalsComponent as __SignalsComponent,
7
8
  //TungstenBaseStoreComponent as TungstenBaseStoreComponent, TungstenBaseStoreComponent as BaseStoreComponent,
8
9
  TungstenBaseSimpleStoreComponent, TungstenBaseSimpleStoreComponent as BaseSimpleStoreComponent, TungstenBaseStatefulStoreComponent, TungstenBaseStatefulStoreComponent as BaseStatefulStoreComponent } from "./Components.js";
9
10
  // other
@@ -1,5 +1,6 @@
1
- export declare const arrayMutatingFunctions: readonly ["push", "pop", "shift", "unshift", "sort", "splice", "reverse"];
1
+ export declare const arrayMutatingFunctions: readonly ["push", "pop", "shift", "unshift", "sort", "splice", "reverse", "fill", "copyWithin"];
2
2
  type ArrayMutatingFunctions = typeof arrayMutatingFunctions[number];
3
+ export declare const arrayMutatingFunctionInsertsFrom: Partial<Record<ArrayMutatingFunctions, number>>;
3
4
  export declare const mapMutatingFunctions: readonly ["set", "delete", "clear"];
4
5
  type MapMutatingFunctions = typeof mapMutatingFunctions[number];
5
6
  export declare const setMutatingFunctions: readonly ["add", "delete", "clear"];
@@ -1 +1 @@
1
- {"version":3,"file":"mutatingFunctions.d.ts","sourceRoot":"","sources":["../src/mutatingFunctions.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,sBAAsB,2EAA4E,CAAA;AAC/G,KAAK,sBAAsB,GAAG,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAA;AAEnE,eAAO,MAAM,oBAAoB,qCAAsC,CAAA;AACvE,KAAK,oBAAoB,GAAG,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAA;AAE/D,eAAO,MAAM,oBAAoB,qCAAsC,CAAA;AACvE,KAAK,oBAAoB,GAAG,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAA;AAE/D,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,IAAI,sBAAsB,CAGrF;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,IAAI,oBAAoB,CAGjF;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,IAAI,oBAAoB,CAGjF"}
1
+ {"version":3,"file":"mutatingFunctions.d.ts","sourceRoot":"","sources":["../src/mutatingFunctions.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,sBAAsB,iGAEzB,CAAA;AACV,KAAK,sBAAsB,GAAG,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAA;AAGnE,eAAO,MAAM,gCAAgC,EAAE,OAAO,CAAC,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAE5F,CAAA;AAED,eAAO,MAAM,oBAAoB,qCAAsC,CAAA;AACvE,KAAK,oBAAoB,GAAG,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAA;AAE/D,eAAO,MAAM,oBAAoB,qCAAsC,CAAA;AACvE,KAAK,oBAAoB,GAAG,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAA;AAE/D,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,IAAI,sBAAsB,CAGrF;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,IAAI,oBAAoB,CAGjF;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,IAAI,oBAAoB,CAGjF"}
@@ -1,4 +1,10 @@
1
- export const arrayMutatingFunctions = ['push', 'pop', 'shift', 'unshift', 'sort', 'splice', 'reverse'];
1
+ export const arrayMutatingFunctions = ['push', 'pop', 'shift', 'unshift', 'sort', 'splice', 'reverse', 'fill', 'copyWithin'];
2
+ // index of the first argument that becomes an element, for the mutators that insert values
3
+ export const arrayMutatingFunctionInsertsFrom = {
4
+ unshift: 0,
5
+ splice: 2,
6
+ fill: 0
7
+ };
2
8
  export const mapMutatingFunctions = ['set', 'delete', 'clear'];
3
9
  export const setMutatingFunctions = ['add', 'delete', 'clear'];
4
10
  export function KeyIsArrayMutatingFunction(key) {
@@ -1 +1 @@
1
- {"version":3,"file":"processHead.d.ts","sourceRoot":"","sources":["../../src/render/processHead.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAK7C,OAAO,EAAE,oBAAoB,EAAqB,MAAM,qBAAqB,CAAA;AAS7E,wBAAgB,WAAW,CACvB,QAAQ,EAAE,oBAAoB,EAC9B,QAAQ,EAAE,QAAQ,QA0NrB"}
1
+ {"version":3,"file":"processHead.d.ts","sourceRoot":"","sources":["../../src/render/processHead.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAK7C,OAAO,EAAE,oBAAoB,EAAqB,MAAM,qBAAqB,CAAA;AAQ7E,wBAAgB,WAAW,CACvB,QAAQ,EAAE,oBAAoB,EAC9B,QAAQ,EAAE,QAAQ,QA6IrB"}
@@ -3,7 +3,6 @@ import { clientFolder, componentCssFolder, componentCssFile } from '../settings.
3
3
  import { addImportMap } from './addImportMap.js';
4
4
  import { $props, $type } from '../contentNodeSymbols.js';
5
5
  import { windowGlobalEnvStatement } from 'tungsten/env/windowGlobalEnvStatement.js';
6
- import { frameworkDestLocation } from '../build/frameworkDestLocation.js';
7
6
  import { devErrorPageClearRetryScript } from '../Servers/devErrorPageAutoRetry.js';
8
7
  // process the tree returned by the root component
9
8
  // doing things like ensuring there is are html and head elements,
@@ -87,44 +86,16 @@ export function processHead(headNode, headData) {
87
86
  }
88
87
  };
89
88
  headNode[$props].children.unshift(clearErrorRetryScriptNode);
90
- // Auto-reload / HMR. This has to stay a raw inline script rather than a real imported
91
- // module: it fetches whichever file just recompiled via a computed, cache-busted
92
- // import() call, and any dynamic import() with a non-literal argument anywhere in the
93
- // framework's traced dependency graph makes the package-copying step that serves
94
- // framework code to the browser throw (it requires every import specifier to be
95
- // statically known so it can be rewritten/copied). Keeping this logic as untraced text
96
- // sidesteps that. applyHmrModule.js itself has no dynamic imports, so it's safely
97
- // reachable via a normal static import elsewhere (see hydrate.tsx) and gets copied
98
- // there, then loaded here by computed URL. See tungsten/docs/hmr.md.
99
- // Tier 1 (hmr: 'reload', or nothing left for Tier 2 to do): always full-reload. A
100
- // simple, independent branch from Tier 2's logic - restored as an explicit config value
101
- // so it's available as a one-line escape hatch if Tier 2 itself is misbehaving.
102
- // The server sends its bootId as the first event on every connection (see
103
- // handleLiveReloadStream). If sessionStorage already holds a different one, this
104
- // connection is a reconnect to a process that restarted since the page loaded (e.g. via
105
- // tungsten devmon on a framework rebuild) - EventSource retries silently on its own, so
106
- // this is the only reliable signal that the page is now stale and needs reloading.
107
- const bootIdReloadSnippet = `es.addEventListener('boot',function(ev){` + `var bootId=JSON.parse(ev.data).bootId;` + `var key='__tungsten_boot_id__';` + `var prev=sessionStorage.getItem(key);` + `sessionStorage.setItem(key,bootId);` + `if(prev!==null&&prev!==bootId){location.reload()}` + `});`;
108
- const tier1OnlyScript = `(function(){` + `var es=new EventSource('${siteBasePath}/__tungsten_live_reload__');` + bootIdReloadSnippet + `es.addEventListener('css',function(){location.reload()});` + `es.addEventListener('js',function(){location.reload()});` + `})();`;
109
- // Tier 2: attempt an in-place component/CSS hot-swap before falling back to a full
110
- // reload. See tungsten/docs/hmr.md.
111
- const tier2Script = `(function(){` + `var es=new EventSource('${siteBasePath}/__tungsten_live_reload__');` + `function fullReload(reason){console.info('[tungsten-hmr] full reload:',reason);location.reload()}` + `es.addEventListener('boot',function(ev){` + `var bootId=JSON.parse(ev.data).bootId;` + `var key='__tungsten_boot_id__';` + `var prev=sessionStorage.getItem(key);` + `sessionStorage.setItem(key,bootId);` + `if(prev!==null&&prev!==bootId){fullReload('dev server restarted')}` + `});` + `function loadHmr(){return import('${frameworkDestLocation}/hmr/applyHmrModule.js')}`
112
- // CSS has no state to preserve, so re-applying it is always safe: refreshStylesheets()
113
- // inserts the new link and only removes the old one once it's loaded, so there's no
114
- // gap where nothing is applied (a plain href swap can produce a visible flash).
115
- + `es.addEventListener('css',function(){` + `console.info('[tungsten-hmr] css change, refreshing stylesheets');` + `loadHmr().then(function(hmr){return Promise.all(hmr.refreshStylesheets())})` + `.catch(function(e){console.error('[tungsten-hmr] stylesheet refresh failed',e)});` + `});` + `es.addEventListener('js',function(ev){` + `var payload;` + `try{payload=JSON.parse(ev.data)}catch(e){fullReload('bad payload');return}` + `var files=(payload&&payload.files)||[];` + `if(files.length===0){fullReload('no files in payload');return}` + `console.info('[tungsten-hmr] fetching',files);` + `loadHmr().then(function(hmr){`
116
- // a component's own inline style block piggybacks on this same JS pipeline (it
117
- // lives in the .tsx/.jsx source, not a separate .css file), so refresh stylesheets
118
- // here too rather than only on a dedicated 'css' event - independently of the
119
- // component swap below, so a stylesheet load error doesn't force a full reload.
120
- + `Promise.all(hmr.refreshStylesheets())` + `.catch(function(e){console.error('[tungsten-hmr] stylesheet refresh failed',e)});` + `return Promise.all(files.map(function(f){return import(f+'?t='+Date.now())}))` + `.then(function(modules){` + `return Promise.all(modules.map(function(m,i){return hmr.applyHmrModule(m,files[i])}))` + `})` + `})` + `.then(function(results){` + `console.info('[tungsten-hmr] results',results);` + `if(results.some(function(r){return r&&r.orphaned})){fullReload('a component export was renamed or removed');return}` + `if(!results.some(function(r){return r&&r.matched}))fullReload('no matching live component found')` + `})` + `.catch(function(e){console.error('[tungsten-hmr] swap failed',e);fullReload('error during swap')});` + `});` + `})();`;
121
- // hmr === false: no live-reload script at all (auto-refresh fully disabled).
89
+ // Live reload / HMR: real modules in _client, copied untraced into .client by
90
+ // createClientFiles (see the note atop _client/hmr.ts). hmr === true runs Tier 2 (hmr.js),
91
+ // 'reload' the always-full-reload Tier 1 (liveReload.js), false injects nothing.
122
92
  if (hmr !== false) {
123
93
  const liveReloadScriptNode = {
124
94
  [$type]: 'script',
125
95
  [$props]: {
126
96
  'data--t-internal': undefined,
127
- children: hmr === true ? tier2Script : tier1OnlyScript
97
+ type: 'module',
98
+ src: `${siteBasePath}/${clientFolder}/${hmr === true ? 'hmr.js' : 'liveReload.js'}`
128
99
  }
129
100
  };
130
101
  headNode[$props].children.unshift(liveReloadScriptNode);