@flisk-sh/flisk 1.3.195 → 1.3.199

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.
Files changed (34) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +4 -4
  3. package/cli/dist/cli.js +56 -11
  4. package/cli/dist/commands/mcp.js +4 -1
  5. package/cli/dist/commands/open.js +35 -8
  6. package/cli/dist/commands/registry.js +1 -1
  7. package/cli/dist/commands/ui.js +1 -1
  8. package/cli/dist/commands/upgrade.js +2 -3
  9. package/cli/dist/mcp/tools.js +5 -2
  10. package/cli/dist/utils/cli-command.js +11 -2
  11. package/cli/dist/utils/doctor-fix.js +1 -1
  12. package/cli/dist/utils/one-command.js +112 -19
  13. package/cli/dist-bundle/{chunk-CXFHRZLM.js → chunk-3SPYAO2E.js} +1 -1
  14. package/cli/dist-bundle/chunk-6357RMGA.js +4 -0
  15. package/cli/dist-bundle/{chunk-32NCVCS7.js → chunk-7IWOM6M2.js} +1 -1
  16. package/cli/dist-bundle/chunk-CF46CD6R.js +6 -0
  17. package/cli/dist-bundle/chunk-DTIHDMED.js +5 -0
  18. package/cli/dist-bundle/chunk-GW7N23FV.js +21 -0
  19. package/cli/dist-bundle/{chunk-3RB2FQ46.js → chunk-HSNRMF4B.js} +9 -9
  20. package/cli/dist-bundle/{chunk-ZDH5BP3H.js → chunk-WMK2PS63.js} +2 -2
  21. package/cli/dist-bundle/cli.js +259 -265
  22. package/cli/dist-bundle/cold-preflight-WR2M53Z6.js +2 -0
  23. package/cli/dist-bundle/one-command-7OW747ML.js +4 -0
  24. package/cli/dist-bundle/open-635MSZHV.js +2 -0
  25. package/cli/dist-bundle/project-R7P6QBF4.js +2 -0
  26. package/cli/dist-bundle/spinner-YLB6FYQH.js +2 -0
  27. package/cli/package.json +1 -1
  28. package/package.json +1 -1
  29. package/cli/dist-bundle/chunk-DTJ6JCHV.js +0 -25
  30. package/cli/dist-bundle/chunk-TCN3L76U.js +0 -4
  31. package/cli/dist-bundle/cold-preflight-FSWLLA2X.js +0 -2
  32. package/cli/dist-bundle/one-command-A4R272U3.js +0 -4
  33. package/cli/dist-bundle/open-HXJVYBH7.js +0 -2
  34. package/cli/dist-bundle/project-5P6B5MAP.js +0 -2
@@ -0,0 +1,2 @@
1
+ import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
+ import{J as a,K as b,L as c,M as d,N as e,O as f,P as g,Q as h,R as i,S as j}from"./chunk-HSNRMF4B.js";import"./chunk-7IWOM6M2.js";import"./chunk-3SPYAO2E.js";import"./chunk-42IVF3YT.js";import"./chunk-GW7N23FV.js";import"./chunk-CF46CD6R.js";import"./chunk-6EA4DGCY.js";export{c as MACHINE_CHECK_IDS,a as RUNTIME_CHECK_IDS,b as SCAFFOLD_CHECK_IDS,h as assertMachineReadyOrExit,i as detectRuntimePrerequisites,g as formatColdPreflight,j as formatRuntimeNextSteps,d as nodeTooOld,e as requireVerifiedDockerVersions,f as runColdPreflight};
@@ -0,0 +1,4 @@
1
+ import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
+ import"./chunk-6EA4DGCY.js";import{spawn as l}from"node:child_process";import{readdirSync as d}from"node:fs";import{join as p}from"node:path";var m="Frontend URLs";function g(n){let r=n.split(`
3
+ `),t=r.findIndex(e=>e.includes(m));if(t!==-1)for(let e of r.slice(t+1)){let o=e.match(/^\s*-\s+\S+:\s+(https?:\/\/\S+)/);if(o)return o[1];if(e.trim()===""||e.includes("URLs:"))break}}function h(n){for(let r of n.split(`
4
+ `)){let t=r.trim();if(t.startsWith("{"))try{let e=JSON.parse(t),s=(e.data??{}).ok===!0;return{ok:s,error:s?void 0:e.errors?.[0]?.message??"the stack did not come up",raw:n}}catch{}}}function R(n,r,t=process.env,e=l){return new Promise(o=>{let s=e(process.execPath,[n,"up","--json"],{cwd:r,env:t,stdio:["inherit","pipe","pipe"]}),a="",i=!1,u=c=>{i||(i=!0,s.unref?.(),o(c))};s.stdout?.on("data",c=>{a+=String(c);let f=h(a);f&&u(f)}),s.stderr?.on("data",c=>{a+=String(c)}),s.on("error",c=>u({ok:!1,error:c.message,raw:a})),s.on("close",c=>u({ok:!1,error:`the stack stopped before it was ready (code ${c})`,raw:a}))})}function v(n,r){if(!r(n))return n;for(let t=2;t<1e3;t+=1){let e=`${n}-${t}`;if(!r(e))return e}return n}function k(n,r=4){let t=[],e=(o,s)=>{if(s>r)return;let a;try{a=d(o,{withFileTypes:!0}).map(i=>i.name)}catch{return}a.includes("package.json")&&t.push(o);for(let i of d(o,{withFileTypes:!0}))!i.isDirectory()||i.name==="node_modules"||i.name.startsWith(".")||e(p(o,i.name),s+1)};return e(n,0),t}async function D(n,r=w){let t=[];for(let e of k(n)){let o=await r("bun",["install"],e);t.push({dir:e,ok:o===0})}return t}function w(n,r,t){return new Promise(e=>{let o=l(n,r,{cwd:t,stdio:"ignore"});o.on("error",()=>e(1)),o.on("close",s=>e(s??1))})}export{g as findFrontendUrl,k as findServiceDirs,D as installServiceDependencies,v as nextAvailableProjectDir,h as parseStackEnvelope,R as runStackQuiet};
@@ -0,0 +1,2 @@
1
+ import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
+ import{e as a,f as b,g as c,h as d,i as e,j as f}from"./chunk-6357RMGA.js";import"./chunk-DTIHDMED.js";import"./chunk-7IWOM6M2.js";import"./chunk-GW7N23FV.js";import"./chunk-CF46CD6R.js";import"./chunk-6EA4DGCY.js";export{d as findReadyFrontend,b as isFrontendReady,a as listFrontendTargets,f as openCommand,e as openFirstFrontend,c as pickReadyFrontend};
@@ -0,0 +1,2 @@
1
+ import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
+ import{g as a,h as b,i as c,j as d}from"./chunk-WMK2PS63.js";import"./chunk-KGKKDD4K.js";import"./chunk-3SPYAO2E.js";import"./chunk-42IVF3YT.js";import"./chunk-GW7N23FV.js";import"./chunk-CF46CD6R.js";import"./chunk-6EA4DGCY.js";export{c as cloneProjectTemplate,a as enableDiscoveredStacks,d as projectCommand,b as templateTargetDir};
@@ -0,0 +1,2 @@
1
+ import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
+ import{a}from"./chunk-DTIHDMED.js";import"./chunk-CF46CD6R.js";import"./chunk-6EA4DGCY.js";export{a as startSpinner};
package/cli/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "tdk-cli-internal",
3
3
  "private": true,
4
- "version": "1.3.195",
4
+ "version": "1.3.199",
5
5
  "description": "Flisk CLI — start services on your machine.",
6
6
  "keywords": [
7
7
  "flisk",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flisk-sh/flisk",
3
- "version": "1.3.195",
3
+ "version": "1.3.199",
4
4
  "description": "Flisk CLI — start services on your machine.",
5
5
  "homepage": "https://flisk.sh",
6
6
  "repository": {
@@ -1,25 +0,0 @@
1
- import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
- function qe(e,t,r){let n=e.indexOf(t);if(n===-1)return e;let o=t.length,s=0,i="";do i+=e.slice(s,n)+t+r,s=n+o,n=e.indexOf(t,s);while(n!==-1);return i+=e.slice(s),i}function Xe(e,t,r,n){let o=0,s="";do{let i=e[n-1]==="\r";s+=e.slice(o,i?n-1:n)+t+(i?`\r
3
- `:`
4
- `)+r,o=n+1,n=e.indexOf(`
5
- `,o)}while(n!==-1);return s+=e.slice(o),s}var Qe=(e=0)=>t=>`\x1B[${t+e}m`,ue=(e=0)=>t=>`\x1B[${38+e};5;${t}m`,le=(e=0)=>(t,r,n)=>`\x1B[${38+e};2;${t};${r};${n}m`,cr=e=>`\x1B[58;5;${e<90?e-30:e-90+8}m`,d={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],underlineDouble:["4:2",24],underlineCurly:["4:3",24],underlineDotted:["4:4",24],underlineDashed:["4:5",24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]},underlineColor:{underlineBlack:["58;5;0",59],underlineRed:["58;5;1",59],underlineGreen:["58;5;2",59],underlineYellow:["58;5;3",59],underlineBlue:["58;5;4",59],underlineMagenta:["58;5;5",59],underlineCyan:["58;5;6",59],underlineWhite:["58;5;7",59],underlineBlackBright:["58;5;8",59],underlineGray:["58;5;8",59],underlineGrey:["58;5;8",59],underlineRedBright:["58;5;9",59],underlineGreenBright:["58;5;10",59],underlineYellowBright:["58;5;11",59],underlineBlueBright:["58;5;12",59],underlineMagentaBright:["58;5;13",59],underlineCyanBright:["58;5;14",59],underlineWhiteBright:["58;5;15",59]}},Ze=Object.keys(d.modifier),fe=Object.keys(d.color),de=Object.keys(d.bgColor),ur=Object.keys(d.underlineColor),et=[...fe,...de];function lr(){let e=new Map;for(let[t,r]of Object.entries(d)){for(let[n,o]of Object.entries(r))d[n]={open:`\x1B[${o[0]}m`,close:`\x1B[${o[1]}m`},r[n]=d[n],e.set(Number.parseInt(o[0],10),o[1]);Object.defineProperty(d,t,{value:r,enumerable:!1})}return Object.defineProperty(d,"codes",{value:e,enumerable:!1}),d.color.close="\x1B[39m",d.bgColor.close="\x1B[49m",d.underlineColor.close="\x1B[59m",d.color.ansi=Qe(),d.color.ansi256=ue(),d.color.ansi16m=le(),d.bgColor.ansi=Qe(10),d.bgColor.ansi256=ue(10),d.bgColor.ansi16m=le(10),d.underlineColor.ansi=cr,d.underlineColor.ansi256=ue(20),d.underlineColor.ansi16m=le(20),Object.defineProperties(d,{rgbToAnsi256:{value(t,r,n){return t===r&&r===n?t<8?16:t>248?231:Math.round((t-8)/247*24)+232:16+36*Math.round(t/255*5)+6*Math.round(r/255*5)+Math.round(n/255*5)},enumerable:!1},hexToRgb:{value(t){let r=/[\da-f]{6}|[\da-f]{3}/i.exec(t.toString(16));if(!r)return[0,0,0];let[n]=r;n.length===3&&(n=[...n].map(s=>s+s).join(""));let o=Number.parseInt(n,16);return[o>>16&255,o>>8&255,o&255]},enumerable:!1},hexToAnsi256:{value:t=>d.rgbToAnsi256(...d.hexToRgb(t)),enumerable:!1},ansi256ToAnsi:{value(t){if(t<8)return 30+t;if(t<16)return 90+(t-8);let r,n,o;if(t>=232)r=((t-232)*10+8)/255,n=r,o=r;else{t-=16;let a=t%36;r=Math.floor(t/36)/5,n=Math.floor(a/6)/5,o=a%6/5}let s=Math.max(r,n,o)*2;if(s===0)return 30;let i=30+(Math.round(o)<<2|Math.round(n)<<1|Math.round(r));return s===2&&(i+=60),i},enumerable:!1},rgbToAnsi:{value:(t,r,n)=>d.ansi256ToAnsi(d.rgbToAnsi256(t,r,n)),enumerable:!1},hexToAnsi:{value:t=>d.ansi256ToAnsi(d.hexToAnsi256(t)),enumerable:!1}}),d}var fr=lr(),T=fr;import pe from"node:process";import dr from"node:os";import tt from"node:tty";function x(e,t=globalThis.Deno?globalThis.Deno.args:pe.argv){let r=e.startsWith("-")?"":e.length===1?"-":"--",n=t.indexOf(r+e),o=t.indexOf("--");return n!==-1&&(o===-1||n<o)}var{env:p}=pe,J;x("no-color")||x("no-colors")||x("color=false")||x("color=never")?J=0:(x("color")||x("colors")||x("color=true")||x("color=always"))&&(J=1);function nt(){return/^\d+$/.test(p.FORCE_COLOR)}function pr(){if("FORCE_COLOR"in p){if(p.FORCE_COLOR==="false")return 0;if(p.FORCE_COLOR==="true"||p.FORCE_COLOR.length===0)return 1;if(nt())return Math.min(Number.parseInt(p.FORCE_COLOR,10),3)}}function mr(e){return e===0?!1:{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}function hr(e,{streamIsTTY:t,sniffFlags:r=!0}={}){let n=pr();n!==void 0&&(J=n);let o=r?J:n;if(o===0)return 0;if(r){if(x("color=16m")||x("color=full")||x("color=truecolor"))return 3;if(x("color=256"))return 2}if(o!==void 0&&nt())return o;if("TF_BUILD"in p&&"AGENT_NAME"in p)return 1;if(e&&!t&&o===void 0)return 0;let s=o||0;if(p.TERM==="dumb")return s;if(pe.platform==="win32"){let i=dr.release().split(".");return Number(i[0])>=10&&Number(i[2])>=10586?Number(i[2])>=14931?3:2:1}if("CI"in p)return["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(i=>i in p)?3:["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some(i=>i in p)||p.CI_NAME==="codeship"?1:s;if("TEAMCITY_VERSION"in p)return/^(?:9\.0*[1-9]\d*\.|\d{2,}\.)/.test(p.TEAMCITY_VERSION)?1:0;if(p.COLORTERM==="truecolor"||p.TERM==="xterm-kitty"||p.TERM==="xterm-ghostty"||p.TERM==="wezterm")return 3;if("TERM_PROGRAM"in p){let i=Number.parseInt((p.TERM_PROGRAM_VERSION||"").split(".",1)[0],10);switch(p.TERM_PROGRAM){case"iTerm.app":return i>=3?3:2;case"Apple_Terminal":return 2}}return/-256(?:color)?$/i.test(p.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(p.TERM)||"COLORTERM"in p?1:s}function rt(e,t={}){let r=hr(e,{streamIsTTY:e&&e.isTTY,...t});return mr(r)}var gr={stdout:rt({isTTY:tt.isatty(1)}),stderr:rt({isTTY:tt.isatty(2)})},ot=gr;var{stdout:st,stderr:it}=ot,V=Symbol("GENERATOR"),G=Symbol("STYLER"),X=Symbol("IS_EMPTY"),q=Symbol("LEVEL"),W=Object.create(null),at=e=>{if(!Number.isSafeInteger(e)||e<0||e>3)throw new Error("The `level` should be an integer from 0 to 3")},yr={enumerable:!0,get(){return this[q]},set(e){at(e),this[q]=e}},Sr=(e,t={})=>{t.level!==void 0&&at(t.level);let r=st?st.level:0;e[q]=t.level===void 0?r:t.level};var xr=e=>{let t=(...r)=>r.join(" ");return Sr(t,e),Object.setPrototypeOf(t,K.prototype),t};function K(e){return xr(e)}Object.setPrototypeOf(K.prototype,Function.prototype);for(let[e,t]of Object.entries(T))W[e]={get(){let r=he(this,ct(t.open,t.close,this[G]),this[X]);return Object.defineProperty(this,e,{value:r}),r}};W.visible={get(){let e=he(this,this[G],!0);return Object.defineProperty(this,"visible",{value:e}),e}};var Er=(e,t)=>{let r=T[t];if(e==="rgb"){let o=(i,a,c)=>r.ansi(T.rgbToAnsi(i,a,c));return[o,o,(i,a,c)=>r.ansi256(T.rgbToAnsi256(i,a,c)),r.ansi16m]}if(e==="hex"){let o=i=>r.ansi(T.hexToAnsi(i));return[o,o,i=>r.ansi256(T.hexToAnsi256(i)),i=>r.ansi16m(...T.hexToRgb(i))]}let n=o=>r.ansi(T.ansi256ToAnsi(o));return[n,n,r.ansi256,r.ansi256]},br=["rgb","hex","ansi256"];for(let e of br){let t=e[0].toUpperCase()+e.slice(1);for(let[r,n]of[[e,"color"],["bg"+t,"bgColor"],["underline"+t,"underlineColor"]]){let{close:o}=T[n],s=Er(e,n);W[r]={get(){let i=function(a,c,f){let m=s[this.level](a,c,f);return he(this,ct(m,o,this[G]),this[X])};return Object.defineProperty(this,r,{value:i}),i}}}}var kr=Object.defineProperties(()=>{},{...W,level:{enumerable:!0,get(){return this[V].level},set(e){this[V].level=e}}}),ct=(e,t,r)=>{let n,o;return r===void 0?(n=e,o=t):(n=r.openAll+e,o=t+r.closeAll),{open:e,close:t,openAll:n,closeAll:o,parent:r}},he=(e,t,r)=>{let n=(...o)=>o.length===1?me(n,""+o[0]):o.length===2?me(n,`${o[0]??""} ${o[1]??""}`):me(n,o.join(" "));return Object.setPrototypeOf(n,kr),n[V]=e[V]??e,n[G]=t,n[X]=r,n},me=(e,t)=>{if(e[V][q]<=0||!t)return e[X]?"":t;let r=e[G];if(r===void 0)return t;let{openAll:n,closeAll:o}=r;if(t.includes("\x1B"))for(;r!==void 0;)t=qe(t,r.close,r.open),r=r.parent;let s=t.indexOf(`
6
- `);return s!==-1&&(t=Xe(t,o,n,s)),n+t+o};Object.defineProperties(K.prototype,{...W,level:yr});var Tr=K(),uo=K({level:it?it.level:0});var l=Tr;var po="Container Runtime",I="bring-your-own";var ut="database-management",mo=".tiltignore",lt="service.json",ge="docker-compose.yml",ho=".autogenerated",vr="TILT_TECH_STACK.star",wr="TILT_RESOURCE_DEFAULTS.star",Q="project.json",ft="package.json",go=[vr,wr,"spec.master"],yo=["backend","frontend","library","sdk","worker","migrator","mcp","agent",I],So={backend:["dev","build","start"],worker:["dev","build","start"],migrator:["dev","build","start"],mcp:["dev","build","start"],agent:["dev","build","start"],frontend:["dev","build"],library:["dev","build"],sdk:["dev","build"],[I]:[]};var ye=["monitoring","elk","debezium","golden_image","verdaccio"],xo={frontend:{base:3e3,min:3e3,max:3999,range:"3000-3999"},backend:{base:4e3,min:4e3,max:4999,range:"4000-4999"},mcp:{base:4e3,min:4e3,max:5999,range:"4000-5999"},agent:{base:4e3,min:4e3,max:5999,range:"4000-5999"},[I]:{base:4e3,min:4e3,max:5999,range:"4000-5999"},worker:{base:6e3,min:6e3,max:6999,range:"6000-6999"},health:{base:5e3,min:5e3,max:5999,range:"5000-5999"},migrator:{base:7e3,min:7e3,max:7999,range:"7000-7999"}},Eo={tiltUi:10350,traefik:8080},Se="https://flisk.sh/docs/quickstart/";var dt=["node_modules",".git",".tilt",".tilt-engine","dist","build",".prisma",".turbo","coverage","tmp","temp","__tests__","test","tests",".github",".vscode","docs"],pt=["Dockerfile",ge,"docker-compose.yaml","Tiltfile","vite.config.ts","tsconfig.json","tsconfig.build.json"],Ar={infra:"\u{1F3D7}\uFE0F",core:"\u{1F527}",api:"\u26A1",app:"\u{1F3A8}",orchestrator:"\u2699\uFE0F"};function bo(e){let t=e.toLowerCase();for(let[r,n]of Object.entries(Ar))if(t.includes(r))return n;return"\u{1F4E6}"}import{existsSync as $r}from"node:fs";import{dirname as Or,join as Cr,resolve as ht}from"node:path";import{cwd as _r}from"node:process";var mt={name:"tdk-cli-internal",private:!0,version:"1.3.195",description:"Flisk CLI \u2014 start services on your machine.",keywords:["flisk","tilt","cli","local-dev","microservices"],homepage:"https://github.com/flisk-sh/flisk#readme",bugs:{url:"https://github.com/flisk-sh/flisk/issues"},repository:{type:"git",url:"git+https://github.com/flisk-sh/flisk.git",directory:"cli"},license:"MIT",author:"Flisk Team",type:"module",main:"./dist/index.js",types:"./dist/index.d.ts",bin:{flisk:"bin/tdk.js"},files:["dist","dist-bundle","bin","templates","README.md","Tiltfile","engine","discovery","specs","ext","!ext/ide-components/code_executor","shared-platform-engineering/docker-templates"],scripts:{build:"tsc && node scripts/bundle.mjs","build:watch":"tsc --watch","check:dist":"npm run build && ../scripts/check-cli-dist.sh",lint:"biome check .","lint:fix":"biome check . --write",typecheck:"tsc --project tsconfig.typecheck.json",clean:"rm -rf dist",dev:"bun run build:watch",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage --coverage.reportOnFailure --coverage.reporter=text --coverage.reporter=html --coverage.reporter=json-summary --coverage.reporter=json --coverage.reportsDirectory=coverage --reporter=default --reporter=json --outputFile.json=test-results/vitest.json",prepack:"../scripts/stage-npm-engine.sh && npm run build"},dependencies:{commander:"^15.0.0",handlebars:"^4.7.8"},devDependencies:{"@biomejs/biome":"^2.5.13","@types/node":"^22.0.0","@types/react":"^19.3.0","@vitest/coverage-v8":"^5.0.2",ajv:"^8.17.1",chalk:"^6.0.1",esbuild:"^0.28.2",ink:"^8.0.0",knip:"^6.38.0",react:"^19.3.0","react-devtools-core":"^8.0.0",typescript:"^7.0.2",vite:"^8.3.3",vitest:"^5.0.0"},engines:{node:">=22.12.0"}};function v(e=_r()){let t=ht(e),r=ht("/");for(;t!==r;){if($r(Cr(t,".tdk",Q)))return t;let n=Or(t);if(n===t)break;t=n}return null}var Z=null;function Nr(){if(Z)return Z;let e=mt;if(!e||typeof e!="object"||Array.isArray(e))throw new Error("Invalid package.json: expected object");let t=e;return Z={name:String(t.name??"@flisk-sh/flisk"),version:String(t.version??"0.0.0"),fullPackage:t},Z}function Oo(){return Nr().version}import{existsSync as gt}from"node:fs";import{delimiter as yt,extname as St,join as xt}from"node:path";import{delimiter as No,extname as Ir}from"node:path";function Y(){return process.platform==="win32"}function Dr(e){return e==="linux"?"linux":e==="darwin"?"darwin":e==="win32"?"windows":null}function Fr(e){return e==="x64"?"amd64":e==="arm64"?"arm64":null}function jr(e,t){let r=Dr(e),n=Fr(t);if(!r||!n||r==="windows"&&n!=="amd64")return null;let o=`tdk-${r}-${n}`;return r==="windows"?`${o}.exe`:o}function Io(){return jr(process.platform,process.arch)}function Do(){return Y()?"tdk.exe":"flisk"}function xe(e,t=Y()){return t?Ir(e)?[e]:[e,`${e}.exe`,`${e}.cmd`,`${e}.bat`]:[e]}function ee(e){let t=process.env.PATH??process.env.Path??"",r=Y(),n=xe(e,r);if(r&&!St(e))for(let o of(process.env.PATHEXT??".EXE;.CMD;.BAT;.COM").split(";")){let s=o.toLowerCase();s&&!n.includes(`${e}${s}`)&&n.push(`${e}${s}`)}for(let o of t.split(yt))if(o)for(let s of n){let i=xt(o,s);if(gt(i))return i}return null}function Bo(e){let t=process.env.PATH??process.env.Path??"",r=Y(),n=xe(e,r);if(r&&!St(e))for(let i of(process.env.PATHEXT??".EXE;.CMD;.BAT;.COM").split(";")){let a=i.toLowerCase();a&&!n.includes(`${e}${a}`)&&n.push(`${e}${a}`)}let o=[],s=new Set;for(let i of t.split(yt))if(i)for(let a of n){let c=xt(i,a);if(!gt(c))continue;let f=r?c.toLowerCase():c;s.has(f)||(s.add(f),o.push(c))}return o}import{execFileSync as Pr,execSync as Mr}from"node:child_process";var Et=1e4;function bt(){let e=!1;if(process.platform==="win32")try{return Pr(ee("docker")??"docker",["ps"],{stdio:"ignore",timeout:Et,windowsHide:!0}),"running"}catch(t){return t.code==="ETIMEDOUT"?"unresponsive":"missing"}for(let t of["docker ps","colima status","podman ps"])try{return Mr(t,{stdio:"ignore",timeout:Et}),"running"}catch(r){r.code==="ETIMEDOUT"&&(e=!0)}return e?"unresponsive":"missing"}function te(e,t){return e[t]??0}function Br(e,t){let r=Array.from({length:t.length+1},(n,o)=>o);for(let n=1;n<=e.length;n++){let o=[n];for(let s=1;s<=t.length;s++){let i=e[n-1]===t[s-1]?0:1;o[s]=Math.min(te(o,s-1)+1,te(r,s)+1,te(r,s-1)+i)}r=o}return te(r,t.length)}function Lr(e,t){if(e.length!==t.length)return!1;for(let r=0;r<e.length-1;r++)if(e[r]!==t[r]&&e[r]===t[r+1]&&e[r+1]===t[r]&&e.slice(0,r)===t.slice(0,r)&&e.slice(r+2)===t.slice(r+2))return!0;return!1}function kt(e,t){if(e.length<2||t.length===0||t.includes(e))return;let r=e.toLowerCase(),n,o=Number.POSITIVE_INFINITY;for(let s of t){if(s.length===0)continue;let i=s.toLowerCase(),a=Lr(r,i)?1:Br(r,i),c=Math.max(1,Math.min(2,Math.floor(Math.max(r.length,i.length)/3)));a>c||(a<o||a===o&&(n===void 0||s<n))&&(n=s,o=a)}return n}import{spawn as Ur}from"node:child_process";import{join as Vr}from"node:path";function Gr(e,t=[],r={}){return new Promise((n,o)=>{let s=[e,...t];r.verbose&&console.log(`Executing: tilt ${s.join(" ")}`);let i=Ur(ee("tilt")??"tilt",s,{stdio:r.inheritStdio?"inherit":"pipe",shell:!1,windowsHide:process.platform==="win32",timeout:r.timeoutMs}),a="",c="";r.inheritStdio||(i.stdout?.on("data",f=>{a+=f.toString()}),i.stderr?.on("data",f=>{c+=f.toString()})),i.on("close",f=>{n({exitCode:f??1,stdout:a,stderr:c})}),i.on("error",f=>{o(new Error(`Failed to spawn tilt: ${f.message}`))})})}async function Tt(){try{return(await Gr("version",[],{inheritStdio:!1,timeoutMs:1e4})).exitCode===0}catch{return!1}}function Wr(){let e=v();if(!e)throw A.notInProject();return Vr(e,".tdk",".tdk-out","Tiltfile")}function vt(e){let t=Wr();e.push("-f",t)}function qo(e,t={}){let r=[];return vt(r),t.focusTargets&&t.focusTargets.length>0&&r.push("--",`--focus=${t.focusTargets.join(",")}`),r.push(...e),t.verbose&&!t.quiet&&r.push("--verbose"),t.watch&&r.push("--watch"),r}function Xo(e={}){let t=[];return vt(t),e.focusTargets&&e.focusTargets.length>0&&t.push("--",`--focus=${e.focusTargets.join(",")}`),t}function wt(e){return e instanceof Error?e.message:String(e)}function ss(e,t){if(process.env.TDK_VERBOSE){let r=t!==void 0?`: ${wt(t)}`:"";console.warn(l.gray(`${e}${r}`))}}var E=class extends Error{suggestions;exitCode;constructor(t,r=[],n=1){super(t),this.name="TdkError",this.suggestions=r,this.exitCode=n}display(){ke(this.message,void 0,this.suggestions)}exit(){this.display(),process.exit(this.exitCode)}},be=class extends Error{code;constructor(t=1){super(`process.exit(${t})`),this.name="ProcessExitError",this.code=t}};function Ee(e,t,r=!1){let n=new Set;for(let o of e){let s=kt(o,t);s&&n.add(r?`Did you mean "${s}" for "${o}"?`:`Did you mean "${s}"?`)}return[...n]}var A={tiltNotInstalled:()=>new E("Tilt CLI is not installed",["Install Tilt: `brew install tilt` (macOS)","Or download from: https://docs.tilt.dev/install.html","Verify with: `tilt version`",`Setup guide: ${Se}`]),dockerNotAvailable:()=>new E("Docker (or a compatible container runtime) is not running",["Start Docker Desktop, then verify with: `docker ps`","Or start Colima: `colima start`","Or start the Docker service on Linux: `sudo systemctl start docker`",`Setup guide: ${Se}`]),dockerNotResponding:()=>new E("Docker is running but not responding (`docker ps` hung for 10s)",["Quit and reopen Docker Desktop, or run `colima restart`","Then verify with: `docker ps`"]),stackNotFound:(e,t=[])=>new E(`Stack "${e}" not found`,[...Ee([e],t),"Run `flisk stacks` to see available stacks","Run `flisk stack` to assign resources to a stack"]),resourceNotFound:(e,t=[])=>new E(`Resource "${e}" not found`,[...Ee([e],t),"Run `flisk resources` to list all resources","Check the resource name spelling"]),unknownServices:(e,t)=>{let r=Ee(e,t,e.length>1);return new E(`Unknown service ${e.join(", ")}. Valid names: ${t.join(", ")}`,r,2)},directoryExists:e=>new E(`Directory already exists: ${e}`,["Use `--path` to specify a different location","Remove the existing directory if no longer needed"]),invalidPath:e=>new E(`Invalid path: ${e}`,["Path must be within the project directory",'Path cannot contain special characters like <>:"|?*']),notInProject:()=>new E("Could not find project root (no .tdk/project.json found)",["Run this from within a Flisk project","Run `flisk project --yes` to initialize a new project"])};function is(){let e=v();return e||A.notInProject().exit()}function Kr(e){e instanceof E&&e.exit(),ke(wt(e)),process.exit(1)}async function Yr(e,t){try{return await e()}catch(r){if(r instanceof be)throw r;return t?.verbose&&r instanceof Error&&r.stack&&console.error(l.gray(r.stack)),Kr(r)}}async function as(e,t){let r=[],n=bt();return n==="unresponsive"?r.push(A.dockerNotResponding()):n==="missing"&&r.push(A.dockerNotAvailable()),await Tt()||r.push(A.tiltNotInstalled()),r.length>0&&(console.error(l.red(`
7
- Flisk can't start - missing prerequisites:
8
- `)),r.forEach((o,s)=>{s>0&&console.error(""),o.display()}),console.error(l.gray("\nRun `flisk doctor` for a full environment check.")),process.exit(1)),Yr(e,t)}function cs(e,t=1,r){ke(e,void 0,r),process.exit(t)}function ke(e,t,r){if(console.error(l.red(`\u274C ${e}`)),t&&console.error(l.gray(` ${t}`)),r&&r.length>0){console.error(l.yellow(`
9
- \u{1F4A1} Suggestions:`));for(let n of r)console.error(l.cyan(` \u2192 ${n}`))}}function us(e,t){console.error(l.red(`
10
- tilt ${e} failed with exit code ${t}`)),process.exit(t)}function Hr(e,t,r){return e===1?t:r||`${t}s`}function Rt(e,t,r){return`${e} ${Hr(e,t,r)}`}var zr={month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"};function ds(e){return new Date(e).toLocaleString("en-US",zr)}function ps(e){return new Date(e).toLocaleDateString("en-US",{month:"short",day:"numeric"})}var Te={success:{color:"green",icon:"\u2713",chalkFn:l.green},error:{color:"red",icon:"\u2717",chalkFn:l.red},warning:{color:"yellow",icon:"\u25CB",chalkFn:l.yellow},unknown:{color:"gray",icon:"?",chalkFn:l.gray}};function ve(e){if(!e)return"unknown";let t=e.toLowerCase();return t==="ready"||t==="healthy"||t==="active"||t==="running"?"success":t==="error"||t==="failed"||t==="critical"||t==="stopped"?"error":t==="pending"||t==="starting"||t==="building"||t==="degraded"?"warning":"unknown"}function ms(e){return Te[ve(e)].color}function hs(e){return Te[ve(e)].icon}function gs(e,t){return Te[ve(t)].chalkFn(e)}var Jr={resources:{singular:"resource",command:"flisk resource <name>",context:`
11
- To create a resource:`},stacks:{singular:"stack",command:"flisk stack <stack-name>",context:`
12
- To create a stack, use:`},services:{singular:"service",command:"flisk resource <name>",context:`
13
- To create a service:`},"stack-services":{singular:"service",command:"flisk resource <name> --stack <stack-name>",context:`
14
- To add services to this stack:`}};function ys(e,t){let r=Jr[e];console.log(t?l.yellow(`No ${r.singular}s found${t}.`):l.yellow(`No ${r.singular}s found.`)),console.log(l.gray(r.context)),console.log(l.gray(` ${r.command}`)),e==="stacks"&&(console.log(l.gray(`
15
- Or create a new resource with a stack:`)),console.log(l.gray(" flisk resource <name> --stack <stack-name>")))}function Ss(e){console.log(l.yellow(e||"Cancelled."))}function xs(e){console.log(l.blue(`Flisk ${e}
16
- `))}function Es(e,t){console.log(l.green(`All ${e} are ${t}!`))}var we=62;function bs(e="\u2500",t=we){return e.repeat(t)}function At(e,t=we-2){let r=Math.max(0,t-e.length),n=Math.floor(r/2),o=r-n;return" ".repeat(n)+e+" ".repeat(o)}function ks(e,t){return e.length>t?`${e.slice(0,t-1)}\u2026`:e.padEnd(t)}function Ts(e,t){return e.length<=t?e:`${e.slice(0,t-3)}...`}function vs(e){console.log(l.green(`\u2713 ${e}`))}function ws(e){console.log(l.blue(e))}function As(e,t=2){console.log(l.gray(`${" ".repeat(t)}${e}`))}function Rs(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function $s(e,t,r=we){let n=r-2,o="\u2500".repeat(n);console.log(),console.log(l.cyan(`\u256D${o}\u256E`)),console.log(l.cyan("\u2502")+l.bold.white(At(e,n))+l.cyan("\u2502")),t&&(console.log(l.cyan(`\u251C${o}\u2524`)),console.log(l.cyan("\u2502")+l.gray(At(t,n))+l.cyan("\u2502"))),console.log(l.cyan(`\u2570${o}\u256F`))}import{randomBytes as Ot}from"node:crypto";import{existsSync as Re,readFileSync as Ct,writeFileSync as _t}from"node:fs";import{join as $e}from"node:path";import{randomBytes as qr}from"node:crypto";import{closeSync as Xr,fchmodSync as Qr,fsyncSync as Zr,openSync as en,renameSync as tn,rmSync as rn,statSync as nn,writeFileSync as on}from"node:fs";import{basename as sn,dirname as an,join as cn}from"node:path";function $t(e,t){let r=cn(an(e),`.${sn(e)}.${process.pid}.${qr(4).toString("hex")}.tmp`),n;try{n=nn(e).mode&511}catch{n=void 0}try{let o=en(r,"wx");try{n!==void 0&&Qr(o,n),on(o,t,"utf-8"),Zr(o)}finally{Xr(o)}tn(r,e)}catch(o){throw rn(r,{force:!0}),o}}var N=[{name:"VERDACCIO_URL_DOCKER",description:"Docker-internal URL of the private npm registry (Verdaccio, a paid feature)",required:!1,default:"http://verdaccio:4873",example:"http://verdaccio:4873"},{name:"VERDACCIO_URL",description:"Local URL of the private npm registry (Verdaccio, a paid feature)",required:!1,default:"http://localhost:4873"},{name:"TILT_ENV",description:"Tilt environment name",required:!0,default:"dev",example:"dev",complete:!0},{name:"DATABASE_URL",description:"PostgreSQL connection string (uses the generated DB_PASSWORD below)",required:!1},{name:"DB_PASSWORD",description:"PostgreSQL superuser password (docker-compose POSTGRES_PASSWORD)",required:!0,example:"postgres",complete:!0},{name:"JWT_SECRET",description:"Secret that signs local-jwt tokens (generated once per project; never shared between projects)",required:!1,complete:!0}],Nt=()=>Ot(16).toString("hex"),un=()=>Ot(32).toString("hex"),Ms=N.filter(e=>e.complete).map(e=>e.name);function Ae(e,t){return e==="DB_PASSWORD"?t:e==="JWT_SECRET"?un():e==="DATABASE_URL"?`postgresql://postgres:${t}@postgres:5432/app_dev`:N.find(r=>r.name===e)?.default??""}function ln(e){let t=e.trim(),r=t[0];if(r==='"'||r==="'"){let o=!1;for(let s=1;s<t.length;s+=1){let i=t[s];if(o){o=!1;continue}if(i==="\\"){o=!0;continue}if(i===r){let a=t.slice(1,s);if(r==='"'){let c={n:`
17
- `,r:"\r",t:" ",'"':'"',"\\":"\\",$:"$"};return a.replace(/\\([nrt"\\$])/g,(f,m)=>c[m]??m)}return a.replace(/\\'/g,"'")}}return t}let n=e.search(/\s#/);return(n===-1?e:e.slice(0,n)).trim()}function D(e){let t=new Map,r=e.startsWith("\uFEFF")?e.slice(1):e;for(let n of r.split(/\r?\n/)){let o=n.trim();if(!o||o.startsWith("#"))continue;let s=o.startsWith("export ")?o.slice(7).trim():o,i=s.indexOf("=");if(i<=0)continue;let a=s.slice(0,i).trim();/^[A-Za-z_][A-Za-z0-9_]*$/.test(a)&&t.set(a,ln(s.slice(i+1)))}return t}function It(e){let t=[`# ${e.description}`];return e.required&&t.push("# Required (the value below is a working default)"),e.example&&t.push(`# Example: ${e.example}`),t}function Dt(){let e=Nt(),t=["# \u{1F527} Flisk Environment Configuration","# Generated by `flisk project`. The defaults work as-is; edit only to change them.","# Keep this file out of git: it holds a generated database password and JWT secret.","#","# After editing, run: flisk config regenerate && flisk up",""];for(let r of N)t.push(...It(r)),t.push(`${r.name}=${Ae(r.name,e)}`),t.push("");return t.join(`
18
- `)}function fn(e){let t=e.match(/^[a-z][a-z0-9+.-]*:\/\/[^:/@\s]+:([^@\s]*)@/i);if(!(!t||t[1].includes("$")))return t[1]}function Bs(e){let t=$e(e,".env"),r={missing:[],invalid:[],warnings:[]};if(!Re(t))return{missing:N.filter(i=>i.required).map(i=>i.name),invalid:[],warnings:[".env file not found - will be auto-generated"]};let n=D(Ct(t,"utf-8"));for(let i of N)i.required&&!n.has(i.name)&&r.missing.push(i.name),n.has(i.name)&&!(n.get(i.name)??"").trim()&&r.invalid.push(`${i.name} is set but empty`);let o=n.get("DATABASE_URL"),s=n.get("DB_PASSWORD");if(o&&s){let i=fn(o);i!==void 0&&i!==s&&r.warnings.push("DATABASE_URL carries a different password than DB_PASSWORD; the database container uses DB_PASSWORD")}return r}function dn(e,t,r){if(!D(e).has(t))return e;let o=e.indexOf("=");if(o<0)return e;let s=e.slice(o+1),i=s.search(/\s#/),a=i<0?"":s.slice(i);return e.slice(0,o+1)+r+a}function Ls(e){let t=$e(e,".env");if(!Re(t))return _t(t,Dt(),{mode:384}),N.map(u=>u.name);let r=Ct(t,"utf-8"),n=D(r),o=N.filter(u=>u.complete?n.has(u.name)?!(n.get(u.name)??"").trim():!0:!1);if(o.length===0)return[];let s=o.filter(u=>!n.has(u.name)),i=o.filter(u=>n.has(u.name)),a=n.get("DB_PASSWORD"),c=a?.trim()?a:Nt(),f=r.split(/(\r\n|\n|\r)/);for(let u of i){let y=-1;for(let h=0;h<f.length;h+=2)D(f[h]).has(u.name)&&(y=h);if(y<0)throw new Error(`Could not locate empty .env assignment for ${u.name}`);f[y]=dn(f[y],u.name,Ae(u.name,c))}let m=f.join("");if(s.length>0){let u=["","# Added by Flisk: keys this version expects. Existing values above were not changed.",""];for(let h of s)u.push(...It(h)),u.push(`${h.name}=${Ae(h.name,c)}`),u.push("");let y=m.endsWith(`
19
- `)||m.endsWith("\r")?"":`
20
- `;m+=y+u.join(`
21
- `)}return $t(t,m),o.map(u=>u.name)}function Us(e){let t=$e(e,".env");return Re(t)?!1:(_t(t,Dt(),{mode:384}),!0)}import{readFileSync as pn}from"node:fs";import{join as mn}from"node:path";function F(e){return e==="backend"||e==="mcp"||e==="agent"}function Js(){return Ft(v())}function Ft(e){if(e)try{let t=pn(mn(e,".tdk",Q),"utf-8"),r=JSON.parse(t);if(r?.project?.name)return r.project.name}catch{}return"tdk-project"}function Oe(e,t){let r=Ft(t??v()),n=process.env.TDK_SERVICE_BASE_URL??`http://${r}.localhost${e?`:${e}`:""}`;try{let o=new URL(n.includes("://")?n:`http://${n}`),s=o.hostname,i=o.protocol==="https:"?"443":"80",a=o.port||(e?String(e):""),c=a===i?"":a;if(s==="localhost"||/^\d+\.\d+\.\d+\.\d+$/.test(s))return{appBase:`${o.protocol}//${s}${c?`:${c}`:""}`,apiBase:`${o.protocol}//${s}${c?`:${c}`:""}`};let f=s.replace(/^(app|api)\./,"");return{appBase:`${o.protocol}//app.${f}${c?`:${c}`:""}`,apiBase:`${o.protocol}//api.${f}${c?`:${c}`:""}`}}catch{return{appBase:`http://app.${r}.localhost`,apiBase:`http://api.${r}.localhost`}}}function hn(e){return`${e.replace(/\/+$/,"")}/health`}function Ce(e){if(F(e.config?.appType)){let t=e.name.replace(/-api$/,"");return e.config?.apiPath??`/api/${t}`}return e.config?.basePath??`/${e.name}`}function qs(e,t){return jt(e,t,r=>hn(r))}function Xs(e,t){return jt(e,t,r=>r)}function jt(e,t,r){let{appBase:n,apiBase:o}=Oe(t);return e.filter(s=>s.config?.appType==="frontend"||F(s.config?.appType)).map(s=>{let i=F(s.config.appType)?o:n;return{name:s.name,appType:s.config.appType,url:`${i}${r(Ce(s))}`}})}async function gn(e,t){try{let r=await fetch(e.url,{method:"GET",redirect:"manual",signal:AbortSignal.timeout(t)});return{...e,ok:r.ok,status:r.status}}catch(r){let n=r instanceof Error&&r.name==="TimeoutError"?`no response within ${t}ms`:r instanceof Error?r.message:String(r);return{...e,ok:!1,error:n}}}async function Qs(e,t){return Promise.all(e.map(r=>gn(r,t)))}var yn=/^[a-z0-9-]+$/;function Pt(e){return yn.test(e)}var Sn="Use lowercase letters, numbers, and hyphens only";function Mt(e,t){return`${e} "${t}" is not valid. ${Sn}, e.g. "${e==="Resource name"?"my-service":"my-stack"}".`}function xn(e){return e.trim()?Pt(e)?{valid:!0}:{valid:!1,error:Mt("Resource name",e)}:{valid:!1,error:"Resource name is required"}}function En(e){return e.trim()?Pt(e)?{valid:!0}:{valid:!1,error:Mt("Stack name",e)}:{valid:!1,error:"Stack name is required"}}function ti(e){let t=e==="resource"?xn:En;return r=>{let n=t(r);return n.valid?!0:n.error??"Invalid name"}}function ri(e){return _e(ye,e)?{valid:!0}:{valid:!1,error:`Invalid service. Must be one of: ${ye.join(", ")}`}}function ni(e){return Number.isInteger(e)&&e>0&&e<=65535}function oi(e){return!e.includes("\0")&&!/[<>:"|?*]/.test(e)}function si(e,t="_"){return e.replace(/[^a-zA-Z0-9-]/g,t).substring(0,100)}function _e(e,t){return e.includes(t)}import sr,{existsSync as P,readdirSync as Vn,readFileSync as Gn,statSync as Me}from"node:fs";import{dirname as Wn,join as C}from"node:path";var H=class{data;options;constructor(t){this.data=new Map,this.options=t}has(t){let r=this.data.get(t);return r?Date.now()-r.timestamp>this.options.ttlMs?(this.data.delete(t),!1):!0:!1}get(t){if(this.has(t))return this.data.get(t)?.value}set(t,r){this.data.set(t,{value:r,timestamp:Date.now()})}delete(t){this.data.delete(t)}clear(){this.data.clear()}keys(){let t=[];for(let r of this.data.keys())this.has(r)&&t.push(r);return t}size(){return this.keys().length}};function Bt(e){let t=0;return{isValid(){return Date.now()-t<e},markUpdated(){t=Date.now()},reset(){t=0}}}import{existsSync as rr,readFileSync as nr}from"node:fs";import{copyFileSync as Wt,mkdirSync as Rn,rmSync as Kt,writeFileSync as Yt}from"node:fs";import{join as j}from"node:path";import{existsSync as bn,readFileSync as kn}from"node:fs";import{join as Tn}from"node:path";var vn="[REDACTED]",Ne=class extends Error{path;constructor(t,r){super(`Could not read ${t}: ${r}`),this.path=t,this.name="EnvUnreadableError"}},wn=8;function An(e,t=[]){let r=[...Lt(Tn(e,".env")),...t.flatMap(n=>Lt(n))];return[...new Set(r)].sort((n,o)=>o.length-n.length)}function Lt(e){if(!bn(e))return[];let t;try{t=kn(e,"utf-8")}catch(r){throw new Ne(e,r instanceof Error?r.message:String(r))}return[...D(t).values()].filter(r=>r.length>=wn)}function Vt(e,t){let r=e;for(let n of t)r=r.split(n).join(vn);return r}function Ut(e,t){return t.length===0?e:typeof e=="string"?Vt(e,t):Array.isArray(e)?e.map(r=>Ut(r,t)):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([r,n])=>[r,Ut(n,t)])):e}function Gt(e,t=[]){let r;try{r=An(e,t)}catch(n){return()=>{throw n}}return n=>Vt(n,r)}var Qt=60,Ht=1e3,zt=1e4,Jt=200,qt=64*1024,Xt=new Set([404,502,503,504]),$n=new Set(["ECONNREFUSED","ENOTFOUND","EAI_AGAIN","EHOSTUNREACH","ENETUNREACH"]),On=new Set(["GET","HEAD","OPTIONS"]);function $(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Cn(e,t){if(On.has(t))return!0;if(!$(e))return!1;let r=$(e.cause)?e.cause:void 0,n=e.code??r?.code;return typeof n=="string"&&$n.has(n)}function De(e){if(!$(e))return['smoke: must be an object with "via" and "steps"'];let t=[];return e.via!=="proxy"&&t.push('smoke.via: only "proxy" is supported (the check must go through the public URL)'),e.timeoutSeconds!==void 0&&!(typeof e.timeoutSeconds=="number"&&e.timeoutSeconds>0)&&t.push("smoke.timeoutSeconds: must be a number greater than 0"),!Array.isArray(e.steps)||e.steps.length===0?(t.push("smoke.steps: needs at least one step"),t):(e.steps.forEach((r,n)=>{let o=`smoke.steps[${n}]`;if(!$(r)){t.push(`${o}: must be an object`);return}let s=r.path;(typeof s!="string"||!s.startsWith("/")||s.startsWith("//"))&&t.push(`${o}.path: must start with "/" and is appended to the public URL; a full URL or relative path would skip the proxy`),r.expect!==void 0&&!(typeof r.expect=="number"&&Number.isInteger(r.expect)&&r.expect>=100&&r.expect<=599)&&t.push(`${o}.expect: must be an HTTP status between 100 and 599`),r.bodyContains!==void 0&&typeof r.bodyContains!="string"&&t.push(`${o}.bodyContains: must be a string`),r.save!==void 0&&($(r.save)&&Object.values(r.save).every(a=>typeof a=="string"&&a.startsWith("$."))||t.push(`${o}.save: must map names to paths such as "$.id"`))}),t)}function Si(e,t){let{appBase:r,apiBase:n}=Oe(t),o=[];for(let s of e){let i=s.config;if(!i?.smoke)continue;let a=i.appType,c=F(a)||a===I;if(!c&&a!=="frontend"||i.exposeViaProxy===!1)continue;let f=c?n:r,m=i.healthCheckPath||(c&&a!==I?"/health":void 0);o.push({name:s.name,baseUrl:`${f}${Ce(s).replace(/\/+$/,"")}`,...m?.startsWith("/")?{readyPath:m}:{},smoke:i.smoke})}return o}var _n=10;function xi(e,t={}){let r=t.timeoutSeconds??_n;return e.flatMap(n=>{let o=n.smoke.steps.filter(i=>(i.method??"GET").toUpperCase()==="GET"&&i.body===void 0&&!i.path.includes("{{")).map(i=>({...i,bodyContains:void 0}));if(o.length===0)return[];let s=Math.min(n.smoke.timeoutSeconds??Qt,r);return[{name:n.name,baseUrl:n.baseUrl,smoke:{via:n.smoke.via,timeoutSeconds:s,steps:o}}]})}function Nn(e,t){let r=t.replace(/^\$\.?/,"").match(/[^.[\]]+/g)??[],n=e;for(let o of r){if(n==null||o==="__proto__"||o==="constructor"||o==="prototype"||!Object.hasOwn(n,o))return;let s=Object.getOwnPropertyDescriptor(n,o);if(!s||!("value"in s))return;n=s.value}return n}function Zt(e,t){return e.replace(/\{\{(\w+)\}\}/g,(r,n)=>t[n]??r)}function Ie(e,t){return typeof e=="string"?Zt(e,t):Array.isArray(e)?e.map(r=>Ie(r,t)):$(e)?Object.fromEntries(Object.entries(e).map(([r,n])=>[r,Ie(n,t)])):e}function re(e){let t=e.replace(/\s+/g," ").trim();return t.length>Jt?`${t.slice(0,Jt)}...`:t}function er(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"step"}function In(e,t){let r=er(t),n=(e.get(r)??0)+1;return e.set(r,n),n===1?r:`${r}-${n}`}function Dn(e,t,r,n,o){try{let s=j(e,er(r.service),t);Rn(s,{recursive:!0});let i=j(s,"latest.json"),a=j(s,"body.txt");return n===void 0?Kt(a,{force:!0}):Yt(a,n),Yt(i,`${JSON.stringify({...r,bodyPath:n===void 0?null:"body.txt"},null,2)}
22
- `),o&&(Wt(i,j(s,"last-success.json")),n===void 0?Kt(j(s,"last-success-body.txt"),{force:!0}):Wt(a,j(s,"last-success-body.txt"))),i}catch{return}}function Fn(e){let t=Buffer.from(e,"utf8");if(t.length<=qt)return{body:e,truncated:!1,bytes:t.length};let r=t.subarray(0,qt).toString("utf8").replace(/\uFFFD$/,"");return{body:r,truncated:!0,bytes:Buffer.byteLength(r,"utf8")}}async function jn(e,t={}){let r=t.fetch??((m,u)=>fetch(m,u)),n=t.now??Date.now,o=t.sleep??(m=>new Promise(u=>setTimeout(u,m))),s=(e.smoke.timeoutSeconds??Qt)*1e3,i=n()+s,a={},c=De(e.smoke);if(c.length>0)return{name:e.name,ok:!1,failure:`${e.name}: invalid smoke block: ${c.join("; ")}`};if(e.readyPath){let m=`${e.baseUrl}${e.readyPath}`;for(;;){try{let u=await r(m,{method:"GET",signal:AbortSignal.timeout(zt)});if(await u.text(),!Xt.has(u.status)&&u.status<500)break}catch{}if(n()>=i)break;await o(Ht)}}i=n()+s;let f=new Map;for(let[m,u]of e.smoke.steps.entries()){let y=u.name??`step ${m+1}`,h=(u.method??"GET").toUpperCase(),We=`${e.baseUrl}${Zt(u.path,a)}`,M=u.expect??200,Ke=u.body!==void 0,b,B="",R,ie;for(;;){R=void 0,ie=void 0,b=void 0;let S=!1;try{let g=await r(We,{method:h,headers:Ke?{"content-type":"application/json"}:void 0,body:Ke?JSON.stringify(Ie(u.body,a)):void 0,signal:AbortSignal.timeout(zt)});b=g.status,B=await g.text()}catch(g){S=Cn(g,h),R=g instanceof Error?g.message:String(g);let _=$(g)?g.code??($(g.cause)?g.cause.code:void 0):void 0;ie=typeof _=="string"?_:void 0}if(!(R!==void 0&&S||b!==void 0&&b!==M&&Xt.has(b))||n()>=i)break;await o(Ht)}let Ye=!1,ae=S=>{if(!Ye){if(!t.redact)return S;try{return t.redact(S)}catch(w){Ye=!0;let g=w instanceof Error?w.message:String(w);t.warn?.(`${e.name}: ${y}: the response text was neither shown nor stored: ${g}`);return}}},ce=ae(We),k=b===void 0?void 0:ae(B),He=R===void 0?void 0:ae(R),ze=R===void 0?void 0:ie??He,L=`${e.name}: ${y}: ${h} ${ce??"(url withheld)"}`,Je;if(t.recordDir){let S=k===void 0?void 0:Fn(k),w=R===void 0&&b===M&&(u.bodyContains===void 0||B.includes(u.bodyContains));Je=Dn(t.recordDir,In(f,y),{service:e.name,step:y,method:h,...ce===void 0?{}:{url:ce},expectedStatus:M,status:b??null,...ze===void 0?{}:{error:ze},truncated:S?.truncated??!1,bodyBytes:S?.bytes??0},S?.body,w)}let U=S=>({name:e.name,ok:!1,failure:S,recordPath:Je});if(R!==void 0)return U(`${L} never answered (${He??"the error was withheld"})`);if(b!==M)return U(`${L} returned ${b}, expected ${M}${k?`: ${re(k)}`:""}`);if(u.bodyContains!==void 0&&!B.includes(u.bodyContains))return U(`${L} returned ${b} but the body does not contain "${u.bodyContains}"${k?`: ${re(k)}`:""}`);if(u.save){let S;try{S=JSON.parse(B)}catch{return U(`${L} returned a body that is not JSON, cannot save${k?`: ${re(k)}`:""}`)}for(let[w,g]of Object.entries(u.save)){let _=Nn(S,g);if(_==null||typeof _=="object")return U(`${L} response has no ${g} to save as {{${w}}}${k?`: ${re(k)}`:""}`);a[w]=String(_)}}}return{name:e.name,ok:!0}}function Ei(e){return`Smoke check failed: ${e.failure}${e.recordPath?` (record: ${e.recordPath})`:""}`}function bi(e,t,r={}){return{redact:Gt(e,r.envFiles??[]),...t?{warn:t}:{}}}async function ki(e,t={}){return Promise.all(e.map(r=>jn(r,t)))}var tr=1,Ai="https://flisk.sh/schema.service.json",Pn={dependencies:"deprecated, use dependsOn (still read for now)",envVars:"deprecated, use params (still read when params is absent)",jwtSecret:"ignored. A secret must not be committed: remove it and set JWT_SECRET in the project .env"},Mn=new Set(["$schema","agent","apiBasePath","apiPath","appName","appType","backendName","basePath","build","buildContext","databaseName","dependencies","dev","dependsOn","dockerfile","enabled","exposeViaProxy","featuresEnabled","framework","healthCheckPath","image","language","name","nats","params","playwright","port","replicas","restart","runtime","sablier","schemaVersion","secrets","smoke","stack","syncs","traefik","type"]),Bn=[{path:["healthCheckPath"],pattern:/^\/[a-z0-9/-]*$/,expected:"a path such as /health"},{path:["traefik","host"],pattern:/^[A-Za-z0-9.-]+$/,expected:"a hostname such as shop.backend.myproject.local"},{path:["traefik","pathPrefix"],pattern:/^\/[a-z0-9/-]*$/,expected:"a path such as /api/v1/shop-management"},{path:["traefik","healthCheck"],pattern:/^\/[a-z0-9/-]*$/,expected:"a path such as /health"},{path:["nats","queueGroup"],pattern:/^[A-Za-z0-9_.-]+$/,expected:"letters, digits, '_', '.' or '-'"},{path:["databaseName"],pattern:/^[A-Za-z0-9_-]+$/,expected:"letters, digits, '_' or '-'"},{path:["stack"],pattern:/^[A-Za-z0-9_-]+$/,expected:"letters, digits, '_' or '-'"},{path:["image"],pattern:/^[A-Za-z0-9._/:@-]+$/,expected:"an image reference such as ghcr.io/acme/app:1.0"}];function ne(e,t){let r=[],n=new Set;for(let{path:o,pattern:s,expected:i}of Bn){let a=e;for(let f of o)a=a&&typeof a=="object"&&!Array.isArray(a)?a[f]:void 0;if(a==null||a==="")continue;let c=`${t}.${o.join(".")}`;(typeof a!="string"||!s.test(a))&&n.add(c),typeof a!="string"?r.push(`${c}: expected a string`):s.test(a)||r.push(`${c}: must be ${i} (no spaces, line breaks or YAML syntax)`)}for(let[o,s]of Ln(e,t))n.has(o)||r.push(`${o}: ${s}`);return r}function Fe(e){for(let t=0;t<e.length;t++){let r=e.charCodeAt(t);if(r<32||r===127||r===133||r===8232||r===8233)return!0}return!1}function Ln(e,t){let r=[],n=Object.entries(e).filter(([o])=>o!=="smoke").map(([o,s])=>[s,`${t}.${o}`]);for(let o of Object.keys(e))Fe(o)&&r.push([t,"a key contains a line break"]);for(;n.length>0;){let[o,s]=n.pop();if(typeof o=="string")Fe(o)&&r.push([s,"must not contain line breaks or control characters"]);else if(Array.isArray(o))for(let[i,a]of o.entries())n.push([a,`${s}[${i}]`]);else if(o&&typeof o=="object")for(let[i,a]of Object.entries(o))Fe(i)?r.push([s,"a key contains a line break"]):n.push([a,`${s}.${i}`])}return r.sort(([o],[s])=>o.localeCompare(s))}var Un=["apiPath","basePath"];function je(e){if(!e||typeof e!="object"||Array.isArray(e))return[];let t=e;return Un.filter(r=>r in t&&typeof t[r]!="string")}function Pe(e,t){if(!e||typeof e!="object"||Array.isArray(e))return{errors:[`${t}: expected a JSON object`],warnings:[]};let r=e,n=[];for(let a of["appName","appType","stack","schemaVersion"])a in r||n.push(`${t}.${a}: required field is missing`);for(let a of["appName","appType","stack"])a in r&&typeof r[a]!="string"&&n.push(`${t}.${a}: expected a string`);"schemaVersion"in r&&r.schemaVersion!==tr&&n.push(`${t}.schemaVersion: unsupported version ${String(r.schemaVersion)} (supported: ${tr})`);for(let a of je(r))n.push(`${t}.${a}: expected a string`);let o=r.dev,s=o&&typeof o=="object"&&!Array.isArray(o)?o.liveReload:void 0;if(s!==void 0&&typeof s!="boolean"&&n.push(`${t}.dev.liveReload: expected true or false`),n.push(...ne(r,t)),"smoke"in r)for(let a of De(r.smoke))n.push(`${t}.${a}`);let i=Object.keys(r).flatMap(a=>{let c=Pn[a];return c?[`${t}.${a}: ${c}`]:Mn.has(a)?[]:[`${t}.${a}: unknown field is preserved`]});return s===!0&&r.language!=="go"&&i.push(`${t}.dev.liveReload: only applies to Go services (language "go"); it is ignored here`),{errors:n,warnings:i,manifest:r}}function Ri(e,t){if(!rr(e))return[];try{let r=JSON.parse(nr(e,"utf-8"));return!r||typeof r!="object"||Array.isArray(r)?[]:ne(r,t)}catch{return[]}}function $i(e,t){if(!rr(e))return{errors:[`${t}: file is missing`],warnings:[]};try{let r=JSON.parse(nr(e,"utf-8"));return Pe(r,t)}catch(r){let n=r instanceof Error?r.message:String(r);return{errors:[`${t}: invalid JSON (${n})`],warnings:[]}}}function or(e){if(e.length===0||e.every(r=>r==="unknown"))return"unknown";let t=e.filter(r=>r==="ready").length/e.length;return t>.9?"healthy":t>.5?"degraded":"error"}var Kn=lt;function Ve(e,t=5,r=0){let n=[];if(r>t)return n;let o=sr.readdirSync(e,{withFileTypes:!0});for(let s of o){let i=C(e,s.name);if(s.isDirectory()){if(Yn(s.name))continue;n.push(...Ve(i,t,r+1))}else s.isFile()&&s.name===Kn&&n.push(i)}return n}function Ui(e){return Ve(e)}function Yn(e){return _e(dt,e)||e.startsWith(".")}function Hn(e){if(!e||typeof e!="object")return!1;let t=e,r=typeof t.runtime=="string"||typeof t.appType=="string"||typeof t.type=="string";return typeof t.appName=="string"&&r}var oe=new Set;var O=class extends Error{reason;constructor(t){super(t),this.reason=t,this.name="InvalidServiceJsonError"}};function Be(e){return e instanceof Error?e.message:String(e)}function zn(e){let t;try{t=sr.readFileSync(e,"utf-8")}catch(c){throw new O(`could not read file: ${Be(c)}`)}let r;try{r=JSON.parse(t)}catch(c){throw new O(`invalid JSON: ${Be(c)}`)}if(!Hn(r))throw new O("missing required fields (appName, runtime or appType)");let n=je(r);if(n.length>0)throw new O(n.map(c=>`${c}: expected a string`).join("; "));let o=ne(r,e);if(o.length>0)throw new O(o.join("; "));let s=r;for(let c of Pe(r,e).warnings)oe.has(c)||(oe.add(c),console.warn(`\u26A0\uFE0F ${c}`));let i={...s,appType:s.appType||s.type},a=Wn(e);return{name:i.appName,path:a,configPath:e,config:i,stack:i.stack,port:i.port,type:i.appType}}function ir(e){let t=Ve(e),r=[],n=[];for(let o of t)try{r.push(zn(o))}catch(s){n.push({path:o,reason:s instanceof O?s.reason:Be(s)})}return{resources:r,problems:n}}function Jn(e){for(let t of e){let r=`skipped ${t.path}: ${t.reason}`;oe.has(r)||(oe.add(r),console.warn(`\u26A0\uFE0F ${r}`))}}function ar(e){let{resources:t,problems:r}=ir(e);return Jn(r),t}function se(){let e=v();if(!e)throw A.notInProject();return ar(e)}function Vi(e){let t=e;if(!t){let r=v();if(!r)throw A.notInProject();t=ir(r)}if(t.problems.length>0)throw new Error(t.problems.map(r=>`Invalid service.json at ${r.path}: ${r.reason}`).join(`
23
- `));return t.resources}function Gi(e,t){let r=t??ar(e);return qn(r)}function qn(e){let t=e||se(),r=new Set;for(let n of t)n.stack&&r.add(n.stack);return Array.from(r).sort()}function Wi(e=se()){let t=new Map;for(let n of e)if(n.stack){let o=t.get(n.stack);o?o.push(n):t.set(n.stack,[n])}let r=[];for(let[n,o]of t)r.push({name:n,description:Rt(o.length,"resource"),resources:o,resourceCount:o.length});return r.sort((n,o)=>n.name.localeCompare(o.name))}function Ki(e,t){return(t??se()).filter(n=>n.stack===e)}function Yi(e,t){return(t??se()).some(n=>n.stack===e)}var Ge=5e3,Le=new H({ttlMs:Ge}),Ue=new H({ttlMs:Ge}),z=Bt(Ge);function Hi(){Le.clear(),Ue.clear(),z.reset()}function Xn(e,t){if(e==="Dockerfile"||e.startsWith("docker-compose"))return"docker";if(e==="Tiltfile"||e.endsWith(".star"))return"tilt";if(e==="vite.config.ts"||e==="tsconfig.json"||e===ft)return"config";if(e==="schema.prisma"||e.includes("migration"))return"prisma";if(t){let r=t.split(`
24
- `).slice(0,10).join(`
25
- `);if(r.includes("GENERATED BY Flisk")||r.includes("AUTOGENERATED"))return"generated"}return"unknown"}function Qn(e){let t=e.configPath;if(z.isValid()){let h=Le.get(t);if(h)return h}let r=e.path,n=Me(e.configPath),o=n.mtime.toISOString(),s=n.mtime.toISOString(),i=Zn(r),a=P(C(r,"Dockerfile")),c=P(C(r,"Tiltfile")),f=P(C(r,ge))||P(C(r,"docker-compose.yaml")),m=e.config?.appType,u=m||"backend";m||(e.name.includes("frontend")?u="frontend":(e.name.includes("sdk")||e.name.includes("lib")||e.name.includes("infra"))&&(u="library"));let y={name:e.name,stack:e.stack,type:u,port:e.config?.port,createdAt:o,lastModified:s,dependencies:e.config?.dependsOn??[],hasDockerfile:a,hasTiltfile:c,hasDockerCompose:f,autogeneratedFiles:i,status:"unknown"};return Le.set(t,y),z.markUpdated(),y}function Zn(e){let t=[];for(let n of pt){let o=C(e,n);if(P(o)){let s=Me(o),i=Gn(o,"utf-8");t.push({name:n,path:o,type:Xn(n,i),size:s.size,lastModified:s.mtime.toISOString()})}}let r=C(e,"prisma");if(P(r)){let n=Vn(r);for(let o of n)if(o==="schema.prisma"||o.includes("migration")){let s=C(r,o),i=Me(s);t.push({name:`prisma/${o}`,path:s,type:"prisma",size:i.size,lastModified:i.mtime.toISOString()})}}return t.sort((n,o)=>n.name.localeCompare(o.name))}function zi(e){let t=e.name;if(z.isValid()){let c=Ue.get(t);if(c)return c}let r=e.resources.map(c=>Qn(c)),n=r.map(c=>new Date(c.createdAt).getTime()),o=Math.min(...n),s=Math.max(...n),i=or(r.map(c=>c.status)),a={name:e.name,resourceCount:r.length,createdAt:new Date(o).toISOString(),lastModified:new Date(s).toISOString(),resources:r,overallStatus:i};return Ue.set(t,a),z.markUpdated(),a}var Xi=[ut,"proxy"];export{fe as a,l as b,mt as c,po as d,I as e,ut as f,mo as g,lt as h,ge as i,ho as j,vr as k,wr as l,Q as m,ft as n,go as o,yo as p,So as q,xo as r,Eo as s,bo as t,v as u,Oo as v,Y as w,Io as x,Do as y,ee as z,Bo as A,Gr as B,Tt as C,Wr as D,qo as E,Xo as F,wt as G,ss as H,E as I,A as J,is as K,Yr as L,as as M,cs as N,ke as O,us as P,Rt as Q,ds as R,ps as S,ms as T,hs as U,gs as V,ys as W,Ss as X,xs as Y,Es as Z,we as _,bs as $,ks as aa,Ts as ba,vs as ca,ws as da,As as ea,Rs as fa,$s as ga,F as ha,$t as ia,Ms as ja,D as ka,Bs as la,Ls as ma,Us as na,Ne as oa,An as pa,Vt as qa,Ut as ra,Js as sa,Oe as ta,hn as ua,Ce as va,qs as wa,Xs as xa,Qs as ya,Si as za,xi as Aa,Ei as Ba,bi as Ca,ki as Da,tr as Ea,Ai as Fa,Pe as Ga,Ri as Ha,$i as Ia,or as Ja,xn as Ka,En as La,ti as Ma,ri as Na,ni as Oa,oi as Pa,si as Qa,_e as Ra,Ui as Sa,ir as Ta,Jn as Ua,ar as Va,se as Wa,Vi as Xa,Gi as Ya,qn as Za,Wi as _a,Ki as $a,Yi as ab,Hi as bb,Qn as cb,zi as db,Xi as eb};
@@ -1,4 +0,0 @@
1
- import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
- import{g as w,h}from"./chunk-32NCVCS7.js";import{Ta as g,b as a,da as f,ea as d,f as c,m as l,ta as u,u as p,va as m}from"./chunk-DTJ6JCHV.js";import{Command as O}from"commander";import{readFileSync as k}from"node:fs";import{join as E}from"node:path";function j(n){let e=n.config;return e?Array.isArray(e.featuresEnabled)&&e.featuresEnabled.includes(c)?!0:(Array.isArray(e.dependsOn)?e.dependsOn:[]).some(r=>h.includes(r)):!1}function D(n,e){let s=n.replace(/-/g,"_"),r=[];for(let o of[...e].sort((i,t)=>i.name.localeCompare(t.name))){let i=o.resources.filter(j).map(t=>t.name);i.length!==0&&r.push({name:`${s}_${o.name.replace(/-/g,"_")}`,stack:o.name,services:i.sort()})}return r.length===0?null:{name:"postgres",databases:r}}function y(n){try{let e=JSON.parse(k(E(n,".tdk",l),"utf-8"));return typeof e?.project?.name=="string"?e.project.name:null}catch{return null}}import{spawn as P}from"node:child_process";function A(n){try{let e=new URL(n);return e.protocol==="http:"||e.protocol==="https:"}catch{return!1}}function x(n,e=process.platform,s=P){if(!A(n))return Promise.resolve(!1);let r,o;return e==="darwin"?(r="open",o=[n]):e==="win32"?(r="rundll32.exe",o=["url.dll,FileProtocolHandler",n]):(r="xdg-open",o=[n]),new Promise(i=>{try{let t=s(r,o,{stdio:"ignore",detached:!0,windowsHide:!0});t.once("error",()=>i(!1)),t.once("spawn",()=>{typeof t.unref=="function"&&t.unref(),i(!0)})}catch{i(!1)}})}function B(n,e=process.platform,s=P){return new Promise(r=>{let o,i;e==="darwin"?(o="pbcopy",i=[]):e==="win32"?(o="clip",i=[]):(o="xclip",i=["-selection","clipboard"]);try{let t=s(o,i,{stdio:["pipe","ignore","ignore"],windowsHide:!0});t.on("error",()=>{r(!1)}),t.on("close",S=>{r(S===0)}),t.stdin?(t.stdin.on("error",()=>{r(!1)}),t.stdin.write(n,"utf-8"),t.stdin.end()):r(!1)}catch{r(!1)}})}async function b(n){let{resources:e}=g(n),s=await w(n,{inspectDocker:!1}),{appBase:r}=u(s?.ingressHttp,n);return e.filter(o=>o.config?.appType==="frontend").map(o=>({name:o.name,url:`${r}${m(o)}`}))}async function N(n,e=2e3){try{return(await fetch(n,{signal:AbortSignal.timeout(e)})).status<500}catch{return!1}}async function T(n,e=3e4){if(n.length===0)return;let s=Date.now()+e;for(;;){for(let r of n)if(await N(r.url))return r;if(Date.now()>=s)return n[0];await new Promise(r=>setTimeout(r,2e3))}}async function F(n){let e=n??p();if(!e)return console.log(a.yellow("Not in a Flisk project, so there is no frontend to open.")),console.log(a.gray("Run `flisk project --yes` first, or `flisk open` inside a project.")),null;let s=await b(e);if(s.length===0)return console.log(a.yellow("This project has no frontend service to open.")),console.log(a.gray("Start the stack with `flisk up` and add a frontend with `flisk resource`.")),null;let r=y(e);f(`Opening the first frontend of ${r??"this project"}`);for(let t of s)console.log(a.gray(` - ${t.name}: ${t.url}`));let o=await T(s);if(!o)return null;let i=await x(o.url);return console.log(i?a.green(`
3
- Opened ${o.url}`):a.yellow(`
4
- Could not open a browser. Open ${o.url} yourself.`)),d("Run `flisk open` again to open the next frontend."),o.url}var I=new O("open").description("Open the first frontend of the project in your browser").action(async()=>{await F()});export{D as a,y as b,x as c,B as d,b as e,N as f,T as g,F as h,I as i};
@@ -1,2 +0,0 @@
1
- import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
- import{I as a,J as b,K as c,L as d,M as e,N as f,O as g,P as h,Q as i,R as j}from"./chunk-3RB2FQ46.js";import"./chunk-CXFHRZLM.js";import"./chunk-42IVF3YT.js";import"./chunk-32NCVCS7.js";import"./chunk-DTJ6JCHV.js";import"./chunk-6EA4DGCY.js";export{c as MACHINE_CHECK_IDS,a as RUNTIME_CHECK_IDS,b as SCAFFOLD_CHECK_IDS,h as assertMachineReadyOrExit,i as detectRuntimePrerequisites,g as formatColdPreflight,j as formatRuntimeNextSteps,d as nodeTooOld,e as requireVerifiedDockerVersions,f as runColdPreflight};
@@ -1,4 +0,0 @@
1
- import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
- import"./chunk-6EA4DGCY.js";import{spawn as a}from"node:child_process";var l="Frontend URLs";function m(i){let e=i.split(`
3
- `),o=e.findIndex(n=>n.includes(l));if(o!==-1)for(let n of e.slice(o+1)){let r=n.match(/^\s*-\s+\S+:\s+(https?:\/\/\S+)/);if(r)return r[1];if(n.trim()===""||n.includes("URLs:"))break}}function x(i,e,o=process.env,n=a,r){return new Promise(u=>{let c=n(process.execPath,[i,"up"],{cwd:e,env:o,stdio:["inherit","pipe","inherit"]}),s="",d=!1;c.stdout?.on("data",t=>{let f=String(t);if(s+=f,process.stdout.write(f),!d){let p=m(s);p&&(d=!0,r?.(p))}}),c.on("error",t=>u({code:1,output:`${s}
4
- ${t.message}`})),c.on("close",t=>u({code:t,output:s}))})}export{m as findFrontendUrl,x as runStack};
@@ -1,2 +0,0 @@
1
- import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
- import{e as a,f as b,g as c,h as d,i as e}from"./chunk-TCN3L76U.js";import"./chunk-32NCVCS7.js";import"./chunk-DTJ6JCHV.js";import"./chunk-6EA4DGCY.js";export{b as isFrontendReady,a as listFrontendTargets,e as openCommand,d as openFirstFrontend,c as pickReadyFrontend};
@@ -1,2 +0,0 @@
1
- import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
- import{g as a,h as b,i as c,j as d}from"./chunk-ZDH5BP3H.js";import"./chunk-KGKKDD4K.js";import"./chunk-CXFHRZLM.js";import"./chunk-42IVF3YT.js";import"./chunk-DTJ6JCHV.js";import"./chunk-6EA4DGCY.js";export{c as cloneProjectTemplate,a as enableDiscoveredStacks,d as projectCommand,b as templateTargetDir};