renku 0.0.2 → 0.0.3

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 (36) hide show
  1. package/README.md +21 -0
  2. package/dist/bash-complete.js +1 -1
  3. package/dist/bun.d.ts +2 -2
  4. package/dist/bun.js +1 -1
  5. package/dist/cli.js +1 -1
  6. package/dist/client.d.ts +1 -6
  7. package/dist/client.js +1 -1
  8. package/dist/cloudflare-Dfzl7gGy.js +2 -0
  9. package/dist/cloudflare.d.ts +3 -3
  10. package/dist/cloudflare.js +1 -1
  11. package/dist/cloudflare.worker.d.ts +3 -3
  12. package/dist/cloudflare.worker.js +1 -1
  13. package/dist/{context-BHCMRbxt.js → context-Dt3VbTFK.js} +1 -1
  14. package/dist/data.d.ts +2 -2
  15. package/dist/data.js +1 -1
  16. package/dist/dom.d.ts +2 -2
  17. package/dist/dom.js +1 -1
  18. package/dist/{fragment-BZKaFASk.d.ts → fragment-CpqsWP0m.d.ts} +1 -1
  19. package/dist/{index-SdO7aHUm.d.ts → index-BpyLKbnR.d.ts} +1 -2
  20. package/dist/index.d.ts +18 -7
  21. package/dist/index.js +1 -1
  22. package/dist/jsx-dev-runtime.d.ts +2 -2
  23. package/dist/jsx-runtime.d.ts +2 -2
  24. package/dist/{rsc-from-markup-lvVZNq4O.js → rsc-from-markup-SQg4fJ0z.js} +2 -2
  25. package/dist/server.d.ts +2 -2
  26. package/dist/{types-BzglvZrW.d.ts → types-DA3_gaOB.d.ts} +5 -0
  27. package/dist/{types-BPhJNjPW.d.ts → types-DazdXa4I.d.ts} +1 -1
  28. package/dist/{types-DwyPVMcM.d.ts → types-J6ZDxAIC.d.ts} +3 -1
  29. package/dist/ui.d.ts +4 -25
  30. package/dist/ui.js +1 -1
  31. package/dist/update-dom-node-DnDA0pqF.js +1 -0
  32. package/package.json +19 -9
  33. package/dist/cloudflare-CKedebLt.js +0 -2
  34. package/dist/render-dom-node-BzR5XI1t.js +0 -1
  35. package/dist/signal-CqB2Ey1W.d.ts +0 -2
  36. /package/dist/{register-server-function-BuqMxh0V.d.ts → register-server-function-DoOVejlg.d.ts} +0 -0
package/README.md CHANGED
@@ -1 +1,22 @@
1
1
  # Renku
2
+
3
+ ## Getting started
4
+
5
+ ```sh
6
+ bun create github.com/renkudev/template-bun
7
+ ```
8
+
9
+ ```sh
10
+ bun create github.com/renkudev/template-vite
11
+ ```
12
+
13
+ ## CSS Classes
14
+
15
+ Renku uses the `class` prop to apply CSS classes to its components (as opposed to `className` in React). Using `className` will still work though. The prop accespts either a string or an array of strings.
16
+
17
+ ```ts
18
+ <ul>
19
+ <li><a href="/about" class={["link", "active"]}>About</a></li>
20
+ <li><a href="/contact" class="link">Contact</a></li>
21
+ </ul>
22
+ ```
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env bun
2
- import{i as e,n as t,t as n}from"./context-BHCMRbxt.js";const r=process.argv.slice(3);process.env.COMP_LINE?.endsWith(` `)&&r.push(``),await e(t,r,n(process));try{for(let{completion:i}of await e(t,r,n(process)))process.stdout.write(`${i}\n`)}catch{}
2
+ import{i as e,n as t,t as n}from"./context-Dt3VbTFK.js";const r=process.argv.slice(3);process.env.COMP_LINE?.endsWith(` `)&&r.push(``),await e(t,r,n(process));try{for(let{completion:i}of await e(t,r,n(process)))process.stdout.write(`${i}\n`)}catch{}
package/dist/bun.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import "./types-BStlw_FH.js";
2
- import "./types-BzglvZrW.js";
3
- import { n as PathToParams, t as AugmentedRequest } from "./types-BPhJNjPW.js";
2
+ import "./types-DA3_gaOB.js";
3
+ import { n as PathToParams, t as AugmentedRequest } from "./types-DazdXa4I.js";
4
4
  import { RouteMetadata } from "bun:app";
5
5
  import { BunPlugin, Serve } from "bun";
6
6
 
package/dist/bun.js CHANGED
@@ -1 +1 @@
1
- import{n as e,r as t,t as n}from"./rsc-from-markup-lvVZNq4O.js";import"./virtual-from-jsx-BgQUXZ4d.js";import"./signal-store-0zk-69gB.js";import"./effect-hmzj-Jig.js";const r=async(r,i)=>{let{styles:a,modules:o,pageModule:s,layouts:c}=i,l=s.default();for(let e of c)l=e.default({children:[l],_renku:{styles:a,modules:o}});let u=e(l);if(r.headers.get(`Accept`)===`text/x-component`){let e=n(u);return new Response(e,{headers:{"Content-Type":`text/x-component`}})}let d=t(u);return new Response(d,{headers:{"Content-Type":`text/html`}})},i=({routes:e,bake:t,plugins:n})=>t?{app:{framework:{fileSystemRouterTypes:[{root:`./pages`,serverEntryPoint:`renku/bun`,clientEntryPoint:`renku/client`,style:`nextjs-pages`,layouts:!0,extensions:[`ts`,`tsx`,`mdx`]}],serverComponents:{separateSSRGraph:!1,serverRuntimeImportSource:`renku/server`},plugins:n}},fetch:()=>new Response}:{routes:e,development:!0};export{r as render,i as renku};
1
+ import{n as e,r as t,t as n}from"./rsc-from-markup-SQg4fJ0z.js";import"./virtual-from-jsx-BgQUXZ4d.js";import"./signal-store-0zk-69gB.js";import"./effect-hmzj-Jig.js";const r=async(r,i)=>{let{styles:a,modules:o,pageModule:s,layouts:c}=i,l=s.default();for(let e of c)l=e.default({children:[l],_renku:{styles:a,modules:o}});let u=e(l);if(r.headers.get(`Accept`)===`text/x-component`){let e=n(u);return new Response(e,{headers:{"Content-Type":`text/x-component`}})}let d=t(u);return new Response(d,{headers:{"Content-Type":`text/html`}})},i=({routes:e,bake:t,plugins:n})=>t?{app:{framework:{fileSystemRouterTypes:[{root:`./pages`,serverEntryPoint:`renku/bun`,clientEntryPoint:`renku/client`,style:`nextjs-pages`,layouts:!0,extensions:[`ts`,`tsx`,`mdx`]}],serverComponents:{separateSSRGraph:!1,serverRuntimeImportSource:`renku/server`},plugins:n}},fetch:()=>new Response}:{routes:e,development:!0};export{r as render,i as renku};
package/dist/cli.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env bun
2
- import{n as e,r as t,t as n}from"./context-BHCMRbxt.js";await t(e,process.argv.slice(2),n(process));
2
+ import{n as e,r as t,t as n}from"./context-Dt3VbTFK.js";await t(e,process.argv.slice(2),n(process));
package/dist/client.d.ts CHANGED
@@ -1,6 +1 @@
1
- //#region src/client/embedded-rsc.d.ts
2
- declare global {
3
- interface Window {
4
- __RSC: string[];
5
- }
6
- }
1
+ export { };
package/dist/client.js CHANGED
@@ -1 +1 @@
1
- import{n as e}from"./virtual-from-jsx-BgQUXZ4d.js";import"./signal-store-0zk-69gB.js";import"./effect-hmzj-Jig.js";import{n as t,t as n}from"./render-dom-node-BzR5XI1t.js";const r=(i,a)=>{if(a?.type===`element`&&a.value.toLowerCase()===i.tagName.toLowerCase()){a.domNode=i;for(let[o,s]of a.children.entries()){let c=i.childNodes[o];if(c)if(s?.type===`element`)c instanceof HTMLElement&&r(c,s);else if(s?.type===`text`){if(c.textContent===s.value)s.domNode=c;else if(c.nodeType===Node.TEXT_NODE){let e=``;for(let t of a.children)if(t?.type===`text`)e+=t.value;else if(t?.type===`signal`)e+=String(t.value.get());else if(t?.type===`element`)break;c.textContent===e&&(s.domNode=c)}}else s?.type===`signal`?c.textContent===String(s.value.get())&&(s.domNode=c):s?.type===`async`?c.nodeType===Node.COMMENT_NODE&&(s.domNode=c):s?.type===`client`&&c.nodeType===Node.COMMENT_NODE&&(s.domNode=c,import(s.path).then(r=>{let i=e({fn:r[s.name],key:s.key,props:s.props,asyncComponents:[],clientComponents:[]});Array.isArray(i)?t({domNode:c,virtualNode:i,replace:!0}):n({domNode:c,virtualNode:i,replace:!0})}))}}},i=e=>Array.isArray(e)&&e[0]===`E`,a=e=>Array.isArray(e)&&e[0]===`A`,o=e=>Array.isArray(e)&&e[0]===`C`,s=e=>{if(i(e)){let t=[],{children:n,...r}=e[3];if(n)for(let e of n)t.push(s(e));return{type:`element`,value:e[1],key:e[2],props:r,children:t}}return a(e)?{type:`async`,key:e[1],index:e[2]}:o(e)?{type:`client`,key:e[1],path:e[2],name:e[3],props:e[4]}:typeof e==`string`||typeof e==`number`?{type:`text`,value:String(e)}:null};window.__RSC||=[];for(let e of window.__RSC)try{let t=JSON.parse(e);if(i(t)){let e=s(t);r(document.documentElement,e)}else console.warn(`Unhandled: Not RSC Element`)}catch(e){console.error(`Failed to parse RSC chunk:`,e)}window.__RSC.push=e=>(console.log(`streamed rsc line`,e),window.__RSC.length),console.log(`👋 Hello from the Renku client script`);
1
+ import{n as e}from"./virtual-from-jsx-BgQUXZ4d.js";import"./signal-store-0zk-69gB.js";import"./effect-hmzj-Jig.js";import{n as t,r as n,t as r}from"./update-dom-node-DnDA0pqF.js";const i=e=>Array.isArray(e)&&e[0]===`A`,a=e=>Array.isArray(e)&&e[0]===`C`,o=e=>Array.isArray(e)&&e[0]===`E`,s=e=>{if(o(e)){let t=[],{children:n,...r}=e[3];if(n)for(let e of n)t.push(s(e));return{type:`element`,value:e[1],key:e[2],props:r,children:t}}return i(e)?{type:`async`,key:e[1],index:e[2]}:a(e)?{type:`client`,key:e[1],path:e[2],name:e[3],props:e[4]}:typeof e==`string`||typeof e==`number`?{type:`text`,value:String(e)}:null},c={virtualNode:void 0},l=async e=>{let t=await fetch(e.pathname,{headers:{Accept:`text/x-component`}});if(t.body&&c.virtualNode){let e=s(await t.json());r({domNode:document.documentElement,oldVirtualNode:c.virtualNode,newVirtualNode:e}),c.virtualNode=e;return}console.error(`No body`)},u=e=>!e.canIntercept||e.hashChange||!!e.downloadRequest||!!e.formData,d=()=>{window.navigation.addEventListener(`navigate`,e=>{if(u(e))return;let t=new URL(e.destination.url);e.intercept({async handler(){await l(t)}})})},f=(r,i)=>{if(i?.type===`element`&&i.value.toLowerCase()===r.tagName.toLowerCase()){i.domNode=r;for(let[a,o]of i.children.entries()){let s=r.childNodes[a];if(s)if(o?.type===`element`)s instanceof HTMLElement&&f(s,o);else if(o?.type===`text`){if(s.textContent===o.value)o.domNode=s;else if(s.nodeType===Node.TEXT_NODE){let e=``;for(let t of i.children)if(t?.type===`text`)e+=t.value;else if(t?.type===`signal`)e+=String(t.value.get());else if(t?.type===`element`)break;s.textContent===e&&(o.domNode=s)}}else o?.type===`signal`?s.textContent===String(o.value.get())&&(o.domNode=s):o?.type===`async`?s.nodeType===Node.COMMENT_NODE&&(o.domNode=s):o?.type===`client`&&s.nodeType===Node.COMMENT_NODE&&(o.domNode=s,import(o.path).then(r=>{let i=e({fn:r[o.name],key:o.key,props:o.props,asyncComponents:[],clientComponents:[]});Array.isArray(i)?n({domNode:s,virtualNode:i,replace:!0}):t({domNode:s,virtualNode:i,replace:!0})}))}}},p=e=>{try{let t=JSON.parse(e);if(o(t)){let e=s(t);f(document.documentElement,e),c.virtualNode=e}else console.warn(`Unhandled: Not RSC Element`)}catch(e){console.error(`Failed to parse RSC chunk:`,e)}};d(),window.__RSC||=[];for(let e of window.__RSC)p(e);window.__RSC.push=e=>(console.log(`streamed rsc line`,e),window.__RSC.length);
@@ -0,0 +1,2 @@
1
+ import{n as e,r as t,t as n}from"./auth-DivcgvqR.js";import{n as r,r as i,t as a}from"./rsc-from-markup-SQg4fJ0z.js";import{t as o}from"./get-route-B1JNCPoL.js";import{newWorkersRpcResponse as s}from"capnweb";import{clientEntry as c}from"virtual:renku";const l=({namespace:e,name:t,ws:n})=>async(r,i)=>{if(console.log(`🔥`,`DO handler`,typeof t),n){let e=r.headers.get(`Upgrade`);if(!e||e!==`websocket`)return new Response(`Durable Object expected Upgrade: websocket`,{status:426})}if(typeof t==`function`){let e=r.clone();t=await t(e)}return i[e].getByName(t).fetch(r)},u=({rpName:e,sessionExpiryInMinutes:t})=>{t??=60;let r=e=>e*60*1e3;return{"/validate-session":{GET:async(e,t,r)=>n().sessionId?Response.json({isAuthenticated:!0}):Response.json({isAuthenticated:!1})},"/logout":{POST:async(e,t,i)=>{let a=n();a.sessionId&&await t.AUTH_DO.getByName(`session:${a.sessionId}`).logout();let o=new Date(Date.now()-r(10)).toUTCString();return new Response(null,{headers:{"Set-Cookie":`sessionId=; Path=/; SameSite=Strict; Secure; Expires=${o}`}})},GET:async(e,t,i)=>{let a=n();a.sessionId&&await t.AUTH_DO.getByName(`session:${a.sessionId}`).logout();let o=new Date(Date.now()-r(10)).toUTCString();return new Response(null,{status:302,headers:{Location:`/`,"Set-Cookie":`sessionId=; Path=/; SameSite=Strict; Secure; Expires=${o}`}})}},"/creation-options":{POST:async(t,n,r)=>{let{email:i}=await t.json(),a=crypto.randomUUID(),o=n.AUTH_DO.getByName(`user:${a}`),s=new URL(t.url).hostname,c=await o.creationOptions({id:a,email:i,rpId:s,rpName:e});return Response.json(c)}},"/validate-creation":{POST:async(e,t,n)=>{let{name:r,credential:i}=await e.json();return await t.AUTH_DO.getByName(`user:${r}`).validateCreation({name:r,credential:i}),Response.json({ok:!0})}},"/request-options":{POST:async(e,t,n)=>{let r=new URL(e.url).hostname,i=crypto.randomUUID(),a=await t.AUTH_DO.getByName(`challenge:${i}`).requestOptions({rpId:r});return Response.json({id:i,options:a})}},"/validate-request":{POST:async(e,n,i)=>{let{id:a,credential:o}=await e.json(),s=await n.AUTH_DO.getByName(`challenge:${a}`).validateRequest({credential:o,sessionExpiryInMinutes:t});if(s){let e=new Date(Date.now()+r(t)).toUTCString();return Response.json({success:!0},{headers:{"Set-Cookie":`sessionId=${s}; Path=/; SameSite=Strict; Secure; Expires=${e}`}})}return Response.json({error:!0})}}}},d=e=>{let t={};if(!e)return t;let n=e.split(`;`);for(let e of n){let n=e.indexOf(`=`);if(n===-1)continue;let r=e.slice(0,n).trim(),i=e.slice(n+1).trim();r&&(t[r]=i)}return t},f=async({request:t,env:n,authFn:r})=>{let i=e(),a=d(t.headers.get(`cookie`));if(`sessionId`in a&&a.sessionId){if(i.sessionId=a.sessionId,n?.AUTH_DO){let e=await n.AUTH_DO.getByName(`session:${i.sessionId}`).validateSession({sessionExpiryInMinutes:1440});e&&(i.userId=e.userId)}}else i.sessionId=null;return r?r({request:t,authContext:i}):!0},p=new TextEncoder,m=e=>{let t=e[Symbol.asyncIterator]();return new ReadableStream({async pull(e){let{value:n,done:r}=await t.next();if(r)e.close();else{let t=typeof n==`object`?JSON.stringify(n).concat(`
2
+ `):n;e.enqueue(p.encode(t))}}})},h=[`favicon.ico`,`.well-known`],g=({routes:e})=>async(n,l,u)=>t(async()=>{let t=new URL(n.url).pathname.split(`/`),d=t[1];if(d&&h.includes(d))return new Response(null,{status:404});let p=o({request:n,routes:e}),g=await f({request:n,env:l,authFn:p?p.auth:null});if(g!==!0)return g||new Response(null,{status:401});if(d===`@renku`){if(t[2]===`rpc`&&t[3]&&t[4]){let e=decodeURIComponent(t[3]),r=decodeURIComponent(t[4]);import.meta.env.DEV||(e=`./functions/${e}.js`),console.log(`☎️ Server function was called:`,e,r);let i=(await import(e))[r];return s(n,i)}return new Response(null,{status:404})}if(!p)return console.warn(`No routing result`),new Response(null,{status:404});if(p.api){let e=Object.assign(n,{params:p.params});return p.api(e,l,u)}let _=null;if(p.route instanceof Promise)_=await(await p.route).default(p.params);else if(p.route&&`default`in p.route&&typeof p.route.default==`function`)_=await p.route.default(p.params);else if(typeof p.route==`function`)_=await p.route(p.params);else return new Response(null,{status:404});let v={styles:[],modules:[]};import.meta.env.DEV?(v.modules.push(`/@vite/client`),v.modules.push(`/@renku/client`)):c&&v.modules.push(c);for(let e of p.layouts)e instanceof Promise?_=await(await e).default({children:_,_renku:v}):`default`in e&&typeof e.default==`function`?_=await e.default({children:_,_renku:v}):typeof e==`function`&&(_=await e({children:_,_renku:v}));let y=r(_);if(n.headers.get(`Accept`)===`text/x-component`){let e=m(a(y));return new Response(e,{headers:{"Content-Type":`text/x-component`}})}let b=m(i(y));return new Response(b,{headers:{"Content-Type":`text/html`}})}),_=({routes:e})=>({fetch:g({routes:e})});export{u as n,l as r,_ as t};
@@ -1,5 +1,5 @@
1
1
  import "./types-BStlw_FH.js";
2
- import "./types-BzglvZrW.js";
3
- import { r as Routes } from "./types-BPhJNjPW.js";
4
- import { n as getAuthRoutes, r as durableObjectHandler, t as renku } from "./index-SdO7aHUm.js";
2
+ import "./types-DA3_gaOB.js";
3
+ import { r as Routes } from "./types-DazdXa4I.js";
4
+ import { n as getAuthRoutes, r as durableObjectHandler, t as renku } from "./index-BpyLKbnR.js";
5
5
  export { Routes, durableObjectHandler, getAuthRoutes, renku };
@@ -1 +1 @@
1
- import"./auth-DivcgvqR.js";import"./rsc-from-markup-lvVZNq4O.js";import"./virtual-from-jsx-BgQUXZ4d.js";import"./signal-store-0zk-69gB.js";import"./effect-hmzj-Jig.js";import{n as e,r as t,t as n}from"./cloudflare-CKedebLt.js";import"./get-route-B1JNCPoL.js";export{t as durableObjectHandler,e as getAuthRoutes,n as renku};
1
+ import"./auth-DivcgvqR.js";import"./rsc-from-markup-SQg4fJ0z.js";import"./virtual-from-jsx-BgQUXZ4d.js";import"./signal-store-0zk-69gB.js";import"./effect-hmzj-Jig.js";import{n as e,r as t,t as n}from"./cloudflare-Dfzl7gGy.js";import"./get-route-B1JNCPoL.js";export{t as durableObjectHandler,e as getAuthRoutes,n as renku};
@@ -1,7 +1,7 @@
1
1
  import "./types-BStlw_FH.js";
2
- import "./types-BzglvZrW.js";
3
- import { r as Routes } from "./types-BPhJNjPW.js";
4
- import { n as getAuthRoutes, r as durableObjectHandler, t as renku } from "./index-SdO7aHUm.js";
2
+ import "./types-DA3_gaOB.js";
3
+ import { r as Routes } from "./types-DazdXa4I.js";
4
+ import { n as getAuthRoutes, r as durableObjectHandler, t as renku } from "./index-BpyLKbnR.js";
5
5
  import { DurableObject } from "cloudflare:workers";
6
6
 
7
7
  //#region src/cloudflare/durable-objects/auth.d.ts
@@ -1 +1 @@
1
- import"./auth-DivcgvqR.js";import"./rsc-from-markup-lvVZNq4O.js";import"./virtual-from-jsx-BgQUXZ4d.js";import"./signal-store-0zk-69gB.js";import"./effect-hmzj-Jig.js";import{n as e,r as t,t as n}from"./cloudflare-CKedebLt.js";import"./get-route-B1JNCPoL.js";import{DurableObject as r}from"cloudflare:workers";const i=e=>{let t=e.replace(/-/g,`+`).replace(/_/g,`/`).padEnd(Math.ceil(e.length/4)*4,`=`),n=atob(t),r=new Uint8Array(n.length);for(let e=0;e<n.length;e++)r[e]=n.charCodeAt(e);return r},a=e=>btoa(String.fromCharCode(...e)).replace(/=/g,``).replace(/\+/g,`-`).replace(/\//g,`_`);var o=class extends r{challenge=null;constructor(e,t){super(e,t)}createChallenge(){let e=new Uint8Array(16);return self.crypto.getRandomValues(e),this.challenge=a(e),this.challenge}creationOptions({id:e,email:t,rpId:n,rpName:r}){let i=this.createChallenge();return{user:{id:e,name:t,displayName:t},challenge:i,rp:{id:n,name:r},pubKeyCredParams:[{type:`public-key`,alg:-7},{type:`public-key`,alg:-257}]}}async validateCreation({name:e,credential:t}){console.log(`validate`,t);let n=new TextDecoder,r=i(t.response.clientDataJSON),a=JSON.parse(n.decode(r));return a.type===`webauthn.create`&&this.challenge===a.challenge?(this.ctx.storage.kv.put(`credential:${t.id}`,t),this.ctx.storage.kv.put(`name`,e),await this.env.AUTH_DO.getByName(`credential:${t.id}`).storeCredential({name:e,credential:t}),!0):!1}storeCredential({name:e,credential:t}){this.ctx.storage.kv.put(`name`,e),this.ctx.storage.kv.put(`credential`,t)}getChallenge(){return this.challenge}requestOptions({rpId:e}){return{challenge:this.createChallenge(),rpId:e}}async validateRequest({credential:e,sessionExpiryInMinutes:t}){return this.challenge?this.env.AUTH_DO.getByName(`credential:${e.id}`).validateCredential({challenge:this.challenge,credential:e,sessionExpiryInMinutes:t}):!1}async validateCredential({challenge:e,credential:t,sessionExpiryInMinutes:n}){let r=new TextDecoder,a=this.ctx.storage.kv.get(`name`),o=this.ctx.storage.kv.get(`credential`),s=i(t.response.clientDataJSON),c=JSON.parse(r.decode(s));if(console.log(`validateCredential`,{challenge:e,credential:t,clientData:c,storedCredential:o,name:a}),a&&e===c.challenge){let e=crypto.randomUUID();return await this.env.AUTH_DO.getByName(`session:${e}`).createSession({userId:a,sessionExpiryInMinutes:n}),e}return!1}setExpiry(e){this.ctx.storage.kv.put(`expiry`,Date.now()+e*60*1e3)}createSession({userId:e,sessionExpiryInMinutes:t}){this.ctx.storage.kv.put(`userId`,e),this.setExpiry(t)}getUserId(){let e=this.ctx.storage.kv.get(`userId`);return e||(e=crypto.randomUUID(),this.ctx.storage.kv.put(`userId`,e)),e}validateSession({sessionExpiryInMinutes:e}){let t=this.ctx.storage.kv.get(`expiry`),n=this.ctx.storage.kv.get(`userId`);return n&&t&&Date.now()<t?(this.setExpiry(e),{userId:n}):!1}logout(){this.ctx.storage.kv.delete(`userId`)}};export{o as AuthDO,t as durableObjectHandler,e as getAuthRoutes,n as renku};
1
+ import"./auth-DivcgvqR.js";import"./rsc-from-markup-SQg4fJ0z.js";import"./virtual-from-jsx-BgQUXZ4d.js";import"./signal-store-0zk-69gB.js";import"./effect-hmzj-Jig.js";import{n as e,r as t,t as n}from"./cloudflare-Dfzl7gGy.js";import"./get-route-B1JNCPoL.js";import{DurableObject as r}from"cloudflare:workers";const i=e=>{let t=e.replace(/-/g,`+`).replace(/_/g,`/`).padEnd(Math.ceil(e.length/4)*4,`=`),n=atob(t),r=new Uint8Array(n.length);for(let e=0;e<n.length;e++)r[e]=n.charCodeAt(e);return r},a=e=>btoa(String.fromCharCode(...e)).replace(/=/g,``).replace(/\+/g,`-`).replace(/\//g,`_`);var o=class extends r{challenge=null;constructor(e,t){super(e,t)}createChallenge(){let e=new Uint8Array(16);return self.crypto.getRandomValues(e),this.challenge=a(e),this.challenge}creationOptions({id:e,email:t,rpId:n,rpName:r}){let i=this.createChallenge();return{user:{id:e,name:t,displayName:t},challenge:i,rp:{id:n,name:r},pubKeyCredParams:[{type:`public-key`,alg:-7},{type:`public-key`,alg:-257}]}}async validateCreation({name:e,credential:t}){console.log(`validate`,t);let n=new TextDecoder,r=i(t.response.clientDataJSON),a=JSON.parse(n.decode(r));return a.type===`webauthn.create`&&this.challenge===a.challenge?(this.ctx.storage.kv.put(`credential:${t.id}`,t),this.ctx.storage.kv.put(`name`,e),await this.env.AUTH_DO.getByName(`credential:${t.id}`).storeCredential({name:e,credential:t}),!0):!1}storeCredential({name:e,credential:t}){this.ctx.storage.kv.put(`name`,e),this.ctx.storage.kv.put(`credential`,t)}getChallenge(){return this.challenge}requestOptions({rpId:e}){return{challenge:this.createChallenge(),rpId:e}}async validateRequest({credential:e,sessionExpiryInMinutes:t}){return this.challenge?this.env.AUTH_DO.getByName(`credential:${e.id}`).validateCredential({challenge:this.challenge,credential:e,sessionExpiryInMinutes:t}):!1}async validateCredential({challenge:e,credential:t,sessionExpiryInMinutes:n}){let r=new TextDecoder,a=this.ctx.storage.kv.get(`name`),o=this.ctx.storage.kv.get(`credential`),s=i(t.response.clientDataJSON),c=JSON.parse(r.decode(s));if(console.log(`validateCredential`,{challenge:e,credential:t,clientData:c,storedCredential:o,name:a}),a&&e===c.challenge){let e=crypto.randomUUID();return await this.env.AUTH_DO.getByName(`session:${e}`).createSession({userId:a,sessionExpiryInMinutes:n}),e}return!1}setExpiry(e){this.ctx.storage.kv.put(`expiry`,Date.now()+e*60*1e3)}createSession({userId:e,sessionExpiryInMinutes:t}){this.ctx.storage.kv.put(`userId`,e),this.setExpiry(t)}getUserId(){let e=this.ctx.storage.kv.get(`userId`);return e||(e=crypto.randomUUID(),this.ctx.storage.kv.put(`userId`,e)),e}validateSession({sessionExpiryInMinutes:e}){let t=this.ctx.storage.kv.get(`expiry`),n=this.ctx.storage.kv.get(`userId`);return n&&t&&Date.now()<t?(this.setExpiry(e),{userId:n}):!1}logout(){this.ctx.storage.kv.delete(`userId`)}};export{o as AuthDO,t as durableObjectHandler,e as getAuthRoutes,n as renku};
@@ -20,4 +20,4 @@ import e from"node:fs";import t from"node:os";import n from"node:path";function
20
20
  `)+`
21
21
  `,usesFlag:e=>e in t||e in n}}function*Le(e,t,n){let{brief:r,fullDescription:i,hideRoute:a}=t,{headers:s}=n.text;yield n.ansiColor?`\x1B[1m${s.usage}\x1B[22m`:s.usage;for(let[t,r]of Object.entries(e))if(!a||!a[t]||n.includeHidden){let e=n.config.caseStyle===`convert-camel-to-kebab`?o(t):t;yield` ${r.formatUsageLine({...n,prefix:[...n.prefix,e]})}`}let c=n.prefix.join(` `);for(let e of Y(n))yield` ${c} ${e}`;if(yield``,yield i??r,n.aliases&&n.aliases.length>0){let e=n.prefix.slice(0,-1).join(` `);yield``,yield n.ansiColor?`\x1B[1m${s.aliases}\x1B[22m`:s.aliases;for(let t of n.aliases)yield` ${e} ${t}`}yield``,yield n.ansiColor?`\x1B[1m${s.flags}\x1B[22m`:s.flags;for(let e of J({},{},n))yield` ${e}`;yield``,yield n.ansiColor?`\x1B[1m${s.commands}\x1B[22m`:s.commands;let l=m(Object.entries(e).filter(([e])=>!a||!a[e]||n.includeHidden).map(([e,t])=>({routeName:V(e,n.config.caseStyle),brief:t.brief,hidden:a&&a[e]})).map(e=>n.ansiColor?[e.hidden?`\x1B[90m${e.routeName}\x1B[39m`:`\x1B[97m${e.routeName}\x1B[39m`,e.hidden?`\x1B[90m${e.brief}\x1B[39m`:`\x1B[03m${e.brief}\x1B[23m`]:[e.routeName,e.brief]),[` `]);for(let e of l)yield` ${e}`}function Z({routes:e,defaultCommand:t,docs:n,aliases:r}){if(Object.entries(e).length===0)throw new d(`Route map must contain at least one route`);let i=r??{},s=new Map;for(let[t,n]of Object.entries(i)){if(t in e)throw new d(`Cannot use "${t}" as an alias when a route with that name already exists`);let r=s.get(n)??[];s.set(n,[...r,t])}let c=t?e[t]:void 0;if(c&&c.kind===R)throw new d(`Cannot use "${t}" as the default command because it is not a Command`);let l=t=>{if(t in i)return i[t];if(t in e)return t};return{kind:R,get brief(){return n.brief},formatUsageLine(e){let t=this.getAllEntries().filter(e=>!e.hidden).map(t=>t.name[e.config.caseStyle]);return`${e.prefix.join(` `)} ${t.join(`|`)} ...`},formatHelp:t=>[...Le(e,n,t)].join(`
22
22
  `)+`
23
- `,getDefaultCommand:()=>c,getOtherAliasesForInput:(e,n)=>{if(t){if(e===t)return{original:[``],"convert-camel-to-kebab":[``]};if(e===``)return{original:[t],"convert-camel-to-kebab":[t]}}let r=a(e),i=l(e);if(!i&&n===`allow-kebab-for-camel`&&(i=l(r)),!i)return{original:[],"convert-camel-to-kebab":[]};let c=[i,...s.get(i)??[]].filter(t=>t!==e&&t!==r);return{original:c,"convert-camel-to-kebab":c.map(o)}},getRoutingTargetForInput:t=>e[t in i?i[t]:t],getAllEntries(){let t=n.hideRoute;return Object.entries(e).map(([e,n])=>({name:{original:e,"convert-camel-to-kebab":o(e)},target:n,aliases:s.get(e)??[],hidden:t?.[e]??!1}))}}}async function Re(e,t,n){let r=await be(e,t,n);n.process.exitCode=r}function Q(e,t){if(e.length<=1)return e[0]??``;if(e.length===2)return e.join(` ${t.conjunction} `);let n=e.slice(0,e.length-1).join(`, `);return t.serialComma&&(n+=`,`),[n,t.conjunction,e[e.length-1]].join(` `)}var $={parse:String,brief:`Target command run by user`,placeholder:`targetCommand`};X({loader:async()=>{let{install:e}=await import(`./impl-CQ7GTRH2-BsAKEI_H.js`);return e},parameters:{flags:{bash:{kind:`parsed`,brief:`Command executed by bash to generate completion proposals`,parse:String,optional:!0,placeholder:`command`}},positional:{kind:`tuple`,parameters:[$]}},docs:{brief:`Installs autocomplete support for target command on all provided shell types`}});function ze(e,t){return X({loader:async()=>{let{install:n}=await import(`./impl-CQ7GTRH2-BsAKEI_H.js`);return function(){return n.call(this,t,e)}},parameters:{},docs:{brief:`Installs ${Q(Object.keys(t),{conjunction:`and`,serialComma:!0})} autocomplete support for ${e}`}})}X({loader:async()=>{let{uninstall:e}=await import(`./impl-CQ7GTRH2-BsAKEI_H.js`);return e},parameters:{flags:{bash:{kind:`boolean`,brief:`Uninstall autocompletion for bash`,optional:!0}},positional:{kind:`tuple`,parameters:[$]}},docs:{brief:`Uninstalls autocomplete support for target command on all selected shell types`}});function Be(e,t){return X({loader:async()=>{let{uninstall:n}=await import(`./impl-CQ7GTRH2-BsAKEI_H.js`);return function(){return n.call(this,t,e)}},parameters:{},docs:{brief:`Uninstalls ${Q(Object.entries(t).filter(([,e])=>e).map(([e])=>e),{conjunction:`and`,serialComma:!0})} autocomplete support for ${e}`}})}var Ve=`renku`,He=`Renku`,Ue=`0.0.2`;const We=Z({routes:{ios:X({loader:async()=>{let{ios:e}=await import(`./impl-O61EKx7J.js`);return e},parameters:{positional:{kind:`tuple`,parameters:[]},flags:{foo:{kind:`parsed`,optional:!0,parse:String,brief:`Foo`}}},docs:{brief:`Nested ios command`}}),android:X({loader:async()=>{let{android:e}=await import(`./impl-O61EKx7J.js`);return e},parameters:{positional:{kind:`tuple`,parameters:[]},flags:{foo:{kind:`parsed`,optional:!0,parse:String,brief:`Foo`}}},docs:{brief:`Nested android command`}})},docs:{brief:`Native app generation`}}),Ge=Z({routes:{foo:X({loader:async()=>{let{foo:e}=await import(`./impl-vRmneAi-.js`);return e},parameters:{positional:{kind:`tuple`,parameters:[]},flags:{foo:{kind:`parsed`,optional:!0,parse:String,brief:`Foo`}}},docs:{brief:`Nested foo command`}}),bar:X({loader:async()=>{let{bar:e}=await import(`./impl-vRmneAi-.js`);return e},parameters:{positional:{kind:`tuple`,parameters:[]},flags:{foo:{kind:`parsed`,optional:!0,parse:String,brief:`Foo`}}},docs:{brief:`Nested bar command`}})},docs:{brief:`Nested commands`}}),Ke=Ce(Z({routes:{subdir:X({loader:async()=>import(`./impl-CRQorzAF.js`),parameters:{positional:{kind:`tuple`,parameters:[]},flags:{foo:{kind:`parsed`,optional:!0,parse:String,brief:`Foo`}}},docs:{brief:`Command in subdirectory`}}),nested:Ge,native:We,install:ze(`my-app`,{bash:`__my-app_bash_complete`}),uninstall:Be(`my-app`,{bash:!0})},docs:{brief:He,hideRoute:{install:!0,uninstall:!0}}}),{name:Ve,versionInfo:{currentVersion:Ue}});function qe(r){return{process:r,os:t,fs:e,path:n}}export{Ee as i,Ke as n,Re as r,qe as t};
23
+ `,getDefaultCommand:()=>c,getOtherAliasesForInput:(e,n)=>{if(t){if(e===t)return{original:[``],"convert-camel-to-kebab":[``]};if(e===``)return{original:[t],"convert-camel-to-kebab":[t]}}let r=a(e),i=l(e);if(!i&&n===`allow-kebab-for-camel`&&(i=l(r)),!i)return{original:[],"convert-camel-to-kebab":[]};let c=[i,...s.get(i)??[]].filter(t=>t!==e&&t!==r);return{original:c,"convert-camel-to-kebab":c.map(o)}},getRoutingTargetForInput:t=>e[t in i?i[t]:t],getAllEntries(){let t=n.hideRoute;return Object.entries(e).map(([e,n])=>({name:{original:e,"convert-camel-to-kebab":o(e)},target:n,aliases:s.get(e)??[],hidden:t?.[e]??!1}))}}}async function Re(e,t,n){let r=await be(e,t,n);n.process.exitCode=r}function Q(e,t){if(e.length<=1)return e[0]??``;if(e.length===2)return e.join(` ${t.conjunction} `);let n=e.slice(0,e.length-1).join(`, `);return t.serialComma&&(n+=`,`),[n,t.conjunction,e[e.length-1]].join(` `)}var $={parse:String,brief:`Target command run by user`,placeholder:`targetCommand`};X({loader:async()=>{let{install:e}=await import(`./impl-CQ7GTRH2-BsAKEI_H.js`);return e},parameters:{flags:{bash:{kind:`parsed`,brief:`Command executed by bash to generate completion proposals`,parse:String,optional:!0,placeholder:`command`}},positional:{kind:`tuple`,parameters:[$]}},docs:{brief:`Installs autocomplete support for target command on all provided shell types`}});function ze(e,t){return X({loader:async()=>{let{install:n}=await import(`./impl-CQ7GTRH2-BsAKEI_H.js`);return function(){return n.call(this,t,e)}},parameters:{},docs:{brief:`Installs ${Q(Object.keys(t),{conjunction:`and`,serialComma:!0})} autocomplete support for ${e}`}})}X({loader:async()=>{let{uninstall:e}=await import(`./impl-CQ7GTRH2-BsAKEI_H.js`);return e},parameters:{flags:{bash:{kind:`boolean`,brief:`Uninstall autocompletion for bash`,optional:!0}},positional:{kind:`tuple`,parameters:[$]}},docs:{brief:`Uninstalls autocomplete support for target command on all selected shell types`}});function Be(e,t){return X({loader:async()=>{let{uninstall:n}=await import(`./impl-CQ7GTRH2-BsAKEI_H.js`);return function(){return n.call(this,t,e)}},parameters:{},docs:{brief:`Uninstalls ${Q(Object.entries(t).filter(([,e])=>e).map(([e])=>e),{conjunction:`and`,serialComma:!0})} autocomplete support for ${e}`}})}var Ve=`renku`,He=`Renku`,Ue=`0.0.3`;const We=Z({routes:{ios:X({loader:async()=>{let{ios:e}=await import(`./impl-O61EKx7J.js`);return e},parameters:{positional:{kind:`tuple`,parameters:[]},flags:{foo:{kind:`parsed`,optional:!0,parse:String,brief:`Foo`}}},docs:{brief:`Nested ios command`}}),android:X({loader:async()=>{let{android:e}=await import(`./impl-O61EKx7J.js`);return e},parameters:{positional:{kind:`tuple`,parameters:[]},flags:{foo:{kind:`parsed`,optional:!0,parse:String,brief:`Foo`}}},docs:{brief:`Nested android command`}})},docs:{brief:`Native app generation`}}),Ge=Z({routes:{foo:X({loader:async()=>{let{foo:e}=await import(`./impl-vRmneAi-.js`);return e},parameters:{positional:{kind:`tuple`,parameters:[]},flags:{foo:{kind:`parsed`,optional:!0,parse:String,brief:`Foo`}}},docs:{brief:`Nested foo command`}}),bar:X({loader:async()=>{let{bar:e}=await import(`./impl-vRmneAi-.js`);return e},parameters:{positional:{kind:`tuple`,parameters:[]},flags:{foo:{kind:`parsed`,optional:!0,parse:String,brief:`Foo`}}},docs:{brief:`Nested bar command`}})},docs:{brief:`Nested commands`}}),Ke=Ce(Z({routes:{subdir:X({loader:async()=>import(`./impl-CRQorzAF.js`),parameters:{positional:{kind:`tuple`,parameters:[]},flags:{foo:{kind:`parsed`,optional:!0,parse:String,brief:`Foo`}}},docs:{brief:`Command in subdirectory`}}),nested:Ge,native:We,install:ze(`my-app`,{bash:`__my-app_bash_complete`}),uninstall:Be(`my-app`,{bash:!0})},docs:{brief:He,hideRoute:{install:!0,uninstall:!0}}}),{name:Ve,versionInfo:{currentVersion:Ue}});function qe(r){return{process:r,os:t,fs:e,path:n}}export{Ee as i,Ke as n,Re as r,qe as t};
package/dist/data.d.ts CHANGED
@@ -1,5 +1,4 @@
1
- import { t as Signal } from "./signal-CqB2Ey1W.js";
2
- import { t as Loader } from "./types-DwyPVMcM.js";
1
+ import { n as Signal, t as Loader } from "./types-J6ZDxAIC.js";
3
2
  import { RpcStub, RpcTarget } from "capnweb";
4
3
 
5
4
  //#region src/data/schema/types.d.ts
@@ -105,6 +104,7 @@ declare class RemoteCollection<T extends Schema, K$1 extends keyof T> extends Rp
105
104
  query(params?: QueryParams<T, K$1>): Item<T[K$1]>[];
106
105
  first(params?: Omit<QueryParams<T, K$1>, "single" | "limit">): Item<T[K$1]> | undefined;
107
106
  all(): Item<T[K$1]>[];
107
+ add(item: Item<T[K$1]>): void;
108
108
  }
109
109
  //#endregion
110
110
  //#region src/data/collection/types.d.ts
package/dist/data.js CHANGED
@@ -1 +1 @@
1
- import"./signal-store-0zk-69gB.js";import{n as e,r as t,t as n}from"./create-computed-D9oVNGZ6.js";import{RpcStub as r,RpcTarget as i}from"capnweb";import"@sqlite.org/sqlite-wasm";const a=({client:e,object:t,item:n})=>{let{id:r,...i}=n;return{id:crypto.randomUUID(),timestamp:Date.now().toString(),client:e,object:t,item:r,updates:JSON.stringify(i)}};var o=class{#e=new Set;subscribe(e){return this.#e.add(e),()=>{this.#e.delete(e)}}#t(e){console.log(`this.#subscriptions`,this.#e);for(let t of this.#e){if(t.filter&&!t.filter(e))continue;console.log(`✉️`,`Dispatching`,t.label);let n=t.subscriber(e);n instanceof Promise&&n.catch(e=>{console.error(`MessageQueue subscriber failed.`,e)})}}add(e){this.#t(e)}},s=class{#e;#t;#n;#r=t([]);#i;#a;constructor({name:e,obj:t,clientId:n,messageQueue:r,db:i}){this.#a=i,this.#e=n,this.#t=e,this.#n=t,this.#i=r,this.#i.subscribe({subscriber:e=>this.#o(e),filter:e=>e.object===this.#t,label:`Collection: ${this.#t}`})}mock(){return Object.entries(this.#n).reduce((e,[t,n])=>(e[t]=n.mock?n.mock():void 0,e),{})}#o(e){console.log(e);let t={id:e.item,...JSON.parse(e.updates)};this.#r.set(this.#r.get().concat(t))}#s(){if(this.#a){let e=`SELECT * FROM obj_${this.#t}`;this.#r.set(this.#a.query(e))}}get items(){return this.#s(),this.#r}query({filter:e,limit:t,first:r}={}){return n(()=>{let n=this.#r.get().filter(e||(()=>!0));return(t||r)&&(n=n.slice(0,r?1:t)),n})}first(e={}){return e.first=!0,n(()=>{let t=this.query(e).get();return t.length>0?t[0]:void 0})}all(){return this.query()}add(e){let t=a({client:this.#e,object:this.#t,item:e});return this.#i.add(t),e}};const c=({schema:e,clientId:t,messageQueue:n,db:r})=>Object.entries(e).reduce((e,[i,a])=>{let o=i;return e[o]=new s({name:i,obj:a,clientId:t,messageQueue:n,db:r}),e},{}),l=e=>t=>{e.transaction(e=>{if(e.exec(`INSERT INTO __crdt (id, timestamp, client, object, item, updates) VALUES (?, ?, ?, ?, ?, ?);`,t.id,t.timestamp,t.client,t.object,t.item,t.updates),t.updates===`DELETE`)e.exec(`DELETE FROM obj_${t.object} WHERE id = ?;`,t.item);else{let n=[t.item],r=JSON.parse(t.updates),i=[`id`].concat(Object.keys(r));n.push(...Object.values(r));let a=`INSERT INTO obj_${t.object} (${i.join(`, `)}) VALUES (${n.map(()=>`?`).join(`, `)});`;e.exec(a,...n)}})};var u=class extends i{#e;constructor(e){super(),this.#e=e}get items(){return this.#e.items.get()}query(e={}){return this.#e.query(e).get()}first(e={}){return this.#e.first(e).get()}all(){return this.query()}};const d=e=>{let t=Object.entries(e).reduce((e,[t,n])=>{let r=t;return e[r]=new u(n),e},{});return console.log(`remoteCollections:`,t),t};var f=class extends i{#e;#t;#n;messageQueue=new o;#r;#i;constructor({schema:e,db:t}){super(),this.#e=e,t?(this.#n=t,this.#t=this.#n.clientId,this.messageQueue.subscribe({subscriber:l(this.#n),label:`Local database (Client ID: ${this.#t})`})):this.#t=crypto.randomUUID(),this.#r=c({schema:this.#e,clientId:this.#t,messageQueue:this.messageQueue,db:this.#n}),this.#i=d(this.#r)}get _collections(){return this.#r}get _remoteCollections(){return this.#i}get schema(){return this.#e}get clientId(){return this.#t}ingest(e){console.log(`📳📳📳`,`Ingest`,e),this.messageQueue.add(e)}async[Symbol.dispose](){console.log(`🗑️🗑️🗑️`,`Data RPC disposing (Client ID: ${this.clientId})`)}};const p=e=>{switch(e){case`string`:return`TEXT`;case`number`:return`INTEGER`;case`boolean`:return`INTEGER`;default:throw Error(`Unsupported type: ${String(e)}`)}},m=e=>{let t=``;for(let[n,r]of Object.entries(e)){let e=Object.entries(r).map(([e,t])=>`${e} ${p(t.type)}`).join(`, `);e&&(t+=`CREATE TABLE IF NOT EXISTS obj_${n} (${e});`)}return t+=`CREATE TABLE IF NOT EXISTS __renku (id TEXT NOT NULL PRIMARY KEY, value TEXT NOT NULL);`,t+=`INSERT INTO __renku (id, value) VALUES ('client_id', '${crypto.randomUUID()}') ON CONFLICT (id) DO NOTHING;`,t+=`CREATE TABLE IF NOT EXISTS __crdt (id TEXT NOT NULL PRIMARY KEY, timestamp TEXT NOT NULL, client TEXT NOT NULL, object TEXT NOT NULL, item TEXT NOT NULL, updates TEXT);`,t},h=({db:e,schema:t})=>{let n=m(t);e.exec(n);let r=e.query(`SELECT value FROM __renku WHERE id = 'client_id' LIMIT 1`);if(!r[0])throw Error(`Client ID not found`);e.clientId=r[0].value};var g=class t extends f{#e;#t;constructor({schema:e,db:t,remote:n}){super({schema:e,db:t}),this.#e=n,this.#e&&this.load().then(()=>{console.log(`Loading completed`)}).catch(e=>{console.error(`Loading failed:`,e)})}static async client({schema:e,remote:n}){return typeof n==`function`&&(n=await n()),new t({schema:e,db:!1,remote:n})}static signal({schema:t,remote:n}){return e(()=>this.client({schema:t,remote:n}))}get collections(){return this._collections}async load(){console.log(`Loading data ...`,this.#e);let e=await this.#e?.load();console.log(`Loaded data:`,e)}async[Symbol.dispose](){console.log(`🗑️ Client Data RPC disposing (CID: ${this.clientId})`),this.#t&&await this.#t()}};const _=e=>{let t={exec:(t,...n)=>e.sql.exec(t,...n),query:(t,...n)=>e.sql.exec(t,...n).toArray(),transaction:n=>e.transactionSync(()=>n(t))};return t};var v=class e extends f{constructor({schema:e,db:t}){super({schema:e,db:t})}static durableObject({schema:t,storage:n}){let r=_(n);return h({db:r,schema:t}),new e({schema:t,db:r})}get collections(){return this._remoteCollections}async load(){return`Test loaded data`}async connect({clientId:e,ingest:t}){throw Error(`Not implemented`)}};const y=e=>e,b={type:`string`,required:!0,unique:!0,mock:()=>crypto.randomUUID().toString()};export{g as ClientData,v as ServerData,b as id,y as schema};
1
+ import"./signal-store-0zk-69gB.js";import{n as e,r as t,t as n}from"./create-computed-D9oVNGZ6.js";import{RpcStub as r,RpcTarget as i}from"capnweb";import"@sqlite.org/sqlite-wasm";const a=({client:e,object:t,item:n})=>{let{id:r,...i}=n;return{id:crypto.randomUUID(),timestamp:Date.now().toString(),client:e,object:t,item:r,updates:JSON.stringify(i)}};var o=class{#e=new Set;subscribe(e){return this.#e.add(e),()=>{this.#e.delete(e)}}#t(e){console.log(`this.#subscriptions`,this.#e);for(let t of this.#e){if(t.filter&&!t.filter(e))continue;console.log(`✉️`,`Dispatching`,t.label);let n=t.subscriber(e);n instanceof Promise&&n.catch(e=>{console.error(`MessageQueue subscriber failed.`,e)})}}add(e){this.#t(e)}},s=class{#e;#t;#n;#r=t([]);#i;#a;constructor({name:e,obj:t,clientId:n,messageQueue:r,db:i}){this.#a=i,this.#e=n,this.#t=e,this.#n=t,this.#i=r,this.#i.subscribe({subscriber:e=>this.#o(e),filter:e=>e.object===this.#t,label:`Collection: ${this.#t}`})}mock(){return Object.entries(this.#n).reduce((e,[t,n])=>(e[t]=n.mock?n.mock():void 0,e),{})}#o(e){console.log(e);let t={id:e.item,...JSON.parse(e.updates)};this.#r.set(this.#r.get().concat(t))}#s(){if(this.#a){let e=`SELECT * FROM obj_${this.#t}`;this.#r.set(this.#a.query(e))}}get items(){return this.#s(),this.#r}query({filter:e,limit:t,first:r}={}){return n(()=>{let n=this.#r.get().filter(e||(()=>!0));return(t||r)&&(n=n.slice(0,r?1:t)),n})}first(e={}){return e.first=!0,n(()=>{let t=this.query(e).get();return t.length>0?t[0]:void 0})}all(){return this.query()}add(e){let t=a({client:this.#e,object:this.#t,item:e});return this.#i.add(t),e}};const c=({schema:e,clientId:t,messageQueue:n,db:r})=>Object.entries(e).reduce((e,[i,a])=>{let o=i;return e[o]=new s({name:i,obj:a,clientId:t,messageQueue:n,db:r}),e},{}),l=e=>t=>{e.transaction(e=>{if(e.exec(`INSERT INTO __crdt (id, timestamp, client, object, item, updates) VALUES (?, ?, ?, ?, ?, ?);`,t.id,t.timestamp,t.client,t.object,t.item,t.updates),t.updates===`DELETE`)e.exec(`DELETE FROM obj_${t.object} WHERE id = ?;`,t.item);else{let n=[t.item],r=JSON.parse(t.updates),i=[`id`].concat(Object.keys(r));n.push(...Object.values(r));let a=`INSERT INTO obj_${t.object} (${i.join(`, `)}) VALUES (${n.map(()=>`?`).join(`, `)});`;e.exec(a,...n)}})};var u=class extends i{#e;constructor(e){super(),this.#e=e}get items(){return this.#e.items.get()}query(e={}){return this.#e.query(e).get()}first(e={}){return this.#e.first(e).get()}all(){return this.query()}add(e){this.#e.add(e)}};const d=e=>{let t=Object.entries(e).reduce((e,[t,n])=>{let r=t;return e[r]=new u(n),e},{});return console.log(`remoteCollections:`,t),t};var f=class extends i{#e;#t;#n;messageQueue=new o;#r;#i;constructor({schema:e,db:t}){super(),this.#e=e,t?(this.#n=t,this.#t=this.#n.clientId,this.messageQueue.subscribe({subscriber:l(this.#n),label:`Local database (Client ID: ${this.#t})`})):this.#t=crypto.randomUUID(),this.#r=c({schema:this.#e,clientId:this.#t,messageQueue:this.messageQueue,db:this.#n}),this.#i=d(this.#r)}get _collections(){return this.#r}get _remoteCollections(){return this.#i}get schema(){return this.#e}get clientId(){return this.#t}ingest(e){console.log(`📳📳📳`,`Ingest`,e),this.messageQueue.add(e)}async[Symbol.dispose](){console.log(`🗑️🗑️🗑️`,`Data RPC disposing (Client ID: ${this.clientId})`)}};const p=e=>{switch(e){case`string`:return`TEXT`;case`number`:return`INTEGER`;case`boolean`:return`INTEGER`;default:throw Error(`Unsupported type: ${String(e)}`)}},m=e=>{let t=``;for(let[n,r]of Object.entries(e)){let e=Object.entries(r).map(([e,t])=>`${e} ${p(t.type)}`).join(`, `);e&&(t+=`CREATE TABLE IF NOT EXISTS obj_${n} (${e});`)}return t+=`CREATE TABLE IF NOT EXISTS __renku (id TEXT NOT NULL PRIMARY KEY, value TEXT NOT NULL);`,t+=`INSERT INTO __renku (id, value) VALUES ('client_id', '${crypto.randomUUID()}') ON CONFLICT (id) DO NOTHING;`,t+=`CREATE TABLE IF NOT EXISTS __crdt (id TEXT NOT NULL PRIMARY KEY, timestamp TEXT NOT NULL, client TEXT NOT NULL, object TEXT NOT NULL, item TEXT NOT NULL, updates TEXT);`,t},h=({db:e,schema:t})=>{let n=m(t);e.exec(n);let r=e.query(`SELECT value FROM __renku WHERE id = 'client_id' LIMIT 1`);if(!r[0])throw Error(`Client ID not found`);e.clientId=r[0].value};var g=class t extends f{#e;#t;constructor({schema:e,db:t,remote:n}){if(super({schema:e,db:t}),this.#e=n,this.#e){this.#e.connect({clientId:this.clientId,ingest:this.ingest.bind(this)}).then(e=>{console.log(`📳📳📳`,`Remote is connected`,e),this.#t=e}).catch(e=>{console.error(`Remote connect failed:`,e)});let e=this.messageQueue.subscribe({subscriber:async e=>{await this.#e?.ingest(e),console.log(`Send to remote`,e)},filter:e=>e.client===this.clientId,label:`Remote`});this.#e.onRpcBroken(()=>{console.log(`Remote connection broken, unsubscribing ...`),e()})}}static async client({schema:e,remote:n}){return typeof n==`function`&&(n=await n()),new t({schema:e,db:!1,remote:n})}static signal({schema:t,remote:n}){return e(()=>this.client({schema:t,remote:n}))}get collections(){return this._collections}async load(){console.log(`Loading data ...`,this.#e);let e=await this.#e?.load();console.log(`Loaded data:`,e)}async[Symbol.dispose](){console.log(`🗑️ Client Data RPC disposing (CID: ${this.clientId})`),this.#t&&await this.#t()}};const _=e=>{let t={exec:(t,...n)=>e.sql.exec(t,...n),query:(t,...n)=>e.sql.exec(t,...n).toArray(),transaction:n=>e.transactionSync(()=>n(t))};return t};var v=class e extends f{constructor({schema:e,db:t}){super({schema:e,db:t})}static durableObject({schema:t,storage:n}){let r=_(n);return h({db:r,schema:t}),new e({schema:t,db:r})}get collections(){return this._remoteCollections}async load(){return`Test loaded data`}async connect({clientId:e,ingest:t}){console.log(`📳📳📳`,`connect from`,e,t),t.onRpcBroken(()=>{console.log(`📳📳📳`,e,`Ingest RPC broken`)});let n=t.dup();console.log(`Subscribing client`,e);let r=this.messageQueue.subscribe({subscriber:async e=>await n({...e,id:`${e.id}-CONNECT-${crypto.randomUUID()}`}),filter:t=>t.client!==e,label:`Client: ${e}`});return console.log(`Sending test message to client`),console.log(`📳📳📳`,e,`End of connect`),new Promise((e,n)=>{t.onRpcBroken(e=>{r(),n(e)})})}};const y=e=>e,b={type:`string`,required:!0,unique:!0,mock:()=>crypto.randomUUID().toString()};export{g as ClientData,v as ServerData,b as id,y as schema};
package/dist/dom.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import "./types-BStlw_FH.js";
2
- import { o as RenkuNode, r as FunctionComponent } from "./types-BzglvZrW.js";
3
- import { r as Routes } from "./types-BPhJNjPW.js";
2
+ import { o as RenkuNode, r as FunctionComponent } from "./types-DA3_gaOB.js";
3
+ import { r as Routes } from "./types-DazdXa4I.js";
4
4
 
5
5
  //#region src/router/Router.d.ts
6
6
  declare const Router: FunctionComponent<{
package/dist/dom.js CHANGED
@@ -1 +1 @@
1
- import{t as e}from"./virtual-from-jsx-BgQUXZ4d.js";import"./signal-store-0zk-69gB.js";import"./effect-hmzj-Jig.js";import{n as t,t as n}from"./render-dom-node-BzR5XI1t.js";import{t as r}from"./get-route-B1JNCPoL.js";import"./fragment-Chv9FEhP.js";import{n as i}from"./jsx-runtime-DvEc5zft.js";const a=async({routes:e})=>{let t=r({request:new Request(window.location.href),routes:e}),n=null;if(!t||t.api)return i(`div`,{children:`Not Found`});if(t.route instanceof Promise)n=await(await t.route).default(t.params);else if(typeof t.route==`function`)n=t.route(t.params);else return i(`div`,{children:`Not Found`});for(let e of t.layouts)e instanceof Promise?n=await(await e).default({children:n}):typeof e==`function`&&(n=await e({children:n}));return n},o=(r,i)=>{let a=e({node:r});i.replaceChildren(),Array.isArray(a)?t({domNode:i,virtualNode:a}):n({domNode:i,virtualNode:a})};export{a as Router,o as render};
1
+ import{t as e}from"./virtual-from-jsx-BgQUXZ4d.js";import"./signal-store-0zk-69gB.js";import"./effect-hmzj-Jig.js";import{n as t,r as n}from"./update-dom-node-DnDA0pqF.js";import{t as r}from"./get-route-B1JNCPoL.js";import"./fragment-Chv9FEhP.js";import{n as i}from"./jsx-runtime-DvEc5zft.js";const a=async({routes:e})=>{let t=r({request:new Request(window.location.href),routes:e}),n=null;if(!t||t.api)return i(`div`,{children:`Not Found`});if(t.route instanceof Promise)n=await(await t.route).default(t.params);else if(typeof t.route==`function`)n=t.route(t.params);else return i(`div`,{children:`Not Found`});for(let e of t.layouts)e instanceof Promise?n=await(await e).default({children:n}):typeof e==`function`&&(n=await e({children:n}));return n},o=(r,i)=>{let a=e({node:r});i.replaceChildren(),Array.isArray(a)?n({domNode:i,virtualNode:a}):t({domNode:i,virtualNode:a})};export{a as Router,o as render};
@@ -1,4 +1,4 @@
1
- import { n as FragmentComponent } from "./types-BzglvZrW.js";
1
+ import { n as FragmentComponent } from "./types-DA3_gaOB.js";
2
2
 
3
3
  //#region src/jsx/fragment.d.ts
4
4
  declare const Fragment: FragmentComponent;
@@ -1,4 +1,4 @@
1
- import { r as Routes } from "./types-BPhJNjPW.js";
1
+ import { r as Routes } from "./types-DazdXa4I.js";
2
2
 
3
3
  //#region src/cloudflare/durable-object-handler.d.ts
4
4
  declare const durableObjectHandler: ({
@@ -13,7 +13,6 @@ declare const durableObjectHandler: ({
13
13
  //#endregion
14
14
  //#region src/cloudflare/get-auth-routes.d.ts
15
15
  interface AuthOptions {
16
- rpId: string;
17
16
  rpName: string;
18
17
  sessionExpiryInMinutes?: number;
19
18
  }
package/dist/index.d.ts CHANGED
@@ -1,10 +1,9 @@
1
1
  import "./types-BStlw_FH.js";
2
- import { a as LayoutComponent, r as FunctionComponent } from "./types-BzglvZrW.js";
3
- import { r as Routes } from "./types-BPhJNjPW.js";
4
- import { t as Signal } from "./signal-CqB2Ey1W.js";
5
- import { t as Loader } from "./types-DwyPVMcM.js";
6
- import { t as registerServerFunction } from "./register-server-function-BuqMxh0V.js";
7
- import { RpcStub, RpcTarget } from "capnweb";
2
+ import { a as LayoutComponent, r as FunctionComponent } from "./types-DA3_gaOB.js";
3
+ import { r as Routes } from "./types-DazdXa4I.js";
4
+ import { n as Signal, t as Loader } from "./types-J6ZDxAIC.js";
5
+ import { t as registerServerFunction } from "./register-server-function-DoOVejlg.js";
6
+ import { RpcStub, RpcStub as RpcStub$1, RpcTarget, RpcTarget as RpcTarget$1 } from "capnweb";
8
7
 
9
8
  //#region src/reactivity/create-computed.d.ts
10
9
  declare const createComputed: <T>(fn: () => T) => Signal.Computed<T>;
@@ -12,6 +11,18 @@ declare const createComputed: <T>(fn: () => T) => Signal.Computed<T>;
12
11
  //#region src/reactivity/create-fetched.d.ts
13
12
  declare const createFetched: <T>(path: string, fn: (res: Response) => Promise<T> | T) => Signal.State<Loader<T>>;
14
13
  //#endregion
14
+ //#region src/reactivity/create-remote-signal.d.ts
15
+ declare const createRemoteSignal: <T>(fn: () => Promise<any>) => Promise<Signal.State<T>>;
16
+ //#endregion
17
+ //#region src/reactivity/remote-signal.d.ts
18
+ declare class RemoteSignal<T extends number | string | undefined> extends RpcTarget$1 {
19
+ #private;
20
+ constructor(initialValues: T);
21
+ get(): T;
22
+ set(value: T): Promise<void>;
23
+ subscribe(callback: RpcStub$1<(value: T) => void>): Promise<void>;
24
+ }
25
+ //#endregion
15
26
  //#region src/reactivity/create-loader.d.ts
16
27
  declare function createLoader<P>(promise: () => Promise<P>): Signal.State<Loader<P>>;
17
28
  declare function createLoader<P, R, T extends (res: P) => R | Promise<R>>(promise: () => Promise<P>, transform: T): Signal.State<Loader<R>>;
@@ -22,4 +33,4 @@ declare const createSignal: <T>(initialValue: T) => Signal.State<T>;
22
33
  //#region src/reactivity/effect.d.ts
23
34
  declare const effect: (callback: (() => () => void) | (() => void)) => (() => void);
24
35
  //#endregion
25
- export { type FunctionComponent, type LayoutComponent, type Routes, RpcStub, RpcTarget, Signal, createComputed, createFetched, createLoader, createSignal, effect, registerServerFunction };
36
+ export { type FunctionComponent, type LayoutComponent, RemoteSignal, type Routes, RpcStub, RpcTarget, Signal, createComputed, createFetched, createLoader, createRemoteSignal, createSignal, effect, registerServerFunction };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{n as e}from"./signal-store-0zk-69gB.js";import{t}from"./effect-hmzj-Jig.js";import{n,r,t as i}from"./create-computed-D9oVNGZ6.js";import{t as a}from"./register-server-function-DQl0uL7w.js";import{RpcStub as o,RpcTarget as s}from"capnweb";const c=(e,t)=>n(()=>fetch(e).then(async e=>await t(e)));export{o as RpcStub,s as RpcTarget,e as Signal,i as createComputed,c as createFetched,n as createLoader,r as createSignal,t as effect,a as registerServerFunction};
1
+ import{n as e}from"./signal-store-0zk-69gB.js";import{t}from"./effect-hmzj-Jig.js";import{n,r,t as i}from"./create-computed-D9oVNGZ6.js";import{t as a}from"./register-server-function-DQl0uL7w.js";import{RpcStub as o,RpcStub as s,RpcTarget as c,RpcTarget as l}from"capnweb";const u=(e,t)=>n(()=>fetch(e).then(async e=>await t(e))),d=async e=>{let n=await e(),i=r(await n.get());return n.subscribe(e=>i.set(e)),i.set(await n.get()),t(()=>{n.set(i.get())}),i.set(await n.get()),i};var f=class extends l{#e;#t=new Set;constructor(e){super(),this.#e=e}get(){return this.#e}async set(e){this.#e=e;for(let t of this.#t)try{await t(e)}catch(e){console.error(`Error in subscriber:`,e),this.#t.delete(t)}}async subscribe(e){return this.#t.add(e.dup()),new Promise((t,n)=>{e.onRpcBroken(t=>{this.#t.delete(e),n(t)})})}};export{f as RemoteSignal,o as RpcStub,c as RpcTarget,e as Signal,i as createComputed,u as createFetched,n as createLoader,d as createRemoteSignal,r as createSignal,t as effect,a as registerServerFunction};
@@ -1,5 +1,5 @@
1
- import { i as JSX } from "./types-BzglvZrW.js";
2
- import { t as Fragment } from "./fragment-BZKaFASk.js";
1
+ import { i as JSX } from "./types-DA3_gaOB.js";
2
+ import { t as Fragment } from "./fragment-CpqsWP0m.js";
3
3
 
4
4
  //#region src/jsx/jsx-dev.d.ts
5
5
  declare const jsxDEV: (type: JSX.ElementType, props: any, key: string | null | undefined, _isStaticChildren: boolean, _source: {
@@ -1,5 +1,5 @@
1
- import { i as JSX } from "./types-BzglvZrW.js";
2
- import { t as Fragment } from "./fragment-BZKaFASk.js";
1
+ import { i as JSX } from "./types-DA3_gaOB.js";
2
+ import { t as Fragment } from "./fragment-CpqsWP0m.js";
3
3
 
4
4
  //#region src/jsx/jsx.d.ts
5
5
  declare const jsx: (type: JSX.ElementType, props: any, key: string | null | undefined) => JSX.Element;
@@ -1,5 +1,5 @@
1
- import{t as e}from"./virtual-from-jsx-BgQUXZ4d.js";import{n as t}from"./signal-store-0zk-69gB.js";async function*n(e){yield`<!DOCTYPE html>`;for await(let t of e)t[1]&&(yield t[1])}async function*r(t){let n=new Set(t.map(t=>t.then(({index:t,node:n})=>({index:t,virtualNode:e({node:n,asyncComponents:[]})})).catch(e=>({error:e}))));for(;n.size>0;){let e=await Promise.race(n);for(let t of n)t.then(r=>{r===e&&n.delete(t)}).catch(r=>{r===e&&n.delete(t)});`virtualNode`in e&&(yield e)}}async function*i({key:e,val:n,trailingComma:r,output:i}){if(typeof n==`string`||typeof n==`number`){e===`className`&&(e=`class`);let t=typeof n==`number`?String(n):`"${String(n)}"`;return yield i(`${r?`,`:``}"${e}":${t}`,` ${e}="${String(n)}"`),!0}if(n instanceof t.State||n instanceof t.Computed)return yield i(`${r?`,`:``}"${e}":"${String(n.get())}"`,` ${e}="${String(n.get())}"`),!0;if(Array.isArray(n)){let a=n.map(e=>e instanceof t.State||e instanceof t.Computed?String(e.get()):String(e)).join(` `);return yield i(`${r?`,`:``}"${e}":"${a}"`,` ${e}="${a}"`),!0}}const a=new Set([`area`,`base`,`br`,`col`,`embed`,`hr`,`img`,`input`,`link`,`meta`,`source`,`track`,`wbr`]);async function*o({virtualNode:e,asyncVirtualNodes:t,leadingComma:n=!1,rscBuffer:r=[]}){let s=(e,t)=>(e&&r.push(e),[e,t]),c=(e,t)=>s(e,null);if(Array.isArray(e))for(let i of e)yield*o({virtualNode:i,asyncVirtualNodes:t,leadingComma:n,rscBuffer:r}),n=!0;else if(e?.type===`element`){yield s(`${n?`,`:``}["E","${e.value}",${e.key?`"${e.key}"`:`null`},{`,`<${e.value}`);let c=!0;for(let[t,n]of Object.entries(e.props))t!==`children`&&(yield*i({key:t,val:n,trailingComma:!c,output:s}))&&(c=!1);if(yield s(null,a.has(e.value)?` />`:`>`),e.children.length>0){let n=!0;yield s(`${c?``:`,`}"children":[`,null);for(let i of e.children)(yield*o({virtualNode:i,asyncVirtualNodes:t,leadingComma:!n,rscBuffer:r}))&&(n=!1);e.value!==`html`&&(yield s(`]`,null))}if(e.value===`body`){if(r.length>0){let e=r.join(``);r.length=0,yield[null,`<script>(self.__RSC||=[]).push('${e}}]]}]');<\/script>`]}yield[`}]]}]`,null];for await(let e of t){let n=[];yield[`
2
- `,`<template data-id="async-template-${e.index}">`],yield*o({virtualNode:e.virtualNode,asyncVirtualNodes:t,leadingComma:!1,rscBuffer:n}),yield[null,`</template>`],yield[null,`<script>(self.__RSC||=[]).push('${n.join(``)}');<\/script>`],yield[null,`<script>
1
+ import{t as e}from"./virtual-from-jsx-BgQUXZ4d.js";import{n as t}from"./signal-store-0zk-69gB.js";async function*n(e){yield`<!DOCTYPE html>`;for await(let t of e)t[1]&&(yield t[1])}async function*r(t){let n=new Set(t.map(t=>t.then(({index:t,node:n})=>({index:t,virtualNode:e({node:n,asyncComponents:[]})})).catch(e=>({error:e}))));for(;n.size>0;){let e=await Promise.race(n);for(let t of n)t.then(r=>{r===e&&n.delete(t)}).catch(r=>{r===e&&n.delete(t)});`virtualNode`in e&&(yield e)}}async function*i({key:e,val:n,trailingComma:r,output:i}){if(typeof n==`string`||typeof n==`number`){e===`className`&&(e=`class`);let t=typeof n==`number`?String(n):`"${String(n)}"`;return yield i(`${r?`,`:``}"${e}":${t}`,` ${e}="${String(n)}"`),!0}if(n instanceof t.State||n instanceof t.Computed)return yield i(`${r?`,`:``}"${e}":"${String(n.get())}"`,` ${e}="${String(n.get())}"`),!0;if(Array.isArray(n)){let a=n.map(e=>e instanceof t.State||e instanceof t.Computed?String(e.get()):String(e)).join(` `);return yield i(`${r?`,`:``}"${e}":"${a}"`,` ${e}="${a}"`),!0}}const a=new Set([`area`,`base`,`br`,`col`,`embed`,`hr`,`img`,`input`,`link`,`meta`,`source`,`track`,`wbr`]);async function*o({virtualNode:e,asyncVirtualNodes:t,leadingComma:n=!1,rscBuffer:r=[]}){let s=(e,t)=>(e&&r.push(e),[e,t]),c=(e,t)=>s(e,null);if(Array.isArray(e))for(let i of e)yield*o({virtualNode:i,asyncVirtualNodes:t,leadingComma:n,rscBuffer:r}),n=!0;else if(e?.type===`element`){yield s(`${n?`,`:``}["E","${e.value}",${e.key?`"${e.key}"`:`null`},{`,`<${e.value}`);let c=!0;for(let[t,n]of Object.entries(e.props))t!==`children`&&(yield*i({key:t,val:n,trailingComma:!c,output:s}))&&(c=!1);if(yield s(null,a.has(e.value)?` />`:`>`),e.children.length>0){let n=!0;yield s(`${c?``:`,`}"children":[`,null);for(let i of e.children)(yield*o({virtualNode:i,asyncVirtualNodes:t,leadingComma:!n,rscBuffer:r}))&&(n=!1);e.value!==`html`&&(yield s(`]`,null))}if(e.value===`body`){if(r.length>0){let e=r.join(``);r.length=0,yield[null,`<script>(self.__RSC||=[]).push(\`${e}}]]}]\`);<\/script>`]}yield[`}]]}]`,null];for await(let e of t){let n=[];yield[`
2
+ `,`<template data-id="async-template-${e.index}">`],yield*o({virtualNode:e.virtualNode,asyncVirtualNodes:t,leadingComma:!1,rscBuffer:n}),yield[null,`</template>`],yield[null,`<script>(self.__RSC||=[]).push(\`${n.join(``)}\`);<\/script>`],yield[null,`<script>
3
3
  (() => {
4
4
  const placeholder = document.querySelector(\`${`template[data-id="async-placeholder-${e.index}"]`}\`);
5
5
  // console.log("placeholder",placeholder);
package/dist/server.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { t as ClientComponent } from "./types-BzglvZrW.js";
2
- import { t as registerServerFunction } from "./register-server-function-BuqMxh0V.js";
1
+ import { t as ClientComponent } from "./types-DA3_gaOB.js";
2
+ import { t as registerServerFunction } from "./register-server-function-DoOVejlg.js";
3
3
 
4
4
  //#region src/server/register-client-reference.d.ts
5
5
  declare const registerClientReference: (_fn: () => void, path: string, name: string) => ClientComponent;
@@ -3,6 +3,11 @@ declare namespace JSX {
3
3
  type ElementType = (keyof IntrinsicElements & string) | FunctionComponent<any> | ClientComponent | FragmentComponent;
4
4
  interface IntrinsicElements {
5
5
  [key: string]: any;
6
+ a: {
7
+ href: "/page1" | "/page2" | `https://${string}`;
8
+ children?: RenkuNode | RenkuNode[];
9
+ class?: string | string[];
10
+ };
6
11
  }
7
12
  type Element<T extends ElementType = ElementType> = {
8
13
  type: T;
@@ -1,5 +1,5 @@
1
1
  import { n as AuthFn } from "./types-BStlw_FH.js";
2
- import { r as FunctionComponent } from "./types-BzglvZrW.js";
2
+ import { r as FunctionComponent } from "./types-DA3_gaOB.js";
3
3
 
4
4
  //#region src/router/types.d.ts
5
5
  type Path = `/${string}`;
@@ -1,3 +1,5 @@
1
+ import { Signal } from "signal-polyfill";
2
+
1
3
  //#region src/reactivity/types.d.ts
2
4
  type Loader<T> = {
3
5
  status: "loading";
@@ -13,4 +15,4 @@ type Loader<T> = {
13
15
  data: null;
14
16
  };
15
17
  //#endregion
16
- export { Loader as t };
18
+ export { Signal as n, Loader as t };
package/dist/ui.d.ts CHANGED
@@ -1,27 +1,6 @@
1
- import { o as RenkuNode, r as FunctionComponent } from "./types-BzglvZrW.js";
2
- import { t as Signal } from "./signal-CqB2Ey1W.js";
1
+ import { r as FunctionComponent } from "./types-DA3_gaOB.js";
3
2
 
4
- //#region src/ui/Button.d.ts
5
- interface ButtonProps {
6
- variant?: "primary" | "secondary" | "destructive";
7
- onClick?: () => void;
8
- disabled?: boolean;
9
- }
10
- declare const Button: FunctionComponent<ButtonProps>;
3
+ //#region src/ui/Badge.d.ts
4
+ declare const Badge: FunctionComponent<{}>;
11
5
  //#endregion
12
- //#region src/ui/Input.d.ts
13
- type InputProps = {
14
- id?: string;
15
- value: Signal.State<string>;
16
- type?: "text" | "email";
17
- disabled?: boolean;
18
- };
19
- declare const Input: FunctionComponent<InputProps>;
20
- //#endregion
21
- //#region src/ui/Form.d.ts
22
- declare const Form: FunctionComponent<{
23
- action: string;
24
- children: RenkuNode;
25
- }>;
26
- //#endregion
27
- export { Button, Form, Input };
6
+ export { Badge };
package/dist/ui.js CHANGED
@@ -1 +1 @@
1
- import"./fragment-Chv9FEhP.js";import{n as e}from"./jsx-runtime-DvEc5zft.js";const t=({children:t,variant:n,onClick:r,disabled:i})=>{let a=`bg-primary`,o=`hover:bg-primary/90`,s=`text-primary-foreground`;switch(n){case`secondary`:a=`bg-secondary`,o=`hover:bg-secondary/80`,s=`text-secondary-foreground`;break;case`destructive`:a=`bg-destructive`,o=`hover:bg-destructive/90`,s=`text-primary-foreground`;break}return e(`button`,{type:`submit`,class:[`inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 shadow h-9 px-4 py-2`,a,s,o],onclick:r,disabled:i,children:t})},n=({id:t,value:n,type:r=`text`,disabled:i})=>e(`input`,{id:t,value:n,type:r,class:[`inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 shadow h-9 px-4 py-2`],disabled:i,onchange:e=>n.set(e.target.value)}),r=({action:t,children:n})=>e(`form`,{method:`post`,action:t,onsubmit:async e=>{e.preventDefault();let t=e.target;if(!(t instanceof HTMLFormElement))return!1;let n=new FormData(t),r=await fetch(t.action,{method:`POST`,body:n});console.log(`res`,r)},children:n});export{t as Button,r as Form,n as Input};
1
+ import"./fragment-Chv9FEhP.js";import{n as e}from"./jsx-runtime-DvEc5zft.js";const t=({children:t})=>e(`div`,{class:[`bg-red-500`],children:t});export{t as Badge};
@@ -0,0 +1 @@
1
+ import{t as e}from"./virtual-from-jsx-BgQUXZ4d.js";import{n as t}from"./signal-store-0zk-69gB.js";import{t as n}from"./effect-hmzj-Jig.js";function r({domNode:e,virtualNode:t,replace:n=!1}){let r=[];for(let i of t){let t=a({domNode:e,virtualNode:i,replace:n});n=!1,r.push(t)}return r}const i=({element:e,key:r,val:i})=>{typeof i==`function`?r.startsWith(`on`)&&e.addEventListener(r.slice(2),i):typeof i==`string`||typeof i==`number`?(r===`className`&&(r=`class`),e.setAttribute(r,String(i))):i instanceof t.State||i instanceof t.Computed?n(()=>{e.setAttribute(r,String(i.get()))}):Array.isArray(i)?n(()=>{let n=i.map(e=>e instanceof t.State||e instanceof t.Computed?String(e.get()):String(e)).join(` `);e.setAttribute(r,n)}):typeof i==`boolean`&&(i?e.setAttribute(r,``):e.removeAttribute(r))};function a({domNode:t,virtualNode:s,replace:c=!1}){if(!s)return null;let l=[`svg`,`path`,`circle`];if(s.type===`element`){let e=l.includes(s.value)?document.createElementNS(`http://www.w3.org/2000/svg`,s.value):document.createElement(s.value);if(s.domNode=e,s.props.ref){let e=s.props.ref;console.log(`has ref`,e.get()),e.set(s.domNode),console.log(`assigned ref`,s.domNode),console.log(`has ref`,e.get())}for(let[t,n]of Object.entries(s.props))t!==`children`&&t!==`key`&&t!==`ref`&&i({element:e,key:t,val:n});if(s.children)for(let t of s.children)a({domNode:e,virtualNode:t});return t===document.documentElement?document.documentElement.replaceWith(e):c&&t.parentElement?t.parentElement.replaceChild(e,t):t.appendChild(e),e}if(s.type===`async`){let n=document.createElement(`template`);return s.domNode=n,t.appendChild(n),s.promise?.then(t=>{let i=e({node:t});Array.isArray(i)?r({domNode:n,virtualNode:i,replace:!0}):a({domNode:n,virtualNode:i,replace:!0})}),n}if(s.type===`text`){let e=document.createTextNode(s.value);return s.domNode=e,t.appendChild(e),e}if(s.type===`signal`){let e=s.value,r=document.createTextNode(``);return s.domNode=r,n(()=>{r.textContent=String(e.get())}),t.appendChild(r),r}if(s.type===`effect`){let e=s.value,n=null,r=null,i=e=>{Array.isArray(e)?console.warn(`EFFECT virtual node is array`):n?(n=o({domNode:n,newVirtualNode:e,oldVirtualNode:r}),r=e):(n=a({domNode:t,virtualNode:e,replace:c}),r=e,e=null)};s.addCallback(i),i(e)}return null}const o=({domNode:e,newVirtualNode:t,oldVirtualNode:n})=>{if(t&&n)if(t.type===n.type)if(t.type===`element`&&n.type===`element`)if(t.value===n.value){let r=e,s=n.props?Object.keys(n.props).filter(e=>!(e in t.props)):[];s.length&&s.map(e=>r.removeAttribute(e));for(let[e,a]of Object.entries(t.props))if(e!==`children`&&e!==`key`)if(n.props&&e in n.props){let t=n.props[e];typeof a==`function`||(Array.isArray(a)&&Array.isArray(t)?JSON.stringify(a)!==JSON.stringify(t)&&i({element:r,key:e,val:a}):n.props[e]!==a&&i({element:r,key:e,val:a}))}else i({element:r,key:e,val:a});if(t.children.length){let e=0;for(let i=0;i<t.children.length;i++){let s=t.children[i];if(s){let t=n.children?n.children[i-e]:void 0;if(t?.domNode)if(s.key===t.key)s.domNode=t.domNode,o({domNode:t.domNode,newVirtualNode:s,oldVirtualNode:t});else{let i=n.children.findIndex(e=>e?.key===s.key),a=i>-1?n.children[i]:null;a?.domNode&&(r.moveBefore(a.domNode,t.domNode),s.domNode=a.domNode,e++,o({domNode:a.domNode,newVirtualNode:s,oldVirtualNode:a}),n.children.splice(i,1))}else s.type!==`effect`&&a({domNode:r,virtualNode:s});n.children[i-e]=null}}if(n.children.length+e>t.children.length)for(let i=t.children.length;i<n.children.length+e;i++){let t=n.children[i-e]?.domNode;t&&r.removeChild(t)}}else n.children?.length&&r.replaceChildren()}else console.log(`Different node types`),n.domNode&&a({domNode:n.domNode,virtualNode:t,replace:!0});else t.type===`text`&&n.type===`text`&&t.value!==n.value&&(t.domNode=n.domNode,t.domNode.nodeValue=t.value);else console.warn(`Different node types`),n.domNode&&a({domNode:n.domNode,virtualNode:t,replace:!0});else console.warn(`Old or new node is null`);return e};export{a as n,r,o as t};
package/package.json CHANGED
@@ -1,9 +1,19 @@
1
1
  {
2
2
  "name": "renku",
3
3
  "description": "Renku",
4
- "version": "0.0.2",
4
+ "version": "0.0.3",
5
5
  "type": "module",
6
6
  "private": false,
7
+ "homepage": "https://renku.dev",
8
+ "bugs": {
9
+ "url": "https://github.com/renkudev/renku/issues"
10
+ },
11
+ "author": {
12
+ "name": "Benedikt Müller",
13
+ "email": "ben@renku.dev",
14
+ "url": "http://bndkt.com"
15
+ },
16
+ "repository": "github:renkudev/renku",
7
17
  "files": [
8
18
  "dist",
9
19
  "package.json",
@@ -14,7 +24,7 @@
14
24
  "lint": "oxlint",
15
25
  "tsc": "tsc",
16
26
  "build": "PREVIEW=true tsdown",
17
- "pub": "bun run build && bun publish",
27
+ "pub": "bun run build && bun publish --dry-run",
18
28
  "generate-types": "wrangler -c src/cloudflare/wrangler.jsonc types src/cloudflare/worker-configuration.d.ts"
19
29
  },
20
30
  "imports": {
@@ -31,15 +41,15 @@
31
41
  "import": "./dist/index.js"
32
42
  },
33
43
  "./auth": {
34
- "types:": "./dist/auth.d.ts",
44
+ "types": "./dist/auth.d.ts",
35
45
  "import": "./dist/auth.js"
36
46
  },
37
47
  "./bun": {
38
- "types:": "./dist/bun.d.ts",
48
+ "types": "./dist/bun.d.ts",
39
49
  "import": "./dist/bun.js"
40
50
  },
41
51
  "./client": {
42
- "types:": "./dist/client.d.ts",
52
+ "types": "./dist/client.d.ts",
43
53
  "import": "./dist/client.js"
44
54
  },
45
55
  "./cloudflare": {
@@ -78,7 +88,7 @@
78
88
  "types": "./dist/server-functions.d.ts",
79
89
  "import": "./dist/server-functions.js"
80
90
  },
81
- "./tsconfig": "./dist/tsconfig.base.json",
91
+ "./tsconfig": "./tsconfig.base.json",
82
92
  "./vite": {
83
93
  "types": "./dist/vite.d.ts",
84
94
  "import": "./dist/vite.js"
@@ -94,9 +104,9 @@
94
104
  "@stricli/auto-complete": "1.2.4",
95
105
  "@stricli/core": "1.2.4",
96
106
  "@types/bun": "1.3.3",
97
- "tsdown": "0.16.6",
107
+ "tsdown": "0.17.0-beta.4",
98
108
  "typescript": "5.9.3",
99
- "vite": "7.2.7",
100
- "wrangler": "4.50.0"
109
+ "vite": "7.2.4",
110
+ "wrangler": "4.51.0"
101
111
  }
102
112
  }
@@ -1,2 +0,0 @@
1
- import{n as e,r as t,t as n}from"./auth-DivcgvqR.js";import{n as r,r as i,t as a}from"./rsc-from-markup-lvVZNq4O.js";import{t as o}from"./get-route-B1JNCPoL.js";import{newWorkersRpcResponse as s}from"capnweb";import{clientEntry as c}from"virtual:renku";const l=({namespace:e,name:t,ws:n})=>async(r,i)=>{if(console.log(`🔥`,`DO handler`,typeof t),n){let e=r.headers.get(`Upgrade`);if(!e||e!==`websocket`)return new Response(`Durable Object expected Upgrade: websocket`,{status:426})}if(typeof t==`function`){let e=r.clone();t=await t(e)}return i[e].getByName(t).fetch(r)},u=({rpId:e,rpName:t,sessionExpiryInMinutes:r})=>{r??=60;let i=e=>e*60*1e3;return{"/validate-session":{GET:async(e,t,r)=>n().sessionId?Response.json({isAuthenticated:!0}):Response.json({isAuthenticated:!1})},"/logout":{POST:async(e,t,r)=>{let a=n();a.sessionId&&await t.AUTH_DO.getByName(`session:${a.sessionId}`).logout();let o=new Date(Date.now()-i(10)).toUTCString();return new Response(null,{headers:{"Set-Cookie":`sessionId=; Path=/; SameSite=Strict; Secure; Expires=${o}`}})},GET:async(e,t,r)=>{let a=n();a.sessionId&&await t.AUTH_DO.getByName(`session:${a.sessionId}`).logout();let o=new Date(Date.now()-i(10)).toUTCString();return new Response(null,{status:302,headers:{Location:`/`,"Set-Cookie":`sessionId=; Path=/; SameSite=Strict; Secure; Expires=${o}`}})}},"/creation-options":{POST:async(n,r,i)=>{let{email:a}=await n.json(),o=crypto.randomUUID(),s=await r.AUTH_DO.getByName(`user:${o}`).creationOptions({id:o,email:a,rpId:e,rpName:t});return Response.json(s)}},"/validate-creation":{POST:async(e,t,n)=>{let{name:r,credential:i}=await e.json();return await t.AUTH_DO.getByName(`user:${r}`).validateCreation({name:r,credential:i}),Response.json({ok:!0})}},"/request-options":{POST:async(t,n,r)=>{let i=crypto.randomUUID(),a=await n.AUTH_DO.getByName(`challenge:${i}`).requestOptions({rpId:e});return Response.json({id:i,options:a})}},"/validate-request":{POST:async(e,t,n)=>{let{id:a,credential:o}=await e.json(),s=await t.AUTH_DO.getByName(`challenge:${a}`).validateRequest({credential:o,sessionExpiryInMinutes:r});if(s){let e=new Date(Date.now()+i(r)).toUTCString();return Response.json({success:!0},{headers:{"Set-Cookie":`sessionId=${s}; Path=/; SameSite=Strict; Secure; Expires=${e}`}})}return Response.json({error:!0})}}}},d=e=>{let t={};if(!e)return t;let n=e.split(`;`);for(let e of n){let n=e.indexOf(`=`);if(n===-1)continue;let r=e.slice(0,n).trim(),i=e.slice(n+1).trim();r&&(t[r]=i)}return t},f=async({request:t,env:n,authFn:r})=>{let i=e(),a=d(t.headers.get(`cookie`));if(`sessionId`in a&&a.sessionId){if(i.sessionId=a.sessionId,n?.AUTH_DO){let e=await n.AUTH_DO.getByName(`session:${i.sessionId}`).validateSession({sessionExpiryInMinutes:1440});e&&(i.userId=e.userId)}}else i.sessionId=null;return r?r({request:t,authContext:i}):!0},p=new TextEncoder,m=e=>{let t=e[Symbol.asyncIterator]();return new ReadableStream({async pull(e){let{value:n,done:r}=await t.next();if(r)e.close();else{let t=typeof n==`object`?JSON.stringify(n).concat(`
2
- `):n;e.enqueue(p.encode(t))}}})},h=[`favicon.ico`,`.well-known`],g=({routes:e})=>async(n,l,u)=>t(async()=>{let t=new URL(n.url).pathname.split(`/`),d=t[1];if(d&&h.includes(d))return new Response(null,{status:404});let p=o({request:n,routes:e}),g=await f({request:n,env:l,authFn:p?p.auth:null});if(g!==!0)return g||new Response(null,{status:401});if(d===`@renku`){if(t[2]===`rpc`&&t[3]&&t[4]){let e=decodeURIComponent(t[3]),r=decodeURIComponent(t[4]);import.meta.env.DEV||(e=`./functions/${e}.js`),console.log(`☎️ Server function was called:`,e,r);let i=(await import(e))[r];return s(n,i)}return new Response(null,{status:404})}if(!p)return console.warn(`No routing result`),new Response(null,{status:404});if(p.api){let e=Object.assign(n,{params:p.params});return p.api(e,l,u)}let _=null;if(p.route instanceof Promise)_=await(await p.route).default(p.params);else if(p.route&&`default`in p.route&&typeof p.route.default==`function`)_=await p.route.default(p.params);else if(typeof p.route==`function`)_=await p.route(p.params);else return new Response(null,{status:404});let v={styles:[],modules:[]};import.meta.env.DEV?(v.modules.push(`/@vite/client`),v.modules.push(`/@renku/client`)):c&&v.modules.push(c);for(let e of p.layouts)e instanceof Promise?_=await(await e).default({children:_,_renku:v}):`default`in e&&typeof e.default==`function`?_=await e.default({children:_,_renku:v}):typeof e==`function`&&(_=await e({children:_,_renku:v}));let y=r(_);if(n.headers.get(`Accept`)===`text/x-component`){let e=m(a(y));return new Response(e,{headers:{"Content-Type":`text/x-component`}})}let b=m(i(y));return new Response(b,{headers:{"Content-Type":`text/html`}})}),_=({routes:e})=>({fetch:g({routes:e})});export{u as n,l as r,_ as t};
@@ -1 +0,0 @@
1
- import{t as e}from"./virtual-from-jsx-BgQUXZ4d.js";import{n as t}from"./signal-store-0zk-69gB.js";import{t as n}from"./effect-hmzj-Jig.js";function r({domNode:e,virtualNode:t,replace:n=!1}){let r=[];for(let i of t){let t=o({domNode:e,virtualNode:i,replace:n});n=!1,r.push(t)}return r}const i=({element:e,key:r,val:i})=>{typeof i==`function`?r.startsWith(`on`)&&e.addEventListener(r.slice(2),i):typeof i==`string`||typeof i==`number`?(r===`className`&&(r=`class`),e.setAttribute(r,String(i))):i instanceof t.State||i instanceof t.Computed?n(()=>{e.setAttribute(r,String(i.get()))}):Array.isArray(i)?n(()=>{let n=i.map(e=>e instanceof t.State||e instanceof t.Computed?String(e.get()):String(e)).join(` `);e.setAttribute(r,n)}):typeof i==`boolean`&&(i?e.setAttribute(r,``):e.removeAttribute(r))},a=({domNode:e,newVirtualNode:t,oldVirtualNode:n})=>{if(t&&n)if(t.type===n.type)if(t.type===`element`&&n.type===`element`){let r=e,s=n.props?Object.keys(n.props).filter(e=>!(e in t.props)):[];s.length&&s.map(e=>r.removeAttribute(e));for(let[e,a]of Object.entries(t.props))if(e!==`children`&&e!==`key`)if(n.props&&e in n.props){let t=n.props[e];typeof a==`function`||(Array.isArray(a)&&Array.isArray(t)?JSON.stringify(a)!==JSON.stringify(t)&&i({element:r,key:e,val:a}):n.props[e]!==a&&i({element:r,key:e,val:a}))}else i({element:r,key:e,val:a});if(t.children.length){let e=0;for(let i=0;i<t.children.length;i++){let s=t.children[i];if(s){let t=n.children?n.children[i-e]:void 0;if(t?.domNode)if(s.key===t.key)s.domNode=t.domNode,a({domNode:t.domNode,newVirtualNode:s,oldVirtualNode:t});else{let i=n.children.findIndex(e=>e?.key===s.key),o=i>-1?n.children[i]:null;o?.domNode&&(r.moveBefore(o.domNode,t.domNode),s.domNode=o.domNode,e++,a({domNode:o.domNode,newVirtualNode:s,oldVirtualNode:o}),n.children.splice(i,1))}else s.type!==`effect`&&o({domNode:r,virtualNode:s});n.children[i-e]=null}}if(n.children.length+e>t.children.length)for(let i=t.children.length;i<n.children.length+e;i++){let t=n.children[i-e]?.domNode;t&&r.removeChild(t)}}else n.children?.length&&r.replaceChildren()}else t.type===`text`&&n.type===`text`&&t.value!==n.value&&(t.domNode=n.domNode,t.domNode.nodeValue=t.value);else console.warn(`Different node types`),n.domNode&&o({domNode:n.domNode,virtualNode:t,replace:!0});else console.warn(`Old or new node is null`);return e};function o({domNode:t,virtualNode:s,replace:c=!1}){if(!s)return null;let l=[`svg`,`path`,`circle`];if(s.type===`element`){let e=l.includes(s.value)?document.createElementNS(`http://www.w3.org/2000/svg`,s.value):document.createElement(s.value);if(s.domNode=e,s.props.ref){let e=s.props.ref;console.log(`has ref`,e.get()),e.set(s.domNode),console.log(`assigned ref`,s.domNode),console.log(`has ref`,e.get())}for(let[t,n]of Object.entries(s.props))t!==`children`&&t!==`key`&&t!==`ref`&&i({element:e,key:t,val:n});if(s.children)for(let t of s.children)o({domNode:e,virtualNode:t});return t===document.documentElement?document.documentElement.replaceWith(e):c&&t.parentElement?t.parentElement.replaceChild(e,t):t.appendChild(e),e}if(s.type===`async`){let n=document.createElement(`template`);return s.domNode=n,t.appendChild(n),s.promise?.then(t=>{let i=e({node:t});Array.isArray(i)?r({domNode:n,virtualNode:i,replace:!0}):o({domNode:n,virtualNode:i,replace:!0})}),n}if(s.type===`text`){let e=document.createTextNode(s.value);return s.domNode=e,t.appendChild(e),e}if(s.type===`signal`){let e=s.value,r=document.createTextNode(``);return s.domNode=r,n(()=>{r.textContent=String(e.get())}),t.appendChild(r),r}if(s.type===`effect`){let e=s.value,n=null,r=null,i=e=>{Array.isArray(e)?console.warn(`EFFECT virtual node is array`):n?(n=a({domNode:n,newVirtualNode:e,oldVirtualNode:r}),r=e):(n=o({domNode:t,virtualNode:e,replace:c}),r=e,e=null)};s.addCallback(i),i(e)}return null}export{r as n,o as t};
@@ -1,2 +0,0 @@
1
- import { Signal } from "signal-polyfill";
2
- export { Signal as t };