@promakeai/cli 0.9.5 → 0.9.6
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
|
@@ -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.5",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.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
|
|
519
519
|
|
|
520
520
|
Quick Start:
|
|
521
521
|
$ promake create my-app
|
package/package.json
CHANGED
package/template/package.json
CHANGED
|
@@ -1,14 +1,9 @@
|
|
|
1
|
-
import { useEffect, useState, type ReactNode } from
|
|
2
|
-
import { useTranslation } from
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
parseJSONSchema,
|
|
8
|
-
} from "@promakeai/dbreact";
|
|
9
|
-
import type { IDataAdapter } from "@promakeai/dbreact";
|
|
10
|
-
import constants from "@/constants/constants.json";
|
|
11
|
-
import schemaJson from "./schema.json";
|
|
1
|
+
import { useEffect, useState, type ReactNode } from 'react';
|
|
2
|
+
import { useTranslation } from 'react-i18next';
|
|
3
|
+
import { DbProvider, SqliteAdapter, RestAdapter, parseJSONSchema } from '@promakeai/dbreact';
|
|
4
|
+
import type { IDataAdapter } from '@promakeai/dbreact';
|
|
5
|
+
import constants from '@/constants/constants.json';
|
|
6
|
+
import schemaJson from './schema.json';
|
|
12
7
|
|
|
13
8
|
const schema = parseJSONSchema(schemaJson as any);
|
|
14
9
|
|
|
@@ -16,9 +11,8 @@ interface AppDbProviderProps {
|
|
|
16
11
|
children: ReactNode;
|
|
17
12
|
}
|
|
18
13
|
|
|
19
|
-
const DEFAULT_LANG = constants?.site?.defaultLanguage ||
|
|
14
|
+
const DEFAULT_LANG = constants?.site?.defaultLanguage || 'en';
|
|
20
15
|
const DB_CONFIG = (constants as any)?.database;
|
|
21
|
-
const API_BASE_URL = (constants as any)?.api?.baseUrl;
|
|
22
16
|
|
|
23
17
|
/**
|
|
24
18
|
* Read auth token from localStorage (where auth-core's Zustand store persists).
|
|
@@ -26,7 +20,7 @@ const API_BASE_URL = (constants as any)?.api?.baseUrl;
|
|
|
26
20
|
*/
|
|
27
21
|
function getAuthToken(): string | null {
|
|
28
22
|
try {
|
|
29
|
-
const raw = localStorage.getItem(
|
|
23
|
+
const raw = localStorage.getItem('auth-storage');
|
|
30
24
|
if (!raw) return null;
|
|
31
25
|
const parsed = JSON.parse(raw);
|
|
32
26
|
return parsed?.state?.tokens?.accessToken ?? null;
|
|
@@ -45,11 +39,11 @@ export function AppDbProvider({ children }: AppDbProviderProps) {
|
|
|
45
39
|
|
|
46
40
|
async function loadDb() {
|
|
47
41
|
try {
|
|
48
|
-
if (DB_CONFIG?.adapter ===
|
|
42
|
+
if (DB_CONFIG?.adapter === 'rest') {
|
|
49
43
|
// REST API mode
|
|
50
44
|
const restAdapter = new RestAdapter({
|
|
51
|
-
baseUrl:
|
|
52
|
-
databasePrefix:
|
|
45
|
+
baseUrl: 'https://' + import.meta.env.VITE_TENANT_UUID + '.backend.promake.ai',
|
|
46
|
+
databasePrefix: '/database',
|
|
53
47
|
schema,
|
|
54
48
|
defaultLang: DEFAULT_LANG,
|
|
55
49
|
getToken: getAuthToken,
|
|
@@ -60,11 +54,9 @@ export function AppDbProvider({ children }: AppDbProviderProps) {
|
|
|
60
54
|
}
|
|
61
55
|
} else {
|
|
62
56
|
// SQLite mode (default)
|
|
63
|
-
const response = await fetch(
|
|
57
|
+
const response = await fetch('/data/database.db');
|
|
64
58
|
if (!response.ok) {
|
|
65
|
-
throw new Error(
|
|
66
|
-
`Failed to load database: ${response.status} ${response.statusText}`
|
|
67
|
-
);
|
|
59
|
+
throw new Error(`Failed to load database: ${response.status} ${response.statusText}`);
|
|
68
60
|
}
|
|
69
61
|
|
|
70
62
|
const buffer = await response.arrayBuffer();
|
|
@@ -73,7 +65,7 @@ export function AppDbProvider({ children }: AppDbProviderProps) {
|
|
|
73
65
|
const dbAdapter = new SqliteAdapter({
|
|
74
66
|
schema,
|
|
75
67
|
defaultLang: DEFAULT_LANG,
|
|
76
|
-
wasmPath:
|
|
68
|
+
wasmPath: '/sql-wasm.wasm',
|
|
77
69
|
});
|
|
78
70
|
|
|
79
71
|
await dbAdapter.connect();
|
|
@@ -106,11 +98,7 @@ export function AppDbProvider({ children }: AppDbProviderProps) {
|
|
|
106
98
|
}
|
|
107
99
|
|
|
108
100
|
return (
|
|
109
|
-
<DbProvider
|
|
110
|
-
adapter={adapter}
|
|
111
|
-
lang={i18n?.language || DEFAULT_LANG}
|
|
112
|
-
fallbackLang={DEFAULT_LANG}
|
|
113
|
-
>
|
|
101
|
+
<DbProvider adapter={adapter} lang={i18n?.language || DEFAULT_LANG} fallbackLang={DEFAULT_LANG}>
|
|
114
102
|
{children}
|
|
115
103
|
</DbProvider>
|
|
116
104
|
);
|
package/template/vite.config.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import { createRequire } from "module";
|
|
1
3
|
import path from "path";
|
|
2
4
|
import { execSync } from "child_process";
|
|
3
5
|
import tailwindcss from "@tailwindcss/vite";
|
|
@@ -100,6 +102,52 @@ function promakeApiPlugin(secret?: string): Plugin {
|
|
|
100
102
|
};
|
|
101
103
|
}
|
|
102
104
|
|
|
105
|
+
// Plugin: Write installed package versions to src/constants/versions.json on dev server start
|
|
106
|
+
function packageVersionsPlugin(): Plugin {
|
|
107
|
+
return {
|
|
108
|
+
name: "package-versions",
|
|
109
|
+
configureServer() {
|
|
110
|
+
const root = process.cwd();
|
|
111
|
+
const pkgJsonPath = path.join(root, "package.json");
|
|
112
|
+
|
|
113
|
+
if (!fs.existsSync(pkgJsonPath)) return;
|
|
114
|
+
|
|
115
|
+
const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, "utf-8"));
|
|
116
|
+
|
|
117
|
+
const require = createRequire(pkgJsonPath);
|
|
118
|
+
|
|
119
|
+
const resolveVersions = (deps: Record<string, string> | undefined): Record<string, string> => {
|
|
120
|
+
if (!deps) return {};
|
|
121
|
+
const resolved: Record<string, string> = {};
|
|
122
|
+
for (const name of Object.keys(deps)) {
|
|
123
|
+
if (!name.startsWith("@promakeai/")) continue;
|
|
124
|
+
try {
|
|
125
|
+
const depPkgPath = require.resolve(`${name}/package.json`);
|
|
126
|
+
const depPkg = JSON.parse(fs.readFileSync(depPkgPath, "utf-8"));
|
|
127
|
+
resolved[name] = depPkg.version;
|
|
128
|
+
} catch {
|
|
129
|
+
resolved[name] = deps[name];
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return resolved;
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
const versions = {
|
|
136
|
+
generatedAt: new Date().toISOString(),
|
|
137
|
+
packages: {
|
|
138
|
+
...resolveVersions(pkgJson.dependencies),
|
|
139
|
+
...resolveVersions(pkgJson.devDependencies),
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const outPath = path.join(root, "src", "constants", "versions.json");
|
|
144
|
+
fs.mkdirSync(path.dirname(outPath), { recursive: true });
|
|
145
|
+
fs.writeFileSync(outPath, JSON.stringify(versions, null, 2) + "\n");
|
|
146
|
+
console.log(`📦 Package versions written to src/constants/versions.json`);
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
103
151
|
// https://vite.dev/config/
|
|
104
152
|
export default defineConfig(({ mode }) => {
|
|
105
153
|
const env = loadEnv(mode, process.cwd(), "PROMAKE_");
|
|
@@ -112,6 +160,7 @@ export default defineConfig(({ mode }) => {
|
|
|
112
160
|
tailwindcss(),
|
|
113
161
|
mode === "development" && langWatchPlugin(),
|
|
114
162
|
mode === "development" && promakeApiPlugin(env.PROMAKE_SECRET),
|
|
163
|
+
mode === "development" && packageVersionsPlugin(),
|
|
115
164
|
].filter(Boolean),
|
|
116
165
|
resolve: {
|
|
117
166
|
alias: {
|