browser-runtime-solid 0.0.7 → 0.0.9

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/README.md CHANGED
@@ -26,10 +26,10 @@ One standalone HTML page can import just the generic engine and aggregator using
26
26
 
27
27
  ```html
28
28
  <script src="https://raw.esm.sh/esmesm@0.0.3/bootstrap.js"
29
- data-map="browser-module-runtime@0.0.3; browser-module-frameworks@0.0.2"></script>
29
+ data-map="browser-module-runtime@0.0.9; browser-module-frameworks@0.0.9"></script>
30
30
  ```
31
31
 
32
- The rest is controlled per runtime by `solid({version,...})`. See `examples/02-solid.html` in the workspace; before npm publication of this release candidate open `/examples/06-solid-versioning.html?local=1` through `bun run dev`.
32
+ The rest is controlled per runtime by `solid({version,...})`. See `examples/02-solid.html` in the workspace; before npm publication of this release candidate run the local workspace with `npm run dev`.
33
33
 
34
34
  ## Host-managed imports (backward-compatible)
35
35
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "browser-runtime-solid",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -25,7 +25,7 @@
25
25
  "node": ">=20"
26
26
  },
27
27
  "peerDependencies": {
28
- "browser-module-runtime": "0.0.7",
28
+ "browser-module-runtime": "0.0.9",
29
29
  "solid-tag": "0.0.3",
30
30
  "@solidjs/web": "*"
31
31
  },
package/src/index.js CHANGED
@@ -1,3 +1,22 @@
1
+ function snapshotProps(next){
2
+ if(next===null||typeof next!=="object"||Array.isArray(next)||
3
+ (Object.getPrototypeOf(next)!==Object.prototype&&Object.getPrototypeOf(next)!==null))
4
+ throw new TypeError('updateProps expects a plain object of next props');
5
+ // Preserve property identity, without mutating the caller's object.
6
+ return {...next};
7
+ }
8
+ function reactiveProps(read){
9
+ // Keep native Solid signal tracking at every property read. No eager spread.
10
+ return new Proxy(Object.create(null),{
11
+ get(_target,key){return read()[key];},
12
+ has(_target,key){return Object.hasOwn(read(),key);},
13
+ ownKeys(){return Reflect.ownKeys(read());},
14
+ getOwnPropertyDescriptor(_target,key){
15
+ if(!Object.hasOwn(read(),key))return undefined;
16
+ return {configurable:true,enumerable:true,get(){return read()[key];}};
17
+ }
18
+ });
19
+ }
1
20
  import {createSolidFamilyRules,selectSolidMode} from './version-family.js';
2
21
  import {ensureSolidDelegation} from './delegation.js';
3
22
  export {SolidVersionError,selectSolidMode,createSolidFamilyRules,solidPackageUrl,SOLID_PACKAGES,TESTED_SOLID_VERSION} from './version-family.js';
@@ -16,8 +35,9 @@ export function solid({compiler,render,web,modules={},version,source='auto',prov
16
35
  let renderFunction=render;
17
36
  let webNamespace=web;
18
37
  let ownerRuntime;
38
+ let solidNamespace;
19
39
  return {
20
- name:'solid',version:'0.0.7',frameworkVersion:selection.version,source:selection.mode,
40
+ name:'solid',version:'0.0.9',frameworkVersion:selection.version,source:selection.mode,
21
41
  cacheKey:JSON.stringify({solidMode:selection.mode,solidVersion:selection.version??null,tagVersion:selection.tagVersion??null,transformOptions}),
22
42
  ...(selection.mode==='pinned'?{
23
43
  packageFamilyRules:createSolidFamilyRules(selection.version),
@@ -46,8 +66,26 @@ export function solid({compiler,render,web,modules={},version,source='auto',prov
46
66
  }
47
67
  if(typeof renderFunction!=='function')throw new TypeError('@solidjs/web renderer requires render().');
48
68
  if(webNamespace)ensureSolidDelegation(webNamespace,target.ownerDocument||globalThis.document,delegatedEvents);
49
- const dispose=renderFunction(()=>component(props),target);
50
- return {dispose};
69
+ // The Solid family must be the SAME runtime family as the compiled component.
70
+ // Import through the owning module runtime, never a second global Solid copy.
71
+ solidNamespace ||= await (ownerRuntime ? ownerRuntime.import('solid-js') : import('solid-js'));
72
+ if(typeof solidNamespace.createSignal!=='function')throw new TypeError('Solid renderer requires createSignal() from its runtime family');
73
+ let setSnapshot;
74
+ const dispose=renderFunction(()=>{
75
+ const [snapshot,set]=solidNamespace.createSignal(snapshotProps(props));
76
+ setSnapshot=set;
77
+ return component(reactiveProps(snapshot));
78
+ },target);
79
+ let closed=false;
80
+ return {
81
+ updateProps(next){
82
+ if(closed)throw new Error('Solid mount has been disposed');
83
+ const value=snapshotProps(next);
84
+ if(typeof setSnapshot!=='function')throw new Error('Solid render() did not initialize the props bridge');
85
+ setSnapshot(()=>value);
86
+ },
87
+ dispose(){if(!closed){closed=true;return dispose?.();}}
88
+ };
51
89
  }
52
90
  }]
53
91
  };