@promakeai/cli 0.5.7 → 0.5.8

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 CHANGED
@@ -489,7 +489,7 @@ For (2), check out our guide on configuring puppeteer at https://pptr.dev/guides
489
489
  2. your cache path is incorrectly configured (which is: ${this.puppeteer.configuration.cacheDirectory}).
490
490
  For (2), check out our guide on configuring puppeteer at https://pptr.dev/guides/configuration.`)}}return Z}}uw();import q41 from"node:fs";var z41={force:!0,recursive:!0,maxRetries:5};async function GO(D){await q41.promises.rm(D,z41)}class lw extends EW{constructor(D){super(D,"chrome")}launch(D={}){if(this.puppeteer.configuration.logLevel==="warn"&&process.platform==="darwin"&&process.arch==="x64"){if(B41.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(`
491
491
  `))}return super.launch(D)}async computeLaunchArguments(D={}){let{ignoreDefaultArgs:X=!1,args:Z=[],pipe:J=!1,debuggingPort:Y,channel:Q,executablePath:$}=D,K=[];if(!X)K.push(...this.defaultArgs(D));else if(Array.isArray(X))K.push(...this.defaultArgs(D).filter((z)=>{return!X.includes(z)}));else K.push(...Z);if(!K.some((z)=>{return z.startsWith("--remote-debugging-")}))if(J)U0(!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,W=K.findIndex((z)=>{return z.startsWith("--user-data-dir")});if(W<0)G=!0,K.push(`--user-data-dir=${await U41(this.getProfilePath())}`),W=K.length-1;let F=K[W].split("=",2)[1];U0(typeof F==="string","`--user-data-dir` is malformed");let V=$;if(!V)U0(Q||!this.puppeteer._isPuppeteerCore,"An `executablePath` or `channel` must be specified for `puppeteer-core`"),V=Q?this.executablePath(Q):this.resolveExecutablePath(D.headless??!0);return{executablePath:V,args:K,isTempUserDataDir:G,userDataDir:F}}async cleanUserDataDir(D,X){if(X.isTemp)try{await GO(D)}catch(Z){throw M0(Z),Z}}defaultArgs(D={}){let X=SQ0("--disable-features",D.args);if(D.args&&X.length>0)_Q0(D.args,"--disable-features");let J=["Translate","AcceptCHFrame","MediaRouter","OptimizationHints","RenderDocument",...process.env.PUPPETEER_TEST_EXPERIMENTAL_CHROME_FEATURES==="true"?[]:["ProcessPerSiteUpToMainFrameThreshold","IsolateSandboxedIframes"],...X].filter((z)=>{return z!==""}),Y=SQ0("--enable-features",D.args);if(D.args&&Y.length>0)_Q0(D.args,"--enable-features");let Q=["PdfOopif",...Y].filter((z)=>{return z!==""}),$=["--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((z)=>{return z!==""}),{devtools:K=!1,headless:G=!K,args:W=[],userDataDir:F,enableExtensions:V=!1}=D;if(F)$.push(`--user-data-dir=${O41.resolve(F)}`);if(K)$.push("--auto-open-devtools-for-tabs");if(G)$.push(G==="shell"?"--headless":"--headless=new","--hide-scrollbars","--mute-audio");if($.push(V?"--enable-unsafe-extension-debugging":"--disable-extensions"),W.every((z)=>{return z.startsWith("-")}))$.push("about:blank");return $.push(...W),$}executablePath(D,X=!0){if(D)return pY({browser:u0.CHROME,channel:gw(D)});else return this.resolveExecutablePath(void 0,X)}}function SQ0(D,X=[]){return X.filter((Z)=>{return Z.startsWith(D.endsWith("=")?D:`${D}=`)}).map((Z)=>{return Z.split(new RegExp(`${D}=\\s*`))[1]?.trim()}).filter((Z)=>{return Z})}function _Q0(D,X){let Z=new RegExp(`^${X}=.*`),J=0;while(J<D.length)if(Z.test(D[J]))D.splice(J,1);else J++;return D}oX();F1();import L41 from"node:fs";import{rename as M41,unlink as A41,mkdtemp as N41}from"node:fs/promises";import R41 from"node:os";import kQ0 from"node:path";class WO extends EW{constructor(D){super(D,"firefox")}static getPreferences(D){return{...D,"fission.webContentIsolationStrategy":0}}async computeLaunchArguments(D={}){let{ignoreDefaultArgs:X=!1,args:Z=[],executablePath:J,pipe:Y=!1,extraPrefsFirefox:Q={},debuggingPort:$=null}=D,K=[];if(!X)K.push(...this.defaultArgs(D));else if(Array.isArray(X))K.push(...this.defaultArgs(D).filter((z)=>{return!X.includes(z)}));else K.push(...Z);if(!K.some((z)=>{return z.startsWith("--remote-debugging-")})){if(Y)U0($===null,"Browser should be launched with either pipe or debugging port - not both.");K.push(`--remote-debugging-port=${$||0}`)}let G,W=!0,F=K.findIndex((z)=>{return["-profile","--profile"].includes(z)});if(F!==-1){if(G=K[F+1],!G)throw new Error("Missing value for profile command line argument");W=!1}else G=await N41(this.getProfilePath()),K.push("--profile"),K.push(G);await BB(u0.FIREFOX,{path:G,preferences:WO.getPreferences(Q)});let V;if(this.puppeteer._isPuppeteerCore||J)U0(J,"An `executablePath` must be specified for `puppeteer-core`"),V=J;else V=this.executablePath(void 0);return{isTempUserDataDir:W,userDataDir:G,args:K,executablePath:V}}async cleanUserDataDir(D,X){if(X.isTemp)try{await GO(D)}catch(Z){throw M0(Z),Z}else try{let J=["prefs.js","user.js"],Y=await Promise.allSettled(J.map(async(Q)=>{let $=kQ0.join(D,Q+".puppeteer");if(L41.existsSync($)){let K=kQ0.join(D,Q);await A41(K),await M41($,K)}}));for(let Q of Y)if(Q.status==="rejected")throw Q.reason}catch(Z){M0(Z)}}executablePath(D,X=!0){return this.resolveExecutablePath(void 0,X)}defaultArgs(D={}){let{devtools:X=!1,headless:Z=!X,args:J=[],userDataDir:Y=null}=D,Q=[];switch(R41.platform()){case"darwin":Q.push("--foreground");break;case"win32":Q.push("--wait-for-browser");break}if(Y)Q.push("--profile"),Q.push(Y);if(Z)Q.push("--headless");if(X)Q.push("--devtools");if(J.every(($)=>{return $.startsWith("-")}))Q.push("about:blank");return Q.push(...J),Q}}oX();class pw extends cw{#D;#X;defaultBrowserRevision;configuration={};constructor(D){let{configuration:X,...Z}=D;super(Z);if(X)this.configuration=X;switch(this.configuration.defaultBrowser){case"firefox":this.defaultBrowserRevision=GQ.firefox;break;default:this.configuration.defaultBrowser="chrome",this.defaultBrowserRevision=GQ.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(D){return super.connect(D)}launch(D={}){let{browser:X=this.defaultBrowser}=D;switch(this.#X=X,X){case"chrome":this.defaultBrowserRevision=GQ.chrome;break;case"firefox":this.defaultBrowserRevision=GQ.firefox;break;default:throw new Error(`Unknown product: ${X}`)}return this.#D=this.#Z(X),this.#D.launch(D)}#Z(D){if(this.#D&&this.#D.browser===D)return this.#D;switch(D){case"chrome":return new lw(this);case"firefox":return new WO(this);default:throw new Error(`Unknown product: ${D}`)}}executablePath(D){if(D===void 0)return this.#Z(this.lastLaunchedBrowser).executablePath(void 0,!1);if(typeof D==="string")return this.#Z("chrome").executablePath(D,!1);return this.#Z(D.browser??this.lastLaunchedBrowser).resolveExecutablePath(D.headless,!1)}get browserVersion(){return this.configuration?.[this.lastLaunchedBrowser]?.version??this.defaultBrowserRevision}get defaultDownloadPath(){return this.configuration.cacheDirectory}get lastLaunchedBrowser(){return this.#X??this.defaultBrowser}get defaultBrowser(){return this.configuration.defaultBrowser??"chrome"}get product(){return this.lastLaunchedBrowser}defaultArgs(D={}){return this.#Z(D.browser??this.lastLaunchedBrowser).defaultArgs(D)}async trimCache(){let D=V8();if(!D)throw new Error("The current platform is not supported.");let X=this.configuration.cacheDirectory,Z=await cB({cacheDir:X}),J=[{product:"chrome",browser:u0.CHROME,currentBuildId:""},{product:"firefox",browser:u0.FIREFOX,currentBuildId:""}];for(let $ of J){let K=this.configuration?.[$.product]?.version??GQ[$.product];$.currentBuildId=await dY($.browser,D,K)}let Y=new Set(J.map(($)=>{return`${$.browser}_${$.currentBuildId}`})),Q=new Set(J.map(($)=>{return $.browser}));for(let $ of Z){if(!Q.has($.browser))continue;if(Y.has(`${$.browser}_${$.buildId}`))continue;await mB({browser:$.browser,platform:D,cacheDir:X,buildId:$.buildId})}}}var yQ0=h1(i2(),1);s6();X6();F1();G2();Y5();import{spawn as I41,spawnSync as j41}from"node:child_process";import C41 from"node:fs";import P41 from"node:os";import{dirname as w41}from"node:path";import{PassThrough as S41}from"node:stream";var E41=function(D,X,Z){var J=arguments.length>2;for(var Y=0;Y<X.length;Y++)Z=J?X[Y].call(D,Z):X[Y].call(D);return J?Z:void 0},xQ0=function(D,X,Z,J,Y,Q){function $(O){if(O!==void 0&&typeof O!=="function")throw new TypeError("Function expected");return O}var K=J.kind,G=K==="getter"?"get":K==="setter"?"set":"value",W=!X&&D?J.static?D:D.prototype:null,F=X||(W?Object.getOwnPropertyDescriptor(W,J.name):{}),V,z=!1;for(var H=Z.length-1;H>=0;H--){var q={};for(var U in J)q[U]=U==="access"?{}:J[U];for(var U in J.access)q.access[U]=J.access[U];q.addInitializer=function(O){if(z)throw new TypeError("Cannot add initializers after decoration has completed");Q.push($(O||null))};var B=Z[H](K==="accessor"?{get:F.get,set:F.set}:F[G],q);if(K==="accessor"){if(B===void 0)continue;if(B===null||typeof B!=="object")throw new TypeError("Object expected");if(V=$(B.get))F.get=V;if(V=$(B.set))F.set=V;if(V=$(B.init))Y.unshift(V)}else if(V=$(B))if(K==="field")Y.unshift(V);else F[G]=V}if(W)Object.defineProperty(W,J.name,F);z=!0},T41=function(D,X,Z){if(typeof X==="symbol")X=X.description?"[".concat(X.description,"]"):"";return Object.defineProperty(D,"name",{configurable:!0,value:Z?"".concat(Z," ",X):X})},_41=30,hQ0=30,k41=yQ0.default("puppeteer:ffmpeg"),vQ0=(()=>{let D=S41,X=[],Z,J,Y;return class Q extends D{static{let $=typeof Symbol==="function"&&Symbol.metadata?Object.create(D[Symbol.metadata]??null):void 0;if(xQ0(this,J={value:T41(async function(K){let G=await new Promise((W)=>{this.#X.stdin.write(K,W)});if(G)console.log(`ffmpeg failed to write: ${G.message}.`)},"#writeFrame")},Z,{kind:"method",name:"#writeFrame",static:!1,private:!0,access:{has:(K)=>(#$ in K),get:(K)=>K.#$},metadata:$},null,X),xQ0(this,null,Y,{kind:"method",name:"stop",static:!1,private:!1,access:{has:(K)=>("stop"in K),get:(K)=>K.stop},metadata:$},null,X),$)Object.defineProperty(this,Symbol.metadata,{enumerable:!0,configurable:!0,writable:!0,value:$})}#D=E41(this,X);#X;#Z=new AbortController;#J;#Q;constructor($,K,G,{ffmpegPath:W,speed:F,scale:V,crop:z,format:H,fps:q,loop:U,delay:B,quality:O,colors:L,path:M,overwrite:A}={}){super({allowHalfOpen:!1});W??="ffmpeg",H??="webm",q??=hQ0,U||=-1,B??=-1,O??=_41,L??=256,A??=!0,this.#Q=q;let{error:T}=j41(W);if(T)throw T;let w=[`crop='min(${K},iw):min(${G},ih):0:0'`,`pad=${K}:${G}:0:0`];if(F)w.push(`setpts=${1/F}*PTS`);if(z)w.push(`crop=${z.width}:${z.height}:${z.x}:${z.y}`);if(V)w.push(`scale=iw*${V}:-1:flags=lanczos`);let E=this.#Y(H,q,U,B,O,L),C=E.indexOf("-vf");if(C!==-1)w.push(E.splice(C,2).at(-1)??"");if(M)C41.mkdirSync(w41(M),{recursive:A});this.#X=I41(W,[["-loglevel","error"],["-avioflags","direct"],["-fpsprobesize","0","-probesize","32","-analyzeduration","0","-fflags","nobuffer"],["-f","image2pipe","-vcodec","png","-i","pipe:0"],["-an"],["-threads","1"],["-framerate",`${q}`],["-b:v","0"],E,["-vf",w.join()],[A?"-y":"-n"],"pipe:1"].flat(),{stdio:["pipe","pipe","pipe"]}),this.#X.stdout.pipe(this),this.#X.stderr.on("data",(v)=>{k41(v.toString("utf8"))}),this.#D=$;let{client:I}=this.#D.mainFrame();I.once(x1.Disconnected,()=>{this.stop().catch(M0)}),this.#J=Ur(b1(I,"Page.screencastFrame").pipe(pD((v)=>{I.send("Page.screencastFrameAck",{sessionId:v.sessionId})}),O6((v)=>{return v.metadata.timestamp!==void 0}),J5((v)=>{return{buffer:Buffer.from(v.data,"base64"),timestamp:v.metadata.timestamp}}),Ar(2,1),Nr(([{timestamp:v,buffer:u},{timestamp:l}])=>{return z1(Array(Math.round(q*Math.max(l-v,0))).fill(u))}),J5((v)=>{return this.#$(v),[v,performance.now()]}),zq(UJ(this.#Z.signal,"abort"))),{defaultValue:[Buffer.from([]),performance.now()]})}#Y($,K,G,W,F,V){let z=[["-vcodec","vp9"],["-crf",`${F}`],["-deadline","realtime","-cpu-used",`${Math.min(P41.cpus().length/2,8)}`]];switch($){case"webm":return[...z,["-f","webm"]].flat();case"gif":if(K=hQ0===K?20:"source_fps",G===1/0)G=0;if(W!==-1)W/=10;return[["-vf",`fps=${K},split[s0][s1];[s0]palettegen=stats_mode=diff:max_colors=${V}[p];[s1][p]paletteuse=dither=bayer`],["-loop",`${G}`],["-final_delay",`${W}`],["-f","gif"]].flat();case"mp4":return[...z,["-movflags","hybrid_fragmented"],["-f","mp4"]].flat()}}get#$(){return J.value}async stop(){if(this.#Z.signal.aborted)return;await this.#D._stopScreencast().catch(M0),this.#Z.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.#X.stdin.end(),await new Promise((G)=>{this.#X.once("close",G)})}async[(Z=[_K()],Y=[_K()],K2)](){await this.stop()}}})();V3();import h41 from"node:fs";import y41 from"node:path";K8.value={fs:h41,path:y41,ScreenRecorder:vQ0};var v41=new pw({isPuppeteerCore:!0});var iw=v41;import{execSync as b41}from"child_process";import{accessSync as f41}from"node:fs";import TW from"path";var g41=[process.env["PROGRAMFILES(X86)"]&&TW.join(process.env["PROGRAMFILES(X86)"],"Google","Chrome","Application","chrome.exe"),process.env.PROGRAMFILES&&TW.join(process.env.PROGRAMFILES,"Google","Chrome","Application","chrome.exe"),process.env.LOCALAPPDATA&&TW.join(process.env.LOCALAPPDATA,"Google","Chrome","Application","chrome.exe"),process.env["PROGRAMFILES(X86)"]&&TW.join(process.env["PROGRAMFILES(X86)"],"Microsoft","Edge","Application","msedge.exe"),process.env.PROGRAMFILES&&TW.join(process.env.PROGRAMFILES,"Microsoft","Edge","Application","msedge.exe")].filter(Boolean),u41=["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge","/Applications/Chromium.app/Contents/MacOS/Chromium"],m41=["/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 c41(D){return D.startsWith("ws://")||D.startsWith("wss://")||D.startsWith("http://")||D.startsWith("https://")}async function d41(D){if(D.startsWith("ws://")||D.startsWith("wss://"))return D;let X=D.replace(/\/+$/,"")+"/json/version",J=await(await fetch(X,{signal:AbortSignal.timeout(5000)})).json();if(!J.webSocketDebuggerUrl)throw new Error("No webSocketDebuggerUrl in /json/version response");return J.webSocketDebuggerUrl}async function FO(D){let X=D||process.env.CHROME_REMOTE_ENDPOINT;if(X&&c41(X))try{let J=await d41(X);return{type:"remote",browser:await iw.connect({browserWSEndpoint:J})}}catch{return null}let Z=await l41(D);if(!Z)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 iw.launch({executablePath:Z,headless:!0,pipe:Y,args:J})}}catch{return null}}async function l41(D,X=process.platform,Z){if(D&&nw(D))return D;let J=[process.env.CHROME_PATH,process.env.PUPPETEER_EXECUTABLE_PATH,process.env.CHROMIUM_PATH];for(let Q of J)if(Q&&nw(Q))return Q;let Y=Z||[];if(!Z)switch(X){case"win32":Y=g41;break;case"darwin":Y=u41;break;default:Y=m41}for(let Q of Y)if(nw(Q))return Q;if(X!=="win32"){let Q=["chromium-browser","chromium","google-chrome-stable","google-chrome","chrome"];for(let $ of Q){let K=p41($);if(K)return K}}return null}function nw(D){try{return f41(D),!0}catch{return!1}}function p41(D){try{return b41(`command -v ${D} 2>/dev/null`,{encoding:"utf-8",timeout:3000,shell:"/bin/sh"}).trim()||null}catch{return null}}async function VO(D){try{if(D.type==="remote")await D.browser.disconnect();else await D.browser.close()}catch{}}import{mkdir as i41}from"node:fs/promises";import n41 from"path";async function ow(D,X,Z="/",J,Y){let Q=Date.now();if(!await o41(D))return{name:"Runtime",status:"skip",severity:"error",duration:Date.now()-Q,items:[{message:`No server running on port ${D}`,suggestion:"Start dev server first: npm run dev (or use --port to specify different port)"}],summary:`Skipped (no server on port ${D})`};let K=null;try{K=await FO(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=[],W,{browser:F,type:V}=K;try{let H=await F.newPage();H.on("console",(B)=>{let O=B.type();if(O==="error"||O==="warning"){let L=B.location();G.push({type:O==="warning"?"warning":"console",message:B.text(),fileName:L?.url,lineNumber:L?.lineNumber,columnNumber:L?.columnNumber})}}),H.on("pageerror",(B)=>{G.push({type:"error",message:B.message,stack:B.stack})});let q=Z.startsWith("/")?Z:`/${Z}`;if(await H.goto(`http://localhost:${D}${q}`,{waitUntil:"networkidle2",timeout:X}),await r41(3000),Y){await i41(Y,{recursive:!0});let B=q==="/"?"index":q.replace(/^\/+|\/+$/g,"").replace(/\//g,"-"),O=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19);W=n41.join(Y,`doctor-${B}-${O}.png`),await H.screenshot({path:W,fullPage:!0})}let U=await H.evaluate(()=>{return window.__earlyErrors||[]});G.push(...U)}catch(H){let q=H.message||"Unknown error";if(q.includes("timeout")||q.includes("Timeout"))G.push({type:"error",message:"Page load timeout - app may have crashed or is unresponsive"});else if(q.includes("net::ERR"))G.push({type:"error",message:`Network error: ${q}`});else G.push({type:"error",message:`Runtime check error: ${q}`})}finally{await VO(K)}let z=D91(G);return{name:`Runtime (${V})`,status:z.length>0?"fail":"pass",severity:"error",duration:Date.now()-Q,items:z,summary:z.length>0?`${z.length} runtime error(s)`:"No runtime errors",disk_changes:W?[W]:void 0}}async function o41(D){try{let X=await fetch(`http://localhost:${D}`,{method:"HEAD",signal:AbortSignal.timeout(3000)});return X.ok||X.status<500}catch{return!1}}function r41(D){return new Promise((X)=>setTimeout(X,D))}var s41=["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*)/],a41=["ECONNREFUSED","404","500","TypeError"];function t41(D){return D.replace(/^https?:\/\/localhost:\d+\//,"")}function e41(D){let X=D.split(`
492
- `);for(let Z of X){let J=Z.trim();if(J.startsWith("at "))return J}return}function HO(D){if(!s41.some((J)=>typeof J==="string"?D.includes(J):J.test(D)))return!1;return!a41.some((J)=>D.includes(J))}function D91(D){let X=D.filter((Y)=>{let Q=Y.message||"";return!HO(Q)}),Z=new Set;return X.filter((Y)=>{let Q=Y.message||"";if(Z.has(Q))return!1;return Z.add(Q),!0}).map((Y)=>{let Q={message:Y.message};if(Y.fileName)Q.file=t41(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 $=e41(Y.stack);if($)Q.suggestion=$}return Q})}function rw(D,X){console.log(""),console.log(j.bold("Health Check")+j.dim(` (${K91(D.duration)})`)),console.log(j.dim("─".repeat(40)));for(let Z of D.checks)X91(Z,X);console.log(j.dim("─".repeat(40))),$91(D)}function X91(D,X){let Z=Y91(D.status),J=Q91(D.status,D.severity),Y=j.dim(`${D.duration}ms`);console.log(`${Z} ${J(D.name)} ${Y} ${j.dim("·")} ${j.dim(D.summary||"")}`);let Q=D.name.startsWith("Runtime"),$=X||Q?D.items:D.items.slice(0,3),K=D.items.length-$.length;for(let G of $)Z91(G,D.severity);if(K>0)console.log(j.dim(` ... +${K} more (--verbose)`))}function Z91(D,X){let J=(D.severity==="error"?"error":D.severity==="warning"?"warning":X)==="error"?j.red:j.yellow,Y=J91(D),Q=Y?j.cyan(Y)+" ":"",$=D.fixed?j.green("[fixed] "):"";if(console.log(` ${J("›")} ${$}${Q}${D.message}`),D.suggestion)console.log(j.dim(` \uD83D\uDCA1 ${D.suggestion}`))}function J91(D){if(!D.file)return"";let X=D.file;if(D.line!==void 0){if(X+=`:${D.line}`,D.column!==void 0)X+=`:${D.column}`}return X}function Y91(D){switch(D){case"pass":return j.green("✓");case"fail":return j.red("✗");case"skip":return j.dim("○");default:return j.dim("?")}}function Q91(D,X){if(D==="fail")return X==="error"?j.red:j.yellow;if(D==="pass")return j.green;return j.dim}function $91(D){let{summary:X}=D,Z=[];if(X.passed>0)Z.push(j.green(`${X.passed} passed`));if(X.failed>0)Z.push(j.red(`${X.failed} failed`));if(X.skipped>0)Z.push(j.dim(`${X.skipped} skipped`));if(console.log(Z.join(j.dim(" · "))),X.errors>0)console.log(j.red(`${X.errors} error(s) need attention`));else if(X.warnings>0)console.log(j.yellow(`${X.warnings} warning(s) to review`));else console.log(j.green("All good!"))}function K91(D){if(D<1000)return`${D}ms`;return`${(D/1000).toFixed(1)}s`}var bQ0=new o1("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(D)=>{let X=D.cwd||process.cwd(),Z=parseInt(D.port||"5173"),J=parseInt(D.runtimeTimeout||"10000"),Y=D.route||"/",Q=Date.now(),$=D.quiet||D.json||!1;if(!await T2(X)&&!D.json)console.log(j.yellow("Warning: No promake.json found. Running checks anyway..."));let G=D.json?null:Y2("Running health checks...").start(),W=F91(D),F=[];if(W.typecheck)F.push(()=>DE(X,$));if(W.lint)F.push(()=>JE(X,D.fix,$));if(W.build)F.push(()=>YE(X));if(W.runtime){let H=D.screenshot===!0?"./screenshots":D.screenshot||void 0;F.push(()=>ow(Z,J,Y,D.chromePath,H))}let V=[];try{if(V=await W91(F,1),G)G.stop()}catch(H){if(G)G.fail("Health check failed");if(!D.json)console.error(j.red(H.message));process.exit(1)}let z={project:G91.basename(X),timestamp:new Date().toISOString(),duration:Date.now()-Q,checks:V,summary:{passed:V.filter((H)=>H.status==="pass").length,failed:V.filter((H)=>H.status==="fail").length,skipped:V.filter((H)=>H.status==="skip").length,errors:V.filter((H)=>H.status==="fail"&&H.severity==="error").reduce((H,q)=>H+q.items.length,0),warnings:V.filter((H)=>H.status==="fail"&&H.severity==="warning").reduce((H,q)=>H+q.items.length,0)}};if(D.json)console.log(JSON.stringify(z,null,2));else rw(z,D.verbose||!1);if(z.summary.errors>0)process.exit(1)});async function W91(D,X){let Z=[],J=0;async function Y(){let $=J++;if($>=D.length)return;Z[$]=await D[$](),await Y()}let Q=Array(Math.min(X,D.length)).fill(null).map(()=>Y());return await Promise.all(Q),Z}function F91(D){let X=!!D.onlyBuild,Z=!!D.onlyRuntime;if(X||Z)return{typecheck:!1,lint:!1,build:X,runtime:Z};return{typecheck:D.typecheck!==!1,lint:D.lint!==!1,build:D.build!==!1,runtime:!!D.runtime}}import U91 from"path";import{mkdir as V91}from"node:fs/promises";import H91 from"path";async function q91(D,X,Z,J){let Y=Date.now(),Q=[],$=[],K=await D.newPage();try{await K.setViewport({width:J.width,height:J.height,deviceScaleFactor:1}),K.on("console",(z)=>{let H=z.type(),q=z.text(),U=z.location(),B=U?.url?`${q} ${U.url}`:q;if(HO(q)||HO(B))return;if(U?.url?.includes("favicon.ico"))return;if(H==="error")Q.push({type:"console",message:q,fileName:U?.url,lineNumber:U?.lineNumber,columnNumber:U?.columnNumber});else if(H==="warn")$.push({type:"warning",message:q,fileName:U?.url,lineNumber:U?.lineNumber,columnNumber:U?.columnNumber})}),K.on("pageerror",(z)=>{Q.push({type:"error",message:z.message,stack:z.stack})}),await K.goto(X,{waitUntil:"networkidle2",timeout:J.timeout}),await new Promise((z)=>setTimeout(z,2000));let G=z91(Z),W=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),F=`screenshot-${G}-${W}.png`,V=H91.join(J.output,F);return await V91(J.output,{recursive:!0}),await K.screenshot({path:V,fullPage:J.fullPage}),{url:X,route:Z,screenshotPath:V,errors:qO(Q),warnings:qO($),duration:Date.now()-Y,status:"success"}}catch(G){let W=G.message||"Unknown error";return{url:X,route:Z,screenshotPath:"",errors:qO(Q),warnings:qO($),duration:Date.now()-Y,status:"error",errorMessage:W.includes("timeout")?"Page load timeout - app may have crashed or is unresponsive":W.includes("net::ERR")?`Network error: ${W}`:W}}finally{await K.close().catch(()=>{})}}async function fQ0(D,X,Z,J){let Y=[];for(let Q of Z){let $=Q.startsWith("/")?Q:`/${Q}`,K=X.replace(/\/+$/,"")+$,G=await q91(D,K,$,J);Y.push(G)}return Y}function z91(D){if(D==="/"||D==="")return"index";return D.replace(/^\/+|\/+$/g,"").replace(/\//g,"-").replace(/[^a-zA-Z0-9-_]/g,"_")}function qO(D){let X=new Set;return D.filter((Z)=>{if(X.has(Z.message))return!1;return X.add(Z.message),!0})}var gQ0=new o1("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(D)=>{let X=B91(D);if(!X)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 Z=(D.routes||"/").split(",").map((z)=>z.trim()).filter(Boolean),J=parseInt(D.width||"1920"),Y=parseInt(D.height||"1080"),Q=parseInt(D.timeout||"15000"),$=U91.resolve(D.output||"./screenshots"),K=D.quiet||D.json||!1,G=D.json?null:Y2("Launching browser...").start(),W=await FO(D.chromePath);if(!W){if(G)G.fail("No browser found");if(!D.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(D.json)console.log(JSON.stringify({error:"No browser found"},null,2));process.exit(1)}if(G)G.text=`Capturing ${Z.length} route(s) from ${X}...`;let F;try{F=await fQ0(W.browser,X,Z,{width:J,height:Y,fullPage:!!D.fullPage,timeout:Q,output:$})}finally{await VO(W)}if(G)G.stop();if(D.json)console.log(JSON.stringify(F,null,2));else if(!K)O91(F,X);if(F.some((z)=>z.status==="error"||z.errors.length>0))process.exit(1)});function B91(D){if(D.url)return D.url;if(D.port)return`http://localhost:${D.port}`;return null}function O91(D,X){console.log(""),console.log(j.bold("Screenshot Report")+j.dim(` · ${X}`)),console.log(j.dim("─".repeat(50)));for(let K of D){let G=K.status==="success"?j.green("✓"):j.red("✗"),W=j.dim(`${K.duration}ms`);if(K.status==="success")console.log(`${G} ${j.cyan(K.route)} ${W}`),console.log(j.dim(` → ${K.screenshotPath}`));else if(console.log(`${G} ${j.red(K.route)} ${W}`),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 F of K.errors){let V=F.fileName?j.dim(` (${L91(F.fileName)}${F.lineNumber?`:${F.lineNumber}`:""})`):"";console.log(` ${j.red("›")} ${F.message}${V}`)}}if(K.warnings.length>0){console.log(j.yellow(` ${K.warnings.length} warning(s):`));for(let F of K.warnings)console.log(` ${j.yellow("›")} ${F.message}`)}}console.log(j.dim("─".repeat(50)));let Z=D.filter((K)=>K.status==="success").length,J=D.filter((K)=>K.status==="error").length,Y=D.reduce((K,G)=>K+G.errors.length,0),Q=D.reduce((K,G)=>K+G.warnings.length,0),$=[];if($.push(j.green(`${Z} 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 L91(D){return D.replace(/^https?:\/\/localhost:\d+\//,"")}var uQ0={name:"@promakeai/cli",version:"0.5.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: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",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 H8=new o1;H8.name("promake").description(`Modular React template CLI - Build React apps with pre-built components
492
+ `);for(let Z of X){let J=Z.trim();if(J.startsWith("at "))return J}return}function HO(D){if(!s41.some((J)=>typeof J==="string"?D.includes(J):J.test(D)))return!1;return!a41.some((J)=>D.includes(J))}function D91(D){let X=D.filter((Y)=>{let Q=Y.message||"";return!HO(Q)}),Z=new Set;return X.filter((Y)=>{let Q=Y.message||"";if(Z.has(Q))return!1;return Z.add(Q),!0}).map((Y)=>{let Q={message:Y.message};if(Y.fileName)Q.file=t41(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 $=e41(Y.stack);if($)Q.suggestion=$}return Q})}function rw(D,X){console.log(""),console.log(j.bold("Health Check")+j.dim(` (${K91(D.duration)})`)),console.log(j.dim("─".repeat(40)));for(let Z of D.checks)X91(Z,X);console.log(j.dim("─".repeat(40))),$91(D)}function X91(D,X){let Z=Y91(D.status),J=Q91(D.status,D.severity),Y=j.dim(`${D.duration}ms`);console.log(`${Z} ${J(D.name)} ${Y} ${j.dim("·")} ${j.dim(D.summary||"")}`);let Q=D.name.startsWith("Runtime"),$=X||Q?D.items:D.items.slice(0,3),K=D.items.length-$.length;for(let G of $)Z91(G,D.severity);if(K>0)console.log(j.dim(` ... +${K} more (--verbose)`))}function Z91(D,X){let J=(D.severity==="error"?"error":D.severity==="warning"?"warning":X)==="error"?j.red:j.yellow,Y=J91(D),Q=Y?j.cyan(Y)+" ":"",$=D.fixed?j.green("[fixed] "):"";if(console.log(` ${J("›")} ${$}${Q}${D.message}`),D.suggestion)console.log(j.dim(` \uD83D\uDCA1 ${D.suggestion}`))}function J91(D){if(!D.file)return"";let X=D.file;if(D.line!==void 0){if(X+=`:${D.line}`,D.column!==void 0)X+=`:${D.column}`}return X}function Y91(D){switch(D){case"pass":return j.green("✓");case"fail":return j.red("✗");case"skip":return j.dim("○");default:return j.dim("?")}}function Q91(D,X){if(D==="fail")return X==="error"?j.red:j.yellow;if(D==="pass")return j.green;return j.dim}function $91(D){let{summary:X}=D,Z=[];if(X.passed>0)Z.push(j.green(`${X.passed} passed`));if(X.failed>0)Z.push(j.red(`${X.failed} failed`));if(X.skipped>0)Z.push(j.dim(`${X.skipped} skipped`));if(console.log(Z.join(j.dim(" · "))),X.errors>0)console.log(j.red(`${X.errors} error(s) need attention`));else if(X.warnings>0)console.log(j.yellow(`${X.warnings} warning(s) to review`));else console.log(j.green("All good!"))}function K91(D){if(D<1000)return`${D}ms`;return`${(D/1000).toFixed(1)}s`}var bQ0=new o1("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(D)=>{let X=D.cwd||process.cwd(),Z=parseInt(D.port||"5173"),J=parseInt(D.runtimeTimeout||"10000"),Y=D.route||"/",Q=Date.now(),$=D.quiet||D.json||!1;if(!await T2(X)&&!D.json)console.log(j.yellow("Warning: No promake.json found. Running checks anyway..."));let G=D.json?null:Y2("Running health checks...").start(),W=F91(D),F=[];if(W.typecheck)F.push(()=>DE(X,$));if(W.lint)F.push(()=>JE(X,D.fix,$));if(W.build)F.push(()=>YE(X));if(W.runtime){let H=D.screenshot===!0?"./screenshots":D.screenshot||void 0;F.push(()=>ow(Z,J,Y,D.chromePath,H))}let V=[];try{if(V=await W91(F,1),G)G.stop()}catch(H){if(G)G.fail("Health check failed");if(!D.json)console.error(j.red(H.message));process.exit(1)}let z={project:G91.basename(X),timestamp:new Date().toISOString(),duration:Date.now()-Q,checks:V,summary:{passed:V.filter((H)=>H.status==="pass").length,failed:V.filter((H)=>H.status==="fail").length,skipped:V.filter((H)=>H.status==="skip").length,errors:V.filter((H)=>H.status==="fail"&&H.severity==="error").reduce((H,q)=>H+q.items.length,0),warnings:V.filter((H)=>H.status==="fail"&&H.severity==="warning").reduce((H,q)=>H+q.items.length,0)}};if(D.json)console.log(JSON.stringify(z,null,2));else rw(z,D.verbose||!1);if(z.summary.errors>0)process.exit(1)});async function W91(D,X){let Z=[],J=0;async function Y(){let $=J++;if($>=D.length)return;Z[$]=await D[$](),await Y()}let Q=Array(Math.min(X,D.length)).fill(null).map(()=>Y());return await Promise.all(Q),Z}function F91(D){let X=!!D.onlyBuild,Z=!!D.onlyRuntime;if(X||Z)return{typecheck:!1,lint:!1,build:X,runtime:Z};return{typecheck:D.typecheck!==!1,lint:D.lint!==!1,build:D.build!==!1,runtime:!!D.runtime}}import U91 from"path";import{mkdir as V91}from"node:fs/promises";import H91 from"path";async function q91(D,X,Z,J){let Y=Date.now(),Q=[],$=[],K=await D.newPage();try{await K.setViewport({width:J.width,height:J.height,deviceScaleFactor:1}),K.on("console",(z)=>{let H=z.type(),q=z.text(),U=z.location(),B=U?.url?`${q} ${U.url}`:q;if(HO(q)||HO(B))return;if(U?.url?.includes("favicon.ico"))return;if(H==="error")Q.push({type:"console",message:q,fileName:U?.url,lineNumber:U?.lineNumber,columnNumber:U?.columnNumber});else if(H==="warn")$.push({type:"warning",message:q,fileName:U?.url,lineNumber:U?.lineNumber,columnNumber:U?.columnNumber})}),K.on("pageerror",(z)=>{Q.push({type:"error",message:z.message,stack:z.stack})}),await K.goto(X,{waitUntil:"networkidle2",timeout:J.timeout}),await new Promise((z)=>setTimeout(z,2000));let G=z91(Z),W=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),F=`screenshot-${G}-${W}.png`,V=H91.join(J.output,F);return await V91(J.output,{recursive:!0}),await K.screenshot({path:V,fullPage:J.fullPage}),{url:X,route:Z,screenshotPath:V,errors:qO(Q),warnings:qO($),duration:Date.now()-Y,status:"success"}}catch(G){let W=G.message||"Unknown error";return{url:X,route:Z,screenshotPath:"",errors:qO(Q),warnings:qO($),duration:Date.now()-Y,status:"error",errorMessage:W.includes("timeout")?"Page load timeout - app may have crashed or is unresponsive":W.includes("net::ERR")?`Network error: ${W}`:W}}finally{await K.close().catch(()=>{})}}async function fQ0(D,X,Z,J){let Y=[];for(let Q of Z){let $=Q.startsWith("/")?Q:`/${Q}`,K=X.replace(/\/+$/,"")+$,G=await q91(D,K,$,J);Y.push(G)}return Y}function z91(D){if(D==="/"||D==="")return"index";return D.replace(/^\/+|\/+$/g,"").replace(/\//g,"-").replace(/[^a-zA-Z0-9-_]/g,"_")}function qO(D){let X=new Set;return D.filter((Z)=>{if(X.has(Z.message))return!1;return X.add(Z.message),!0})}var gQ0=new o1("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(D)=>{let X=B91(D);if(!X)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 Z=(D.routes||"/").split(",").map((z)=>z.trim()).filter(Boolean),J=parseInt(D.width||"1920"),Y=parseInt(D.height||"1080"),Q=parseInt(D.timeout||"15000"),$=U91.resolve(D.output||"./screenshots"),K=D.quiet||D.json||!1,G=D.json?null:Y2("Launching browser...").start(),W=await FO(D.chromePath);if(!W){if(G)G.fail("No browser found");if(!D.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(D.json)console.log(JSON.stringify({error:"No browser found"},null,2));process.exit(1)}if(G)G.text=`Capturing ${Z.length} route(s) from ${X}...`;let F;try{F=await fQ0(W.browser,X,Z,{width:J,height:Y,fullPage:!!D.fullPage,timeout:Q,output:$})}finally{await VO(W)}if(G)G.stop();if(D.json)console.log(JSON.stringify(F,null,2));else if(!K)O91(F,X);if(F.some((z)=>z.status==="error"||z.errors.length>0))process.exit(1)});function B91(D){if(D.url)return D.url;if(D.port)return`http://localhost:${D.port}`;return null}function O91(D,X){console.log(""),console.log(j.bold("Screenshot Report")+j.dim(` · ${X}`)),console.log(j.dim("─".repeat(50)));for(let K of D){let G=K.status==="success"?j.green("✓"):j.red("✗"),W=j.dim(`${K.duration}ms`);if(K.status==="success")console.log(`${G} ${j.cyan(K.route)} ${W}`),console.log(j.dim(` → ${K.screenshotPath}`));else if(console.log(`${G} ${j.red(K.route)} ${W}`),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 F of K.errors){let V=F.fileName?j.dim(` (${L91(F.fileName)}${F.lineNumber?`:${F.lineNumber}`:""})`):"";console.log(` ${j.red("›")} ${F.message}${V}`)}}if(K.warnings.length>0){console.log(j.yellow(` ${K.warnings.length} warning(s):`));for(let F of K.warnings)console.log(` ${j.yellow("›")} ${F.message}`)}}console.log(j.dim("─".repeat(50)));let Z=D.filter((K)=>K.status==="success").length,J=D.filter((K)=>K.status==="error").length,Y=D.reduce((K,G)=>K+G.errors.length,0),Q=D.reduce((K,G)=>K+G.warnings.length,0),$=[];if($.push(j.green(`${Z} 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 L91(D){return D.replace(/^https?:\/\/localhost:\d+\//,"")}var uQ0={name:"@promakeai/cli",version:"0.5.8",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: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",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 H8=new o1;H8.name("promake").description(`Modular React template CLI - Build React apps with pre-built components
493
493
 
494
494
  Quick Start:
495
495
  $ promake create my-app
@@ -23,7 +23,7 @@
23
23
  "path": "register-page/register-page.tsx",
24
24
  "type": "registry:page",
25
25
  "target": "$modules$/register-page/register-page.tsx",
26
- "content": "import { useState, useEffect } from \"react\";\nimport { Link, useNavigate } from \"react-router\";\nimport { toast } from \"sonner\";\nimport { Layout } from \"@/components/Layout\";\nimport { usePageTitle } from \"@/hooks/use-page-title\";\nimport { useTranslation } from \"react-i18next\";\nimport { useAuth } from \"@/modules/auth-core\";\nimport { getErrorMessage } from \"@/modules/api\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { UserPlus, CheckCircle } from \"lucide-react\";\nimport { PasswordInput } from \"@/components/PasswordInput\";\nimport { FormField } from \"@/components/FormField\";\n\nexport function RegisterPage() {\n const { t } = useTranslation(\"register-page\");\n usePageTitle({ title: t(\"title\", \"Create Account\") });\n\n const navigate = useNavigate();\n const { register, isAuthenticated } = useAuth();\n\n const [formData, setFormData] = useState({\n username: \"\",\n email: \"\",\n password: \"\",\n confirmPassword: \"\",\n });\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState(false);\n\n // Redirect if already authenticated\n useEffect(() => {\n if (isAuthenticated) {\n navigate(\"/\", { replace: true });\n }\n }, [isAuthenticated, navigate]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setIsSubmitting(true);\n setError(null);\n\n // Validate passwords match\n if (formData.password !== formData.confirmPassword) {\n setError(t(\"passwordMismatch\", \"Passwords do not match\"));\n toast.error(t(\"toastErrorTitle\", \"Registration failed\"), {\n description: t(\"passwordMismatch\", \"Passwords do not match\"),\n });\n setIsSubmitting(false);\n return;\n }\n\n try {\n await register(formData.username, formData.email, formData.password);\n setSuccess(true);\n toast.success(t(\"toastSuccessTitle\", \"Account created!\"), {\n description: t(\n \"toastSuccessDesc\",\n \"Please check your email to verify your account.\",\n ),\n });\n } catch (err) {\n const errorMessage = getErrorMessage(err, t(\"errorGeneric\", \"Registration failed. Please try again.\"));\n setError(errorMessage);\n toast.error(t(\"toastErrorTitle\", \"Registration failed\"), {\n description: errorMessage,\n });\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setFormData((prev) => ({\n ...prev,\n [e.target.name]: e.target.value,\n }));\n };\n\n if (success) {\n return (\n <div className=\"min-h-screen bg-muted/30 py-12\">\n <div className=\"w-full max-w-[var(--container-max-width)] mx-auto px-4\">\n <div className=\"max-w-md mx-auto\">\n <Card>\n <CardContent className=\"pt-6\">\n <div className=\"text-center space-y-4\">\n <CheckCircle className=\"w-16 h-16 text-green-500 mx-auto\" />\n <h2 className=\"text-2xl font-bold text-foreground\">\n {t(\"successTitle\", \"Account Created!\")}\n </h2>\n <p className=\"text-muted-foreground\">\n {t(\"successMessage\", \"Please check your email to verify your account.\")}\n </p>\n <Button asChild className=\"mt-4\">\n <Link to=\"/login\">{t(\"goToLogin\", \"Go to Login\")}</Link>\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <Layout>\n <div className=\"min-h-screen bg-muted/30 py-12\">\n <div className=\"w-full max-w-[var(--container-max-width)] mx-auto px-4\">\n {/* Hero Section */}\n <div className=\"text-center mb-12\">\n <h1 className=\"text-4xl font-bold text-foreground mb-4\">\n {t(\"title\", \"Create Account\")}\n </h1>\n <div className=\"w-16 h-1 bg-primary mx-auto mb-6\"></div>\n <p className=\"text-lg text-muted-foreground max-w-xl mx-auto\">\n {t(\"description\", \"Create an account to get started\")}\n </p>\n </div>\n\n <div className=\"max-w-md mx-auto\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <UserPlus className=\"w-5 h-5 text-primary\" />\n {t(\"cardTitle\", \"Sign Up\")}\n </CardTitle>\n </CardHeader>\n <CardContent>\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n <FormField label={t(\"username\", \"Username\")} htmlFor=\"username\" required>\n <Input\n id=\"username\"\n name=\"username\"\n type=\"text\"\n value={formData.username}\n onChange={handleChange}\n placeholder={t(\"usernamePlaceholder\", \"Enter your username\")}\n required\n className=\"mt-1\"\n autoComplete=\"username\"\n />\n </FormField>\n <FormField label={t(\"email\", \"Email\")} htmlFor=\"email\" required>\n <Input\n id=\"email\"\n name=\"email\"\n type=\"email\"\n value={formData.email}\n onChange={handleChange}\n placeholder={t(\"emailPlaceholder\", \"Enter your email\")}\n required\n className=\"mt-1\"\n autoComplete=\"email\"\n />\n </FormField>\n <FormField label={t(\"password\", \"Password\")} htmlFor=\"password\" required>\n <PasswordInput id=\"password\"\n name=\"password\"\n value={formData.password}\n onChange={handleChange}\n placeholder={t(\"passwordPlaceholder\", \"Enter password\")}\n required\n className=\"mt-1 pr-10\"\n autoComplete=\"new-password\"\n />\n </FormField>\n\n <FormField label={t(\"confirmPassword\", \"Confirm Password\")} htmlFor=\"confirmPassword\" required\n >\n <PasswordInput\n id=\"confirmPassword\"\n name=\"confirmPassword\"\n value={formData.confirmPassword}\n onChange={handleChange}\n placeholder={t(\"passwordPlaceholder\", \"Enter password\")}\n required\n className=\"mt-1 pr-10\"\n autoComplete=\"new-password\"\n\n />\n </FormField>\n\n {error && (\n <div className=\"p-4 bg-red-50 border border-red-200 rounded-lg\">\n <p className=\"text-red-800 text-sm font-medium\">\n {error}\n </p>\n </div>\n )}\n\n <Button type=\"submit\" className=\"w-full\" disabled={isSubmitting}>\n {isSubmitting\n ? t(\"submitting\", \"Creating account...\")\n : t(\"submit\", \"Create Account\")}\n </Button>\n\n <div className=\"text-center text-sm text-muted-foreground\">\n {t(\"hasAccount\", \"Already have an account?\")}{\" \"}\n <Link\n to=\"/login\"\n className=\"text-primary hover:underline font-medium\"\n >\n {t(\"loginLink\", \"Sign in\")}\n </Link>\n </div>\n </form>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n\nexport default RegisterPage;\n"
26
+ "content": "import { useState, useEffect } from \"react\";\nimport { Link, useNavigate } from \"react-router\";\nimport { toast } from \"sonner\";\nimport { Layout } from \"@/components/Layout\";\nimport { usePageTitle } from \"@/hooks/use-page-title\";\nimport { useTranslation } from \"react-i18next\";\nimport { useAuth } from \"@/modules/auth-core\";\nimport { getErrorMessage } from \"@/modules/api\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { UserPlus, CheckCircle } from \"lucide-react\";\nimport { PasswordInput } from \"@/components/PasswordInput\";\nimport { FormField } from \"@/components/FormField\";\n\nexport function RegisterPage() {\n const { t } = useTranslation(\"register-page\");\n usePageTitle({ title: t(\"title\", \"Create Account\") });\n\n const navigate = useNavigate();\n const { register, isAuthenticated } = useAuth();\n\n const [formData, setFormData] = useState({\n username: \"\",\n email: \"\",\n password: \"\",\n confirmPassword: \"\",\n });\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState(false);\n\n // Redirect if already authenticated\n useEffect(() => {\n if (isAuthenticated) {\n navigate(\"/\", { replace: true });\n }\n }, [isAuthenticated, navigate]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setIsSubmitting(true);\n setError(null);\n\n // Validate passwords match\n if (formData.password !== formData.confirmPassword) {\n setError(t(\"passwordMismatch\", \"Passwords do not match\"));\n toast.error(t(\"toastErrorTitle\", \"Registration failed\"), {\n description: t(\"passwordMismatch\", \"Passwords do not match\"),\n });\n setIsSubmitting(false);\n return;\n }\n\n try {\n await register(formData.username, formData.email, formData.password);\n setSuccess(true);\n toast.success(t(\"toastSuccessTitle\", \"Account created!\"), {\n description: t(\n \"toastSuccessDesc\",\n \"Please check your email to verify your account.\"\n ),\n });\n } catch (err) {\n const errorMessage = getErrorMessage(\n err,\n t(\"errorGeneric\", \"Registration failed. Please try again.\")\n );\n setError(errorMessage);\n toast.error(t(\"toastErrorTitle\", \"Registration failed\"), {\n description: errorMessage,\n });\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setFormData((prev) => ({\n ...prev,\n [e.target.name]: e.target.value,\n }));\n };\n\n if (success) {\n return (\n <div className=\"min-h-screen bg-muted/30 py-12\">\n <div className=\"w-full max-w-[var(--container-max-width)] mx-auto px-4\">\n <div className=\"max-w-md mx-auto\">\n <Card>\n <CardContent className=\"pt-6\">\n <div className=\"text-center space-y-4\">\n <CheckCircle className=\"w-16 h-16 text-green-500 mx-auto\" />\n <h2 className=\"text-2xl font-bold text-foreground\">\n {t(\"successTitle\", \"Account Created!\")}\n </h2>\n <p className=\"text-muted-foreground\">\n {t(\n \"successMessage\",\n \"Please check your email to verify your account.\"\n )}\n </p>\n <Button asChild className=\"mt-4\">\n <Link to=\"/login\">{t(\"goToLogin\", \"Go to Login\")}</Link>\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <Layout>\n <div className=\"min-h-screen bg-muted/30 py-12\">\n <div className=\"w-full max-w-[var(--container-max-width)] mx-auto px-4\">\n {/* Hero Section */}\n <div className=\"text-center mb-12\">\n <h1 className=\"text-4xl font-bold text-foreground mb-4\">\n {t(\"title\", \"Create Account\")}\n </h1>\n <div className=\"w-16 h-1 bg-primary mx-auto mb-6\"></div>\n <p className=\"text-lg text-muted-foreground max-w-xl mx-auto\">\n {t(\"description\", \"Create an account to get started\")}\n </p>\n </div>\n\n <div className=\"max-w-md mx-auto\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <UserPlus className=\"w-5 h-5 text-primary\" />\n {t(\"cardTitle\", \"Sign Up\")}\n </CardTitle>\n </CardHeader>\n <CardContent>\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n <FormField\n label={t(\"username\", \"Username\")}\n htmlFor=\"username\"\n required\n >\n <Input\n id=\"username\"\n name=\"username\"\n type=\"text\"\n value={formData.username}\n onChange={handleChange}\n placeholder={t(\n \"usernamePlaceholder\",\n \"Enter your username\"\n )}\n required\n className=\"mt-1\"\n autoComplete=\"username\"\n />\n </FormField>\n <FormField\n label={t(\"email\", \"Email\")}\n htmlFor=\"email\"\n required\n >\n <Input\n id=\"email\"\n name=\"email\"\n type=\"email\"\n value={formData.email}\n onChange={handleChange}\n placeholder={t(\"emailPlaceholder\", \"Enter your email\")}\n required\n className=\"mt-1\"\n autoComplete=\"email\"\n />\n </FormField>\n <FormField\n label={t(\"password\", \"Password\")}\n htmlFor=\"password\"\n required\n >\n <PasswordInput\n id=\"password\"\n name=\"password\"\n value={formData.password}\n onChange={handleChange}\n placeholder={t(\"passwordPlaceholder\", \"Enter password\")}\n required\n className=\"mt-1 pr-10\"\n autoComplete=\"new-password\"\n />\n </FormField>\n\n <FormField\n label={t(\"confirmPassword\", \"Confirm Password\")}\n htmlFor=\"confirmPassword\"\n required\n >\n <PasswordInput\n id=\"confirmPassword\"\n name=\"confirmPassword\"\n value={formData.confirmPassword}\n onChange={handleChange}\n placeholder={t(\"passwordPlaceholder\", \"Enter password\")}\n required\n className=\"mt-1 pr-10\"\n autoComplete=\"new-password\"\n />\n </FormField>\n\n {error && (\n <div className=\"p-4 bg-red-50 border border-red-200 rounded-lg\">\n <p className=\"text-red-800 text-sm font-medium\">\n {error}\n </p>\n </div>\n )}\n\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={isSubmitting}\n >\n {isSubmitting\n ? t(\"submitting\", \"Creating account...\")\n : t(\"submit\", \"Create Account\")}\n </Button>\n\n <div className=\"text-center text-sm text-muted-foreground\">\n {t(\"hasAccount\", \"Already have an account?\")}{\" \"}\n <Link\n to=\"/login\"\n className=\"text-primary hover:underline font-medium\"\n >\n {t(\"loginLink\", \"Sign in\")}\n </Link>\n </div>\n </form>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n </Layout>\n );\n}\n\nexport default RegisterPage;\n"
27
27
  },
28
28
  {
29
29
  "path": "register-page/lang/en.json",
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@promakeai/cli",
3
- "version": "0.5.7",
3
+ "version": "0.5.8",
4
4
  "type": "module",
5
5
  "bin": {
6
- "promake": "dist/index.js"
6
+ "promake": "dist/index.js"
7
7
  },
8
8
  "files": [
9
9
  "dist/index.js",