@lomray/vite-ssr-boost 8.3.0-beta.1 → 8.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/browser/entry.d.ts +1 -0
- package/browser/entry.js +1 -1
- package/cli/diagnostic-codes.d.ts +3 -0
- package/cli/diagnostic-codes.js +2 -0
- package/cli/diagnostic-codes.js.map +1 -0
- package/cli/doctor.d.ts +55 -0
- package/cli/doctor.js +2 -0
- package/cli/doctor.js.map +1 -0
- package/cli/init.d.ts +17 -0
- package/cli/init.js +2 -0
- package/cli/init.js.map +1 -0
- package/cli/project.d.ts +56 -0
- package/cli/project.js +2 -0
- package/cli/project.js.map +1 -0
- package/cli.js +1 -1
- package/cli.js.map +1 -1
- package/helpers/is-route-file.js +1 -1
- package/helpers/is-route-file.js.map +1 -1
- package/package.json +6 -2
- package/plugins/normalize-route.js +1 -1
- package/plugins/normalize-route.js.map +1 -1
- package/services/build.d.ts +1 -0
- package/services/build.js +1 -1
- package/services/build.js.map +1 -1
- package/services/parse-routes.d.ts +17 -55
- package/services/parse-routes.js +1 -1
- package/services/parse-routes.js.map +1 -1
- package/services/path-normalize.js +1 -1
- package/services/path-normalize.js.map +1 -1
- package/services/source-files.d.ts +35 -0
- package/services/source-files.js +2 -0
- package/services/source-files.js.map +1 -0
- package/services/ssr-manifest.js +1 -1
- package/services/ssr-manifest.js.map +1 -1
package/README.md
CHANGED
|
@@ -24,6 +24,10 @@
|
|
|
24
24
|
|
|
25
25
|
```bash
|
|
26
26
|
npm i @lomray/vite-ssr-boost
|
|
27
|
+
npx ssr-boost init --dry-run
|
|
28
|
+
npx ssr-boost init --apply
|
|
29
|
+
npm install
|
|
30
|
+
npx ssr-boost doctor
|
|
27
31
|
```
|
|
28
32
|
|
|
29
33
|
`@lomray/vite-ssr-boost` adds server rendering to your Vite project while keeping your route objects and components. Build SSR and SPA output from the same app, and choose a managed Express server or a Fetch handler for your own transport.
|
package/browser/entry.d.ts
CHANGED
|
@@ -22,3 +22,4 @@ export interface IEntryClientOptions<T> {
|
|
|
22
22
|
*/
|
|
23
23
|
declare function entry<TAppProps>(App: TApp<TAppProps>, routes: TRouteObject[], { init, routerOptions, createRouter, rootId, }?: IEntryClientOptions<TAppProps>): Promise<ReactDOM.Root | void>;
|
|
24
24
|
export default entry;
|
|
25
|
+
export { entry };
|
package/browser/entry.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"react";import t from"react-dom/client";import{matchRoutes as o,createBrowserRouter as r,RouterProvider as n}from"react-router";import a from"./stream.js";import{IS_SSR_MODE as i}from"../constants/common.js";async function c(c,d,{init:s,routerOptions:l,createRouter:m=r,rootId:u="root"}={}){const f=i?a():void 0,w=(()=>{const e="__staticRouterHydrationData";if(!("loading"!==document.readyState||i&&void 0!==Reflect.get(window,e)))return new Promise(t=>{const o=()=>{i&&Reflect.deleteProperty(window,e),t()};document.addEventListener("DOMContentLoaded",o,{once:!0}),i&&Object.defineProperty(window,e,{configurable:!0,enumerable:!0,get:()=>{},set:r=>{Object.defineProperty(window,e,{configurable:!0,enumerable:!0,writable:!0,value:r}),document.removeEventListener("DOMContentLoaded",o),t()}})})})(),y=o(d,window.location,l?.basename)?.filter(e=>e.route.lazy);(w||y?.length)&&await Promise.all([w,...(y??[]).map(async e=>{const{lazy:t}=e.route;if("function"==typeof t){const o=await t();o&&Object.assign(e.route,{...o,lazy:void 0})}})]);const p=Reflect.get(window,"__staticRouterHydrationData");f&&p?.__ssrBoostStream&&Reflect.set(window,"__staticRouterHydrationData",await f.ready);const R=m(d,l),b=document.getElementById(u),g=await(s?.({isSSRMode:i,router:R})),_=()=>e.createElement(c,{client:g},e.createElement(n,{router:R}));return i&&"1"!==b.dataset.forceSpa?t.hydrateRoot(b,e.createElement(_,null)):t.createRoot(b).render(e.createElement(_,null))}export{c as default};
|
|
1
|
+
import e from"react";import t from"react-dom/client";import{matchRoutes as o,createBrowserRouter as r,RouterProvider as n}from"react-router";import a from"./stream.js";import{IS_SSR_MODE as i}from"../constants/common.js";async function c(c,d,{init:s,routerOptions:l,createRouter:m=r,rootId:u="root"}={}){const f=i?a():void 0,w=(()=>{const e="__staticRouterHydrationData";if(!("loading"!==document.readyState||i&&void 0!==Reflect.get(window,e)))return new Promise(t=>{const o=()=>{i&&Reflect.deleteProperty(window,e),t()};document.addEventListener("DOMContentLoaded",o,{once:!0}),i&&Object.defineProperty(window,e,{configurable:!0,enumerable:!0,get:()=>{},set:r=>{Object.defineProperty(window,e,{configurable:!0,enumerable:!0,writable:!0,value:r}),document.removeEventListener("DOMContentLoaded",o),t()}})})})(),y=o(d,window.location,l?.basename)?.filter(e=>e.route.lazy);(w||y?.length)&&await Promise.all([w,...(y??[]).map(async e=>{const{lazy:t}=e.route;if("function"==typeof t){const o=await t();o&&Object.assign(e.route,{...o,lazy:void 0})}})]);const p=Reflect.get(window,"__staticRouterHydrationData");f&&p?.__ssrBoostStream&&Reflect.set(window,"__staticRouterHydrationData",await f.ready);const R=m(d,l),b=document.getElementById(u),g=await(s?.({isSSRMode:i,router:R})),_=()=>e.createElement(c,{client:g},e.createElement(n,{router:R}));return i&&"1"!==b.dataset.forceSpa?t.hydrateRoot(b,e.createElement(_,null)):t.createRoot(b).render(e.createElement(_,null))}export{c as default,c as entry};
|
|
2
2
|
//# sourceMappingURL=entry.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const S=["SSR_BOOST_LOADER_NOT_SERIALIZABLE","SSR_BOOST_STATE_NOT_SERIALIZABLE","SSR_BOOST_OUTLET_MISSING","SSR_BOOST_HYDRATION_STATE_MISSING","SSR_BOOST_DUPLICATE_OUTPUT","SSR_BOOST_ONRESPONSE_INVALID_RETURN"];export{S as default};
|
|
2
|
+
//# sourceMappingURL=diagnostic-codes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostic-codes.js","sources":["../../src/cli/diagnostic-codes.ts"],"sourcesContent":[null],"names":["DIAGNOSTIC_CODES"],"mappings":"AACA,MAAMA,EAAmB,CACvB,oCACA,mCACA,2BACA,oCACA,6BACA"}
|
package/cli/doctor.d.ts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export interface IDoctorOptions {
|
|
2
|
+
root?: string;
|
|
3
|
+
json?: boolean;
|
|
4
|
+
bundle?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ICheck {
|
|
7
|
+
name: string;
|
|
8
|
+
status: 'ok' | 'warn' | 'error';
|
|
9
|
+
message: string;
|
|
10
|
+
fix: string;
|
|
11
|
+
info?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface IDoctorReport {
|
|
14
|
+
versions: Record<string, string | null>;
|
|
15
|
+
adapter: string | null;
|
|
16
|
+
routes: {
|
|
17
|
+
id: string;
|
|
18
|
+
path: string | null;
|
|
19
|
+
}[];
|
|
20
|
+
checks: ICheck[];
|
|
21
|
+
diagnosticCodes: string[];
|
|
22
|
+
}
|
|
23
|
+
export declare const TESTED_MATRIX: {
|
|
24
|
+
react: string;
|
|
25
|
+
router: string;
|
|
26
|
+
vite: string;
|
|
27
|
+
}[];
|
|
28
|
+
/** Prefer npm's own CLI, then the npm bundled beside the current Node runtime. */
|
|
29
|
+
export declare const resolveNpmCli: () => string | undefined;
|
|
30
|
+
/** Inspect npm's dependency tree, counting physical copies rather than dependants. */
|
|
31
|
+
export declare const reactCopies: (root: string) => {
|
|
32
|
+
react: number;
|
|
33
|
+
"react-dom": number;
|
|
34
|
+
};
|
|
35
|
+
/** Read-only project inspection. The JSON schema is also usable from automation. */
|
|
36
|
+
export declare const inspectProject: (options?: IDoctorOptions) => IDoctorReport;
|
|
37
|
+
/** Support bundles contain an allowlist, never raw messages, npm output, env, or source. */
|
|
38
|
+
export declare const supportBundle: (report: IDoctorReport) => {
|
|
39
|
+
schemaVersion: number;
|
|
40
|
+
versions: Record<string, string | null>;
|
|
41
|
+
adapter: string | null;
|
|
42
|
+
routes: {
|
|
43
|
+
id: string;
|
|
44
|
+
path: string | null;
|
|
45
|
+
}[];
|
|
46
|
+
checks: {
|
|
47
|
+
info?: true | undefined;
|
|
48
|
+
name: string;
|
|
49
|
+
status: "error" | "warn" | "ok";
|
|
50
|
+
fix: string;
|
|
51
|
+
}[];
|
|
52
|
+
diagnosticCodes: string[];
|
|
53
|
+
};
|
|
54
|
+
declare const runDoctor: (options?: IDoctorOptions) => void;
|
|
55
|
+
export default runDoctor;
|
package/cli/doctor.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import e from"node:child_process";import t from"node:fs";import{createRequire as s}from"node:module";import r from"node:path";import o from"semver";import n from"./diagnostic-codes.js";import{libraryPackage as i,stringValue as a,readPackage as c,readConfig as l,readHtml as d,objectProperty as p}from"./project.js";import u from"../constants/plugin-name.js";import m from"../services/parse-routes.js";import f from"../services/server-config.js";import h from"../services/source-files.js";const g=[{react:"18.2.0",router:"7.18.3",vite:"6.4.3"},{react:"19.2.8",router:"7.18.3",vite:"7.3.6"},{react:"19.2.8",router:"8.3.1",vite:"8.2.2"}],v=()=>{const e=r.dirname(process.execPath);return[process.env.npm_execpath,r.join(e,"..","lib","node_modules","npm","bin","npm-cli.js"),r.join(e,"node_modules","npm","bin","npm-cli.js")].find(e=>e&&t.existsSync(e))},b=s=>{let o;try{const t=v(),r=["ls","react","react-dom","--json","--all","--long"];o=e.execFileSync(t?process.execPath:"npm",t?[t,...r]:r,{cwd:s,shell:!1,encoding:"utf8",stdio:["ignore","pipe","pipe"],timeout:2e4,maxBuffer:8388608})}catch(e){const t=e;if(!t.stdout||t.signal)throw new Error("npm ls failed; install dependencies and rerun npm ls react react-dom --json.");o=String(t.stdout)}const n={react:new Set,"react-dom":new Set},i=(e,s)=>{for(const[o,a]of Object.entries(e.dependencies??{})){const e=a.path??r.join(s,"node_modules",o);"react"!==o&&"react-dom"!==o||!a.version||a.deduped||n[o].add(t.existsSync(e)?t.realpathSync(e):e),i(a,e)}};return i(JSON.parse(o),s),{react:n.react.size,"react-dom":n["react-dom"].size}},$=(e,t="")=>e.flatMap(e=>{const s=[t,String(e.index)].filter(Boolean).join("-");return[{id:e.id??s,path:e.path??null},...$(e.children,s)]}),y=(e={})=>{const v=r.resolve(e.root??process.cwd()),y=[],w={node:process.versions.node},x={versions:w,adapter:null,routes:[],checks:y,diagnosticCodes:[]},j=(e,t,s,r=!1)=>{try{y.push({name:e,status:"ok",message:s(),fix:t,...r?{info:r}:{}})}catch(s){y.push({name:e,status:"error",message:s.message,fix:t,...r?{info:r}:{}})}};let S={};j("package","Run doctor in the app directory or set --root.",()=>(S=c(r.join(v,"package.json")),"package.json is readable"));const R=s(r.join(v,"package.json")),k=[u,"react","react-dom","react-router","vite"],E=i(),O={[u]:E.engines.node},D={app:S.peerDependencies??{}};for(const e of k)j(`version:${e}`,`Install ${e} at a version satisfying the installed packages’ peer ranges.`,()=>{const t=c(R.resolve(`${e}/package.json`)),s=o.valid(t.version);if(D[e]=t.peerDependencies??(e===u?E.peerDependencies??{}:{}),w[e]=s,!s)throw new Error(`${e} has no valid installed version`);return t.engines?.node&&(O[e]=t.engines.node),`${e} ${s}`}),w[e]??=null;for(const e of y.filter(e=>e.name.startsWith("version:")&&"ok"===e.status)){const t=e.name.slice(8),s=Object.entries(D).flatMap(([e,s])=>s[t]&&!o.satisfies(w[t],s[t])?[`${e} requires ${t}: ${s[t]}`]:[]);s.length&&(e.status="error",e.message+=`; ${s.join("; ")}`)}const N=e=>Number(w.react===e.react&&w["react-dom"]===e.react)+Number(w["react-router"]===e.router)+Number(w.vite===e.vite),M=(e,t)=>{const s=o.parse(e),r=o.parse(t);return s?1e6*Math.abs(s.major-r.major)+1e3*Math.abs(s.minor-r.minor)+Math.abs(s.patch-r.patch):Number.MAX_SAFE_INTEGER},[F]=[...g].sort((e,t)=>N(t)-N(e)||M(w.react,e.react)-M(w.react,t.react)||M(w["react-dom"],e.react)-M(w["react-dom"],t.react)||M(w["react-router"],e.router)-M(w["react-router"],t.router)||M(w.vite,e.vite)-M(w.vite,t.vite)),z=`React ${w.react??"missing"}${w["react-dom"]!==w.react?` (React DOM ${w["react-dom"]??"missing"})`:""} + Router ${w["react-router"]??"missing"} + Vite ${w.vite??"missing"}`,C=3===N(F);let V;y.push({name:"compatibility",status:C?"ok":"warn",message:C?`${z} is a tested row`:`${z} is not a tested row; closest: React ${F.react} + Router ${F.router} + Vite ${F.vite}`,fix:`Use React and React DOM ${F.react}, React Router ${F.router}, and Vite ${F.vite} for a tested combination.`}),j("node","Use a Node version satisfying the package and app engines (CI uses 22.23.2).",()=>{S.engines?.node&&(O.app=S.engines.node);const e=Object.entries(O).filter(([,e])=>!o.satisfies(process.versions.node,e));if(e.length)throw new Error(`Node ${process.versions.node} does not satisfy ${e.map(([e,t])=>`${e}: ${t}`).join(", ")}`);return`Node ${process.versions.node} satisfies engines`}),j("react-copies","Run npm dedupe and align React/React DOM dependency versions.",()=>{const e=b(v);if(1!==e.react||1!==e["react-dom"])throw new Error(`React copies: ${e.react}; React DOM copies: ${e["react-dom"]}`);return"One physical copy each of React and React DOM"}),j("vite-plugin","Add SsrBoost() from @lomray/vite-ssr-boost/plugin to Vite plugins.",()=>{if(V=l(v),!V.plugin)throw new Error("Vite plugins do not contain the imported SsrBoost() plugin");return"SsrBoost() is in the Vite plugins"});const _=V?.viteRoot??(t.existsSync(r.join(v,"index.html"))?v:r.join(v,"src")),A=r.resolve(_,a(V?.option("indexFile"))??"index.html"),B=a(V?.option("clientFile"))??"client.ts",I=a(V?.option("serverFile"))??"server.ts";j("html-module",'Keep one local <script type="module" src="..."> pointing to the configured clientFile.',()=>{const e=d(A);if(1!==e.entries.length)throw new Error(`${r.relative(v,A)}: expected one module script, found ${e.entries.length}`);const t=e.attribute(e.entries[0],"src");if(!t||/^(?:\w+:|\/\/)/.test(t)||r.resolve(t.startsWith("/")?_:r.dirname(A),t.replace(/^\//,""))!==r.resolve(_,B))throw new Error(`${r.relative(v,A)}: module script does not match clientFile`);return"Module script matches the browser entry"}),j("html-outlet","Place exactly one \x3c!--ssr-outlet--\x3e inside the root element.",()=>{const e=d(A);if(1!==e.outlets)throw new Error(`${r.relative(v,A)}: expected one \x3c!--ssr-outlet--\x3e, found ${e.outlets}`);return"Exactly one SSR outlet"});const J=new h(V?.aliases);for(const[e,t,s]of[["browser",B,"browser/entry"],["server",I,"adapters/express/entry"]])j(`${e}-entry`,`Create the ${e} entry and import ${u}/${s}.`,()=>{if(!J.read(r.resolve(_,t)).ast.program.body.filter(e=>"ImportDeclaration"===e.type).some(e=>e.source.value.replace(/\.js$/,"")===`${u}/${s}`))throw new Error(`${t}: missing library ${s} import`);return"server"===e&&(x.adapter="express"),`${t} imports ${s}`});j("routes","Use statically analyzable route objects; follow the file and line in the parser error.",()=>(x.routes=$(new m(f.init({},{root:_,clientFile:B}),V?.aliases).parse(!0)),`${x.routes.length} route IDs resolved`)),j("scripts",'Set dev (or develop)="ssr-boost dev", build="ssr-boost build", start:ssr="ssr-boost start".',()=>{const e=S.scripts??{},t=[["dev",e.dev??e.develop],["build",e.build],["start",e["start:ssr"]??e.start]].filter(([e,t])=>!new RegExp(`(?:^|\\s)ssr-boost\\s+${e}(?:\\s|$)`).test(t??""));if(t.length)throw new Error(`Scripts missing ssr-boost commands: ${t.map(([e])=>e).join(", ")}`);return"Development, build, and SSR start scripts use ssr-boost"}),j("robots","Review public/robots.txt for your deployment; use build --unlock-robots only when intended.",()=>{const e=a(V?p(V.node,"publicDir"):void 0)??"public",s=r.resolve(_,e,"robots.txt");return t.existsSync(s)?/^Disallow:\s*\/\s*$/im.test(t.readFileSync(s,"utf8"))?"robots.txt blocks crawling at / (report only)":"robots.txt contains a custom/allow policy (report only)":"No robots.txt policy (report only)"},!0),j("size-budget","Add a size:check or test:size script with an application bundle budget.",()=>Object.keys(S.scripts??{}).some(e=>/(?:^|:)size(?::|$)/.test(e))?"Size budget script present":"No size budget script (informational)",!0);const P=V?p(V.node,"build"):void 0,U="ObjectExpression"===P?.type?a(p(P,"outDir")):void 0,W=r.resolve(_,U??"dist","ssr-boost-diagnostics.json");if(t.existsSync(W))try{const e=JSON.parse(t.readFileSync(W,"utf8")),s=e&&"object"==typeof e?Reflect.get(e,"codes"):void 0;x.diagnosticCodes=Array.isArray(s)?n.filter(e=>s.includes(e)):[]}catch{}return x},w=e=>({schemaVersion:1,versions:e.versions,adapter:e.adapter,routes:e.routes,checks:e.checks.map(({name:e,status:t,fix:s,info:r})=>({name:e,status:t,fix:s,...r?{info:r}:{}})),diagnosticCodes:e.diagnosticCodes}),x=(e={})=>{const s=y(e);if(e.bundle)try{t.writeFileSync(r.resolve(e.root??process.cwd(),e.bundle),`${JSON.stringify(w(s),null,2)}\n`)}catch{s.checks.push({name:"bundle",status:"error",message:"Cannot write the support bundle.",fix:"Choose a writable file in an existing directory for --bundle."})}e.json?console.info(JSON.stringify(s,null,2)):console.table(s.checks.map(({status:e,name:t,message:s,fix:r})=>({status:e,check:t,message:s,fix:r}))),process.exitCode=s.checks.some(e=>"error"===e.status)?1:0};export{g as TESTED_MATRIX,x as default,y as inspectProject,b as reactCopies,v as resolveNpmCli,w as supportBundle};
|
|
2
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sources":["../../src/cli/doctor.ts"],"sourcesContent":[null],"names":["TESTED_MATRIX","react","router","vite","resolveNpmCli","directory","path","dirname","process","execPath","env","npm_execpath","join","find","candidate","fs","existsSync","reactCopies","root","output","npmCli","args","childProcess","execFileSync","cwd","shell","encoding","stdio","timeout","maxBuffer","error","failed","stdout","signal","Error","String","copies","Set","visit","node","name","dependency","Object","entries","dependencies","location","version","deduped","add","realpathSync","JSON","parse","size","routeDetails","routes","parent","flatMap","route","position","index","filter","Boolean","id","children","inspectProject","options","resolve","checks","versions","report","adapter","diagnosticCodes","check","fix","inspect","info","push","status","message","pkg","readPackage","require","createRequire","packages","PLUGIN_NAME","ownPackage","libraryPackage","engines","peers","app","peerDependencies","metadata","semver","valid","item","row","startsWith","slice","failures","dependant","ranges","satisfies","length","matches","Number","distance","installed","tested","target","Math","abs","major","minor","patch","MAX_SAFE_INTEGER","closest","sort","left","right","trio","isTested","config","range","map","readConfig","plugin","viteRoot","indexFile","stringValue","option","clientFile","serverFile","html","readHtml","relative","src","attribute","test","replace","outlets","sources","SourceFiles","aliases","kind","file","expected","read","ast","program","body","type","some","source","value","ParseRoutes","ServerConfig","init","scripts","missing","dev","develop","build","start","command","RegExp","publicDir","objectProperty","undefined","readFileSync","keys","outDir","diagnosticsFile","recorded","codes","Reflect","get","Array","isArray","DIAGNOSTIC_CODES","code","includes","supportBundle","schemaVersion","runDoctor","bundle","writeFileSync","stringify","json","console","table","exitCode"],"mappings":"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"}
|
package/cli/init.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface IInitOptions {
|
|
2
|
+
root?: string;
|
|
3
|
+
entry?: string;
|
|
4
|
+
routes?: string;
|
|
5
|
+
dryRun?: boolean;
|
|
6
|
+
apply?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface IFileChange {
|
|
9
|
+
file: string;
|
|
10
|
+
before: string;
|
|
11
|
+
after: string;
|
|
12
|
+
}
|
|
13
|
+
/** Build all edits first. A failed analysis leaves even --apply completely untouched. */
|
|
14
|
+
export declare const planInit: (options?: IInitOptions) => IFileChange[];
|
|
15
|
+
/** CLI default is a complete unified diff, with no temporary files or installs. */
|
|
16
|
+
declare const runInit: (options?: IInitOptions) => void;
|
|
17
|
+
export default runInit;
|
package/cli/init.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import e from"node:fs";import t from"node:path";import{createTwoFilesPatch as r}from"diff";import{MANUAL_GUIDE as o,readConfig as n,format as i,objectProperty as s,stringValue as a,readHtml as l,editText as p,readPackage as c,libraryPackage as d}from"./project.js";import m from"../constants/plugin-name.js";import f from"../services/parse-routes.js";import u,{sourceError as y,walk as h,unwrap as $}from"../services/source-files.js";const g=(e,r)=>{const o=t.relative(t.dirname(e),r).split(t.sep).join("/");return o.startsWith(".")?o:`./${o}`},v=e=>{const t=new Set;return h(e,e=>{"Identifier"!==e.type&&"JSXIdentifier"!==e.type||t.add(e.name)}),t},w=(e,t,r,o,n)=>{const i=e.specifiers.filter(e=>t.has(e.local.name)),s=i.filter(e=>"ImportDefaultSpecifier"===e.type).map(e=>e.local.name),a=i.filter(e=>"ImportNamespaceSpecifier"===e.type).map(e=>`* as ${e.local.name}`),l=i.flatMap(e=>{if("ImportSpecifier"!==e.type)return[];const t="Identifier"===e.imported.type?e.imported.name:`${o}${e.imported.value}${o}`;return[`${"type"===e.importKind?"type ":""}${t}${t===e.local.name?"":` as ${e.local.name}`}`]}),p=[...s,...a,...l.length?[`{ ${l.join(", ")} }`]:[]];return p.length?`import ${"type"===e.importKind?"type ":""}${p.join(", ")} from ${o}${r}${o}${n}`:""},x=(e,t)=>{const r=[];for(const o of e.read(t).ast.program.body)"ExportDefaultDeclaration"===o.type&&r.push("default"),"ExportNamedDeclaration"===o.type&&("VariableDeclaration"===o.declaration?.type&&r.push(...o.declaration.declarations.flatMap(e=>"Identifier"===e.id.type?[e.id.name]:[])),r.push(...o.specifiers.map(e=>"Identifier"===e.exported.type?e.exported.name:e.exported.value)));return r.flatMap(r=>{const o=e.exported(t,r);return"ArrayExpression"===o.node.type?[{name:r,value:o}]:[]})},b=(r={})=>{const o=t.resolve(r.root??process.cwd()),b=n(o),{newline:S,quote:j,semicolon:E}=i(b.code),R=[],I=(r,n)=>{const i=e.existsSync(r)?e.readFileSync(r,"utf8"):"";i!==n&&R.push({file:t.relative(o,r).split(t.sep).join("/"),before:i,after:n})},C=s(b.node,"base");if(C&&"/"!==a(C))throw y(b.file,C,"Vite base; automatic migration currently maps only /");if(b.node.properties.some(e=>"SpreadElement"===e.type))throw y(b.file,b.node,"spread Vite configuration");const D=s(b.node,"build"),F="ObjectExpression"===D?.type?s(D,"rollupOptions"):void 0;if(b.option("entrypoint")||"ObjectExpression"===F?.type&&s(F,"input"))throw y(b.file,F,"multiple or custom build entries");const J=t.resolve(b.viteRoot,a(b.option("indexFile"))??"index.html"),X=l(J);if(1!==X.entries.length||!X.attribute(X.entries[0],"src"))throw y(J,void 0,`module entries (${X.entries.length}); expected one external module script`);const M=X.attribute(X.entries[0],"src");if(/(?:^(?:\w+:|\/\/))|[?#]/.test(M))throw y(J,void 0,"non-local browser entry URL");const A=t.resolve(M.startsWith("/")?b.viteRoot:t.dirname(J),M.replace(/^\//,"")),O=r.entry?t.resolve(o,r.entry):A;if(O!==A)throw y(J,void 0,"--entry does not match the module script");const B=new u(b.aliases),{code:P,ast:N}=B.read(O),V=i(P),T=V.quote,W=V.semicolon,z=V.newline,L=/\.[cm]?tsx?$/.test(O),k=t.resolve(t.dirname(O),"server."+(L?"ts":"js"));if(N.program.body.some(e=>"ImportDeclaration"===e.type&&e.source.value.replace(/\.js$/,"")===`${m}/browser/entry`)){if(!b.plugin||1!==X.outlets||!e.existsSync(k))throw y(O,void 0,"partially configured SSR app; finish the migration using doctor");return[]}if(e.existsSync(k))throw y(k,void 0,"existing server entry; refusing to overwrite");if(1!==X.roots.length||!X.roots[0].sourceCodeLocation?.endTag||X.outlets>1)throw y(J,void 0,'root element; expected exactly one empty element with id="root"');const q=X.roots[0].sourceCodeLocation;if(X.code.slice(q.startTag.endOffset,q.endTag.startOffset).replace("\x3c!--ssr-outlet--\x3e","").trim())throw y(J,void 0,"non-empty root element");const K=[],U=[];if(h(N,e=>{if("CallExpression"===e.type){if("Identifier"===e.callee.type){const t=B.import(O,e.callee.name);"createBrowserRouter"===t?.exported&&["react-router","react-router-dom"].includes(t.source)&&K.push(e)}"MemberExpression"===e.callee.type&&"Identifier"===e.callee.property.type&&"render"===e.callee.property.name&&U.push(e)}}),1!==K.length)throw y(O,K[1],`createBrowserRouter calls (${K.length}); JSX BrowserRouter/Routes and router factories need manual migration`);const[_]=K;if(1!==_.arguments.length||1!==U.length)throw y(O,_,"router options or multiple React roots; migrate their settings manually");const[G]=U,H="MemberExpression"===G.callee.type?B.resolve({node:G.callee.object,file:O}).node:void 0;if("CallExpression"!==H?.type||"Identifier"!==H.callee.type||"react-dom/client"!==B.import(O,H.callee.name)?.source||"createRoot"!==B.import(O,H.callee.name)?.exported||1!==H.arguments.length||1!==G.arguments.length)throw y(O,H,"React mount; use createRoot(element).render(...) without custom options");const Q=$(G.arguments[0]);let Y=Q;const Z=[],ee=new Map;for(;"JSXElement"===Y?.type||"JSXFragment"===Y?.type;){if("JSXElement"===Y.type){const{name:e}=Y.openingElement,t="JSXMemberExpression"===e.type&&"JSXIdentifier"===e.object.type?e:void 0,r="JSXIdentifier"===e.type?e.name:"JSXIdentifier"===t?.object.type?t.object.name:void 0,o=N.program.body.find(e=>"ImportDeclaration"===e.type&&e.specifiers.some(e=>"ImportNamespaceSpecifier"===e.type&&e.local.name===r)),n=r?B.import(O,r)??(o?{declaration:o,source:o.source.value,exported:"*"}:void 0):void 0,i="react"===n?.source&&["StrictMode","Fragment"].includes(t?.property.name??n.exported);if(!t&&"RouterProvider"===n?.exported&&["react-router","react-router-dom"].includes(n.source))break;if(!r||!n||t&&!i||Y.openingElement.attributes.length)throw y(O,Y,"App wrapper; use an imported component without additional props");const s=ee.get(n.declaration)??new Set;s.add(r),ee.set(n.declaration,s),Z.push({tag:t?`${r}.${t.property.name}`:r,builtin:i})}else Z.push({tag:"",builtin:!0});const e=Y.children.filter(e=>"JSXText"!==e.type||e.value.trim());if(1!==e.length)throw y(O,Y,"App wrapper; expected exactly one RouterProvider child");[Y]=e}if("JSXElement"!==Y?.type)throw y(O,Q,"React root; expected an imported RouterProvider with optional App, StrictMode or Fragment wrappers");const[te]=Y.openingElement.attributes;if(1!==Y.openingElement.attributes.length||"JSXAttribute"!==te?.type||"router"!==te.name.name||"JSXExpressionContainer"!==te.value?.type||B.resolve({node:te.value.expression,file:O}).node!==_)throw y(O,Y,"RouterProvider props; use the detected router without additional props");let re=[...ee].map(([e,t])=>w(e,t,e.source.value,T,W)).join(z),oe=re,ne="",ie="",se=Z[0]?.tag??"App";if(1!==Z.length||Z[0].builtin){const e=new Set([...ee.values()].flatMap(e=>[...e])),t=$(_.arguments[0]);"Identifier"===t?.type&&e.add(t.name);const r=t=>{let r=t;for(;e.has(r);)r+="_";return e.add(r),r};se=r("App");const o=r("FC"),n=r("PropsWithChildren"),i=r("ssrCreateElement"),s=r("ssrFragment"),a=L?`import type { ${"FC"===o?o:`FC as ${o}`}, ${"PropsWithChildren"===n?n:`PropsWithChildren as ${n}`} } from ${T}react${T}${W}`:"",l=Z.length?Z:[{tag:"",builtin:!0}],p=l.reduceRight((e,{tag:t})=>`<${t}>${e}</${t}>`,"{children}"),c=l.reduceRight((e,{tag:t})=>`${i}(${t||s}, null, ${e})`,"children"),d=`const ${se}${L?`: ${o}<${n}>`:""} = ({ children }) => `;re=[re,a].filter(Boolean).join(z),oe=[re,`import { createElement as ${i}${l.some(({tag:e})=>!e)?`, Fragment as ${s}`:""} } from ${T}react${T}${W}`].filter(Boolean).join(z),ie=`${d}${c}${W}${z}`,ne=/\.[jt]sx$/.test(O)?`${d}${p}${W}${z}`:ie,/\.[jt]sx$/.test(O)||(re=oe)}const ae=B.resolve({node:_.arguments[0],file:O});let le=ae,pe=le.file,ce=pe!==O?x(B,pe).find(e=>e.value.node===le.node)?.name:void 0;if(r.routes){pe=B.filename(g(O,t.resolve(o,r.routes)),O);const e=x(B,pe);if(1!==e.length)throw y(pe,void 0,`exported route arrays (${e.length}); --routes needs one exported array`);le=e[0].value,ce=e[0].name}new f({}).parseValue(B,le,!0);const de=new Set;if(!ce){const r=B.read(le.file),o=v(le.node);let n=-1;for(;n!==o.size;){n=o.size;for(const e of r.ast.program.body){const t="ExportNamedDeclaration"===e.type?e.declaration:e,r="VariableDeclaration"===t?.type?t.declarations.flatMap(e=>"Identifier"===e.id.type?[e.id.name]:[]):"FunctionDeclaration"===t?.type&&t.id?[t.id.name]:[];if(t&&r.some(e=>o.has(e))){if(t.start<=le.node.start&&t.end>=le.node.end)continue;de.add(e),v(t).forEach(e=>o.add(e))}}}const i=[];for(const e of r.ast.program.body)if("ImportDeclaration"===e.type){const t=w(e,o,e.source.value,T,W);t&&i.push(t)}else de.has(e)&&i.push(r.code.slice(e.start,e.end));const s=t.extname(le.file);if(pe=t.resolve(t.dirname(le.file),`routes.ssr${s}`),e.existsSync(pe))throw y(pe,void 0,"existing extracted routes file");i.push(`export default ${r.code.slice(le.node.start,le.node.end)}${L?" satisfies import('react-router').RouteObject[]":""}${W}`),I(pe,`${i.join(z+z)}${z}`),ce="default"}for(const e of N.program.body){if("VariableDeclaration"===e.type&&1!==e.declarations.length)throw y(O,e,"multiple bootstrap declarators; put each declaration on its own statement");if("ImportDeclaration"!==e.type&&!de.has(e)&&![_,H,G,...ae.file===O?[ae.node]:[]].some(t=>t.start>=e.start&&t.end<=e.end))throw y(O,e,"additional browser startup statement; move it to a shared wrapper or migrate manually")}const me=$(_.arguments[0]),fe="Identifier"===me?.type?B.import(O,me.name):void 0,ue=fe&&le.node===ae.node,ye=ue&&"Identifier"===me?.type?me.name:"default"===ce?"routes":ce,he=ue?w(fe.declaration,new Set([ye]),fe.source,T,W):`import ${"default"===ce?ye:`{ ${ce} }`} from ${T}${g(O,pe).replace(/\.[cm]?[jt]sx?$/,"")}${T}${W}`,$e=N.program.body.filter(e=>"ImportDeclaration"===e.type&&!e.specifiers.length).map(e=>P.slice(e.start,e.end));I(O,[`import entryClient from ${T}${m}/browser/entry${T}${W}`,re,he,...$e,"",...ne?[ne]:[],`void entryClient(${se}, ${ye})${W}`,""].join(z)),I(k,[`import entryServer from ${T}${m}/adapters/express/entry${T}${W}`,oe,he,"",...ie?[ie]:[],`export default entryServer(${se}, ${ye})${W}`,""].join(z));const ge=[],ve=[`clientFile: ${j}${t.relative(b.viteRoot,O).split(t.sep).join("/")}${j}`,`serverFile: ${j}${t.relative(b.viteRoot,k).split(t.sep).join("/")}${j}`];e.existsSync(t.join(o,"tsconfig.json"))||ve.push("tsconfigAliases: false");const we=`SsrBoost({ ${ve.join(", ")} })`;if(b.plugin)throw y(b.file,b.plugin,"existing SsrBoost plugin with a SPA browser entry; finish configuration manually");if("ArrayExpression"===b.plugins?.type)ge.push({start:b.plugins.start+1,end:b.plugins.start+1,text:`${we}${b.plugins.elements.length?", ":""}`});else{if(b.plugins)throw y(b.file,b.plugins,"Vite plugins; use an array literal");ge.push({start:b.node.start+1,end:b.node.start+1,text:`${S} plugins: [${we}],`})}if(v(b.ast).has("SsrBoost"))throw y(b.file,void 0,"existing SsrBoost binding; rename it before automatic migration");I(b.file,`import SsrBoost from ${j}${m}/plugin${j}${E}${S}${p(b.code,ge)}`),X.outlets||I(J,p(X.code,[{start:q.startTag.endOffset,end:q.startTag.endOffset,text:"\x3c!--ssr-outlet--\x3e"}]));const xe=t.join(o,"package.json"),be=e.readFileSync(xe,"utf8"),Se=c(xe),je={...Se.scripts,[Se.scripts&&Object.hasOwn(Se.scripts,"dev")?"dev":"develop"]:"ssr-boost dev",build:"ssr-boost build","start:ssr":"ssr-boost start"};"vite preview"===Se.scripts?.preview&&(je.preview="ssr-boost preview");const Ee=i(be),Re=d().version,Ie={...Se.dependencies,[m]:Se.dependencies?.[m]??Se.devDependencies?.[m]??`^${Re}`};return I(xe,`${JSON.stringify({...Se,scripts:je,dependencies:Ie},null,Ee.indent).replace(/\n/g,Ee.newline)}${be.endsWith("\n")?Ee.newline:""}`),R.sort((e,t)=>e.file.localeCompare(t.file))},S=(n={})=>{try{if(n.apply&&n.dryRun)throw new Error("Choose either --dry-run or --apply.");const o=b(n);if(!o.length)return void console.info("No changes: SSR is already initialized. Run ssr-boost doctor.");for(const e of o)console.info(r(e.before?`a/${e.file}`:"/dev/null",`b/${e.file}`,e.before,e.after));if(n.apply)for(const r of o)e.writeFileSync(t.resolve(n.root??process.cwd(),r.file),r.after);console.info(n.apply?`Applied ${o.length} file changes.`:"Dry run: no files written. Use --apply to write these changes."),console.info("Next: npm install; then npx ssr-boost doctor.")}catch(e){console.error(`${e.message}\nManual migration: ${o}`),process.exitCode=1}};export{S as default,b as planInit};
|
|
2
|
+
//# sourceMappingURL=init.js.map
|
package/cli/init.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sources":["../../src/cli/init.ts"],"sourcesContent":[null],"names":["relativeImport","from","to","relative","path","dirname","split","sep","join","startsWith","namesIn","node","names","Set","walk","child","type","add","name","importText","source","quote","semicolon","specifiers","filter","specifier","has","local","defaults","map","namespaces","named","flatMap","imported","value","importKind","bindings","length","arrayExports","sources","file","read","ast","program","body","push","declaration","declarations","id","exported","planInit","options","root","resolve","process","cwd","config","readConfig","newline","format","code","changes","after","before","fs","existsSync","readFileSync","base","objectProperty","stringValue","sourceError","properties","some","property","build","rollup","undefined","option","indexFile","viteRoot","html","readHtml","entries","attribute","src","test","detectedEntry","replace","entry","SourceFiles","aliases","entryFormat","q","end","nl","isTS","server","PLUGIN_NAME","plugin","outlets","roots","sourceCodeLocation","endTag","rootLocation","slice","startTag","endOffset","startOffset","trim","calls","renders","callee","import","includes","call","arguments","render","rootCall","object","rendered","unwrap","provider","wrappers","wrapperImports","Map","openingElement","member","namespace","find","binding","isBuiltin","attributes","get","set","tag","builtin","children","routerAttribute","expression","appImport","serverAppImport","appDeclaration","serverAppDeclaration","appName","reserved","values","argument","unique","result","fc","props","createElement","fragment","typeImport","tree","jsx","reduceRight","definition","Boolean","originalRoutes","routeValue","routeModule","routeExport","item","routes","filename","exports","ParseRoutes","parseValue","moved","previousSize","size","statement","declared","start","forEach","pieces","text","extension","extname","routeArgument","routeBinding","shouldKeepRouteImport","routeName","routeImport","sideEffects","edits","pluginOptions","pluginCall","plugins","elements","editText","packageFile","packageCode","pkg","readPackage","scripts","Object","hasOwn","preview","packageFormat","version","libraryPackage","dependencies","devDependencies","JSON","stringify","indent","endsWith","sort","left","right","localeCompare","runInit","apply","dryRun","Error","console","info","change","createTwoFilesPatch","writeFileSync","error","message","MANUAL_GUIDE","exitCode"],"mappings":"kbAoCA,MAAMA,EAAiB,CAACC,EAAcC,KACpC,MAAMC,EAAWC,EAAKD,SAASC,EAAKC,QAAQJ,GAAOC,GAAII,MAAMF,EAAKG,KAAKC,KAAK,KAE5E,OAAOL,EAASM,WAAW,KAAON,EAAW,KAAKA,KAI9CO,EAAWC,IACf,MAAMC,EAAQ,IAAIC,IAQlB,OANAC,EAAKH,EAAOI,IACS,eAAfA,EAAMC,MAAwC,kBAAfD,EAAMC,MACvCJ,EAAMK,IAAIF,EAAMG,QAIbN,GAIHO,EAAa,CACjBR,EACAC,EACAQ,EACAC,EACAC,KAEA,MAAMC,EAAaZ,EAAKY,WAAWC,OAAQC,GAAcb,EAAMc,IAAID,EAAUE,MAAMT,OAC7EU,EAAWL,EACdC,OAAQC,GAAiC,2BAAnBA,EAAUT,MAChCa,IAAKJ,GAAcA,EAAUE,MAAMT,MAChCY,EAAaP,EAChBC,OAAQC,GAAiC,6BAAnBA,EAAUT,MAChCa,IAAKJ,GAAc,QAAQA,EAAUE,MAAMT,QACxCa,EAAQR,EAAWS,QAASP,IAChC,GAAuB,oBAAnBA,EAAUT,KACZ,MAAO,GAGT,MAAMiB,EACwB,eAA5BR,EAAUQ,SAASjB,KACfS,EAAUQ,SAASf,KACnB,GAAGG,IAAQI,EAAUQ,SAASC,QAAQb,IAE5C,MAAO,CACL,GAA4B,SAAzBI,EAAUU,WAAwB,QAAU,KAAKF,IAAWA,IAAaR,EAAUE,MAAMT,KAAO,GAAK,OAAOO,EAAUE,MAAMT,YAG7HkB,EAAW,IACZR,KACAE,KACCC,EAAMM,OAAS,CAAC,KAAKN,EAAMvB,KAAK,WAAa,IAGnD,OAAO4B,EAASC,OACZ,UAA8B,SAApB1B,EAAKwB,WAAwB,QAAU,KAAKC,EAAS5B,KAAK,cAAca,IAAQD,IAASC,IAAQC,IAC3G,IAIAgB,EAAe,CACnBC,EACAC,KAEA,MAAM5B,EAAkB,GAExB,IAAK,MAAMD,KAAQ4B,EAAQE,KAAKD,GAAME,IAAIC,QAAQC,KAC9B,6BAAdjC,EAAKK,MACPJ,EAAMiC,KAAK,WAGK,2BAAdlC,EAAKK,OACwB,wBAA3BL,EAAKmC,aAAa9B,MACpBJ,EAAMiC,QACDlC,EAAKmC,YAAYC,aAAaf,QAASc,GAChB,eAAxBA,EAAYE,GAAGhC,KAAwB,CAAC8B,EAAYE,GAAG9B,MAAQ,KAKrEN,EAAMiC,QACDlC,EAAKY,WAAWM,IAAKJ,GACM,eAA5BA,EAAUwB,SAASjC,KACfS,EAAUwB,SAAS/B,KACnBO,EAAUwB,SAASf,SAM/B,OAAOtB,EAAMoB,QAASd,IACpB,MAAMgB,EAAQK,EAAQU,SAAST,EAAMtB,GAErC,MAA2B,oBAApBgB,EAAMvB,KAAKK,KAA6B,CAAC,CAAEE,OAAMgB,UAAW,MAK1DgB,EAAW,CAACC,EAAwB,MAC/C,MAAMC,EAAOhD,EAAKiD,QAAQF,EAAQC,MAAQE,QAAQC,OAC5CC,EAASC,EAAWL,IACpBM,QAAEA,EAAOrC,MAAEA,EAAKC,UAAEA,GAAcqC,EAAOH,EAAOI,MAC9CC,EAAyB,GACzB5C,EAAM,CAACuB,EAAcsB,KACzB,MAAMC,EAASC,EAAGC,WAAWzB,GAAQwB,EAAGE,aAAa1B,EAAM,QAAU,GAEjEuB,IAAWD,GACbD,EAAQhB,KAAK,CAAEL,KAAMpC,EAAKD,SAASiD,EAAMZ,GAAMlC,MAAMF,EAAKG,KAAKC,KAAK,KAAMuD,SAAQD,WAGhFK,EAAOC,EAAeZ,EAAO7C,KAAM,QAEzC,GAAIwD,GAA8B,MAAtBE,EAAYF,GACtB,MAAMG,EAAYd,EAAOhB,KAAM2B,EAAM,wDAGvC,GAAIX,EAAO7C,KAAK4D,WAAWC,KAAMC,GAA+B,kBAAlBA,EAASzD,MACrD,MAAMsD,EAAYd,EAAOhB,KAAMgB,EAAO7C,KAAM,6BAG9C,MAAM+D,EAAQN,EAAeZ,EAAO7C,KAAM,SACpCgE,EACY,qBAAhBD,GAAO1D,KAA8BoD,EAAeM,EAAO,sBAAmBE,EAEhF,GACEpB,EAAOqB,OAAO,eACI,qBAAjBF,GAAQ3D,MAA+BoD,EAAeO,EAAQ,SAE/D,MAAML,EAAYd,EAAOhB,KAAMmC,EAAQ,oCAGzC,MAAMG,EAAY1E,EAAKiD,QACrBG,EAAOuB,SACPV,EAAYb,EAAOqB,OAAO,eAAiB,cAEvCG,EAAOC,EAASH,GAEtB,GAA4B,IAAxBE,EAAKE,QAAQ7C,SAAiB2C,EAAKG,UAAUH,EAAKE,QAAQ,GAAI,OAChE,MAAMZ,EACJQ,OACAF,EACA,mBAAmBI,EAAKE,QAAQ7C,gDAIpC,MAAM+C,EAAMJ,EAAKG,UAAUH,EAAKE,QAAQ,GAAI,OAE5C,GAAI,0BAA0BG,KAAKD,GACjC,MAAMd,EAAYQ,OAAWF,EAAW,+BAG1C,MAAMU,EAAgBlF,EAAKiD,QACzB+B,EAAI3E,WAAW,KAAO+C,EAAOuB,SAAW3E,EAAKC,QAAQyE,GACrDM,EAAIG,QAAQ,MAAO,KAEfC,EAAQrC,EAAQqC,MAAQpF,EAAKiD,QAAQD,EAAMD,EAAQqC,OAASF,EAElE,GAAIE,IAAUF,EACZ,MAAMhB,EAAYQ,OAAWF,EAAW,4CAG1C,MAAMrC,EAAU,IAAIkD,EAAYjC,EAAOkC,UACjC9B,KAAEA,EAAIlB,IAAEA,GAAQH,EAAQE,KAAK+C,GAC7BG,EAAchC,EAAOC,GACrBgC,EAAID,EAAYtE,MAChBwE,EAAMF,EAAYrE,UAClBwE,EAAKH,EAAYjC,QACjBqC,EAAO,eAAeV,KAAKG,GAC3BQ,EAAS5F,EAAKiD,QAAQjD,EAAKC,QAAQmF,GAAQ,WAAUO,EAAO,KAAO,OAOzE,GANkBrD,EAAIC,QAAQC,KAAK4B,KAChC7D,GACe,sBAAdA,EAAKK,MACLL,EAAKS,OAAOc,MAAMqD,QAAQ,QAAS,MAAQ,GAAGU,mBAGnC,CACb,IAAKzC,EAAO0C,QAA2B,IAAjBlB,EAAKmB,UAAkBnC,EAAGC,WAAW+B,GACzD,MAAM1B,EACJkB,OACAZ,EACA,mEAIJ,MAAO,EACT,CAEA,GAAIZ,EAAGC,WAAW+B,GAChB,MAAM1B,EAAY0B,OAAQpB,EAAW,gDAGvC,GAA0B,IAAtBI,EAAKoB,MAAM/D,SAAiB2C,EAAKoB,MAAM,GAAGC,oBAAoBC,QAAUtB,EAAKmB,QAAU,EACzF,MAAM7B,EACJQ,OACAF,EACA,mEAIJ,MAAM2B,EAAevB,EAAKoB,MAAM,GAAGC,mBAMnC,GALqBrB,EAAKpB,KAAK4C,MAC7BD,EAAaE,SAAUC,UACvBH,EAAaD,OAAQK,aAGNpB,QAAQ,0BAAqB,IAAIqB,OAChD,MAAMtC,EAAYQ,OAAWF,EAAW,0BAG1C,MAAMiC,EAA0B,GAC1BC,EAA4B,GA2BlC,GAzBAhG,EAAK4B,EAAM/B,IACT,GAAkB,mBAAdA,EAAKK,KAAT,CAIA,GAAyB,eAArBL,EAAKoG,OAAO/F,KAAuB,CACrC,MAAMiB,EAAWM,EAAQyE,OAAOxB,EAAO7E,EAAKoG,OAAO7F,MAG1B,wBAAvBe,GAAUgB,UACV,CAAC,eAAgB,oBAAoBgE,SAAShF,EAASb,SAEvDyF,EAAMhE,KAAKlC,EAEf,CAGuB,qBAArBA,EAAKoG,OAAO/F,MACkB,eAA9BL,EAAKoG,OAAOtC,SAASzD,MACS,WAA9BL,EAAKoG,OAAOtC,SAASvD,MAErB4F,EAAQjE,KAAKlC,EAlBf,IAsBmB,IAAjBkG,EAAMxE,OACR,MAAMiC,EACJkB,EACAqB,EAAM,GACN,8BAA8BA,EAAMxE,gFAIxC,MAAO6E,GAAQL,EAEf,GAA8B,IAA1BK,EAAKC,UAAU9E,QAAmC,IAAnByE,EAAQzE,OACzC,MAAMiC,EACJkB,EACA0B,EACA,2EAIJ,MAAOE,GAAUN,EACXO,EACmB,qBAAvBD,EAAOL,OAAO/F,KACVuB,EAAQc,QAAQ,CAAE1C,KAAMyG,EAAOL,OAAOO,OAAQ9E,KAAMgD,IAAS7E,UAC7DiE,EAEN,GACqB,mBAAnByC,GAAUrG,MACe,eAAzBqG,EAASN,OAAO/F,MACwC,qBAAxDuB,EAAQyE,OAAOxB,EAAO6B,EAASN,OAAO7F,OAAOE,QACa,eAA1DmB,EAAQyE,OAAOxB,EAAO6B,EAASN,OAAO7F,OAAO+B,UACf,IAA9BoE,EAASF,UAAU9E,QACS,IAA5B+E,EAAOD,UAAU9E,OAEjB,MAAMiC,EACJkB,EACA6B,EACA,2EAKJ,MAAME,EAAWC,EAAOJ,EAAOD,UAAU,IACzC,IAAIM,EAAWF,EACf,MAAMG,EAAgD,GAChDC,GAAiB,IAAIC,IAE3B,KAA0B,eAAnBH,GAAUzG,MAA4C,gBAAnByG,GAAUzG,MAAwB,CAC1E,GAAsB,eAAlByG,EAASzG,KAAuB,CAClC,MAAME,KAAEA,GAASuG,EAASI,eACpBC,EACU,wBAAd5G,EAAKF,MAAuD,kBAArBE,EAAKoG,OAAOtG,KAC/CE,OACA0D,EACAjD,EACU,kBAAdT,EAAKF,KACDE,EAAKA,KACmB,kBAAxB4G,GAAQR,OAAOtG,KACb8G,EAAOR,OAAOpG,UACd0D,EACFmD,EAAYrF,EAAIC,QAAQC,KAAKoF,KAChCrH,GACe,sBAAdA,EAAKK,MACLL,EAAKY,WAAWiD,KACb/C,GACoB,6BAAnBA,EAAUT,MAAuCS,EAAUE,MAAMT,OAASS,IAG5EsG,EAAUtG,EACXY,EAAQyE,OAAOxB,EAAO7D,KACtBoG,EACG,CACEjF,YAAaiF,EACb3G,OAAQ2G,EAAU3G,OAAOc,MACzBe,SAAU,UAEZ2B,QACJA,EACEsD,EACgB,UAApBD,GAAS7G,QACT,CAAC,aAAc,YAAY6F,SAASa,GAAQrD,SAASvD,MAAQ+G,EAAQhF,UAEvE,IACG6E,GACqB,mBAAtBG,GAAShF,UACT,CAAC,eAAgB,oBAAoBgE,SAASgB,EAAQ7G,QAEtD,MAGF,IACGO,IACAsG,GACAH,IAAWI,GACZT,EAASI,eAAeM,WAAW9F,OAEnC,MAAMiC,EACJkB,EACAiC,EACA,mEAIJ,MAAM7G,EAAQ+G,GAAeS,IAAIH,EAAQnF,cAAgB,IAAIjC,IAE7DD,EAAMK,IAAIU,GACVgG,GAAeU,IAAIJ,EAAQnF,YAAalC,GACxC8G,EAAS7E,KAAK,CACZyF,IAAKR,EAAS,GAAGnG,KAASmG,EAAOrD,SAASvD,OAASS,EACnD4G,QAASL,GAEb,MACER,EAAS7E,KAAK,CAAEyF,IAAK,GAAIC,SAAS,IAGpC,MAAMC,EAAWf,EAASe,SAAShH,OAChCT,GAAyB,YAAfA,EAAMC,MAAsBD,EAAMmB,MAAM0E,QAGrD,GAAwB,IAApB4B,EAASnG,OACX,MAAMiC,EAAYkB,EAAOiC,EAAU,2DAGpCA,GAAYe,CACf,CAEA,GAAuB,eAAnBf,GAAUzG,KACZ,MAAMsD,EACJkB,EACA+B,EACA,sGAIJ,MAAOkB,IAAmBhB,EAASI,eAAeM,WAElD,GACgD,IAA9CV,EAASI,eAAeM,WAAW9F,QACT,iBAA1BoG,IAAiBzH,MACa,WAA9ByH,GAAgBvH,KAAKA,MACW,2BAAhCuH,GAAgBvG,OAAOlB,MACvBuB,EAAQc,QAAQ,CAAE1C,KAAM8H,GAAgBvG,MAAMwG,WAAYlG,KAAMgD,IAAS7E,OAASuG,EAElF,MAAM5C,EACJkB,EACAiC,EACA,0EAIJ,IAAIkB,GAAY,IAAIhB,IACjB9F,IAAI,EAAEiB,EAAalC,KAAWO,EAAW2B,EAAalC,EAAOkC,EAAY1B,OAAOc,MAAO0D,EAAGC,IAC1FrF,KAAKsF,GACJ8C,GAAkBD,GAClBE,GAAiB,GACjBC,GAAuB,GACvBC,GAAUrB,EAAS,IAAIY,KAAO,MAElC,GAAwB,IAApBZ,EAASrF,QAAgBqF,EAAS,GAAGa,QAAS,CAChD,MAAMS,EAAW,IAAInI,IAAI,IAAI8G,GAAesB,UAAUjH,QAASpB,GAAU,IAAIA,KACvEsI,EAAW1B,EAAON,EAAKC,UAAU,IAEhB,eAAnB+B,GAAUlI,MACZgI,EAAS/H,IAAIiI,EAAShI,MAGxB,MAAMiI,EAAUjI,IACd,IAAIkI,EAASlI,EAEb,KAAO8H,EAAStH,IAAI0H,IAClBA,GAAU,IAKZ,OAFAJ,EAAS/H,IAAImI,GAENA,GAGTL,GAAUI,EAAO,OACjB,MAAME,EAAKF,EAAO,MACZG,EAAQH,EAAO,qBACfI,EAAgBJ,EAAO,oBACvBK,EAAWL,EAAO,eAClBM,EAAa1D,EACf,iBAAwB,OAAPsD,EAAcA,EAAK,SAASA,QAAmB,sBAAVC,EAAgCA,EAAQ,wBAAwBA,cAAkB1D,SAASA,IAAIC,IACrJ,GACE6D,EAAOhC,EAASrF,OAASqF,EAAW,CAAC,CAAEY,IAAK,GAAIC,SAAS,IACzDoB,EAAMD,EAAKE,YAAY,CAAC7I,GAASuH,SAAU,IAAIA,KAAOvH,MAAUuH,KAAQ,cACxEI,EAAagB,EAAKE,YACtB,CAAC7I,GAASuH,SAAU,GAAGiB,KAAiBjB,GAAOkB,YAAmBzI,KAClE,YAEI8I,EAAa,SAASd,KAAUhD,EAAO,KAAKsD,KAAMC,KAAW,0BAEnEX,GAAY,CAACA,GAAWc,GAAYjI,OAAOsI,SAAStJ,KAAKsF,GACzD8C,GAAkB,CAChBD,GACA,6BAA6BY,IAAgBG,EAAKlF,KAAK,EAAG8D,UAAWA,GAAO,iBAAiBkB,IAAa,aAAa5D,SAASA,IAAIC,KAEnIrE,OAAOsI,SACPtJ,KAAKsF,GACRgD,GAAuB,GAAGe,IAAanB,IAAa7C,IAAMC,IAE1D+C,GAAiB,YAAYxD,KAAKG,GAC9B,GAAGqE,IAAaF,IAAM9D,IAAMC,IAC5BgD,GAEC,YAAYzD,KAAKG,KACpBmD,GAAYC,GAEhB,CAEA,MAAMmB,GAAiBxH,EAAQc,QAAQ,CAAE1C,KAAMuG,EAAKC,UAAU,GAAI3E,KAAMgD,IACxE,IAAIwE,GAAaD,GACbE,GAAcD,GAAWxH,KACzB0H,GACFD,KAAgBzE,EACZlD,EAAaC,EAAS0H,IAAajC,KAAMmC,GAASA,EAAKjI,MAAMvB,OAASqJ,GAAWrJ,OAAOO,UACxF0D,EAEN,GAAIzB,EAAQiH,OAAQ,CAClBH,GAAc1H,EAAQ8H,SACpBrK,EAAewF,EAAOpF,EAAKiD,QAAQD,EAAMD,EAAQiH,SACjD5E,GAEF,MAAM8E,EAAUhI,EAAaC,EAAS0H,IAEtC,GAAuB,IAAnBK,EAAQjI,OACV,MAAMiC,EACJ2F,QACArF,EACA,0BAA0B0F,EAAQjI,8CAItC2H,GAAaM,EAAQ,GAAGpI,MACxBgI,GAAcI,EAAQ,GAAGpJ,IAC3B,CAEA,IAAIqJ,EAAY,CAAA,GAAaC,WAAWjI,EAASyH,IAAY,GAE7D,MAAMS,GAAQ,IAAI5J,IAElB,IAAKqJ,GAAa,CAChB,MAAM9I,EAASmB,EAAQE,KAAKuH,GAAWxH,MACjC5B,EAAQF,EAAQsJ,GAAWrJ,MACjC,IAAI+J,GAAe,EAEnB,KAAOA,IAAiB9J,EAAM+J,MAAM,CAClCD,EAAe9J,EAAM+J,KAErB,IAAK,MAAMC,KAAaxJ,EAAOsB,IAAIC,QAAQC,KAAM,CAC/C,MAAME,EACe,2BAAnB8H,EAAU5J,KAAoC4J,EAAU9H,YAAc8H,EAClEC,EACkB,wBAAtB/H,GAAa9B,KACT8B,EAAYC,aAAaf,QAASmI,GACf,eAAjBA,EAAKnH,GAAGhC,KAAwB,CAACmJ,EAAKnH,GAAG9B,MAAQ,IAE7B,wBAAtB4B,GAAa9B,MAAkC8B,EAAYE,GACzD,CAACF,EAAYE,GAAG9B,MAChB,GAER,GAAI4B,GAAe+H,EAASrG,KAAMtD,GAASN,EAAMc,IAAIR,IAAQ,CAC3D,GACE4B,EAAYgI,OAAUd,GAAWrJ,KAAKmK,OACtChI,EAAY+C,KAAQmE,GAAWrJ,KAAKkF,IAEpC,SAGF4E,GAAMxJ,IAAI2J,GACVlK,EAAQoC,GAAaiI,QAAS7J,GAASN,EAAMK,IAAIC,GACnD,CACF,CACF,CAEA,MAAM8J,EAAmB,GAEzB,IAAK,MAAMJ,KAAaxJ,EAAOsB,IAAIC,QAAQC,KACzC,GAAuB,sBAAnBgI,EAAU5J,KAA8B,CAC1C,MAAMiK,EAAO9J,EAAWyJ,EAAWhK,EAAOgK,EAAUxJ,OAAOc,MAAO0D,EAAGC,GAEjEoF,GACFD,EAAOnI,KAAKoI,EAEhB,MAAWR,GAAM/I,IAAIkJ,IACnBI,EAAOnI,KAAKzB,EAAOwC,KAAK4C,MAAMoE,EAAUE,MAAQF,EAAU/E,MAI9D,MAAMqF,EAAY9K,EAAK+K,QAAQnB,GAAWxH,MAI1C,GAFAyH,GAAc7J,EAAKiD,QAAQjD,EAAKC,QAAQ2J,GAAWxH,MAAO,aAAa0I,KAEnElH,EAAGC,WAAWgG,IAChB,MAAM3F,EAAY2F,QAAarF,EAAW,kCAG5CoG,EAAOnI,KACL,kBAAkBzB,EAAOwC,KAAK4C,MAAMwD,GAAWrJ,KAAKmK,MAAQd,GAAWrJ,KAAKkF,OAAQE,EAAO,kDAAoD,KAAKF,KAEtJ5E,EAAIgJ,GAAa,GAAGe,EAAOxK,KAAKsF,EAAKA,KAAMA,KAC3CoE,GAAc,SAChB,CAGA,IAAK,MAAMU,KAAalI,EAAIC,QAAQC,KAAM,CACxC,GAAuB,wBAAnBgI,EAAU5J,MAAoE,IAAlC4J,EAAU7H,aAAaV,OACrE,MAAMiC,EACJkB,EACAoF,EACA,6EAIJ,GAAuB,sBAAnBA,EAAU5J,OAAgCyJ,GAAM/I,IAAIkJ,KAKtD,CACE1D,EACAG,EACAD,KACI2C,GAAevH,OAASgD,EAAQ,CAACuE,GAAepJ,MAAQ,IAC5D6D,KAAM7D,GAASA,EAAKmK,OAAUF,EAAUE,OAAUnK,EAAKkF,KAAQ+E,EAAU/E,KAK7E,MAAMvB,EACJkB,EACAoF,EACA,wFAEJ,CAGA,MAAMQ,GAAgB5D,EAAON,EAAKC,UAAU,IACtCkE,GACoB,eAAxBD,IAAepK,KAAwBuB,EAAQyE,OAAOxB,EAAO4F,GAAclK,WAAQ0D,EAC/E0G,GAAwBD,IAAgBrB,GAAWrJ,OAASoJ,GAAepJ,KAC3E4K,GACJD,IAAiD,eAAxBF,IAAepK,KACpCoK,GAAclK,KACE,YAAhBgJ,GACE,SACAA,GACFsB,GAAcF,GAChBnK,EAAWkK,GAAavI,YAAa,IAAIjC,IAAI,CAAC0K,KAAaF,GAAajK,OAAQwE,EAAGC,GACnF,UAA0B,YAAhBqE,GAA4BqB,GAAY,KAAKrB,eAAwBtE,IAAI5F,EAAewF,EAAOyE,IAAa1E,QAAQ,kBAAmB,MAAMK,IAAIC,IACzJ4F,GAAc/I,EAAIC,QAAQC,KAC7BpB,OAAQb,GAAuB,sBAAdA,EAAKK,OAAiCL,EAAKY,WAAWc,QACvER,IAAKlB,GAASiD,EAAK4C,MAAM7F,EAAKmK,MAAQnK,EAAKkF,MAE9C5E,EACEuE,EACA,CACE,2BAA2BI,IAAIK,kBAA4BL,IAAIC,IAC/D8C,GACA6C,MACGC,GACH,MACI5C,GAAiB,CAACA,IAAkB,GACxC,oBAAoBE,OAAYwC,MAAa1F,IAC7C,IACArF,KAAKsF,IAET7E,EACE+E,EACA,CACE,2BAA2BJ,IAAIK,2BAAqCL,IAAIC,IACxE+C,GACA4C,GACA,MACI1C,GAAuB,CAACA,IAAwB,GACpD,8BAA8BC,OAAYwC,MAAa1F,IACvD,IACArF,KAAKsF,IAGT,MAAM4F,GAAiB,GACjBC,GAAgB,CACpB,eAAetK,IAAQjB,EAAKD,SAASqD,EAAOuB,SAAUS,GAAOlF,MAAMF,EAAKG,KAAKC,KAAK,OAAOa,IACzF,eAAeA,IAAQjB,EAAKD,SAASqD,EAAOuB,SAAUiB,GAAQ1F,MAAMF,EAAKG,KAAKC,KAAK,OAAOa,KAGvF2C,EAAGC,WAAW7D,EAAKI,KAAK4C,EAAM,mBACjCuI,GAAc9I,KAAK,0BAGrB,MAAM+I,GAAa,cAAcD,GAAcnL,KAAK,WAEpD,GAAIgD,EAAO0C,OACT,MAAM5B,EACJd,EAAOhB,KACPgB,EAAO0C,OACP,oFAIJ,GAA6B,oBAAzB1C,EAAOqI,SAAS7K,KAClB0K,GAAM7I,KAAK,CACTiI,MAAOtH,EAAOqI,QAAQf,MAAS,EAC/BjF,IAAKrC,EAAOqI,QAAQf,MAAS,EAC7BG,KAAM,GAAGW,KAAapI,EAAOqI,QAAQC,SAASzJ,OAAS,KAAO,WAE3D,IAAKmB,EAAOqI,QAOjB,MAAMvH,EAAYd,EAAOhB,KAAMgB,EAAOqI,QAAS,sCAN/CH,GAAM7I,KAAK,CACTiI,MAAOtH,EAAO7C,KAAKmK,MAAS,EAC5BjF,IAAKrC,EAAO7C,KAAKmK,MAAS,EAC1BG,KAAM,GAAGvH,gBAAsBkI,QAInC,CAEA,GAAIlL,EAAQ8C,EAAOd,KAAKhB,IAAI,YAC1B,MAAM4C,EACJd,EAAOhB,UACPoC,EACA,mEAIJ3D,EACEuC,EAAOhB,KACP,wBAAwBnB,IAAQ4E,WAAqB5E,IAAQC,IAAYoC,IAAUqI,EAASvI,EAAOI,KAAM8H,OAGtG1G,EAAKmB,SACRlF,EACE6D,EACAiH,EAAS/G,EAAKpB,KAAM,CAClB,CACEkH,MAAOvE,EAAaE,SAAUC,UAC9Bb,IAAKU,EAAaE,SAAUC,UAC5BuE,KAAM,8BAMd,MAAMe,GAAc5L,EAAKI,KAAK4C,EAAM,gBAC9B6I,GAAcjI,EAAGE,aAAa8H,GAAa,QAC3CE,GAAMC,EAAYH,IAClBI,GAAkC,IACnCF,GAAIE,QACP,CAACF,GAAIE,SAAWC,OAAOC,OAAOJ,GAAIE,QAAS,OAAS,MAAQ,WAAY,gBACxE1H,MAAO,kBACP,YAAa,mBAGc,iBAAzBwH,GAAIE,SAASG,UACfH,GAAQG,QAAU,qBAGpB,MAAMC,GAAgB7I,EAAOsI,IACvBQ,GAAUC,IAAiBD,QAC3BE,GAAe,IAChBT,GAAIS,aACP1G,CAACA,GACCiG,GAAIS,eAAe1G,IAAgBiG,GAAIU,kBAAkB3G,IAAgB,IAAIwG,MASjF,OALAxL,EACE+K,GACA,GAAGa,KAAKC,UAAU,IAAKZ,GAAKE,WAASO,iBAAgB,KAAMH,GAAcO,QAAQxH,QAAQ,MAAOiH,GAAc9I,WAAWuI,GAAYe,SAAS,MAAQR,GAAc9I,QAAU,MAGzKG,EAAQoJ,KAAK,CAACC,EAAMC,IAAUD,EAAK1K,KAAK4K,cAAcD,EAAM3K,QAI/D6K,EAAU,CAAClK,EAAwB,MACvC,IACE,GAAIA,EAAQmK,OAASnK,EAAQoK,OAC3B,MAAM,IAAIC,MAAM,uCAGlB,MAAM3J,EAAUX,EAASC,GAEzB,IAAKU,EAAQxB,OAGX,YAFAoL,QAAQC,KAAK,iEAKf,IAAK,MAAMC,KAAU9J,EACnB4J,QAAQC,KACNE,EACED,EAAO5J,OAAS,KAAK4J,EAAOnL,OAAS,YACrC,KAAKmL,EAAOnL,OACZmL,EAAO5J,OACP4J,EAAO7J,QAKb,GAAIX,EAAQmK,MACV,IAAK,MAAMK,KAAU9J,EACnBG,EAAG6J,cAAczN,EAAKiD,QAAQF,EAAQC,MAAQE,QAAQC,MAAOoK,EAAOnL,MAAOmL,EAAO7J,OAItF2J,QAAQC,KACNvK,EAAQmK,MACJ,WAAWzJ,EAAQxB,uBACnB,kEAENoL,QAAQC,KAAK,gDACf,CAAE,MAAOI,GACPL,QAAQK,MAAM,GAAIA,EAAgBC,8BAA8BC,KAChE1K,QAAQ2K,SAAW,CACrB"}
|
package/cli/project.d.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Node, ObjectExpression } from '@babel/types';
|
|
2
|
+
import type { DefaultTreeAdapterTypes } from 'parse5';
|
|
3
|
+
import type { Alias } from 'vite';
|
|
4
|
+
import SourceFiles from '../services/source-files.js';
|
|
5
|
+
export declare const MANUAL_GUIDE = "https://lomray-software.github.io/vite-ssr-boost/guide/migrate-existing-spa";
|
|
6
|
+
export interface IPackage {
|
|
7
|
+
version?: string;
|
|
8
|
+
engines?: {
|
|
9
|
+
node?: string;
|
|
10
|
+
};
|
|
11
|
+
scripts?: Record<string, string>;
|
|
12
|
+
dependencies?: Record<string, string>;
|
|
13
|
+
devDependencies?: Record<string, string>;
|
|
14
|
+
peerDependencies?: Record<string, string>;
|
|
15
|
+
}
|
|
16
|
+
export interface IEdit {
|
|
17
|
+
start: number;
|
|
18
|
+
end: number;
|
|
19
|
+
text: string;
|
|
20
|
+
}
|
|
21
|
+
/** Apply non-overlapping source edits, preserving everything around them. */
|
|
22
|
+
export declare const editText: (code: string, edits: IEdit[]) => string;
|
|
23
|
+
/** Infer the small formatting choices needed for inserted code. */
|
|
24
|
+
export declare const format: (code: string) => {
|
|
25
|
+
newline: string;
|
|
26
|
+
quote: string;
|
|
27
|
+
semicolon: string;
|
|
28
|
+
indent: string;
|
|
29
|
+
};
|
|
30
|
+
export declare const readPackage: (file: string) => IPackage;
|
|
31
|
+
/** Works in the source checkout and in the published cli/ directory. */
|
|
32
|
+
export declare const libraryPackage: () => IPackage;
|
|
33
|
+
export declare const objectProperty: (object: ObjectExpression, name: string) => Node | undefined;
|
|
34
|
+
export declare const stringValue: (node?: Node) => string | undefined;
|
|
35
|
+
/** Read a conventional Vite config without evaluating plugins or env files. */
|
|
36
|
+
export declare const readConfig: (root: string) => {
|
|
37
|
+
file: string;
|
|
38
|
+
code: string;
|
|
39
|
+
ast: import("@babel/types").File;
|
|
40
|
+
node: ObjectExpression;
|
|
41
|
+
viteRoot: string;
|
|
42
|
+
plugins: Node | undefined;
|
|
43
|
+
plugin: import("@babel/types").SpreadElement | import("@babel/types").Expression | null | undefined;
|
|
44
|
+
option: (name: string) => Node | undefined;
|
|
45
|
+
aliases: Alias[];
|
|
46
|
+
sources: SourceFiles;
|
|
47
|
+
};
|
|
48
|
+
/** HTML locations come from an HTML parser, so comments and attribute order are harmless. */
|
|
49
|
+
export declare const readHtml: (file: string) => {
|
|
50
|
+
code: string;
|
|
51
|
+
entries: DefaultTreeAdapterTypes.Element[];
|
|
52
|
+
roots: DefaultTreeAdapterTypes.Element[];
|
|
53
|
+
outlets: number;
|
|
54
|
+
attribute: (node: DefaultTreeAdapterTypes.Element, name: string) => string | undefined;
|
|
55
|
+
};
|
|
56
|
+
export type TProjectConfig = ReturnType<typeof readConfig>;
|
package/cli/project.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import e from"node:fs";import t from"node:path";import o from"json5";import{parse as s}from"parse5";import i from"../constants/plugin-name.js";import r,{sourceError as n,unwrap as a,propertyName as l}from"../services/source-files.js";const p="https://lomray-software.github.io/vite-ssr-boost/guide/migrate-existing-spa",c=(e,t)=>[...t].sort((e,t)=>t.start-e.start).reduce((e,t)=>e.slice(0,t.start)+t.text+e.slice(t.end),e),f=e=>({newline:e.includes("\r\n")?"\r\n":"\n",quote:/(?:from\s+|import\s*)"/.test(e)?'"':"'",semicolon:/(?:from\s+['"][^'"]+['"]|\))\s*;/.test(e)?";":"",indent:e.match(/\n([\t ]+)\S/)?.[1]??" "}),m=t=>JSON.parse(e.readFileSync(t,"utf8")),u=()=>{const t=new URL("../package.json",import.meta.url);return m(e.existsSync(t)?t.pathname:new URL("../../package.json",import.meta.url).pathname)},d=(e,t)=>{const o=e.properties.find(e=>l(e)===t);return"ObjectProperty"===o?.type?a(o.value):void 0},g=e=>"StringLiteral"===e?.type?e.value:void 0,y=s=>{const p=["ts","js","mts","mjs","cts","cjs"].map(e=>t.join(s,`vite.config.${e}`)).filter(t=>e.existsSync(t));if(1!==p.length)throw n(t.join(s,"vite.config.*"),void 0,`Vite configs (${p.length}); expected exactly one`);const[c]=p,f=new r,{code:m,ast:u}=f.read(c);let{node:y}=f.exported(c);if("CallExpression"===y.type&&"Identifier"===y.callee.type&&"defineConfig"===f.import(c,y.callee.name)?.exported&&(y=a(y.arguments[0])),"ArrowFunctionExpression"===y?.type&&(y=a(y.body)),"ObjectExpression"!==y?.type)throw n(c,y,"Vite configuration; use defineConfig({ ... })");const v=d(y,"root");if(v&&"StringLiteral"!==v.type)throw n(c,v,"Vite root; use a string literal");const x=t.resolve(s,g(v)??"."),j=d(y,"plugins"),h="ArrayExpression"===j?.type?j.elements.find(e=>"CallExpression"===e?.type&&"Identifier"===e.callee.type&&f.import(c,e.callee.name)?.source.replace(/\.js$/,"")===`${i}/plugin`):void 0,b="CallExpression"===h?.type?a(h.arguments[0]):void 0;if(b&&"ObjectExpression"!==b.type)throw n(c,b,"SsrBoost options; use an object literal");const E=e=>"ObjectExpression"===b?.type?d(b,e):void 0,S=[],w=d(y,"resolve"),O="ObjectExpression"===w?.type?d(w,"alias"):void 0;if("ObjectExpression"===O?.type)for(const e of O.properties){if("ObjectProperty"!==e.type)continue;const o=l(e);let i=g(a(e.value));const r=a(e.value),n="CallExpression"===r?.type?r.arguments[0]:void 0;"NewExpression"===n?.type&&"Identifier"===n.callee.type&&"URL"===n.callee.name&&"StringLiteral"===n.arguments[0]?.type&&(i=t.resolve(s,n.arguments[0].value)),o&&i&&S.push({find:o,replacement:i})}const L=t.join(s,"tsconfig.json");if(e.existsSync(L)&&("BooleanLiteral"!==E("tsconfigAliases")?.type||!1!==Reflect.get(E("tsconfigAliases"),"value"))){const i=o.parse(e.readFileSync(L,"utf8")),r=t.resolve(s,i.compilerOptions?.baseUrl??t.relative(s,x));for(const[e,o]of Object.entries(i.compilerOptions?.paths??{}))S.push({find:e.replace(/\/\*$/,""),replacement:t.resolve(r,o[0].replace(/\/\*$/,""))})}return{file:c,code:m,ast:u,node:y,viteRoot:x,plugins:j,plugin:h,option:E,aliases:S,sources:f}},v=t=>{const o=e.readFileSync(t,"utf8"),i=s(o,{sourceCodeLocationInfo:!0}),r=[],n=o.split("\x3c!--ssr-outlet--\x3e").length-1,a=e=>{"tagName"in e&&r.push(e),"childNodes"in e&&e.childNodes.forEach(a)};a(i);const l=(e,t)=>e.attrs.find(e=>e.name===t)?.value;return{code:o,entries:r.filter(e=>"script"===e.tagName&&"module"===l(e,"type")),roots:r.filter(e=>"root"===l(e,"id")),outlets:n,attribute:l}};export{p as MANUAL_GUIDE,c as editText,f as format,u as libraryPackage,d as objectProperty,y as readConfig,v as readHtml,m as readPackage,g as stringValue};
|
|
2
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sources":["../../src/cli/project.ts"],"sourcesContent":[null],"names":["MANUAL_GUIDE","editText","code","edits","sort","left","right","start","reduce","result","edit","slice","text","end","format","newline","includes","quote","test","semicolon","indent","match","readPackage","file","JSON","parse","fs","readFileSync","libraryPackage","published","URL","url","existsSync","pathname","objectProperty","object","name","property","properties","find","item","propertyName","type","unwrap","value","undefined","stringValue","node","readConfig","root","candidates","map","extension","path","join","filter","length","sourceError","sources","SourceFiles","ast","read","exported","callee","import","arguments","body","rootNode","viteRoot","resolve","plugins","plugin","elements","element","source","replace","PLUGIN_NAME","options","option","aliases","alias","replacement","push","tsconfig","Reflect","get","ts","JSON5","base","compilerOptions","baseUrl","relative","replacements","Object","entries","paths","readHtml","document","parseHtml","sourceCodeLocationInfo","outlets","split","visit","childNodes","forEach","attribute","attrs","attr","tagName","roots"],"mappings":"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"}
|
package/cli.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{readFileSync as
|
|
2
|
+
import{readFileSync as o}from"fs";import e from"chalk";import{Command as i,Option as t}from"commander";import n from"./cli/build.js";import r from"./cli/doctor.js";import d from"./cli/helpers/keyboard-input.js";import s from"./cli/helpers/vite-reset-cache.js";import a from"./cli/init.js";import c from"./cli/run-amplify-build.js";import l from"./cli/run-dev.js";import p from"./cli/run-docker-build.js";import m from"./cli/run-prod.js";import f from"./cli/run-vercel-build.js";import u from"./constants/cli-actions.js";import O from"./constants/cli-context.js";import w from"./constants/cli-name.js";const{description:v,version:y}=JSON.parse(o(new URL("./package.json",import.meta.url),"utf8")),g=()=>{process.stdin.isTTY&&(process.stdin.setRawMode(!0),process.stdin.on("data",d).setEncoding("utf8").resume())},h=new i;h.name(w).description(v).version(y).hook("preAction",(o,e)=>{global.viteBoostAction=e.name()});const b=new t("--host","Ability to access the local instance on other devices under the same network.").default(!1),k=new t("--focus-only [focusOnly]","Build or Start only specified part of app.").default("app").choices(["all","app","client","server","entrypoint"]),j=new t("--port [port]","Server port.").default(3e3),P=new t("--mode [mode]","Env mode.").env("VITE_ENV_MODE").default("production"),D=new t("--build-dir [buildDir]","Build directory output.");h.command(u.dev).description("Run development server.").addOption(b).addOption(j).addOption(new t("--reset-cache","Clear vite cache before run.").default(!1)).addOption(new t("--mode [mode]","Env mode.").env("VITE_ENV_MODE").default("development")).addOption(new t("--entrypoint [entrypoint]","Run only entrypoint by name.")).action(async({host:o,port:i,resetCache:t,mode:n,entrypoint:r})=>{t&&await s();const d=async t=>{console.info(e.cyan("Starting the development server..."));const{server:d,config:s}=await l({version:y,isHost:o,isPrintInfo:t,port:i,mode:n,entrypointName:r});O.server=d,O.config=s};return O.reboot=d,g(),d()}),h.command(u.build).description("Create production build.").addOption(k).addOption(P).addOption(new t("--client-options [client-options]",'Pass vite build options for client. Example: --client-options="--ssrManifest"').env("VITE_BUILD_CLIENT_OPTIONS").default("")).addOption(new t("--server-options [server-options]","Pass vite build options for server.").env("VITE_BUILD_SERVER_OPTIONS").default("")).addOption(new t("--unlock-robots","Change general directive Disallow to Allow in robots.txt").default(!1)).addOption(new t("--eject","Produces entrypoint file to run app without cli").default(!1)).addOption(new t("--serverless","Produces entrypoint file to run app like serverless function").default(!1)).addOption(new t("--throw-warnings","The build will abort with an error if warnings occur in the process.").default(!1)).action(async({focusOnly:o,clientOptions:e,serverOptions:i,mode:t,unlockRobots:r,eject:d,serverless:s,throwWarnings:a})=>{await n({focusOnly:o,isUnlockRobots:r,isNoWarnings:a,isEject:d,isServerless:s,clientOptions:e,serverOptions:i,mode:t})}),h.command(u.start).description("Run production server.").addOption(b).addOption(j).addOption(k).addOption(D).addOption(new t("--module-preload","Add module preload scripts to server output.").default(!1)).action(({host:o,port:e,focusOnly:i,modulePreload:t,buildDir:n})=>{const r=async r=>{const{server:d,config:s}=await m({version:y,isHost:o,isPrintInfo:r,port:e,focusOnly:i,modulePreload:t,buildDir:n});O.server=d,O.config=s};return O.reboot=r,g(),r()}),h.command(u.preview).description("Build and preview production.").addOption(k).addOption(b).addOption(j).addOption(P).addOption(D).action(async({host:o,port:i,focusOnly:t,mode:r,buildDir:d})=>{global.viteBoostStartTime=performance.now();const s=async n=>{const{server:r,config:s}=await m({version:y,isHost:o,isPrintInfo:n,port:i,focusOnly:t,buildDir:d});r.on("listening",()=>{setTimeout(()=>{s.getLogger().info(e.yellow("\n Running preview mode... \n"))},0)}),O.server=r,O.config=s};O.reboot=s,g();await n({mode:r,isWatch:!0,focusOnly:t,clientOptions:"-w",serverOptions:"-w",onFinish:()=>{s()}})}),h.command(u.buildDocker).description("Create docker image with production build.").requiredOption("--image-name <image-name>","Docker image name.").addOption(new t("--docker-options [docker-options]","Extra docker options which pass to docker build command.")).addOption(new t("--docker-file [docker-file]","Name of the Dockerfile (Default is PLUGIN_PATH/workflow/Dockerfile).")).addOption(k).addOption(P).action(async({imageName:o,dockerOptions:e,dockerFile:i,focusOnly:t,mode:n})=>{await p({imageName:o,dockerOptions:e,dockerFile:i,focusOnly:t,mode:n})}),h.command(u.buildAmplify).description("Create AWS Amplify production build.").addOption(new t("--manifest-file [manifest-file]","Path to the Amplify manifest file (Default is PLUGIN_PATH/workflow/amplify-manifest.json).")).addOption(new t("--is-optimize","Optimize node_modules folder.").default(!1)).addOption(P).action(async({manifestFile:o,mode:e,isOptimize:i})=>{await c({manifestFile:o,mode:e,isOptimize:i})}),h.command(u.buildVercel).description("Create Vercel serverless production build.").addOption(new t("--config-file [config-file]","Path to the Vercel config.json file (Default is PLUGIN_PATH/workflow/vercel.config.json).")).addOption(new t("--config-vc-file [config-vc-file]","Path to the Vercel vc-config.json file (Default is PLUGIN_PATH/workflow/vercel.vc-config.json).")).addOption(new t("--is-optimize","Optimize node_modules folder.").default(!1)).addOption(P).action(async({configFile:o,configVcFile:e,mode:i,isOptimize:t})=>{await f({configFile:o,configVcFile:e,mode:i,isOptimize:t})}),h.command("doctor").description("Inspect SSR setup and report actionable checks.").option("--json","Print machine-readable JSON.").option("--root <dir>","Project directory.").option("--bundle <file>","Write an allowlisted support bundle JSON.").action(r),h.command("init").description("Add SSR to an existing Vite + React Router app (dry run by default).").option("--dry-run","Print every change without writing files.").option("--apply","Write the proposed changes.").option("--root <dir>","Project directory.").option("--entry <file>","Browser entry relative to the project directory.").option("--routes <file>","Module exporting the route array.").action(a),h.parse();
|
|
3
3
|
//# sourceMappingURL=cli.js.map
|
package/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sources":["../src/cli.ts"],"sourcesContent":[null],"names":["description","version","JSON","parse","readFileSync","URL","url","enableShortcuts","process","stdin","isTTY","setRawMode","on","onKeyPress","setEncoding","resume","program","Command","name","cliName","hook","_","actionCommand","global","viteBoostAction","hostOption","Option","default","focusOnlyOption","choices","portOption","envModeOption","env","buildDirOption","command","CliActions","dev","addOption","action","async","host","port","resetCache","mode","entrypoint","viteResetCache","isPrintInfo","console","info","chalk","cyan","server","config","runDev","isHost","entrypointName","cliContext","reboot","build","focusOnly","clientOptions","serverOptions","unlockRobots","eject","serverless","throwWarnings","runBuild","isUnlockRobots","isNoWarnings","isEject","isServerless","start","modulePreload","buildDir","runProd","preview","viteBoostStartTime","performance","now","setTimeout","getLogger","yellow","isWatch","onFinish","buildDocker","requiredOption","imageName","dockerOptions","dockerFile","runDockerBuild","buildAmplify","manifestFile","isOptimize","runAmplifyBuild","buildVercel","configFile","configVcFile","runVercelBuild"],"mappings":";
|
|
1
|
+
{"version":3,"file":"cli.js","sources":["../src/cli.ts"],"sourcesContent":[null],"names":["description","version","JSON","parse","readFileSync","URL","url","enableShortcuts","process","stdin","isTTY","setRawMode","on","onKeyPress","setEncoding","resume","program","Command","name","cliName","hook","_","actionCommand","global","viteBoostAction","hostOption","Option","default","focusOnlyOption","choices","portOption","envModeOption","env","buildDirOption","command","CliActions","dev","addOption","action","async","host","port","resetCache","mode","entrypoint","viteResetCache","isPrintInfo","console","info","chalk","cyan","server","config","runDev","isHost","entrypointName","cliContext","reboot","build","focusOnly","clientOptions","serverOptions","unlockRobots","eject","serverless","throwWarnings","runBuild","isUnlockRobots","isNoWarnings","isEject","isServerless","start","modulePreload","buildDir","runProd","preview","viteBoostStartTime","performance","now","setTimeout","getLogger","yellow","isWatch","onFinish","buildDocker","requiredOption","imageName","dockerOptions","dockerFile","runDockerBuild","buildAmplify","manifestFile","isOptimize","runAmplifyBuild","buildVercel","configFile","configVcFile","runVercelBuild","option","runDoctor","runInit"],"mappings":"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"}
|
package/helpers/is-route-file.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const
|
|
1
|
+
const s=s=>/(?:\blazy|['"]lazy['"]\s*\]?)\s*:\s*(?:async\s*)?(?:function|\([^)]*\)\s*=>)/s.test(s)||/{.*(?:path|index)\s*:.*(?:Component|element)\s*:|{.*(?:Component|element)\s*:.*(?:path|index)\s*:/s.test(s);export{s as default};
|
|
2
2
|
//# sourceMappingURL=is-route-file.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-route-file.js","sources":["../../src/helpers/is-route-file.ts"],"sourcesContent":[null],"names":["isRoutesFile","code","test"],"mappings":"AAGA,MAAMA,EAAgBC,GACpB
|
|
1
|
+
{"version":3,"file":"is-route-file.js","sources":["../../src/helpers/is-route-file.ts"],"sourcesContent":[null],"names":["isRoutesFile","code","test"],"mappings":"AAGA,MAAMA,EAAgBC,GACpB,gFAAgFC,KAAKD,IACrF,qGAAqGC,KACnGD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lomray/vite-ssr-boost",
|
|
3
|
-
"version": "8.3.0
|
|
3
|
+
"version": "8.3.0",
|
|
4
4
|
"description": "SSR and streaming for existing Vite + React Router apps in Data mode, without Framework mode",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -75,8 +75,11 @@
|
|
|
75
75
|
"chalk": "^6.0.0",
|
|
76
76
|
"commander": "^15.0.0",
|
|
77
77
|
"devalue": "^5.9.2",
|
|
78
|
+
"diff": "^9.0.0",
|
|
78
79
|
"hoist-non-react-statics": "^3.3.2",
|
|
79
|
-
"json5": "^2.2.3"
|
|
80
|
+
"json5": "^2.2.3",
|
|
81
|
+
"parse5": "^8.0.1",
|
|
82
|
+
"semver": "^7.8.5"
|
|
80
83
|
},
|
|
81
84
|
"optionalDependencies": {
|
|
82
85
|
"compression": "^1.8.1",
|
|
@@ -104,6 +107,7 @@
|
|
|
104
107
|
"@types/node": "^22.20.1",
|
|
105
108
|
"@types/react": "^19.2.18",
|
|
106
109
|
"@types/react-dom": "^19.2.7",
|
|
110
|
+
"@types/semver": "^7.8.0",
|
|
107
111
|
"@types/serve-static": "^2.2.0",
|
|
108
112
|
"@types/sinon": "^22.0.0",
|
|
109
113
|
"@vitest/coverage-v8": "^5.0.0",
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{extname as
|
|
1
|
+
import{extname as s}from"node:path";import e from"../constants/plugin-name.js";import o from"../helpers/is-route-file.js";import r from"../services/parse-routes.js";function t(t={}){const{routesPath:n,isSSR:i=!1,isBuild:m=!1}=t;return{name:`${e}-normalize-route`,enforce:"pre",transform(e,t){const[u]=s(t).split("?"),p=!n||t.includes(n);if(!t.includes("node_modules")&&[".js",".jsx",".mjs",".ts",".tsx",".mts"].includes(u)&&p&&o(e))return{code:r.handleRoutes(e,i&&!m,t),map:{mappings:""}}}}}export{t as default};
|
|
2
2
|
//# sourceMappingURL=normalize-route.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize-route.js","sources":["../../src/plugins/normalize-route.ts"],"sourcesContent":[null],"names":["ViteNormalizeRouterPlugin","options","routesPath","isSSR","isBuild","name","PLUGIN_NAME","enforce","transform","code","id","extName","extname","split","isRoutesPath","includes","isRoutesFile","ParseRoutes","handleRoutes","map","mappings"],"mappings":"qKAoBA,SAASA,EAA0BC,EAA0B,IAC3D,MAAMC,WAAEA,EAAUC,MAAEA,GAAQ,EAAKC,QAAEA,GAAU,GAAUH,EAEvD,MAAO,CACLI,KAAM,GAAGC,oBACTC,QAAS,MACT,SAAAC,CAAUC,EAAMC,GACd,MAAOC,GAAWC,EAAQF,GAAIG,MAAM,KAC9BC,GAAgBZ,GAAcQ,EAAGK,SAASb,GAEhD,IACEQ,EAAGK,SAAS,iBACX,CAAC,MAAO,OAAQ,MAAO,QAAQA,SAASJ,
|
|
1
|
+
{"version":3,"file":"normalize-route.js","sources":["../../src/plugins/normalize-route.ts"],"sourcesContent":[null],"names":["ViteNormalizeRouterPlugin","options","routesPath","isSSR","isBuild","name","PLUGIN_NAME","enforce","transform","code","id","extName","extname","split","isRoutesPath","includes","isRoutesFile","ParseRoutes","handleRoutes","map","mappings"],"mappings":"qKAoBA,SAASA,EAA0BC,EAA0B,IAC3D,MAAMC,WAAEA,EAAUC,MAAEA,GAAQ,EAAKC,QAAEA,GAAU,GAAUH,EAEvD,MAAO,CACLI,KAAM,GAAGC,oBACTC,QAAS,MACT,SAAAC,CAAUC,EAAMC,GACd,MAAOC,GAAWC,EAAQF,GAAIG,MAAM,KAC9BC,GAAgBZ,GAAcQ,EAAGK,SAASb,GAEhD,IACEQ,EAAGK,SAAS,iBACX,CAAC,MAAO,OAAQ,OAAQ,MAAO,OAAQ,QAAQA,SAASJ,IACxDG,GACAE,EAAaP,GAKhB,MAAO,CACLA,KAAMQ,EAAYC,aAChBT,EAEAN,IAAUC,EACVM,GAEFS,IAAK,CAAEC,SAAU,IAErB,EAEJ"}
|
package/services/build.d.ts
CHANGED
package/services/build.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import i from"node:child_process";import s from"node:fs";import t from"node:path";import e from"chalk";import{resolveConfig as o}from"vite";import r from"../cli/helpers/vite-reset-cache.js";import
|
|
1
|
+
import i from"node:child_process";import s from"node:fs";import t from"node:path";import e from"chalk";import{resolveConfig as o}from"vite";import r from"../cli/diagnostic-codes.js";import n from"../cli/helpers/vite-reset-cache.js";import l from"../helpers/create-focus-only.js";import{createDevMarker as a}from"../helpers/dev-marker.js";import c from"../helpers/plugin-config.js";import d from"../helpers/process-stop.js";import u from"./server-config.js";import h from"./ssr-manifest.js";class p{isProd;nodeEnv;buildDir;viteConfig;pluginConfig;params={mode:"",clientOptions:"",serverOptions:"",focusOnly:"app",isWatch:!1,isUnlockRobots:!1,isEject:!1,isServerless:!1,isNoWarnings:!1};abortController=null;runningBuild=[];hasPreviewModeExitListener=!1;diagnosticCodes=new Set;constructor(i){this.params={...this.params,...i}}async makeConfig(){const{mode:i}=this.params;this.viteConfig=await o({},"build",i,"production"),this.pluginConfig=c(this.viteConfig),this.buildDir=t.resolve(this.viteConfig.root,this.viteConfig.build.outDir),this.nodeEnv=process.env.NODE_ENV||"production",this.isProd="production"===this.nodeEnv}clearBuildFolder(){s.existsSync(this.buildDir)&&s.rmSync(this.buildDir,{recursive:!0})}getIsProd(){return this.isProd}getNodeEnv(){return this.nodeEnv}getRunningBuildNames(){return this.runningBuild.map(({name:i})=>i)}promisifyProcess(i,s=!1){const t=new Promise((t,e)=>{i.on("exit",i=>{t(i)}),i.on("close",i=>{t(i)}),i.on("error",i=>{e(i)}),s&&i.stderr?.on("data",i=>{const s=Buffer.from(i).toString();(s.includes("warning")||s.includes("WARNING"))&&t(1)})});i.stdout?.pipe(process.stdout),i.stderr?.pipe(process.stderr);for(const s of[i.stdout,i.stderr]){let i="";s?.on("data",s=>{const t=i+Buffer.from(s).toString();r.filter(i=>t.includes(i)).forEach(i=>this.diagnosticCodes.add(i)),i=t.slice(-80)})}return{promise:t,command:i}}buildManifest(){console.info(e.blue("Building routes manifest file"));const i=u.init({isProd:this.isProd,mode:this.params.mode},{root:this.viteConfig.root,clientFile:this.pluginConfig.clientFile});h.get(i,{buildDir:this.viteConfig.build.outDir,viteAliases:this.viteConfig.resolve.alias,basename:this.viteConfig.base,renderBuiltUrl:this.viteConfig?.experimental?.renderBuiltUrl}).buildRoutesManifest()}unlockRobots(){const i=`${this.buildDir}/client/robots.txt`;if(!s.existsSync(i))return void console.warn(`Failed to unlock robots.txt, file not exist: ${i}`);const t=s.readFileSync(i,{encoding:"utf-8"}).replace(/Disallow: \/$/m,"Allow: /");s.writeFileSync(i,t,{encoding:"utf-8"}),console.info(e.blue("\nrobots.txt unlocked."))}eject(){const i=`${this.buildDir}/server/start.js`;s.writeFileSync(i,"import runProd from '@lomray/vite-ssr-boost/cli/run-prod.js';\n\nconst VERSION = process.env.VERSION || \"1.0.0\";\nconst PORT = process.env.PORT || 3000;\nconst IS_HOST = process.env.IS_HOST || \"0\";\nconst ONLY_CLIENT = process.env.ONLY_CLIENT || \"0\";\n\nawait runProd({\n version: VERSION,\n isHost: IS_HOST === '1',\n isPrintInfo: true,\n port: PORT,\n onlyClient: ONLY_CLIENT === '1',\n });\n",{encoding:"utf-8"})}createServerless(){const i=`${this.buildDir}/server/serverless.js`;s.writeFileSync(i,"import runServerless from '@lomray/vite-ssr-boost/cli/run-serverless.js';\n\nexport default await runServerless({ version: process.env.VERSION || \"1.0.0\" });\n",{encoding:"utf-8"})}async spawnBuild(s,t,e={}){const{mode:o,isNoWarnings:r}=this.params,{focusOnly:n=this.params.focusOnly,shouldWait:a=!1,env:c={}}=e,d=o&&!t.includes("--mode")?`--mode ${o}`:"",u=this.promisifyProcess(i.spawn(`vite build ${t} ${d} --emptyOutDir`,{signal:this.abortController.signal,stdio:[process.stdin,"pipe","pipe"],shell:!0,env:{...process.env,...c,FORCE_COLOR:"2",SSR_BOOST_IS_SSR:l(n).isOnlyClient()?"0":"1",SSR_BOOST_ACTION:global.viteBoostAction}}),r);this.runningBuild.push({name:s,buildProcess:u}),a&&await this.waitLastBuild()}async waitLastBuild(){const i=this.runningBuild.at(-1);if(!i)return;const s=await i.buildProcess.promise;d(s,!0)}runPreviewMode(){this.hasPreviewModeExitListener||(process.on("exit",()=>{this.abortController.abort()}),this.hasPreviewModeExitListener=!0);const{onFinish:i}=this.params;let s=this.runningBuild.length;const t=e=>{Buffer.from(e).toString().includes("built in")&&(s-=1,s||(this.runningBuild.forEach(({buildProcess:i})=>{i.command.stdout?.removeListener("data",t)}),a(this.isProd,this.viteConfig),i?.()))};this.runningBuild.forEach(({buildProcess:i})=>{i.command.stdout?.on("data",t)})}async build(){await this.makeConfig(),await n(),this.clearBuildFolder(),this.diagnosticCodes.clear();const{clientOptions:i,serverOptions:e,onFinish:o,isWatch:r,focusOnly:c,isEject:d,isServerless:u,isUnlockRobots:h}=this.params,{outDir:p}=this.viteConfig.build,f=l(c);this.abortController=new AbortController,this.runningBuild=[],f.isClient()&&await this.spawnBuild("client",`${i} --outDir ${p}/client`,{shouldWait:!r}),f.isServer()&&(await this.spawnBuild("server",`${e} --outDir ${p}/server --ssr ${this.pluginConfig.serverFile}`,{shouldWait:!r}),r||(this.buildManifest(),d&&this.eject(),u&&this.createServerless()));const{entrypoint:m}=this.pluginConfig;if(m?.length&&f.isEntrypoint())for(const{name:i,type:s,serverFile:t,buildOptions:e=""}of m){const o=t&&"ssr"===s?`--ssr ${t}`:"";await this.spawnBuild(i,`${e} ${o} --outDir ${p}/${i}`,{shouldWait:!r,focusOnly:"ssr"===s?"server":"client",env:{SSR_BOOST_CUSTOM_ENTRYPOINT_BUILD_NAME:i}})}r?this.runPreviewMode():(h&&this.unlockRobots(),a(this.isProd,this.viteConfig),s.mkdirSync(this.buildDir,{recursive:!0}),s.writeFileSync(t.join(this.buildDir,"ssr-boost-diagnostics.json"),JSON.stringify({codes:[...this.diagnosticCodes].sort((i,s)=>i.localeCompare(s))},null,2)),o?.())}}export{p as default};
|
|
2
2
|
//# sourceMappingURL=build.js.map
|
package/services/build.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sources":["../../src/services/build.ts"],"sourcesContent":[null],"names":["Build","isProd","nodeEnv","buildDir","viteConfig","pluginConfig","params","mode","clientOptions","serverOptions","focusOnly","isWatch","isUnlockRobots","isEject","isServerless","isNoWarnings","abortController","runningBuild","hasPreviewModeExitListener","constructor","this","makeConfig","resolveConfig","getPluginConfig","path","resolve","root","build","outDir","process","env","NODE_ENV","clearBuildFolder","fs","existsSync","rmSync","recursive","getIsProd","getNodeEnv","getRunningBuildNames","map","name","promisifyProcess","command","isRejectWarnings","promise","Promise","reject","on","code","message","stderr","buff","msg","Buffer","from","toString","includes","stdout","pipe","buildManifest","console","info","chalk","blue","serverConfig","ServerConfig","init","clientFile","SsrManifest","get","viteAliases","alias","basename","base","renderBuiltUrl","experimental","buildRoutesManifest","unlockRobots","robotsFile","warn","data","readFileSync","encoding","replace","writeFileSync","eject","entrypoint","createServerless","spawnBuild","buildOptions","shouldWait","modeOpt","buildProcess","childProcess","spawn","signal","stdio","stdin","shell","FORCE_COLOR","SSR_BOOST_IS_SSR","createFocusOnly","isOnlyClient","SSR_BOOST_ACTION","global","viteBoostAction","push","waitLastBuild","latestProcess","at","exitCode","processStop","runPreviewMode","abort","onFinish","buildCount","length","listener","
|
|
1
|
+
{"version":3,"file":"build.js","sources":["../../src/services/build.ts"],"sourcesContent":[null],"names":["Build","isProd","nodeEnv","buildDir","viteConfig","pluginConfig","params","mode","clientOptions","serverOptions","focusOnly","isWatch","isUnlockRobots","isEject","isServerless","isNoWarnings","abortController","runningBuild","hasPreviewModeExitListener","diagnosticCodes","Set","constructor","this","makeConfig","resolveConfig","getPluginConfig","path","resolve","root","build","outDir","process","env","NODE_ENV","clearBuildFolder","fs","existsSync","rmSync","recursive","getIsProd","getNodeEnv","getRunningBuildNames","map","name","promisifyProcess","command","isRejectWarnings","promise","Promise","reject","on","code","message","stderr","buff","msg","Buffer","from","toString","includes","stdout","pipe","stream","tail","chunk","text","DIAGNOSTIC_CODES","filter","forEach","add","slice","buildManifest","console","info","chalk","blue","serverConfig","ServerConfig","init","clientFile","SsrManifest","get","viteAliases","alias","basename","base","renderBuiltUrl","experimental","buildRoutesManifest","unlockRobots","robotsFile","warn","data","readFileSync","encoding","replace","writeFileSync","eject","entrypoint","createServerless","spawnBuild","buildOptions","shouldWait","modeOpt","buildProcess","childProcess","spawn","signal","stdio","stdin","shell","FORCE_COLOR","SSR_BOOST_IS_SSR","createFocusOnly","isOnlyClient","SSR_BOOST_ACTION","global","viteBoostAction","push","waitLastBuild","latestProcess","at","exitCode","processStop","runPreviewMode","abort","onFinish","buildCount","length","listener","removeListener","createDevMarker","viteResetCache","clear","focus","AbortController","isClient","isServer","serverFile","isEntrypoint","type","cliOptions","SSR_BOOST_CUSTOM_ENTRYPOINT_BUILD_NAME","mkdirSync","join","JSON","stringify","codes","sort","a","b","localeCompare"],"mappings":"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"}
|
|
@@ -1,67 +1,29 @@
|
|
|
1
|
+
import type { Node as BabelNode } from '@babel/types';
|
|
1
2
|
import type { Alias } from 'vite';
|
|
2
|
-
import PathNormalize from './path-normalize.js';
|
|
3
3
|
import type ServerConfig from './server-config.js';
|
|
4
|
+
import SourceFiles from './source-files.js';
|
|
5
|
+
import type { ISourceValue } from './source-files.js';
|
|
4
6
|
export type TRoutesTree = {
|
|
5
7
|
index: number;
|
|
8
|
+
id?: string;
|
|
9
|
+
path?: string | null;
|
|
6
10
|
import: string;
|
|
7
11
|
children: TRoutesTree[];
|
|
8
12
|
};
|
|
9
|
-
/**
|
|
10
|
-
|
|
11
|
-
*/
|
|
13
|
+
/** Get the one statically named module loaded by a lazy route. */
|
|
14
|
+
export declare const lazyImport: ({ node, file }: ISourceValue) => string;
|
|
15
|
+
/** Static React Router route analysis; never imports application code. */
|
|
12
16
|
declare class ParseRoutes {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
*/
|
|
17
|
+
private readonly config;
|
|
18
|
+
private readonly viteAliases?;
|
|
16
19
|
private static unwrapExpression;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
*/
|
|
24
|
-
protected readonly config: ServerConfig;
|
|
25
|
-
/**
|
|
26
|
-
* @constructor
|
|
27
|
-
*/
|
|
28
|
-
constructor(config: ServerConfig, viteAliases?: Alias[]);
|
|
29
|
-
/**
|
|
30
|
-
* Parse routes
|
|
31
|
-
*/
|
|
32
|
-
parse(): TRoutesTree[];
|
|
33
|
-
/**
|
|
34
|
-
* Parse file and return ast
|
|
35
|
-
*/
|
|
36
|
-
private parseFile;
|
|
37
|
-
/**
|
|
38
|
-
* Find route import filepath
|
|
39
|
-
*/
|
|
40
|
-
private getImportPath;
|
|
41
|
-
/**
|
|
42
|
-
* Find routes array inside code
|
|
43
|
-
*/
|
|
44
|
-
private findRoutesDefinition;
|
|
45
|
-
/**
|
|
46
|
-
* Entrypoint routes file
|
|
47
|
-
*/
|
|
48
|
-
private findRoutesEntrypoint;
|
|
49
|
-
/**
|
|
50
|
-
* Resolve route filename import
|
|
51
|
-
*/
|
|
52
|
-
private resolveFilename;
|
|
53
|
-
/**
|
|
54
|
-
* Parse ast array routes objects
|
|
55
|
-
*/
|
|
56
|
-
private parseRoutesArray;
|
|
57
|
-
/**
|
|
58
|
-
* Parse imports map from ast
|
|
59
|
-
*/
|
|
20
|
+
constructor(config: ServerConfig, viteAliases?: Alias[] | undefined);
|
|
21
|
+
/** Locate the library entry by its import binding, not its local spelling. */
|
|
22
|
+
parse(includeEmpty?: boolean): TRoutesTree[];
|
|
23
|
+
/** Also used to validate a proposed migration before any files are written. */
|
|
24
|
+
parseValue(sources: SourceFiles, value: ISourceValue, includeEmpty?: boolean, ancestors?: Set<BabelNode>): TRoutesTree[];
|
|
25
|
+
private assetPath;
|
|
60
26
|
private static parseImportsMap;
|
|
61
|
-
/**
|
|
62
|
-
* Recursive build routes tree with dynamic imports
|
|
63
|
-
*/
|
|
64
|
-
private recursiveBuildRoutesTree;
|
|
65
27
|
/**
|
|
66
28
|
* Add pathId to static routes
|
|
67
29
|
*/
|
|
@@ -70,6 +32,6 @@ declare class ParseRoutes {
|
|
|
70
32
|
* Inject pathId to sync/async routes
|
|
71
33
|
* Add async wrapper (see import-routes)
|
|
72
34
|
*/
|
|
73
|
-
static handleRoutes(code: string, shouldAddPathId: boolean): string;
|
|
35
|
+
static handleRoutes(code: string, shouldAddPathId: boolean, filename?: string): string;
|
|
74
36
|
}
|
|
75
37
|
export default ParseRoutes;
|
package/services/parse-routes.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"
|
|
1
|
+
import e from"node:path";import t from"@babel/generator";import*as r from"@babel/parser";import o from"@babel/traverse";import{isObjectProperty as n,isFunction as i,isBooleanLiteral as s,isJSXElement as a,isIdentifier as l,isArrayExpression as p,objectProperty as u,identifier as c,stringLiteral as m,isJSXIdentifier as f,isObjectExpression as d}from"@babel/types";import y from"../constants/plugin-name.js";import h,{unwrap as g,walk as v,sourceError as w,propertyName as b}from"./source-files.js";const x=t.default??t,E=o.default??o,I=({node:e,file:t})=>{const r=g(e);if("ArrowFunctionExpression"!==r.type&&"FunctionExpression"!==r.type)throw w(t,r,"lazy route; use a function importing one literal module");let o=g(r.body);if("BlockStatement"===o?.type){if(1!==o.body.length||"ReturnStatement"!==o.body[0].type)throw w(t,r,"lazy function body; return one literal import (optionally with .then)");o=g(o.body[0].argument)}if("AwaitExpression"===o?.type&&(o=g(o.argument)),"CallExpression"===o?.type&&"MemberExpression"===o.callee.type&&"Identifier"===o.callee.property.type&&"then"===o.callee.property.name&&(o=g(o.callee.object)),"ImportExpression"!==o?.type)throw w(t,o,"lazy route result; return one literal import (optionally with .then)");const n=[];if(v(r,e=>{if("ImportExpression"===e.type){if("StringLiteral"!==e.source.type)throw w(t,e,"dynamic lazy import; use a string literal");n.push(e.source.value)}}),1!==n.length)throw w(t,r,`lazy route with ${n.length} imports; use exactly one literal module`);return n[0]};class S{config;viteAliases;static unwrapExpression=g;constructor(e,t){this.config=e,this.viteAliases=t}parse(t=!1){const{clientFile:r,root:o}=this.config.getParams(),n=e.resolve(o,r),i=new h(this.viteAliases??this.config.getVite()?.config.resolve.alias),s=[];if(v(i.read(n).ast,e=>{if("CallExpression"!==e.type||"Identifier"!==e.callee.type)return;const t=i.import(n,e.callee.name);if(t?.source.replace(/\.js$/,"")===`${y}/browser/entry`&&["default","entry"].includes(t.exported)){if(!e.arguments[1])throw w(n,e,"browser entry routes argument");s.push({node:e.arguments[1],file:n})}}),1!==s.length)throw w(n,s[1]?.node,`browser entry calls (${s.length}); expected one library browser/entry call`);return this.parseValue(i,s[0],t)}parseValue(e,t,r=!1,o=new Set){const{node:n,file:i}=e.resolve(t);if("ArrayExpression"!==n.type||o.has(n))throw w(i,n,"routes array; use a static, non-circular array");const s=new Set([...o,n]),a=[];return n.elements.forEach((t,o)=>{if(!t)throw w(i,n,"empty route array entry; use route objects");if("SpreadElement"===t.type)throw w(i,t,"route array spread; declare array entries explicitly");const l=e.properties({node:t,file:i}),p={index:o,import:"",children:[]},u=l.get("id"),c=l.get("path"),m=l.get("children"),f=l.get("lazy");if(u){const t=e.resolve(u);if("StringLiteral"!==t.node.type)throw w(t.file,t.node,"route id; use a static string");p.id=t.node.value}if(c){const e=g(c.node);p.path="StringLiteral"===e?.type?e.value:null}if(m&&(p.children=this.parseValue(e,m,r,s)),f){const t=e.resolve(f);p.import=this.assetPath(I(t),t.file)}else{const t=l.get("Component")??l.get("element"),r=g(t?.node),o="Identifier"===r?.type?r.name:"JSXElement"===r?.type&&"JSXIdentifier"===r.openingElement.name.type?r.openingElement.name.name:void 0,n=t&&o?e.import(t.file,o):void 0;n?p.import=this.assetPath(n.source,t.file):t&&(p.import=t.file)}(r||p.import||p.children.length)&&a.push(p)}),a}assetPath(t,r){return t.startsWith(".")?e.resolve(e.dirname(r),t):t}static parseImportsMap(e){const t={};for(const r of e.program.body)if("ImportDeclaration"===r.type)for(const e of r.specifiers)t[e.local.name]={path:r.source.value,isDefault:"ImportDefaultSpecifier"===e.type};return t}static processRouteFileCode(t,r,o,y,h,v){t.node.properties.forEach(w=>{if(n(w)){const x=b(w);if("lazy"===x&&i(g(w.value))){const r=g(w.value),f=I({node:r,file:h}),d=t.node.properties.find(e=>n(e)&&"onlyClient"===b(e));if(w.value={type:"CallExpression",callee:{type:"Identifier",name:v},arguments:n(d)&&(s(d.value)||a(d.value)||i(d.value)||l(d.value))?[w.value,d.value]:[w.value]},d&&(t.node.properties=t.node.properties.filter(e=>e!==d)),y(),f){const r=t.findParent?.(e=>p(S.unwrapExpression(e.node)));if(r&&f&&o){const r=u(c("pathId"),m(f.startsWith(".")&&e.isAbsolute(h)?e.resolve(e.dirname(h),f):f));t.node.properties.splice(t.node.properties.indexOf(w)+1,0,r)}}}if("element"===x||"Component"===x){let n="";a(w.value)&&f(w.value.openingElement.name)?n=w.value.openingElement.name.name:l(w.value)&&(n=w.value.name);const i=t.findParent?.(e=>p(S.unwrapExpression(e.node))),s=r[n]?.path;if(i&&s&&o){const r=u(c("pathId"),m(s.startsWith(".")&&e.isAbsolute(h)?e.resolve(e.dirname(h),s):s));t.node.properties.splice(t.node.properties.indexOf(w)+1,0,r)}}const E=S.unwrapExpression(w.value);"children"===x&&p(E)&&E.elements.forEach(e=>{d(e)&&S.processRouteFileCode({node:e},r,o,y,h,v)})}})}static handleRoutes(e,t,o="routes"){if(!e)return e;const n=r.parse(e,{sourceType:"module",createImportExpressions:!0,plugins:["typescript","jsx"]});if(!n)return e;const i=S.parseImportsMap(n);let s=!1,a="n";return E(n,{Program(e){e.scope.hasBinding(a)&&(a=e.scope.generateUidIdentifier("importRoute").name)}}),E(n,{ObjectExpression(e){S.processRouteFileCode(e,i,t,()=>{s=!0},o,a)}}),s&&n.program.body.unshift({type:"ImportDeclaration",specifiers:[{type:"ImportDefaultSpecifier",local:{type:"Identifier",name:a}}],source:{type:"StringLiteral",value:`${y}/helpers/import-route`}}),x(n,{retainLines:!0}).code}}export{S as default,I as lazyImport};
|
|
2
2
|
//# sourceMappingURL=parse-routes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-routes.js","sources":["../../src/services/parse-routes.ts"],"sourcesContent":[null],"names":["generate","babelGenerate","default","traverse","babelTraverse","
|
|
1
|
+
{"version":3,"file":"parse-routes.js","sources":["../../src/services/parse-routes.ts"],"sourcesContent":[null],"names":["generate","babelGenerate","default","traverse","babelTraverse","lazyImport","node","file","value","unwrap","type","sourceError","result","body","length","argument","callee","property","name","object","imports","walk","child","source","push","ParseRoutes","config","viteAliases","static","constructor","this","parse","includeEmpty","clientFile","root","getParams","path","resolve","sources","SourceFiles","getVite","alias","calls","read","ast","imported","import","replace","PLUGIN_NAME","includes","exported","arguments","parseValue","ancestors","Set","has","next","results","elements","forEach","element","index","properties","route","children","id","get","routePath","lazy","resolved","literal","assetPath","component","componentNode","openingElement","undefined","specifier","startsWith","dirname","parseImportsMap","program","specifiers","local","isDefault","processRouteFileCode","nodePath","importsMap","shouldAddPathId","addImportRouteWrapper","filename","wrapperName","isObjectProperty","key","propertyName","isFunction","lazyValue","importPath","onlyClientProp","find","p","isBooleanLiteral","isJSXElement","isIdentifier","filter","parent","findParent","isArrayExpression","unwrapExpression","pathIdProperty","objectProperty","identifier","stringLiteral","isAbsolute","splice","indexOf","componentName","isJSXIdentifier","importName","isObjectExpression","handleRoutes","code","parser","sourceType","createImportExpressions","plugins","shouldAddRoutesImport","Program","scope","hasBinding","generateUidIdentifier","ObjectExpression","unshift","retainLines"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import t from"node:fs";import s from"path";class e{viteAliases;config;constructor(t,s){this.config=t,this.viteAliases=s??t.getVite()?.config?.resolve.alias}getAliases(){const t={};return this.viteAliases?.forEach(({find:s,replacement:e})=>{"string"==typeof s&&(t[s]=e)}),t}getImportPostfix(){return["","/index"].map(t=>["",".js",".ts",".tsx"].map(s=>`${t}${s}`)).flat()}getAppPath(t,e=!1){if(!t)return;const{root:i}=this.config.getParams();let r=t;if(t.startsWith("./")||t.startsWith("../"))r=s.resolve(i,t);else{const s=this.getAliases(),[e]=t.split("/");s[e]&&(r=t.replace(e,s[e]))}return r=r.split(s.win32.sep).join(s.posix.sep),e?r:r.replace(i,"").replace(/^(\/)|(\/)$/g,"")}findAppFile(s){const e=this.getImportPostfix();for(const i of e){const e=`${s}${i}`;if(t.existsSync(e)&&t.statSync(e).isFile())return e}return null}}export{e as default};
|
|
1
|
+
import t from"node:fs";import s from"path";class e{viteAliases;config;constructor(t,s){this.config=t,this.viteAliases=s??t.getVite()?.config?.resolve.alias}getAliases(){const t={};return this.viteAliases?.forEach(({find:s,replacement:e})=>{"string"==typeof s&&(t[s]=e)}),t}getImportPostfix(){return["","/index"].map(t=>["",".js",".ts",".tsx",".jsx",".mjs",".mts"].map(s=>`${t}${s}`)).flat()}getAppPath(t,e=!1){if(!t)return;const{root:i}=this.config.getParams();let r=t;if(t.startsWith("./")||t.startsWith("../"))r=s.resolve(i,t);else{const s=this.getAliases(),[e]=t.split("/");s[e]&&(r=t.replace(e,s[e]))}return r=r.split(s.win32.sep).join(s.posix.sep),e?r:r.replace(i,"").replace(/^(\/)|(\/)$/g,"")}findAppFile(s){const e=this.getImportPostfix();for(const i of e){const e=`${s}${i}`;if(t.existsSync(e)&&t.statSync(e).isFile())return e}return null}}export{e as default};
|
|
2
2
|
//# sourceMappingURL=path-normalize.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-normalize.js","sources":["../../src/services/path-normalize.ts"],"sourcesContent":[null],"names":["PathNormalize","viteAliases","config","constructor","this","getVite","resolve","alias","getAliases","aliases","forEach","find","replacement","getImportPostfix","map","prefix","ext","flat","getAppPath","appPath","withRoot","root","getParams","fullPath","startsWith","path","routeAlias","split","replace","win32","sep","join","posix","findAppFile","basePath","postfixes","postfix","filepath","fs","existsSync","statSync","isFile"],"mappings":"2CAQA,MAAMA,EAIeC,YAKAC,OAKnB,WAAAC,CAAYD,EAAsBD,GAChCG,KAAKF,OAASA,EACdE,KAAKH,YAAcA,GAAeC,EAAOG,WAAWH,QAAQI,QAAQC,KACtE,CAKO,UAAAC,GACL,MAAMC,EAAkC,CAAA,EAUxC,OARAL,KAAKH,aAAaS,QAAQ,EAAGC,OAAMC,kBACb,iBAATD,IAIXF,EAAQE,GAAQC,KAGXH,CACT,CAKO,gBAAAI,GACL,MAAO,CAAC,GAAI,UACTC,IAAKC,
|
|
1
|
+
{"version":3,"file":"path-normalize.js","sources":["../../src/services/path-normalize.ts"],"sourcesContent":[null],"names":["PathNormalize","viteAliases","config","constructor","this","getVite","resolve","alias","getAliases","aliases","forEach","find","replacement","getImportPostfix","map","prefix","ext","flat","getAppPath","appPath","withRoot","root","getParams","fullPath","startsWith","path","routeAlias","split","replace","win32","sep","join","posix","findAppFile","basePath","postfixes","postfix","filepath","fs","existsSync","statSync","isFile"],"mappings":"2CAQA,MAAMA,EAIeC,YAKAC,OAKnB,WAAAC,CAAYD,EAAsBD,GAChCG,KAAKF,OAASA,EACdE,KAAKH,YAAcA,GAAeC,EAAOG,WAAWH,QAAQI,QAAQC,KACtE,CAKO,UAAAC,GACL,MAAMC,EAAkC,CAAA,EAUxC,OARAL,KAAKH,aAAaS,QAAQ,EAAGC,OAAMC,kBACb,iBAATD,IAIXF,EAAQE,GAAQC,KAGXH,CACT,CAKO,gBAAAI,GACL,MAAO,CAAC,GAAI,UACTC,IAAKC,GACJ,CAAC,GAAI,MAAO,MAAO,OAAQ,OAAQ,OAAQ,QAAQD,IAAKE,GAAQ,GAAGD,IAASC,MAE7EC,MACL,CAKO,UAAAC,CAAWC,EAAkBC,GAAW,GAC7C,IAAKD,EACH,OAGF,MAAME,KAAEA,GAASjB,KAAKF,OAAOoB,YAC7B,IAAIC,EAAWJ,EAGf,GAAIA,EAAQK,WAAW,OAASL,EAAQK,WAAW,OACjDD,EAAWE,EAAKnB,QAAQe,EAAMF,OACzB,CAEL,MAAMV,EAAUL,KAAKI,cAEdkB,GAAcP,EAAQQ,MAAM,KAE/BlB,EAAQiB,KACVH,EAAWJ,EAAQS,QAAQF,EAAYjB,EAAQiB,IAEnD,CAKA,OAFAH,EAAWA,EAASI,MAAMF,EAAKI,MAAMC,KAAKC,KAAKN,EAAKO,MAAMF,KAEtDV,EACKG,EAGFA,EAASK,QAAQP,EAAM,IAAIO,QAAQ,eAAgB,GAC5D,CAKO,WAAAK,CAAYC,GACjB,MAAMC,EAAY/B,KAAKS,mBAEvB,IAAK,MAAMuB,KAAWD,EAAW,CAC/B,MAAME,EAAW,GAAGH,IAAWE,IAE/B,GAAIE,EAAGC,WAAWF,IAAaC,EAAGE,SAASH,GAAUI,SACnD,OAAOJ,CAEX,CAEA,OAAO,IACT"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { File, Node, ObjectExpression, ImportDeclaration } from '@babel/types';
|
|
2
|
+
import type { Alias } from 'vite';
|
|
3
|
+
export interface ISourceValue {
|
|
4
|
+
node: Node;
|
|
5
|
+
file: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ISourceFile {
|
|
8
|
+
code: string;
|
|
9
|
+
ast: File;
|
|
10
|
+
}
|
|
11
|
+
/** Strip syntax that has no runtime effect. */
|
|
12
|
+
export declare const unwrap: (node: Node | null | undefined) => Node | undefined;
|
|
13
|
+
/** Walk syntax without evaluating application code or following type metadata. */
|
|
14
|
+
export declare const walk: (node: Node, visit: (child: Node) => void) => void;
|
|
15
|
+
/** A single actionable error, including the original source location. */
|
|
16
|
+
export declare const sourceError: (file: string, node: Node | undefined, construct: string) => Error;
|
|
17
|
+
/** Property names whose meaning is known without executing an expression. */
|
|
18
|
+
export declare const propertyName: (node: ObjectExpression["properties"][number]) => string | undefined;
|
|
19
|
+
/** Static module bindings shared by migration and route analysis. */
|
|
20
|
+
declare class SourceFiles {
|
|
21
|
+
private readonly aliases;
|
|
22
|
+
private readonly files;
|
|
23
|
+
constructor(aliases?: Alias[]);
|
|
24
|
+
read(file: string): ISourceFile;
|
|
25
|
+
import(file: string, name: string): {
|
|
26
|
+
source: string;
|
|
27
|
+
exported: string;
|
|
28
|
+
declaration: ImportDeclaration;
|
|
29
|
+
} | undefined;
|
|
30
|
+
filename(specifier: string, importer: string, node?: Node): string;
|
|
31
|
+
exported(file: string, name?: string, seen?: Set<string>): ISourceValue;
|
|
32
|
+
resolve(value: ISourceValue, seen?: Set<string>): ISourceValue;
|
|
33
|
+
properties(value: ISourceValue, ancestors?: Set<Node>): Map<string, ISourceValue>;
|
|
34
|
+
}
|
|
35
|
+
export default SourceFiles;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import e from"node:fs";import t from"node:path";import{parse as r}from"@babel/parser";import{VISITOR_KEYS as i}from"@babel/types";const o=e=>{switch(e?.type){case"TSSatisfiesExpression":case"TSAsExpression":case"TSTypeAssertion":case"TSNonNullExpression":case"ParenthesizedExpression":return o(e.expression);default:return e??void 0}},s=(e,t)=>{t(e);for(const r of i[e.type]??[]){const i=Reflect.get(e,r);for(const e of Array.isArray(i)?i:[i])e&&"object"==typeof e&&"type"in e&&s(e,t)}},n=(e,t,r)=>new Error(`${e}:${t?.loc?.start.line??1}:${(t?.loc?.start.column??0)+1}: Unsupported ${r} (${t?.type??"undefined"}).`),a=e=>{if("SpreadElement"!==e.type)return"StringLiteral"===e.key.type?e.key.value:e.computed||"Identifier"!==e.key.type?void 0:e.key.name};class p{aliases;files=new Map;constructor(e=[]){this.aliases=e}read(t){const i=this.files.get(t);if(i)return i;let o;try{o=e.readFileSync(t,"utf8")}catch{throw n(t,void 0,"missing source file")}try{const e={code:o,ast:r(o,{sourceType:"module",createImportExpressions:!0,plugins:["typescript","jsx"]})};return this.files.set(t,e),e}catch(e){throw new Error(`${t}: ${String(e.message)}`)}}import(e,t){for(const r of this.read(e).ast.program.body){if("ImportDeclaration"!==r.type||"type"===r.importKind)continue;const e=r.specifiers.find(e=>e.local.name===t);if("ImportDefaultSpecifier"===e?.type)return{source:r.source.value,exported:"default",declaration:r};if("ImportSpecifier"===e?.type&&"type"!==e.importKind)return{source:r.source.value,exported:"Identifier"===e.imported.type?e.imported.name:e.imported.value,declaration:r}}}filename(r,i,o){let s=r;for(const{find:e,replacement:t}of this.aliases)if("string"==typeof e?s===e||s.startsWith(`${e}/`):e.test(s)){s=s.replace(e,t);break}if(!t.isAbsolute(s)){if(!s.startsWith("."))throw n(i,o,`unresolvable import ${JSON.stringify(r)}`);s=t.resolve(t.dirname(i),s)}for(const t of["",".js",".ts",".tsx",".jsx",".mjs",".mts",".cjs",".cts","/index.js","/index.ts","/index.tsx","/index.jsx"]){const r=`${s}${t}`;if(e.existsSync(r)&&e.statSync(r).isFile())return r}throw n(i,o,`missing import ${JSON.stringify(r)}`)}exported(e,t="default",r=new Set){const i=`${e}#export:${t}`;if(r.has(i))throw n(e,void 0,`circular export ${t}`);r.add(i);for(const i of this.read(e).ast.program.body){if("ExportDefaultDeclaration"===i.type&&"default"===t)return this.resolve({node:i.declaration,file:e},r);if("ExportNamedDeclaration"===i.type){if("VariableDeclaration"===i.declaration?.type){const o=i.declaration.declarations.find(e=>"Identifier"===e.id.type&&e.id.name===t);if(o?.init)return this.resolve({node:o.init,file:e},r)}for(const o of i.specifiers){if(("Identifier"===o.exported.type?o.exported.name:o.exported.value)===t&&"ExportSpecifier"===o.type)return i.source?this.exported(this.filename(i.source.value,e,i),o.local.name,r):this.resolve({node:o.local,file:e},r)}}}throw n(e,void 0,`missing export ${JSON.stringify(t)}`)}resolve(e,t=new Set){const{file:r}=e,i=o(e.node);if("Identifier"!==i.type)return{node:i,file:r};const s=`${r}#${i.name}`;if(t.has(s))throw n(r,i,`circular binding ${i.name}`);t.add(s);const a=this.import(r,i.name);if(a)return this.exported(this.filename(a.source,r,i),a.exported,t);for(const e of this.read(r).ast.program.body){const o="ExportNamedDeclaration"===e.type?e.declaration:e;if("VariableDeclaration"===o?.type){const e=o.declarations.find(e=>"Identifier"===e.id.type&&e.id.name===i.name);if(e?.init)return this.resolve({node:e.init,file:r},t)}if("FunctionDeclaration"===o?.type&&o.id?.name===i.name)return{node:o,file:r}}throw n(r,i,`unresolved binding ${i.name}`)}properties(e,t=new Set){const{node:r,file:i}=this.resolve(e);if("ObjectExpression"!==r.type||t.has(r))throw n(i,r,"route object / object spread; use a static object");const o=new Set([...t,r]),s=new Map;for(const e of r.properties){if("SpreadElement"===e.type){for(const[t,r]of this.properties({node:e.argument,file:i},o))s.set(t,r);continue}const t=a(e);if(void 0===t)throw n(i,e,"computed route key; use a string literal");s.set(t,{node:"ObjectProperty"===e.type?e.value:e,file:i})}return s}}export{p as default,a as propertyName,n as sourceError,o as unwrap,s as walk};
|
|
2
|
+
//# sourceMappingURL=source-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-files.js","sources":["../../src/services/source-files.ts"],"sourcesContent":[null],"names":["unwrap","node","type","expression","undefined","walk","visit","key","VISITOR_KEYS","value","Reflect","get","child","Array","isArray","sourceError","file","construct","Error","loc","start","line","column","propertyName","computed","name","SourceFiles","aliases","files","Map","constructor","this","read","cached","code","fs","readFileSync","result","ast","parse","sourceType","createImportExpressions","plugins","set","error","String","message","import","program","body","importKind","specifier","specifiers","find","item","local","source","exported","declaration","imported","filename","importer","replacement","startsWith","test","replace","path","isAbsolute","JSON","stringify","resolve","dirname","suffix","candidate","existsSync","statSync","isFile","seen","Set","has","add","declarations","id","init","statement","binding","properties","ancestors","next","property","entry","argument"],"mappings":"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"}
|
package/services/ssr-manifest.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"node:fs";import s from"node:path";import t from"chalk";import i from"./parse-routes.js";import r from"./path-normalize.js";import o,{AssetType as a}from"./route-assets.js";class n extends o{static instance=null;config;pathNormalize;root;buildDir;manifestName="manifest.json";viteAliases;basename;renderBuiltUrl;constructor(e,{buildDir:t,viteAliases:i,basename:o,renderBuiltUrl:a}={}){super(s.resolve(e.getParams().root,t||""),e.isModulePreload),this.config=e,this.root=e.getParams().root,this.buildDir=t,this.viteAliases=i??e.getVite()?.config?.resolve.alias,this.pathNormalize=new r(e,i),this.basename=o,this.renderBuiltUrl=a}static get(e,s={}){return null===n.instance&&(n.instance=new n(e,s)),n.instance}get isDev(){return Boolean(this.config.getVite())}getOutDir(){return s.resolve(this.root,this.buildDir||"")}getAssetsManifestFile(){return`${this.getOutDir()}/server/assets-manifest.json`}loadClientManifest(){const t=s.resolve(this.root,`${this.buildDir||""}/client/.vite`),i=`${t}/${this.manifestName}`;if(!e.existsSync(i))return{};const r=JSON.parse(e.readFileSync(i,{encoding:"utf-8"}));return e.rmSync(i),0===e.readdirSync(t).length&&e.rmSync(t,{recursive:!0}),r}getRoutesTreeIds(e,s){const t={};return e.forEach(
|
|
1
|
+
import e from"node:fs";import s from"node:path";import t from"chalk";import i from"./parse-routes.js";import r from"./path-normalize.js";import o,{AssetType as a}from"./route-assets.js";class n extends o{static instance=null;config;pathNormalize;root;buildDir;manifestName="manifest.json";viteAliases;basename;renderBuiltUrl;constructor(e,{buildDir:t,viteAliases:i,basename:o,renderBuiltUrl:a}={}){super(s.resolve(e.getParams().root,t||""),e.isModulePreload),this.config=e,this.root=e.getParams().root,this.buildDir=t,this.viteAliases=i??e.getVite()?.config?.resolve.alias,this.pathNormalize=new r(e,i),this.basename=o,this.renderBuiltUrl=a}static get(e,s={}){return null===n.instance&&(n.instance=new n(e,s)),n.instance}get isDev(){return Boolean(this.config.getVite())}getOutDir(){return s.resolve(this.root,this.buildDir||"")}getAssetsManifestFile(){return`${this.getOutDir()}/server/assets-manifest.json`}loadClientManifest(){const t=s.resolve(this.root,`${this.buildDir||""}/client/.vite`),i=`${t}/${this.manifestName}`;if(!e.existsSync(i))return{};const r=JSON.parse(e.readFileSync(i,{encoding:"utf-8"}));return e.rmSync(i),0===e.readdirSync(t).length&&e.rmSync(t,{recursive:!0}),r}getRoutesTreeIds(e,s){const t={};return e.forEach(e=>{const i=[s,String(e.index)].filter(Boolean).join("-"),r=e.id??i;e.import&&(t[r]=this.pathNormalize.getAppPath(e.import)),e.children.length>0&&Object.assign(t,this.getRoutesTreeIds(e.children,i))}),t}getRouteAssets(e,t,i=!1){const r=[...t?.assets??[],...t?.css??[],t?.file].reduce((e,r)=>{if(r){const o=this.getAssetType(r),a=t.isEntry&&t.file===r;if(o){const t=s.posix.normalize(`${this.basename}/${r}`),n=this.renderBuiltUrl?.(t,{type:"asset",ssr:!0,hostId:"",hostType:t.split(".").at(-1)?.toLowerCase()});e[r]={url:"string"==typeof n?n:t,weight:a?1.9:this.getAssetWeight(r),type:o,isNested:i,isPreload:!a}}}return e},{});return t?.imports?.length&&t.imports.forEach(s=>{const t=e[s];t&&Object.assign(r,this.getRouteAssets(e,t,!0))}),r}buildRoutesManifest(){const s=this.loadClientManifest(),t=new i(this.config,this.viteAliases),r=this.getRoutesTreeIds(t.parse()),o=this.pathNormalize.getImportPostfix(),a={};Object.entries(r).forEach(([e,t])=>{const i=o.find(e=>void 0!==s[`${t}${e}`]),r=s[`${t}${i||""}`];a[e]=this.sortAssets(Object.values(this.getRouteAssets(s,r)))}),e.writeFileSync(this.getAssetsManifestFile(),JSON.stringify(a,null,2),{encoding:"utf-8"})}getAssets(e){return this.isDev?this.getAssetsDev(e):super.getAssets(e)}getDevModules(e){const t=e?.map(({route:e})=>this.pathNormalize.getAppPath(e?.pathId,!0)).filter(Boolean)??[],i=this.pathNormalize.getImportPostfix(),r=this.config.getPluginConfig(),o=[r?.clientFile??"client.ts",r?.serverFile??"server.ts"].map(e=>s.resolve(this.root,e)),a=[];return[...o,...t].forEach(e=>{for(const s of i){const t=this.config.getVite()?.moduleGraph.getModuleById(`${e}${s}`);if(t){a.push(t);break}}}),a}async prepareDevAssets(e){const s=this.config.getVite();if(!s)return;const t=new Set,i=async e=>{t.has(e.url)||(t.add(e.url),e.file&&/\.(?:css|less|s[ac]ss|styl(?:us)?|pcss|postcss)$/.test(e.file)&&await s.transformRequest(e.url),await Promise.all([...e.importedModules].map(i)))};await Promise.all(this.getDevModules(e).map(i))}getAssetsDev(e){const s=Object.assign({},...this.getDevModules(e).map(e=>this.getModuleAssets(e)));return Object.values(s)}getModuleAssets(e,s=new Set){const i=e?.importedModules??e?.clientImportedModules;if(!i?.size||s.has(e.file))return{};let r={};return s.add(e.file),i.forEach(e=>{const{file:i,transformResult:o}=e,n=i?.split(".").at(-1);if(i&&n&&["css","scss","sass","less","styl","stylus","pcss","postcss"].includes(n)){const e=o?.code.match(/__vite__css\s+=\s+"(?<css>.+)"/)?.groups?.css;if(e)try{r[i]={type:a.style,url:i,weight:this.getAssetWeight(i),content:JSON.parse(`{"style": "${e}"}`).style,isNested:Boolean(s.size),isPreload:!1}}catch{console.warn(t.yellowBright("Failed to parse style: ",i))}}else r={...r,...this.getModuleAssets(e,s)}}),r}getAssetWeight(e){switch(this.getAssetType(e)){case a.style:return 1;case a.script:return 2;default:return 3}}getAssetType(e){const s=e.split(".").at(-1)?.toLowerCase();switch(s){case"css":case"scss":return a.style;case"js":return a.script;case"svg":case"jpg":case"jpeg":case"png":case"webp":case"gif":case"ico":return a.image;case"ttf":case"otf":case"woff":case"woff2":return a.font;default:return null}}}export{n as default};
|
|
2
2
|
//# sourceMappingURL=ssr-manifest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssr-manifest.js","sources":["../../src/services/ssr-manifest.ts"],"sourcesContent":[null],"names":["SsrManifest","RouteAssets","static","config","pathNormalize","root","buildDir","manifestName","viteAliases","basename","renderBuiltUrl","constructor","super","path","resolve","getParams","isModulePreload","this","getVite","alias","PathNormalize","get","params","instance","isDev","Boolean","getOutDir","getAssetsManifestFile","loadClientManifest","clientManifestDir","clientSsrManifest","fs","existsSync","result","JSON","parse","readFileSync","encoding","rmSync","readdirSync","length","recursive","getRoutesTreeIds","routes","index","forEach","route","
|
|
1
|
+
{"version":3,"file":"ssr-manifest.js","sources":["../../src/services/ssr-manifest.ts"],"sourcesContent":[null],"names":["SsrManifest","RouteAssets","static","config","pathNormalize","root","buildDir","manifestName","viteAliases","basename","renderBuiltUrl","constructor","super","path","resolve","getParams","isModulePreload","this","getVite","alias","PathNormalize","get","params","instance","isDev","Boolean","getOutDir","getAssetsManifestFile","loadClientManifest","clientManifestDir","clientSsrManifest","fs","existsSync","result","JSON","parse","readFileSync","encoding","rmSync","readdirSync","length","recursive","getRoutesTreeIds","routes","index","forEach","route","position","String","filter","join","routeId","id","import","getAppPath","children","Object","assign","getRouteAssets","manifest","module","isNested","assets","css","file","reduce","res","asset","type","getAssetType","isEntry","filename","posix","normalize","modifiedFilename","ssr","hostId","hostType","split","at","toLowerCase","url","weight","getAssetWeight","isPreload","imports","nestedAsset","nestedModule","buildRoutesManifest","routesService","ParseRoutes","routesPaths","postfixes","getImportPostfix","entries","routePath","routePostfix","find","postfix","undefined","routeMeta","sortAssets","values","writeFileSync","stringify","getAssets","getAssetsDev","getDevModules","routeIds","map","pathId","pluginConfig","getPluginConfig","rootIds","clientFile","serverFile","modules","moduleId","ext","moduleGraph","getModuleById","push","prepareDevAssets","vite","visited","Set","visit","async","has","add","test","transformRequest","Promise","all","importedModules","getModuleAssets","skipModules","clientImportedModules","size","subModule","transformResult","includes","code","match","groups","AssetType","style","content","console","warn","chalk","yellowBright","script","image","font"],"mappings":"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"}
|