browser-runtime-svelte 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
@@ -5,7 +5,7 @@ Svelte 5 compiler and renderer plugin for [`browser-module-runtime`](https://www
5
5
  ## Install
6
6
 
7
7
  ```sh
8
- npm install browser-module-runtime@0.0.1 browser-runtime-svelte@0.0.1 svelte@5
8
+ npm install browser-module-runtime@0.0.9 browser-runtime-svelte@0.0.9 svelte@5
9
9
  ```
10
10
 
11
11
  ## Usage
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "browser-runtime-svelte",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -22,7 +22,7 @@
22
22
  "node": ">=20"
23
23
  },
24
24
  "peerDependencies": {
25
- "browser-module-runtime": "0.0.7",
25
+ "browser-module-runtime": "0.0.9",
26
26
  "svelte": "^5.0.0"
27
27
  },
28
28
  "description": "Svelte compiler and renderer adapter for browser-module-runtime.",
package/src/index.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import type {RuntimePlugin} from 'browser-module-runtime';
2
2
  export interface SvelteAdapterOptions {
3
3
  compiler?: {compile(source:string,options?:Record<string,unknown>):unknown;compileModule?(source:string,options?:Record<string,unknown>):unknown};
4
- renderer?: {mount(component:unknown,options:{target:Element;props:Record<string,unknown>}):unknown;unmount(instance:unknown):unknown};
4
+ reactivity?: {SvelteMap:new (entries?:Iterable<readonly [string,unknown]>)=>Map<string,unknown>};
5
+ renderer?: {tick?():Promise<void>;mount(component:unknown,options:{target:Element;props:Record<string,unknown>}):unknown;unmount(instance:unknown):unknown};
5
6
  version?:string;provider?:string;compileOptions?:Record<string,unknown>;
6
7
  }
7
8
  export declare function svelte(options?:SvelteAdapterOptions):RuntimePlugin;
package/src/index.js CHANGED
@@ -1,10 +1,17 @@
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
+ return {...next};
6
+ }
1
7
  import {normalizeInlineSvelte} from './inline-source.js';
2
8
  export {normalizeInlineSvelte} from './inline-source.js';
3
9
 
4
10
  /** Uses the official Svelte 5 compiler API and mount/unmount runtime. */
5
- export function svelte({compiler,renderer,version='5',provider='esm.sh',compileOptions={}}={}) {
11
+ export function svelte({compiler,renderer,reactivity,version='5',provider='esm.sh',compileOptions={}}={}) {
6
12
  let c=compiler;
7
13
  let runtime=renderer;
14
+ let reactiveNamespace=reactivity;
8
15
  let ownerRuntime;
9
16
  const packageEntries=/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/.test(String(version))
10
17
  ? {svelte:{provider,version:String(version)}} : {};
@@ -27,8 +34,31 @@ export function svelte({compiler,renderer,version='5',provider='esm.sh',compileO
27
34
  name:'svelte',types:['svelte','svelte-module'],
28
35
  async mount({component,target,props}){
29
36
  runtime ||= await (ownerRuntime ? ownerRuntime.import('svelte') : import('svelte'));
30
- const instance=runtime.mount(component,{target,props});
31
- return {dispose:()=>runtime.unmount(instance)};
37
+ reactiveNamespace ||= await (ownerRuntime ? ownerRuntime.import('svelte/reactivity') : import('svelte/reactivity'));
38
+ const MapType=reactiveNamespace.SvelteMap;
39
+ if(typeof MapType!=='function')throw new TypeError('Svelte 5 renderer requires SvelteMap from svelte/reactivity');
40
+ const data=new MapType(Object.entries(snapshotProps(props)));
41
+ const state=new Proxy(Object.create(null),{
42
+ get(_target,key){return data.get(key);},
43
+ has(_target,key){return data.has(key);},
44
+ ownKeys(){return [...data.keys()];},
45
+ getOwnPropertyDescriptor(_target,key){
46
+ if(!data.has(key))return undefined;
47
+ return {configurable:true,enumerable:true,get(){return data.get(key);}};
48
+ }
49
+ });
50
+ const instance=runtime.mount(component,{target,props:state});
51
+ let closed=false;
52
+ return {
53
+ async updateProps(next){
54
+ if(closed)throw new Error('Svelte mount has been disposed');
55
+ const incoming=snapshotProps(next);
56
+ for(const key of [...data.keys()])if(!Object.hasOwn(incoming,key))data.delete(key);
57
+ for(const [key,value] of Object.entries(incoming))data.set(key,value);
58
+ await runtime.tick?.();
59
+ },
60
+ dispose(){if(!closed){closed=true;return runtime.unmount(instance);}}
61
+ };
32
62
  }
33
63
  }]
34
64
  };