@promakeai/cli 0.7.0 → 0.7.1
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 +2 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -268,7 +268,7 @@ ${Q}`;return D.replace(J,`${Q}${$}$2`)}function tF0(D,X){return new RegExp(`<Rou
|
|
|
268
268
|
`)}else{let z=new RegExp(`\\s*import\\s+\\{\\s*${G}\\s*\\}\\s+from\\s+["']${J.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}["'];?\\n?`,"g");Q=Q.replace(z,`
|
|
269
269
|
`)}Q=Q.replace(/\n{3,}/g,`
|
|
270
270
|
|
|
271
|
-
`);try{await KZ.writeFile(Y,Q)}catch(z){return{success:!1,message:`Failed to write router file: ${z}`}}return{success:!0,message:W?`Removed route "${W}" and import for "${G}"`:`Removed import for "${G}"`,removedRoute:W}}async function ex(D,X,Z){let J=await px(X,Z.envFile||".env"),Y=process.env.BACKEND_URL,Q=
|
|
271
|
+
`);try{await KZ.writeFile(Y,Q)}catch(z){return{success:!1,message:`Failed to write router file: ${z}`}}return{success:!0,message:W?`Removed route "${W}" and import for "${G}"`:`Removed import for "${G}"`,removedRoute:W}}async function ex(D,X,Z){let J=await px(X,Z.envFile||".env"),Y=process.env.BACKEND_URL,Q=process.env.REDIS_QUEUE,$=process.env.USER_JWT_TOKEN;if(!Y||!Q||!$)return;let K={};if(D.cognito)K.cognito=!0;if(D.dynamodbTables?.length)K.dynamodb_tables=D.dynamodbTables;let G=`${Y}/api/conversations/${Q}/provision-backend-resources`;try{let W=await fetch(G,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${$}`},body:JSON.stringify(K)}),F=await W.json();if(!W.ok){console.log(j.yellow(` ⚠ Backend provision failed (HTTP ${W.status}): ${F.message||"unknown error"}`));return}if(F.data?.cognito){let V=Z.envFile||".env";await UF(X,V,{VITE_COGNITO_USER_POOL_ID:F.data.cognito.user_pool_id,VITE_COGNITO_CLIENT_ID:F.data.cognito.client_id}),console.log(j.dim(` Cognito provisioned: ${F.data.cognito.user_pool_id}`))}if(F.data?.dynamodb_tables?.length)console.log(j.dim(` DynamoDB tables: ${F.data.dynamodb_tables.join(", ")}`));if(F.data?.failed_tables?.length)for(let V of F.data.failed_tables)console.log(j.yellow(` ⚠ Table "${V.table_name}": ${V.error}`))}catch(W){console.log(j.yellow(` ⚠ Backend provision request failed: ${String(W)}`))}}var Dh=new o1("add").argument("[items...]","Registry items to add").option("-f, --force","Overwrite existing files").option("--dry-run","Preview changes without writing").option("-i, --install","Install npm/bun dependencies").option("--cwd <path>","Working directory").option("-t, --target <path>","Override module installation path (e.g., src/features/shop)").option("-m, --modules-path <path>","Override modules base path (e.g., src/features)").option("--route-path <path>","Custom route path for page modules (e.g., /hakkimizda)").option("--no-route","Skip automatic router integration for page modules").option("-n, --module-name <name>","Custom module name (e.g., faq creates modules/faq/)").option("--preset <name>","Install all modules from a preset (ecommerce, blog, portfolio). Includes header, footer, and sections. Does not overwrite existing files.").description("Add modules (components, pages, blocks) to your project").action(async(D,X)=>{X.skipInstall=!X.install;let Z=X.cwd||process.cwd();if(X.target){let $=f3.resolve(Z,X.target),K=await DV0($);if(K)Z=K}let J=await T2(Z);if(!J)console.log(j.yellow("⚠ promake.json not found. Initializing...")),await BL(Z),J=await T2(Z),console.log(j.green(`✓ Created promake.json
|
|
272
272
|
`));let Y=D||[];if(X.preset){let $=R4.find((G)=>G.name.toLowerCase()===X.preset.toLowerCase());if(!$)console.error(j.red(`Unknown preset: ${X.preset}`)),console.log(j.dim("Available presets: "+R4.map((G)=>G.name).join(", "))),process.exit(1);let K=[];if($.header)K.push($.header);if($.footer)K.push($.footer);if($.indexSections)K.push(...$.indexSections);K.push(...$.modules),console.log(j.cyan(`
|
|
273
273
|
Installing preset: ${$.name}`)),console.log(j.dim(`Modules: ${K.join(", ")}`)),console.log(j.dim(`Note: Existing files will NOT be overwritten. Theme settings are not applied (use promake theme to customize)
|
|
274
274
|
`));for(let G of K)if(!Y.includes(G))Y.push(G);if(!X.force)X.safeMode=!0}if(Y.length===0)console.error(j.red("No items specified. Use: promake add <items...> or promake add --preset <name>")),process.exit(1);let Q=new Set;for(let $ of Y)try{await T4($,Z,J,X,Q)}catch(K){if(K instanceof Error)console.log(j.red(`Failed to install ${$}: ${K.message}`))}});async function T4(D,X,Z,J,Y,Q=!0){if(Y.has(D))return;Y.add(D);let $=Z.modules||{};if(!Q&&D in $)return;let K=Y2(`Fetching ${D}...`).start();try{let G=await N4(D);if(K.text=`Installing ${G.title||D}...`,G.registryDependencies?.length){let{promake:U}=vx(G.registryDependencies);for(let B of U)K.stop(),await T4(B,X,Z,J,Y,!1),K.start(),K.text=`Installing ${G.title||D}...`}let W=[],F=J.modulesPath||Z.modulesPath||"src/modules",V=J.moduleName,z=V||D;for(let U of G.files){if(!U.content){W.push({action:"skipped",path:U.target,reason:"no content in registry (run build:registry)"});continue}let B=U.target.replace(/\$modules\$/g,F),O=U.content;if(V){B=B.replace(new RegExp(`/${D}/`,"g"),`/${V}/`),B=B.replace(new RegExp(`${D}\\.`,"g"),`${V}.`),O=O.replace(new RegExp(`useTranslation\\(["']${D}["']\\)`,"g"),`useTranslation("${V}")`),O=O.replace(new RegExp(`from ['"]\\./${D}['"]`,"g"),`from './${V}'`);let A=LF(D),T=LF(V);if(A!==T)O=O.replace(new RegExp(`\\b${A}\\b`,"g"),T)}if(J.target){if(B.startsWith(F))B=B.replace(F,J.target)}let L=f3.join(X,B),M;if(J.force)M="overwrite";else if(J.safeMode)M=OL[U.type]==="merge"?"merge":"stop";else M=OL[U.type];if(J.dryRun)W.push({action:"skipped",path:B,reason:`would ${M}`});else{let A=await _x(O,L,M);A.path=B,W.push(A)}}if((G.dependencies?.length||G.devDependencies?.length)&&!J.dryRun&&!J.skipInstall){let U=await Cx(X);if(G.dependencies?.length){let B=UL(G.dependencies,U);if(B.length>0){K.text=`Installing dependencies: ${B.join(", ")}`;try{await zL(X,B),B.forEach((O)=>U.add(O.split("@")[0]||O))}catch{}}}if(G.devDependencies?.length){let B=UL(G.devDependencies,U);if(B.length>0){K.text=`Installing dev dependencies: ${B.join(", ")}`;try{await zL(X,B,!0)}catch{}}}}if(G.envVars&&!J.dryRun){let U=Z.envFile||".env",B=await UF(X,U,G.envVars);if(B.length>0)K.stop(),console.log(j.dim(` Added env vars: ${B.join(", ")}`)),K.start()}if(G.css&&!J.dryRun){let U=Z.cssFile||"src/index.css";if((await ox(X,G.css,U)).added)K.stop(),console.log(j.dim(` Added CSS to ${U}`)),K.start()}if(G.tailwind?.config?.theme&&!J.dryRun){K.text="Updating tailwind config...";let{added:U,skipped:B}=await ix(X,G.tailwind.config.theme);if(U.length>0)K.stop(),console.log(j.dim(` Added to tailwind: ${U.join(", ")}`)),K.start()}let H=V?`${G.title||D} → ${V}`:G.title||D;if(K.succeed(`${j.green("✓")} ${H}`),!J.dryRun){let U="default",B=V||D;if(J.target)U=J.target;else if(V)U=`${F}/${V}`;else if(J.modulesPath&&J.modulesPath!==Z.modulesPath)U=`${J.modulesPath}/${D}`;if(await VF(X,B,U),await XV0(X,F,z,G),G.backendProvision&&!J.dryRun)await ex(G.backendProvision,X,Z)}if(G.type==="registry:page"&&(G.route||J.routePath)&&J.route!==!1&&!J.dryRun){let U=Z.routerFile||OF(),B=J.modulesPath||Z.modulesPath||"src/modules",O;if(J.routePath)O=J.routePath;else if(V)O=`/${V}`;else if(G.route?.path)O=G.route.path;else O=`/${z}`;let L;if(V)L=LF(V);else if(G.route?.componentName)L=G.route.componentName;else L=LF(z);let M=await ax({cwd:X,routerFile:U,importPath:`@/${B}/${z}`.replace(/^@\/src\//,"@/"),componentName:L,routePath:O});if(M.success)console.log(j.green(` ✓ Added route: ${O}`));else console.log(j.yellow(` ⚠ ${M.message}`))}for(let U of W){let B=eF0(U.action),O=U.reason?j.dim(` (${U.reason})`):"";console.log(` ${B(U.action)} ${U.path}${O}`)}if(!J.dryRun&&G.exports){let{types:U,variables:B}=G.exports;if(U.length>0||B.length>0){if(console.log(""),console.log(j.cyan(" Exports:")),B.length>0)console.log(j.dim(` Components: ${B.join(", ")}`));if(U.length>0)console.log(j.dim(` Types: ${U.join(", ")}`));let O=B[0]||U[0];if(O)console.log(""),console.log(j.dim(` import { ${O} } from '@/modules/${z}';`))}}if(!J.dryRun){let U=await Tx(D);if(U){console.log(""),console.log(j.cyan(" Usage:"));let B=U.split(`
|
|
@@ -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}}lw();import N41 from"node:fs";var R41={force:!0,recursive:!0,maxRetries:5};async function qO(D){await N41.promises.rm(D,R41)}class ow extends IW{constructor(D){super(D,"chrome")}launch(D={}){if(this.puppeteer.configuration.logLevel==="warn"&&process.platform==="darwin"&&process.arch==="x64"){if(T41.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 E41(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 qO(D)}catch(Z){throw M0(Z),Z}}defaultArgs(D={}){let X=yQ0("--disable-features",D.args);if(D.args&&X.length>0)vQ0(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=yQ0("--enable-features",D.args);if(D.args&&Y.length>0)vQ0(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=${I41.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 iY({browser:u0.CHROME,channel:dw(D)});else return this.resolveExecutablePath(void 0,X)}}function yQ0(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 vQ0(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 j41 from"node:fs";import{rename as C41,unlink as P41,mkdtemp as w41}from"node:fs/promises";import S41 from"node:os";import bQ0 from"node:path";class zO extends IW{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 Error("Missing value for profile command line argument");W=!1}else G=await w41(this.getProfilePath()),K.push("--profile"),K.push(G);await NB(u0.FIREFOX,{path:G,preferences:zO.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 qO(D)}catch(Z){throw M0(Z),Z}else try{let J=["prefs.js","user.js"],Y=await Promise.allSettled(J.map(async(Q)=>{let $=bQ0.join(D,Q+".puppeteer");if(j41.existsSync($)){let K=bQ0.join(D,Q);await P41(K),await C41($,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(S41.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 rw extends iw{#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=WQ.firefox;break;default:this.configuration.defaultBrowser="chrome",this.defaultBrowserRevision=WQ.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=WQ.chrome;break;case"firefox":this.defaultBrowserRevision=WQ.firefox;break;default:throw 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 ow(this);case"firefox":return new zO(this);default:throw 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 Error("The current platform is not supported.");let X=this.configuration.cacheDirectory,Z=await nB({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??WQ[$.product];$.currentBuildId=await lY($.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 iB({browser:$.browser,platform:D,cacheDir:X,buildId:$.buildId})}}}s6();X6();F1();G2();Y5();var uQ0=h1(i2(),1);import{spawn as x41,spawnSync as h41}from"node:child_process";import y41 from"node:fs";import v41 from"node:os";import{dirname as b41}from"node:path";import{PassThrough as f41}from"node:stream";var _41=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},fQ0=function(D,X,Z,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",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 TypeError("Cannot add initializers after decoration has completed");Q.push($(O||null))};var B=(0,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 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},k41=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})},g41=30,gQ0=30,u41=uQ0.default("puppeteer:ffmpeg"),mQ0=(()=>{let D=f41,X=[],Z,J,Y;return class extends D{static{let $=typeof Symbol==="function"&&Symbol.metadata?Object.create(D[Symbol.metadata]??null):void 0;if(fQ0(this,J={value:k41(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),fQ0(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=_41(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??=gQ0,U||=-1,B??=-1,O??=g41,L??=256,A??=!0,this.#Q=q;let{error:T}=h41(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)y41.mkdirSync(b41(M),{recursive:A});this.#X=x41(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)=>{u41(v.toString("utf8"))}),this.#D=$;let{client:I}=this.#D.mainFrame();I.once(x1.Disconnected,()=>{this.stop().catch(M0)}),this.#J=Ar(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}}),Ir(2,1),jr(([{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()]}),Mq(BJ(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(v41.cpus().length/2,8)}`]];switch($){case"webm":return[...z,["-f","webm"]].flat();case"gif":if(K=gQ0===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=[xK()],Y=[xK()],K2)](){await this.stop()}}})();V3();import c41 from"node:fs";import d41 from"node:path";K8.value={fs:c41,path:d41,ScreenRecorder:mQ0};var l41=new rw({isPuppeteerCore:!0});var sw=l41;import{execSync as p41}from"child_process";import{accessSync as i41}from"node:fs";import jW from"path";var n41=[process.env["PROGRAMFILES(X86)"]&&jW.join(process.env["PROGRAMFILES(X86)"],"Google","Chrome","Application","chrome.exe"),process.env.PROGRAMFILES&&jW.join(process.env.PROGRAMFILES,"Google","Chrome","Application","chrome.exe"),process.env.LOCALAPPDATA&&jW.join(process.env.LOCALAPPDATA,"Google","Chrome","Application","chrome.exe"),process.env["PROGRAMFILES(X86)"]&&jW.join(process.env["PROGRAMFILES(X86)"],"Microsoft","Edge","Application","msedge.exe"),process.env.PROGRAMFILES&&jW.join(process.env.PROGRAMFILES,"Microsoft","Edge","Application","msedge.exe")].filter(Boolean),o41=["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge","/Applications/Chromium.app/Contents/MacOS/Chromium"],r41=["/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 s41(D){return D.startsWith("ws://")||D.startsWith("wss://")||D.startsWith("http://")||D.startsWith("https://")}async function a41(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 Error("No webSocketDebuggerUrl in /json/version response");return J.webSocketDebuggerUrl}async function UO(D){let X=D||process.env.CHROME_REMOTE_ENDPOINT;if(X&&s41(X))try{let J=await a41(X);return{type:"remote",browser:await sw.connect({browserWSEndpoint:J})}}catch{return null}let Z=await t41(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 sw.launch({executablePath:Z,headless:!0,pipe:Y,args:J})}}catch{return null}}async function t41(D,X=process.platform,Z){if(D&&aw(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&&aw(Q))return Q;let Y=Z||[];if(!Z)switch(X){case"win32":Y=n41;break;case"darwin":Y=o41;break;default:Y=r41}for(let Q of Y)if(aw(Q))return Q;if(X!=="win32"){let Q=["chromium-browser","chromium","google-chrome-stable","google-chrome","chrome"];for(let $ of Q){let K=e41($);if(K)return K}}return null}function aw(D){try{return i41(D),!0}catch{return!1}}function e41(D){try{return p41(`command -v ${D} 2>/dev/null`,{encoding:"utf-8",timeout:3000,shell:"/bin/sh"}).trim()||null}catch{return null}}async function BO(D){try{if(D.type==="remote")await D.browser.disconnect();else await D.browser.close()}catch{}}import{mkdir as D91}from"node:fs/promises";import X91 from"path";async function tw(D,X,Z="/",J,Y){let Q=Date.now();if(!await Z91(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 UO(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 J91(3000),Y){await D91(Y,{recursive:!0});let B=q==="/"?"index":q.replace(/^\/+|\/+$/g,"").replace(/\//g,"-"),O=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19);W=X91.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 BO(K)}let z=G91(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 Z91(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 J91(D){return new Promise((X)=>setTimeout(X,D))}var Y91=["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*)/],Q91=["ECONNREFUSED","404","500","TypeError"];function $91(D){return D.replace(/^https?:\/\/localhost:\d+\//,"")}function K91(D){let X=D.split(`
|
|
492
|
-
`);for(let Z of X){let J=Z.trim();if(J.startsWith("at "))return J}return}function OO(D){if(!Y91.some((J)=>typeof J==="string"?D.includes(J):J.test(D)))return!1;return!Q91.some((J)=>D.includes(J))}function G91(D){let X=D.filter((Y)=>{let Q=Y.message||"";return!OO(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=$91(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 $=K91(Y.stack);if($)Q.suggestion=$}return Q})}function ew(D,X){console.log(""),console.log(j.bold("Health Check")+j.dim(` (${U91(D.duration)})`)),console.log(j.dim("─".repeat(40)));for(let Z of D.checks)W91(Z,X);console.log(j.dim("─".repeat(40))),z91(D)}function W91(D,X){let Z=H91(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 $)F91(G,D.severity);if(K>0)console.log(j.dim(` ... +${K} more (--verbose)`))}function F91(D,X){let J=(D.severity==="error"?"error":D.severity==="warning"?"warning":X)==="error"?j.red:j.yellow,Y=V91(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 V91(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 H91(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 z91(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 U91(D){if(D<1000)return`${D}ms`;return`${(D/1000).toFixed(1)}s`}var cQ0=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=L91(D),F=[];if(W.typecheck)F.push(()=>YE(X,$));if(W.lint)F.push(()=>KE(X,D.fix,$));if(W.build)F.push(()=>GE(X));if(W.runtime){let H=D.screenshot===!0?"./screenshots":D.screenshot||void 0;F.push(()=>tw(Z,J,Y,D.chromePath,H))}let V=[];try{if(V=await O91(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:B91.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 ew(z,D.verbose||!1);if(z.summary.errors>0)process.exit(1)});async function O91(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 L91(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 E91 from"path";import{mkdir as M91}from"node:fs/promises";import A91 from"path";async function N91(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(OO(q)||OO(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=R91(Z),W=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),F=`screenshot-${G}-${W}.png`,V=A91.join(J.output,F);return await M91(J.output,{recursive:!0}),await K.screenshot({path:V,fullPage:J.fullPage}),{url:X,route:Z,screenshotPath:V,errors:LO(Q),warnings:LO($),duration:Date.now()-Y,status:"success"}}catch(G){let W=G.message||"Unknown error";return{url:X,route:Z,screenshotPath:"",errors:LO(Q),warnings:LO($),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 dQ0(D,X,Z,J){let Y=[];for(let Q of Z){let $=Q.startsWith("/")?Q:`/${Q}`,K=X.replace(/\/+$/,"")+$,G=await N91(D,K,$,J);Y.push(G)}return Y}function R91(D){if(D==="/"||D==="")return"index";return D.replace(/^\/+|\/+$/g,"").replace(/\//g,"-").replace(/[^a-zA-Z0-9-_]/g,"_")}function LO(D){let X=new Set;return D.filter((Z)=>{if(X.has(Z.message))return!1;return X.add(Z.message),!0})}var lQ0=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=T91(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"),$=E91.resolve(D.output||"./screenshots"),K=D.quiet||D.json||!1,G=D.json?null:Y2("Launching browser...").start(),W=await UO(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 dQ0(W.browser,X,Z,{width:J,height:Y,fullPage:!!D.fullPage,timeout:Q,output:$})}finally{await BO(W)}if(G)G.stop();if(D.json)console.log(JSON.stringify(F,null,2));else if(!K)I91(F,X);if(F.some((z)=>z.status==="error"||z.errors.length>0))process.exit(1)});function T91(D){if(D.url)return D.url;if(D.port)return`http://localhost:${D.port}`;return null}function I91(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(` (${j91(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 j91(D){return D.replace(/^https?:\/\/localhost:\d+\//,"")}var pQ0={name:"@promakeai/cli",version:"0.7.0",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",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 OO(D){if(!Y91.some((J)=>typeof J==="string"?D.includes(J):J.test(D)))return!1;return!Q91.some((J)=>D.includes(J))}function G91(D){let X=D.filter((Y)=>{let Q=Y.message||"";return!OO(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=$91(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 $=K91(Y.stack);if($)Q.suggestion=$}return Q})}function ew(D,X){console.log(""),console.log(j.bold("Health Check")+j.dim(` (${U91(D.duration)})`)),console.log(j.dim("─".repeat(40)));for(let Z of D.checks)W91(Z,X);console.log(j.dim("─".repeat(40))),z91(D)}function W91(D,X){let Z=H91(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 $)F91(G,D.severity);if(K>0)console.log(j.dim(` ... +${K} more (--verbose)`))}function F91(D,X){let J=(D.severity==="error"?"error":D.severity==="warning"?"warning":X)==="error"?j.red:j.yellow,Y=V91(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 V91(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 H91(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 z91(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 U91(D){if(D<1000)return`${D}ms`;return`${(D/1000).toFixed(1)}s`}var cQ0=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=L91(D),F=[];if(W.typecheck)F.push(()=>YE(X,$));if(W.lint)F.push(()=>KE(X,D.fix,$));if(W.build)F.push(()=>GE(X));if(W.runtime){let H=D.screenshot===!0?"./screenshots":D.screenshot||void 0;F.push(()=>tw(Z,J,Y,D.chromePath,H))}let V=[];try{if(V=await O91(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:B91.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 ew(z,D.verbose||!1);if(z.summary.errors>0)process.exit(1)});async function O91(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 L91(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 E91 from"path";import{mkdir as M91}from"node:fs/promises";import A91 from"path";async function N91(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(OO(q)||OO(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=R91(Z),W=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),F=`screenshot-${G}-${W}.png`,V=A91.join(J.output,F);return await M91(J.output,{recursive:!0}),await K.screenshot({path:V,fullPage:J.fullPage}),{url:X,route:Z,screenshotPath:V,errors:LO(Q),warnings:LO($),duration:Date.now()-Y,status:"success"}}catch(G){let W=G.message||"Unknown error";return{url:X,route:Z,screenshotPath:"",errors:LO(Q),warnings:LO($),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 dQ0(D,X,Z,J){let Y=[];for(let Q of Z){let $=Q.startsWith("/")?Q:`/${Q}`,K=X.replace(/\/+$/,"")+$,G=await N91(D,K,$,J);Y.push(G)}return Y}function R91(D){if(D==="/"||D==="")return"index";return D.replace(/^\/+|\/+$/g,"").replace(/\//g,"-").replace(/[^a-zA-Z0-9-_]/g,"_")}function LO(D){let X=new Set;return D.filter((Z)=>{if(X.has(Z.message))return!1;return X.add(Z.message),!0})}var lQ0=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=T91(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"),$=E91.resolve(D.output||"./screenshots"),K=D.quiet||D.json||!1,G=D.json?null:Y2("Launching browser...").start(),W=await UO(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 dQ0(W.browser,X,Z,{width:J,height:Y,fullPage:!!D.fullPage,timeout:Q,output:$})}finally{await BO(W)}if(G)G.stop();if(D.json)console.log(JSON.stringify(F,null,2));else if(!K)I91(F,X);if(F.some((z)=>z.status==="error"||z.errors.length>0))process.exit(1)});function T91(D){if(D.url)return D.url;if(D.port)return`http://localhost:${D.port}`;return null}function I91(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(` (${j91(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 j91(D){return D.replace(/^https?:\/\/localhost:\d+\//,"")}var pQ0={name:"@promakeai/cli",version:"0.7.1",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",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
|