frontend-hamroun 1.1.59 → 1.1.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -0
- package/package.json +1 -1
- package/templates/basic-app/package.json +20 -19
- package/templates/basic-app/src/main.tsx +9 -5
- package/templates/basic-app/tsconfig.json +13 -4
- package/templates/basic-app/esbuild.config.js +0 -28
- package/templates/basic-app/server.js +0 -24
- package/templates/basic-app/src/jsx-shim.ts +0 -4
package/dist/index.d.ts
CHANGED
@@ -6,5 +6,6 @@ export { render, hydrate } from './renderer';
|
|
6
6
|
export { renderToString } from './server-renderer';
|
7
7
|
export { Link } from './link';
|
8
8
|
export { useRouter, useRoute, useParams, useSearchParams, navigate } from './router';
|
9
|
+
export { createElement } from './jsx-runtime';
|
9
10
|
export type { Context } from './context';
|
10
11
|
export type { VNode } from './types';
|
package/dist/index.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});let e=!1;const t=[];function n(n){if(e)t.push(n);else{e=!0;try{for(n();t.length>0;){const e=t.shift();null==e||e()}}finally{e=!1}}}let r=0;const o=new Map,s=new Map,a=new Map,c=new Map,i=new Map;let l=null,u=null,p=null;const f="undefined"==typeof window,d=new Map;function h(e,t,n){l=e,u=n,p=t}function w(){return r++,s.set(r,0),r}function y(){f&&d.delete(r),r=0}function m(t){if(!r)throw new Error("useState must be called within a render");if(f){d.has(r)||d.set(r,new Map);const e=d.get(r),n=s.get(r)||0;e.has(n)||e.set(n,t);const o=e.get(n),a=e=>{};return s.set(r,n+1),[o,a]}o.has(r)||o.set(r,[]);const a=o.get(r),c=s.get(r);c>=a.length&&a.push(t);const i=a[c];return s.set(r,c+1),[i,t=>{const o="function"==typeof t?t(a[c]):t;a[c]!==o&&(a[c]=o,e?n((()=>x(r))):x(r))}]}function g(e,t){if(!r)throw new Error("useEffect must be called within a render");const n=s.get(r);a.has(r)||a.set(r,[]);const o=a.get(r),c=o[n];c&&t&&c.deps&&!t.some(((e,t)=>e!==c.deps[t]))||((null==c?void 0:c.cleanup)&&c.cleanup(),queueMicrotask((()=>{const r=e()||void 0;o[n]={cleanup:r,deps:t}}))),s.set(r,n+1)}async function x(e){try{const t=a.get(e);t&&(t.forEach((e=>{e.cleanup&&e.cleanup()})),a.set(e,[])),l&&u&&p&&await l(p,u)}catch(t){console.error("Error during rerender:",t)}}function b(e,t){console.log("JSX Transform:",{type:e,props:t});const n={...t};return arguments.length>2&&(n.children=Array.prototype.slice.call(arguments,2)),{type:e,props:n}}async function v(e){var t;if(console.log("Creating element from:",e),null==e)return document.createTextNode("");if("boolean"==typeof e)return document.createTextNode("");if("number"==typeof e||"string"==typeof e)return document.createTextNode(String(e));if(Array.isArray(e)){const t=document.createDocumentFragment();for(const n of e){const e=await v(n);t.appendChild(e)}return t}if("type"in e&&void 0!==e.props){const{type:r,props:o}=e;if("function"==typeof r)try{const e=await r(o||{}),t=await v(e);return t instanceof Element&&t.setAttribute("data-component-id",r.name||r.toString()),t}catch(n){return console.error("Error rendering component:",n),document.createTextNode("")}const s=document.createElement(r);for(const[e,n]of Object.entries(o||{}))if("children"!==e)if(e.startsWith("on")&&"function"==typeof n){const r=e.toLowerCase().slice(2),o=null==(t=s.__events)?void 0:t[r];o&&s.removeEventListener(r,o),s.addEventListener(r,n),s.__events||(s.__events={}),s.__events[r]=n}else"style"===e&&"object"==typeof n?Object.assign(s.style,n):"className"===e?s.setAttribute("class",String(n)):"key"!==e&&"ref"!==e&&s.setAttribute(e,String(n));const a=null==o?void 0:o.children;if(null!=a){const e=Array.isArray(a)?a.flat():[a];for(const t of e){const e=await v(t);s.appendChild(e)}}return s}return document.createTextNode(String(e))}let S=!1;async function E(e,t){console.log("Rendering to:",t.id),n((async()=>{w();try{h(E,e,t);const n=await v(e);S||(t.innerHTML=""),t.appendChild(n)}finally{y()}}))}function j(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}let A={pathname:"undefined"!=typeof window?window.location.pathname:"/",search:"undefined"!=typeof window?window.location.search:"",hash:"undefined"!=typeof window?window.location.hash:"",params:{}};const M=new Set;function C(e,t={}){"undefined"!=typeof window&&function(e,t={}){const n=new URL(e,window.location.origin),r={pathname:n.pathname,search:n.search,hash:n.hash,params:{}};t.replace?window.history.replaceState(r,"",n.toString()):window.history.pushState(r,"",n.toString()),A=r,M.forEach((e=>e(r))),t.scroll&&window.scrollTo(0,0)}(e,t)}function L(){const[e,t]=m(A);return g((()=>{const e=e=>{t(e)},n=()=>{A={pathname:window.location.pathname,search:window.location.search,hash:window.location.hash,params:{}},t(A)};return M.add(e),window.addEventListener("popstate",n),()=>{M.delete(e),window.removeEventListener("popstate",n)}}),[]),{...e,push:(e,t)=>C(e,t),replace:(e,t)=>C(e,{...t,replace:!0}),back:()=>window.history.back(),forward:()=>window.history.forward()}}exports.Fragment=({children:e})=>e,exports.Link=function({href:e,children:t,replace:n=!1,className:r,style:o,...s}){return{type:"a",props:{href:e,onClick:t=>{t.preventDefault(),C(e,{replace:n})},className:r,style:o,...s,children:t}}},exports.batchUpdates=n,exports.createContext=function(e){return{Provider:({value:e,children:t})=>t,Consumer:({children:t})=>t(e),_id:Symbol(),useSelector:t=>t(e)}},exports.hydrate=async function(e,t){S=!0;try{await E(e,t)}finally{S=!1}},exports.jsx=b,exports.jsxs=b,exports.navigate=C,exports.render=E,exports.renderToString=async function e(t){w(),h((()=>{}),t,null);try{if(null==t)return"";if("boolean"==typeof t)return"";if("number"==typeof t||"string"==typeof t)return j(String(t));if(Array.isArray(t)){return(await Promise.all(t.map(e))).join("")}if("type"in t&&void 0!==t.props){const{type:o,props:s}=t;if("function"==typeof o)try{w();const t=await o(s||{}),n=await e(t);return y(),n}catch(r){return console.error("Error rendering component:",r),""}let a=`<${o}`;for(const[e,t]of Object.entries(s||{}))"children"!==e&&("className"===e?a+=` class="${j(String(t))}"`:"style"===e&&"object"==typeof t?a+=` style="${n=t||{},Object.entries(n).map((([e,t])=>{return`${n=e,n.replace(/[A-Z]/g,(e=>"-"+e.toLowerCase()))}:${t}`;var n})).join(";")}"`:e.startsWith("on")||(a+=` ${e}="${j(String(t))}"`));if(new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]).has(o))return a+"/>";if(a+=">",null==s?void 0:s.children){const t=Array.isArray(s.children)?s.children:[s.children];a+=(await Promise.all(t.map(e))).join("")}return a+`</${o}>`}return j(String(t))}finally{y()}var n},exports.useContext=function(e){return e},exports.useEffect=g,exports.useErrorBoundary=function(){const[e,t]=m(null);return[e,()=>t(null)]},exports.useMemo=function(e,t){if(!r)throw new Error("useMemo must be called within a render");const n=s.get(r);c.has(r)||c.set(r,[]);const o=c.get(r),a=o[n];if(!a||t&&t.some(((e,t)=>!Object.is(e,a.deps[t])))){const a=e();return o[n]={value:a,deps:t},s.set(r,n+1),a}return s.set(r,n+1),a.value},exports.useParams=function(){return L().params},exports.useRef=function(e){if(!r)throw new Error("useRef must be called within a render");const t=s.get(r);i.has(r)||i.set(r,[]);const n=i.get(r);if(t>=n.length){const o={current:e};return n.push(o),s.set(r,t+1),o}const o=n[t];return s.set(r,t+1),o},exports.useRoute=function(e){const{pathname:t}=L(),[n,r]=m({}),[o,s]=m(!1);return g((()=>{const n=function(e,t){const n=[],r=e.replace(/:([^/]+)/g,((e,t)=>(n.push(t),"([^/]+)"))),o=t.match(new RegExp(`^${r}$`));if(!o)return null;const s={};return n.forEach(((e,t)=>{s[e]=o[t+1]})),s}(e,t);s(!!n),r(n||{})}),[e,t]),{isMatch:o,params:n}},exports.useRouter=L,exports.useSearchParams=function(){const{search:e}=L();return new URLSearchParams(e)},exports.useState=m;
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});let e=!1;const t=[];function n(n){if(e)t.push(n);else{e=!0;try{for(n();t.length>0;){const e=t.shift();null==e||e()}}finally{e=!1}}}let r=0;const o=new Map,s=new Map,a=new Map,c=new Map,i=new Map;let l=null,u=null,p=null;const f="undefined"==typeof window,d=new Map;function h(e,t,n){l=e,u=n,p=t}function w(){return r++,s.set(r,0),r}function y(){f&&d.delete(r),r=0}function m(t){if(!r)throw new Error("useState must be called within a render");if(f){d.has(r)||d.set(r,new Map);const e=d.get(r),n=s.get(r)||0;e.has(n)||e.set(n,t);const o=e.get(n),a=e=>{};return s.set(r,n+1),[o,a]}o.has(r)||o.set(r,[]);const a=o.get(r),c=s.get(r);c>=a.length&&a.push(t);const i=a[c];return s.set(r,c+1),[i,t=>{const o="function"==typeof t?t(a[c]):t;a[c]!==o&&(a[c]=o,e?n((()=>x(r))):x(r))}]}function g(e,t){if(!r)throw new Error("useEffect must be called within a render");const n=s.get(r);a.has(r)||a.set(r,[]);const o=a.get(r),c=o[n];c&&t&&c.deps&&!t.some(((e,t)=>e!==c.deps[t]))||((null==c?void 0:c.cleanup)&&c.cleanup(),queueMicrotask((()=>{const r=e()||void 0;o[n]={cleanup:r,deps:t}}))),s.set(r,n+1)}async function x(e){try{const t=a.get(e);t&&(t.forEach((e=>{e.cleanup&&e.cleanup()})),a.set(e,[])),l&&u&&p&&await l(p,u)}catch(t){console.error("Error during rerender:",t)}}function b(e,t){console.log("JSX Transform:",{type:e,props:t});const n={...t};return arguments.length>2&&(n.children=Array.prototype.slice.call(arguments,2)),{type:e,props:n}}async function v(e){var t;if(console.log("Creating element from:",e),null==e)return document.createTextNode("");if("boolean"==typeof e)return document.createTextNode("");if("number"==typeof e||"string"==typeof e)return document.createTextNode(String(e));if(Array.isArray(e)){const t=document.createDocumentFragment();for(const n of e){const e=await v(n);t.appendChild(e)}return t}if("type"in e&&void 0!==e.props){const{type:r,props:o}=e;if("function"==typeof r)try{const e=await r(o||{}),t=await v(e);return t instanceof Element&&t.setAttribute("data-component-id",r.name||r.toString()),t}catch(n){return console.error("Error rendering component:",n),document.createTextNode("")}const s=document.createElement(r);for(const[e,n]of Object.entries(o||{}))if("children"!==e)if(e.startsWith("on")&&"function"==typeof n){const r=e.toLowerCase().slice(2),o=null==(t=s.__events)?void 0:t[r];o&&s.removeEventListener(r,o),s.addEventListener(r,n),s.__events||(s.__events={}),s.__events[r]=n}else"style"===e&&"object"==typeof n?Object.assign(s.style,n):"className"===e?s.setAttribute("class",String(n)):"key"!==e&&"ref"!==e&&s.setAttribute(e,String(n));const a=null==o?void 0:o.children;if(null!=a){const e=Array.isArray(a)?a.flat():[a];for(const t of e){const e=await v(t);s.appendChild(e)}}return s}return document.createTextNode(String(e))}let S=!1;async function E(e,t){console.log("Rendering to:",t.id),n((async()=>{w();try{h(E,e,t);const n=await v(e);S||(t.innerHTML=""),t.appendChild(n)}finally{y()}}))}function j(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}let A={pathname:"undefined"!=typeof window?window.location.pathname:"/",search:"undefined"!=typeof window?window.location.search:"",hash:"undefined"!=typeof window?window.location.hash:"",params:{}};const M=new Set;function C(e,t={}){"undefined"!=typeof window&&function(e,t={}){const n=new URL(e,window.location.origin),r={pathname:n.pathname,search:n.search,hash:n.hash,params:{}};t.replace?window.history.replaceState(r,"",n.toString()):window.history.pushState(r,"",n.toString()),A=r,M.forEach((e=>e(r))),t.scroll&&window.scrollTo(0,0)}(e,t)}function L(){const[e,t]=m(A);return g((()=>{const e=e=>{t(e)},n=()=>{A={pathname:window.location.pathname,search:window.location.search,hash:window.location.hash,params:{}},t(A)};return M.add(e),window.addEventListener("popstate",n),()=>{M.delete(e),window.removeEventListener("popstate",n)}}),[]),{...e,push:(e,t)=>C(e,t),replace:(e,t)=>C(e,{...t,replace:!0}),back:()=>window.history.back(),forward:()=>window.history.forward()}}exports.Fragment=({children:e})=>e,exports.Link=function({href:e,children:t,replace:n=!1,className:r,style:o,...s}){return{type:"a",props:{href:e,onClick:t=>{t.preventDefault(),C(e,{replace:n})},className:r,style:o,...s,children:t}}},exports.batchUpdates=n,exports.createContext=function(e){return{Provider:({value:e,children:t})=>t,Consumer:({children:t})=>t(e),_id:Symbol(),useSelector:t=>t(e)}},exports.createElement=v,exports.hydrate=async function(e,t){S=!0;try{await E(e,t)}finally{S=!1}},exports.jsx=b,exports.jsxs=b,exports.navigate=C,exports.render=E,exports.renderToString=async function e(t){w(),h((()=>{}),t,null);try{if(null==t)return"";if("boolean"==typeof t)return"";if("number"==typeof t||"string"==typeof t)return j(String(t));if(Array.isArray(t)){return(await Promise.all(t.map(e))).join("")}if("type"in t&&void 0!==t.props){const{type:o,props:s}=t;if("function"==typeof o)try{w();const t=await o(s||{}),n=await e(t);return y(),n}catch(r){return console.error("Error rendering component:",r),""}let a=`<${o}`;for(const[e,t]of Object.entries(s||{}))"children"!==e&&("className"===e?a+=` class="${j(String(t))}"`:"style"===e&&"object"==typeof t?a+=` style="${n=t||{},Object.entries(n).map((([e,t])=>{return`${n=e,n.replace(/[A-Z]/g,(e=>"-"+e.toLowerCase()))}:${t}`;var n})).join(";")}"`:e.startsWith("on")||(a+=` ${e}="${j(String(t))}"`));if(new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]).has(o))return a+"/>";if(a+=">",null==s?void 0:s.children){const t=Array.isArray(s.children)?s.children:[s.children];a+=(await Promise.all(t.map(e))).join("")}return a+`</${o}>`}return j(String(t))}finally{y()}var n},exports.useContext=function(e){return e},exports.useEffect=g,exports.useErrorBoundary=function(){const[e,t]=m(null);return[e,()=>t(null)]},exports.useMemo=function(e,t){if(!r)throw new Error("useMemo must be called within a render");const n=s.get(r);c.has(r)||c.set(r,[]);const o=c.get(r),a=o[n];if(!a||t&&t.some(((e,t)=>!Object.is(e,a.deps[t])))){const a=e();return o[n]={value:a,deps:t},s.set(r,n+1),a}return s.set(r,n+1),a.value},exports.useParams=function(){return L().params},exports.useRef=function(e){if(!r)throw new Error("useRef must be called within a render");const t=s.get(r);i.has(r)||i.set(r,[]);const n=i.get(r);if(t>=n.length){const o={current:e};return n.push(o),s.set(r,t+1),o}const o=n[t];return s.set(r,t+1),o},exports.useRoute=function(e){const{pathname:t}=L(),[n,r]=m({}),[o,s]=m(!1);return g((()=>{const n=function(e,t){const n=[],r=e.replace(/:([^/]+)/g,((e,t)=>(n.push(t),"([^/]+)"))),o=t.match(new RegExp(`^${r}$`));if(!o)return null;const s={};return n.forEach(((e,t)=>{s[e]=o[t+1]})),s}(e,t);s(!!n),r(n||{})}),[e,t]),{isMatch:o,params:n}},exports.useRouter=L,exports.useSearchParams=function(){const{search:e}=L();return new URLSearchParams(e)},exports.useState=m;
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/batch.ts","../src/hooks.ts","../src/jsx-runtime.ts","../src/renderer.ts","../src/server-renderer.ts","../src/router.ts","../src/link.tsx","../src/context.ts"],"sourcesContent":["export let isBatching = false;\r\nconst queue: Function[] = [];\r\n\r\nexport function batchUpdates(fn: Function) {\r\n if (isBatching) {\r\n queue.push(fn);\r\n return;\r\n }\r\n\r\n isBatching = true;\r\n try {\r\n fn();\r\n while (queue.length > 0) {\r\n const nextFn = queue.shift();\r\n nextFn?.();\r\n }\r\n } finally {\r\n isBatching = false;\r\n }\r\n}\r\n\r\nexport function getIsBatching() {\r\n return isBatching;\r\n}\r\n","import { createElement } from './jsx-runtime';\r\nimport { batchUpdates, isBatching } from './batch';\r\nimport { diff } from './vdom';\r\n\r\nlet currentRender: number = 0;\r\nconst states = new Map<number, any[]>();\r\nconst stateIndices = new Map<number, number>();\r\nconst effects = new Map<number, Effect[]>();\r\nconst memos = new Map<number, { value: any; deps: any[] }[]>();\r\nconst refs = new Map<number, any[]>();\r\n\r\ninterface Effect {\r\n cleanup?: () => void;\r\n deps?: any[];\r\n}\r\n\r\n// Add at the top with other declarations\r\nlet globalRenderCallback: ((element: any, container: HTMLElement) => void) | null = null;\r\nlet globalContainer: HTMLElement | null = null;\r\nlet currentElement: any = null;\r\n\r\nconst isServer = typeof window === 'undefined';\r\nconst serverStates = new Map<number, any>();\r\n\r\nexport function setRenderCallback(\r\n callback: (element: any, container: HTMLElement) => void,\r\n element: any,\r\n container: HTMLElement\r\n) {\r\n globalRenderCallback = callback;\r\n globalContainer = container;\r\n currentElement = element;\r\n}\r\n\r\nexport function prepareRender() {\r\n currentRender++;\r\n stateIndices.set(currentRender, 0);\r\n return currentRender;\r\n}\r\n\r\nexport function finishRender() {\r\n if (isServer) {\r\n serverStates.delete(currentRender);\r\n }\r\n currentRender = 0;\r\n}\r\n\r\nexport function useState<T>(initial: T): [T, (value: T | ((prev: T) => T)) => void] {\r\n if (!currentRender) {\r\n throw new Error('useState must be called within a render');\r\n }\r\n\r\n if (isServer) {\r\n // Server-side state handling\r\n if (!serverStates.has(currentRender)) {\r\n serverStates.set(currentRender, new Map());\r\n }\r\n const componentState = serverStates.get(currentRender)!;\r\n const index = stateIndices.get(currentRender) || 0;\r\n \r\n if (!componentState.has(index)) {\r\n componentState.set(index, initial);\r\n }\r\n\r\n const state = componentState.get(index);\r\n const setState = (newValue: T | ((prev: T) => T)) => {\r\n // No-op for server-side\r\n };\r\n\r\n stateIndices.set(currentRender, index + 1);\r\n return [state, setState];\r\n }\r\n\r\n if (!states.has(currentRender)) {\r\n states.set(currentRender, []);\r\n }\r\n\r\n const componentStates = states.get(currentRender)!;\r\n const index = stateIndices.get(currentRender)!;\r\n \r\n if (index >= componentStates.length) {\r\n componentStates.push(initial);\r\n }\r\n\r\n const state = componentStates[index];\r\n const setState = (newValue: T | ((prev: T) => T)) => {\r\n const nextValue = typeof newValue === 'function' \r\n ? (newValue as Function)(componentStates[index])\r\n : newValue;\r\n\r\n if (componentStates[index] === nextValue) return; // Skip if value hasn't changed\r\n \r\n componentStates[index] = nextValue;\r\n \r\n if (isBatching) {\r\n batchUpdates(() => rerender(currentRender));\r\n } else {\r\n rerender(currentRender);\r\n }\r\n };\r\n\r\n stateIndices.set(currentRender, index + 1);\r\n return [state, setState];\r\n}\r\n\r\nexport function useEffect(callback: () => (() => void) | void, deps?: any[]) {\r\n if (!currentRender) throw new Error('useEffect must be called within a render');\r\n \r\n const effectIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!effects.has(currentRender)) {\r\n effects.set(currentRender, []);\r\n }\r\n\r\n const componentEffects = effects.get(currentRender)!;\r\n const prevEffect = componentEffects[effectIndex];\r\n \r\n // Run effect if deps changed\r\n if (!prevEffect || !deps || !prevEffect.deps || \r\n deps.some((dep, i) => dep !== prevEffect.deps![i])) {\r\n \r\n // Cleanup previous effect\r\n if (prevEffect?.cleanup) {\r\n prevEffect.cleanup();\r\n }\r\n\r\n // Schedule new effect\r\n queueMicrotask(() => {\r\n const cleanup = callback() || undefined;\r\n componentEffects[effectIndex] = { cleanup: cleanup, deps };\r\n });\r\n }\r\n \r\n stateIndices.set(currentRender, effectIndex + 1);\r\n}\r\n\r\nexport function useMemo<T>(factory: () => T, deps: any[]): T {\r\n if (!currentRender) throw new Error('useMemo must be called within a render');\r\n \r\n const memoIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!memos.has(currentRender)) {\r\n memos.set(currentRender, []);\r\n }\r\n\r\n const componentMemos = memos.get(currentRender)!;\r\n const prevMemo = componentMemos[memoIndex];\r\n \r\n if (!prevMemo || (deps && deps.some((dep, i) => !Object.is(dep, prevMemo.deps[i])))) {\r\n const value = factory();\r\n componentMemos[memoIndex] = { value, deps };\r\n stateIndices.set(currentRender, memoIndex + 1);\r\n return value;\r\n }\r\n\r\n stateIndices.set(currentRender, memoIndex + 1);\r\n return prevMemo.value;\r\n}\r\n\r\nexport function useRef<T>(initial: T) {\r\n if (!currentRender) throw new Error('useRef must be called within a render');\r\n \r\n const refIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!refs.has(currentRender)) {\r\n refs.set(currentRender, []);\r\n }\r\n\r\n const componentRefs = refs.get(currentRender)!;\r\n if (refIndex >= componentRefs.length) {\r\n // Initialize with an object that has a current property\r\n const ref = { current: initial };\r\n componentRefs.push(ref);\r\n stateIndices.set(currentRender, refIndex + 1);\r\n return ref;\r\n }\r\n\r\n const ref = componentRefs[refIndex];\r\n stateIndices.set(currentRender, refIndex + 1);\r\n return ref;\r\n}\r\n\r\n// Add a map to track component DOM nodes\r\nconst componentNodes = new Map<Function, Node>();\r\n\r\nasync function rerender(rendererId: number) {\r\n try {\r\n // Clean up effects\r\n const componentEffects = effects.get(rendererId);\r\n if (componentEffects) {\r\n componentEffects.forEach(effect => {\r\n if (effect.cleanup) effect.cleanup();\r\n });\r\n effects.set(rendererId, []);\r\n }\r\n\r\n if (globalRenderCallback && globalContainer && currentElement) {\r\n await globalRenderCallback(currentElement, globalContainer);\r\n }\r\n } catch (error) {\r\n console.error('Error during rerender:', error);\r\n }\r\n}\r\n\r\n// Add new hook for error boundaries\r\nexport function useErrorBoundary(): [Error | null, () => void] {\r\n const [error, setError] = useState<Error | null>(null);\r\n return [error, () => setError(null)];\r\n}\r\n\r\n// Remove withHooks export\r\n","import type { Component } from './component';\r\n\r\ninterface VNode {\r\n type: string | Function;\r\n props: Record<string, any>;\r\n}\r\n\r\nfunction jsx(type: string | Function, props: any): VNode {\r\n console.log('JSX Transform:', { type, props });\r\n const processedProps = { ...props };\r\n \r\n // Handle children properly\r\n if (arguments.length > 2) {\r\n processedProps.children = Array.prototype.slice.call(arguments, 2);\r\n }\r\n \r\n return { type, props: processedProps };\r\n}\r\n\r\nconst Fragment = ({ children }: { children: any }) => children;\r\n\r\nasync function createElement(vnode: VNode | any): Promise<Node> {\r\n console.log('Creating element from:', vnode);\r\n\r\n // Handle primitives and null\r\n if (vnode == null) {\r\n return document.createTextNode('');\r\n }\r\n \r\n if (typeof vnode === 'boolean') {\r\n return document.createTextNode('');\r\n }\r\n\r\n if (typeof vnode === 'number' || typeof vnode === 'string') {\r\n return document.createTextNode(String(vnode));\r\n }\r\n\r\n // Handle arrays\r\n if (Array.isArray(vnode)) {\r\n const fragment = document.createDocumentFragment();\r\n for (const child of vnode) {\r\n const node = await createElement(child);\r\n fragment.appendChild(node);\r\n }\r\n return fragment;\r\n }\r\n\r\n // Handle VNode\r\n if ('type' in vnode && vnode.props !== undefined) {\r\n const { type, props } = vnode;\r\n \r\n // Handle function components\r\n if (typeof type === 'function') {\r\n try {\r\n const result = await type(props || {});\r\n const node = await createElement(result);\r\n if (node instanceof Element) {\r\n node.setAttribute('data-component-id', type.name || type.toString());\r\n }\r\n return node;\r\n } catch (error) {\r\n console.error('Error rendering component:', error);\r\n return document.createTextNode('');\r\n }\r\n }\r\n\r\n // Create DOM element\r\n const element = document.createElement(type as string);\r\n \r\n // Handle props\r\n for (const [key, value] of Object.entries(props || {})) {\r\n if (key === 'children') continue;\r\n if (key.startsWith('on') && typeof value === 'function') {\r\n const eventName = key.toLowerCase().slice(2);\r\n // Remove existing event listener if any\r\n const existingHandler = (element as any).__events?.[eventName];\r\n if (existingHandler) {\r\n element.removeEventListener(eventName, existingHandler);\r\n }\r\n \r\n // Add new event listener\r\n element.addEventListener(eventName, value as EventListener);\r\n if (!(element as any).__events) {\r\n (element as any).__events = {};\r\n }\r\n (element as any).__events[eventName] = value;\r\n } else if (key === 'style' && typeof value === 'object') {\r\n Object.assign(element.style, value);\r\n } else if (key === 'className') {\r\n element.setAttribute('class', String(value));\r\n } else if (key !== 'key' && key !== 'ref') {\r\n element.setAttribute(key, String(value));\r\n }\r\n }\r\n\r\n // Handle children\r\n const children = props?.children;\r\n if (children != null) {\r\n const childArray = Array.isArray(children) ? children.flat() : [children];\r\n for (const child of childArray) {\r\n const childNode = await createElement(child);\r\n element.appendChild(childNode);\r\n }\r\n }\r\n\r\n return element;\r\n }\r\n\r\n // Handle other objects by converting to string\r\n return document.createTextNode(String(vnode));\r\n}\r\n\r\n// Export named functions and aliases without duplicates\r\nexport {\r\n jsx,\r\n jsx as jsxs,\r\n jsx as jsxDEV,\r\n Fragment,\r\n createElement\r\n};\r\n\r\n// Named exports object\r\nconst jsxRuntime = {\r\n jsx,\r\n jsxs: jsx,\r\n jsxDEV: jsx,\r\n Fragment,\r\n createElement\r\n};\r\n\r\nexport default jsxRuntime;\r\n","import { createElement } from './jsx-runtime';\r\nimport { prepareRender, finishRender, setRenderCallback } from './hooks';\r\nimport { batchUpdates } from './batch';\r\n\r\nlet isHydrating = false;\r\n\r\nexport async function hydrate(element: any, container: HTMLElement) {\r\n isHydrating = true;\r\n try {\r\n await render(element, container);\r\n } finally {\r\n isHydrating = false;\r\n }\r\n}\r\n\r\nexport async function render(element: any, container: HTMLElement) {\r\n console.log('Rendering to:', container.id);\r\n \r\n batchUpdates(async () => {\r\n const rendererId = prepareRender();\r\n try {\r\n setRenderCallback(render, element, container);\r\n const domNode = await createElement(element);\r\n \r\n if (!isHydrating) {\r\n container.innerHTML = '';\r\n }\r\n container.appendChild(domNode);\r\n \r\n } finally {\r\n finishRender();\r\n }\r\n });\r\n}\r\n","import { prepareRender, finishRender, setRenderCallback } from './hooks';\r\n\r\nexport async function renderToString(element: any): Promise<string> {\r\n // Setup render context\r\n const rendererId = prepareRender();\r\n setRenderCallback(() => {}, element, null as any);\r\n \r\n try {\r\n if (element == null) return '';\r\n \r\n if (typeof element === 'boolean') return '';\r\n \r\n if (typeof element === 'number' || typeof element === 'string') {\r\n return escapeHtml(String(element));\r\n }\r\n\r\n if (Array.isArray(element)) {\r\n const children = await Promise.all(element.map(renderToString));\r\n return children.join('');\r\n }\r\n\r\n if ('type' in element && element.props !== undefined) {\r\n const { type, props } = element;\r\n\r\n // Handle function components\r\n if (typeof type === 'function') {\r\n try {\r\n // Prepare new render context for the component\r\n prepareRender();\r\n const result = await type(props || {});\r\n const html = await renderToString(result);\r\n finishRender();\r\n return html;\r\n } catch (error) {\r\n console.error('Error rendering component:', error);\r\n return '';\r\n }\r\n }\r\n\r\n // Handle regular elements\r\n let html = `<${type}`;\r\n\r\n // Add attributes\r\n for (const [key, value] of Object.entries(props || {})) {\r\n if (key === 'children') continue;\r\n if (key === 'className') {\r\n html += ` class=\"${escapeHtml(String(value))}\"`;\r\n } else if (key === 'style' && typeof value === 'object') {\r\n html += ` style=\"${stringifyStyle(value || {})}\"`;\r\n } else if (!key.startsWith('on')) {\r\n html += ` ${key}=\"${escapeHtml(String(value))}\"`;\r\n }\r\n }\r\n\r\n // Handle self-closing tags\r\n const voidElements = new Set([\r\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\r\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\r\n ]);\r\n \r\n if (voidElements.has(type)) {\r\n return html + '/>';\r\n }\r\n\r\n html += '>';\r\n\r\n // Add children\r\n if (props?.children) {\r\n const children = Array.isArray(props.children) ? props.children : [props.children];\r\n const renderedChildren = await Promise.all(children.map(renderToString));\r\n html += renderedChildren.join('');\r\n }\r\n\r\n return html + `</${type}>`;\r\n }\r\n\r\n return escapeHtml(String(element));\r\n } finally {\r\n finishRender();\r\n }\r\n}\r\n\r\nfunction escapeHtml(str: string): string {\r\n return str\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\r\n}\r\n\r\nfunction stringifyStyle(style: Record<string, any>): string {\r\n return Object.entries(style)\r\n .map(([key, value]) => `${hyphenate(key)}:${value}`)\r\n .join(';');\r\n}\r\n\r\nfunction hyphenate(str: string): string {\r\n return str.replace(/[A-Z]/g, match => '-' + match.toLowerCase());\r\n}\r\n","import { useState, useEffect } from './hooks';\r\n\r\ninterface RouterState {\r\n pathname: string;\r\n search: string;\r\n hash: string;\r\n params: Record<string, string>;\r\n}\r\n\r\ninterface RouterOptions {\r\n replace?: boolean;\r\n scroll?: boolean;\r\n}\r\n\r\nlet currentState: RouterState = {\r\n pathname: typeof window !== 'undefined' ? window.location.pathname : '/',\r\n search: typeof window !== 'undefined' ? window.location.search : '',\r\n hash: typeof window !== 'undefined' ? window.location.hash : '',\r\n params: {}\r\n};\r\n\r\nconst listeners = new Set<(state: RouterState) => void>();\r\n\r\n// Parse route pattern and extract params\r\nfunction matchRoute(pattern: string, pathname: string): Record<string, string> | null {\r\n const paramNames: string[] = [];\r\n const regexPattern = pattern.replace(/:([^/]+)/g, (_, name) => {\r\n paramNames.push(name);\r\n return '([^/]+)';\r\n });\r\n\r\n const match = pathname.match(new RegExp(`^${regexPattern}$`));\r\n if (!match) return null;\r\n\r\n const params: Record<string, string> = {};\r\n paramNames.forEach((name, i) => {\r\n params[name] = match[i + 1];\r\n });\r\n\r\n return params;\r\n}\r\n\r\nfunction updateState(newPath: string, options: RouterOptions = {}) {\r\n const url = new URL(newPath, window.location.origin);\r\n const newState: RouterState = {\r\n pathname: url.pathname,\r\n search: url.search,\r\n hash: url.hash,\r\n params: {}\r\n };\r\n\r\n if (options.replace) {\r\n window.history.replaceState(newState, '', url.toString());\r\n } else {\r\n window.history.pushState(newState, '', url.toString());\r\n }\r\n\r\n currentState = newState;\r\n listeners.forEach(listener => listener(newState));\r\n\r\n if (options.scroll) {\r\n window.scrollTo(0, 0);\r\n }\r\n}\r\n\r\n function navigate(to: string, options: RouterOptions = {}) {\r\n if (typeof window === 'undefined') return;\r\n updateState(to, options);\r\n}\r\n\r\n function useRouter() {\r\n const [state, setState] = useState<RouterState>(currentState);\r\n\r\n useEffect(() => {\r\n const handleRouteChange = (newState: RouterState) => {\r\n setState(newState);\r\n };\r\n\r\n const handlePopState = () => {\r\n currentState = {\r\n pathname: window.location.pathname,\r\n search: window.location.search,\r\n hash: window.location.hash,\r\n params: {}\r\n };\r\n setState(currentState);\r\n };\r\n\r\n listeners.add(handleRouteChange);\r\n window.addEventListener('popstate', handlePopState);\r\n\r\n return () => {\r\n listeners.delete(handleRouteChange);\r\n window.removeEventListener('popstate', handlePopState);\r\n };\r\n }, []);\r\n\r\n return {\r\n ...state,\r\n push: (to: string, options?: RouterOptions) => navigate(to, options),\r\n replace: (to: string, options?: RouterOptions) => navigate(to, { ...options, replace: true }),\r\n back: () => window.history.back(),\r\n forward: () => window.history.forward()\r\n };\r\n}\r\n\r\n function useRoute(pattern: string) {\r\n const { pathname } = useRouter();\r\n const [params, setParams] = useState<Record<string, string>>({});\r\n const [isMatch, setIsMatch] = useState(false);\r\n\r\n useEffect(() => {\r\n const matchedParams = matchRoute(pattern, pathname);\r\n setIsMatch(!!matchedParams);\r\n setParams(matchedParams || {});\r\n }, [pattern, pathname]);\r\n\r\n return { isMatch, params };\r\n}\r\n\r\n function useParams<T extends Record<string, string>>() {\r\n const router = useRouter();\r\n return router.params as T;\r\n}\r\n\r\n function useSearchParams() {\r\n const { search } = useRouter();\r\n return new URLSearchParams(search);\r\n}\r\n\r\n// Ensure all exports are properly declared\r\nexport {\r\n useRouter,\r\n useRoute,\r\n useParams,\r\n useSearchParams,\r\n navigate\r\n};\r\n","import { navigate } from './router';\r\n\r\ninterface LinkProps {\r\n href: string;\r\n children?: any;\r\n replace?: boolean;\r\n className?: string;\r\n style?: Record<string, string>;\r\n [key: string]: any;\r\n}\r\n\r\n function Link({ \r\n href, \r\n children, \r\n replace = false, \r\n className,\r\n style,\r\n ...rest \r\n}: LinkProps) {\r\n const handleClick = (e: MouseEvent) => {\r\n e.preventDefault();\r\n navigate(href, { replace });\r\n };\r\n\r\n return {\r\n type: 'a',\r\n props: {\r\n href,\r\n onClick: handleClick,\r\n className,\r\n style,\r\n ...rest,\r\n children\r\n }\r\n };\r\n}\r\n\r\n// Ensure Link is properly exported\r\nexport { Link };\r\n","\r\n\r\nconst contexts = new Map<symbol, any>();\r\nlet currentRender: Function | null = null;\r\n\r\nexport interface Context<T> {\r\n Provider: (props: { value: T; children?: any }) => any;\r\n Consumer: (props: { children: (value: T) => any }) => any;\r\n _id: symbol;\r\n useSelector: <S>(selector: (state: T) => S) => S;\r\n}\r\n\r\nexport function createContext<T>(defaultValue: T): Context<T> {\r\n const context = {\r\n Provider: ({ value, children }: { value: T, children?: any }) => {\r\n return children;\r\n },\r\n Consumer: ({ children }: { children: (value: T) => any }) => {\r\n return children(defaultValue);\r\n },\r\n _id: Symbol(),\r\n useSelector: <S>(selector: (state: T) => S) => {\r\n return selector(defaultValue);\r\n }\r\n };\r\n\r\n return context;\r\n}\r\n\r\nexport function useContext<T>(context: any): T {\r\n return context;\r\n}\r\n"],"names":["isBatching","queue","batchUpdates","fn","push","length","nextFn","shift","currentRender","states","Map","stateIndices","effects","memos","refs","globalRenderCallback","globalContainer","currentElement","isServer","window","serverStates","setRenderCallback","callback","element","container","prepareRender","set","finishRender","delete","useState","initial","Error","has","componentState","get","index","state","setState","newValue","componentStates","nextValue","rerender","useEffect","deps","effectIndex","componentEffects","prevEffect","some","dep","i","cleanup","queueMicrotask","async","rendererId","forEach","effect","error","console","jsx","type","props","log","processedProps","arguments","children","Array","prototype","slice","call","createElement","vnode","document","createTextNode","String","isArray","fragment","createDocumentFragment","child","node","appendChild","result","Element","setAttribute","name","toString","key","value","Object","entries","startsWith","eventName","toLowerCase","existingHandler","_a","__events","removeEventListener","addEventListener","assign","style","childArray","flat","childNode","isHydrating","render","id","domNode","innerHTML","escapeHtml","str","replace","currentState","pathname","location","search","hash","params","listeners","Set","navigate","to","options","newPath","url","URL","origin","newState","history","replaceState","pushState","listener","scroll","scrollTo","updateState","useRouter","handleRouteChange","handlePopState","add","back","forward","href","className","rest","onClick","e","preventDefault","defaultValue","Provider","Consumer","_id","Symbol","useSelector","selector","renderToString","Promise","all","map","join","html","match","context","setError","factory","memoIndex","componentMemos","prevMemo","is","refIndex","componentRefs","ref","current","pattern","setParams","isMatch","setIsMatch","matchedParams","paramNames","regexPattern","_","RegExp","matchRoute","URLSearchParams"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/batch.ts","../src/hooks.ts","../src/jsx-runtime.ts","../src/renderer.ts","../src/server-renderer.ts","../src/router.ts","../src/link.tsx","../src/context.ts"],"sourcesContent":["export let isBatching = false;\r\nconst queue: Function[] = [];\r\n\r\nexport function batchUpdates(fn: Function) {\r\n if (isBatching) {\r\n queue.push(fn);\r\n return;\r\n }\r\n\r\n isBatching = true;\r\n try {\r\n fn();\r\n while (queue.length > 0) {\r\n const nextFn = queue.shift();\r\n nextFn?.();\r\n }\r\n } finally {\r\n isBatching = false;\r\n }\r\n}\r\n\r\nexport function getIsBatching() {\r\n return isBatching;\r\n}\r\n","import { createElement } from './jsx-runtime';\r\nimport { batchUpdates, isBatching } from './batch';\r\nimport { diff } from './vdom';\r\n\r\nlet currentRender: number = 0;\r\nconst states = new Map<number, any[]>();\r\nconst stateIndices = new Map<number, number>();\r\nconst effects = new Map<number, Effect[]>();\r\nconst memos = new Map<number, { value: any; deps: any[] }[]>();\r\nconst refs = new Map<number, any[]>();\r\n\r\ninterface Effect {\r\n cleanup?: () => void;\r\n deps?: any[];\r\n}\r\n\r\n// Add at the top with other declarations\r\nlet globalRenderCallback: ((element: any, container: HTMLElement) => void) | null = null;\r\nlet globalContainer: HTMLElement | null = null;\r\nlet currentElement: any = null;\r\n\r\nconst isServer = typeof window === 'undefined';\r\nconst serverStates = new Map<number, any>();\r\n\r\nexport function setRenderCallback(\r\n callback: (element: any, container: HTMLElement) => void,\r\n element: any,\r\n container: HTMLElement\r\n) {\r\n globalRenderCallback = callback;\r\n globalContainer = container;\r\n currentElement = element;\r\n}\r\n\r\nexport function prepareRender() {\r\n currentRender++;\r\n stateIndices.set(currentRender, 0);\r\n return currentRender;\r\n}\r\n\r\nexport function finishRender() {\r\n if (isServer) {\r\n serverStates.delete(currentRender);\r\n }\r\n currentRender = 0;\r\n}\r\n\r\nexport function useState<T>(initial: T): [T, (value: T | ((prev: T) => T)) => void] {\r\n if (!currentRender) {\r\n throw new Error('useState must be called within a render');\r\n }\r\n\r\n if (isServer) {\r\n // Server-side state handling\r\n if (!serverStates.has(currentRender)) {\r\n serverStates.set(currentRender, new Map());\r\n }\r\n const componentState = serverStates.get(currentRender)!;\r\n const index = stateIndices.get(currentRender) || 0;\r\n \r\n if (!componentState.has(index)) {\r\n componentState.set(index, initial);\r\n }\r\n\r\n const state = componentState.get(index);\r\n const setState = (newValue: T | ((prev: T) => T)) => {\r\n // No-op for server-side\r\n };\r\n\r\n stateIndices.set(currentRender, index + 1);\r\n return [state, setState];\r\n }\r\n\r\n if (!states.has(currentRender)) {\r\n states.set(currentRender, []);\r\n }\r\n\r\n const componentStates = states.get(currentRender)!;\r\n const index = stateIndices.get(currentRender)!;\r\n \r\n if (index >= componentStates.length) {\r\n componentStates.push(initial);\r\n }\r\n\r\n const state = componentStates[index];\r\n const setState = (newValue: T | ((prev: T) => T)) => {\r\n const nextValue = typeof newValue === 'function' \r\n ? (newValue as Function)(componentStates[index])\r\n : newValue;\r\n\r\n if (componentStates[index] === nextValue) return; // Skip if value hasn't changed\r\n \r\n componentStates[index] = nextValue;\r\n \r\n if (isBatching) {\r\n batchUpdates(() => rerender(currentRender));\r\n } else {\r\n rerender(currentRender);\r\n }\r\n };\r\n\r\n stateIndices.set(currentRender, index + 1);\r\n return [state, setState];\r\n}\r\n\r\nexport function useEffect(callback: () => (() => void) | void, deps?: any[]) {\r\n if (!currentRender) throw new Error('useEffect must be called within a render');\r\n \r\n const effectIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!effects.has(currentRender)) {\r\n effects.set(currentRender, []);\r\n }\r\n\r\n const componentEffects = effects.get(currentRender)!;\r\n const prevEffect = componentEffects[effectIndex];\r\n \r\n // Run effect if deps changed\r\n if (!prevEffect || !deps || !prevEffect.deps || \r\n deps.some((dep, i) => dep !== prevEffect.deps![i])) {\r\n \r\n // Cleanup previous effect\r\n if (prevEffect?.cleanup) {\r\n prevEffect.cleanup();\r\n }\r\n\r\n // Schedule new effect\r\n queueMicrotask(() => {\r\n const cleanup = callback() || undefined;\r\n componentEffects[effectIndex] = { cleanup: cleanup, deps };\r\n });\r\n }\r\n \r\n stateIndices.set(currentRender, effectIndex + 1);\r\n}\r\n\r\nexport function useMemo<T>(factory: () => T, deps: any[]): T {\r\n if (!currentRender) throw new Error('useMemo must be called within a render');\r\n \r\n const memoIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!memos.has(currentRender)) {\r\n memos.set(currentRender, []);\r\n }\r\n\r\n const componentMemos = memos.get(currentRender)!;\r\n const prevMemo = componentMemos[memoIndex];\r\n \r\n if (!prevMemo || (deps && deps.some((dep, i) => !Object.is(dep, prevMemo.deps[i])))) {\r\n const value = factory();\r\n componentMemos[memoIndex] = { value, deps };\r\n stateIndices.set(currentRender, memoIndex + 1);\r\n return value;\r\n }\r\n\r\n stateIndices.set(currentRender, memoIndex + 1);\r\n return prevMemo.value;\r\n}\r\n\r\nexport function useRef<T>(initial: T) {\r\n if (!currentRender) throw new Error('useRef must be called within a render');\r\n \r\n const refIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!refs.has(currentRender)) {\r\n refs.set(currentRender, []);\r\n }\r\n\r\n const componentRefs = refs.get(currentRender)!;\r\n if (refIndex >= componentRefs.length) {\r\n // Initialize with an object that has a current property\r\n const ref = { current: initial };\r\n componentRefs.push(ref);\r\n stateIndices.set(currentRender, refIndex + 1);\r\n return ref;\r\n }\r\n\r\n const ref = componentRefs[refIndex];\r\n stateIndices.set(currentRender, refIndex + 1);\r\n return ref;\r\n}\r\n\r\n// Add a map to track component DOM nodes\r\nconst componentNodes = new Map<Function, Node>();\r\n\r\nasync function rerender(rendererId: number) {\r\n try {\r\n // Clean up effects\r\n const componentEffects = effects.get(rendererId);\r\n if (componentEffects) {\r\n componentEffects.forEach(effect => {\r\n if (effect.cleanup) effect.cleanup();\r\n });\r\n effects.set(rendererId, []);\r\n }\r\n\r\n if (globalRenderCallback && globalContainer && currentElement) {\r\n await globalRenderCallback(currentElement, globalContainer);\r\n }\r\n } catch (error) {\r\n console.error('Error during rerender:', error);\r\n }\r\n}\r\n\r\n// Add new hook for error boundaries\r\nexport function useErrorBoundary(): [Error | null, () => void] {\r\n const [error, setError] = useState<Error | null>(null);\r\n return [error, () => setError(null)];\r\n}\r\n\r\n// Remove withHooks export\r\n","import type { Component } from './component';\r\n\r\ninterface VNode {\r\n type: string | Function;\r\n props: Record<string, any>;\r\n}\r\n\r\nfunction jsx(type: string | Function, props: any): VNode {\r\n console.log('JSX Transform:', { type, props });\r\n const processedProps = { ...props };\r\n \r\n // Handle children properly\r\n if (arguments.length > 2) {\r\n processedProps.children = Array.prototype.slice.call(arguments, 2);\r\n }\r\n \r\n return { type, props: processedProps };\r\n}\r\n\r\nconst Fragment = ({ children }: { children: any }) => children;\r\n\r\nasync function createElement(vnode: VNode | any): Promise<Node> {\r\n console.log('Creating element from:', vnode);\r\n\r\n // Handle primitives and null\r\n if (vnode == null) {\r\n return document.createTextNode('');\r\n }\r\n \r\n if (typeof vnode === 'boolean') {\r\n return document.createTextNode('');\r\n }\r\n\r\n if (typeof vnode === 'number' || typeof vnode === 'string') {\r\n return document.createTextNode(String(vnode));\r\n }\r\n\r\n // Handle arrays\r\n if (Array.isArray(vnode)) {\r\n const fragment = document.createDocumentFragment();\r\n for (const child of vnode) {\r\n const node = await createElement(child);\r\n fragment.appendChild(node);\r\n }\r\n return fragment;\r\n }\r\n\r\n // Handle VNode\r\n if ('type' in vnode && vnode.props !== undefined) {\r\n const { type, props } = vnode;\r\n \r\n // Handle function components\r\n if (typeof type === 'function') {\r\n try {\r\n const result = await type(props || {});\r\n const node = await createElement(result);\r\n if (node instanceof Element) {\r\n node.setAttribute('data-component-id', type.name || type.toString());\r\n }\r\n return node;\r\n } catch (error) {\r\n console.error('Error rendering component:', error);\r\n return document.createTextNode('');\r\n }\r\n }\r\n\r\n // Create DOM element\r\n const element = document.createElement(type as string);\r\n \r\n // Handle props\r\n for (const [key, value] of Object.entries(props || {})) {\r\n if (key === 'children') continue;\r\n if (key.startsWith('on') && typeof value === 'function') {\r\n const eventName = key.toLowerCase().slice(2);\r\n // Remove existing event listener if any\r\n const existingHandler = (element as any).__events?.[eventName];\r\n if (existingHandler) {\r\n element.removeEventListener(eventName, existingHandler);\r\n }\r\n \r\n // Add new event listener\r\n element.addEventListener(eventName, value as EventListener);\r\n if (!(element as any).__events) {\r\n (element as any).__events = {};\r\n }\r\n (element as any).__events[eventName] = value;\r\n } else if (key === 'style' && typeof value === 'object') {\r\n Object.assign(element.style, value);\r\n } else if (key === 'className') {\r\n element.setAttribute('class', String(value));\r\n } else if (key !== 'key' && key !== 'ref') {\r\n element.setAttribute(key, String(value));\r\n }\r\n }\r\n\r\n // Handle children\r\n const children = props?.children;\r\n if (children != null) {\r\n const childArray = Array.isArray(children) ? children.flat() : [children];\r\n for (const child of childArray) {\r\n const childNode = await createElement(child);\r\n element.appendChild(childNode);\r\n }\r\n }\r\n\r\n return element;\r\n }\r\n\r\n // Handle other objects by converting to string\r\n return document.createTextNode(String(vnode));\r\n}\r\n\r\n// Export named functions and aliases without duplicates\r\nexport {\r\n jsx,\r\n jsx as jsxs,\r\n jsx as jsxDEV,\r\n Fragment,\r\n createElement\r\n};\r\n\r\n// Named exports object\r\nconst jsxRuntime = {\r\n jsx,\r\n jsxs: jsx,\r\n jsxDEV: jsx,\r\n Fragment,\r\n createElement\r\n};\r\n\r\nexport default jsxRuntime;\r\n","import { createElement } from './jsx-runtime';\r\nimport { prepareRender, finishRender, setRenderCallback } from './hooks';\r\nimport { batchUpdates } from './batch';\r\n\r\nlet isHydrating = false;\r\n\r\nexport async function hydrate(element: any, container: HTMLElement) {\r\n isHydrating = true;\r\n try {\r\n await render(element, container);\r\n } finally {\r\n isHydrating = false;\r\n }\r\n}\r\n\r\nexport async function render(element: any, container: HTMLElement) {\r\n console.log('Rendering to:', container.id);\r\n \r\n batchUpdates(async () => {\r\n const rendererId = prepareRender();\r\n try {\r\n setRenderCallback(render, element, container);\r\n const domNode = await createElement(element);\r\n \r\n if (!isHydrating) {\r\n container.innerHTML = '';\r\n }\r\n container.appendChild(domNode);\r\n \r\n } finally {\r\n finishRender();\r\n }\r\n });\r\n}\r\n","import { prepareRender, finishRender, setRenderCallback } from './hooks';\r\n\r\nexport async function renderToString(element: any): Promise<string> {\r\n // Setup render context\r\n const rendererId = prepareRender();\r\n setRenderCallback(() => {}, element, null as any);\r\n \r\n try {\r\n if (element == null) return '';\r\n \r\n if (typeof element === 'boolean') return '';\r\n \r\n if (typeof element === 'number' || typeof element === 'string') {\r\n return escapeHtml(String(element));\r\n }\r\n\r\n if (Array.isArray(element)) {\r\n const children = await Promise.all(element.map(renderToString));\r\n return children.join('');\r\n }\r\n\r\n if ('type' in element && element.props !== undefined) {\r\n const { type, props } = element;\r\n\r\n // Handle function components\r\n if (typeof type === 'function') {\r\n try {\r\n // Prepare new render context for the component\r\n prepareRender();\r\n const result = await type(props || {});\r\n const html = await renderToString(result);\r\n finishRender();\r\n return html;\r\n } catch (error) {\r\n console.error('Error rendering component:', error);\r\n return '';\r\n }\r\n }\r\n\r\n // Handle regular elements\r\n let html = `<${type}`;\r\n\r\n // Add attributes\r\n for (const [key, value] of Object.entries(props || {})) {\r\n if (key === 'children') continue;\r\n if (key === 'className') {\r\n html += ` class=\"${escapeHtml(String(value))}\"`;\r\n } else if (key === 'style' && typeof value === 'object') {\r\n html += ` style=\"${stringifyStyle(value || {})}\"`;\r\n } else if (!key.startsWith('on')) {\r\n html += ` ${key}=\"${escapeHtml(String(value))}\"`;\r\n }\r\n }\r\n\r\n // Handle self-closing tags\r\n const voidElements = new Set([\r\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\r\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\r\n ]);\r\n \r\n if (voidElements.has(type)) {\r\n return html + '/>';\r\n }\r\n\r\n html += '>';\r\n\r\n // Add children\r\n if (props?.children) {\r\n const children = Array.isArray(props.children) ? props.children : [props.children];\r\n const renderedChildren = await Promise.all(children.map(renderToString));\r\n html += renderedChildren.join('');\r\n }\r\n\r\n return html + `</${type}>`;\r\n }\r\n\r\n return escapeHtml(String(element));\r\n } finally {\r\n finishRender();\r\n }\r\n}\r\n\r\nfunction escapeHtml(str: string): string {\r\n return str\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\r\n}\r\n\r\nfunction stringifyStyle(style: Record<string, any>): string {\r\n return Object.entries(style)\r\n .map(([key, value]) => `${hyphenate(key)}:${value}`)\r\n .join(';');\r\n}\r\n\r\nfunction hyphenate(str: string): string {\r\n return str.replace(/[A-Z]/g, match => '-' + match.toLowerCase());\r\n}\r\n","import { useState, useEffect } from './hooks';\r\n\r\ninterface RouterState {\r\n pathname: string;\r\n search: string;\r\n hash: string;\r\n params: Record<string, string>;\r\n}\r\n\r\ninterface RouterOptions {\r\n replace?: boolean;\r\n scroll?: boolean;\r\n}\r\n\r\nlet currentState: RouterState = {\r\n pathname: typeof window !== 'undefined' ? window.location.pathname : '/',\r\n search: typeof window !== 'undefined' ? window.location.search : '',\r\n hash: typeof window !== 'undefined' ? window.location.hash : '',\r\n params: {}\r\n};\r\n\r\nconst listeners = new Set<(state: RouterState) => void>();\r\n\r\n// Parse route pattern and extract params\r\nfunction matchRoute(pattern: string, pathname: string): Record<string, string> | null {\r\n const paramNames: string[] = [];\r\n const regexPattern = pattern.replace(/:([^/]+)/g, (_, name) => {\r\n paramNames.push(name);\r\n return '([^/]+)';\r\n });\r\n\r\n const match = pathname.match(new RegExp(`^${regexPattern}$`));\r\n if (!match) return null;\r\n\r\n const params: Record<string, string> = {};\r\n paramNames.forEach((name, i) => {\r\n params[name] = match[i + 1];\r\n });\r\n\r\n return params;\r\n}\r\n\r\nfunction updateState(newPath: string, options: RouterOptions = {}) {\r\n const url = new URL(newPath, window.location.origin);\r\n const newState: RouterState = {\r\n pathname: url.pathname,\r\n search: url.search,\r\n hash: url.hash,\r\n params: {}\r\n };\r\n\r\n if (options.replace) {\r\n window.history.replaceState(newState, '', url.toString());\r\n } else {\r\n window.history.pushState(newState, '', url.toString());\r\n }\r\n\r\n currentState = newState;\r\n listeners.forEach(listener => listener(newState));\r\n\r\n if (options.scroll) {\r\n window.scrollTo(0, 0);\r\n }\r\n}\r\n\r\n function navigate(to: string, options: RouterOptions = {}) {\r\n if (typeof window === 'undefined') return;\r\n updateState(to, options);\r\n}\r\n\r\n function useRouter() {\r\n const [state, setState] = useState<RouterState>(currentState);\r\n\r\n useEffect(() => {\r\n const handleRouteChange = (newState: RouterState) => {\r\n setState(newState);\r\n };\r\n\r\n const handlePopState = () => {\r\n currentState = {\r\n pathname: window.location.pathname,\r\n search: window.location.search,\r\n hash: window.location.hash,\r\n params: {}\r\n };\r\n setState(currentState);\r\n };\r\n\r\n listeners.add(handleRouteChange);\r\n window.addEventListener('popstate', handlePopState);\r\n\r\n return () => {\r\n listeners.delete(handleRouteChange);\r\n window.removeEventListener('popstate', handlePopState);\r\n };\r\n }, []);\r\n\r\n return {\r\n ...state,\r\n push: (to: string, options?: RouterOptions) => navigate(to, options),\r\n replace: (to: string, options?: RouterOptions) => navigate(to, { ...options, replace: true }),\r\n back: () => window.history.back(),\r\n forward: () => window.history.forward()\r\n };\r\n}\r\n\r\n function useRoute(pattern: string) {\r\n const { pathname } = useRouter();\r\n const [params, setParams] = useState<Record<string, string>>({});\r\n const [isMatch, setIsMatch] = useState(false);\r\n\r\n useEffect(() => {\r\n const matchedParams = matchRoute(pattern, pathname);\r\n setIsMatch(!!matchedParams);\r\n setParams(matchedParams || {});\r\n }, [pattern, pathname]);\r\n\r\n return { isMatch, params };\r\n}\r\n\r\n function useParams<T extends Record<string, string>>() {\r\n const router = useRouter();\r\n return router.params as T;\r\n}\r\n\r\n function useSearchParams() {\r\n const { search } = useRouter();\r\n return new URLSearchParams(search);\r\n}\r\n\r\n// Ensure all exports are properly declared\r\nexport {\r\n useRouter,\r\n useRoute,\r\n useParams,\r\n useSearchParams,\r\n navigate\r\n};\r\n","import { navigate } from './router';\r\n\r\ninterface LinkProps {\r\n href: string;\r\n children?: any;\r\n replace?: boolean;\r\n className?: string;\r\n style?: Record<string, string>;\r\n [key: string]: any;\r\n}\r\n\r\n function Link({ \r\n href, \r\n children, \r\n replace = false, \r\n className,\r\n style,\r\n ...rest \r\n}: LinkProps) {\r\n const handleClick = (e: MouseEvent) => {\r\n e.preventDefault();\r\n navigate(href, { replace });\r\n };\r\n\r\n return {\r\n type: 'a',\r\n props: {\r\n href,\r\n onClick: handleClick,\r\n className,\r\n style,\r\n ...rest,\r\n children\r\n }\r\n };\r\n}\r\n\r\n// Ensure Link is properly exported\r\nexport { Link };\r\n","\r\n\r\nconst contexts = new Map<symbol, any>();\r\nlet currentRender: Function | null = null;\r\n\r\nexport interface Context<T> {\r\n Provider: (props: { value: T; children?: any }) => any;\r\n Consumer: (props: { children: (value: T) => any }) => any;\r\n _id: symbol;\r\n useSelector: <S>(selector: (state: T) => S) => S;\r\n}\r\n\r\nexport function createContext<T>(defaultValue: T): Context<T> {\r\n const context = {\r\n Provider: ({ value, children }: { value: T, children?: any }) => {\r\n return children;\r\n },\r\n Consumer: ({ children }: { children: (value: T) => any }) => {\r\n return children(defaultValue);\r\n },\r\n _id: Symbol(),\r\n useSelector: <S>(selector: (state: T) => S) => {\r\n return selector(defaultValue);\r\n }\r\n };\r\n\r\n return context;\r\n}\r\n\r\nexport function useContext<T>(context: any): T {\r\n return context;\r\n}\r\n"],"names":["isBatching","queue","batchUpdates","fn","push","length","nextFn","shift","currentRender","states","Map","stateIndices","effects","memos","refs","globalRenderCallback","globalContainer","currentElement","isServer","window","serverStates","setRenderCallback","callback","element","container","prepareRender","set","finishRender","delete","useState","initial","Error","has","componentState","get","index","state","setState","newValue","componentStates","nextValue","rerender","useEffect","deps","effectIndex","componentEffects","prevEffect","some","dep","i","cleanup","queueMicrotask","async","rendererId","forEach","effect","error","console","jsx","type","props","log","processedProps","arguments","children","Array","prototype","slice","call","createElement","vnode","document","createTextNode","String","isArray","fragment","createDocumentFragment","child","node","appendChild","result","Element","setAttribute","name","toString","key","value","Object","entries","startsWith","eventName","toLowerCase","existingHandler","_a","__events","removeEventListener","addEventListener","assign","style","childArray","flat","childNode","isHydrating","render","id","domNode","innerHTML","escapeHtml","str","replace","currentState","pathname","location","search","hash","params","listeners","Set","navigate","to","options","newPath","url","URL","origin","newState","history","replaceState","pushState","listener","scroll","scrollTo","updateState","useRouter","handleRouteChange","handlePopState","add","back","forward","href","className","rest","onClick","e","preventDefault","defaultValue","Provider","Consumer","_id","Symbol","useSelector","selector","renderToString","Promise","all","map","join","html","match","context","setError","factory","memoIndex","componentMemos","prevMemo","is","refIndex","componentRefs","ref","current","pattern","setParams","isMatch","setIsMatch","matchedParams","paramNames","regexPattern","_","RegExp","matchRoute","URLSearchParams"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
package/package.json
CHANGED
@@ -1,19 +1,20 @@
|
|
1
|
-
{
|
2
|
-
"name": "
|
3
|
-
"private": true,
|
4
|
-
"version": "0.0.0",
|
5
|
-
"type": "module",
|
6
|
-
"scripts": {
|
7
|
-
"dev": "npx frontend-hamroun dev",
|
8
|
-
"build": "npx frontend-hamroun build",
|
9
|
-
"lint": "eslint src --ext ts,tsx"
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
"
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
}
|
1
|
+
{
|
2
|
+
"name": "ctttt",
|
3
|
+
"private": true,
|
4
|
+
"version": "0.0.0",
|
5
|
+
"type": "module",
|
6
|
+
"scripts": {
|
7
|
+
"dev": "npx frontend-hamroun dev",
|
8
|
+
"build": "npx frontend-hamroun build",
|
9
|
+
"lint": "eslint src --ext ts,tsx",
|
10
|
+
"typecheck": "tsc --noEmit"
|
11
|
+
},
|
12
|
+
"devDependencies": {
|
13
|
+
"esbuild": "^0.19.2",
|
14
|
+
"sirv-cli": "^2.0.2",
|
15
|
+
"typescript": "^5.0.0"
|
16
|
+
},
|
17
|
+
"dependencies": {
|
18
|
+
"frontend-hamroun": "^1.1.59"
|
19
|
+
}
|
20
|
+
}
|
@@ -1,15 +1,19 @@
|
|
1
|
-
import { render, useState, Link, useRouter } from 'frontend-hamroun';
|
1
|
+
import { render, useState, Link, useRouter, jsx, Fragment } from 'frontend-hamroun';
|
2
2
|
|
3
3
|
// Home component
|
4
4
|
function Home() {
|
5
|
-
const [count, setCount] = useState(0);
|
5
|
+
const [count, setCount] = useState<number>(0);
|
6
|
+
|
7
|
+
const decrement = () => setCount((prev: number) => Math.max(0, prev - 1));
|
8
|
+
const increment = () => setCount((prev: number) => prev + 1);
|
9
|
+
|
6
10
|
return (
|
7
11
|
<div>
|
8
12
|
<h1>Home Page</h1>
|
9
13
|
<div>
|
10
|
-
<button onClick={
|
11
|
-
<span
|
12
|
-
<button onClick={
|
14
|
+
<button onClick={decrement}>-</button>
|
15
|
+
<span>{count ?? 0}</span>
|
16
|
+
<button onClick={increment}>+</button>
|
13
17
|
</div>
|
14
18
|
</div>
|
15
19
|
);
|
@@ -1,13 +1,22 @@
|
|
1
1
|
{
|
2
2
|
"compilerOptions": {
|
3
3
|
"target": "ES2020",
|
4
|
-
"
|
4
|
+
"useDefineForClassFields": true,
|
5
5
|
"lib": ["ES2020", "DOM", "DOM.Iterable"],
|
6
|
-
"
|
6
|
+
"module": "ESNext",
|
7
|
+
"skipLibCheck": true,
|
7
8
|
"moduleResolution": "bundler",
|
8
|
-
"
|
9
|
+
"allowImportingTsExtensions": true,
|
10
|
+
"resolveJsonModule": true,
|
11
|
+
"isolatedModules": true,
|
12
|
+
"noEmit": true,
|
13
|
+
"jsx": "preserve",
|
14
|
+
"jsxFactory": "jsx",
|
15
|
+
"jsxImportSource": "frontend-hamroun",
|
9
16
|
"strict": true,
|
10
|
-
"
|
17
|
+
"noUnusedLocals": true,
|
18
|
+
"noUnusedParameters": true,
|
19
|
+
"noFallthroughCasesInSwitch": true
|
11
20
|
},
|
12
21
|
"include": ["src"]
|
13
22
|
}
|
@@ -1,28 +0,0 @@
|
|
1
|
-
import * as esbuild from 'esbuild';
|
2
|
-
|
3
|
-
const isWatch = process.argv.includes('--watch');
|
4
|
-
|
5
|
-
const config = {
|
6
|
-
entryPoints: ['src/main.tsx'],
|
7
|
-
bundle: true,
|
8
|
-
outfile: 'dist/bundle.js',
|
9
|
-
loader: { '.tsx': 'tsx' },
|
10
|
-
jsxFactory: 'createElement',
|
11
|
-
jsxFragment: 'null',
|
12
|
-
platform: 'browser',
|
13
|
-
target: 'es2020',
|
14
|
-
minify: true,
|
15
|
-
inject: ['./src/jsx-shim.ts'],
|
16
|
-
define: {
|
17
|
-
'Fragment': 'null'
|
18
|
-
}
|
19
|
-
};
|
20
|
-
|
21
|
-
if (isWatch) {
|
22
|
-
const ctx = await esbuild.context(config);
|
23
|
-
await ctx.watch();
|
24
|
-
console.log('Watching...');
|
25
|
-
} else {
|
26
|
-
await esbuild.build(config);
|
27
|
-
console.log('Build complete');
|
28
|
-
}
|
@@ -1,24 +0,0 @@
|
|
1
|
-
import { spawn } from 'child_process';
|
2
|
-
import sirv from 'sirv';
|
3
|
-
import http from 'http';
|
4
|
-
|
5
|
-
// Start esbuild in watch mode
|
6
|
-
const esbuild = spawn('node', ['esbuild.config.js', '--watch'], {
|
7
|
-
stdio: 'inherit'
|
8
|
-
});
|
9
|
-
|
10
|
-
// Create simple static server
|
11
|
-
const serve = sirv('.', {
|
12
|
-
dev: true,
|
13
|
-
single: true
|
14
|
-
});
|
15
|
-
|
16
|
-
const server = http.createServer(serve);
|
17
|
-
server.listen(3000);
|
18
|
-
console.log('Server running at http://localhost:3000');
|
19
|
-
|
20
|
-
process.on('SIGTERM', () => {
|
21
|
-
esbuild.kill();
|
22
|
-
server.close();
|
23
|
-
process.exit();
|
24
|
-
});
|