rari 0.9.2 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.mjs +3 -3
- package/dist/client.d.mts +1 -1
- package/dist/image/index.mjs +1 -1
- package/dist/{index-Dtbijzle.d.mts → index-DuCX6G_W.d.mts} +1 -1
- package/dist/index.d.mts +3 -3
- package/dist/index.mjs +1 -1
- package/dist/mdx.mjs +1 -1
- package/dist/preload-components-TyCxVZPF.mjs +1 -0
- package/dist/proxy/RariRequest.d.mts +1 -1
- package/dist/proxy/RariResponse.d.mts +1 -1
- package/dist/{railway-C_RKUxHY.mjs → railway-BlR0qYfX.mjs} +1 -1
- package/dist/regex-constants-BM4Vd-_c.mjs +1 -0
- package/dist/{render-D25Vkzyw.mjs → render-Cn2qdfZI.mjs} +1 -1
- package/dist/routes-DEvXO96u.mjs +1 -0
- package/dist/runtime/AppRouterProvider.mjs +4 -4
- package/dist/runtime/entry-client.mjs +1 -1
- package/dist/runtime/react-server-dom-rari-client.mjs +2 -2
- package/dist/runtime/rsc-client-runtime.mjs +2 -2
- package/dist/server-build-emJwCUjS.mjs +177 -0
- package/dist/sitemap-generator-Di-7pmiz.mjs +4 -0
- package/dist/utils-BTyXoHUx-Cp3JPZPF.mjs +1 -0
- package/dist/vite-BTJjUXqs.mjs +79 -0
- package/dist/vite.d.mts +3 -3
- package/dist/vite.mjs +1 -1
- package/package.json +8 -8
- package/dist/preload-components-CwqehMyC.mjs +0 -1
- package/dist/routes-DbsqVAaM.mjs +0 -1
- package/dist/server-build-DM-rQz-k.mjs +0 -177
- package/dist/sitemap-generator-D3T5zkl3.mjs +0 -4
- package/dist/utils-CvELqhML-BOdGyCyF.mjs +0 -1
- package/dist/vite-C4gs8tq5.mjs +0 -79
- /package/dist/{constants-CmqZuM5B.mjs → constants-DZAg-dr0.mjs} +0 -0
- /package/dist/{get-client-component-CR5zDUvd.mjs → get-client-component-CpMI09nb.mjs} +0 -0
- /package/dist/{robots-generator-DlnLLn5V.mjs → robots-generator-Bo5MHa-v.mjs} +0 -0
- /package/dist/{server-config-B0xinLcw.d.mts → server-config-BLpfK714.d.mts} +0 -0
- /package/dist/{types-FjFDidgJ.d.mts → types-BQ-op_Tc.d.mts} +0 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import{t as e}from"./rolldown-runtime-DR3Ue2cl.mjs";import{C as t,S as n,a as r,f as i,i as a,l as o,o as s,r as c,s as l}from"./regex-constants-BM4Vd-_c.mjs";import u from"node:fs";import d from"node:path";import f from"node:process";import{build as p}from"rolldown";var m=e({ServerComponentBuilder:()=>O,createServerBuildPlugin:()=>A,scanDirectory:()=>k});const h=/import\s*\(\s*["']([^"']+)["']\s*\)|import\s+["']([^"']+)["']/g,g=/from\s+['"]([^'"]+)['"]|import\s*\(\s*['"]([^'"]+)['"]\s*\)|import\s+['"]([^'"]+)['"]/g,_=/import(?:\s+(?:\w+|\{[^}]*\}|\*\s+as\s+\w+)(?:\s*,\s*(?:\w+|\{[^}]*\}|\*\s+as\s+\w+))*\s+from\s+)?['"]([^'"]+)['"]/g,v=/import\s+(\w+)\s+from\s+['"]([^'"]+)['"]/g,y=/import\s+(?:(\w+)|\{([^}]+)\})\s+from\s+['"]([^'"]+)['"];?\s*$/gm,b=/^proxy\.(?:tsx?|jsx?|mts|mjs)$/,x=/\\/g,S=/\.(tsx?|jsx?)$/,C=/\/components\/(\w+)(?:\.tsx?|\.jsx?)?$/,w=/[/\\]components[/\\](\w+)(?:\.tsx?|\.jsx?)?$/,T=/^export\s*\{([^}]+)\};?\s*$/gm,E=/^export\s+(const|let|var)\s+(\w+)/gm,D=/^(?:robots|sitemap)\.(?:tsx?|jsx?)$/;var O=class{serverComponents=new Map;serverActions=new Map;options;projectRoot;buildCache=new Map;htmlOnlyImports=new Set;fileImporters=new Map;getComponentCount(){return this.serverComponents.size+this.serverActions.size}constructor(e,t={}){this.projectRoot=e;let n=t.rscDir||`server`;this.options={outDir:t.outDir||d.join(e,`dist`),rscDir:n,manifestPath:t.manifestPath||d.join(n,`manifest.json`),serverConfigPath:t.serverConfigPath||d.join(n,`config.json`),minify:t.minify??f.env.NODE_ENV===`production`,alias:t.alias||{},define:t.define,csp:t.csp,rateLimit:t.rateLimit,spamBlocker:t.spamBlocker},this.parseHtmlImports()}parseHtmlImports(){let e=d.join(this.projectRoot,`index.html`);if(u.existsSync(e))try{let t=u.readFileSync(e,`utf-8`);for(let e of t.matchAll(h)){let t=e[1]||e[2];if(t.startsWith(`/src/`)){let e=d.join(this.projectRoot,t.slice(1));this.htmlOnlyImports.add(e)}}}catch(e){console.warn(`[server-build] Error parsing index.html:`,e)}}isHtmlOnlyImport(e){return this.htmlOnlyImports.has(e)}isServerComponent(e){if(e.includes(`node_modules`)||this.isHtmlOnlyImport(e))return!1;try{if(!u.existsSync(e))return!1;let t=u.readFileSync(e,`utf-8`).split(`
|
|
2
|
+
`),n=!1,r=!1;for(let e of t){let t=e.trim();if(!(t.startsWith(`//`)||t.startsWith(`/*`)||!t)){if(t===`'use client'`||t===`"use client"`||t===`'use client';`||t===`"use client";`){n=!0;break}if(t===`'use server'`||t===`"use server"`||t===`'use server';`||t===`"use server";`){r=!0;break}if(t)break}}return!n&&!r}catch{return!1}}isClientComponent(e){try{if(!u.existsSync(e))return!1;let t=u.readFileSync(e,`utf-8`),n=[`'use client'`,`"use client"`,`/* @client */`,`// @client`],r=t.trim();return n.some(e=>r.startsWith(e)||t.includes(e))}catch{return!1}}buildImportGraph(e){this.fileImporters.clear();let n=e=>{if(!u.existsSync(e))return;let r=u.readdirSync(e,{withFileTypes:!0});for(let i of r){let r=d.join(e,i.name);if(i.isDirectory()){if(i.name===`node_modules`)continue;n(r)}else if(i.isFile()&&t.test(i.name))try{let e=u.readFileSync(r,`utf-8`),t;for(g.lastIndex=0,t=g.exec(e);t!==null;){let n=t[1]||t[2]||t[3],i=null;if(n.startsWith(`./`)||n.startsWith(`../`)){let e=d.dirname(r);i=d.resolve(e,n)}else if(n.startsWith(`@/`)){let e=n.slice(2);i=d.join(this.projectRoot,`src`,e)}if(i){let e=[``,`.ts`,`.tsx`,`.js`,`.jsx`],t=null;for(let n of e){let e=i+n;if(u.existsSync(e)&&u.statSync(e).isFile()){t=e;break}}t&&(this.fileImporters.has(t)||this.fileImporters.set(t,new Set),this.fileImporters.get(t).add(r))}t=g.exec(e)}}catch(e){e?.code!==`ENOENT`&&console.warn(`[rari] Unexpected error building import graph:`,r,e)}}};n(e)}isOnlyImportedByClientComponents(e){let t=this.fileImporters.get(e);if(!t||t.size===0)return!1;for(let e of t)if(!this.isClientComponent(e)&&!this.isOnlyImportedByClientComponents(e))return!1;return!0}addServerComponent(e){let t=u.readFileSync(e,`utf-8`);if(this.isServerAction(t)){let n=this.extractDependencies(t),r=this.hasNodeImports(t);this.serverActions.set(e,{filePath:e,originalCode:t,dependencies:n,hasNodeImports:r});return}if(!this.isServerComponent(e))return;let n=this.extractDependencies(t),r=this.hasNodeImports(t);this.serverComponents.set(e,{filePath:e,originalCode:t,dependencies:n,hasNodeImports:r})}isServerAction(e){let t=e.split(`
|
|
3
|
+
`);for(let e of t){let t=e.trim();if(!(t.startsWith(`//`)||t.startsWith(`/*`)||!t)){if(t===`'use server'`||t===`"use server"`||t===`'use server';`||t===`"use server";`)return!0;if(t)break}}return!1}extractDependencies(e){let t=[],n;for(_.lastIndex=0;n=_.exec(e),n!==null;){let e=n[1];!e.startsWith(`.`)&&!e.startsWith(`/`)&&!e.startsWith(`node:`)&&!this.isNodeBuiltin(e)&&t.push(e)}return[...new Set(t)]}isNodeBuiltin(e){return[`fs`,`path`,`os`,`crypto`,`util`,`stream`,`events`,`process`,`buffer`,`url`,`querystring`,`zlib`,`http`,`https`,`net`,`tls`,`child_process`,`cluster`,`worker_threads`].includes(e)}hasNodeImports(e){return e.includes(`from 'node:`)||e.includes(`from "node:`)||e.includes(`from 'fs'`)||e.includes(`from "fs"`)||e.includes(`from 'path'`)||e.includes(`from "path"`)||e.includes(`from 'os'`)||e.includes(`from "os"`)||e.includes(`from 'crypto'`)||e.includes(`from "crypto"`)||e.includes(`from 'util'`)||e.includes(`from "util"`)||e.includes(`from 'stream'`)||e.includes(`from "stream"`)||e.includes(`from 'events'`)||e.includes(`from "events"`)}async getTransformedComponentsForDevelopment(){let e=[];for(let[t]of this.serverComponents){let n=d.relative(this.projectRoot,t),r=this.getComponentId(n),i=await this.buildComponentCodeOnly(t);e.push({id:r,code:i})}for(let[t]of this.serverActions){let n=d.relative(this.projectRoot,t),r=this.getComponentId(n),i=await this.buildComponentCodeOnly(t);e.push({id:r,code:i})}return e}transformComponentImportsToGlobal(e){let t=[];for(let n of e.matchAll(v)){let[e,r,i]=n;if(!i.startsWith(`.`)&&!i.startsWith(`@`)&&!i.startsWith(`~`)&&!i.startsWith(`#`))continue;let a=null;if(i.startsWith(`.`)){if(i.includes(`/components/`)){let n=i.match(C);if(n){let i=n[1],a=[d.resolve(this.projectRoot,`src`,`components`,`${i}.tsx`),d.resolve(this.projectRoot,`src`,`components`,`${i}.ts`),d.resolve(this.projectRoot,`src`,`components`,`${i}.jsx`),d.resolve(this.projectRoot,`src`,`components`,`${i}.js`)],o=!1;for(let e of a)if(u.existsSync(e)&&this.isClientComponent(e)){o=!0;break}if(!o)continue;let s=`// Component reference: ${i}
|
|
4
|
+
const ${r} = (props) => {
|
|
5
|
+
let Component = globalThis['~rsc']?.components?.['components/${i}']
|
|
6
|
+
|| globalThis['~rsc']?.modules?.['components/${i}']?.default
|
|
7
|
+
|| globalThis['components/${i}'];
|
|
8
|
+
|
|
9
|
+
if (Component && typeof Component === 'object' && Component.default) {
|
|
10
|
+
Component = Component.default;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
if (!Component) {
|
|
14
|
+
throw new Error('Component components/${i} not loaded');
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (typeof Component !== 'function') {
|
|
18
|
+
throw new Error('Component components/${i} is not a function, got: ' + typeof Component);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return Component(props);
|
|
22
|
+
}`;t.push({original:e,replacement:s})}}continue}let o=this.options.alias||{};for(let[e,t]of Object.entries(o))if(i.startsWith(`${e}/`)||i===e){let n=i.slice(e.length);a=d.join(t,n);break}if(a){let n=a.match(w);if(n){let i=n[1],o=d.isAbsolute(a)?a:d.resolve(this.projectRoot,a),s=[o,`${o}.tsx`,`${o}.ts`,`${o}.jsx`,`${o}.js`],c=!1,l=o;for(let e of s)if(u.existsSync(e)){l=e,this.isClientComponent(e)&&(c=!0);break}if(!c)continue;let f=d.relative(this.projectRoot,l),p=this.getComponentId(f),m=`// Component reference: ${i}
|
|
23
|
+
const ${r} = (props) => {
|
|
24
|
+
let Component = globalThis['~rsc']?.components?.['${p}']
|
|
25
|
+
|| globalThis['~rsc']?.modules?.['${p}']?.default
|
|
26
|
+
|| globalThis['${p}'];
|
|
27
|
+
|
|
28
|
+
if (Component && typeof Component === 'object' && Component.default) {
|
|
29
|
+
Component = Component.default;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (!Component) {
|
|
33
|
+
throw new Error('Component ${p} not loaded');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (typeof Component !== 'function') {
|
|
37
|
+
throw new Error('Component ${p} is not a function, got: ' + typeof Component);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return Component(props);
|
|
41
|
+
}`;t.push({original:e,replacement:m})}}}let n=e;for(let{original:e,replacement:r}of t)n=n.replace(e,r);return n}isPageComponent(e){return e.includes(`/app/`)||e.includes(`\\app\\`)}createBuildPlugins(e,t,n,r,a=!1){let o=d.dirname(r),s=b.test(d.basename(r)),c=this,l=new Map,f=new Map;return[{name:`virtual-module`,resolveId(t,n){if(t===e)return t;if(n===e&&(t.startsWith(`./`)||t.startsWith(`../`))){let e=d.resolve(o,t);for(let t of[`.ts`,`.tsx`,`.js`,`.jsx`,``]){let n=e+t;if(u.existsSync(n)&&u.statSync(n).isFile())return n}for(let t of[`.ts`,`.tsx`,`.js`,`.jsx`]){let n=d.join(e,`index${t}`);if(u.existsSync(n))return n}return e}return null},load(r){return r===e?{code:t,moduleType:n}:null}},{name:`resolve-client-server-boundaries`,resolveId:(t,n)=>{if(!n||n.includes(`node_modules`)||n.includes(`/packages/rari/dist`)||t.startsWith(`node:`)||c.isNodeBuiltin(t)||t===`react`||t===`react-dom`||t===`react/jsx-runtime`||t===`react/jsx-dev-runtime`)return null;let r=null,i=c.options.alias||{};for(let[e,n]of Object.entries(i))if(t.startsWith(`${e}/`)||t===e){let i=t.slice(e.length),a=d.join(n,i);r=d.isAbsolute(a)?a:d.resolve(c.projectRoot,a);break}if(!r&&(t.startsWith(`./`)||t.startsWith(`../`))){let i=n===e?o:d.dirname(n);r=d.resolve(i,t)}if(r)for(let e of[``,`.ts`,`.tsx`,`.js`,`.jsx`]){let t=r+e;if(u.existsSync(t)&&u.statSync(t).isFile()){if(c.isClientComponent(t)){let e=d.relative(c.projectRoot,t),n=e.startsWith(`..`)?t:e;return l.set(t,n),{id:`\0client-ref:${t}`}}try{let e=u.readFileSync(t,`utf-8`).split(`
|
|
42
|
+
`);for(let n of e){let e=n.trim();if(!(e.startsWith(`//`)||e.startsWith(`/*`)||!e)){if(e===`'use server'`||e===`"use server"`||e===`'use server';`||e===`"use server";`){let e=d.relative(c.projectRoot,t),n=e.startsWith(`..`)?t:e;return f.set(t,n),{id:`\0server-action:${t}`}}if(e)break}}}catch(e){console.error(`[rari] Failed to read file for server action detection: ${t}`,e)}break}}return null},load(e){if(e.startsWith(`\0client-ref:`)){let t=e.slice(12),n=d.relative(c.projectRoot,t),r=l.get(t)||(n.startsWith(`..`)?t:n);return{code:`
|
|
43
|
+
function registerClientReference(clientReference, id, exportName) {
|
|
44
|
+
const key = id + '#' + exportName;
|
|
45
|
+
const clientProxy = {};
|
|
46
|
+
Object.defineProperty(clientProxy, '$$typeof', {
|
|
47
|
+
value: Symbol.for('react.client.reference'),
|
|
48
|
+
enumerable: false
|
|
49
|
+
});
|
|
50
|
+
Object.defineProperty(clientProxy, '$$id', {
|
|
51
|
+
value: key,
|
|
52
|
+
enumerable: false
|
|
53
|
+
});
|
|
54
|
+
Object.defineProperty(clientProxy, '$$async', {
|
|
55
|
+
value: false,
|
|
56
|
+
enumerable: false
|
|
57
|
+
});
|
|
58
|
+
try {
|
|
59
|
+
if (typeof globalThis['~rari']?.bridge !== 'undefined' &&
|
|
60
|
+
typeof globalThis['~rari'].bridge.registerClientReference === 'function') {
|
|
61
|
+
globalThis['~rari'].bridge.registerClientReference(key, id, exportName);
|
|
62
|
+
}
|
|
63
|
+
} catch (error) {
|
|
64
|
+
console.error('[rari] Build: Failed to register client reference:', error);
|
|
65
|
+
}
|
|
66
|
+
return clientProxy;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export default registerClientReference(null, ${JSON.stringify(r)}, "default");
|
|
70
|
+
`,moduleType:`js`}}if(e.startsWith(`\0server-action:`)){let t=e.slice(15);return{code:`export * from ${JSON.stringify(t)};`,moduleType:`js`}}return null}},{name:`use-transformed-server-components`,resolveId:(e,t)=>{if(!a)return null;if(e.startsWith(`file://`)){let t=e.replace(i,``);return u.existsSync(t)?{id:`\0transformed:${t}`}:null}let n=null,r=c.options.alias||{};for(let[t,i]of Object.entries(r))if(e.startsWith(`${t}/`)||e===t){let r=e.slice(t.length),a=d.join(i,r);n=d.isAbsolute(a)?a:d.resolve(c.projectRoot,a);break}let s=t?.startsWith(`\0`)?o:t?d.dirname(t):o;if(!n&&(e.startsWith(`./`)||e.startsWith(`../`))&&(n=d.resolve(s,e)),!n||s.includes(`node_modules`))return null;for(let e of[``,`.ts`,`.tsx`,`.js`,`.jsx`]){let t=n+e;if(u.existsSync(t)&&u.statSync(t).isFile()){if(c.isClientComponent(t))return null;let e=d.join(c.projectRoot,`src`);if(!t.startsWith(e))return null;let n=d.relative(e,t),r=d.join(c.options.outDir,c.options.rscDir,n.replace(S,`.js`));if(u.existsSync(r))return{id:`\0transformed:${r}`};break}}return null},load(e){if(e.startsWith(`\0transformed:`)){let t=e.slice(13);return{code:u.readFileSync(t,`utf-8`),moduleType:`js`}}return null}},{name:`resolve-aliases`,resolveId:e=>{if(e.startsWith(`\0`))return null;let t=c.options.alias||{};for(let[n,r]of Object.entries(t))if(e.startsWith(`${n}/`)||e===n){let t=e.slice(n.length),i=d.join(r,t),a=d.isAbsolute(i)?i:d.resolve(c.projectRoot,i);for(let e of[``,`.ts`,`.tsx`,`.js`,`.jsx`]){let t=a+e;if(u.existsSync(t)&&u.statSync(t).isFile())return t}for(let e of[`.ts`,`.tsx`,`.js`,`.jsx`]){let t=d.join(a,`index${e}`);if(u.existsSync(t))return t}return a}return null}},{name:`resolve-rari-proxy`,resolveId:e=>{if(s&&e===`rari`){let e=d.resolve(c.projectRoot,`node_modules/rari/dist/proxy/RariResponse.mjs`);if(u.existsSync(e))return e;let t=d.resolve(c.projectRoot,`node_modules/rari/src/proxy/RariResponse.ts`);if(u.existsSync(t))return t}return null}},{name:`externalize-deps`,resolveId:e=>e.startsWith(`\0`)?null:e.startsWith(`node:`)||c.isNodeBuiltin(e)||[`react`,`react-dom`,`react/jsx-runtime`,`react/jsx-dev-runtime`,`rari/image`].includes(e)?{id:e,external:!0}:e===`rari`||e===`rari/client`?null:!e.startsWith(`.`)&&!e.startsWith(`/`)?{id:e,external:!0}:null}]}async buildComponentCodeOnly(e){let t=await u.promises.readFile(e,`utf-8`),n=this.transformClientImports(t,e),r=this.isPageComponent(e),i=r?this.transformComponentImportsToGlobal(n):n,a=d.extname(e),o;o=a===`.tsx`?`tsx`:a===`.ts`?`ts`:a===`.jsx`?`jsx`:`js`;let s=`\0virtual:${e}`,c=await p({input:s,platform:`node`,write:!1,output:{format:`esm`,minify:this.options.minify},moduleTypes:{[`.${o}`]:o},resolve:{mainFields:[`module`,`main`],conditionNames:[`import`,`module`,`default`],extensions:[`.ts`,`.tsx`,`.js`,`.jsx`]},transform:{jsx:`react`,define:{global:`globalThis`,"process.env.NODE_ENV":JSON.stringify(f.env.NODE_ENV||`production`),...this.options.define}},plugins:this.createBuildPlugins(s,i,o,e,r)});if(!c.output||c.output.length===0)throw Error(`No output generated from Rolldown`);let l=c.output.find(e=>e.type===`chunk`&&e.isEntry);if(!l||l.type!==`chunk`)throw Error(`No entry chunk found in Rolldown output`);let m=l.code;return m=`// Built: ${new Date().toISOString()}\n${m}`,m}async buildServerComponents(){let e=d.join(this.options.outDir,this.options.rscDir);await u.promises.mkdir(e,{recursive:!0});let t={react:`npm:react@19`,"react-dom":`npm:react-dom@19`,"react/jsx-runtime":`npm:react@19/jsx-runtime`,"react/jsx-dev-runtime":`npm:react@19/jsx-dev-runtime`},n=this.options.alias||{};for(let[e,r]of Object.entries(n)){let n=d.isAbsolute(r)?r:d.resolve(this.projectRoot,r);t[`${e}/`]=`file://${n}/`}let r={components:{},importMap:{imports:t},version:`1.0.0`,buildTime:new Date().toISOString()};for(let[e,t]of this.serverComponents){if(this.isPageComponent(e))continue;let n=d.relative(this.projectRoot,e),i=this.getComponentId(n),a=d.join(this.options.rscDir,`${i}.js`),o=d.join(this.options.outDir,a),s=d.dirname(o);await u.promises.mkdir(s,{recursive:!0}),await this.buildSingleComponent(e,o);let c=`file://${d.resolve(this.projectRoot,o)}`;r.components[i]={id:i,filePath:e,relativePath:n,bundlePath:a,moduleSpecifier:c,dependencies:t.dependencies,hasNodeImports:t.hasNodeImports}}for(let[e,t]of this.serverComponents){if(!this.isPageComponent(e))continue;let n=d.relative(this.projectRoot,e),i=this.getComponentId(n),a=d.join(this.options.rscDir,`${i}.js`),o=d.join(this.options.outDir,a),s=d.dirname(o);await u.promises.mkdir(s,{recursive:!0}),await this.buildSingleComponent(e,o);let c=`file://${d.resolve(this.projectRoot,o)}`;r.components[i]={id:i,filePath:e,relativePath:n,bundlePath:a,moduleSpecifier:c,dependencies:t.dependencies,hasNodeImports:t.hasNodeImports}}for(let[e,t]of this.serverActions){let n=d.relative(this.projectRoot,e),i=this.getComponentId(n),a=d.join(this.options.rscDir,`${i}.js`),o=d.join(this.options.outDir,a),s=d.dirname(o);await u.promises.mkdir(s,{recursive:!0}),await this.buildSingleComponent(e,o);let c=`file://${d.resolve(this.projectRoot,o)}`;r.components[i]={id:i,filePath:e,relativePath:n,bundlePath:a,moduleSpecifier:c,dependencies:t.dependencies,hasNodeImports:t.hasNodeImports}}let i=d.join(this.options.outDir,this.options.manifestPath);await u.promises.writeFile(i,JSON.stringify(r,null,2),`utf-8`);let a={};this.options.csp&&(a.csp=this.options.csp),this.options.rateLimit&&(a.rateLimit=this.options.rateLimit),this.options.spamBlocker&&(a.spamBlocker=this.options.spamBlocker);let o=d.join(this.options.outDir,this.options.serverConfigPath);if(Object.keys(a).length===0)try{await u.promises.unlink(o)}catch(e){e.code!==`ENOENT`&&console.warn(`Failed to remove server config file:`,e)}else await u.promises.writeFile(o,JSON.stringify(a,null,2),`utf-8`);return r}async buildSingleComponent(e,t,n=!1){let r=await u.promises.readFile(e,`utf-8`),i=this.transformClientImports(r,e),a=this.isPageComponent(e),o=a?this.transformComponentImportsToGlobal(i):i,s=d.extname(e),c;c=s===`.tsx`?`tsx`:s===`.ts`?`ts`:s===`.jsx`?`jsx`:`js`;let l=`\0virtual:${e}`,m=await p({input:l,platform:`node`,write:!1,output:{format:`esm`,minify:this.options.minify},moduleTypes:{[`.${c}`]:c},resolve:{mainFields:[`module`,`main`],conditionNames:[`import`,`module`,`default`],extensions:[`.ts`,`.tsx`,`.js`,`.jsx`]},transform:{jsx:`react`,define:{global:`globalThis`,"process.env.NODE_ENV":JSON.stringify(f.env.NODE_ENV||`production`),...this.options.define}},plugins:this.createBuildPlugins(l,o,c,e,a)});if(!m.output||m.output.length===0)throw Error(`No output generated from Rolldown`);let h=m.output.find(e=>e.type===`chunk`&&e.isEntry);if(!h||h.type!==`chunk`)throw Error(`No entry chunk found in Rolldown output`);let g=h.code;g=`// Built: ${new Date().toISOString()}\n${g}`,await u.promises.writeFile(t,g,`utf-8`);let _=await u.promises.open(t,`r+`);if(await _.sync(),await _.close(),n)return g}createSelfRegisteringModule(e,t){if(e.includes(`Self-registering Production Component`))return e;let n=e,i=null,c=[];if(n=n.replace(s,(e,t)=>(i=t,`function ${t}`)),n=n.replace(a,(e,t)=>(i=t,`async function ${t}`)),n=n.replace(l,(e,t)=>(i=t,`// Default export: ${t}`)),n=n.replace(r,(e,t)=>(i=t,`// Default export: ${t}`)),n=n.replace(T,(e,r)=>{let a=r.split(`,`).map(e=>e.trim()),o=[];return a.forEach(e=>{if(e.includes(`as default`)){let t=e.replace(`as default`,``).trim();i=t,o.push(`${t} (default)`)}else if(e===`default`){let e=`${t}_default`;n.includes(`var ${e}`)&&(i=e),o.push(`default`)}else c.push(e),o.push(e)}),`// Exports: ${o.join(`, `)}`}),n=n.replace(o,(e,t)=>(c.push(t),e.replace(`export `,``))),n=n.replace(E,(e,t,n)=>(c.push(n),`${t} ${n}`)),!i){let e=`${t}_default`;n.includes(`var ${e}`)&&(i=e)}return`// Self-registering Production Component: ${t}
|
|
71
|
+
|
|
72
|
+
if (!globalThis["${t}"]) {
|
|
73
|
+
${n}
|
|
74
|
+
|
|
75
|
+
try {
|
|
76
|
+
const moduleKey = "${t}";
|
|
77
|
+
let mainExport = null;
|
|
78
|
+
const exportedFunctions = {};
|
|
79
|
+
|
|
80
|
+
if (!globalThis['~serverFunctions']) globalThis['~serverFunctions'] = {};
|
|
81
|
+
if (!globalThis['~serverFunctions'].all) globalThis['~serverFunctions'].all = {};
|
|
82
|
+
|
|
83
|
+
${c.map(e=>`if (typeof ${e} !== 'undefined') {
|
|
84
|
+
globalThis.${e} = ${e};
|
|
85
|
+
globalThis['~serverFunctions'].all['${e}'] = ${e};
|
|
86
|
+
exportedFunctions['${e}'] = ${e};
|
|
87
|
+
}`).join(`
|
|
88
|
+
`)}
|
|
89
|
+
|
|
90
|
+
${i?`if (typeof ${i} !== 'undefined') {
|
|
91
|
+
mainExport = ${i};
|
|
92
|
+
}`:``}
|
|
93
|
+
|
|
94
|
+
if (mainExport === null && Object.keys(exportedFunctions).length > 0) {
|
|
95
|
+
if (Object.keys(exportedFunctions).length === 1) {
|
|
96
|
+
mainExport = exportedFunctions[Object.keys(exportedFunctions)[0]];
|
|
97
|
+
} else {
|
|
98
|
+
let componentFunction = null;
|
|
99
|
+
let firstFunction = null;
|
|
100
|
+
|
|
101
|
+
for (const [name, value] of Object.entries(exportedFunctions)) {
|
|
102
|
+
if (typeof value === 'function') {
|
|
103
|
+
if (!firstFunction) firstFunction = value;
|
|
104
|
+
if (/^[A-Z]/.test(name)) {
|
|
105
|
+
componentFunction = value;
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
mainExport = componentFunction || firstFunction;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (mainExport !== null) {
|
|
116
|
+
if (!globalThis[moduleKey]) {
|
|
117
|
+
globalThis[moduleKey] = mainExport;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (!globalThis['~rsc']) globalThis['~rsc'] = {};
|
|
121
|
+
globalThis['~rsc'].components = globalThis['~rsc'].components || {};
|
|
122
|
+
globalThis['~rsc'].components[moduleKey] = mainExport;
|
|
123
|
+
|
|
124
|
+
globalThis['~rsc'].modules = globalThis['~rsc'].modules || {};
|
|
125
|
+
globalThis['~rsc'].modules[moduleKey] = { default: mainExport, ...exportedFunctions };
|
|
126
|
+
|
|
127
|
+
if (typeof globalThis.RscModuleManager !== 'undefined' && globalThis.RscModuleManager.register) {
|
|
128
|
+
globalThis.RscModuleManager.register(moduleKey, mainExport, exportedFunctions);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
} catch (error) {
|
|
132
|
+
console.error('[rari] Build: Error in self-registration for ${t}:', error);
|
|
133
|
+
}
|
|
134
|
+
}`}transformClientImports(e,t){let n=e,r,i=[],a=!1,o=[`rari/image`];for(y.lastIndex=0;r=y.exec(e),r!==null;){let[e,n,s,c]=r,l=!1,u=c;if(o.includes(c))l=!0;else{let e=this.resolveImportPath(c,t);this.isClientComponent(e)&&(l=!0,u=d.relative(this.projectRoot,e))}if(l){a=!0;let t=``;n?t=`const ${n} = registerClientReference(
|
|
135
|
+
null,
|
|
136
|
+
${JSON.stringify(u)},
|
|
137
|
+
"default"
|
|
138
|
+
);`:s&&(t=s.split(`,`).map(e=>e.trim()).map(e=>{let[t,n]=e.includes(` as `)?e.split(` as `).map(e=>e.trim()):[e,e];return`const ${n} = registerClientReference(
|
|
139
|
+
null,
|
|
140
|
+
${JSON.stringify(u)},
|
|
141
|
+
${JSON.stringify(t)}
|
|
142
|
+
);`}).join(`
|
|
143
|
+
`)),i.push({original:e,replacement:t})}}a&&(n=`
|
|
144
|
+
function registerClientReference(clientReference, id, exportName) {
|
|
145
|
+
const key = id + '#' + exportName;
|
|
146
|
+
|
|
147
|
+
const clientProxy = {};
|
|
148
|
+
|
|
149
|
+
Object.defineProperty(clientProxy, '$$typeof', {
|
|
150
|
+
value: Symbol.for('react.client.reference'),
|
|
151
|
+
enumerable: false
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
Object.defineProperty(clientProxy, '$$id', {
|
|
155
|
+
value: key,
|
|
156
|
+
enumerable: false
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
Object.defineProperty(clientProxy, '$$async', {
|
|
160
|
+
value: false,
|
|
161
|
+
enumerable: false
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
try {
|
|
165
|
+
if (typeof globalThis['~rari']?.bridge !== 'undefined' &&
|
|
166
|
+
typeof globalThis['~rari'].bridge.registerClientReference === 'function') {
|
|
167
|
+
globalThis['~rari'].bridge.registerClientReference(key, id, exportName);
|
|
168
|
+
}
|
|
169
|
+
} catch (error) {
|
|
170
|
+
console.error('[rari] Build: Failed to register client reference with Rust bridge:', error);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return clientProxy;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
`+n);for(let{original:e,replacement:t}of i)n=n.replace(e,t);return n}resolveImportPath(e,t){let n=e,r=this.options.alias||{};for(let[t,i]of Object.entries(r))if(e.startsWith(`${t}/`)||e===t){let r=e.slice(t.length);n=d.join(i,r);break}d.isAbsolute(n)||(n=d.resolve(d.dirname(t),n));let i=[`.tsx`,`.jsx`,`.ts`,`.js`];for(let e of i){let t=`${n}${e}`;if(u.existsSync(t))return t}if(u.existsSync(n))for(let e of i){let t=d.join(n,`index${e}`);if(u.existsSync(t))return t}return`${n}.tsx`}getComponentId(e){return e.replace(x,`/`).replace(S,``).replace(c,`_`).replace(n,``)}async rebuildComponent(e){let t=this.getComponentId(d.relative(this.projectRoot,e)),n=await u.promises.readFile(e,`utf-8`),r=this.extractDependencies(n),i={filePath:e,originalCode:n,dependencies:r,hasNodeImports:this.hasNodeImports(n)};this.isServerAction(n)?this.serverActions.set(e,i):this.serverComponents.set(e,i);let a=d.join(this.options.rscDir,`${t}.js`),o=d.join(this.options.outDir,a),s=this.buildCache.get(e),c=(await u.promises.stat(e)).mtimeMs;if(s&&s.timestamp>=c&&JSON.stringify(s.dependencies)===JSON.stringify(r))return await u.promises.writeFile(o,s.code,`utf-8`),await this.updateManifestForComponent(t,e,a),{componentId:t,bundlePath:d.join(this.options.outDir,a),success:!0};let l=d.dirname(o);await u.promises.mkdir(l,{recursive:!0});let f=await this.buildSingleComponent(e,o,!0);return this.buildCache.set(e,{code:f,timestamp:Date.now(),dependencies:r}),await this.updateManifestForComponent(t,e,a),{componentId:t,bundlePath:d.join(this.options.outDir,a),success:!0}}manifestCache=null;async updateManifestForComponent(e,t,n){let r=d.join(this.options.outDir,this.options.manifestPath),i;if(this.manifestCache)i=this.manifestCache;else if(u.existsSync(r)){let e=await u.promises.readFile(r,`utf-8`);i=JSON.parse(e),this.manifestCache=i}else i={components:{},importMap:{imports:{react:`npm:react@19`,"react-dom":`npm:react-dom@19`,"react/jsx-runtime":`npm:react@19/jsx-runtime`,"react/jsx-dev-runtime":`npm:react@19/jsx-dev-runtime`}},version:`1.0.0`,buildTime:new Date().toISOString()},this.manifestCache=i;let a=this.serverComponents.get(t)||this.serverActions.get(t),o=d.join(this.options.outDir,n),s=`file://${d.resolve(this.projectRoot,o)}`;if(a)i.components[e]={id:e,filePath:t,relativePath:d.relative(this.projectRoot,t),bundlePath:n,moduleSpecifier:s,dependencies:a.dependencies,hasNodeImports:a.hasNodeImports};else{let r=await u.promises.readFile(t,`utf-8`);i.components[e]={id:e,filePath:t,relativePath:d.relative(this.projectRoot,t),bundlePath:n,moduleSpecifier:s,dependencies:this.extractDependencies(r),hasNodeImports:this.hasNodeImports(r)}}i.importMap||={imports:{react:`npm:react@19`,"react-dom":`npm:react-dom@19`,"react/jsx-runtime":`npm:react@19/jsx-runtime`,"react/jsx-dev-runtime":`npm:react@19/jsx-dev-runtime`}},i.buildTime=new Date().toISOString(),await u.promises.writeFile(r,JSON.stringify(i,null,2),`utf-8`),this.manifestCache=i}clearCache(){this.buildCache.clear(),this.manifestCache=null}async getTransformedComponentCode(e){return await this.buildComponentCodeOnly(e)}};function k(e,n,r=!0){r&&n.buildImportGraph(e);let i=u.readdirSync(e,{withFileTypes:!0});for(let r of i){let i=d.join(e,r.name);if(r.isDirectory())k(i,n,!1);else if(r.isFile()&&t.test(r.name)){if(D.test(r.name)||r.name.endsWith(`.d.ts`)||n.isOnlyImportedByClientComponents(i))continue;try{if(n.isServerComponent(i))n.addServerComponent(i);else{let e=u.readFileSync(i,`utf-8`).split(`
|
|
177
|
+
`),t=!1;for(let n of e){let e=n.trim();if(!(e.startsWith(`//`)||e.startsWith(`/*`)||!e)){if(e===`'use server'`||e===`"use server"`||e===`'use server';`||e===`"use server";`){t=!0;break}if(e)break}}t&&n.addServerComponent(i)}}catch(e){console.warn(`[server-build] Error checking ${i}:`,e instanceof Error?e.message:e)}}}}function A(e={}){let n=null,r,i=!1;return{name:`rari-server-build`,configResolved(t){r=t.root,i=t.command===`serve`;let a={};if(t.resolve?.alias){let e=t.resolve.alias;Array.isArray(e)?e.forEach(e=>{typeof e.find==`string`&&typeof e.replacement==`string`&&(a[e.find]=e.replacement)}):typeof e==`object`&&Object.entries(e).forEach(([e,t])=>{typeof t==`string`&&(a[e]=t)})}n=new O(r,{...e,alias:a})},buildStart(){if(!n)return;let e=f.env.NODE_ENV===`production`,t=[d.join(r,`dist`,`cache`,`og`),d.join(r,`dist`,`cache`,`images`)];e&&t.push(`/tmp/rari-og-cache`,`/tmp/rari-image-cache`);for(let e of t)try{u.existsSync(e)&&u.rmSync(e,{recursive:!0,force:!0})}catch(t){console.warn(`[rari] Failed to clear cache ${e}:`,t)}let i=d.join(r,`src`);u.existsSync(i)&&k(i,n)},async closeBundle(){if(n){await n.buildServerComponents();try{let{generateRobotsFile:e}=await import(`./robots-generator-Bo5MHa-v.mjs`);await e({appDir:d.join(r,`src`,`app`),outDir:d.join(r,`dist`),extensions:[`.ts`,`.tsx`,`.js`,`.jsx`]})}catch(e){console.warn(`[rari] Failed to generate robots.txt:`,e)}try{let{generateSitemapFiles:e}=await import(`./sitemap-generator-Di-7pmiz.mjs`);await e({appDir:d.join(r,`src`,`app`),outDir:d.join(r,`dist`),extensions:[`.ts`,`.tsx`,`.js`,`.jsx`]})}catch(e){console.warn(`[rari] Failed to generate sitemap:`,e)}}},async handleHotUpdate({file:e}){if(!n||!i)return;let a=d.relative(r,e).replace(x,`/`);if(!(!a.startsWith(`src/`)||!t.test(a)))try{if((await u.promises.readFile(e,`utf-8`)).includes(`use client`))return;await n.buildServerComponents()}catch(e){console.error(`[rari] Build: Error rebuilding ${a}:`,e)}}}}export{m as n,A as t};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{D as e,E as t,O as n,T as r,k as i}from"./regex-constants-BM4Vd-_c.mjs";import{promises as a}from"node:fs";import o from"node:path";import{Buffer as s}from"node:buffer";function c(a){return a.replace(r,`&`).replace(n,`<`).replace(e,`>`).replace(i,`"`).replace(t,`'`)}function l(e){return(typeof e==`string`?new Date(e):e).toISOString()}function u(e){let t=[];for(let n of e)typeof n==`string`?(t.push(` <image:image>`),t.push(` <image:loc>${c(n)}</image:loc>`),t.push(` </image:image>`)):(t.push(` <image:image>`),t.push(` <image:loc>${c(n.loc)}</image:loc>`),n.title&&t.push(` <image:title>${c(n.title)}</image:title>`),n.caption&&t.push(` <image:caption>${c(n.caption)}</image:caption>`),n.geoLocation&&t.push(` <image:geo_location>${c(n.geoLocation)}</image:geo_location>`),n.license&&t.push(` <image:license>${c(n.license)}</image:license>`),t.push(` </image:image>`));return t.join(`
|
|
2
|
+
`)}function d(e){let t=[];for(let n of e){if(t.push(` <video:video>`),t.push(` <video:title>${c(n.title)}</video:title>`),t.push(` <video:thumbnail_loc>${c(n.thumbnail_loc)}</video:thumbnail_loc>`),t.push(` <video:description>${c(n.description)}</video:description>`),n.content_loc&&t.push(` <video:content_loc>${c(n.content_loc)}</video:content_loc>`),n.player_loc&&t.push(` <video:player_loc>${c(n.player_loc)}</video:player_loc>`),n.duration!==void 0&&t.push(` <video:duration>${n.duration}</video:duration>`),n.expiration_date&&t.push(` <video:expiration_date>${c(n.expiration_date)}</video:expiration_date>`),n.rating!==void 0&&t.push(` <video:rating>${n.rating}</video:rating>`),n.view_count!==void 0&&t.push(` <video:view_count>${n.view_count}</video:view_count>`),n.publication_date&&t.push(` <video:publication_date>${c(n.publication_date)}</video:publication_date>`),n.family_friendly!==void 0&&t.push(` <video:family_friendly>${n.family_friendly?`yes`:`no`}</video:family_friendly>`),n.restriction&&t.push(` <video:restriction relationship="${n.restriction.relationship}">${c(n.restriction.content)}</video:restriction>`),n.platform&&t.push(` <video:platform relationship="${n.platform.relationship}">${c(n.platform.content)}</video:platform>`),n.requires_subscription!==void 0&&t.push(` <video:requires_subscription>${n.requires_subscription?`yes`:`no`}</video:requires_subscription>`),n.uploader){let e=n.uploader.info?` info="${c(n.uploader.info)}"`:``;t.push(` <video:uploader${e}>${c(n.uploader.name)}</video:uploader>`)}if(n.live!==void 0&&t.push(` <video:live>${n.live?`yes`:`no`}</video:live>`),n.tag)for(let e of n.tag)t.push(` <video:tag>${c(e)}</video:tag>`);t.push(` </video:video>`)}return t.join(`
|
|
3
|
+
`)}function f(e){let t=e.some(e=>e.images&&e.images.length>0),n=e.some(e=>e.videos&&e.videos.length>0),r=e.some(e=>e.alternates?.languages),i=[`xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"`];t&&i.push(`xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"`),n&&i.push(`xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"`),r&&i.push(`xmlns:xhtml="http://www.w3.org/1999/xhtml"`);let a=[`<?xml version="1.0" encoding="UTF-8"?>`,`<urlset ${i.join(` `)}>`];for(let t of e){if(a.push(` <url>`),a.push(` <loc>${c(t.url)}</loc>`),t.lastModified&&a.push(` <lastmod>${l(t.lastModified)}</lastmod>`),t.changeFrequency&&a.push(` <changefreq>${t.changeFrequency}</changefreq>`),t.priority!==void 0&&a.push(` <priority>${t.priority}</priority>`),t.alternates?.languages)for(let[e,n]of Object.entries(t.alternates.languages))a.push(` <xhtml:link rel="alternate" hreflang="${c(e)}" href="${c(n)}" />`);t.images&&t.images.length>0&&a.push(u(t.images)),t.videos&&t.videos.length>0&&a.push(d(t.videos)),a.push(` </url>`)}return a.push(`</urlset>`),a.join(`
|
|
4
|
+
`)}async function p(e,t=[`.ts`,`.tsx`,`.js`,`.jsx`]){let n=[],r=o.join(e,`sitemap.xml`);try{return await a.access(r),n.push({type:`static`,path:r}),n}catch{}for(let r of t){let t=o.join(e,`sitemap${r}`);try{return await a.access(t),n.push({type:`dynamic`,path:t}),n}catch{}}return n}async function m(e){let{appDir:t,extensions:n}=e,r=await p(t,n);if(r.length===0)return!1;await a.mkdir(e.outDir,{recursive:!0});let i=r[0];if(i.type===`static`){let t=o.join(e.outDir,`sitemap.xml`);return await a.copyFile(i.path,t),!0}try{let{build:t}=await import(`rolldown`),n=await a.readFile(i.path,`utf-8`),r=`\0virtual:sitemap`,c=await t({input:r,external:[`rari`],platform:`node`,write:!1,output:{format:`esm`,codeSplitting:!1},plugins:[{name:`virtual-sitemap`,resolveId(e){return e===r?e:e.startsWith(`.`)?o.resolve(o.dirname(i.path),e):null},load(e){if(e===r){let e=o.extname(i.path).slice(1),t;switch(e){case`ts`:t=`ts`;break;case`tsx`:t=`tsx`;break;case`js`:case`mjs`:case`cjs`:t=`js`;break;case`jsx`:t=`jsx`;break;case`json`:t=`json`;break;default:throw Error(`Unsupported sitemap file extension: ".${e}". Allowed extensions are: .ts, .tsx, .js, .jsx, .mjs, .cjs, .json`)}return{code:n,moduleType:t}}return null}}]});if(!c.output||c.output.length===0)throw Error(`Failed to build sitemap module`);let l=c.output.find(e=>e.type===`chunk`&&e.isEntry)||c.output.find(e=>e.type===`chunk`);if(!l||l.type!==`chunk`)throw Error(`No chunk output found in sitemap build result`);let u=l.code,d=await import(`data:text/javascript;base64,${s.from(u).toString(`base64`)}`);if(typeof d.generateSitemaps==`function`){let t=await d.generateSitemaps(),n=o.join(e.outDir,`sitemap`);await a.mkdir(n,{recursive:!0});for(let{id:n}of t){let t;t=typeof d.default==`function`?await d.default({id:String(n)}):d.default;let r=f(t),i=o.join(e.outDir,`sitemap/${n}.xml`);await a.writeFile(i,r)}}else{let t=f(typeof d.default==`function`?await d.default():d.default),n=o.join(e.outDir,`sitemap.xml`);await a.writeFile(n,t)}return!0}catch(e){return console.error(`[rari] Failed to build/execute sitemap file:`,e),!1}}export{m as generateSitemapFiles};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{styleText as e}from"node:util";function t(t){console.warn(`${e(`blue`,`info`)} ${t}`)}function n(t){console.warn(`${e(`green`,`✓`)} ${t}`)}function r(t){console.error(`${e(`red`,`✗`)} ${t}`)}function i(t){console.warn(`${e(`yellow`,`⚠`)} ${t}`)}const a=/\s+(?:&&\s+)?/,o=/^>=?\s*(\d+)/,s=/^<=?\s*(\d+)/,c=/^<=?\s*\d+/,l=/^>=?\s*(\d+)\.(\d+)\.(\d+)/,u=/^=?\s*(\d+)\.(\d+)\.(\d+)/,d=/^\^\s*(\d+)\.(\d+)\.(\d+)/,f=/^~\s*(\d+)\.(\d+)\.(\d+)/,p=/^(?:>=?|<=?|[=~^])?\s*(\d+)\.(\d+)/,m=/^(\d+)\.(?:x|\*)/i,h=/^(?:>=?|[=~^])\s*(\d+)(?:\s|$)/,g=/^(\d+)$/;function _(e,t=22){let n=e.trim();if(n.includes(`||`))return n.split(`||`).map(e=>e.trim()).some(e=>_(e,t));let r=n.split(a).filter(e=>e&&e!==`&&`);if(r.length>1){for(let e of r){let n=v(e);if(n!==null&&n>=t)return!0}return r.every(e=>y(e,t))}return b(n,t)}function v(e){let t=e.match(o);return t?Number.parseInt(t[1],10):null}function y(e,t){let n=null;return n=e.match(s),n?t<=Number.parseInt(n[1],10):b(e,t)}function b(e,t){let n=null;return c.test(e)?!1:(n=e.match(l),n||(n=e.match(u),n)||(n=e.match(d),n)||(n=e.match(f),n)||(n=e.match(p),n)||(n=e.match(m),n)||(n=e.match(h),n)||(n=e.match(g),n)?Number.parseInt(n[1],10)>=t:!1)}export{t as a,r as i,i as n,n as r,_ as t};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import{C as e,S as t,c as n,d as r,r as i,t as a,u as o,w as s,x as c}from"./regex-constants-BM4Vd-_c.mjs";import{a as l,i as u,n as d,o as f,r as p,t as m}from"./constants-DZAg-dr0.mjs";import{t as h}from"./server-build-emJwCUjS.mjs";import g,{promises as _}from"node:fs";import v from"node:path";import y from"node:process";import{Buffer as ee}from"node:buffer";import{spawn as te}from"node:child_process";import{fileURLToPath as b}from"node:url";import{build as x}from"rolldown";var S=class extends Response{static json(e,t){let n=new Headers(t?.headers);return n.has(`content-type`)||n.set(`content-type`,`application/json`),new Response(JSON.stringify(e),{...t,headers:n})}static redirect(e,t=307){return new Response(null,{status:t,headers:{location:e}})}static noContent(e){return new Response(null,{...e,status:204})}};function C(e={}){let{root:t=y.cwd(),srcDir:n=`src`,proxyFileName:r=`proxy`,extensions:i=[`.ts`,`.tsx`,`.js`,`.jsx`,`.mts`,`.mjs`],verbose:a=!1}=e,o=null,s=e=>{a&&console.warn(`[rari] Proxy: ${e}`)};async function c(){for(let e of i){let n=`${r}${e}`,i=v.join(t,n);try{return await _.access(i),s(`Found proxy file: ${n}`),{filePath:i,exists:!0,relativePath:n}}catch{}}let e=v.join(t,n);try{await _.access(e);for(let t of i){let i=`${r}${t}`,a=v.join(e,i);try{return await _.access(a),s(`Found proxy file: ${v.join(n,i)}`),{filePath:a,exists:!0,relativePath:v.join(n,i)}}catch{}}}catch{}return null}return{name:`rari:proxy`,async buildStart(){o=await c(),s(o?`Proxy enabled: ${o.relativePath}`:`No proxy file found`)},configureServer(e){o&&(e.watcher.add(o.filePath),e.watcher.on(`change`,t=>{t===o?.filePath&&(s(`Proxy file changed, reloading...`),e.ws.send({type:`custom`,event:`rari:proxy-reload`}))}))},async handleHotUpdate({file:e,server:t}){if(o&&e===o.filePath)return s(`Hot reloading proxy...`),t.ws.send({type:`custom`,event:`rari:proxy-reload`,data:{file:o.relativePath}}),[]}}}const w=/export\s+const\s+metadata\s*(?::\s*\w+\s*)?=\s*(\{[\s\S]*?\n\})/,T=/title\s*:\s*['"]([^'"]+)['"]/,E=/description\s*:\s*['"]([^'"]+)['"]/,D=/keywords\s*:\s*\[([\s\S]*?)\]/,O={appDir:`src/app`,extensions:[`.tsx`,`.jsx`,`.ts`,`.js`],outDir:`dist`};function k(t){switch(v.basename(t).replace(e,``)){case`page`:return`page`;case`layout`:return`layout`;case`loading`:return`loading`;case`error`:return`error`;case`not-found`:return`not-found`;case`route`:return`route`;default:return null}}function A(e,t){let n=v.relative(t,v.dirname(e));return!n||n===`.`?`/`:`/${n.replace(a,`/`).split(`/`).filter(Boolean).join(`/`)}`}function j(e,t,n){if(t===`page`)return[e];let r=n.filter(t=>t===e||t.startsWith(`${e}/`));return r.length>0?r:[e]}function M(e){try{let t=e.match(w);if(!t)return null;let n=t[1],r={},i=n.match(T);i&&(r.title=i[1]);let a=n.match(E);a&&(r.description=a[1]);let o=n.match(D);o&&(r.keywords=o[1].split(`,`).map(e=>e.trim().replace(c,``)).filter(Boolean));for(let e of[`author`,`viewport`,`themeColor`,`robots`,`openGraph`,`twitter`]){let t=RegExp(`${e}\\s*:\\s*['"]([^'"]+)['"]`,`m`),i=n.match(t);i&&(r[e]=i[1])}return Object.keys(r).length>0?r:null}catch(e){return console.error(`[rari] Router: Failed to extract metadata:`,e),null}}function ne(e){let t=[];for(let n of[`GET`,`POST`,`PUT`,`DELETE`,`PATCH`,`HEAD`,`OPTIONS`]){let r=RegExp(`export\\s+(?:async\\s+)?function\\s+${n}\\s*\\(`),i=RegExp(`export\\s+(?:async\\s+)?(?:const|let|var)\\s+${n}\\s*=`);(r.test(e)||i.test(e))&&t.push(n)}return t}async function re(e){try{let t=await fetch(`http://localhost:3000/_rari/hmr`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`invalidate-api-route`,filePath:e})});if(!t.ok){console.error(`[rari] Router: Failed to invalidate API route cache: ${t.statusText}`);return}let n=await t.json();n.success||console.error(`[rari] HMR: Failed to invalidate API route cache: ${n.error||`Unknown error`}`)}catch(e){console.error(`[rari] Router: Failed to notify API route invalidation:`,e)}}function N(e={}){let t={...O,...e},n=null,r=new Map,i=null,a=new Set,o=e=>[...e].toSorted().join(`|`),s=async e=>{let n=new Set,r=async e=>{try{let i=await _.readdir(e,{withFileTypes:!0});for(let a of i){let i=v.join(e,a.name);a.isDirectory()?await r(i):a.isFile()&&t.extensions.some(e=>a.name.endsWith(e))&&k(i)&&n.add(i)}}catch{}};return await r(e),n},c=async(e,r=!1)=>{let c=v.resolve(e,t.appDir);try{await _.access(c)}catch{return null}try{let l=await s(c),u=o(l);if(!r&&i===u&&n)return n;let{generateAppRouteManifest:d}=await import(`./routes-DEvXO96u.mjs`).then(e=>e.n),f=await d(c,{extensions:t.extensions}),p=JSON.stringify(f,null,2),m=v.resolve(e,t.outDir);await _.mkdir(m,{recursive:!0});let h=v.join(m,`server`);return await _.mkdir(h,{recursive:!0}),await _.writeFile(v.join(h,`routes.json`),p,`utf-8`),i=u,a.clear(),l.forEach(e=>a.add(e)),p}catch(e){return console.error(`[rari] Router: Failed to generate app routes:`,e),null}},l=e=>{let n=v.resolve(e.config.root,t.appDir);e.watcher.on(`all`,async(r,i)=>{if(i.startsWith(n)&&t.extensions.some(e=>i.endsWith(e)))try{let n=k(i)!==null,o=r===`add`||r===`unlink`,s=n&&!a.has(i);(o||s)&&(await c(e.config.root,!0),i.includes(t.appDir)&&e.ws.send({type:`full-reload`,path:`*`}))}catch(e){console.error(`[rari] Router: Failed to regenerate app routes:`,e)}})},u;return{name:`rari-router`,configResolved(e){u=e.root;let t=e.logger.warn;e.logger.warn=(e,n)=>{typeof e==`string`&&e.includes(`runtime-client`)&&e.includes(`The above dynamic import cannot be analyzed`)||t(e,n)}},async writeBundle(){n=await c(u||y.cwd(),!0)},configureServer(e){l(e)},async handleHotUpdate(e){let{file:i,server:o}=e,s=v.resolve(o.config.root,t.appDir);if(i.startsWith(s)&&t.extensions.some(e=>i.endsWith(e))){let e=k(i);if(e){let t=r.get(i);t&&clearTimeout(t);let l=setTimeout(async()=>{r.delete(i);let t=!a.has(i),l=n;n=await c(o.config.root,t);let u=l!==n,d=A(i,s),f=[d];if(n)try{f=JSON.parse(n).routes.map(e=>e.path)}catch(e){console.error(`[rari] Router: Failed to parse manifest for affected routes:`,e)}let p=j(d,e,f),m,h=!1,g;if(e===`page`||e===`layout`)try{let e=M(await _.readFile(i,`utf-8`));e&&(m=e,h=!0)}catch(e){console.error(`[rari] Router: Failed to extract metadata:`,e)}if(e===`route`)try{g=ne(await _.readFile(i,`utf-8`)),await re(v.relative(s,i))}catch(e){console.error(`[rari] Router: Failed to detect HTTP methods:`,e)}let y={fileType:e,filePath:v.relative(o.config.root,i),routePath:d,affectedRoutes:p,manifestUpdated:u,timestamp:Date.now(),metadata:m,metadataChanged:h,methods:g};o.ws.send({type:`custom`,event:`rari:app-router-updated`,data:y})},200);return r.set(i,l),[]}return n=await c(o.config.root),[]}},async closeBundle(){for(let e of r.values())clearTimeout(e);r.clear()}}}var ie=class{errorCount=0;maxErrors;resetTimeout;resetTimer=null;lastError=null;constructor(e={}){this.maxErrors=e.maxErrors??5,this.resetTimeout=e.resetTimeout??3e4}recordError(e){this.errorCount++,this.lastError=e,this.resetTimer&&clearTimeout(this.resetTimer),this.resetTimer=setTimeout(()=>{this.reset()},this.resetTimeout),this.errorCount>=this.maxErrors&&this.handleMaxErrorsReached()}reset(){this.errorCount=0,this.lastError=null,this.resetTimer&&=(clearTimeout(this.resetTimer),null)}getErrorCount(){return this.errorCount}getLastError(){return this.lastError}hasReachedMaxErrors(){return this.errorCount>=this.maxErrors}handleMaxErrorsReached(){console.error(`[rari] HMR: Maximum error count (${this.maxErrors}) reached. Consider restarting the dev server if issues persist.`)}dispose(){this.resetTimer&&=(clearTimeout(this.resetTimer),null),this.reset()}},ae=class{serverComponentBuilder;rustServerUrl;pendingUpdates=new Map;pendingFiles=new Set;batchTimer=null;DEBOUNCE_DELAY=200;errorHandler;logBatch=[];logBatchTimer=null;LOG_BATCH_DELAY=500;constructor(e,t=3e3){this.serverComponentBuilder=e,this.rustServerUrl=`http://localhost:${t}`,this.errorHandler=new ie({maxErrors:5,resetTimeout:3e4})}async handleClientComponentUpdate(e,t){let n=v.relative(y.cwd(),e),r=Date.now();this.queueLog(`info`,`Client component changed: ${n}`);try{let i=t.moduleGraph.getModuleById(e);if(i){t.moduleGraph.invalidateModule(i);let e=Date.now()-r;this.queueLog(`success`,`Client component updated: ${n} (${e}ms)`),this.errorHandler.reset()}else this.queueLog(`warning`,`Client component module not found in graph: ${n}`)}catch(e){let t=e instanceof Error?e.message:String(e);this.queueLog(`error`,`Failed to update client component: ${n} - ${t}`),this.errorHandler.recordError(e instanceof Error?e:Error(t))}}async handleServerComponentUpdate(e,t){this.pendingFiles.add(e);let n=this.pendingUpdates.get(e);n&&(clearTimeout(n),this.pendingUpdates.delete(e)),this.batchTimer&&clearTimeout(this.batchTimer),this.batchTimer=setTimeout(async()=>{let e=[...this.pendingFiles];if(this.pendingFiles.clear(),this.batchTimer=null,e.length===0)return;let n=Date.now();if(e.length===1){let t=v.relative(y.cwd(),e[0]);this.queueLog(`info`,`Rebuilding server component: ${t}`)}else this.queueLog(`info`,`Rebuilding ${e.length} server components in batch`);let r=await Promise.allSettled(e.map(async e=>{let t=v.relative(y.cwd(),e);try{let n=await this.serverComponentBuilder.rebuildComponent(e);if(!n.success)throw Error(n.error||`Build failed`);return await this.notifyRustServer(n.componentId,n.bundlePath),{success:!0,componentId:n.componentId,filePath:e,relativePath:t}}catch(n){return{success:!1,filePath:e,relativePath:t,error:n instanceof Error?n:Error(String(n))}}})),i=[],a=[];r.forEach(e=>{e.status===`fulfilled`&&e.value.success?i.push(e.value):e.status===`fulfilled`&&!e.value.success?a.push(e.value):e.status===`rejected`&&a.push({filePath:``,relativePath:`unknown`,error:Error(String(e.reason))})});let o=Date.now()-n;if(i.length>0){let e=Date.now();i.forEach(({componentId:n})=>{t.hot.send(`rari:server-component-updated`,{id:n,t:e})}),i.length===1?this.queueLog(`success`,`Server component updated: ${i[0].relativePath} (${o}ms)`):this.queueLog(`success`,`${i.length} server components updated (${o}ms)`),this.errorHandler.reset(),t.ws.send({type:`custom`,event:`rari:hmr-error-cleared`,data:{t:e}})}if(a.length>0){let e=Date.now();a.forEach(({relativePath:n,error:r})=>{let i=r.message,a=(r.stack||``).substring(0,500);this.queueLog(`error`,`Failed to rebuild: ${n} - ${i}`),this.errorHandler.recordError(r),t.ws.send({type:`custom`,event:`rari:hmr-error`,data:{msg:i,stack:a,file:n,t:e,count:this.errorHandler.getErrorCount(),max:5}})}),this.errorHandler.hasReachedMaxErrors()&&this.queueLog(`error`,`Maximum error count reached (${this.errorHandler.getErrorCount()}). Consider restarting the dev server if issues persist.`)}},this.DEBOUNCE_DELAY)}async notifyRustServer(e,t){try{let n=await fetch(`${this.rustServerUrl}/_rari/hmr`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`reload-component`,component_id:e,bundle_path:t})});if(!n.ok){let e=await n.text();throw Error(`HTTP ${n.status}: ${e}`)}}catch(e){throw console.error(`[rari] HMR: Failed to notify Rust server:`,e),e}}detectComponentType(e){try{let t=g.readFileSync(e,`utf-8`).split(`
|
|
2
|
+
`);for(let e of t){let t=e.trim();if(!(!t||t.startsWith(`//`)||t.startsWith(`/*`))){if(t===`'use client'`||t===`"use client"`)return`client`;break}}return`server`}catch{return`unknown`}}queueLog(e,t){this.logBatch.push({type:e,message:t,timestamp:Date.now()}),this.logBatchTimer&&clearTimeout(this.logBatchTimer),this.logBatchTimer=setTimeout(()=>{this.flushLogs()},this.LOG_BATCH_DELAY)}flushLogs(){if(this.logBatch.length===0)return;let e=this.logBatch.reduce((e,t)=>(e[t.type]||(e[t.type]=[]),e[t.type].push(t),e),{});for(let[t,n]of Object.entries(e))if(n.length===1){let e=n[0];this.outputLog(t,e.message)}else{let e=n.map(e=>e.message).join(`
|
|
3
|
+
• `);this.outputLog(t,`${n.length} updates:\n • ${e}`)}this.logBatch=[],this.logBatchTimer=null}outputLog(e,t){let n=`[rari] HMR:`;switch(e){case`success`:console.warn(`\x1B[32m${n}\x1B[0m ${t}`);break;case`warning`:console.warn(`\x1B[33m${n}\x1B[0m ${t}`);break;case`error`:console.error(`\x1B[31m${n}\x1B[0m ${t}`);break;default:console.warn(`${n} ${t}`);break}}dispose(){this.logBatchTimer&&(clearTimeout(this.logBatchTimer),this.flushLogs()),this.batchTimer&&=(clearTimeout(this.batchTimer),null);for(let e of this.pendingUpdates.values())clearTimeout(e);this.pendingUpdates.clear(),this.pendingFiles.clear(),this.errorHandler.dispose()}};const oe=/import\s+(\w+)\s+from\s+['"]rari\/image['"]/g,se=/import\s+\{[^}]*\b(?:Image\s+as\s+(\w+)|Image)\b[^}]*\}\s+from\s+['"]rari\/image['"]/g,ce=/src:\s*["']([^"']+)["']/,P=/[.*+?^${}()|[\]\\]/g,F=/width:\s*(\d+)/,I=/quality:\s*(\d+)/,L=/preload:\s*(true|!0)/,R=/preload:\s*(false|!1)/,z=/<Image\s([^/>]+)\/>/g,B=/<Image\s([^>]+)>/g,V=/src=\{?["']([^"']+)["']\}?|src=\{([^}]+)\}/,H=/width=\{?(\d+)\}?/,U=/quality=\{?(\d+)\}?/,W=/preload(?:=\{?true\}?)?/,G=/preload=\{?false\}?/;async function le(t,n=[]){let r=new Map;async function i(t){if(!g.existsSync(t))return;let n=g.readdirSync(t,{withFileTypes:!0});for(let a of n){let n=v.join(t,a.name);if(a.isDirectory()){if(a.name===`node_modules`||a.name===`dist`)continue;await i(n)}else if(a.isFile()&&e.test(a.name))try{let e=g.readFileSync(n,`utf8`);if(!e.includes(`from 'rari/image'`)&&!e.includes(`from "rari/image"`))continue;await ue(e,n,r)}catch(e){console.warn(`Failed to read or process file ${n}:`,e)}}}await i(t);for(let e of n)g.existsSync(e)&&await i(e);return{images:[...r.values()]}}async function ue(e,t,n){try{let r;r=t.endsWith(`.tsx`)?`tsx`:t.endsWith(`.jsx`)?`jsx`:t.endsWith(`.ts`)?`ts`:`js`;let i=`\0virtual:${t}`,a=await x({input:i,platform:`browser`,write:!1,output:{format:`esm`},moduleTypes:{[`.${r}`]:r},transform:{jsx:`react`},plugins:[{name:`virtual-module`,resolveId(e){return e===i?e:null},load(t){return t===i?{code:e,moduleType:r}:null}}]});if(!a.output||a.output.length===0)throw Error(`Transform produced no output`);let o=a.output[0].code,s=new Set;for(let e of o.matchAll(oe))s.add(e[1]);for(let e of o.matchAll(se))e[1]?s.add(e[1]):s.add(`Image`);if(s.size===0)return;for(let e of s){let t=e.replace(P,`\\$&`),r=RegExp(`React\\.createElement\\(\\s*${t}\\s*,\\s*\\{([^}]+)\\}`,`g`);for(let e of o.matchAll(r)){let t=e[1],r=t.match(ce);if(!r)continue;let i=r[1];if(!i.startsWith(`/`)&&!i.startsWith(`http`))continue;let a=t.match(F),o=a?Number.parseInt(a[1],10):void 0,s=t.match(I),c=s?Number.parseInt(s[1],10):void 0,l=t.match(L),u=t.match(R),d=!!l&&!u,f=`${i}:${o||`auto`}:${c||75}`;(!n.has(f)||d)&&n.set(f,{src:i,width:o,quality:c,preload:d})}}}catch{de(e,n)}}function de(e,t){for(let n of e.matchAll(z))K(n[1],t);for(let n of e.matchAll(B))K(n[1],t)}function K(e,t){let n=e.match(V);if(!n)return;let r=n[1]||n[2];if(!r||r.includes(`{`)||!r.startsWith(`/`)&&!r.startsWith(`http`))return;let i=e.match(H),a=i?Number.parseInt(i[1],10):void 0,o=e.match(U),s=o?Number.parseInt(o[1],10):void 0,c=W.test(e)&&!G.test(e),l=`${r}:${a||`auto`}:${s||75}`;(!t.has(l)||c)&&t.set(l,{src:r,width:a,quality:s,preload:c})}const fe=/import\s+type\s+(\{[^}]+\})\s+from\s+["']\.\.?\/([^"']+)["'];?/g,pe=/import\s+type\s+(\*\s+as\s+\w+)\s+from\s+["']\.\.?\/([^"']+)["'];?/g,me=/import\s+type\s+(\w+)\s+from\s+["']\.\.?\/([^"']+)["'];?/g,he=/import\s+(\{[^}]+\})\s+from\s+["']\.\.?\/([^"']+)["'];?/g,ge=/import\s+(\*\s+as\s+\w+)\s+from\s+["']\.\.?\/([^"']+)["'];?/g,_e=/import\s+(\w+)\s+from\s+["']\.\.?\/([^"']+)["'];?/g,ve=/import\s+["']\.\.?\/([^"']+)["'];?/g,ye=/import\s*(?:\(\s*)?["']([^"']+)["']\)?/g,be=/export\s*\{([^}]+)\}/g,xe=/\s+as\s+/,Se=/export\s+default\s+(?:function|class)\s+\w+/,Ce=/export\s+default\s+(?:async\s+)?function\s+(\w+)/,q=/export\s+default\s+([^;]+)/,we=/export\s+(?:async\s+)?(?:const|let|var|function|class)\s+(\w+)/g,Te=/^['"]use client['"];?\s*$/gm,Ee=/import\s+["']([^"']+)["']/g,J=/^\s*import\s+(?:(\w+)(?:\s*,\s*\{\s*(?:(\w+(?:\s*,\s*\w+)*)\s*)?\})?|\{\s*(\w+(?:\s*,\s*\w+)*)\s*\})\s+from\s+['"]([./@][^'"]+)['"].*$/,De=/import\s+\{[^}]*\}\s+from\s+['"]react['"]/,Oe=/import\s+[^,\s]+\s*,\s*\{[^}]*\}\s+from\s+['"]react['"]/,ke=/import React(,\s*\{([^}]*)\})?\s+from\s+['"]react['"];?/,Ae=/import\s+["']([^"']+)["']/g,je=/from(\s*)(['"])(?:\.\/|rari\/)react-server-dom-rari-client\.mjs\2/g,Y=/\bJSX\b/,Me=/^components\//,Ne=/\{([^}]*)\}/,Pe={remotePatterns:[],localPatterns:[],deviceSizes:m,imageSizes:p,formats:d,qualityAllowlist:f,minimumCacheTTL:l,maxCacheSize:u};async function X(e){let t=import.meta.url,n=b(t),r=v.dirname(n),i=[v.join(r,`runtime`,e),v.join(r,`../runtime`,e)];for(let e of i)try{let t=await g.promises.readFile(e,`utf-8`);return e.endsWith(`.ts`)&&(t=t.replace(fe,(e,t,n)=>`import type ${t} from "rari/${n}";`),t=t.replace(pe,(e,t,n)=>`import type ${t} from "rari/${n}";`),t=t.replace(me,(e,t,n)=>`import type ${t} from "rari/${n}";`),t=t.replace(he,(e,t,n)=>`import ${t} from "rari/${n}";`),t=t.replace(ge,(e,t,n)=>`import ${t} from "rari/${n}";`),t=t.replace(_e,(e,t,n)=>`import ${t} from "rari/${n}";`),t=t.replace(ve,(e,t)=>`import "rari/${t}";`)),t}catch(t){t.code!==`ENOENT`&&t.code!==`EISDIR`&&console.warn(`[rari] Unexpected error reading ${e}:`,t)}throw Error(`Could not find ${e}. Tried: ${i.join(`, `)}`)}async function Fe(){return X(`rsc-client-runtime.mjs`)}async function Ie(e,t){return(await X(`entry-client.mjs`)).replace(`/*! @preserve CLIENT_COMPONENT_IMPORTS_PLACEHOLDER */`,e).replace(`/*! @preserve CLIENT_COMPONENT_REGISTRATIONS_PLACEHOLDER */`,t)}async function Le(){return X(`react-server-dom-shim.mjs`)}async function Z(e,t){let n=await le(v.join(e,`src`)),r={...Pe,...t.images,preoptimizeManifest:n.images},i=v.join(e,`dist`),a=v.join(i,`server`);g.existsSync(a)||g.mkdirSync(a,{recursive:!0});let o=v.join(a,`image.json`);g.writeFileSync(o,JSON.stringify(r,null,2))}function Q(t,n=[]){let r=new Set;function i(t){if(!g.existsSync(t))return;let n=g.readdirSync(t,{withFileTypes:!0});for(let a of n){let n=v.join(t,a.name);if(a.isDirectory()){if(a.name===`node_modules`)continue;i(n)}else if(a.isFile()&&e.test(a.name))try{let e=g.readFileSync(n,`utf8`);(e.includes(`'use client'`)||e.includes(`"use client"`))&&r.add(n)}catch(e){e?.code!==`ENOENT`&&console.warn(`[rari] Unexpected error during file scan:`,n,e)}}}i(t);for(let e of n)g.existsSync(e)&&i(e);return r}function Re(e){return e}function $(c={}){let l=new Map,u=new Set,d=new Map,f=null,p=null,m={};function _(t){if(d.has(t))return d.get(t);let n={hasUseServer:!1,hasUseClient:!1},r=t.replace(a,`/`);if(!e.test(r)||!r.includes(`/src/`))return d.set(t,n),n;try{let e=g.readFileSync(t,`utf-8`);n.hasUseServer=e.includes(`'use server'`)||e.includes(`"use server"`),n.hasUseClient=e.includes(`'use client'`)||e.includes(`"use client"`),d.set(t,n)}catch{d.set(t,n)}return n}function x(e){if(e.includes(`node_modules`)||e.includes(`/rari/dist/`)||e.includes(`\\rari\\dist\\`))return!1;let t=c.projectRoot||y.cwd(),n=v.join(t,`index.html`);if(g.existsSync(n))try{let r=g.readFileSync(n,`utf-8`);for(let n of r.matchAll(ye)){let r=n[1];if(r.startsWith(`/src/`)&&v.join(t,r.slice(1))===e)return!1}}catch(e){e?.code!==`ENOENT`&&console.warn(`[rari] Unexpected error reading index.html:`,e)}let r;try{r=g.realpathSync(e)}catch{return!1}try{if(!g.existsSync(r))return!1;let e=g.readFileSync(r,`utf-8`),t=w(e,`use client`);return w(e,`use server`)?!1:!t}catch{return!1}}function S(e){try{let t=[],r=e.matchAll(be);for(let e of r){let n=e[1].split(`,`);for(let e of n){let n=e.trim().split(xe).at(-1)?.trim();n&&t.push(n)}}(Se.test(e)||n.test(e))&&t.push(`default`);let i=e.matchAll(we);for(let e of i)e[1]&&t.push(e[1]);return[...new Set(t)]}catch{return[]}}function w(e,t){try{let n=e.split(`
|
|
4
|
+
`);for(let e of n){let n=e.trim();if(!(!n||n.startsWith(`//`)||n.startsWith(`/*`))){if(n===`'${t}'`||n===`"${t}"`||n===`'${t}';`||n===`"${t}";`)return!0;break}}return!1}catch{return!1}}function T(e,t){if(!w(e,`use server`))return e;let n=S(e);if(n.length===0)return e;let r=e;r+=`
|
|
5
|
+
|
|
6
|
+
import {registerServerReference} from "react-server-dom-rari/server";
|
|
7
|
+
`;for(let i of n)if(i===`default`){let n=e.match(Ce);if(n){let e=n[1];r+=`
|
|
8
|
+
// Register server reference for default export
|
|
9
|
+
`,r+=`registerServerReference(${e}, ${JSON.stringify(t)}, ${JSON.stringify(i)});\n`}else{let n=e.match(q);if(n){let e=n[1].trim(),a=`__default_export__`;r=r.replace(q,`const ${a} = ${e};\nexport default ${a}`),r+=`
|
|
10
|
+
// Register server reference for default export
|
|
11
|
+
`,r+=`if (typeof ${a} === "function") {\n`,r+=` registerServerReference(${a}, ${JSON.stringify(t)}, ${JSON.stringify(i)});\n`,r+=`}
|
|
12
|
+
`}}}else r+=`\n// Register server reference for ${i}\n`,r+=`if (typeof ${i} === "function") {\n`,r+=` registerServerReference(${i}, ${JSON.stringify(t)}, ${JSON.stringify(i)});\n`,r+=`}
|
|
13
|
+
`;return r+=`
|
|
14
|
+
|
|
15
|
+
if (import.meta.hot) {
|
|
16
|
+
import.meta.hot.accept(() => {
|
|
17
|
+
});
|
|
18
|
+
}`,r}function E(n,r){let o=w(n,`use server`),s=x(r);if(o){let o=S(n);if(o.length===0)return``;let s=v.relative(y.cwd(),r).replace(a,`/`).replace(e,``).replace(i,`_`).replace(t,``),c=`import { createServerReference } from "rari/runtime/actions";
|
|
19
|
+
`;for(let e of o)e===`default`?c+=`export default createServerReference("default", ${JSON.stringify(s)}, "default");\n`:c+=`export const ${e} = createServerReference("${e}", ${JSON.stringify(s)}, "${e}");\n`;return c}if(s){let o=S(n);if(o.length===0)return``;let s=v.relative(y.cwd(),r).replace(a,`/`).replace(e,``).replace(i,`_`).replace(t,``).replace(Me,``),c=`import { createServerComponentWrapper } from "virtual:rsc-integration.ts";
|
|
20
|
+
`;for(let e of o)e===`default`?c+=`export default createServerComponentWrapper("${s}", ${JSON.stringify(r)});\n`:c+=`export const ${e} = createServerComponentWrapper("${s}_${e}", ${JSON.stringify(r)});\n`;return c}if(!w(n,`use client`))return n;let c=S(n);if(c.length===0)return``;let l=`import {registerClientReference} from "react-server-dom-rari/server";
|
|
21
|
+
`;for(let e of c){if(e===`default`){let e=`Attempted to call the default export of ${r} from the server but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.`;l+=`export default `,l+=`registerClientReference(function() {`,l+=`throw new Error(${JSON.stringify(e)});`}else{let t=`Attempted to call ${e}() from the server but ${e} is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.`;l+=`export const ${e} = `,l+=`registerClientReference(function() {`,l+=`throw new Error(${JSON.stringify(t)});`}l+=`},`,l+=`${JSON.stringify(r)},`,l+=`${JSON.stringify(e)});\n`}return l}function D(e,t){return!w(e,`use client`)||S(e).length===0?e:e.replace(Te,``)}function O(e,t){let n=e;for(let[t,r]of Object.entries(m))if(e.startsWith(`${t}/`)){n=e.replace(t,r);break}else if(e===t){n=r;break}let r=v.resolve(v.dirname(t),n),i=[`.tsx`,`.jsx`,`.ts`,`.js`];for(let e of i){let t=`${r}${e}`;if(g.existsSync(t))return t}if(g.existsSync(r))for(let e of i){let t=v.join(r,`index${e}`);if(g.existsSync(t))return t}return`${r}.tsx`}function k(e){return(e.split(`/`).pop()||e).replace(r,``)}let A=!1;async function j(){let e=`http://localhost:${y.env.SERVER_PORT?Number(y.env.SERVER_PORT):Number(y.env.PORT||y.env.RSC_PORT||3e3)}`;try{let t=(await fetch(`${e}/_rari/health`,{signal:AbortSignal.timeout(1e3)})).ok;return A=t,t}catch{return A=!1,!1}}let M=[{name:`rari`,config(t,{command:n}){if(n===`build`){let n=c.projectRoot||y.cwd(),r=v.join(n,`index.html`);if(g.existsSync(r))try{let n=g.readFileSync(r,`utf-8`),i=[];for(let t of n.matchAll(Ee)){let n=t[1];if(n.startsWith(`/src/`)&&e.test(n)){let e=n.slice(1),t=v.basename(e,v.extname(e));i.push({path:e,name:t})}}if(i.length>0){t.build=t.build||{},t.build.rolldownOptions=t.build.rolldownOptions||{};let e=t.build.rolldownOptions.input||{main:`./index.html`},n;n=typeof e==`string`?{main:e}:Array.isArray(e)?{main:e[0]||`./index.html`}:{...e},i.forEach(({path:e,name:t})=>{n[t]=`./${e}`}),t.build.rolldownOptions.input=n}}catch(e){console.warn(`[rari] Error parsing index.html for build inputs:`,e)}}t.resolve=t.resolve||{};let r=Array.isArray(t.resolve.dedupe)?t.resolve.dedupe:[],i=[`react`,`react-dom`];t.resolve.dedupe=[...new Set([...r||[],...i])];let a=[];Array.isArray(t.resolve.alias)?a=t.resolve.alias:t.resolve.alias&&typeof t.resolve.alias==`object`&&(a=Object.entries(t.resolve.alias).map(([e,t])=>({find:e,replacement:t})));let o=new Set(a.map(e=>String(e.find)));try{let e=b(import.meta.resolve(`react`)),n=b(import.meta.resolve(`react-dom/client`)),r=b(import.meta.resolve(`react/jsx-runtime`)),i=[];o.has(`react/jsx-runtime`)||i.push({find:`react/jsx-runtime`,replacement:r});try{let e=b(import.meta.resolve(`react/jsx-dev-runtime`));o.has(`react/jsx-dev-runtime`)||i.push({find:`react/jsx-dev-runtime`,replacement:e})}catch(e){e?.code!==`ENOENT`&&console.warn(`[rari] Unexpected error resolving react/jsx-dev-runtime:`,e)}o.has(`react`)||i.push({find:`react`,replacement:e}),o.has(`react-dom/client`)||i.push({find:`react-dom/client`,replacement:n}),i.length>0&&(t.resolve.alias=[...a,...i])}catch(e){e?.code!==`ENOENT`&&console.warn(`[rari] Unexpected error configuring React aliases:`,e)}t.environments=t.environments||{},t.environments.rsc={resolve:{conditions:[`react-server`,`node`,`import`]},...t.environments.rsc},t.environments.ssr={resolve:{conditions:[`node`,`import`]},...t.environments.ssr},t.environments.client={resolve:{conditions:[`browser`,`import`]},...t.environments.client},t.optimizeDeps=t.optimizeDeps||{},t.optimizeDeps.include=t.optimizeDeps.include||[];for(let e of[`react`,`react-dom`,`react-dom/client`,`react-dom/server`,`react/jsx-runtime`,`react/jsx-dev-runtime`])t.optimizeDeps.include.includes(e)||t.optimizeDeps.include.push(e);if(t.optimizeDeps.exclude=t.optimizeDeps.exclude||[],t.optimizeDeps.exclude.includes(`rari`)||t.optimizeDeps.exclude.push(`rari`),n===`build`)for(let e of[`rsc`,`ssr`,`client`]){let n=t.environments[e];n&&n.build&&(n.build.rolldownOptions=n.build.rolldownOptions||{})}t.server=t.server||{},t.server.proxy=t.server.proxy||{};let s=y.env.SERVER_PORT?Number(y.env.SERVER_PORT):Number(y.env.PORT||y.env.RSC_PORT||3e3);if(t.server.proxy[`/api`]={target:`http://localhost:${s}`,changeOrigin:!0,secure:!1,ws:!0},t.server.proxy[`/_rari`]={target:`http://localhost:${s}`,changeOrigin:!0,secure:!1,ws:!0},n===`build`){t.build=t.build||{},t.build.rolldownOptions=t.build.rolldownOptions||{},t.build.rolldownOptions.input||(t.build.rolldownOptions.input={main:`./index.html`}),t.build.rolldownOptions.output=t.build.rolldownOptions.output||{};let e=Array.isArray(t.build.rolldownOptions.output)?t.build.rolldownOptions.output:[t.build.rolldownOptions.output];for(let t of e)t.advancedChunks=t.advancedChunks||{},t.advancedChunks.groups=t.advancedChunks.groups||[],t.advancedChunks.groups.push({name(e){return e.includes(`node_modules`)?e.includes(`node_modules/react-dom`)?`react-dom`:e.includes(`node_modules/react`)?`react`:`vendor`:null}}),t.chunkFileNames||=e=>e.moduleIds?.some(e=>_(e).hasUseServer)?`client/actions/[name]-[hash].js`:e.moduleIds?.some(e=>_(e).hasUseClient)?`client/components/[name]-[hash].js`:`assets/[name]-[hash].js`}return t.environments&&t.environments.client&&(t.environments.client.build||(t.environments.client.build={}),t.environments.client.build.rolldownOptions||(t.environments.client.build.rolldownOptions={}),t.environments.client.build.rolldownOptions.input||(t.environments.client.build.rolldownOptions.input={})),t},configResolved(e){let t=new Set([`react`,`react-dom`,`react/jsx-runtime`,`react/jsx-dev-runtime`,`react-dom/client`]);if(e.resolve?.alias){let n=e.resolve.alias;Array.isArray(n)?n.forEach(e=>{typeof e.find==`string`&&typeof e.replacement==`string`&&!t.has(e.find)&&(m[e.find]=e.replacement)}):typeof n==`object`&&Object.entries(n).forEach(([e,n])=>{typeof n==`string`&&!t.has(e)&&(m[e]=n)})}},transform(t,n){if(!e.test(n))return null;let r=this.environment;if(w(t,`use client`)){l.set(n,`client`),u.add(n);let e=t.split(`
|
|
22
|
+
`);for(let t of e){let e=t.match(J);if(!e)continue;let r=e[4];if(!r)continue;let i=O(r,n);g.existsSync(i)&&(l.set(i,`client`),u.add(i))}return D(t,n)}if(l.get(n)===`client`||u.has(n))return D(t,n);if(x(n)){if(l.set(n,`server`),r&&(r.name===`rsc`||r.name===`ssr`))return T(t,n);{let e=E(t,n);return e=`// HMR acceptance for server component
|
|
23
|
+
if (import.meta.hot) {
|
|
24
|
+
import.meta.hot.accept();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (typeof globalThis !== 'undefined') {
|
|
28
|
+
if (!globalThis['~rari']) globalThis['~rari'] = {};
|
|
29
|
+
globalThis['~rari'].serverComponents = globalThis['~rari'].serverComponents || new Set();
|
|
30
|
+
globalThis['~rari'].serverComponents.add(${JSON.stringify(n)});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
${e}`,e}}if(w(t,`use server`))return l.set(n,`server`),r&&(r.name===`rsc`||r.name===`ssr`)?T(t,n):E(t,n);let i=l.get(n);if(i===`server`)return r&&(r.name===`rsc`||r.name===`ssr`)?T(t,n):E(t,n);if(i===`client`)return D(t,n);l.set(n,`unknown`);let a=t.split(`
|
|
34
|
+
`),o=t,s=!1,c=!1,d=!1,f=[];for(let e of a){let i=e.match(J);if(!i)continue;let a=i[1],p=i[4],m=k(p),h=O(p,n),_=w(t,`use client`)||l.get(n)===`client`||n.includes(`entry-client`),v=l.get(h)===`client`||g.existsSync(h)&&g.readFileSync(h,`utf-8`).includes(`'use client'`);if(v&&(l.set(h,`client`),u.add(h)),v&&r&&(r.name===`rsc`||r.name===`ssr`)){if(!_){let t=e,n=a||`default`,r=`
|
|
35
|
+
import { registerClientReference } from "react-server-dom-rari/server";
|
|
36
|
+
const ${n} = registerClientReference(
|
|
37
|
+
function() {
|
|
38
|
+
throw new Error("Attempted to call ${n} from the server but it's on the client. It can only be rendered as a Component or passed to props of a Client Component.");
|
|
39
|
+
},
|
|
40
|
+
${JSON.stringify(h)},
|
|
41
|
+
${JSON.stringify(a||`default`)}
|
|
42
|
+
);`;o=o.replace(t,r),s=!0,c=!0}}else if(!_&&x(h)){s=!0,c=!0,d=!0;let t=e;a&&a!==`_`&&f.push(`const ${a} = createServerComponentWrapper('${m}', '${p}');`),o=o.replace(t,``)}}if(s){let e=o.includes(`import React`)||o.match(De)||o.match(Oe),t=o.includes(`createServerComponentWrapper`),r=``;if(c&&!e&&(r+=`import React from 'react';
|
|
43
|
+
`),d&&!t&&(r+=`import { createServerComponentWrapper } from 'virtual:rsc-integration.ts';
|
|
44
|
+
`),f.length>0&&(r+=`${f.join(`
|
|
45
|
+
`)}\n`),r&&(o=r+o),!o.includes(`Suspense`)){let e=o.match(ke);e&&(e[1]&&!e[2].includes(`Suspense`)?o=o.replace(e[0],e[0].replace(Ne,`{ Suspense, $1 }`)):e[1]||(o=o.replace(e[0],`import React, { Suspense } from 'react';`)))}let i=y.env.NODE_ENV!==`production`,a=o.includes(`</`)||o.includes(`/>`)||Y.test(o);return!o.includes(`'use client'`)&&!o.includes(`"use client"`)&&a&&i&&(o=`'use client';\n\n${o}`,l.set(n,`client`)),o}return null},async configureServer(t){let n=c.projectRoot||y.cwd(),i=v.join(n,`src`);await Z(n,c);let a=null,o=async()=>{try{let{ServerComponentBuilder:r,scanDirectory:i}=await import(`./server-build-emJwCUjS.mjs`).then(e=>e.n),o=new r(n,{outDir:`dist`,rscDir:`server`,manifestPath:`server/manifest.json`,serverConfigPath:`server/config.json`,alias:m,csp:c.csp,rateLimit:c.rateLimit,spamBlocker:c.spamBlocker});if(a=o,!p&&a){let e=y.env.SERVER_PORT?Number(y.env.SERVER_PORT):Number(y.env.PORT||y.env.RSC_PORT||3e3);p=new ae(a,e)}let s=v.join(n,`src`),l=[];if(g.existsSync(s)){let t=n=>{let r=g.readdirSync(n,{withFileTypes:!0});for(let i of r){let r=v.join(n,i.name);if(i.isDirectory())t(r);else if(i.isFile()&&e.test(i.name))try{x(r)&&l.push(r)}catch(e){console.error(`[rari] Error checking ${r}:`,e)}}};t(s),i(s,o)}l.length>0&&t.ws.send({type:`custom`,event:`rari:server-components-registry`,data:{serverComponents:l}});let u=await o.getTransformedComponentsForDevelopment(),d=`http://localhost:${y.env.SERVER_PORT?Number(y.env.SERVER_PORT):Number(y.env.PORT||y.env.RSC_PORT||3e3)}`;for(let e of u)try{if(e.id.startsWith(`app/`)||e.code.includes(`"use server"`)||e.code.includes(`'use server'`))continue;let t=await fetch(`${d}/_rari/register`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({component_id:e.id,component_code:e.code})});if(!t.ok){let e=await t.text();throw Error(`HTTP ${t.status}: ${e}`)}}catch(t){console.error(`[rari] Runtime: Failed to register component ${e.id}:`,t instanceof Error?t.message:String(t))}}catch(e){console.error(`[rari] Runtime: Component discovery failed:`,e instanceof Error?e.message:String(e))}},s=async()=>{try{let e=`http://localhost:${y.env.SERVER_PORT?Number(y.env.SERVER_PORT):Number(y.env.PORT||y.env.RSC_PORT||3e3)}`,t=Q(i,Object.values(m));for(let n of t){let t=v.relative(y.cwd(),n),i=v.basename(n).replace(r,``);try{await fetch(`${e}/_rari/register-client`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({component_id:i,file_path:t,export_name:`default`})})}catch(e){console.error(`[rari] Runtime: Failed to pre-register client component ${i}:`,e)}}}catch(e){console.error(`[rari] Runtime: Failed to pre-register client components:`,e)}},u=async()=>{if(f)return;let{getBinaryPath:e,getInstallationInstructions:n}=await import(`./platform.mjs`),r;try{r=e()}catch(e){console.error(`rari binary not found`),console.error(` ${e.message}`),console.error(n());return}let i=y.env.SERVER_PORT?Number(y.env.SERVER_PORT):Number(y.env.PORT||y.env.RSC_PORT||3e3),a=y.env.NODE_ENV===`production`?`production`:`development`,c=t.config.server.port||5173,l=[`--mode`,a,`--port`,i.toString(),`--host`,`127.0.0.1`];f=te(r,l,{stdio:[`ignore`,`pipe`,`pipe`],cwd:y.cwd(),env:{...y.env,RUST_LOG:y.env.RUST_LOG||`error`,RARI_VITE_PORT:c.toString()}}),f.stdout?.on(`data`,e=>{let t=e.toString().trim();t&&console.error(`${t}`)}),f.stderr?.on(`data`,e=>{let t=e.toString().trim();t&&!t.includes(`warning`)&&console.error(`${t}`)}),f.on(`error`,e=>{A=!1,console.error(`Failed to start rari server:`,e.message),e.message.includes(`ENOENT`)&&console.error(` Binary not found. Please ensure rari is properly installed.`)}),f.on(`exit`,(e,t)=>{f=null,A=!1,t?console.error(`rari server stopped by signal ${t}`):e===0?console.error(`rari server stopped successfully`):e&&console.error(`rari server exited with code ${e}`)});let u=!1;for(let e=0;e<20&&(u=await j(),!u);e++)await new Promise(e=>setTimeout(e,500));u?(await s(),await o()):console.error(`Server failed to become ready for component registration`)},d=async e=>{try{if(!x(e))return;let{ServerComponentBuilder:t}=await import(`./server-build-emJwCUjS.mjs`).then(e=>e.n),r=new t(n,{outDir:`dist`,rscDir:`server`,manifestPath:`server/manifest.json`,serverConfigPath:`server/config.json`,alias:m,csp:c.csp,rateLimit:c.rateLimit,spamBlocker:c.spamBlocker});r.addServerComponent(e);let i=await r.getTransformedComponentsForDevelopment();if(i.length===0)return;let a=`http://localhost:${y.env.SERVER_PORT?Number(y.env.SERVER_PORT):Number(y.env.PORT||y.env.RSC_PORT||3e3)}`;for(let e of i)try{let t=await fetch(`${a}/_rari/register`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({component_id:e.id,component_code:e.code})});if(!t.ok){let e=await t.text();throw Error(`HTTP ${t.status}: ${e}`)}}catch(t){console.error(`[rari] Failed to register component`,`${e.id}:`,t instanceof Error?t.message:String(t))}}catch(t){console.error(`[rari] Targeted HMR failed for`,`${e}:`,t instanceof Error?t.message:String(t)),setTimeout(o,1e3)}};u().catch(e=>{console.error(`[rari] Failed to start Rust server:`,e)}),t.middlewares.use(async(e,t,n)=>{let r=e.headers.accept;if(r&&r.includes(`text/x-component`)&&e.url&&!e.url.startsWith(`/api`)&&!e.url.startsWith(`/rsc`)&&!e.url.includes(`.`)){if(!A&&!await j()){let e=Date.now();for(;Date.now()-e<1e4&&!await j();)await new Promise(e=>setTimeout(e,100));if(!A){console.error(`[rari] Rust server not ready, cannot proxy RSC request`),t.headersSent||(t.statusCode=503,t.end(`Server not ready`));return}}let n=y.env.SERVER_PORT?Number(y.env.SERVER_PORT):Number(y.env.PORT||y.env.RSC_PORT||3e3),r=`http://localhost:${n}${e.url}`;try{let i={};for(let[t,n]of Object.entries(e.headers))typeof n==`string`?i[t]=n:Array.isArray(n)&&(i[t]=n.join(`,`));i.host=`localhost:${n}`,i[`accept-encoding`]=`identity`;let a=await fetch(r,{method:e.method,headers:i});if(t.statusCode=a.status,a.headers.forEach((e,n)=>{n.toLowerCase()!==`content-encoding`&&t.setHeader(n,e)}),a.body){let e=a.body.getReader();try{for(;;){let{done:n,value:r}=await e.read();if(n)break;t.write(ee.from(r))}t.end()}catch(e){console.error(`[rari] Stream error:`,e),t.headersSent||(t.statusCode=500),t.end()}}else t.end();return}catch(e){console.error(`[rari] Failed to proxy RSC request:`,e),t.headersSent||(t.statusCode=500,t.end(`Internal Server Error`));return}}n()}),t.watcher.on(`change`,async n=>{e.test(n)&&l.delete(n),e.test(n)&&n.includes(i)&&(x(n)?(t.ws.send({type:`custom`,event:`rari:register-server-component`,data:{filePath:n}}),await d(n)):setTimeout(o,1e3))}),t.middlewares.use(`/api/vite/hmr-transform`,async(e,t)=>{if(e.method!==`POST`){t.statusCode=405,t.end(`Method Not Allowed`);return}let n=``;e.on(`data`,e=>{n+=e.toString()}),e.on(`end`,async()=>{try{let{filePath:e}=JSON.parse(n);if(!e){t.statusCode=400,t.end(JSON.stringify({error:`filePath is required`}));return}await d(e),t.statusCode=200,t.setHeader(`Content-Type`,`application/json`),t.end(JSON.stringify({success:!0,filePath:e,message:`Component transformation completed`}))}catch(e){t.statusCode=500,t.setHeader(`Content-Type`,`application/json`),t.end(JSON.stringify({success:!1,error:e instanceof Error?e.message:String(e)}))}})}),t.httpServer?.on(`close`,()=>{p&&=(p.dispose(),null),f&&=(f.kill(`SIGTERM`),null),A=!1})},resolveId(e,t){if(e===`virtual:rsc-integration`||e===`virtual:rsc-integration.ts`)return`virtual:rsc-integration.ts`;if(e===`virtual:rari-entry-client`||e===`virtual:rari-entry-client.ts`)return`virtual:rari-entry-client.ts`;if(e===`virtual:react-server-dom-rari-client`||e===`virtual:react-server-dom-rari-client.ts`)return`virtual:react-server-dom-rari-client.ts`;if(e===`virtual:app-router-provider`||e===`virtual:app-router-provider.tsx`)return`virtual:app-router-provider.tsx`;if(e===`./DefaultLoadingIndicator`||e===`./DefaultLoadingIndicator.tsx`)return`virtual:default-loading-indicator.tsx`;if(e===`./LoadingErrorBoundary`||e===`./LoadingErrorBoundary.tsx`)return`virtual:loading-error-boundary.tsx`;if(e===`react-server-dom-rari/server`)return e;if(t&&t.startsWith(`virtual:`)&&e.startsWith(`../`)){let n=import.meta.url,r=b(n),i=v.dirname(r),a=null,o=[v.join(i,`runtime`),v.join(i,`../runtime`)];for(let e of o)if(g.existsSync(e)){a=e;break}if(a){let t=v.join(a,e);if(g.existsSync(t))return t;let n=v.join(a,`../dist`,v.basename(e));if(g.existsSync(n))return n}else console.warn(`[rari] Runtime directory not found, attempting fallback resolution for virtual import.\n Importer: ${t}\n ID: ${e}\n Current Dir: ${i}\n Hint: Runtime lookup failed, trying currentDir as fallback`);let s=v.join(i,e);if(g.existsSync(s))return s;let c=v.join(i,`../dist`,v.basename(e));if(g.existsSync(c))return c}if(y.env.NODE_ENV===`production`)try{let t=v.resolve(e);if(g.existsSync(t)&&x(t))return{id:e,external:!0}}catch(t){t?.code!==`ENOENT`&&console.warn(`[rari] Unexpected error resolving server component:`,e,t)}return null},async load(t){if(e.test(t)){let e=this.environment;if(e&&e.name===`client`)try{let e=g.readFileSync(t,`utf-8`);if(w(e,`use server`))return E(e,t)}catch{}}if(t===`virtual:rari-entry-client.ts`){let t=Q(v.join(y.cwd(),`src`),Object.values(m)),r=new Set([...u,...t]),i=[{path:`rari/image`,exports:[`Image`]}],c=[...r].filter(e=>{try{return w(g.readFileSync(e,`utf-8`),`use client`)}catch{return!1}}).map(t=>{let r=v.relative(y.cwd(),t).replace(a,`/`),i=r.replace(e,``),c=r.startsWith(`..`)?t.replace(a,`/`):r,l=!1,u=``;try{let e=g.readFileSync(t,`utf-8`),r=n.test(e),i=e.match(o);!r&&i&&(l=!0,u=i[1])}catch(e){e?.code!==`ENOENT`&&console.warn(`[rari] Unexpected error reading component for export detection:`,t,e)}let d=c.replace(a,`/`),f=d.startsWith(`/`)||s.test(d)?d:`/${d}`;return` "${c}": {
|
|
46
|
+
id: "${i}",
|
|
47
|
+
path: "${c}",
|
|
48
|
+
type: "client",
|
|
49
|
+
loader: () => ${l?`import(${JSON.stringify(f)}).then(m => m.${u} || m.default || m)`:`import(${JSON.stringify(f)}).then(m => m.default || m)`},
|
|
50
|
+
component: null,
|
|
51
|
+
loading: false,
|
|
52
|
+
registered: false
|
|
53
|
+
}`}).join(`,
|
|
54
|
+
`),l=i.map((e,t)=>`import { ${e.exports.map(e=>`${e} as External${t}_${e}`).join(`, `)} } from '${e.path}';`).join(`
|
|
55
|
+
`),d=i.flatMap((e,t)=>e.exports.map(n=>{let r=`External${t}_${n}`;return`
|
|
56
|
+
globalThis['~clientComponents'] = globalThis['~clientComponents'] || {};
|
|
57
|
+
globalThis['~clientComponents']["${`${e.path}#${n}`}"] = {
|
|
58
|
+
id: "${n}",
|
|
59
|
+
path: "${e.path}",
|
|
60
|
+
type: "client",
|
|
61
|
+
component: ${r},
|
|
62
|
+
registered: true
|
|
63
|
+
};
|
|
64
|
+
globalThis['~clientComponents']["${e.path}"] = globalThis['~clientComponents']["${e.path}"] || {};
|
|
65
|
+
globalThis['~clientComponents']["${e.path}"].component = ${r};
|
|
66
|
+
globalThis['~clientComponentPaths'] = globalThis['~clientComponentPaths'] || {};
|
|
67
|
+
globalThis['~clientComponentPaths']["${e.path}"] = "${n}";`})).join(`
|
|
68
|
+
`);return await Ie(l,[`
|
|
69
|
+
const lazyComponentRegistry = {
|
|
70
|
+
${c}
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
for (const [path, config] of Object.entries(lazyComponentRegistry)) {
|
|
74
|
+
globalThis['~clientComponents'][path] = config;
|
|
75
|
+
globalThis['~clientComponents'][config.id] = config;
|
|
76
|
+
globalThis['~clientComponentPaths'][path] = config.id;
|
|
77
|
+
}
|
|
78
|
+
`,d].filter(Boolean).join(`
|
|
79
|
+
`))}if(t===`react-server-dom-rari/server`)return await Le();if(t===`virtual:app-router-provider.tsx`){let e=[v.join(y.cwd(),`packages/rari/dist/runtime/AppRouterProvider.mjs`),v.join(y.cwd(),`node_modules/rari/dist/runtime/AppRouterProvider.mjs`)];for(let t of e)if(g.existsSync(t))return g.readFileSync(t,`utf-8`);return`export function AppRouterProvider({ children }) { return children; }`}if(t===`virtual:default-loading-indicator.tsx`){let e=[v.join(y.cwd(),`packages/rari/dist/runtime/DefaultLoadingIndicator.mjs`),v.join(y.cwd(),`node_modules/rari/dist/runtime/DefaultLoadingIndicator.mjs`)];for(let t of e)if(g.existsSync(t))return g.readFileSync(t,`utf-8`);return`export function DefaultLoadingIndicator() { return null; }`}if(t===`virtual:loading-error-boundary.tsx`){let e=[v.join(y.cwd(),`packages/rari/dist/runtime/LoadingErrorBoundary.mjs`),v.join(y.cwd(),`node_modules/rari/dist/runtime/LoadingErrorBoundary.mjs`)];for(let t of e)if(g.existsSync(t))return g.readFileSync(t,`utf-8`);return`export class LoadingErrorBoundary extends React.Component { render() { return this.props.children; } }`}if(t===`virtual:rsc-integration.ts`)return(await Fe()).replace(je,(e,t,n)=>`from${t}${n}virtual:react-server-dom-rari-client.ts${n}`);if(t===`virtual:react-server-dom-rari-client.ts`)return await X(`react-server-dom-rari-client.mjs`);if(t.endsWith(`.mjs`)&&g.existsSync(t))try{let e=c.projectRoot||y.cwd(),n=g.realpathSync(t),r=v.relative(e,n),i=!r.startsWith(`..`)&&!v.isAbsolute(r),a=n.includes(`${v.sep}node_modules${v.sep}`),o=n.includes(`${v.sep}packages${v.sep}rari${v.sep}`)||n.includes(`${v.sep}node_modules${v.sep}rari${v.sep}`);return i||a||o?g.readFileSync(t,`utf-8`):(console.warn(`[rari] Refusing to load .mjs file outside project root and node_modules: ${t}`),null)}catch(e){return console.warn(`[rari] Error validating .mjs file path: ${t}`,e),null}},async handleHotUpdate({file:t,server:n}){if(!e.test(t))return;if(t.includes(`/dist/`)||t.includes(`\\dist\\`))return[];let r=p?.detectComponentType(t)||`unknown`,i=t.includes(`/app/`)||t.includes(`\\app\\`),a=t.endsWith(`page.tsx`)||t.endsWith(`page.jsx`),o=t.endsWith(`layout.tsx`)||t.endsWith(`layout.jsx`),s=t.endsWith(`loading.tsx`)||t.endsWith(`loading.jsx`),c=t.endsWith(`error.tsx`)||t.endsWith(`error.jsx`),l=t.endsWith(`not-found.tsx`)||t.endsWith(`not-found.jsx`);if(i&&(a||o||s||c||l)){let e=`page`;o?e=`layout`:s?e=`loading`:c?e=`error`:l&&(e=`not-found`),n.hot.send(`rari:app-router-updated`,{type:`rari-hmr`,filePath:t,fileType:e});return}if(r!==`client`&&r===`server`)return p&&await p.handleServerComponentUpdate(t,n),[]},transformIndexHtml:{order:`pre`,handler(e){let t=[];for(let n of e.matchAll(Ae)){let e=n[1];e.startsWith(`/src/`)&&t.push(e)}return t.length>0?{html:e,tags:t.map(e=>({tag:`script`,attrs:{type:`module`,src:e},injectTo:`head-prepend`}))}:e}},async writeBundle(){await Z(c.projectRoot||y.cwd(),c)}},h({...c.serverBuild,csp:c.csp,rateLimit:c.rateLimit,spamBlocker:c.spamBlocker})];return c.proxy!==!1&&M.push(C(c.proxy||{})),c.router!==!1&&M.push(N(c.router||{})),M}function ze(e){return{plugins:[$(),...e.plugins||[]],...e}}export{C as a,N as i,Re as n,S as o,$ as r,ze as t};
|
package/dist/vite.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { A as MetadataResult, C as LayoutProps, D as PageProps, E as NotFoundEntry, F as extractMetadata, I as extractServerProps, L as extractServerPropsWithCache, M as StaticParamsResult, N as clearPropsCache, O as RouteSegment, P as clearPropsCacheForComponent, R as extractStaticParams, S as LayoutEntry, T as Metadata, _ as AppRouteMatch, b as GenerateMetadata, c as HttpRuntimeClient, d as RuntimeClient, g as AppRouteManifest, h as AppRouteEntry, i as ServerSpamBlockerConfig, j as ServerSidePropsResult, k as RouteSegmentType, n as ServerConfig, p as createHttpRuntimeClient, r as ServerRateLimitConfig, t as ServerCSPConfig, v as ErrorEntry, w as LoadingEntry, x as GenerateStaticParams, y as ErrorProps, z as hasServerSideDataFetching } from "./server-config-
|
|
2
|
-
import { _ as SitemapVideo, a as generateAppRouteManifest, c as ApiResponse, d as RouteHandler, f as Robots, g as SitemapImage, h as SitemapEntry, i as rariRouter, l as ApiRouteHandlers, m as Sitemap, n as defineRariOptions, o as ProxyPluginOptions, p as RobotsRule, r as rari, s as rariProxy, t as defineRariConfig, u as RouteContext } from "./index-
|
|
3
|
-
import { a as ProxyModule, c as RariURL, i as ProxyMatcher, l as RequestCookies, n as ProxyConfig, o as ProxyResult, r as ProxyFunction, s as RariFetchEvent, t as CookieOptions, u as ResponseCookies } from "./types-
|
|
1
|
+
import { A as MetadataResult, C as LayoutProps, D as PageProps, E as NotFoundEntry, F as extractMetadata, I as extractServerProps, L as extractServerPropsWithCache, M as StaticParamsResult, N as clearPropsCache, O as RouteSegment, P as clearPropsCacheForComponent, R as extractStaticParams, S as LayoutEntry, T as Metadata, _ as AppRouteMatch, b as GenerateMetadata, c as HttpRuntimeClient, d as RuntimeClient, g as AppRouteManifest, h as AppRouteEntry, i as ServerSpamBlockerConfig, j as ServerSidePropsResult, k as RouteSegmentType, n as ServerConfig, p as createHttpRuntimeClient, r as ServerRateLimitConfig, t as ServerCSPConfig, v as ErrorEntry, w as LoadingEntry, x as GenerateStaticParams, y as ErrorProps, z as hasServerSideDataFetching } from "./server-config-BLpfK714.mjs";
|
|
2
|
+
import { _ as SitemapVideo, a as generateAppRouteManifest, c as ApiResponse, d as RouteHandler, f as Robots, g as SitemapImage, h as SitemapEntry, i as rariRouter, l as ApiRouteHandlers, m as Sitemap, n as defineRariOptions, o as ProxyPluginOptions, p as RobotsRule, r as rari, s as rariProxy, t as defineRariConfig, u as RouteContext } from "./index-DuCX6G_W.mjs";
|
|
3
|
+
import { a as ProxyModule, c as RariURL, i as ProxyMatcher, l as RequestCookies, n as ProxyConfig, o as ProxyResult, r as ProxyFunction, s as RariFetchEvent, t as CookieOptions, u as ResponseCookies } from "./types-BQ-op_Tc.mjs";
|
|
4
4
|
import { RariRequest } from "./proxy/RariRequest.mjs";
|
|
5
5
|
import { RariResponse } from "./proxy/RariResponse.mjs";
|
|
6
6
|
|
package/dist/vite.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as e,i as t,n,o as r,r as i,t as a}from"./vite-
|
|
1
|
+
import{a as e,i as t,n,o as r,r as i,t as a}from"./vite-BTJjUXqs.mjs";import{RariRequest as o}from"./proxy/RariRequest.mjs";import{RariResponse as s}from"./proxy/RariResponse.mjs";import{c,d as l,f as u,g as d,h as f,i as p,m,p as h,u as g}from"./runtime-client-Bg4V1Ksp.mjs";import"./regex-constants-BM4Vd-_c.mjs";import{t as _}from"./routes-DEvXO96u.mjs";import"./constants-DZAg-dr0.mjs";import"./server-build-emJwCUjS.mjs";export{r as ApiResponse,p as HttpRuntimeClient,o as RariRequest,s as RariResponse,g as clearPropsCache,l as clearPropsCacheForComponent,c as createHttpRuntimeClient,a as defineRariConfig,n as defineRariOptions,u as extractMetadata,h as extractServerProps,m as extractServerPropsWithCache,f as extractStaticParams,_ as generateAppRouteManifest,d as hasServerSideDataFetching,i as rari,e as rariProxy,t as rariRouter};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rari",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.9.
|
|
4
|
+
"version": "0.9.3",
|
|
5
5
|
"description": "Runtime Accelerated Rendering Infrastructure (rari)",
|
|
6
6
|
"author": "Ryan Skinner",
|
|
7
7
|
"license": "MIT",
|
|
@@ -102,18 +102,18 @@
|
|
|
102
102
|
"rolldown": "1.0.0-rc.2"
|
|
103
103
|
},
|
|
104
104
|
"optionalDependencies": {
|
|
105
|
-
"rari-darwin-arm64": "0.9.
|
|
106
|
-
"rari-darwin-x64": "0.9.
|
|
107
|
-
"rari-linux-arm64": "0.9.
|
|
108
|
-
"rari-linux-x64": "0.9.
|
|
109
|
-
"rari-win32-x64": "0.9.
|
|
105
|
+
"rari-darwin-arm64": "0.9.3",
|
|
106
|
+
"rari-darwin-x64": "0.9.3",
|
|
107
|
+
"rari-linux-arm64": "0.9.3",
|
|
108
|
+
"rari-linux-x64": "0.9.3",
|
|
109
|
+
"rari-win32-x64": "0.9.3"
|
|
110
110
|
},
|
|
111
111
|
"devDependencies": {
|
|
112
112
|
"@types/node": "^25.2.3",
|
|
113
113
|
"@types/react": "^19.2.14",
|
|
114
114
|
"@types/react-dom": "^19.2.3",
|
|
115
|
-
"@typescript/native-preview": "^7.0.0-dev.
|
|
116
|
-
"oxlint": "^1.
|
|
115
|
+
"@typescript/native-preview": "^7.0.0-dev.20260217.1",
|
|
116
|
+
"oxlint": "^1.48.0",
|
|
117
117
|
"rolldown-vite": "^7.3.1",
|
|
118
118
|
"tsdown": "^0.20.3",
|
|
119
119
|
"@rari/deploy": "0.1.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
async function e(e){let t=globalThis[`~clientComponents`]||{},n=[];for(let[,r]of e){let e=[r.id,`${r.id}#${r.name||`default`}`,r.id.replace(/^src\//,``),r.id.replace(/\\/g,`/`)];for(let r of e){let e=t[r];if(e?.loader&&!e.component&&!e.loading){e.loading=!0,e.loadPromise=e.loader().then(t=>{e.component=t.default||t,e.registered=!0,e.loading=!1}).catch(t=>{e.loading=!1,e.loadPromise=void 0,console.error(`[rari] Failed to preload component ${r}:`,t)}),n.push(e.loadPromise);break}}}n.length>0&&await Promise.all(n)}export{e as t};
|
package/dist/routes-DbsqVAaM.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./rolldown-runtime-DR3Ue2cl.mjs";import{promises as t}from"node:fs";import n from"node:path";var r=e({generateAppRouteManifest:()=>c});const i={PAGE:`page`,LAYOUT:`layout`,LOADING:`loading`,ERROR:`error`,NOT_FOUND:`not-found`,TEMPLATE:`template`,DEFAULT:`default`,ROUTE:`route`,OG_IMAGE:`opengraph-image`,TWITTER_IMAGE:`twitter-image`,ICON:`icon`,APPLE_ICON:`apple-icon`},a={DYNAMIC:/^\[([^\]]+)\]$/,CATCH_ALL:/^\[\.\.\.([^\]]+)\]$/,OPTIONAL_CATCH_ALL:/^\[\[\.\.\.([^\]]+)\]\]$/},o=[`GET`,`POST`,`PUT`,`DELETE`,`PATCH`,`HEAD`,`OPTIONS`];var s=class{appDir;extensions;verbose;constructor(e){this.appDir=n.resolve(e.appDir),this.extensions=e.extensions||[`.tsx`,`.jsx`,`.ts`,`.js`],this.verbose=e.verbose||!1}async generateManifest(){this.verbose&&console.warn(`[rari] Router: Scanning app directory: ${this.appDir}`);let e=[],t=[],n=[],r=[],i=[],a=[],o=[];return await this.scanDirectory(``,e,t,n,r,i,a,o),this.verbose&&(console.warn(`[rari] Router: Found ${e.length} routes`),console.warn(`[rari] Router: Found ${t.length} layouts`),console.warn(`[rari] Router: Found ${n.length} loading components`),console.warn(`[rari] Router: Found ${r.length} error boundaries`),console.warn(`[rari] Router: Found ${a.length} API routes`),console.warn(`[rari] Router: Found ${o.length} OG images`)),{routes:this.sortRoutes(e),layouts:this.sortLayouts(t),loading:n,errors:r,notFound:i,apiRoutes:this.sortApiRoutes(a),ogImages:o,generated:new Date().toISOString()}}async scanDirectory(e,r,i,a,o,s,c,l){let u=n.join(this.appDir,e),d;try{d=await t.readdir(u)}catch{return}let f=[],p=[];for(let e of d){let r=n.join(u,e),i=await t.stat(r);i.isDirectory()?this.shouldScanDirectory(e)&&p.push(e):i.isFile()&&f.push(e)}await this.processSpecialFiles(e,f,r,i,a,o,s,c,l);for(let t of p){let u=e?n.join(e,t):t;await this.scanDirectory(u,r,i,a,o,s,c,l)}}async processSpecialFiles(e,r,a,o,s,c,l,u,d){let f=this.pathToRoute(e),p=this.findFile(r,i.PAGE);if(p){let t=this.parseRouteSegments(e),r=this.extractParams(t);a.push({path:f,filePath:n.join(e,p),segments:t,params:r,isDynamic:r.length>0})}let m=this.findFile(r,i.LAYOUT);if(m){let t=this.getParentPath(e);o.push({path:f,filePath:n.join(e,m),parentPath:t?this.pathToRoute(t):void 0})}let h=this.findFile(r,i.LOADING);if(h){let t=this.generateComponentId(f,`loading`);s.push({path:f,filePath:n.join(e,h),componentId:t})}let g=this.findFile(r,i.ERROR);g&&c.push({path:f,filePath:n.join(e,g)});let _=this.findFile(r,i.NOT_FOUND);_&&l.push({path:f,filePath:n.join(e,_)});let v=this.findFile(r,i.OG_IMAGE);if(v){let r=n.join(e,v),i=n.join(this.appDir,r),a,o,s;try{let e=await t.readFile(i,`utf-8`),n=e.match(/export\s+const\s+size\s*=\s*\{\s*width\s*:\s*(\d+)\s*,\s*height\s*:\s*(\d+)\s*[,}]/);n&&(a=Number.parseInt(n[1],10),o=Number.parseInt(n[2],10));let r=e.match(/export\s+const\s+contentType\s*=\s*['"]([^'"]+)['"]/);r&&(s=r[1])}catch{}d.push({path:f,filePath:r,width:a,height:o,contentType:s})}let y=this.findFile(r,i.ROUTE);if(y){let t=await this.processApiRouteFile(e,y);u.push(t)}}findFile(e,t){for(let n of this.extensions){let r=`${t}${n}`;if(e.includes(r))return r}}pathToRoute(e){return e?`/${e.replace(/\\/g,`/`).split(`/`).filter(Boolean).map(e=>a.OPTIONAL_CATCH_ALL.test(e)?`[[...${e.match(a.OPTIONAL_CATCH_ALL)[1]}]]`:a.CATCH_ALL.test(e)?`[...${e.match(a.CATCH_ALL)[1]}]`:a.DYNAMIC.test(e)?`[${e.match(a.DYNAMIC)[1]}]`:e).join(`/`)}`:`/`}parseRouteSegments(e){return e?e.split(/[/\\]/).filter(Boolean).map(e=>a.OPTIONAL_CATCH_ALL.test(e)?{type:`optional-catch-all`,value:e,param:e.match(a.OPTIONAL_CATCH_ALL)[1]}:a.CATCH_ALL.test(e)?{type:`catch-all`,value:e,param:e.match(a.CATCH_ALL)[1]}:a.DYNAMIC.test(e)?{type:`dynamic`,value:e,param:e.match(a.DYNAMIC)[1]}:{type:`static`,value:e}):[]}extractParams(e){return e.filter(e=>e.param!==void 0).map(e=>e.param)}getParentPath(e){if(!e)return null;let t=e.split(/[/\\]/).filter(Boolean);return t.length===0?null:t.slice(0,-1).join(`/`)}generateComponentId(e,t){return`${t}:${e}`}shouldScanDirectory(e){return![`node_modules`,`.git`,`dist`,`build`,`__tests__`,`test`,`tests`,`coverage`].includes(e)&&!e.startsWith(`.`)}sortRoutes(e){return e.sort((e,t)=>{let n=e=>{if(!e.isDynamic)return 0;let t=e.segments.some(e=>e.type===`catch-all`);return e.segments.some(e=>e.type===`optional-catch-all`)?3:t?2:1},r=n(e),i=n(t);if(r!==i)return r-i;let a=e.path.split(`/`).length,o=t.path.split(`/`).length;return a===o?e.path.localeCompare(t.path):o-a})}sortApiRoutes(e){return e.sort((e,t)=>{if(!e.isDynamic&&t.isDynamic)return-1;if(e.isDynamic&&!t.isDynamic)return 1;let n=e.path.split(`/`).length,r=t.path.split(`/`).length;return n===r?e.path.localeCompare(t.path):n-r})}sortLayouts(e){return e.sort((e,t)=>e.path===`/`&&t.path!==`/`?-1:t.path===`/`&&e.path!==`/`?1:e.path.split(`/`).length-t.path.split(`/`).length)}async detectHttpMethods(e){let r=n.join(this.appDir,e),i=await t.readFile(r,`utf-8`),a=[];for(let e of o){let t=RegExp(`export\\s+(?:async\\s+)?function\\s+${e}\\s*\\(`),n=RegExp(`export\\s+(?:async\\s+)?(?:const|let|var)\\s+${e}\\s*=`);(t.test(i)||n.test(i))&&a.push(e)}return a}async processApiRouteFile(e,t){let r=n.join(e,t),i=this.pathToRoute(e),a=this.parseRouteSegments(e),o=this.extractParams(a),s=await this.detectHttpMethods(r);return{path:i,filePath:r,segments:a,params:o,isDynamic:o.length>0,methods:s}}};async function c(e,t={}){return new s({appDir:e,...t}).generateManifest()}export{r as n,c as t};
|