xplorajs 0.1.8 → 0.3.0

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/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1 @@
1
+ export declare function build(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/build.ts"],"sourcesContent":["import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { glob } from \"fast-glob\";\nimport React from \"react\";\nimport { generateStaticPage } from \"xplorajs-react\";\n\ninterface Route {\n path: string;\n file: string;\n isDynamic: boolean;\n params: string[];\n}\n\nfunction convertToRoute(filePath: string): Route {\n const relativePath = filePath.replace(\"src/app/\", \"\");\n const path = relativePath\n .replace(/\\.tsx$/, \"\")\n .replace(/\\/page$/, \"\")\n .replace(/\\[([^\\]]+)\\]/g, \":$1\");\n\n const params = (relativePath.match(/\\[([^\\]]+)\\]/g) || []).map((param) =>\n param.slice(1, -1),\n );\n\n return {\n path: path === \"page\" ? \"/\" : `/${path}`,\n file: filePath,\n isDynamic: params.length > 0,\n params,\n };\n}\n\nasync function processPage(page: string, route: Route) {\n try {\n const module = await import(join(process.cwd(), page));\n const PageComponent = module.default;\n\n const getStaticProps = module.getStaticProps;\n let props = {};\n\n if (getStaticProps) {\n const result = await getStaticProps();\n props = result.props;\n }\n\n const outputPath = join(process.cwd(), \"dist\", route.path, \"index.html\");\n await generateStaticPage({\n component: React.createElement(PageComponent, props),\n outputPath,\n props,\n });\n\n console.log(`Generated ${outputPath}`);\n } catch (error) {\n console.error(`Error processing ${page}:`, error);\n }\n}\n\nexport async function build() {\n console.log(\"Building application...\");\n\n await mkdir(join(process.cwd(), \"dist\"), { recursive: true });\n\n const pages = await glob(\"src/app/**/*.tsx\", {\n ignore: [\"**/node_modules/**\"],\n });\n\n const routes: Route[] = [];\n\n for (const page of pages) {\n const route = convertToRoute(page);\n routes.push(route);\n await processPage(page, route);\n }\n\n const routesConfig = {\n routes,\n generatedAt: new Date().toISOString(),\n };\n\n await writeFile(\n join(process.cwd(), \".xplora\", \"routes.json\"),\n JSON.stringify(routesConfig, null, 2),\n );\n\n console.log(\"Build completed!\");\n console.log(\"Routes:\", routes.map((r) => r.path).join(\"\\n\"));\n}\n"],"names":["mkdir","writeFile","join","glob","React","generateStaticPage","convertToRoute","filePath","relativePath","replace","path","params","match","map","param","slice","file","isDynamic","length","processPage","page","route","module","process","cwd","PageComponent","default","getStaticProps","props","result","outputPath","component","createElement","console","log","error","build","recursive","pages","ignore","routes","push","routesConfig","generatedAt","Date","toISOString","JSON","stringify","r"],"mappings":"AAAA,SAASA,KAAK,EAAYC,SAAS,QAAQ,mBAAmB;AAC9D,SAAkBC,IAAI,QAAQ,YAAY;AAC1C,SAASC,IAAI,QAAQ,YAAY;AACjC,OAAOC,WAAW,QAAQ;AAC1B,SAASC,kBAAkB,QAAQ,iBAAiB;AASpD,SAASC,eAAeC,QAAgB;IACtC,MAAMC,eAAeD,SAASE,OAAO,CAAC,YAAY;IAClD,MAAMC,OAAOF,aACVC,OAAO,CAAC,UAAU,IAClBA,OAAO,CAAC,WAAW,IACnBA,OAAO,CAAC,iBAAiB;IAE5B,MAAME,SAAS,AAACH,CAAAA,aAAaI,KAAK,CAAC,oBAAoB,EAAE,AAAD,EAAGC,GAAG,CAAC,CAACC,QAC9DA,MAAMC,KAAK,CAAC,GAAG,CAAC;IAGlB,OAAO;QACLL,MAAMA,SAAS,SAAS,MAAM,CAAC,CAAC,EAAEA,MAAM;QACxCM,MAAMT;QACNU,WAAWN,OAAOO,MAAM,GAAG;QAC3BP;IACF;AACF;AAEA,eAAeQ,YAAYC,IAAY,EAAEC,KAAY;IACnD,IAAI;QACF,MAAMC,SAAS,MAAM,MAAM,CAACpB,KAAKqB,QAAQC,GAAG,IAAIJ;QAChD,MAAMK,gBAAgBH,OAAOI,OAAO;QAEpC,MAAMC,iBAAiBL,OAAOK,cAAc;QAC5C,IAAIC,QAAQ,CAAC;QAEb,IAAID,gBAAgB;YAClB,MAAME,SAAS,MAAMF;YACrBC,QAAQC,OAAOD,KAAK;QACtB;QAEA,MAAME,aAAa5B,KAAKqB,QAAQC,GAAG,IAAI,QAAQH,MAAMX,IAAI,EAAE;QAC3D,MAAML,mBAAmB;YACvB0B,WAAW3B,MAAM4B,aAAa,CAACP,eAAeG;YAC9CE;YACAF;QACF;QAEAK,QAAQC,GAAG,CAAC,CAAC,UAAU,EAAEJ,YAAY;IACvC,EAAE,OAAOK,OAAO;QACdF,QAAQE,KAAK,CAAC,CAAC,iBAAiB,EAAEf,KAAK,CAAC,CAAC,EAAEe;IAC7C;AACF;AAEA,OAAO,eAAeC;IACpBH,QAAQC,GAAG,CAAC;IAEZ,MAAMlC,MAAME,KAAKqB,QAAQC,GAAG,IAAI,SAAS;QAAEa,WAAW;IAAK;IAE3D,MAAMC,QAAQ,MAAMnC,KAAK,oBAAoB;QAC3CoC,QAAQ;YAAC;SAAqB;IAChC;IAEA,MAAMC,SAAkB,EAAE;IAE1B,KAAK,MAAMpB,QAAQkB,MAAO;QACxB,MAAMjB,QAAQf,eAAec;QAC7BoB,OAAOC,IAAI,CAACpB;QACZ,MAAMF,YAAYC,MAAMC;IAC1B;IAEA,MAAMqB,eAAe;QACnBF;QACAG,aAAa,IAAIC,OAAOC,WAAW;IACrC;IAEA,MAAM5C,UACJC,KAAKqB,QAAQC,GAAG,IAAI,WAAW,gBAC/BsB,KAAKC,SAAS,CAACL,cAAc,MAAM;IAGrCT,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC,WAAWM,OAAO3B,GAAG,CAAC,CAACmC,IAAMA,EAAEtC,IAAI,EAAER,IAAI,CAAC;AACxD"}
1
+ {"version":3,"sources":["../../src/commands/build.ts"],"sourcesContent":["import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { glob } from \"fast-glob\";\nimport React from \"react\";\nimport { generateStaticPage } from \"xplorajs-react\";\n\ninterface Route {\n path: string;\n file: string;\n isDynamic: boolean;\n params: string[];\n}\n\nfunction convertToRoute(filePath: string): Route {\n const relativePath = filePath.replace(\"src/app/\", \"\");\n const path = relativePath\n .replace(/\\.tsx$/, \"\")\n .replace(/\\/page$/, \"\")\n .replace(/\\[([^\\]]+)\\]/g, \":$1\");\n\n const params = (relativePath.match(/\\[([^\\]]+)\\]/g) || []).map((param) =>\n param.slice(1, -1),\n );\n\n return {\n path: path === \"page\" ? \"/\" : `/${path}`,\n file: filePath,\n isDynamic: params.length > 0,\n params,\n };\n}\n\nasync function processPage(page: string, route: Route) {\n try {\n const module = await import(join(process.cwd(), page));\n const PageComponent = module.default;\n\n const getStaticProps = module.getStaticProps;\n let props = {};\n\n if (getStaticProps) {\n const result = await getStaticProps();\n props = result.props;\n }\n\n const outputPath = join(process.cwd(), \"dist\", route.path, \"index.html\");\n await generateStaticPage({\n component: React.createElement(PageComponent, props),\n outputPath,\n props,\n });\n\n console.log(`Generated ${outputPath}`);\n } catch (error) {\n console.error(`Error processing ${page}:`, error);\n }\n}\n\nexport async function build() {\n console.log(\"Building application...\");\n\n await mkdir(join(process.cwd(), \"dist\"), { recursive: true });\n\n const pages = await glob(\"src/app/**/*.tsx\", {\n ignore: [\"**/node_modules/**\"],\n });\n\n const routes: Route[] = [];\n\n for (const page of pages) {\n const route = convertToRoute(page);\n routes.push(route);\n await processPage(page, route);\n }\n\n const routesConfig = {\n routes,\n generatedAt: new Date().toISOString(),\n };\n\n await writeFile(\n join(process.cwd(), \".xplora\", \"routes.json\"),\n JSON.stringify(routesConfig, null, 2),\n );\n\n console.log(\"Build completed!\");\n console.log(\"Routes:\", routes.map((r) => r.path).join(\"\\n\"));\n}\n"],"names":["mkdir","writeFile","join","glob","React","generateStaticPage","convertToRoute","filePath","relativePath","replace","path","params","match","map","param","slice","file","isDynamic","length","processPage","page","route","module","process","cwd","PageComponent","default","getStaticProps","props","result","outputPath","component","createElement","console","log","error","build","recursive","pages","ignore","routes","push","routesConfig","generatedAt","Date","toISOString","JSON","stringify","r"],"mappings":"AAAA,SAASA,KAAK,EAAEC,SAAS,QAAQ,mBAAmB;AACpD,SAASC,IAAI,QAAQ,YAAY;AACjC,SAASC,IAAI,QAAQ,YAAY;AACjC,OAAOC,WAAW,QAAQ;AAC1B,SAASC,kBAAkB,QAAQ,iBAAiB;AASpD,SAASC,eAAeC,QAAgB;IACtC,MAAMC,eAAeD,SAASE,OAAO,CAAC,YAAY;IAClD,MAAMC,OAAOF,aACVC,OAAO,CAAC,UAAU,IAClBA,OAAO,CAAC,WAAW,IACnBA,OAAO,CAAC,iBAAiB;IAE5B,MAAME,SAAS,AAACH,CAAAA,aAAaI,KAAK,CAAC,oBAAoB,EAAE,AAAD,EAAGC,GAAG,CAAC,CAACC,QAC9DA,MAAMC,KAAK,CAAC,GAAG,CAAC;IAGlB,OAAO;QACLL,MAAMA,SAAS,SAAS,MAAM,CAAC,CAAC,EAAEA,MAAM;QACxCM,MAAMT;QACNU,WAAWN,OAAOO,MAAM,GAAG;QAC3BP;IACF;AACF;AAEA,eAAeQ,YAAYC,IAAY,EAAEC,KAAY;IACnD,IAAI;QACF,MAAMC,SAAS,MAAM,MAAM,CAACpB,KAAKqB,QAAQC,GAAG,IAAIJ;QAChD,MAAMK,gBAAgBH,OAAOI,OAAO;QAEpC,MAAMC,iBAAiBL,OAAOK,cAAc;QAC5C,IAAIC,QAAQ,CAAC;QAEb,IAAID,gBAAgB;YAClB,MAAME,SAAS,MAAMF;YACrBC,QAAQC,OAAOD,KAAK;QACtB;QAEA,MAAME,aAAa5B,KAAKqB,QAAQC,GAAG,IAAI,QAAQH,MAAMX,IAAI,EAAE;QAC3D,MAAML,mBAAmB;YACvB0B,WAAW3B,MAAM4B,aAAa,CAACP,eAAeG;YAC9CE;YACAF;QACF;QAEAK,QAAQC,GAAG,CAAC,CAAC,UAAU,EAAEJ,YAAY;IACvC,EAAE,OAAOK,OAAO;QACdF,QAAQE,KAAK,CAAC,CAAC,iBAAiB,EAAEf,KAAK,CAAC,CAAC,EAAEe;IAC7C;AACF;AAEA,OAAO,eAAeC;IACpBH,QAAQC,GAAG,CAAC;IAEZ,MAAMlC,MAAME,KAAKqB,QAAQC,GAAG,IAAI,SAAS;QAAEa,WAAW;IAAK;IAE3D,MAAMC,QAAQ,MAAMnC,KAAK,oBAAoB;QAC3CoC,QAAQ;YAAC;SAAqB;IAChC;IAEA,MAAMC,SAAkB,EAAE;IAE1B,KAAK,MAAMpB,QAAQkB,MAAO;QACxB,MAAMjB,QAAQf,eAAec;QAC7BoB,OAAOC,IAAI,CAACpB;QACZ,MAAMF,YAAYC,MAAMC;IAC1B;IAEA,MAAMqB,eAAe;QACnBF;QACAG,aAAa,IAAIC,OAAOC,WAAW;IACrC;IAEA,MAAM5C,UACJC,KAAKqB,QAAQC,GAAG,IAAI,WAAW,gBAC/BsB,KAAKC,SAAS,CAACL,cAAc,MAAM;IAGrCT,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC,WAAWM,OAAO3B,GAAG,CAAC,CAACmC,IAAMA,EAAEtC,IAAI,EAAER,IAAI,CAAC;AACxD"}
@@ -0,0 +1 @@
1
+ export declare function dev(): Promise<void>;
@@ -52,13 +52,18 @@ export async function dev() {
52
52
  await loadPages();
53
53
  serve({
54
54
  port: 3000,
55
+ development: true,
55
56
  async fetch (req) {
56
- const url = new URL(req.url).pathname;
57
- if (url.startsWith("/assets/")) {
58
- const f = Bun.file(join(process.cwd(), "dist", url));
57
+ const url = new URL(req.url);
58
+ const path = url.pathname;
59
+ if (path === "/") {
60
+ return new Response("Hello from XploraJS!");
61
+ }
62
+ if (path.startsWith("/assets/")) {
63
+ const f = Bun.file(join(process.cwd(), "dist", path));
59
64
  if (await f.exists()) return new Response(f);
60
65
  }
61
- const Page = pages.get(url);
66
+ const Page = pages.get(path);
62
67
  if (!Page) return new Response("Not Found", {
63
68
  status: 404
64
69
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/dev.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { serve } from \"bun\";\nimport { watch } from \"chokidar\";\nimport React from \"react\";\nimport type { ComponentType } from \"react\";\nimport { WebSocketServer } from \"ws\";\nimport { renderToStream } from \"xplorajs-react\";\nimport { build } from \"./build\";\n\n// biome-ignore lint/suspicious/noExplicitAny: <intended>\nconst pages = new Map<string, ComponentType<any>>();\n\nasync function loadPages() {\n pages.clear();\n const routes = await loadRoutes();\n\n for (const route of routes) {\n const abs = join(process.cwd(), route.file);\n delete import.meta.require?.cache?.[abs];\n // biome-ignore lint/suspicious/noExplicitAny: <intended>\n pages.set(route.path, (await import(abs)).default as ComponentType<any>);\n }\n}\n\nasync function loadRoutes() {\n try {\n const routesPath = join(process.cwd(), \".xplora\", \"routes.json\");\n const routesContent = readFileSync(routesPath, \"utf-8\");\n return JSON.parse(routesContent).routes;\n } catch {\n return [];\n }\n}\n\nexport async function dev() {\n console.log(\"Starting development server...\");\n\n const wss = new WebSocketServer({ port: 3001 });\n\n const watcher = watch([\"src/**/*\"], {\n ignored: /(^|[\\/\\\\])\\../,\n persistent: true,\n });\n\n watcher.on(\"change\", async (path) => {\n console.log(`File ${path} has been changed`);\n await build();\n await loadPages();\n\n for (const client of wss.clients) {\n if (client.readyState === WebSocket.OPEN) {\n client.send(JSON.stringify({ type: \"reload\" }));\n }\n }\n });\n\n await build();\n await loadPages();\n\n serve({\n port: 3000,\n async fetch(req) {\n const url = new URL(req.url).pathname;\n\n if (url.startsWith(\"/assets/\")) {\n const f = Bun.file(join(process.cwd(), \"dist\", url));\n if (await f.exists()) return new Response(f);\n }\n\n const Page = pages.get(url);\n if (!Page) return new Response(\"Not Found\", { status: 404 });\n\n const stream = await renderToStream(React.createElement(Page));\n\n const head = `<!DOCTYPE html><html><head>\n\t\t\t\t<meta charset=\"utf-8\"/>\n\t\t\t\t<link rel=\"stylesheet\" href=\"/assets/style.css\"/>\n\t\t\t\t<script>window.process={env:{NODE_ENV:\"development\"}};</script>\n\t\t\t\t</head><body><div id=\"root\">`;\n\n const foot = `</div>\n\t\t\t\t<script type=\"module\">\n\t\t\t\t\timport * as RefreshRuntime from \"https://esm.sh/react-refresh@0.17.0/runtime\";\n\t\t\t\t\tif (window.process?.env?.NODE_ENV === \"development\") {\n\t\t\t\t\t\tconsole.log(\"Fast refresh runtime loaded in development mode\");\n\t\t\t\t\t}\n\t\t\t\t\tRefreshRuntime.injectIntoGlobalHook(window);\n\t\t\t\t\twindow.$RefreshReg$=()=>{};\n\t\t\t\t\twindow.$RefreshSig$=()=>t=>t;\n\t\t\t\t</script>\n\t\t\t\t<script>\n\t\t\t\t\tconst ws=new WebSocket(\"ws://localhost:3001\");\n\t\t\t\t\tws.onmessage=async e=>{\n\t\t\t\t\t\tif(e.data===\"css\"){\n\t\t\t\t\t\t\tdocument.querySelectorAll('link[rel=\"stylesheet\"]').forEach(l=>l.href=\"/assets/style.css?v=\"+Date.now());\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(e.data===\"reload\"){\n\t\t\t\t\t\t\tconsole.log(\"Reloading...\");\n\t\t\t\t\t\t\tlocation.reload();\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t</script>\n\t\t\t</body></html>`;\n\n return new Response(\n new ReadableStream({\n start(ctrl) {\n ctrl.enqueue(new TextEncoder().encode(head));\n if (typeof stream === \"string\") {\n ctrl.enqueue(new TextEncoder().encode(stream));\n } else {\n stream.pipeTo(\n new WritableStream({\n write(c) {\n ctrl.enqueue(c);\n },\n close() {\n ctrl.enqueue(new TextEncoder().encode(foot));\n ctrl.close();\n },\n }),\n );\n }\n },\n }),\n { headers: { \"Content-Type\": \"text/html; charset=utf-8\" } },\n );\n },\n });\n\n console.log(\"Development server running at http://localhost:3000\");\n}\n"],"names":["readFileSync","join","serve","watch","React","WebSocketServer","renderToStream","build","pages","Map","loadPages","clear","routes","loadRoutes","route","abs","process","cwd","file","require","cache","set","path","default","routesPath","routesContent","JSON","parse","dev","console","log","wss","port","watcher","ignored","persistent","on","client","clients","readyState","WebSocket","OPEN","send","stringify","type","fetch","req","url","URL","pathname","startsWith","f","Bun","exists","Response","Page","get","status","stream","createElement","head","foot","ReadableStream","start","ctrl","enqueue","TextEncoder","encode","pipeTo","WritableStream","write","c","close","headers"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/commands/dev.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { serve } from \"bun\";\nimport { watch } from \"chokidar\";\nimport React from \"react\";\nimport type { ComponentType } from \"react\";\nimport { WebSocketServer } from \"ws\";\nimport { renderToStream } from \"xplorajs-react\";\nimport { build } from \"./build\";\n\n// biome-ignore lint/suspicious/noExplicitAny: <intended>\nconst pages = new Map<string, ComponentType<Record<string, any>>>();\n\nasync function loadPages() {\n pages.clear();\n const routes = await loadRoutes();\n\n for (const route of routes) {\n const abs = join(process.cwd(), route.file);\n delete import.meta.require?.cache?.[abs];\n pages.set(\n route.path,\n // biome-ignore lint/suspicious/noExplicitAny: <intended>\n (await import(abs)).default as ComponentType<Record<string, any>>,\n );\n }\n}\n\nasync function loadRoutes() {\n try {\n const routesPath = join(process.cwd(), \".xplora\", \"routes.json\");\n const routesContent = readFileSync(routesPath, \"utf-8\");\n return JSON.parse(routesContent).routes;\n } catch {\n return [];\n }\n}\n\nexport async function dev() {\n console.log(\"Starting development server...\");\n\n const wss = new WebSocketServer({ port: 3001 });\n\n const watcher = watch([\"src/**/*\"], {\n ignored: /(^|[\\/\\\\])\\../,\n persistent: true,\n });\n\n watcher.on(\"change\", async (path: string) => {\n console.log(`File ${path} has been changed`);\n await build();\n await loadPages();\n\n for (const client of wss.clients) {\n if (client.readyState === WebSocket.OPEN) {\n client.send(JSON.stringify({ type: \"reload\" }));\n }\n }\n });\n\n await build();\n await loadPages();\n\n serve({\n port: 3000,\n development: true,\n async fetch(req: Request) {\n const url = new URL(req.url);\n const path = url.pathname;\n\n if (path === \"/\") {\n return new Response(\"Hello from XploraJS!\");\n }\n\n if (path.startsWith(\"/assets/\")) {\n const f = Bun.file(join(process.cwd(), \"dist\", path));\n if (await f.exists()) return new Response(f);\n }\n\n const Page = pages.get(path);\n if (!Page) return new Response(\"Not Found\", { status: 404 });\n\n const stream = await renderToStream(React.createElement(Page));\n\n const head = `<!DOCTYPE html><html><head>\n\t\t\t\t<meta charset=\"utf-8\"/>\n\t\t\t\t<link rel=\"stylesheet\" href=\"/assets/style.css\"/>\n\t\t\t\t<script>window.process={env:{NODE_ENV:\"development\"}};</script>\n\t\t\t\t</head><body><div id=\"root\">`;\n\n const foot = `</div>\n\t\t\t\t<script type=\"module\">\n\t\t\t\t\timport * as RefreshRuntime from \"https://esm.sh/react-refresh@0.17.0/runtime\";\n\t\t\t\t\tif (window.process?.env?.NODE_ENV === \"development\") {\n\t\t\t\t\t\tconsole.log(\"Fast refresh runtime loaded in development mode\");\n\t\t\t\t\t}\n\t\t\t\t\tRefreshRuntime.injectIntoGlobalHook(window);\n\t\t\t\t\twindow.$RefreshReg$=()=>{};\n\t\t\t\t\twindow.$RefreshSig$=()=>t=>t;\n\t\t\t\t</script>\n\t\t\t\t<script>\n\t\t\t\t\tconst ws=new WebSocket(\"ws://localhost:3001\");\n\t\t\t\t\tws.onmessage=async e=>{\n\t\t\t\t\t\tif(e.data===\"css\"){\n\t\t\t\t\t\t\tdocument.querySelectorAll('link[rel=\"stylesheet\"]').forEach(l=>l.href=\"/assets/style.css?v=\"+Date.now());\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(e.data===\"reload\"){\n\t\t\t\t\t\t\tconsole.log(\"Reloading...\");\n\t\t\t\t\t\t\tlocation.reload();\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t</script>\n\t\t\t</body></html>`;\n\n return new Response(\n new ReadableStream({\n start(ctrl) {\n ctrl.enqueue(new TextEncoder().encode(head));\n if (typeof stream === \"string\") {\n ctrl.enqueue(new TextEncoder().encode(stream));\n } else {\n stream.pipeTo(\n new WritableStream({\n write(c) {\n ctrl.enqueue(c);\n },\n close() {\n ctrl.enqueue(new TextEncoder().encode(foot));\n ctrl.close();\n },\n }),\n );\n }\n },\n }),\n { headers: { \"Content-Type\": \"text/html; charset=utf-8\" } },\n );\n },\n });\n\n console.log(\"Development server running at http://localhost:3000\");\n}\n"],"names":["readFileSync","join","serve","watch","React","WebSocketServer","renderToStream","build","pages","Map","loadPages","clear","routes","loadRoutes","route","abs","process","cwd","file","require","cache","set","path","default","routesPath","routesContent","JSON","parse","dev","console","log","wss","port","watcher","ignored","persistent","on","client","clients","readyState","WebSocket","OPEN","send","stringify","type","development","fetch","req","url","URL","pathname","Response","startsWith","f","Bun","exists","Page","get","status","stream","createElement","head","foot","ReadableStream","start","ctrl","enqueue","TextEncoder","encode","pipeTo","WritableStream","write","c","close","headers"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function start(): Promise<void>;
@@ -1,12 +1,23 @@
1
+ import { serve } from "bun";
1
2
  export async function start() {
2
3
  console.log("Starting production server...");
3
- const server = Bun.serve({
4
- port: 3000,
5
- fetch (req) {
6
- return new Response("Production server running...");
4
+ const config = {
5
+ port: 3000
6
+ };
7
+ serve({
8
+ port: config.port,
9
+ async fetch (req) {
10
+ const url = new URL(req.url);
11
+ const path = url.pathname;
12
+ if (path === "/") {
13
+ return new Response("Hello from XploraJS!");
14
+ }
15
+ return new Response("Not found", {
16
+ status: 404
17
+ });
7
18
  }
8
19
  });
9
- console.log(`Production server running at http://localhost:${server.port}`);
20
+ console.log("Production server running at http://localhost:3000");
10
21
  }
11
22
 
12
23
  //# sourceMappingURL=start.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/start.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport async function start() {\n console.log(\"Starting production server...\");\n\n const server = Bun.serve({\n port: 3000,\n fetch(req) {\n // TODO: Implement production server logic\n return new Response(\"Production server running...\");\n },\n });\n\n console.log(`Production server running at http://localhost:${server.port}`);\n}\n"],"names":["start","console","log","server","Bun","serve","port","fetch","req","Response"],"mappings":"AAGA,OAAO,eAAeA;IACpBC,QAAQC,GAAG,CAAC;IAEZ,MAAMC,SAASC,IAAIC,KAAK,CAAC;QACvBC,MAAM;QACNC,OAAMC,GAAG;YAEP,OAAO,IAAIC,SAAS;QACtB;IACF;IAEAR,QAAQC,GAAG,CAAC,CAAC,8CAA8C,EAAEC,OAAOG,IAAI,EAAE;AAC5E"}
1
+ {"version":3,"sources":["../../src/commands/start.ts"],"sourcesContent":["import { serve } from \"bun\";\n\nexport async function start() {\n console.log(\"Starting production server...\");\n\n const config = {\n port: 3000,\n };\n\n serve({\n port: config.port,\n async fetch(req: Request) {\n const url = new URL(req.url);\n const path = url.pathname;\n\n if (path === \"/\") {\n return new Response(\"Hello from XploraJS!\");\n }\n\n return new Response(\"Not found\", { status: 404 });\n },\n });\n\n console.log(\"Production server running at http://localhost:3000\");\n}\n"],"names":["serve","start","console","log","config","port","fetch","req","url","URL","path","pathname","Response","status"],"mappings":"AAAA,SAASA,KAAK,QAAQ,MAAM;AAE5B,OAAO,eAAeC;IACpBC,QAAQC,GAAG,CAAC;IAEZ,MAAMC,SAAS;QACbC,MAAM;IACR;IAEAL,MAAM;QACJK,MAAMD,OAAOC,IAAI;QACjB,MAAMC,OAAMC,GAAY;YACtB,MAAMC,MAAM,IAAIC,IAAIF,IAAIC,GAAG;YAC3B,MAAME,OAAOF,IAAIG,QAAQ;YAEzB,IAAID,SAAS,KAAK;gBAChB,OAAO,IAAIE,SAAS;YACtB;YAEA,OAAO,IAAIA,SAAS,aAAa;gBAAEC,QAAQ;YAAI;QACjD;IACF;IAEAX,QAAQC,GAAG,CAAC;AACd"}
@@ -0,0 +1,18 @@
1
+ interface XploraConfig {
2
+ dev?: {
3
+ port?: number;
4
+ hmr?: boolean;
5
+ };
6
+ static?: {
7
+ outputDir?: string;
8
+ revalidate?: number;
9
+ fallback?: boolean;
10
+ };
11
+ build?: {
12
+ minify?: boolean;
13
+ sourcemap?: boolean;
14
+ };
15
+ }
16
+ declare function defineConfig(config: XploraConfig): XploraConfig;
17
+ export type { XploraConfig };
18
+ export { defineConfig };
package/dist/config.js CHANGED
@@ -1,4 +1,4 @@
1
- export function defineConfig(config) {
1
+ function defineConfig(config) {
2
2
  return {
3
3
  dev: {
4
4
  port: 3000,
@@ -18,5 +18,6 @@ export function defineConfig(config) {
18
18
  }
19
19
  };
20
20
  }
21
+ export { defineConfig };
21
22
 
22
23
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts"],"sourcesContent":["export interface XploraConfig {\n\tdev?: {\n\t\tport?: number;\n\t\thmr?: boolean;\n\t};\n\tstatic?: {\n\t\toutputDir?: string;\n\t\trevalidate?: number;\n\t\tfallback?: boolean;\n\t};\n\tbuild?: {\n\t\tminify?: boolean;\n\t\tsourcemap?: boolean;\n\t};\n}\n\nexport function defineConfig(config: XploraConfig): XploraConfig {\n\treturn {\n\t\tdev: {\n\t\t\tport: 3000,\n\t\t\thmr: true,\n\t\t\t...config.dev,\n\t\t},\n\t\tstatic: {\n\t\t\toutputDir: \"./dist\",\n\t\t\trevalidate: 3600,\n\t\t\tfallback: false,\n\t\t\t...config.static,\n\t\t},\n\t\tbuild: {\n\t\t\tminify: true,\n\t\t\tsourcemap: true,\n\t\t\t...config.build,\n\t\t},\n\t};\n}\n"],"names":["defineConfig","config","dev","port","hmr","static","outputDir","revalidate","fallback","build","minify","sourcemap"],"mappings":"AAgBA,OAAO,SAASA,aAAaC,MAAoB;IAChD,OAAO;QACNC,KAAK;YACJC,MAAM;YACNC,KAAK;YACL,GAAGH,OAAOC,GAAG;QACd;QACAG,QAAQ;YACPC,WAAW;YACXC,YAAY;YACZC,UAAU;YACV,GAAGP,OAAOI,MAAM;QACjB;QACAI,OAAO;YACNC,QAAQ;YACRC,WAAW;YACX,GAAGV,OAAOQ,KAAK;QAChB;IACD;AACD"}
1
+ {"version":3,"sources":["../src/config.ts"],"sourcesContent":["interface XploraConfig {\n dev?: {\n port?: number;\n hmr?: boolean;\n };\n static?: {\n outputDir?: string;\n revalidate?: number;\n fallback?: boolean;\n };\n build?: {\n minify?: boolean;\n sourcemap?: boolean;\n };\n}\n\nfunction defineConfig(config: XploraConfig): XploraConfig {\n return {\n dev: {\n port: 3000,\n hmr: true,\n ...config.dev,\n },\n static: {\n outputDir: \"./dist\",\n revalidate: 3600,\n fallback: false,\n ...config.static,\n },\n build: {\n minify: true,\n sourcemap: true,\n ...config.build,\n },\n };\n}\n\nexport type { XploraConfig };\nexport { defineConfig };\n"],"names":["defineConfig","config","dev","port","hmr","static","outputDir","revalidate","fallback","build","minify","sourcemap"],"mappings":"AAgBA,SAASA,aAAaC,MAAoB;IACxC,OAAO;QACLC,KAAK;YACHC,MAAM;YACNC,KAAK;YACL,GAAGH,OAAOC,GAAG;QACf;QACAG,QAAQ;YACNC,WAAW;YACXC,YAAY;YACZC,UAAU;YACV,GAAGP,OAAOI,MAAM;QAClB;QACAI,OAAO;YACLC,QAAQ;YACRC,WAAW;YACX,GAAGV,OAAOQ,KAAK;QACjB;IACF;AACF;AAGA,SAAST,YAAY,GAAG"}
@@ -0,0 +1,2 @@
1
+ declare const defineConfig: any;
2
+ export { defineConfig };
package/dist/index.js CHANGED
@@ -1,3 +1,8 @@
1
- export * from "./config";
1
+ const { XploraConfig, defineConfig } = require("./config");
2
+ module.exports = {
3
+ XploraConfig,
4
+ defineConfig
5
+ };
6
+ export { defineConfig };
2
7
 
3
8
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from \"./config\";\n"],"names":[],"mappings":"AAAA,cAAc,WAAW"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["const { XploraConfig, defineConfig } = require(\"./config\");\n\nmodule.exports = {\n\tXploraConfig,\n\tdefineConfig,\n};\nexport { defineConfig };\n\n"],"names":["XploraConfig","defineConfig","require","module","exports"],"mappings":"AAAA,MAAM,EAAEA,YAAY,EAAEC,YAAY,EAAE,GAAGC,QAAQ;AAE/CC,OAAOC,OAAO,GAAG;IAChBJ;IACAC;AACD;AACA,SAASA,YAAY,GAAG"}
package/package.json CHANGED
@@ -1,12 +1,10 @@
1
1
  {
2
2
  "name": "xplorajs",
3
- "version": "0.1.8",
4
- "type": "module",
3
+ "version": "0.3.0",
5
4
  "main": "dist/index.js",
6
- "module": "dist/index.mjs",
7
5
  "types": "dist/index.d.ts",
8
6
  "bin": {
9
- "xplorajs": "./dist/cli.mjs"
7
+ "xplorajs": "./dist/cli.js"
10
8
  },
11
9
  "files": [
12
10
  "dist",
@@ -14,17 +12,17 @@
14
12
  ],
15
13
  "scripts": {
16
14
  "dev": "bun run build --watch",
17
- "build": "swc src -d dist --config-file .swcrc",
15
+ "build": "swc src -d dist --config-file .swcrc && tsc --emitDeclarationOnly",
18
16
  "prepublishOnly": "bun run build"
19
17
  },
20
18
  "dependencies": {
21
19
  "@swc/cli": "^0.1.65",
22
20
  "@swc/core": "^1.11.24",
23
21
  "chokidar": "^3.6.0",
24
- "commander": "^11.0.0",
22
+ "commander": "^11.1.0",
25
23
  "fast-glob": "^3.3.3",
26
24
  "ws": "^8.18.2",
27
- "xplorajs-react": "latest"
25
+ "xplorajs-react": "^0.2.0"
28
26
  },
29
27
  "devDependencies": {
30
28
  "@types/bun": "^1.2.13",
@@ -33,7 +31,9 @@
33
31
  },
34
32
  "peerDependencies": {
35
33
  "react": "^19.1.0",
36
- "react-dom": "^19.1.0"
34
+ "react-dom": "^19.1.0",
35
+ "@types/react": "^19.1.4",
36
+ "@types/react-dom": "^19.1.5"
37
37
  },
38
38
  "publishConfig": {
39
39
  "access": "public"
package/dist/app/page.js DELETED
@@ -1,7 +0,0 @@
1
- export default function Home() {
2
- return /*#__PURE__*/ React.createElement("section", {
3
- className: "flex h-screen items-center justify-center bg-gray-100"
4
- }, /*#__PURE__*/ React.createElement("h1", {
5
- className: "text-4xl font-bold text-teal-600"
6
- }, "XploraJS \uD83D\uDE80"));
7
- }
@@ -1,338 +0,0 @@
1
- /**
2
- * @license React
3
- * react-refresh-runtime.development.js
4
- *
5
- * Copyright (c) Meta Platforms, Inc. and affiliates.
6
- *
7
- * This source code is licensed under the MIT license found in the
8
- * LICENSE file in the root directory of this source tree.
9
- */
10
-
11
- "use strict";
12
- "production" !== process.env.NODE_ENV &&
13
- (function () {
14
- function computeFullKey(signature) {
15
- if (null !== signature.fullKey) return signature.fullKey;
16
- var fullKey = signature.ownKey;
17
- try {
18
- var hooks = signature.getCustomHooks();
19
- } catch (err) {
20
- return (signature.forceReset = !0), (signature.fullKey = fullKey);
21
- }
22
- for (var i = 0; i < hooks.length; i++) {
23
- var hook = hooks[i];
24
- if ("function" !== typeof hook)
25
- return (signature.forceReset = !0), (signature.fullKey = fullKey);
26
- hook = allSignaturesByType.get(hook);
27
- if (void 0 !== hook) {
28
- var nestedHookKey = computeFullKey(hook);
29
- hook.forceReset && (signature.forceReset = !0);
30
- fullKey += "\n---\n" + nestedHookKey;
31
- }
32
- }
33
- return (signature.fullKey = fullKey);
34
- }
35
- function resolveFamily(type) {
36
- return updatedFamiliesByType.get(type);
37
- }
38
- function cloneMap(map) {
39
- var clone = new Map();
40
- map.forEach(function (value, key) {
41
- clone.set(key, value);
42
- });
43
- return clone;
44
- }
45
- function cloneSet(set) {
46
- var clone = new Set();
47
- set.forEach(function (value) {
48
- clone.add(value);
49
- });
50
- return clone;
51
- }
52
- function getProperty(object, property) {
53
- try {
54
- return object[property];
55
- } catch (err) {}
56
- }
57
- function register(type, id) {
58
- if (
59
- !(
60
- null === type ||
61
- ("function" !== typeof type && "object" !== typeof type) ||
62
- allFamiliesByType.has(type)
63
- )
64
- ) {
65
- var family = allFamiliesByID.get(id);
66
- void 0 === family
67
- ? ((family = { current: type }), allFamiliesByID.set(id, family))
68
- : pendingUpdates.push([family, type]);
69
- allFamiliesByType.set(type, family);
70
- if ("object" === typeof type && null !== type)
71
- switch (getProperty(type, "$$typeof")) {
72
- case REACT_FORWARD_REF_TYPE:
73
- register(type.render, id + "$render");
74
- break;
75
- case REACT_MEMO_TYPE:
76
- register(type.type, id + "$type");
77
- }
78
- }
79
- }
80
- function setSignature(type, key) {
81
- var forceReset =
82
- 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : !1,
83
- getCustomHooks = 3 < arguments.length ? arguments[3] : void 0;
84
- allSignaturesByType.has(type) ||
85
- allSignaturesByType.set(type, {
86
- forceReset: forceReset,
87
- ownKey: key,
88
- fullKey: null,
89
- getCustomHooks:
90
- getCustomHooks ||
91
- function () {
92
- return [];
93
- }
94
- });
95
- if ("object" === typeof type && null !== type)
96
- switch (getProperty(type, "$$typeof")) {
97
- case REACT_FORWARD_REF_TYPE:
98
- setSignature(type.render, key, forceReset, getCustomHooks);
99
- break;
100
- case REACT_MEMO_TYPE:
101
- setSignature(type.type, key, forceReset, getCustomHooks);
102
- }
103
- }
104
- function collectCustomHooksForSignature(type) {
105
- type = allSignaturesByType.get(type);
106
- void 0 !== type && computeFullKey(type);
107
- }
108
- var REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"),
109
- REACT_MEMO_TYPE = Symbol.for("react.memo"),
110
- PossiblyWeakMap = "function" === typeof WeakMap ? WeakMap : Map,
111
- allFamiliesByID = new Map(),
112
- allFamiliesByType = new PossiblyWeakMap(),
113
- allSignaturesByType = new PossiblyWeakMap(),
114
- updatedFamiliesByType = new PossiblyWeakMap(),
115
- pendingUpdates = [],
116
- helpersByRendererID = new Map(),
117
- helpersByRoot = new Map(),
118
- mountedRoots = new Set(),
119
- failedRoots = new Set(),
120
- rootElements = "function" === typeof WeakMap ? new WeakMap() : null,
121
- isPerformingRefresh = !1;
122
- exports._getMountedRootCount = function () {
123
- return mountedRoots.size;
124
- };
125
- exports.collectCustomHooksForSignature = collectCustomHooksForSignature;
126
- exports.createSignatureFunctionForTransform = function () {
127
- var savedType,
128
- hasCustomHooks,
129
- didCollectHooks = !1;
130
- return function (type, key, forceReset, getCustomHooks) {
131
- if ("string" === typeof key)
132
- return (
133
- savedType ||
134
- ((savedType = type),
135
- (hasCustomHooks = "function" === typeof getCustomHooks)),
136
- null == type ||
137
- ("function" !== typeof type && "object" !== typeof type) ||
138
- setSignature(type, key, forceReset, getCustomHooks),
139
- type
140
- );
141
- !didCollectHooks &&
142
- hasCustomHooks &&
143
- ((didCollectHooks = !0), collectCustomHooksForSignature(savedType));
144
- };
145
- };
146
- exports.getFamilyByID = function (id) {
147
- return allFamiliesByID.get(id);
148
- };
149
- exports.getFamilyByType = function (type) {
150
- return allFamiliesByType.get(type);
151
- };
152
- exports.hasUnrecoverableErrors = function () {
153
- return !1;
154
- };
155
- exports.injectIntoGlobalHook = function (globalObject) {
156
- var hook = globalObject.__REACT_DEVTOOLS_GLOBAL_HOOK__;
157
- if (void 0 === hook) {
158
- var nextID = 0;
159
- globalObject.__REACT_DEVTOOLS_GLOBAL_HOOK__ = hook = {
160
- renderers: new Map(),
161
- supportsFiber: !0,
162
- inject: function () {
163
- return nextID++;
164
- },
165
- onScheduleFiberRoot: function () {},
166
- onCommitFiberRoot: function () {},
167
- onCommitFiberUnmount: function () {}
168
- };
169
- }
170
- if (hook.isDisabled)
171
- console.warn(
172
- "Something has shimmed the React DevTools global hook (__REACT_DEVTOOLS_GLOBAL_HOOK__). Fast Refresh is not compatible with this shim and will be disabled."
173
- );
174
- else {
175
- var oldInject = hook.inject;
176
- hook.inject = function (injected) {
177
- var id = oldInject.apply(this, arguments);
178
- "function" === typeof injected.scheduleRefresh &&
179
- "function" === typeof injected.setRefreshHandler &&
180
- helpersByRendererID.set(id, injected);
181
- return id;
182
- };
183
- hook.renderers.forEach(function (injected, id) {
184
- "function" === typeof injected.scheduleRefresh &&
185
- "function" === typeof injected.setRefreshHandler &&
186
- helpersByRendererID.set(id, injected);
187
- });
188
- var oldOnCommitFiberRoot = hook.onCommitFiberRoot,
189
- oldOnScheduleFiberRoot = hook.onScheduleFiberRoot || function () {};
190
- hook.onScheduleFiberRoot = function (id, root, children) {
191
- isPerformingRefresh ||
192
- (failedRoots.delete(root),
193
- null !== rootElements && rootElements.set(root, children));
194
- return oldOnScheduleFiberRoot.apply(this, arguments);
195
- };
196
- hook.onCommitFiberRoot = function (
197
- id,
198
- root,
199
- maybePriorityLevel,
200
- didError
201
- ) {
202
- var helpers = helpersByRendererID.get(id);
203
- if (void 0 !== helpers) {
204
- helpersByRoot.set(root, helpers);
205
- helpers = root.current;
206
- var alternate = helpers.alternate;
207
- null !== alternate
208
- ? ((alternate =
209
- null != alternate.memoizedState &&
210
- null != alternate.memoizedState.element &&
211
- mountedRoots.has(root)),
212
- (helpers =
213
- null != helpers.memoizedState &&
214
- null != helpers.memoizedState.element),
215
- !alternate && helpers
216
- ? (mountedRoots.add(root), failedRoots.delete(root))
217
- : (alternate && helpers) ||
218
- (alternate && !helpers
219
- ? (mountedRoots.delete(root),
220
- didError
221
- ? failedRoots.add(root)
222
- : helpersByRoot.delete(root))
223
- : alternate ||
224
- helpers ||
225
- (didError && failedRoots.add(root))))
226
- : mountedRoots.add(root);
227
- }
228
- return oldOnCommitFiberRoot.apply(this, arguments);
229
- };
230
- }
231
- };
232
- exports.isLikelyComponentType = function (type) {
233
- switch (typeof type) {
234
- case "function":
235
- if (null != type.prototype) {
236
- if (type.prototype.isReactComponent) return !0;
237
- var ownNames = Object.getOwnPropertyNames(type.prototype);
238
- if (
239
- 1 < ownNames.length ||
240
- "constructor" !== ownNames[0] ||
241
- type.prototype.__proto__ !== Object.prototype
242
- )
243
- return !1;
244
- }
245
- type = type.name || type.displayName;
246
- return "string" === typeof type && /^[A-Z]/.test(type);
247
- case "object":
248
- if (null != type)
249
- switch (getProperty(type, "$$typeof")) {
250
- case REACT_FORWARD_REF_TYPE:
251
- case REACT_MEMO_TYPE:
252
- return !0;
253
- }
254
- return !1;
255
- default:
256
- return !1;
257
- }
258
- };
259
- exports.performReactRefresh = function () {
260
- if (0 === pendingUpdates.length || isPerformingRefresh) return null;
261
- isPerformingRefresh = !0;
262
- try {
263
- var staleFamilies = new Set(),
264
- updatedFamilies = new Set(),
265
- updates = pendingUpdates;
266
- pendingUpdates = [];
267
- updates.forEach(function (_ref) {
268
- var family = _ref[0];
269
- _ref = _ref[1];
270
- var prevType = family.current;
271
- updatedFamiliesByType.set(prevType, family);
272
- updatedFamiliesByType.set(_ref, family);
273
- family.current = _ref;
274
- (prevType.prototype && prevType.prototype.isReactComponent) ||
275
- (_ref.prototype && _ref.prototype.isReactComponent)
276
- ? (_ref = !1)
277
- : ((prevType = allSignaturesByType.get(prevType)),
278
- (_ref = allSignaturesByType.get(_ref)),
279
- (_ref =
280
- (void 0 === prevType && void 0 === _ref) ||
281
- (void 0 !== prevType &&
282
- void 0 !== _ref &&
283
- computeFullKey(prevType) === computeFullKey(_ref) &&
284
- !_ref.forceReset)
285
- ? !0
286
- : !1));
287
- _ref ? updatedFamilies.add(family) : staleFamilies.add(family);
288
- });
289
- var update = {
290
- updatedFamilies: updatedFamilies,
291
- staleFamilies: staleFamilies
292
- };
293
- helpersByRendererID.forEach(function (helpers) {
294
- helpers.setRefreshHandler(resolveFamily);
295
- });
296
- var didError = !1,
297
- firstError = null,
298
- failedRootsSnapshot = cloneSet(failedRoots),
299
- mountedRootsSnapshot = cloneSet(mountedRoots),
300
- helpersByRootSnapshot = cloneMap(helpersByRoot);
301
- failedRootsSnapshot.forEach(function (root) {
302
- var helpers = helpersByRootSnapshot.get(root);
303
- if (void 0 === helpers)
304
- throw Error(
305
- "Could not find helpers for a root. This is a bug in React Refresh."
306
- );
307
- failedRoots.has(root);
308
- if (null !== rootElements && rootElements.has(root)) {
309
- var element = rootElements.get(root);
310
- try {
311
- helpers.scheduleRoot(root, element);
312
- } catch (err) {
313
- didError || ((didError = !0), (firstError = err));
314
- }
315
- }
316
- });
317
- mountedRootsSnapshot.forEach(function (root) {
318
- var helpers = helpersByRootSnapshot.get(root);
319
- if (void 0 === helpers)
320
- throw Error(
321
- "Could not find helpers for a root. This is a bug in React Refresh."
322
- );
323
- mountedRoots.has(root);
324
- try {
325
- helpers.scheduleRefresh(root, update);
326
- } catch (err) {
327
- didError || ((didError = !0), (firstError = err));
328
- }
329
- });
330
- if (didError) throw firstError;
331
- return update;
332
- } finally {
333
- isPerformingRefresh = !1;
334
- }
335
- };
336
- exports.register = register;
337
- exports.setSignature = setSignature;
338
- })();
@@ -1,230 +0,0 @@
1
- /*! tailwindcss v4.1.7 | MIT License | https://tailwindcss.com */
2
- @layer properties;
3
- @layer theme, base, components, utilities;
4
- @layer theme {
5
- :root, :host {
6
- --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji",
7
- "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
8
- --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
9
- "Courier New", monospace;
10
- --color-teal-600: oklch(60% 0.118 184.704);
11
- --color-gray-100: oklch(96.7% 0.003 264.542);
12
- --text-4xl: 2.25rem;
13
- --text-4xl--line-height: calc(2.5 / 2.25);
14
- --font-weight-bold: 700;
15
- --default-font-family: var(--font-sans);
16
- --default-mono-font-family: var(--font-mono);
17
- }
18
- }
19
- @layer base {
20
- *, ::after, ::before, ::backdrop, ::file-selector-button {
21
- box-sizing: border-box;
22
- margin: 0;
23
- padding: 0;
24
- border: 0 solid;
25
- }
26
- html, :host {
27
- line-height: 1.5;
28
- -webkit-text-size-adjust: 100%;
29
- tab-size: 4;
30
- font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");
31
- font-feature-settings: var(--default-font-feature-settings, normal);
32
- font-variation-settings: var(--default-font-variation-settings, normal);
33
- -webkit-tap-highlight-color: transparent;
34
- }
35
- hr {
36
- height: 0;
37
- color: inherit;
38
- border-top-width: 1px;
39
- }
40
- abbr:where([title]) {
41
- -webkit-text-decoration: underline dotted;
42
- text-decoration: underline dotted;
43
- }
44
- h1, h2, h3, h4, h5, h6 {
45
- font-size: inherit;
46
- font-weight: inherit;
47
- }
48
- a {
49
- color: inherit;
50
- -webkit-text-decoration: inherit;
51
- text-decoration: inherit;
52
- }
53
- b, strong {
54
- font-weight: bolder;
55
- }
56
- code, kbd, samp, pre {
57
- font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);
58
- font-feature-settings: var(--default-mono-font-feature-settings, normal);
59
- font-variation-settings: var(--default-mono-font-variation-settings, normal);
60
- font-size: 1em;
61
- }
62
- small {
63
- font-size: 80%;
64
- }
65
- sub, sup {
66
- font-size: 75%;
67
- line-height: 0;
68
- position: relative;
69
- vertical-align: baseline;
70
- }
71
- sub {
72
- bottom: -0.25em;
73
- }
74
- sup {
75
- top: -0.5em;
76
- }
77
- table {
78
- text-indent: 0;
79
- border-color: inherit;
80
- border-collapse: collapse;
81
- }
82
- :-moz-focusring {
83
- outline: auto;
84
- }
85
- progress {
86
- vertical-align: baseline;
87
- }
88
- summary {
89
- display: list-item;
90
- }
91
- ol, ul, menu {
92
- list-style: none;
93
- }
94
- img, svg, video, canvas, audio, iframe, embed, object {
95
- display: block;
96
- vertical-align: middle;
97
- }
98
- img, video {
99
- max-width: 100%;
100
- height: auto;
101
- }
102
- button, input, select, optgroup, textarea, ::file-selector-button {
103
- font: inherit;
104
- font-feature-settings: inherit;
105
- font-variation-settings: inherit;
106
- letter-spacing: inherit;
107
- color: inherit;
108
- border-radius: 0;
109
- background-color: transparent;
110
- opacity: 1;
111
- }
112
- :where(select:is([multiple], [size])) optgroup {
113
- font-weight: bolder;
114
- }
115
- :where(select:is([multiple], [size])) optgroup option {
116
- padding-inline-start: 20px;
117
- }
118
- ::file-selector-button {
119
- margin-inline-end: 4px;
120
- }
121
- ::placeholder {
122
- opacity: 1;
123
- }
124
- @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {
125
- ::placeholder {
126
- color: currentcolor;
127
- @supports (color: color-mix(in lab, red, red)) {
128
- color: color-mix(in oklab, currentcolor 50%, transparent);
129
- }
130
- }
131
- }
132
- textarea {
133
- resize: vertical;
134
- }
135
- ::-webkit-search-decoration {
136
- -webkit-appearance: none;
137
- }
138
- ::-webkit-date-and-time-value {
139
- min-height: 1lh;
140
- text-align: inherit;
141
- }
142
- ::-webkit-datetime-edit {
143
- display: inline-flex;
144
- }
145
- ::-webkit-datetime-edit-fields-wrapper {
146
- padding: 0;
147
- }
148
- ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {
149
- padding-block: 0;
150
- }
151
- :-moz-ui-invalid {
152
- box-shadow: none;
153
- }
154
- button, input:where([type="button"], [type="reset"], [type="submit"]), ::file-selector-button {
155
- appearance: button;
156
- }
157
- ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {
158
- height: auto;
159
- }
160
- [hidden]:where(:not([hidden="until-found"])) {
161
- display: none !important;
162
- }
163
- }
164
- @layer utilities {
165
- .flex {
166
- display: flex;
167
- }
168
- .h-screen {
169
- height: 100vh;
170
- }
171
- .transform {
172
- transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);
173
- }
174
- .items-center {
175
- align-items: center;
176
- }
177
- .justify-center {
178
- justify-content: center;
179
- }
180
- .bg-gray-100 {
181
- background-color: var(--color-gray-100);
182
- }
183
- .text-4xl {
184
- font-size: var(--text-4xl);
185
- line-height: var(--tw-leading, var(--text-4xl--line-height));
186
- }
187
- .font-bold {
188
- --tw-font-weight: var(--font-weight-bold);
189
- font-weight: var(--font-weight-bold);
190
- }
191
- .text-teal-600 {
192
- color: var(--color-teal-600);
193
- }
194
- }
195
- @property --tw-rotate-x {
196
- syntax: "*";
197
- inherits: false;
198
- }
199
- @property --tw-rotate-y {
200
- syntax: "*";
201
- inherits: false;
202
- }
203
- @property --tw-rotate-z {
204
- syntax: "*";
205
- inherits: false;
206
- }
207
- @property --tw-skew-x {
208
- syntax: "*";
209
- inherits: false;
210
- }
211
- @property --tw-skew-y {
212
- syntax: "*";
213
- inherits: false;
214
- }
215
- @property --tw-font-weight {
216
- syntax: "*";
217
- inherits: false;
218
- }
219
- @layer properties {
220
- @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
221
- *, ::before, ::after, ::backdrop {
222
- --tw-rotate-x: initial;
223
- --tw-rotate-y: initial;
224
- --tw-rotate-z: initial;
225
- --tw-skew-x: initial;
226
- --tw-skew-y: initial;
227
- --tw-font-weight: initial;
228
- }
229
- }
230
- }
package/dist/dev.js DELETED
@@ -1,21 +0,0 @@
1
- import { spawn } from "bun";
2
- var bunBin = Bun.argv[0];
3
- var cwd = import.meta.dir;
4
- spawn([
5
- bunBin,
6
- "run",
7
- "watch:css"
8
- ], {
9
- cwd: cwd,
10
- stdout: "inherit",
11
- stderr: "inherit"
12
- });
13
- spawn([
14
- bunBin,
15
- "run",
16
- "serve"
17
- ], {
18
- cwd: cwd,
19
- stdout: "inherit",
20
- stderr: "inherit"
21
- });
@@ -1,7 +0,0 @@
1
- 'use strict';
2
-
3
- if (process.env.NODE_ENV === 'production') {
4
- module.exports = require('./cjs/react-refresh-runtime.production.js');
5
- } else {
6
- module.exports = require('./cjs/react-refresh-runtime.development.js');
7
- }
@@ -1,7 +0,0 @@
1
- export default function Home() {
2
- return /*#__PURE__*/ React.createElement("section", {
3
- className: "flex h-screen items-center justify-center bg-gray-100"
4
- }, /*#__PURE__*/ React.createElement("h1", {
5
- className: "text-4xl font-bold text-teal-600"
6
- }, "Halo Xplora \uD83D\uDE80"));
7
- }
package/dist/server.js DELETED
@@ -1,391 +0,0 @@
1
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
2
- try {
3
- var info = gen[key](arg);
4
- var value = info.value;
5
- } catch (error) {
6
- reject(error);
7
- return;
8
- }
9
- if (info.done) {
10
- resolve(value);
11
- } else {
12
- Promise.resolve(value).then(_next, _throw);
13
- }
14
- }
15
- function _async_to_generator(fn) {
16
- return function() {
17
- var self = this, args = arguments;
18
- return new Promise(function(resolve, reject) {
19
- var gen = fn.apply(self, args);
20
- function _next(value) {
21
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
22
- }
23
- function _throw(err) {
24
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
25
- }
26
- _next(undefined);
27
- });
28
- };
29
- }
30
- function _ts_generator(thisArg, body) {
31
- var f, y, t, _ = {
32
- label: 0,
33
- sent: function() {
34
- if (t[0] & 1) throw t[1];
35
- return t[1];
36
- },
37
- trys: [],
38
- ops: []
39
- }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
40
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
41
- return this;
42
- }), g;
43
- function verb(n) {
44
- return function(v) {
45
- return step([
46
- n,
47
- v
48
- ]);
49
- };
50
- }
51
- function step(op) {
52
- if (f) throw new TypeError("Generator is already executing.");
53
- while(g && (g = 0, op[0] && (_ = 0)), _)try {
54
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
55
- if (y = 0, t) op = [
56
- op[0] & 2,
57
- t.value
58
- ];
59
- switch(op[0]){
60
- case 0:
61
- case 1:
62
- t = op;
63
- break;
64
- case 4:
65
- _.label++;
66
- return {
67
- value: op[1],
68
- done: false
69
- };
70
- case 5:
71
- _.label++;
72
- y = op[1];
73
- op = [
74
- 0
75
- ];
76
- continue;
77
- case 7:
78
- op = _.ops.pop();
79
- _.trys.pop();
80
- continue;
81
- default:
82
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
83
- _ = 0;
84
- continue;
85
- }
86
- if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
87
- _.label = op[1];
88
- break;
89
- }
90
- if (op[0] === 6 && _.label < t[1]) {
91
- _.label = t[1];
92
- t = op;
93
- break;
94
- }
95
- if (t && _.label < t[2]) {
96
- _.label = t[2];
97
- _.ops.push(op);
98
- break;
99
- }
100
- if (t[2]) _.ops.pop();
101
- _.trys.pop();
102
- continue;
103
- }
104
- op = body.call(thisArg, _);
105
- } catch (e) {
106
- op = [
107
- 6,
108
- e
109
- ];
110
- y = 0;
111
- } finally{
112
- f = t = 0;
113
- }
114
- if (op[0] & 5) throw op[1];
115
- return {
116
- value: op[0] ? op[1] : void 0,
117
- done: true
118
- };
119
- }
120
- }
121
- import { copyFileSync, existsSync, mkdirSync } from "node:fs";
122
- import { createRequire } from "node:module";
123
- import path from "node:path";
124
- import { serve } from "bun";
125
- import { watch } from "chokidar";
126
- import fg from "fast-glob";
127
- import React from "react";
128
- import { WebSocketServer } from "ws";
129
- import { renderToStream } from "xplorajs-react";
130
- var require = createRequire(import.meta.url);
131
- var isDev = Bun.env.NODE_ENV !== "production";
132
- var __dirname = path.dirname(new URL(import.meta.url).pathname);
133
- // Preload React-Refresh Runtime (dev only)
134
- if (isDev) {
135
- var runtimeSrc = require.resolve("react-refresh/cjs/react-refresh-runtime.development.js");
136
- var runtimeDst = path.join(__dirname, "../dist/assets/react-refresh.js");
137
- if (!existsSync(runtimeDst)) {
138
- mkdirSync(path.dirname(runtimeDst), {
139
- recursive: true
140
- });
141
- copyFileSync(runtimeSrc, runtimeDst);
142
- console.log("✓ copied react-refresh runtime");
143
- }
144
- }
145
- // HMR & CSS-watch (dev only)
146
- // biome-ignore lint/suspicious/noExplicitAny: <intended>
147
- var pages = new Map();
148
- function loadPages() {
149
- return _async_to_generator(function() {
150
- var _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, f, _require_cache, _require, route, abs, _, _tmp, err;
151
- return _ts_generator(this, function(_state) {
152
- switch(_state.label){
153
- case 0:
154
- pages.clear();
155
- _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
156
- _state.label = 1;
157
- case 1:
158
- _state.trys.push([
159
- 1,
160
- 7,
161
- 8,
162
- 9
163
- ]);
164
- return [
165
- 4,
166
- fg("src/pages/**/*.{ts,tsx}")
167
- ];
168
- case 2:
169
- _iterator = _state.sent()[Symbol.iterator]();
170
- _state.label = 3;
171
- case 3:
172
- if (!!(_iteratorNormalCompletion = (_step = _iterator.next()).done)) return [
173
- 3,
174
- 6
175
- ];
176
- f = _step.value;
177
- route = "/".concat(f.replace(/^src\/pages/, "").replace(/\/index\.(tsx|ts)$/, "").replace(/\.(tsx|ts)$/, ""));
178
- route = route === "/" ? "/" : route.replace(/\/+/g, "/");
179
- abs = path.join(__dirname, f);
180
- (_require = import.meta.require) === null || _require === void 0 ? true : (_require_cache = _require.cache) === null || _require_cache === void 0 ? true : delete _require_cache[abs];
181
- // biome-ignore lint/suspicious/noExplicitAny: <inteded>
182
- _ = pages.set;
183
- _tmp = [
184
- route
185
- ];
186
- return [
187
- 4,
188
- import(abs)
189
- ];
190
- case 4:
191
- _.apply(pages, _tmp.concat([
192
- _state.sent().default
193
- ]));
194
- _state.label = 5;
195
- case 5:
196
- _iteratorNormalCompletion = true;
197
- return [
198
- 3,
199
- 3
200
- ];
201
- case 6:
202
- return [
203
- 3,
204
- 9
205
- ];
206
- case 7:
207
- err = _state.sent();
208
- _didIteratorError = true;
209
- _iteratorError = err;
210
- return [
211
- 3,
212
- 9
213
- ];
214
- case 8:
215
- try {
216
- if (!_iteratorNormalCompletion && _iterator.return != null) {
217
- _iterator.return();
218
- }
219
- } finally{
220
- if (_didIteratorError) {
221
- throw _iteratorError;
222
- }
223
- }
224
- return [
225
- 7
226
- ];
227
- case 9:
228
- return [
229
- 2
230
- ];
231
- }
232
- });
233
- })();
234
- }
235
- await loadPages();
236
- var wss;
237
- if (isDev) {
238
- wss = new WebSocketServer({
239
- port: 4000
240
- });
241
- var broadcast = function(m) {
242
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
243
- try {
244
- for(var _iterator = wss.clients[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
245
- var client = _step.value;
246
- client.send(m);
247
- }
248
- } catch (err) {
249
- _didIteratorError = true;
250
- _iteratorError = err;
251
- } finally{
252
- try {
253
- if (!_iteratorNormalCompletion && _iterator.return != null) {
254
- _iterator.return();
255
- }
256
- } finally{
257
- if (_didIteratorError) {
258
- throw _iteratorError;
259
- }
260
- }
261
- }
262
- };
263
- watch("src/pages").on("change", function(p) {
264
- return _async_to_generator(function() {
265
- return _ts_generator(this, function(_state) {
266
- switch(_state.label){
267
- case 0:
268
- return [
269
- 4,
270
- loadPages()
271
- ];
272
- case 1:
273
- _state.sent();
274
- broadcast("refresh");
275
- console.log("🔄 Page", p);
276
- return [
277
- 2
278
- ];
279
- }
280
- });
281
- })();
282
- });
283
- watch("dist/assets/style.css").on("change", function() {
284
- broadcast("css");
285
- console.log("🔄 CSS");
286
- });
287
- }
288
- // HTTP server
289
- serve({
290
- port: Number(Bun.env.PORT || 3000),
291
- fetch: function fetch(req) {
292
- return _async_to_generator(function() {
293
- var url, f, Page, stream, head, foot;
294
- return _ts_generator(this, function(_state) {
295
- switch(_state.label){
296
- case 0:
297
- url = new URL(req.url).pathname;
298
- if (!url.startsWith("/assets/")) return [
299
- 3,
300
- 2
301
- ];
302
- f = Bun.file(path.join(__dirname, "../dist", url));
303
- return [
304
- 4,
305
- f.exists()
306
- ];
307
- case 1:
308
- if (_state.sent()) return [
309
- 2,
310
- new Response(f)
311
- ];
312
- _state.label = 2;
313
- case 2:
314
- if (isDev && url === "/react-refresh.js") {
315
- return [
316
- 2,
317
- new Response(Bun.file(path.join(__dirname, "../dist/assets/react-refresh.js")))
318
- ];
319
- }
320
- Page = pages.get(url);
321
- if (!Page) return [
322
- 2,
323
- new Response("Not Found", {
324
- status: 404
325
- })
326
- ];
327
- return [
328
- 4,
329
- renderToStream(React.createElement(Page))
330
- ];
331
- case 3:
332
- stream = _state.sent();
333
- head = '<!DOCTYPE html><html><head><meta charset="utf-8"/><link rel="stylesheet" href="/assets/style.css"/>'.concat(isDev ? '<script>/* shim for process.env */window.process={env:{NODE_ENV:"development"}};</script>' : "", '</head><body><div id="root">');
334
- foot = "</div>";
335
- if (isDev) {
336
- foot += '\n<script type="module">\n import * as RefreshRuntime from "/react-refresh.js";\n RefreshRuntime.injectIntoGlobalHook(window);\n window.$RefreshReg$ = ()=>{};\n window.$RefreshSig$ = ()=>t=>t;\n</script>\n<script>\n const ws=new WebSocket("ws://localhost:4000");\n ws.onmessage=async e=>{\n if(e.data==="css"){\n document.querySelectorAll(\'link[rel="stylesheet"]\').forEach(l=>{\n l.href="/assets/style.css?v="+Date.now();\n });\n }\n if(e.data==="refresh"){\n const m=await import(window.__root.update(m.default);\n }\n };\n</script>';
337
- }
338
- foot += "</body></html>";
339
- return [
340
- 2,
341
- new Response(new ReadableStream({
342
- start: function start(ctrl) {
343
- return _async_to_generator(function() {
344
- return _ts_generator(this, function(_state) {
345
- switch(_state.label){
346
- case 0:
347
- ctrl.enqueue(new TextEncoder().encode(head));
348
- if (!(typeof stream === "string")) return [
349
- 3,
350
- 1
351
- ];
352
- ctrl.enqueue(new TextEncoder().encode(stream));
353
- return [
354
- 3,
355
- 3
356
- ];
357
- case 1:
358
- return [
359
- 4,
360
- stream.pipeTo(new WritableStream({
361
- write: function write(c) {
362
- ctrl.enqueue(c);
363
- },
364
- close: function close() {
365
- ctrl.enqueue(new TextEncoder().encode(foot));
366
- ctrl.close();
367
- }
368
- }))
369
- ];
370
- case 2:
371
- _state.sent();
372
- _state.label = 3;
373
- case 3:
374
- return [
375
- 2
376
- ];
377
- }
378
- });
379
- })();
380
- }
381
- }), {
382
- headers: {
383
- "Content-Type": "text/html; charset=utf-8"
384
- }
385
- })
386
- ];
387
- }
388
- });
389
- })();
390
- }
391
- });