@promakeai/cli 0.9.6 → 0.9.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/template/bun.lock +5 -4
- package/template/package.json +4 -3
- package/template/src/db/index.ts +3 -3
- package/template/src/db/provider.tsx +3 -2
- package/template/vite.config.ts +84 -85
package/dist/index.js
CHANGED
|
@@ -515,7 +515,7 @@ For (2), check out our guide on configuring puppeteer at https://pptr.dev/guides
|
|
|
515
515
|
2. your cache path is incorrectly configured (which is: ${this.puppeteer.configuration.cacheDirectory}).
|
|
516
516
|
For (2), check out our guide on configuring puppeteer at https://pptr.dev/guides/configuration.`)}}return D}}C_();import B$1 from"node:fs";var U$1={force:!0,recursive:!0,maxRetries:5};async function lM(X){await B$1.promises.rm(X,U$1)}class __ extends hV{constructor(X){super(X,"chrome")}launch(X={}){if(this.puppeteer.configuration.logLevel==="warn"&&process.platform==="darwin"&&process.arch==="x64"){if(M$1.cpus()[0]?.model.includes("Apple"))console.warn(["\x1B[1m\x1B[43m\x1B[30m","Degraded performance warning:\x1B[0m\x1B[33m","Launching Chrome on Mac Silicon (arm64) from an x64 Node installation results in","Rosetta translating the Chrome binary, even if Chrome is already arm64. This would","result in huge performance issues. To resolve this, you must run Puppeteer with","a version of Node built for arm64."].join(`
|
|
517
517
|
`))}return super.launch(X)}async computeLaunchArguments(X={}){let{ignoreDefaultArgs:Z=!1,args:D=[],pipe:J=!1,debuggingPort:Y,channel:Q,executablePath:$}=X,K=[];if(!Z)K.push(...this.defaultArgs(X));else if(Array.isArray(Z))K.push(...this.defaultArgs(X).filter((q)=>{return!Z.includes(q)}));else K.push(...D);if(!K.some((q)=>{return q.startsWith("--remote-debugging-")}))if(J)M0(!Y,"Browser should be launched with either pipe or debugging port - not both."),K.push("--remote-debugging-pipe");else K.push(`--remote-debugging-port=${Y||0}`);let G=!1,V=K.findIndex((q)=>{return q.startsWith("--user-data-dir")});if(V<0)G=!0,K.push(`--user-data-dir=${await O$1(this.getProfilePath())}`),V=K.length-1;let W=K[V].split("=",2)[1];M0(typeof W==="string","`--user-data-dir` is malformed");let F=$;if(!F)M0(Q||!this.puppeteer._isPuppeteerCore,"An `executablePath` or `channel` must be specified for `puppeteer-core`"),F=Q?this.executablePath(Q):this.resolveExecutablePath(X.headless??!0);return{executablePath:F,args:K,isTempUserDataDir:G,userDataDir:W}}async cleanUserDataDir(X,Z){if(Z.isTemp)try{await lM(X)}catch(D){throw R0(D),D}}defaultArgs(X={}){let Z=kF0("--disable-features",X.args);if(X.args&&Z.length>0)hF0(X.args,"--disable-features");let J=["Translate","AcceptCHFrame","MediaRouter","OptimizationHints","RenderDocument",...process.env.PUPPETEER_TEST_EXPERIMENTAL_CHROME_FEATURES==="true"?[]:["ProcessPerSiteUpToMainFrameThreshold","IsolateSandboxedIframes"],...Z].filter((q)=>{return q!==""}),Y=kF0("--enable-features",X.args);if(X.args&&Y.length>0)hF0(X.args,"--enable-features");let Q=["PdfOopif",...Y].filter((q)=>{return q!==""}),$=["--allow-pre-commit-input","--disable-background-networking","--disable-background-timer-throttling","--disable-backgrounding-occluded-windows","--disable-breakpad","--disable-client-side-phishing-detection","--disable-component-extensions-with-background-pages","--disable-crash-reporter","--disable-default-apps","--disable-dev-shm-usage","--disable-hang-monitor","--disable-infobars","--disable-ipc-flooding-protection","--disable-popup-blocking","--disable-prompt-on-repost","--disable-renderer-backgrounding","--disable-search-engine-choice-screen","--disable-sync","--enable-automation","--export-tagged-pdf","--force-color-profile=srgb","--generate-pdf-document-outline","--metrics-recording-only","--no-first-run","--password-store=basic","--use-mock-keychain",`--disable-features=${J.join(",")}`,`--enable-features=${Q.join(",")}`].filter((q)=>{return q!==""}),{devtools:K=!1,headless:G=!K,args:V=[],userDataDir:W,enableExtensions:F=!1}=X;if(W)$.push(`--user-data-dir=${L$1.resolve(W)}`);if(K)$.push("--auto-open-devtools-for-tabs");if(G)$.push(G==="shell"?"--headless":"--headless=new","--hide-scrollbars","--mute-audio");if($.push(F?"--enable-unsafe-extension-debugging":"--disable-extensions"),V.every((q)=>{return q.startsWith("-")}))$.push("about:blank");return $.push(...V),$}executablePath(X,Z=!0){if(X)return yQ({browser:c0.CHROME,channel:w_(X)});else return this.resolveExecutablePath(void 0,Z)}}function kF0(X,Z=[]){return Z.filter((D)=>{return D.startsWith(X.endsWith("=")?X:`${X}=`)}).map((D)=>{return D.split(new RegExp(`${X}=\\s*`))[1]?.trim()}).filter((D)=>{return D})}function hF0(X,Z){let D=new RegExp(`^${Z}=.*`),J=0;while(J<X.length)if(D.test(X[J]))X.splice(J,1);else J++;return X}CD();z1();import N$1 from"node:fs";import{rename as A$1,unlink as R$1,mkdtemp as E$1}from"node:fs/promises";import I$1 from"node:os";import yF0 from"node:path";class iM extends hV{constructor(X){super(X,"firefox")}static getPreferences(X){return{...X,"fission.webContentIsolationStrategy":0}}async computeLaunchArguments(X={}){let{ignoreDefaultArgs:Z=!1,args:D=[],executablePath:J,pipe:Y=!1,extraPrefsFirefox:Q={},debuggingPort:$=null}=X,K=[];if(!Z)K.push(...this.defaultArgs(X));else if(Array.isArray(Z))K.push(...this.defaultArgs(X).filter((q)=>{return!Z.includes(q)}));else K.push(...D);if(!K.some((q)=>{return q.startsWith("--remote-debugging-")})){if(Y)M0($===null,"Browser should be launched with either pipe or debugging port - not both.");K.push(`--remote-debugging-port=${$||0}`)}let G,V=!0,W=K.findIndex((q)=>{return["-profile","--profile"].includes(q)});if(W!==-1){if(G=K[W+1],!G)throw Error("Missing value for profile command line argument");V=!1}else G=await E$1(this.getProfilePath()),K.push("--profile"),K.push(G);await eO(c0.FIREFOX,{path:G,preferences:iM.getPreferences(Q)});let F;if(this.puppeteer._isPuppeteerCore||J)M0(J,"An `executablePath` must be specified for `puppeteer-core`"),F=J;else F=this.executablePath(void 0);return{isTempUserDataDir:V,userDataDir:G,args:K,executablePath:F}}async cleanUserDataDir(X,Z){if(Z.isTemp)try{await lM(X)}catch(D){throw R0(D),D}else try{let J=["prefs.js","user.js"],Y=await Promise.allSettled(J.map(async(Q)=>{let $=yF0.join(X,Q+".puppeteer");if(N$1.existsSync($)){let K=yF0.join(X,Q);await R$1(K),await A$1($,K)}}));for(let Q of Y)if(Q.status==="rejected")throw Q.reason}catch(D){R0(D)}}executablePath(X,Z=!0){return this.resolveExecutablePath(void 0,Z)}defaultArgs(X={}){let{devtools:Z=!1,headless:D=!Z,args:J=[],userDataDir:Y=null}=X,Q=[];switch(I$1.platform()){case"darwin":Q.push("--foreground");break;case"win32":Q.push("--wait-for-browser");break}if(Y)Q.push("--profile"),Q.push(Y);if(D)Q.push("--headless");if(Z)Q.push("--devtools");if(J.every(($)=>{return $.startsWith("-")}))Q.push("about:blank");return Q.push(...J),Q}}CD();class k_ extends x_{#X;#Z;defaultBrowserRevision;configuration={};constructor(X){let{configuration:Z,...D}=X;super(D);if(Z)this.configuration=Z;switch(this.configuration.defaultBrowser){case"firefox":this.defaultBrowserRevision=tQ.firefox;break;default:this.configuration.defaultBrowser="chrome",this.defaultBrowserRevision=tQ.chrome;break}this.connect=this.connect.bind(this),this.launch=this.launch.bind(this),this.executablePath=this.executablePath.bind(this),this.defaultArgs=this.defaultArgs.bind(this),this.trimCache=this.trimCache.bind(this)}connect(X){return super.connect(X)}launch(X={}){let{browser:Z=this.defaultBrowser}=X;switch(this.#Z=Z,Z){case"chrome":this.defaultBrowserRevision=tQ.chrome;break;case"firefox":this.defaultBrowserRevision=tQ.firefox;break;default:throw Error(`Unknown product: ${Z}`)}return this.#X=this.#D(Z),this.#X.launch(X)}#D(X){if(this.#X&&this.#X.browser===X)return this.#X;switch(X){case"chrome":return new __(this);case"firefox":return new iM(this);default:throw Error(`Unknown product: ${X}`)}}executablePath(X){if(X===void 0)return this.#D(this.lastLaunchedBrowser).executablePath(void 0,!1);if(typeof X==="string")return this.#D("chrome").executablePath(X,!1);return this.#D(X.browser??this.lastLaunchedBrowser).resolveExecutablePath(X.headless,!1)}get browserVersion(){return this.configuration?.[this.lastLaunchedBrowser]?.version??this.defaultBrowserRevision}get defaultDownloadPath(){return this.configuration.cacheDirectory}get lastLaunchedBrowser(){return this.#Z??this.defaultBrowser}get defaultBrowser(){return this.configuration.defaultBrowser??"chrome"}get product(){return this.lastLaunchedBrowser}defaultArgs(X={}){return this.#D(X.browser??this.lastLaunchedBrowser).defaultArgs(X)}async trimCache(){let X=N8();if(!X)throw Error("The current platform is not supported.");let Z=this.configuration.cacheDirectory,D=await jM({cacheDir:Z}),J=[{product:"chrome",browser:c0.CHROME,currentBuildId:""},{product:"firefox",browser:c0.FIREFOX,currentBuildId:""}];for(let $ of J){let K=this.configuration?.[$.product]?.version??tQ[$.product];$.currentBuildId=await kQ($.browser,X,K)}let Y=new Set(J.map(($)=>{return`${$.browser}_${$.currentBuildId}`})),Q=new Set(J.map(($)=>{return $.browser}));for(let $ of D){if(!Q.has($.browser))continue;if(Y.has(`${$.browser}_${$.buildId}`))continue;await IM({browser:$.browser,platform:X,cacheDir:Z,buildId:$.buildId})}}}F4();z6();z1();B2();W5();var fF0=P1(_2(),1);import{spawn as w$1,spawnSync as C$1}from"node:child_process";import P$1 from"node:fs";import x$1 from"node:os";import{dirname as S$1}from"node:path";import{PassThrough as _$1}from"node:stream";var j$1=function(X,Z,D){var J=arguments.length>2;for(var Y=0;Y<Z.length;Y++)D=J?Z[Y].call(X,D):Z[Y].call(X);return J?D:void 0},vF0=function(X,Z,D,J,Y,Q){function $(O){if(O!==void 0&&typeof O!=="function")throw TypeError("Function expected");return O}var K=J.kind,G=K==="getter"?"get":K==="setter"?"set":"value",V=!Z&&X?J.static?X:X.prototype:null,W=Z||(V?Object.getOwnPropertyDescriptor(V,J.name):{}),F,q=!1;for(var H=D.length-1;H>=0;H--){var z={};for(var B in J)z[B]=B==="access"?{}:J[B];for(var B in J.access)z.access[B]=J.access[B];z.addInitializer=function(O){if(q)throw TypeError("Cannot add initializers after decoration has completed");Q.push($(O||null))};var U=(0,D[H])(K==="accessor"?{get:W.get,set:W.set}:W[G],z);if(K==="accessor"){if(U===void 0)continue;if(U===null||typeof U!=="object")throw TypeError("Object expected");if(F=$(U.get))W.get=F;if(F=$(U.set))W.set=F;if(F=$(U.init))Y.unshift(F)}else if(F=$(U))if(K==="field")Y.unshift(F);else W[G]=F}if(V)Object.defineProperty(V,J.name,W);q=!0},T$1=function(X,Z,D){if(typeof Z==="symbol")Z=Z.description?"[".concat(Z.description,"]"):"";return Object.defineProperty(X,"name",{configurable:!0,value:D?"".concat(D," ",Z):Z})},k$1=30,bF0=30,h$1=fF0.default("puppeteer:ffmpeg"),uF0=(()=>{let X=_$1,Z=[],D,J,Y;return class extends X{static{let $=typeof Symbol==="function"&&Symbol.metadata?Object.create(X[Symbol.metadata]??null):void 0;if(vF0(this,J={value:T$1(async function(K){let G=await new Promise((V)=>{this.#Z.stdin.write(K,V)});if(G)console.log(`ffmpeg failed to write: ${G.message}.`)},"#writeFrame")},D,{kind:"method",name:"#writeFrame",static:!1,private:!0,access:{has:(K)=>(#$ in K),get:(K)=>K.#$},metadata:$},null,Z),vF0(this,null,Y,{kind:"method",name:"stop",static:!1,private:!1,access:{has:(K)=>("stop"in K),get:(K)=>K.stop},metadata:$},null,Z),$)Object.defineProperty(this,Symbol.metadata,{enumerable:!0,configurable:!0,writable:!0,value:$})}#X=j$1(this,Z);#Z;#D=new AbortController;#J;#Q;constructor($,K,G,{ffmpegPath:V,speed:W,scale:F,crop:q,format:H,fps:z,loop:B,delay:U,quality:O,colors:M,path:L,overwrite:N}={}){super({allowHalfOpen:!1});V??="ffmpeg",H??="webm",z??=bF0,B||=-1,U??=-1,O??=k$1,M??=256,N??=!0,this.#Q=z;let{error:E}=C$1(V);if(E)throw E;let P=[`crop='min(${K},iw):min(${G},ih):0:0'`,`pad=${K}:${G}:0:0`];if(W)P.push(`setpts=${1/W}*PTS`);if(q)P.push(`crop=${q.width}:${q.height}:${q.x}:${q.y}`);if(F)P.push(`scale=iw*${F}:-1:flags=lanczos`);let I=this.#Y(H,z,B,U,O,M),T=I.indexOf("-vf");if(T!==-1)P.push(I.splice(T,2).at(-1)??"");if(L)P$1.mkdirSync(S$1(L),{recursive:N});this.#Z=w$1(V,[["-loglevel","error"],["-avioflags","direct"],["-fpsprobesize","0","-probesize","32","-analyzeduration","0","-fflags","nobuffer"],["-f","image2pipe","-vcodec","png","-i","pipe:0"],["-an"],["-threads","1"],["-framerate",`${z}`],["-b:v","0"],I,["-vf",P.join()],[N?"-y":"-n"],"pipe:1"].flat(),{stdio:["pipe","pipe","pipe"]}),this.#Z.stdout.pipe(this),this.#Z.stderr.on("data",(g)=>{h$1(g.toString("utf8"))}),this.#X=$;let{client:w}=this.#X.mainFrame();w.once(b1.Disconnected,()=>{this.stop().catch(R0)}),this.#J=C10(g1(w,"Page.screencastFrame").pipe(wZ((g)=>{w.send("Page.screencastFrameAck",{sessionId:g.sessionId})}),x6((g)=>{return g.metadata.timestamp!==void 0}),G5((g)=>{return{buffer:Buffer.from(g.data,"base64"),timestamp:g.metadata.timestamp}}),k10(2,1),h10(([{timestamp:g,buffer:f},{timestamp:p}])=>{return O1(Array(Math.round(z*Math.max(p-g,0))).fill(f))}),G5((g)=>{return this.#$(g),[g,performance.now()]}),ZB(WY(this.#D.signal,"abort"))),{defaultValue:[Buffer.from([]),performance.now()]})}#Y($,K,G,V,W,F){let q=[["-vcodec","vp9"],["-crf",`${W}`],["-deadline","realtime","-cpu-used",`${Math.min(x$1.cpus().length/2,8)}`]];switch($){case"webm":return[...q,["-f","webm"]].flat();case"gif":if(K=bF0===K?20:"source_fps",G===1/0)G=0;if(V!==-1)V/=10;return[["-vf",`fps=${K},split[s0][s1];[s0]palettegen=stats_mode=diff:max_colors=${F}[p];[s1][p]paletteuse=dither=bayer`],["-loop",`${G}`],["-final_delay",`${V}`],["-f","gif"]].flat();case"mp4":return[...q,["-movflags","hybrid_fragmented"],["-f","mp4"]].flat()}}get#$(){return J.value}async stop(){if(this.#D.signal.aborted)return;await this.#X._stopScreencast().catch(R0),this.#D.abort();let[$,K]=await this.#J;await Promise.all(Array(Math.max(1,Math.round(this.#Q*(performance.now()-K)/1000))).fill($).map(this.#$.bind(this))),this.#Z.stdin.end(),await new Promise((G)=>{this.#Z.once("close",G)})}async[(D=[cG()],Y=[cG()],q2)](){await this.stop()}}})();_3();import v$1 from"node:fs";import b$1 from"node:path";U8.value={fs:v$1,path:b$1,ScreenRecorder:uF0};var f$1=new k_({isPuppeteerCore:!0});var h_=f$1;import{execSync as u$1}from"child_process";import{accessSync as g$1}from"node:fs";import yV from"path";var m$1=[process.env["PROGRAMFILES(X86)"]&&yV.join(process.env["PROGRAMFILES(X86)"],"Google","Chrome","Application","chrome.exe"),process.env.PROGRAMFILES&&yV.join(process.env.PROGRAMFILES,"Google","Chrome","Application","chrome.exe"),process.env.LOCALAPPDATA&&yV.join(process.env.LOCALAPPDATA,"Google","Chrome","Application","chrome.exe"),process.env["PROGRAMFILES(X86)"]&&yV.join(process.env["PROGRAMFILES(X86)"],"Microsoft","Edge","Application","msedge.exe"),process.env.PROGRAMFILES&&yV.join(process.env.PROGRAMFILES,"Microsoft","Edge","Application","msedge.exe")].filter(Boolean),c$1=["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge","/Applications/Chromium.app/Contents/MacOS/Chromium"],d$1=["/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/usr/bin/chromium-browser","/usr/bin/chromium","/usr/lib/chromium/chromium","/usr/lib/chromium-browser/chromium-browser","/usr/lib64/chromium-browser/chromium-browser","/snap/bin/chromium","/tmp/chromium","/opt/chromium/chrome","/opt/chrome/chrome"];function p$1(X){return X.startsWith("ws://")||X.startsWith("wss://")||X.startsWith("http://")||X.startsWith("https://")}async function l$1(X){if(X.startsWith("ws://")||X.startsWith("wss://"))return X;let Z=X.replace(/\/+$/,"")+"/json/version",J=await(await fetch(Z,{signal:AbortSignal.timeout(5000)})).json();if(!J.webSocketDebuggerUrl)throw Error("No webSocketDebuggerUrl in /json/version response");return J.webSocketDebuggerUrl}async function nM(X){let Z=X||process.env.CHROME_REMOTE_ENDPOINT;if(Z&&p$1(Z))try{let J=await l$1(Z);return{type:"remote",browser:await h_.connect({browserWSEndpoint:J})}}catch{return null}let D=await i$1(X);if(!D)return null;try{let J=["--no-sandbox","--disable-setuid-sandbox","--disable-gpu","--disable-dev-shm-usage"];if(process.platform!=="win32")J.push("--single-process");let Y=process.platform!=="win32"&&process.platform!=="darwin";return{type:"chrome",browser:await h_.launch({executablePath:D,headless:!0,pipe:Y,args:J})}}catch{return null}}async function i$1(X,Z=process.platform,D){if(X&&y_(X))return X;let J=[process.env.CHROME_PATH,process.env.PUPPETEER_EXECUTABLE_PATH,process.env.CHROMIUM_PATH];for(let Q of J)if(Q&&y_(Q))return Q;let Y=D||[];if(!D)switch(Z){case"win32":Y=m$1;break;case"darwin":Y=c$1;break;default:Y=d$1}for(let Q of Y)if(y_(Q))return Q;if(Z!=="win32"){let Q=["chromium-browser","chromium","google-chrome-stable","google-chrome","chrome"];for(let $ of Q){let K=n$1($);if(K)return K}}return null}function y_(X){try{return g$1(X),!0}catch{return!1}}function n$1(X){try{return u$1(`command -v ${X} 2>/dev/null`,{encoding:"utf-8",timeout:3000,shell:"/bin/sh"}).trim()||null}catch{return null}}async function oM(X){try{if(X.type==="remote")await X.browser.disconnect();else await X.browser.close()}catch{}}import{mkdir as o$1}from"node:fs/promises";import a$1 from"path";async function v_(X,Z,D="/",J,Y){let Q=Date.now();if(!await s$1(X))return{name:"Runtime",status:"skip",severity:"error",duration:Date.now()-Q,items:[{message:`No server running on port ${X}`,suggestion:"Start dev server first: npm run dev (or use --port to specify different port)"}],summary:`Skipped (no server on port ${X})`};let K=null;try{K=await nM(J)}catch{}if(!K)return{name:"Runtime",status:"skip",severity:"info",duration:Date.now()-Q,items:[{message:"No browser available (Chrome/Chromium/Edge not found)",suggestion:"Use --chrome-path <path> or set CHROME_PATH environment variable, or install Chrome/Edge"}],summary:"Skipped (no browser)"};let G=[],V,{browser:W,type:F}=K;try{let H=await W.newPage();H.on("console",(U)=>{let O=U.type();if(O==="error"||O==="warning"){let M=U.location();G.push({type:O==="warning"?"warning":"console",message:U.text(),fileName:M?.url,lineNumber:M?.lineNumber,columnNumber:M?.columnNumber})}}),H.on("pageerror",(U)=>{G.push({type:"error",message:U.message,stack:U.stack})});let z=D.startsWith("/")?D:`/${D}`;if(await H.goto(`http://localhost:${X}${z}`,{waitUntil:"networkidle2",timeout:Z}),await r$1(3000),Y){await o$1(Y,{recursive:!0});let U=z==="/"?"index":z.replace(/^\/+|\/+$/g,"").replace(/\//g,"-"),O=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19);V=a$1.join(Y,`doctor-${U}-${O}.png`),await H.screenshot({path:V,fullPage:!0})}let B=await H.evaluate(()=>{return window.__earlyErrors||[]});G.push(...B)}catch(H){let z=H.message||"Unknown error";if(z.includes("timeout")||z.includes("Timeout"))G.push({type:"error",message:"Page load timeout - app may have crashed or is unresponsive"});else if(z.includes("net::ERR"))G.push({type:"error",message:`Network error: ${z}`});else G.push({type:"error",message:`Runtime check error: ${z}`})}finally{await oM(K)}let q=DK1(G);return{name:`Runtime (${F})`,status:q.length>0?"fail":"pass",severity:"error",duration:Date.now()-Q,items:q,summary:q.length>0?`${q.length} runtime error(s)`:"No runtime errors",disk_changes:V?[V]:void 0}}async function s$1(X){try{let Z=await fetch(`http://localhost:${X}`,{method:"HEAD",signal:AbortSignal.timeout(3000)});return Z.ok||Z.status<500}catch{return!1}}function r$1(X){return new Promise((Z)=>setTimeout(Z,X))}var t$1=["Download the React DevTools","Download the Apollo DevTools","[HMR]","[vite] connected","[vite] connecting","WebSocket connection to 'ws://localhost","favicon.ico",/The resource http:\/\/localhost:\d+\/((@|__vite)\S*)/],e$1=["ECONNREFUSED","404","500","TypeError"];function XK1(X){return X.replace(/^https?:\/\/localhost:\d+\//,"")}function ZK1(X){let Z=X.split(`
|
|
518
|
-
`);for(let D of Z){let J=D.trim();if(J.startsWith("at "))return J}return}function aM(X){if(!t$1.some((J)=>typeof J==="string"?X.includes(J):J.test(X)))return!1;return!e$1.some((J)=>X.includes(J))}function DK1(X){let Z=X.filter((Y)=>{let Q=Y.message||"";return!aM(Q)}),D=new Set;return Z.filter((Y)=>{let Q=Y.message||"";if(D.has(Q))return!1;return D.add(Q),!0}).map((Y)=>{let Q={message:Y.message};if(Y.fileName)Q.file=XK1(Y.fileName);if(Y.lineNumber!==void 0)Q.line=Y.lineNumber;if(Y.columnNumber!==void 0)Q.column=Y.columnNumber;if(Y.type&&Y.type!=="error")Q.code=Y.type;if(Y.stack){let $=ZK1(Y.stack);if($)Q.suggestion=$}return Q})}function b_(X,Z){console.log(""),console.log(j.bold("Health Check")+j.dim(` (${WK1(X.duration)})`)),console.log(j.dim("─".repeat(40)));for(let D of X.checks)JK1(D,Z);console.log(j.dim("─".repeat(40))),GK1(X)}function JK1(X,Z){let D=$K1(X.status),J=KK1(X.status,X.severity),Y=j.dim(`${X.duration}ms`);console.log(`${D} ${J(X.name)} ${Y} ${j.dim("·")} ${j.dim(X.summary||"")}`);let Q=X.name.startsWith("Runtime"),$=Z||Q?X.items:X.items.slice(0,3),K=X.items.length-$.length;for(let G of $)YK1(G,X.severity);if(K>0)console.log(j.dim(` ... +${K} more (--verbose)`))}function YK1(X,Z){let J=(X.severity==="error"?"error":X.severity==="warning"?"warning":Z)==="error"?j.red:j.yellow,Y=QK1(X),Q=Y?j.cyan(Y)+" ":"",$=X.fixed?j.green("[fixed] "):"";if(console.log(` ${J("›")} ${$}${Q}${X.message}`),X.suggestion)console.log(j.dim(` \uD83D\uDCA1 ${X.suggestion}`))}function QK1(X){if(!X.file)return"";let Z=X.file;if(X.line!==void 0){if(Z+=`:${X.line}`,X.column!==void 0)Z+=`:${X.column}`}return Z}function $K1(X){switch(X){case"pass":return j.green("✓");case"fail":return j.red("✗");case"skip":return j.dim("○");default:return j.dim("?")}}function KK1(X,Z){if(X==="fail")return Z==="error"?j.red:j.yellow;if(X==="pass")return j.green;return j.dim}function GK1(X){let{summary:Z}=X,D=[];if(Z.passed>0)D.push(j.green(`${Z.passed} passed`));if(Z.failed>0)D.push(j.red(`${Z.failed} failed`));if(Z.skipped>0)D.push(j.dim(`${Z.skipped} skipped`));if(console.log(D.join(j.dim(" · "))),Z.errors>0)console.log(j.red(`${Z.errors} error(s) need attention`));else if(Z.warnings>0)console.log(j.yellow(`${Z.warnings} warning(s) to review`));else console.log(j.green("All good!"))}function WK1(X){if(X<1000)return`${X}ms`;return`${(X/1000).toFixed(1)}s`}var gF0=new t1("doctor").description("Analyze project for issues (TypeScript, ESLint, build, runtime)").option("--cwd <path>","Working directory").option("--port <number>","Vite dev server port","5174").option("--chrome-path <path>","Chrome path or remote endpoint (ws://host:9222, http://host:9222)").option("--fix","Auto-fix ESLint issues where possible").option("--runtime","Run runtime error detection (requires running dev server)").option("--only-build","Run only Vite build check").option("--only-runtime","Run only runtime error detection").option("--runtime-timeout <ms>","Runtime check timeout in ms","10000").option("--route <path>","Route path for runtime check","/").option("--screenshot [dir]","Save screenshot during runtime check (default: ./screenshots)").option("--json","Output as JSON (for CI/CD)").option("-v, --verbose","Show all details including all errors").option("-q, --quiet","Hide command output logs (only show summary)").option("--no-typecheck","Skip TypeScript type checking").option("--no-lint","Skip ESLint checking").option("--no-build","Skip Vite build checking").action(async(X)=>{let Z=X.cwd||process.cwd(),D=parseInt(X.port||"5173"),J=parseInt(X.runtimeTimeout||"10000"),Y=X.route||"/",Q=Date.now(),$=X.quiet||X.json||!1;if(!await k2(Z)&&!X.json)console.log(j.yellow("Warning: No promake.json found. Running checks anyway..."));let G=X.json?null:F2("Running health checks...").start(),V=HK1(X),W=[];if(V.typecheck)W.push(()=>pj(Z,$));if(V.lint)W.push(()=>nj(Z,X.fix,$));if(V.build)W.push(()=>oj(Z));if(V.runtime){let H=X.screenshot===!0?"./screenshots":X.screenshot||void 0;W.push(()=>v_(D,J,Y,X.chromePath,H))}let F=[];try{if(F=await FK1(W,1),G)G.stop()}catch(H){if(G)G.fail("Health check failed");if(!X.json)console.error(j.red(H.message));process.exit(1)}let q={project:VK1.basename(Z),timestamp:new Date().toISOString(),duration:Date.now()-Q,checks:F,summary:{passed:F.filter((H)=>H.status==="pass").length,failed:F.filter((H)=>H.status==="fail").length,skipped:F.filter((H)=>H.status==="skip").length,errors:F.filter((H)=>H.status==="fail"&&H.severity==="error").reduce((H,z)=>H+z.items.length,0),warnings:F.filter((H)=>H.status==="fail"&&H.severity==="warning").reduce((H,z)=>H+z.items.length,0)}};if(X.json)console.log(JSON.stringify(q,null,2));else b_(q,X.verbose||!1);if(q.summary.errors>0)process.exit(1)});async function FK1(X,Z){let D=[],J=0;async function Y(){let $=J++;if($>=X.length)return;D[$]=await X[$](),await Y()}let Q=Array(Math.min(Z,X.length)).fill(null).map(()=>Y());return await Promise.all(Q),D}function HK1(X){let Z=!!X.onlyBuild,D=!!X.onlyRuntime;if(Z||D)return{typecheck:!1,lint:!1,build:Z,runtime:D};return{typecheck:X.typecheck!==!1,lint:X.lint!==!1,build:X.build!==!1,runtime:!!X.runtime}}import OK1 from"path";import{mkdir as zK1}from"node:fs/promises";import qK1 from"path";async function BK1(X,Z,D,J){let Y=Date.now(),Q=[],$=[],K=await X.newPage();try{await K.setViewport({width:J.width,height:J.height,deviceScaleFactor:1}),K.on("console",(q)=>{let H=q.type(),z=q.text(),B=q.location(),U=B?.url?`${z} ${B.url}`:z;if(aM(z)||aM(U))return;if(B?.url?.includes("favicon.ico"))return;if(H==="error")Q.push({type:"console",message:z,fileName:B?.url,lineNumber:B?.lineNumber,columnNumber:B?.columnNumber});else if(H==="warn")$.push({type:"warning",message:z,fileName:B?.url,lineNumber:B?.lineNumber,columnNumber:B?.columnNumber})}),K.on("pageerror",(q)=>{Q.push({type:"error",message:q.message,stack:q.stack})}),await K.goto(Z,{waitUntil:"networkidle2",timeout:J.timeout}),await new Promise((q)=>setTimeout(q,2000));let G=UK1(D),V=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),W=`screenshot-${G}-${V}.png`,F=qK1.join(J.output,W);return await zK1(J.output,{recursive:!0}),await K.screenshot({path:F,fullPage:J.fullPage}),{url:Z,route:D,screenshotPath:F,errors:sM(Q),warnings:sM($),duration:Date.now()-Y,status:"success"}}catch(G){let V=G.message||"Unknown error";return{url:Z,route:D,screenshotPath:"",errors:sM(Q),warnings:sM($),duration:Date.now()-Y,status:"error",errorMessage:V.includes("timeout")?"Page load timeout - app may have crashed or is unresponsive":V.includes("net::ERR")?`Network error: ${V}`:V}}finally{await K.close().catch(()=>{})}}async function mF0(X,Z,D,J){let Y=[];for(let Q of D){let $=Q.startsWith("/")?Q:`/${Q}`,K=Z.replace(/\/+$/,"")+$,G=await BK1(X,K,$,J);Y.push(G)}return Y}function UK1(X){if(X==="/"||X==="")return"index";return X.replace(/^\/+|\/+$/g,"").replace(/\//g,"-").replace(/[^a-zA-Z0-9-_]/g,"_")}function sM(X){let Z=new Set;return X.filter((D)=>{if(Z.has(D.message))return!1;return Z.add(D.message),!0})}var cF0=new t1("screenshot").description("Take screenshots and capture console errors from any URL").option("--url <url>","Target URL (e.g. http://10.0.1.15:3000)").option("--port <number>","Localhost shortcut (--port 5174 → http://localhost:5174)").option("--routes <paths>","Comma-separated routes (e.g. /,/about,/dashboard)","/").option("-o, --output <dir>","Output directory","./screenshots").option("--width <px>","Viewport width","1920").option("--height <px>","Viewport height","1080").option("--full-page","Capture full scrollable page").option("--chrome-path <path>","Chrome path or remote endpoint (ws://host:9222, http://host:9222)").option("--timeout <ms>","Page load timeout in ms","15000").option("--json","Output as JSON").option("-q, --quiet","Suppress terminal output").action(async(X)=>{let Z=MK1(X);if(!Z)console.log(j.red("Error: Provide --url or --port")),console.log(j.dim(" Example: promake screenshot --url http://10.0.1.15:3000")),console.log(j.dim(" Example: promake screenshot --port 5174")),process.exit(1);let D=(X.routes||"/").split(",").map((q)=>q.trim()).filter(Boolean),J=parseInt(X.width||"1920"),Y=parseInt(X.height||"1080"),Q=parseInt(X.timeout||"15000"),$=OK1.resolve(X.output||"./screenshots"),K=X.quiet||X.json||!1,G=X.json?null:F2("Launching browser...").start(),V=await nM(X.chromePath);if(!V){if(G)G.fail("No browser found");if(!X.json)console.log(""),console.log(j.yellow("Could not find Chrome/Chromium. Try one of:")),console.log(j.dim(" --chrome-path /usr/bin/chromium")),console.log(j.dim(" export CHROME_PATH=/usr/bin/chromium")),console.log(j.dim(" export PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium"));if(X.json)console.log(JSON.stringify({error:"No browser found"},null,2));process.exit(1)}if(G)G.text=`Capturing ${D.length} route(s) from ${Z}...`;let W;try{W=await mF0(V.browser,Z,D,{width:J,height:Y,fullPage:!!X.fullPage,timeout:Q,output:$})}finally{await oM(V)}if(G)G.stop();if(X.json)console.log(JSON.stringify(W,null,2));else if(!K)LK1(W,Z);if(W.some((q)=>q.status==="error"||q.errors.length>0))process.exit(1)});function MK1(X){if(X.url)return X.url;if(X.port)return`http://localhost:${X.port}`;return null}function LK1(X,Z){console.log(""),console.log(j.bold("Screenshot Report")+j.dim(` · ${Z}`)),console.log(j.dim("─".repeat(50)));for(let K of X){let G=K.status==="success"?j.green("✓"):j.red("✗"),V=j.dim(`${K.duration}ms`);if(K.status==="success")console.log(`${G} ${j.cyan(K.route)} ${V}`),console.log(j.dim(` → ${K.screenshotPath}`));else if(console.log(`${G} ${j.red(K.route)} ${V}`),K.errorMessage)console.log(` ${j.red("›")} ${K.errorMessage}`);if(K.errors.length>0){console.log(j.red(` ${K.errors.length} console error(s):`));for(let W of K.errors){let F=W.fileName?j.dim(` (${NK1(W.fileName)}${W.lineNumber?`:${W.lineNumber}`:""})`):"";console.log(` ${j.red("›")} ${W.message}${F}`)}}if(K.warnings.length>0){console.log(j.yellow(` ${K.warnings.length} warning(s):`));for(let W of K.warnings)console.log(` ${j.yellow("›")} ${W.message}`)}}console.log(j.dim("─".repeat(50)));let D=X.filter((K)=>K.status==="success").length,J=X.filter((K)=>K.status==="error").length,Y=X.reduce((K,G)=>K+G.errors.length,0),Q=X.reduce((K,G)=>K+G.warnings.length,0),$=[];if($.push(j.green(`${D} captured`)),J>0)$.push(j.red(`${J} failed`));if(Y>0)$.push(j.red(`${Y} error(s)`));if(Q>0)$.push(j.yellow(`${Q} warning(s)`));console.log($.join(j.dim(" · ")))}function NK1(X){return X.replace(/^https?:\/\/localhost:\d+\//,"")}var dF0={name:"@promakeai/cli",version:"0.9.6",type:"module",bin:{promake:"dist/index.js"},files:["dist/index.js","dist/registry","template"],scripts:{dev:"bun run src/index.ts","dev:app":"cd dev && bun run dev","dev:populate":"bun run scripts/populate-dev.ts","dev:fresh":"bun run dev:populate && bun run dev:app","playground:create":"rm -rf playground && bun run dev -- create playground --template empty --pm bun","playground:reset":"bun run playground:create","playground:add":"cd playground && bun run ../src/index.ts add","playground:ecommerce":"rm -rf playground && bun run dev -- create playground --template ecommerce --pm bun",clean:"rimraf dist",build:"bun run clean && bun run build:cli && bun run build:registry","build:cli":"bun build src/index.ts --outdir dist --target node --minify","build:registry":"bun run scripts/build-registry.ts",typecheck:"tsc --noEmit",prepublishOnly:"bun run build",test:"bun test","test:e2e":"bun run scripts/e2e-test.ts","test:watch":"bun test --watch","test:coverage":"bun test --coverage",release:"bun run build && npm publish --access public"},dependencies:{"adm-zip":"^0.5.16",archiver:"^7.0.1",axios:"^1.13.6",chalk:"^5.3.0",commander:"^12.1.0",culori:"^4.0.2",dotenv:"^17.2.3","fs-extra":"^11.3.3",glob:"^11.0.0",ora:"^8.1.1",prompts:"^2.4.2","puppeteer-core":"^24.36.0"},devDependencies:{"@types/archiver":"^7.0.0","@types/bun":"^1.1.14","@types/culori":"^4.0.1","@types/fs-extra":"^11.0.4","@types/node":"^22.10.2","@types/prompts":"^2.4.9",rimraf:"6.0.1",typescript:"^5.7.2"}};var A8=new t1;A8.name("promake").description(`Modular React template CLI - Build React apps with pre-built components
|
|
518
|
+
`);for(let D of Z){let J=D.trim();if(J.startsWith("at "))return J}return}function aM(X){if(!t$1.some((J)=>typeof J==="string"?X.includes(J):J.test(X)))return!1;return!e$1.some((J)=>X.includes(J))}function DK1(X){let Z=X.filter((Y)=>{let Q=Y.message||"";return!aM(Q)}),D=new Set;return Z.filter((Y)=>{let Q=Y.message||"";if(D.has(Q))return!1;return D.add(Q),!0}).map((Y)=>{let Q={message:Y.message};if(Y.fileName)Q.file=XK1(Y.fileName);if(Y.lineNumber!==void 0)Q.line=Y.lineNumber;if(Y.columnNumber!==void 0)Q.column=Y.columnNumber;if(Y.type&&Y.type!=="error")Q.code=Y.type;if(Y.stack){let $=ZK1(Y.stack);if($)Q.suggestion=$}return Q})}function b_(X,Z){console.log(""),console.log(j.bold("Health Check")+j.dim(` (${WK1(X.duration)})`)),console.log(j.dim("─".repeat(40)));for(let D of X.checks)JK1(D,Z);console.log(j.dim("─".repeat(40))),GK1(X)}function JK1(X,Z){let D=$K1(X.status),J=KK1(X.status,X.severity),Y=j.dim(`${X.duration}ms`);console.log(`${D} ${J(X.name)} ${Y} ${j.dim("·")} ${j.dim(X.summary||"")}`);let Q=X.name.startsWith("Runtime"),$=Z||Q?X.items:X.items.slice(0,3),K=X.items.length-$.length;for(let G of $)YK1(G,X.severity);if(K>0)console.log(j.dim(` ... +${K} more (--verbose)`))}function YK1(X,Z){let J=(X.severity==="error"?"error":X.severity==="warning"?"warning":Z)==="error"?j.red:j.yellow,Y=QK1(X),Q=Y?j.cyan(Y)+" ":"",$=X.fixed?j.green("[fixed] "):"";if(console.log(` ${J("›")} ${$}${Q}${X.message}`),X.suggestion)console.log(j.dim(` \uD83D\uDCA1 ${X.suggestion}`))}function QK1(X){if(!X.file)return"";let Z=X.file;if(X.line!==void 0){if(Z+=`:${X.line}`,X.column!==void 0)Z+=`:${X.column}`}return Z}function $K1(X){switch(X){case"pass":return j.green("✓");case"fail":return j.red("✗");case"skip":return j.dim("○");default:return j.dim("?")}}function KK1(X,Z){if(X==="fail")return Z==="error"?j.red:j.yellow;if(X==="pass")return j.green;return j.dim}function GK1(X){let{summary:Z}=X,D=[];if(Z.passed>0)D.push(j.green(`${Z.passed} passed`));if(Z.failed>0)D.push(j.red(`${Z.failed} failed`));if(Z.skipped>0)D.push(j.dim(`${Z.skipped} skipped`));if(console.log(D.join(j.dim(" · "))),Z.errors>0)console.log(j.red(`${Z.errors} error(s) need attention`));else if(Z.warnings>0)console.log(j.yellow(`${Z.warnings} warning(s) to review`));else console.log(j.green("All good!"))}function WK1(X){if(X<1000)return`${X}ms`;return`${(X/1000).toFixed(1)}s`}var gF0=new t1("doctor").description("Analyze project for issues (TypeScript, ESLint, build, runtime)").option("--cwd <path>","Working directory").option("--port <number>","Vite dev server port","5174").option("--chrome-path <path>","Chrome path or remote endpoint (ws://host:9222, http://host:9222)").option("--fix","Auto-fix ESLint issues where possible").option("--runtime","Run runtime error detection (requires running dev server)").option("--only-build","Run only Vite build check").option("--only-runtime","Run only runtime error detection").option("--runtime-timeout <ms>","Runtime check timeout in ms","10000").option("--route <path>","Route path for runtime check","/").option("--screenshot [dir]","Save screenshot during runtime check (default: ./screenshots)").option("--json","Output as JSON (for CI/CD)").option("-v, --verbose","Show all details including all errors").option("-q, --quiet","Hide command output logs (only show summary)").option("--no-typecheck","Skip TypeScript type checking").option("--no-lint","Skip ESLint checking").option("--no-build","Skip Vite build checking").action(async(X)=>{let Z=X.cwd||process.cwd(),D=parseInt(X.port||"5173"),J=parseInt(X.runtimeTimeout||"10000"),Y=X.route||"/",Q=Date.now(),$=X.quiet||X.json||!1;if(!await k2(Z)&&!X.json)console.log(j.yellow("Warning: No promake.json found. Running checks anyway..."));let G=X.json?null:F2("Running health checks...").start(),V=HK1(X),W=[];if(V.typecheck)W.push(()=>pj(Z,$));if(V.lint)W.push(()=>nj(Z,X.fix,$));if(V.build)W.push(()=>oj(Z));if(V.runtime){let H=X.screenshot===!0?"./screenshots":X.screenshot||void 0;W.push(()=>v_(D,J,Y,X.chromePath,H))}let F=[];try{if(F=await FK1(W,1),G)G.stop()}catch(H){if(G)G.fail("Health check failed");if(!X.json)console.error(j.red(H.message));process.exit(1)}let q={project:VK1.basename(Z),timestamp:new Date().toISOString(),duration:Date.now()-Q,checks:F,summary:{passed:F.filter((H)=>H.status==="pass").length,failed:F.filter((H)=>H.status==="fail").length,skipped:F.filter((H)=>H.status==="skip").length,errors:F.filter((H)=>H.status==="fail"&&H.severity==="error").reduce((H,z)=>H+z.items.length,0),warnings:F.filter((H)=>H.status==="fail"&&H.severity==="warning").reduce((H,z)=>H+z.items.length,0)}};if(X.json)console.log(JSON.stringify(q,null,2));else b_(q,X.verbose||!1);if(q.summary.errors>0)process.exit(1)});async function FK1(X,Z){let D=[],J=0;async function Y(){let $=J++;if($>=X.length)return;D[$]=await X[$](),await Y()}let Q=Array(Math.min(Z,X.length)).fill(null).map(()=>Y());return await Promise.all(Q),D}function HK1(X){let Z=!!X.onlyBuild,D=!!X.onlyRuntime;if(Z||D)return{typecheck:!1,lint:!1,build:Z,runtime:D};return{typecheck:X.typecheck!==!1,lint:X.lint!==!1,build:X.build!==!1,runtime:!!X.runtime}}import OK1 from"path";import{mkdir as zK1}from"node:fs/promises";import qK1 from"path";async function BK1(X,Z,D,J){let Y=Date.now(),Q=[],$=[],K=await X.newPage();try{await K.setViewport({width:J.width,height:J.height,deviceScaleFactor:1}),K.on("console",(q)=>{let H=q.type(),z=q.text(),B=q.location(),U=B?.url?`${z} ${B.url}`:z;if(aM(z)||aM(U))return;if(B?.url?.includes("favicon.ico"))return;if(H==="error")Q.push({type:"console",message:z,fileName:B?.url,lineNumber:B?.lineNumber,columnNumber:B?.columnNumber});else if(H==="warn")$.push({type:"warning",message:z,fileName:B?.url,lineNumber:B?.lineNumber,columnNumber:B?.columnNumber})}),K.on("pageerror",(q)=>{Q.push({type:"error",message:q.message,stack:q.stack})}),await K.goto(Z,{waitUntil:"networkidle2",timeout:J.timeout}),await new Promise((q)=>setTimeout(q,2000));let G=UK1(D),V=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),W=`screenshot-${G}-${V}.png`,F=qK1.join(J.output,W);return await zK1(J.output,{recursive:!0}),await K.screenshot({path:F,fullPage:J.fullPage}),{url:Z,route:D,screenshotPath:F,errors:sM(Q),warnings:sM($),duration:Date.now()-Y,status:"success"}}catch(G){let V=G.message||"Unknown error";return{url:Z,route:D,screenshotPath:"",errors:sM(Q),warnings:sM($),duration:Date.now()-Y,status:"error",errorMessage:V.includes("timeout")?"Page load timeout - app may have crashed or is unresponsive":V.includes("net::ERR")?`Network error: ${V}`:V}}finally{await K.close().catch(()=>{})}}async function mF0(X,Z,D,J){let Y=[];for(let Q of D){let $=Q.startsWith("/")?Q:`/${Q}`,K=Z.replace(/\/+$/,"")+$,G=await BK1(X,K,$,J);Y.push(G)}return Y}function UK1(X){if(X==="/"||X==="")return"index";return X.replace(/^\/+|\/+$/g,"").replace(/\//g,"-").replace(/[^a-zA-Z0-9-_]/g,"_")}function sM(X){let Z=new Set;return X.filter((D)=>{if(Z.has(D.message))return!1;return Z.add(D.message),!0})}var cF0=new t1("screenshot").description("Take screenshots and capture console errors from any URL").option("--url <url>","Target URL (e.g. http://10.0.1.15:3000)").option("--port <number>","Localhost shortcut (--port 5174 → http://localhost:5174)").option("--routes <paths>","Comma-separated routes (e.g. /,/about,/dashboard)","/").option("-o, --output <dir>","Output directory","./screenshots").option("--width <px>","Viewport width","1920").option("--height <px>","Viewport height","1080").option("--full-page","Capture full scrollable page").option("--chrome-path <path>","Chrome path or remote endpoint (ws://host:9222, http://host:9222)").option("--timeout <ms>","Page load timeout in ms","15000").option("--json","Output as JSON").option("-q, --quiet","Suppress terminal output").action(async(X)=>{let Z=MK1(X);if(!Z)console.log(j.red("Error: Provide --url or --port")),console.log(j.dim(" Example: promake screenshot --url http://10.0.1.15:3000")),console.log(j.dim(" Example: promake screenshot --port 5174")),process.exit(1);let D=(X.routes||"/").split(",").map((q)=>q.trim()).filter(Boolean),J=parseInt(X.width||"1920"),Y=parseInt(X.height||"1080"),Q=parseInt(X.timeout||"15000"),$=OK1.resolve(X.output||"./screenshots"),K=X.quiet||X.json||!1,G=X.json?null:F2("Launching browser...").start(),V=await nM(X.chromePath);if(!V){if(G)G.fail("No browser found");if(!X.json)console.log(""),console.log(j.yellow("Could not find Chrome/Chromium. Try one of:")),console.log(j.dim(" --chrome-path /usr/bin/chromium")),console.log(j.dim(" export CHROME_PATH=/usr/bin/chromium")),console.log(j.dim(" export PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium"));if(X.json)console.log(JSON.stringify({error:"No browser found"},null,2));process.exit(1)}if(G)G.text=`Capturing ${D.length} route(s) from ${Z}...`;let W;try{W=await mF0(V.browser,Z,D,{width:J,height:Y,fullPage:!!X.fullPage,timeout:Q,output:$})}finally{await oM(V)}if(G)G.stop();if(X.json)console.log(JSON.stringify(W,null,2));else if(!K)LK1(W,Z);if(W.some((q)=>q.status==="error"||q.errors.length>0))process.exit(1)});function MK1(X){if(X.url)return X.url;if(X.port)return`http://localhost:${X.port}`;return null}function LK1(X,Z){console.log(""),console.log(j.bold("Screenshot Report")+j.dim(` · ${Z}`)),console.log(j.dim("─".repeat(50)));for(let K of X){let G=K.status==="success"?j.green("✓"):j.red("✗"),V=j.dim(`${K.duration}ms`);if(K.status==="success")console.log(`${G} ${j.cyan(K.route)} ${V}`),console.log(j.dim(` → ${K.screenshotPath}`));else if(console.log(`${G} ${j.red(K.route)} ${V}`),K.errorMessage)console.log(` ${j.red("›")} ${K.errorMessage}`);if(K.errors.length>0){console.log(j.red(` ${K.errors.length} console error(s):`));for(let W of K.errors){let F=W.fileName?j.dim(` (${NK1(W.fileName)}${W.lineNumber?`:${W.lineNumber}`:""})`):"";console.log(` ${j.red("›")} ${W.message}${F}`)}}if(K.warnings.length>0){console.log(j.yellow(` ${K.warnings.length} warning(s):`));for(let W of K.warnings)console.log(` ${j.yellow("›")} ${W.message}`)}}console.log(j.dim("─".repeat(50)));let D=X.filter((K)=>K.status==="success").length,J=X.filter((K)=>K.status==="error").length,Y=X.reduce((K,G)=>K+G.errors.length,0),Q=X.reduce((K,G)=>K+G.warnings.length,0),$=[];if($.push(j.green(`${D} captured`)),J>0)$.push(j.red(`${J} failed`));if(Y>0)$.push(j.red(`${Y} error(s)`));if(Q>0)$.push(j.yellow(`${Q} warning(s)`));console.log($.join(j.dim(" · ")))}function NK1(X){return X.replace(/^https?:\/\/localhost:\d+\//,"")}var dF0={name:"@promakeai/cli",version:"0.9.7",type:"module",bin:{promake:"dist/index.js"},files:["dist/index.js","dist/registry","template"],scripts:{dev:"bun run src/index.ts","dev:app":"cd dev && bun run dev","dev:populate":"bun run scripts/populate-dev.ts","dev:fresh":"bun run dev:populate && bun run dev:app","playground:create":"rm -rf playground && bun run dev -- create playground --template empty --pm bun","playground:reset":"bun run playground:create","playground:add":"cd playground && bun run ../src/index.ts add","playground:ecommerce":"rm -rf playground && bun run dev -- create playground --template ecommerce --pm bun",clean:"rimraf dist",build:"bun run clean && bun run build:cli && bun run build:registry","build:cli":"bun build src/index.ts --outdir dist --target node --minify","build:registry":"bun run scripts/build-registry.ts",typecheck:"tsc --noEmit",prepublishOnly:"bun run build",test:"bun test","test:e2e":"bun run scripts/e2e-test.ts","test:watch":"bun test --watch","test:coverage":"bun test --coverage",release:"bun run build && npm publish --access public"},dependencies:{"adm-zip":"^0.5.16",archiver:"^7.0.1",axios:"^1.13.6",chalk:"^5.3.0",commander:"^12.1.0",culori:"^4.0.2",dotenv:"^17.2.3","fs-extra":"^11.3.3",glob:"^11.0.0",ora:"^8.1.1",prompts:"^2.4.2","puppeteer-core":"^24.36.0"},devDependencies:{"@types/archiver":"^7.0.0","@types/bun":"^1.1.14","@types/culori":"^4.0.1","@types/fs-extra":"^11.0.4","@types/node":"^22.10.2","@types/prompts":"^2.4.9",rimraf:"6.0.1",typescript:"^5.7.2"}};var A8=new t1;A8.name("promake").description(`Modular React template CLI - Build React apps with pre-built components
|
|
519
519
|
|
|
520
520
|
Quick Start:
|
|
521
521
|
$ promake create my-app
|
package/package.json
CHANGED
package/template/bun.lock
CHANGED
|
@@ -5,9 +5,10 @@
|
|
|
5
5
|
"name": "new",
|
|
6
6
|
"dependencies": {
|
|
7
7
|
"@hookform/resolvers": "^5.2.2",
|
|
8
|
-
"@promakeai/customer-backend-client": "
|
|
9
|
-
"@promakeai/dbreact": "
|
|
8
|
+
"@promakeai/customer-backend-client": "1.2.0",
|
|
9
|
+
"@promakeai/dbreact": "1.1.2",
|
|
10
10
|
"@promakeai/inspector": "^1.7.4",
|
|
11
|
+
"@promakeai/orm": "1.3.1",
|
|
11
12
|
"@radix-ui/react-accordion": "^1.2.12",
|
|
12
13
|
"@radix-ui/react-alert-dialog": "^1.1.15",
|
|
13
14
|
"@radix-ui/react-aspect-ratio": "^1.1.8",
|
|
@@ -231,13 +232,13 @@
|
|
|
231
232
|
|
|
232
233
|
"@promakeai/customer-backend-client": ["@promakeai/customer-backend-client@1.2.0", "", { "dependencies": { "axios": "^1.7.0", "zod": "^4.1.13" }, "peerDependencies": { "@tanstack/react-query": ">=5.0.0", "react": ">=18.0.0" }, "optionalPeers": ["@tanstack/react-query", "react"] }, "sha512-w8uk1abno9W+HeYs0DXOCpGSO4kbdWCLkPNHy53j25qXCLk5xAnqE6wRio9BaADk5hkRC+Ghs428sce1AXWOgA=="],
|
|
233
234
|
|
|
234
|
-
"@promakeai/dbreact": ["@promakeai/dbreact@1.1.
|
|
235
|
+
"@promakeai/dbreact": ["@promakeai/dbreact@1.1.2", "", { "dependencies": { "@promakeai/orm": "1.3.1" }, "peerDependencies": { "@tanstack/react-query": ">=5.0.0", "react": ">=19.0.0", "react-dom": ">=19.0.0", "sql.js": ">=1.11.0" } }, "sha512-pG1WFRxtkhX82rSFVDyEOq7fyJfjDp4FVcQZvEKifS2nzjAap/rKqgbPMxmfzr6G/MvTVaaheXlqaYPpYsINuw=="],
|
|
235
236
|
|
|
236
237
|
"@promakeai/inspector": ["@promakeai/inspector@1.7.5", "", { "dependencies": { "@babel/parser": "^7.28.5", "@promakeai/inspector-types": "1.7.5", "clsx": "^2.1.1", "estree-walker": "^3.0.3", "lodash": "^4.17.21", "lucide-react": "^0.554.0", "magic-string": "^0.30.21", "react-colorful": "^5.6.1", "vite-plugin-component-debugger": "^2.2.0", "zustand": "^5.0.8" }, "peerDependencies": { "react": ">=18.0.0", "vite": ">=5.0.0" }, "optionalPeers": ["vite"] }, "sha512-dudt8Yuyxrvudatr1T61qY8f0UT8klcGphnpaLbZ98sZTuth+m9X3CePz/bgf6judDCtcX4zFzjI+8e7+ryukw=="],
|
|
237
238
|
|
|
238
239
|
"@promakeai/inspector-types": ["@promakeai/inspector-types@1.7.5", "", {}, "sha512-4swpzEDymv0abrVN0KrbdtSss0OAVPzCzd7MOivSLFLlLQuKmsbyxFJkKY1qTQYCNjEjkhpnWuRsayK21I23qA=="],
|
|
239
240
|
|
|
240
|
-
"@promakeai/orm": ["@promakeai/orm@1.3.
|
|
241
|
+
"@promakeai/orm": ["@promakeai/orm@1.3.1", "", {}, "sha512-M3vx2X6PFnbR8/QBAbocSdv+dtJMW9lRo2VWciye5R+YALcyqAiQIrKU5BNnHZ+eqBkz0SeS/XE+GSgeuypd6Q=="],
|
|
241
242
|
|
|
242
243
|
"@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="],
|
|
243
244
|
|
package/template/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@promakeai/template",
|
|
3
3
|
"private": true,
|
|
4
|
-
"version": "0.3.
|
|
4
|
+
"version": "0.3.2",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"dev": "vite",
|
|
@@ -15,8 +15,9 @@
|
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"@hookform/resolvers": "^5.2.2",
|
|
18
|
-
"@promakeai/dbreact": "
|
|
19
|
-
"@promakeai/
|
|
18
|
+
"@promakeai/dbreact": "1.1.2",
|
|
19
|
+
"@promakeai/orm": "1.3.1",
|
|
20
|
+
"@promakeai/customer-backend-client": "1.2.0",
|
|
20
21
|
"@promakeai/inspector": "^1.7.4",
|
|
21
22
|
"@radix-ui/react-accordion": "^1.2.12",
|
|
22
23
|
"@radix-ui/react-alert-dialog": "^1.1.15",
|
package/template/src/db/index.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { AppDbProvider } from "./provider";
|
|
2
2
|
|
|
3
|
-
import { parseJSONSchema } from "@promakeai/
|
|
3
|
+
import { parseJSONSchema } from "@promakeai/orm";
|
|
4
4
|
import schemaJson from "./schema.json";
|
|
5
5
|
export const schema = parseJSONSchema(schemaJson as any);
|
|
6
6
|
|
|
@@ -14,8 +14,8 @@ export {
|
|
|
14
14
|
useDbUpdate,
|
|
15
15
|
useDbDelete,
|
|
16
16
|
SqliteAdapter,
|
|
17
|
-
RestAdapter,
|
|
18
|
-
parseJSONSchema,
|
|
19
17
|
} from "@promakeai/dbreact";
|
|
20
18
|
|
|
19
|
+
export { RestAdapter, parseJSONSchema } from "@promakeai/orm";
|
|
20
|
+
|
|
21
21
|
export * from "./types";
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { useEffect, useState, type ReactNode } from 'react';
|
|
2
2
|
import { useTranslation } from 'react-i18next';
|
|
3
|
-
import { DbProvider, SqliteAdapter
|
|
4
|
-
import
|
|
3
|
+
import { DbProvider, SqliteAdapter } from '@promakeai/dbreact';
|
|
4
|
+
import { RestAdapter, parseJSONSchema } from '@promakeai/orm';
|
|
5
|
+
import type { IDataAdapter } from '@promakeai/orm';
|
|
5
6
|
import constants from '@/constants/constants.json';
|
|
6
7
|
import schemaJson from './schema.json';
|
|
7
8
|
|
package/template/vite.config.ts
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
import fs from
|
|
2
|
-
import { createRequire } from
|
|
3
|
-
import path from
|
|
4
|
-
import { execSync } from
|
|
5
|
-
import tailwindcss from
|
|
6
|
-
import react from
|
|
7
|
-
import { defineConfig, loadEnv, type Plugin } from
|
|
8
|
-
import { inspectorDebugger } from
|
|
9
|
-
import type { IncomingMessage } from
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import { createRequire } from 'module';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { execSync } from 'child_process';
|
|
5
|
+
import tailwindcss from '@tailwindcss/vite';
|
|
6
|
+
import react from '@vitejs/plugin-react';
|
|
7
|
+
import { defineConfig, loadEnv, type Plugin } from 'vite';
|
|
8
|
+
import { inspectorDebugger } from '@promakeai/inspector/plugin';
|
|
9
|
+
import type { IncomingMessage } from 'http';
|
|
10
10
|
|
|
11
11
|
// Plugin: Restart dev server when lang files are added or changed
|
|
12
12
|
function langWatchPlugin(): Plugin {
|
|
13
13
|
return {
|
|
14
|
-
name:
|
|
14
|
+
name: 'lang-watch',
|
|
15
15
|
configureServer(server) {
|
|
16
16
|
const handleLangFile = (file: string, event: string) => {
|
|
17
|
-
const normalizedPath = file.replace(/\\/g,
|
|
18
|
-
const isModuleLang = normalizedPath.includes(
|
|
19
|
-
const isGlobalLang = normalizedPath.includes(
|
|
17
|
+
const normalizedPath = file.replace(/\\/g, '/');
|
|
18
|
+
const isModuleLang = normalizedPath.includes('/modules/') && normalizedPath.includes('/lang/');
|
|
19
|
+
const isGlobalLang = normalizedPath.includes('/src/lang/');
|
|
20
20
|
|
|
21
|
-
if ((isModuleLang || isGlobalLang) && file.endsWith(
|
|
22
|
-
const label = event ===
|
|
21
|
+
if ((isModuleLang || isGlobalLang) && file.endsWith('.json')) {
|
|
22
|
+
const label = event === 'add' ? 'New translation file detected' : 'Translation file changed';
|
|
23
23
|
console.log(`\n🌐 ${label}!`);
|
|
24
|
-
console.log(
|
|
24
|
+
console.log('🔄 Restarting server to load translations...\n');
|
|
25
25
|
server.restart();
|
|
26
26
|
}
|
|
27
27
|
};
|
|
28
28
|
|
|
29
|
-
server.watcher.on(
|
|
30
|
-
server.watcher.on(
|
|
29
|
+
server.watcher.on('add', (file) => handleLangFile(file, 'add'));
|
|
30
|
+
server.watcher.on('change', (file) => handleLangFile(file, 'change'));
|
|
31
31
|
},
|
|
32
32
|
};
|
|
33
33
|
}
|
|
@@ -35,38 +35,35 @@ function langWatchPlugin(): Plugin {
|
|
|
35
35
|
// Helper: Read request body
|
|
36
36
|
function readBody(req: IncomingMessage): Promise<string> {
|
|
37
37
|
return new Promise((resolve) => {
|
|
38
|
-
let data =
|
|
39
|
-
req.on(
|
|
40
|
-
req.on(
|
|
38
|
+
let data = '';
|
|
39
|
+
req.on('data', (chunk: string) => (data += chunk));
|
|
40
|
+
req.on('end', () => resolve(data));
|
|
41
41
|
});
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
// Plugin: Expose API for running promake commands from the panel
|
|
45
45
|
function promakeApiPlugin(secret?: string): Plugin {
|
|
46
|
-
const ALLOWED_COMMANDS = [
|
|
47
|
-
const ALLOWED_ORIGINS = [
|
|
48
|
-
|
|
49
|
-
"https://www.promake.ai",
|
|
50
|
-
];
|
|
51
|
-
const BASE_PATH = secret ? `/__promake/${secret}` : "/__promake";
|
|
46
|
+
const ALLOWED_COMMANDS = ['seo', 'theme'];
|
|
47
|
+
const ALLOWED_ORIGINS = ['https://promake.ai', 'https://www.promake.ai'];
|
|
48
|
+
const BASE_PATH = secret ? `/__promake/${secret}` : '/__promake';
|
|
52
49
|
|
|
53
50
|
return {
|
|
54
|
-
name:
|
|
51
|
+
name: 'promake-api',
|
|
55
52
|
configureServer(server) {
|
|
56
53
|
server.middlewares.use(`${BASE_PATH}/run`, async (req, res) => {
|
|
57
|
-
const origin = req.headers.origin ||
|
|
54
|
+
const origin = req.headers.origin || '';
|
|
58
55
|
const allowedOrigin = ALLOWED_ORIGINS.includes(origin) ? origin : ALLOWED_ORIGINS[0];
|
|
59
|
-
res.setHeader(
|
|
60
|
-
res.setHeader(
|
|
61
|
-
res.setHeader(
|
|
56
|
+
res.setHeader('Access-Control-Allow-Origin', allowedOrigin);
|
|
57
|
+
res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS');
|
|
58
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
|
|
62
59
|
|
|
63
|
-
if (req.method ===
|
|
60
|
+
if (req.method === 'OPTIONS') {
|
|
64
61
|
res.statusCode = 204;
|
|
65
62
|
res.end();
|
|
66
63
|
return;
|
|
67
64
|
}
|
|
68
65
|
|
|
69
|
-
if (req.method !==
|
|
66
|
+
if (req.method !== 'POST') {
|
|
70
67
|
res.statusCode = 405;
|
|
71
68
|
res.end();
|
|
72
69
|
return;
|
|
@@ -78,23 +75,23 @@ function promakeApiPlugin(secret?: string): Plugin {
|
|
|
78
75
|
|
|
79
76
|
if (!ALLOWED_COMMANDS.includes(command)) {
|
|
80
77
|
res.statusCode = 400;
|
|
81
|
-
res.setHeader(
|
|
78
|
+
res.setHeader('Content-Type', 'application/json');
|
|
82
79
|
res.end(JSON.stringify({ error: `Command not allowed: ${command}` }));
|
|
83
80
|
return;
|
|
84
81
|
}
|
|
85
82
|
|
|
86
|
-
const safeArgs = args.map((a: string) => `'${a.replace(/'/g, "'\\''")}'`).join(
|
|
83
|
+
const safeArgs = args.map((a: string) => `'${a.replace(/'/g, "'\\''")}'`).join(' ');
|
|
87
84
|
const output = execSync(`promake ${command} ${safeArgs}`, {
|
|
88
85
|
cwd: process.cwd(),
|
|
89
|
-
encoding:
|
|
86
|
+
encoding: 'utf-8',
|
|
90
87
|
timeout: 15000,
|
|
91
88
|
});
|
|
92
89
|
|
|
93
|
-
res.setHeader(
|
|
90
|
+
res.setHeader('Content-Type', 'application/json');
|
|
94
91
|
res.end(JSON.stringify({ ok: true, output }));
|
|
95
92
|
} catch (e: any) {
|
|
96
93
|
res.statusCode = 500;
|
|
97
|
-
res.setHeader(
|
|
94
|
+
res.setHeader('Content-Type', 'application/json');
|
|
98
95
|
res.end(JSON.stringify({ ok: false, error: e.message }));
|
|
99
96
|
}
|
|
100
97
|
});
|
|
@@ -105,14 +102,14 @@ function promakeApiPlugin(secret?: string): Plugin {
|
|
|
105
102
|
// Plugin: Write installed package versions to src/constants/versions.json on dev server start
|
|
106
103
|
function packageVersionsPlugin(): Plugin {
|
|
107
104
|
return {
|
|
108
|
-
name:
|
|
105
|
+
name: 'package-versions',
|
|
109
106
|
configureServer() {
|
|
110
107
|
const root = process.cwd();
|
|
111
|
-
const pkgJsonPath = path.join(root,
|
|
108
|
+
const pkgJsonPath = path.join(root, 'package.json');
|
|
112
109
|
|
|
113
110
|
if (!fs.existsSync(pkgJsonPath)) return;
|
|
114
111
|
|
|
115
|
-
const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath,
|
|
112
|
+
const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));
|
|
116
113
|
|
|
117
114
|
const require = createRequire(pkgJsonPath);
|
|
118
115
|
|
|
@@ -120,10 +117,10 @@ function packageVersionsPlugin(): Plugin {
|
|
|
120
117
|
if (!deps) return {};
|
|
121
118
|
const resolved: Record<string, string> = {};
|
|
122
119
|
for (const name of Object.keys(deps)) {
|
|
123
|
-
if (!name.startsWith(
|
|
120
|
+
if (!name.startsWith('@promakeai/')) continue;
|
|
124
121
|
try {
|
|
125
122
|
const depPkgPath = require.resolve(`${name}/package.json`);
|
|
126
|
-
const depPkg = JSON.parse(fs.readFileSync(depPkgPath,
|
|
123
|
+
const depPkg = JSON.parse(fs.readFileSync(depPkgPath, 'utf-8'));
|
|
127
124
|
resolved[name] = depPkg.version;
|
|
128
125
|
} catch {
|
|
129
126
|
resolved[name] = deps[name];
|
|
@@ -140,56 +137,58 @@ function packageVersionsPlugin(): Plugin {
|
|
|
140
137
|
},
|
|
141
138
|
};
|
|
142
139
|
|
|
143
|
-
const outPath = path.join(root,
|
|
144
|
-
fs.
|
|
145
|
-
|
|
146
|
-
console.log(`📦 Package versions written to src/constants/versions.json`);
|
|
140
|
+
const outPath = path.join(root, 'versions.json');
|
|
141
|
+
fs.writeFileSync(outPath, JSON.stringify(versions, null, 2) + '\n');
|
|
142
|
+
console.log(`📦 Package versions written to versions.json`);
|
|
147
143
|
},
|
|
148
144
|
};
|
|
149
145
|
}
|
|
150
146
|
|
|
151
147
|
// https://vite.dev/config/
|
|
152
148
|
export default defineConfig(({ mode }) => {
|
|
153
|
-
const env = loadEnv(mode, process.cwd(),
|
|
154
|
-
|
|
155
|
-
return
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
149
|
+
const env = loadEnv(mode, process.cwd(), 'PROMAKE_');
|
|
150
|
+
|
|
151
|
+
return {
|
|
152
|
+
cacheDir: '/tmp/.vite-cache',
|
|
153
|
+
optimizeDeps: {
|
|
154
|
+
force: true,
|
|
155
|
+
},
|
|
156
|
+
plugins: [
|
|
157
|
+
inspectorDebugger({ enabled: mode === 'development' }),
|
|
158
|
+
react(),
|
|
159
|
+
tailwindcss(),
|
|
160
|
+
mode === 'development' && langWatchPlugin(),
|
|
161
|
+
mode === 'development' && promakeApiPlugin(env.PROMAKE_SECRET),
|
|
162
|
+
mode === 'development' && packageVersionsPlugin(),
|
|
163
|
+
].filter(Boolean),
|
|
164
|
+
resolve: {
|
|
165
|
+
alias: {
|
|
166
|
+
'@': path.resolve(__dirname, './src'),
|
|
167
|
+
},
|
|
168
|
+
preserveSymlinks: true,
|
|
168
169
|
},
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
170
|
+
server: {
|
|
171
|
+
host: '0.0.0.0',
|
|
172
|
+
allowedHosts: true,
|
|
173
|
+
hmr: false,
|
|
174
|
+
port: 5174,
|
|
175
|
+
watch: {
|
|
176
|
+
usePolling: true,
|
|
177
|
+
interval: 500,
|
|
178
|
+
},
|
|
179
|
+
headers: {
|
|
180
|
+
'Cache-Control': 'no-cache, no-store, must-revalidate',
|
|
181
|
+
},
|
|
179
182
|
},
|
|
180
|
-
|
|
181
|
-
|
|
183
|
+
preview: {
|
|
184
|
+
port: 4173,
|
|
182
185
|
},
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
rollupOptions: {
|
|
189
|
-
output: {
|
|
190
|
-
manualChunks: undefined,
|
|
186
|
+
build: {
|
|
187
|
+
rollupOptions: {
|
|
188
|
+
output: {
|
|
189
|
+
manualChunks: undefined,
|
|
190
|
+
},
|
|
191
191
|
},
|
|
192
192
|
},
|
|
193
|
-
}
|
|
193
|
+
};
|
|
194
194
|
});
|
|
195
|
-
});
|