@flisk-sh/flisk 1.3.192 → 1.3.195
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/cli/dist/cli.js +8 -4
- package/cli/dist/commands/help.js +1 -0
- package/cli/dist/commands/open.js +85 -0
- package/cli/dist/commands/registry.js +2 -0
- package/cli/dist/utils/service-urls.js +6 -3
- package/cli/dist-bundle/chunk-32NCVCS7.js +5 -0
- package/cli/dist-bundle/chunk-3RB2FQ46.js +435 -0
- package/cli/dist-bundle/chunk-CXFHRZLM.js +52 -0
- package/cli/dist-bundle/chunk-DTJ6JCHV.js +25 -0
- package/cli/dist-bundle/chunk-TCN3L76U.js +4 -0
- package/cli/dist-bundle/{chunk-QR6O2A7L.js → chunk-ZDH5BP3H.js} +2 -2
- package/cli/dist-bundle/cli.js +236 -236
- package/cli/dist-bundle/cold-preflight-FSWLLA2X.js +2 -0
- package/cli/dist-bundle/open-HXJVYBH7.js +2 -0
- package/cli/dist-bundle/project-5P6B5MAP.js +2 -0
- package/cli/package.json +1 -1
- package/package.json +1 -1
- package/cli/dist-bundle/chunk-GOEBYLFN.js +0 -2
- package/cli/dist-bundle/chunk-RHSMS45X.js +0 -438
- package/cli/dist-bundle/chunk-XYFVXSEO.js +0 -75
- package/cli/dist-bundle/cold-preflight-ZJAU3E7K.js +0 -2
- package/cli/dist-bundle/project-FOAR7E55.js +0 -2
- package/cli/dist-bundle/url-actions-D6ROTHZG.js +0 -2
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
|
|
2
|
+
import{c as z,e as Q}from"./chunk-42IVF3YT.js";import{Ha as J,Ia as B,Sa as O,Va as Y,b as V,eb as X,f as v,g as k,i as q,ia as L,j as x,k as P,l as F,m as W,n as A,r as d,s as N}from"./chunk-DTJ6JCHV.js";import{a as $}from"./chunk-6EA4DGCY.js";import{appendFileSync as le,existsSync as C,mkdirSync as fe,readFileSync as de,writeFileSync as Z}from"node:fs";import{dirname as pe,resolve as w}from"node:path";function ft(t,e,n){for(let[r,s]of e.entries())console.log(V.blue(`${s.emoji} ${s.description}...`)),s.type==="json"?me(t,s.filename,s.content):he(t,s.filename,String(s.content)),n&&n(s,r,e.length)}function ue(t,e,n=2){let r=`${JSON.stringify(e,null,n)}
|
|
3
|
+
`;Z(t,r,"utf-8")}function me(t,e,n,r=2){let s=w(t,e);ue(s,n,r)}function U(t,e){Z(t,e,"utf-8")}function he(t,e,n){let r=w(t,e);U(r,n)}function dt(t){C(t)||fe(t,{recursive:!0})}var ge=[".env",".tdk/.tdk-out/",".tdk/.project-id",".tdk/smoke/","node_modules/"];function Se(t){let e=w(t,".gitignore"),n=C(e)?de(e,"utf-8"):"",r=new Set(n.split(`
|
|
4
|
+
`).map(f=>f.trim().replace(/\/$/,""))),s=ge.filter(f=>!r.has(f.replace(/\/$/,"")));if(s.length===0)return[];let c=n&&!n.endsWith(`
|
|
5
|
+
`)?`
|
|
6
|
+
`:"";return le(e,`${c}${n?`
|
|
7
|
+
# Flisk (generated files and secrets)
|
|
8
|
+
`:`# Flisk (generated files and secrets)
|
|
9
|
+
`}${s.join(`
|
|
10
|
+
`)}
|
|
11
|
+
`),s}function ke(t){let e=w(t);for(;;){if(C(w(e,".git")))return!0;let n=pe(e);if(n===e)return!1;e=n}}function pt(t){if(ke(t))try{Se(t);return}catch(e){let n=e instanceof Error?e.message:String(e);return`Could not add .tdk/smoke/ to ${w(t,".gitignore")}: ${n}. Git may track the smoke response records.`}}import*as o from"node:fs";import*as i from"node:path";import{fileURLToPath as Oe}from"node:url";import _ from"handlebars";var ye="1.0.0",Te={runtime:"bun",bundler:"vite",language:"typescript",framework:"hono",database:"postgresql",orm:"prisma",messaging:"nats",linting:"biome",testing:"vitest"},Ee={frontend:{base:d.frontend.base,range:d.frontend.range,start:d.frontend.min,end:d.frontend.max},backend:{base:d.backend.base,range:d.backend.range,start:d.backend.min,end:d.backend.max},health:{base:d.health.base,range:d.health.range,start:d.health.min,end:d.health.max},worker:{base:d.worker.base,range:d.worker.range,start:d.worker.min,end:d.worker.max},migrator:{base:d.migrator.base,range:d.migrator.range,start:d.migrator.min,end:d.migrator.max},tiltUi:N.tiltUi,traefik:N.traefik},_e={path:"/health",live:"/health/live",ready:"/health/ready",timeout:30,interval:5},be={frontend:"-frontend",backend:"-backend",worker:"-worker",migrator:"-migrator",library:"-lib",sdk:"-sdk",validSeparators:["-","_"],maxLength:63,minLength:3},ve={entrypoint:"web",network:"traefik-public",defaultHost:"localhost",appHost:"app.localhost",apiHost:"api.localhost",appSubdomainPrefix:"app",apiSubdomainPrefix:"api",defaultPort:8080,tlsEnabled:!1,entrypoints:["web"],middlewares:[],tls:{enabled:!1},healthcheckPath:"/health",healthcheckInterval:"10s",healthcheckTimeout:"5s",frontendPriorityBase:100},we=["node_modules","dist","build",".git",".prisma",".turbo","coverage","tmp","temp","__tests__","test","tests"],xe={frontend:{suffix:"-frontend",portRange:"3000-3999"},backend:{suffix:"-backend",portRange:"4000-4999"},library:{suffix:"-library",portRange:null},sdk:{suffix:"-sdk",portRange:"3000-9999"},migrator:{suffix:"-migrator",portRange:"7000-7999"},worker:{suffix:"-worker",portRange:"6000-6999"}},Ae={prisma:"Database ORM with migrations",nats:"Event streaming via NATS",redis:"Caching layer",infisical:"Secrets management",vitest:"Testing framework",traefik:"HTTP routing",websocket:"Real-time connections",graphql:"GraphQL support",grpc:"gRPC support",viteNode:"Vite Node runtime",maintenance:"Maintenance mode"},Re={services:"services/product",sharedPlatform:"shared-platform-engineering",sharedProduct:"shared-product-engineering",sharedDdd:"shared-ddd-layers"},je={scanIntervalSeconds:5,maxManifestsPerRoot:50,servicePatterns:["services/product/*","services/platform/*"]},De={dockerfile:"Dockerfile",context:"."},Ie={backend:{command:"bun",args:["run","dev"],env:{NODE_ENV:"development"}},frontend:{command:"bun",args:["run","dev"],env:{NODE_ENV:"development"}}},g={version:ye,tech:Te,ports:Ee,health:_e,naming:be,traefik:ve,filewatchIgnores:we,serviceTypes:xe,features:Ae,paths:Re,discovery:je,docker:De,runtime:Ie};import{existsSync as $e,lstatSync as Pe}from"node:fs";import{isAbsolute as ee,normalize as j,relative as Fe,sep as te}from"node:path";var yt=[`${x}/**`,".tdk/.tdk-out/**","Tiltfile","TILT_*.star",k,`${A} (create only)`,"shared-platform-engineering/docker-templates/**","services/platform/database-management/docker-compose.yml","product_autogenerated_resource_manifests/**","product_autogenerated_services_list/**"];function Ne(t){let e=j(t).split(te).join("/");return ee(t)||e===".."||e.startsWith("../")?!1:e.split("/").includes(x)||e.startsWith(".tdk/.tdk-out/")||e==="shared-platform-engineering/docker-templates"||e.startsWith("shared-platform-engineering/docker-templates/")||e.startsWith("product_autogenerated_resource_manifests/")||e.startsWith("product_autogenerated_services_list/")?!0:e==="Tiltfile"||/^TILT_[^/]+\.star$/.test(e)||e===k||e===A||e==="services/platform/database-management/docker-compose.yml"}function E(t,e){let n=ee(e)?j(e):j(`${t}/${e}`),r=Fe(t,n).split(te).join("/");if(!Ne(r))throw new Error(`Refusing to write outside Flisk's generated-file allowlist: ${r}`);let s=t;for(let c of r.split("/"))if(s=j(`${s}/${c}`),$e(s)&&Pe(s).isSymbolicLink())throw new Error(`Refusing to write through a symbolic link in generated path: ${r}`);return n}var Le={[v]:{name:v,description:"Generate and load the stack-level PostgreSQL docker-compose file",generatedFiles:["services/platform/database-management/docker-compose.yml"]}};function ne(t,e){return Le[e]?["pre_alpha","alpha","beta"].some(n=>t[n]?.enabledStacks?.includes(e)):!1}var Ce=Oe(new URL("../dist/generator/template-engine.js",import.meta.url).href),G=i.dirname(Ce);function R(t){let e=[i.join(G,"..","..","templates"),i.join(G,"..","templates"),i.join(G,"..","..","..","templates"),i.join(process.cwd(),"node_modules","@flisk-sh","flisk","templates"),i.join(i.dirname(process.execPath),"tdk-cli","cli","templates")],n=[];for(let r of e){let s=i.join(r,t);n.push(s);try{return o.readFileSync(s,"utf-8")}catch{}}throw new Error(`Failed to load template ${t} from any of these paths: ${n.join(", ")}`)}var M=null;function Ue(){return M||(M={[k]:R(".tiltignore.hbs"),[F]:R("TILT_RESOURCE_DEFAULTS.star.hbs"),[P]:R("TILT_TECH_STACK.star.hbs"),Tiltfile:R("Tiltfile.hbs"),"spec.master":R("spec.master.hbs")}),M}var Ge={proxy:"Traefik reverse proxy",verdaccio:"Private npm registry","database-management":"PostgreSQL database"},Me={monitoring:"Signoz, SkyWalking (RAM intensive)",elk:"Elasticsearch/Logstash/Kibana",debezium:"CDC with Kafka/Zookeeper",golden_image:"Golden image rebuild (one-time)",verdaccio:"Premium local npm registry"},se=["TILT_TECH_STACK.star","TILT_RESOURCE_DEFAULTS.star","spec.master","Tiltfile",".tiltignore"],D=class{templatesDir;constructor(e){let n=$("node:url").fileURLToPath(new URL("../dist/generator",import.meta.url))||i.dirname(new URL(new URL("../dist/generator/template-engine.js",import.meta.url).href).pathname);this.templatesDir=e||i.join(n,"..","..","templates"),this.registerHelpers()}quoteStarlarkString(e){return`"${e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}formatStarlarkValue(e){return e==null?"None":typeof e=="string"?this.quoteStarlarkString(e):typeof e=="boolean"?e?"True":"False":typeof e=="number"?String(e):Array.isArray(e)?`[${e.map(r=>this.formatStarlarkValue(r)).join(", ")}]`:typeof e=="object"?`{${Object.entries(e).map(([r,s])=>`${this.quoteStarlarkString(r)}: ${this.formatStarlarkValue(s)}`).join(", ")}}`:String(e)}registerHelpers(){_.registerHelper("starlark",e=>new _.SafeString(this.formatStarlarkValue(e))),_.registerHelper("starlarkArray",e=>{if(!Array.isArray(e))return new _.SafeString("[]");let n=e.map(r=>this.formatStarlarkValue(r));return new _.SafeString(`[${n.join(", ")}]`)}),_.registerHelper("json",e=>JSON.stringify(e))}buildContext(e){return{version:g.version,tech:g.tech,ports:g.ports,health:g.health,naming:g.naming,traefik:g.traefik,filewatchIgnores:[...g.filewatchIgnores],serviceTypes:g.serviceTypes,paths:g.paths,discovery:{scanIntervalSeconds:g.discovery.scanIntervalSeconds,maxManifestsPerRoot:g.discovery.maxManifestsPerRoot,paths:e.discovery.paths},docker:g.docker,runtime:g.runtime,project:e.project,phases:Ke(e.phases),alwaysEnabledInfra:e.always_enabled_infra??[...X],optionalInfra:e.optional_infra,serviceDescriptions:Ge,infraDescriptions:Me}}loadTemplate(e){let n=i.join(this.templatesDir,`${e}.hbs`),r=o.existsSync(n)?o.readFileSync(n,"utf-8"):Ue()[e];if(!r)throw new Error(`Template not found: ${n}`);return _.compile(r)}generateTechStack(e){return this.loadTemplate(P)(e)}generateServiceDefaults(e){return this.loadTemplate(F)(e)}generateSpecMaster(e){return this.loadTemplate("spec.master")(e)}generateTiltfile(e){return this.loadTemplate("Tiltfile")(e)}generateTiltIgnore(e){return this.loadTemplate(".tiltignore")(e)}generateAll(e){let n=this.buildContext(e);return{"TILT_TECH_STACK.star":this.generateTechStack(n),"TILT_RESOURCE_DEFAULTS.star":this.generateServiceDefaults(n),"spec.master":this.generateSpecMaster(n),Tiltfile:this.generateTiltfile(n),".tiltignore":this.generateTiltIgnore(n)}}};function Ke(t){let e={...t};for(let n of Object.keys(e))e[n]={...e[n],enabledStacks:Array.from(new Set(e[n].enabledStacks))};return e}function He(t){return t.replace(/-/g,"_")}function Ve(t){let e=He(t.project.name||"tdk_project");return`###############################################################################
|
|
12
|
+
# SYSTEM-GENERATED - DO NOT EDIT
|
|
13
|
+
# Stack feature: database-management
|
|
14
|
+
# Source: .tdk/project.json phases.*.enabledStacks includes "database-management"
|
|
15
|
+
# Regenerate with: flisk config regenerate
|
|
16
|
+
###############################################################################
|
|
17
|
+
|
|
18
|
+
services:
|
|
19
|
+
postgres:
|
|
20
|
+
image: postgres:16-alpine
|
|
21
|
+
container_name: ${e}_postgres
|
|
22
|
+
restart: unless-stopped
|
|
23
|
+
environment:
|
|
24
|
+
POSTGRES_USER: ${e}
|
|
25
|
+
POSTGRES_PASSWORD: \${DB_PASSWORD}
|
|
26
|
+
POSTGRES_DB: postgres
|
|
27
|
+
ports:
|
|
28
|
+
- "\${TDK_BIND_ADDRESS:-127.0.0.1}:\${TDK_POSTGRES_PORT:-15432}:5432"
|
|
29
|
+
volumes:
|
|
30
|
+
- ${e}_postgres_data:/var/lib/postgresql/data
|
|
31
|
+
networks:
|
|
32
|
+
- database
|
|
33
|
+
healthcheck:
|
|
34
|
+
test: ["CMD-SHELL", "pg_isready -U ${e} -d postgres"]
|
|
35
|
+
interval: 5s
|
|
36
|
+
timeout: 5s
|
|
37
|
+
retries: 20
|
|
38
|
+
|
|
39
|
+
networks:
|
|
40
|
+
database:
|
|
41
|
+
name: ${e}_database
|
|
42
|
+
external: true
|
|
43
|
+
|
|
44
|
+
volumes:
|
|
45
|
+
${e}_postgres_data:
|
|
46
|
+
`}function re(t,e){if(!t||typeof t!="object")return!1;let n=t;for(let r of["pre_alpha","alpha","beta","out_of_scope"]){let s=n[r];if(!s||typeof s!="object"||!Array.isArray(s[e]))return!1}return!0}function qe(t){if(!t||typeof t!="object")return null;let e=t;if(typeof e.version!="string"||!e.project||typeof e.project!="object")return null;let n=e.project;if(typeof n.name!="string"||typeof n.version!="string")return null;let r=null;if(re(e.phases,"enabledStacks"))r=e.phases;else if(re(e.stacks,"services")){let a=e.stacks;r={pre_alpha:{name:a.pre_alpha.name,description:a.pre_alpha.description,enabledStacks:a.pre_alpha.services},alpha:{name:a.alpha.name,description:a.alpha.description,enabledStacks:a.alpha.services},beta:{name:a.beta.name,description:a.beta.description,enabledStacks:a.beta.services},out_of_scope:{name:a.out_of_scope.name,description:a.out_of_scope.description,enabledStacks:a.out_of_scope.services}}}if(!r||!e.optional_infra||typeof e.optional_infra!="object")return null;let s=e.optional_infra;if(typeof s.monitoring!="boolean"||typeof s.elk!="boolean"||typeof s.debezium!="boolean"||typeof s.golden_image!="boolean"||typeof s.verdaccio!="boolean"||!e.discovery||typeof e.discovery!="object")return null;let c=e.discovery;return Array.isArray(c.paths)?{version:e.version,project:e.project,phases:r,always_enabled_infra:e.always_enabled_infra,optional_infra:e.optional_infra,discovery:e.discovery,overrides:e.overrides}:null}var K=class extends Error{};function ie(t){let e=i.join(t,".tdk",W),n;try{n=o.readFileSync(e,"utf-8")}catch(c){if(c?.code==="ENOENT")throw new K(`Project config not found: ${e}. Run 'flisk project --yes' first.`);let a=c instanceof Error?c.message:String(c);throw new Error(`Could not read project.json at ${e}: ${a}`)}let r;try{r=JSON.parse(n)}catch(c){let a=c instanceof Error?c.message:String(c);throw new Error(`Could not parse project.json at ${e}: ${a}`)}let s=qe(r);if(!s)throw new Error("Invalid project.json: missing or invalid required fields. Expected: version (string), project (object with name/version), phases (object with pre_alpha/alpha/beta/out_of_scope enabledStacks), optional_infra (object with boolean flags), discovery (object with paths array)");return s}async function We(t){let e=Y(t).filter(r=>r.config?.sablier?.enable===!0);e.length===0||await Q(t)||console.warn(`\u26A0\uFE0F Sablier (on-demand scaling) is a Premium feature - no valid license key found. ${e.length} resource${e.length===1?" has":"s have"} a \`sablier\` block, but it will have no effect without a license. Set TDK_LICENSE_KEY to a key that grants it, or remove the \`sablier\` block from the affected service.json file(s) to silence this warning.`)}function Je(t,e){let n=E(t,A);if(o.existsSync(n))return!1;let r={name:e.project.name||i.basename(t),version:e.project.version||"1.0.0",private:!0,type:"module",workspaces:e.discovery.paths};return U(n,`${JSON.stringify(r,null,2)}
|
|
47
|
+
`),!0}async function Nt(t,e={}){let n=ie(t),r=O(t).flatMap(l=>J(l,i.relative(t,l).split(i.sep).join("/")));if(r.length>0)throw new Error(`Refusing to generate config from unsafe service.json values:
|
|
48
|
+
${r.map(l=>` ${l}`).join(`
|
|
49
|
+
`)}`);await We(t),Je(t,n)&&!e.quiet&&console.log("\u2713 Generated: package.json (workspace root)");let s=Object.values(n.phases).some(l=>l.enabledStacks.includes("verdaccio"));(n.optional_infra.verdaccio||s)&&(await z(t)||console.warn("\u26A0\uFE0F Verdaccio is a Premium feature - no valid license key found. It's enabled in this project's config, but will have no effect without a license. Set TDK_LICENSE_KEY to a key that grants it, or run `flisk config disable-infra verdaccio` to silence this warning."));let c=i.join(t,".tdk",".tdk-out");o.existsSync(c)||o.mkdirSync(c,{recursive:!0});let f=new D().generateAll(n);for(let l of se){let u=f[l],b=E(t,i.join(".tdk",".tdk-out",l));L(b,u),e.quiet||console.log(`\u2713 Generated: .tdk/.tdk-out/${l}`)}if(ne(n.phases,v)){let l=E(t,i.join("services","platform",v,q)),u=i.dirname(l);o.mkdirSync(u,{recursive:!0}),L(l,Ve(n)),e.quiet||console.log("\u2713 Generated: services/platform/database-management/docker-compose.yml")}let m=i.join(c,k),p=E(t,k);if(o.existsSync(m)){if(!o.existsSync(p))o.copyFileSync(m,p),console.log("\u2713 Copied: .tiltignore \u2192 project root");else if(e.discardHandEdits){let l=o.readFileSync(p,"utf-8");l.includes(ce)&&l!==o.readFileSync(m,"utf-8")&&(o.copyFileSync(m,p),console.log("\u2713 Restored: .tiltignore \u2192 project root (hand edits discarded)"))}}let S=et(t);for(let l of S)console.log(`\u2713 Copied: ${l} \u2192 project root`);await tt(t),console.log(""),console.log("\u{1F4A1} To start Tilt: flisk up")}var Be=/\.(?:test|spec)\.[cm]?[jt]sx?$/;function oe(t){return Be.test(t)}function ae(t){if(o.existsSync(t))for(let e of o.readdirSync(t,{withFileTypes:!0})){let n=i.join(t,e.name);e.isDirectory()?ae(n):oe(n)&&o.rmSync(n,{force:!0})}}var Ye=["engine","discovery","specs","ext"],ze=[["shared-platform-engineering","docker-templates"]],Qe=["install-deps.sh","bun-hoisted-symlink-fix.sh","prisma-bun-client-link-fix.sh","prisma-normalize-client.sh"];function Xe(){let t=$("node:url").fileURLToPath(new URL("../dist/generator",import.meta.url))||process.cwd();for(let e=0;e<6;e++){if(o.existsSync(i.join(t,"Tiltfile"))&&o.existsSync(i.join(t,"engine")))return t;let n=i.dirname(t);if(n===t)break;t=n}return null}function Ze(){let t=$("node:url").fileURLToPath(new URL("../dist/generator",import.meta.url))||process.cwd();for(let r=0;r<8;r++){if(o.existsSync(i.join(t,"shared-platform-engineering","docker-templates")))return t;let s=i.dirname(t);if(s===t)break;t=s}let e=i.dirname(process.execPath);return[i.join(e,"tdk-cli"),i.join(process.cwd(),"node_modules","@flisk-sh","flisk")].find(r=>o.existsSync(i.join(r,"shared-platform-engineering","docker-templates")))??null}function et(t){let e=Ze(),n=[];if(!e)return console.warn("\u26A0\uFE0F Flisk runtime assets not found - generated Dockerfiles may fail. Reinstall or upgrade Flisk, then re-run `flisk project`."),n;for(let r of ze){let s=i.join(e,...r),c=E(t,i.join(...r));o.existsSync(s)&&(o.mkdirSync(i.dirname(c),{recursive:!0}),o.cpSync(s,c,{recursive:!0}),n.push(r.join("/")))}for(let r of Qe){let s=i.join(t,"shared-platform-engineering","docker-templates",r);o.existsSync(s)||console.warn(`\u26A0\uFE0F Missing runtime asset after copy: ${s}`)}return n}async function tt(t){let e=E(t,i.join(".tdk",".tdk-out","tdk-cli-ext")),n=[];process.env.TDK_EXTENSION_SOURCE&&n.push(process.env.TDK_EXTENSION_SOURCE);let r=Xe();r&&n.push(r);let s=i.dirname(process.execPath);n.push(i.join(s,"tdk-cli")),n.push(i.join(t,"..","tdk-cli"));let c="";for(let a of n)if(a&&o.existsSync(i.join(a,"Tiltfile"))&&o.existsSync(i.join(a,"engine"))){c=a;break}if(!c){console.warn("\u26A0\uFE0F Flisk extension not found - set TDK_EXTENSION_SOURCE to its checkout path and re-run `flisk project` (or `flisk config regenerate`) to vendor it before `flisk up`.");return}o.existsSync(e)||o.mkdirSync(e,{recursive:!0}),o.copyFileSync(i.join(c,"Tiltfile"),i.join(e,"Tiltfile"));for(let a of Ye)ae(i.join(e,a)),o.cpSync(i.join(c,a),i.join(e,a),{recursive:!0,filter:f=>!oe(f)});console.log("\u2713 Vendored Flisk extension \u2192 .tdk/.tdk-out/tdk-cli-ext/");try{let{applyPremiumOverlay:a}=await import("./extension-fetch-6XNTDF44.js");await a(t,e)}catch(a){console.warn(`\u26A0\uFE0F Premium overlay skipped: ${a.message}`)}}var ce="SYSTEM-GENERATED BY Flisk CLI";function Lt(t,e){let n=[],r=[],s=[],c=[],a=(h,T,y)=>{T!==y&&(n.push(`${T===void 0?"Missing file":"Out of sync"}: ${h} (run 'flisk config regenerate')`),s.push({file:h,diff:nt(h,T??"",y)}))},f=ie(t),p=new D().generateAll(f),S=i.join(t,".tdk",".tdk-out");for(let h of se){let T=p[h],y=i.join(S,h);a(`.tdk/.tdk-out/${h}`,o.existsSync(y)?o.readFileSync(y,"utf-8"):void 0,T)}let l=i.join(t,k),u=o.existsSync(l)?o.readFileSync(l,"utf-8"):void 0;u!==void 0&&!u.includes(ce)?r.push(".tiltignore: not generated by Flisk, left as is"):a(k,u,p[k]);let b=e?.manifestPaths??O(t);for(let h of b){let T=i.relative(t,h).split(i.sep).join("/");if(!e?.skipManifestValidation){let H=B(h,T);n.push(...H.errors),r.push(...H.warnings)}let y=rt(t,h);n.push(...y.errors),c.push(...y.handEdited)}return{valid:n.length===0,errors:n,warnings:r,diffs:s,handEdited:c}}function nt(t,e,n){let r=e.replace(/\n$/,"").split(`
|
|
50
|
+
`),s=n.replace(/\n$/,"").split(`
|
|
51
|
+
`),c=[`--- a/${t}`,`+++ b/${t}`,`@@ -1,${r.length} +1,${s.length} @@`];for(let a of r)c.push(`-${a}`);for(let a of s)c.push(`+${a}`);return c.join(`
|
|
52
|
+
`)}function rt(t,e){let n=i.dirname(e),r=i.join(n,x);if(!o.existsSync(r))return{errors:[],handEdited:[]};let s=[],c=(S,l="")=>{for(let u of o.readdirSync(S,{withFileTypes:!0})){if(l===""&&u.name===".tdk-contract")continue;let b=i.join(l,u.name),h=i.join(S,u.name);u.isDirectory()?c(h,b):u.isFile()&&s.push({fullPath:h,relativeFile:b})}};if(c(r),s.length===0)return{errors:[],handEdited:[]};let a=i.join(r,".tdk-contract"),f=i.join(a,"service.json.source"),m=[],p=[];o.existsSync(f)?o.readFileSync(f,"utf-8")!==o.readFileSync(e,"utf-8")&&m.push(i.relative(t,e)+": service.json changed since generated outputs were written (run flisk up)"):m.push(i.relative(t,f)+": generated-file contract snapshot is missing (run flisk up to regenerate)");for(let S of s){if(S.relativeFile==="service.yaml")continue;let l=i.join(a,S.relativeFile),u=i.relative(t,S.fullPath);o.existsSync(l)?o.readFileSync(S.fullPath,"utf-8")!==o.readFileSync(l,"utf-8")&&(p.push(u.split(i.sep).join("/")),m.push(`${u}: generated file differs from its Flisk snapshot (run flisk up to regenerate)`)):m.push(`${u}: generated-file snapshot is missing (run flisk up to regenerate)`)}return{errors:m,handEdited:p}}import{stdin as st,stdout as it}from"node:process";import{createInterface as ot}from"node:readline/promises";async function I(t){let e=ot({input:st,output:it});try{return await new Promise((n,r)=>{e.once("close",()=>r(new Error("No input available to answer the prompt. Run this in a terminal."))),e.question(t).then(s=>n(s.trim()),r)})}finally{e.close()}}async function Gt(t){let e=t.initial?` (${t.initial})`:"";for(;;){let r=await I(`${t.message}${e} `)||t.initial||"",s=t.validate?.(r)??!0;if(s===!0)return r;console.log(s)}}async function Mt(t){let e=t.initial??!0,n=e?"Y/n":"y/N";for(;;){let r=(await I(`${t.message} (${n}) `)).toLowerCase();if(!r)return e;if(["y","yes"].includes(r))return!0;if(["n","no"].includes(r))return!1;console.log("Please answer yes or no.")}}async function Kt(t){for(console.log(t.message),t.choices.forEach((e,n)=>{console.log(` ${n+1}. ${e.title}`)});;){let e=await I("Choose one: "),n=Number.parseInt(e,10)-1,r=t.choices[n];if(r)return r.value;console.log(`Enter a number from 1 to ${t.choices.length}.`)}}async function Ht(t){let e=t.choices.map((r,s)=>r.selected?s+1:null).filter(r=>r!==null),n=e.length>0?` [${e.join(",")}]`:"";for(console.log(t.message),t.choices.forEach((r,s)=>{let c=r.selected?"*":" ";console.log(` ${c} ${s+1}. ${r.title}`)});;){let r=await I(`Choose one or more numbers, comma-separated${n}: `),s=e;if(r){let f=r.split(",").map(p=>p.trim()),m=f.find(p=>{if(!/^\d+$/.test(p))return!0;let S=Number.parseInt(p,10);return!t.choices[S-1]});if(m!==void 0){console.log(`"${m}" is not a valid choice (1-${t.choices.length})`);continue}s=f.map(p=>Number.parseInt(p,10))}let c=Array.from(new Set(s)).map(f=>t.choices[f-1]).filter(f=>!!f).map(f=>f.value),a=t.validate?.(c)??!0;if(a===!0)return c;console.log(a)}}export{ft as a,ue as b,dt as c,Se as d,pt as e,R as f,D as g,K as h,ie as i,Nt as j,Ze as k,et as l,Lt as m,Gt as n,Mt as o,Kt as p,Ht as q};
|
|
@@ -0,0 +1,25 @@
|
|
|
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};
|
|
@@ -0,0 +1,4 @@
|
|
|
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,12 +1,12 @@
|
|
|
1
1
|
import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
|
|
2
|
-
import{a as O}from"./chunk-KGKKDD4K.js";import{
|
|
2
|
+
import{a as O}from"./chunk-KGKKDD4K.js";import{b as N,c as pe,d as q,i as D,j as Y,n as J,o as I,q as C}from"./chunk-CXFHRZLM.js";import{J as z,L as G,N as E,Pa as re,Ta as ae,Ua as se,Wa as ie,X as T,Y as B,Ya as ce,Za as le,_a as de,b as p,ca as f,da as y,ea as t,f as x,la as ne,m as U,ma as W,na as V,o as P,u as F}from"./chunk-DTJ6JCHV.js";import{execFileSync as ye}from"node:child_process";import{cpSync as be,existsSync as b,readdirSync as Se,readFileSync as K,writeFileSync as je}from"node:fs";import{basename as _e,dirname as we,join as j,resolve as M}from"node:path";import{cwd as ue}from"node:process";import{fileURLToPath as xe}from"node:url";import{Command as Pe}from"commander";var he="-y, --yes",ke="Skip prompts and confirmations; use defaults";function fe(e,o=ke){return e.option(he,o,!1)}async function ve(e,o=!0){let c=await I({message:e,initial:o});return c||T(),c}function Ne(e,o=1){e.valid||E(e.error??"Validation failed",o)}function De(e,o,c,a){return e.dryRun?(a?a():(console.log(`Dry run - ${o}`),console.log(`Would run: ${c}`)),!0):!1}async function Je(e,o){return await ve(e,!0)?!0:(o&&o(),!1)}var L=new Map;function me(e){e!==void 0?L.delete(e):L.clear()}function Ue(e=!1){let o=F(),c=o??"";if(!e){let r=L.get(c);if(r)return r}let{resources:a,problems:l}=o?ae(o):{resources:ie(),problems:[]},d=de(a),n=le(a);se(l);let g=a.filter(r=>!r.stack),m=new Map;for(let r of a)if(r.stack){let _=m.get(r.stack)||[];_.push(r),m.set(r.stack,_)}let k={resources:a,problems:l,stacks:d,stackNames:n,unassignedResources:g,resourcesByStack:m};return L.set(c,k),k}var A={proxy:{name:"proxy",description:"Traefik reverse proxy and API gateway for routing all services",category:"core",phase:"pre_alpha",enabled_by_default:!0,dependsOn:[]},verdaccio:{name:"verdaccio",description:"Verdaccio npm registry for package management and local publishing (Premium - requires TDK_LICENSE_KEY)",category:"premium",phase:"pre_alpha",enabled_by_default:!1,dependsOn:[]},[x]:{name:x,description:"PostgreSQL database for data persistence and SQL operations",category:"core",phase:"pre_alpha",enabled_by_default:!0,dependsOn:[]},monitoring:{name:"monitoring",description:"SigNoz or SkyWalking observability platform for monitoring and tracing",category:"optional",phase:"pre_alpha",enabled_by_default:!1,dependsOn:[x]},elk:{name:"elk",description:"Elasticsearch, Logstash, Kibana stack for log aggregation and analysis",category:"optional",phase:"pre_alpha",enabled_by_default:!1,dependsOn:[]},debezium:{name:"debezium",description:"Change Data Capture for real-time data streaming from databases",category:"optional",phase:"pre_alpha",enabled_by_default:!1,dependsOn:[x]},"golden-image":{name:"golden-image",description:"Pre-built Docker image layer for faster builds and smaller deployments",category:"optional",phase:"pre_alpha",enabled_by_default:!0,dependsOn:[]}};function H(e,o){try{return ce(e,o)}catch{return[]}}function Ee(e){return new Set([...e.phases.pre_alpha.enabledStacks,...e.phases.alpha.enabledStacks,...e.phases.beta.enabledStacks,...e.phases.out_of_scope.enabledStacks])}function Q(e,o){let c=Ee(e),a=o.filter(l=>!c.has(l));return a.length===0?(e.phases.pre_alpha.enabledStacks=Array.from(new Set(e.phases.pre_alpha.enabledStacks)),[]):(e.phases.pre_alpha.enabledStacks=Array.from(new Set([...e.phases.pre_alpha.enabledStacks,...a])),a)}function ft(e,o){let c=j(e,".tdk",U);if(!b(c))return[];let a=D(e),l=Q(a,H(e,o));return l.length>0&&N(c,a),l}function Ce(){return Object.values(A).filter(e=>e.enabled_by_default&&e.category==="core").map(e=>e.name)}function Oe(e,o){return o||(O[e]?.repo.split("/").pop()??e).replace(/\.git$/,"")}async function Ae(e,o,c){let a=O[e];if(!a){console.log(p.red(`
|
|
3
3
|
\u274C Unknown template: "${e}"`)),console.log(p.yellow(`
|
|
4
4
|
Available templates:`));for(let[n,g]of Object.entries(O))console.log(` ${p.cyan(n)} ${p.gray(`- ${g.description}`)}`);console.log(p.gray("\nOr run `flisk project` with no template for a blank project.")),process.exit(1)}let l=Oe(e,o);re(l)||z.invalidPath(l).exit();let d=M(ue(),l);b(d)&&Se(d).length>0&&z.directoryExists(d).exit(),B(`Cloning template: ${e}`),t(`${a.description}
|
|
5
5
|
`,0),t(`Source: ${a.bundledPath?"bundled Flisk example":a.repo}`,0),t(`Destination: ${d}
|
|
6
6
|
`,0);try{if(a.bundledPath){let n=M(we(xe(new URL("../dist/commands/project.js",import.meta.url).href)),"../../../");be(M(n,a.bundledPath),d,{recursive:!0});let g=_e(d).replace(/-/g,"_");for(let m of["services/platform/messaging/docker-compose.yml","services/shop/orders-api/service.json","services/shop/orders-api/src/index.ts","services/shop/orders-worker/service.json","services/shop/orders-worker/src/index.ts"]){let k=j(d,m),r=K(k,"utf-8");je(k,r.replaceAll("tdk_example",g))}}else ye("git",["clone",a.repo,d],{stdio:"inherit"})}catch{E(a.bundledPath?"Bundled example copy failed. Reinstall the Flisk CLI package and try again.":"git clone failed. Check you have git installed and network access.")}me(),console.log(p.green(`
|
|
7
7
|
\u2705 Cloned "${e}" into ${l}/`)),t(`
|
|
8
8
|
Next steps:`,0),t(`1. cd ${l}`),t("2. flisk doctor # check Docker/Tilt are ready"),t("3. flisk up # start the stack"),t(`
|
|
9
|
-
Runtime readiness:`,0);for(let n of c)t(n,0)}var R={version:"1.0",project:{name:"",version:"1.0.0"},phases:{pre_alpha:{name:"Pre-Alpha",description:"Core infrastructure and MVP services",enabledStacks:Ce()},alpha:{name:"Alpha",description:"Essential business services",enabledStacks:[]},beta:{name:"Beta",description:"Extended features",enabledStacks:[]},out_of_scope:{name:"Out of Scope",description:"Future releases",enabledStacks:[]}},optional_infra:{monitoring:!1,elk:!1,debezium:!1,golden_image:!0,verdaccio:!1},discovery:{paths:["services/*/*"]},overrides:{}},mt=fe(new Pe("project")).description("Initialize or validate project-level master configuration").argument("[template]",`Clone a starter example instead of a blank project (${Object.keys(O).join(", ")})`).option("--path <dir>","Directory to clone the template into (default: the template's repo name)").option("--check","Check if master configs exist and are in sync").option("--force","Overwrite existing configuration (dangerous)").option("--config-file <path>","Load project config from existing JSON file").action(async(e,o)=>{let{assertMachineReadyOrExit:c,detectRuntimePrerequisites:a,formatRuntimeNextSteps:l}=await import("./cold-preflight-
|
|
9
|
+
Runtime readiness:`,0);for(let n of c)t(n,0)}var R={version:"1.0",project:{name:"",version:"1.0.0"},phases:{pre_alpha:{name:"Pre-Alpha",description:"Core infrastructure and MVP services",enabledStacks:Ce()},alpha:{name:"Alpha",description:"Essential business services",enabledStacks:[]},beta:{name:"Beta",description:"Extended features",enabledStacks:[]},out_of_scope:{name:"Out of Scope",description:"Future releases",enabledStacks:[]}},optional_infra:{monitoring:!1,elk:!1,debezium:!1,golden_image:!0,verdaccio:!1},discovery:{paths:["services/*/*"]},overrides:{}},mt=fe(new Pe("project")).description("Initialize or validate project-level master configuration").argument("[template]",`Clone a starter example instead of a blank project (${Object.keys(O).join(", ")})`).option("--path <dir>","Directory to clone the template into (default: the template's repo name)").option("--check","Check if master configs exist and are in sync").option("--force","Overwrite existing configuration (dangerous)").option("--config-file <path>","Load project config from existing JSON file").action(async(e,o)=>{let{assertMachineReadyOrExit:c,detectRuntimePrerequisites:a,formatRuntimeNextSteps:l}=await import("./cold-preflight-FSWLLA2X.js");await c({scope:"scaffold"});let d=l(a());if(e){await G(async()=>Ae(e,o.path,d));return}await G(async()=>{let n=F();n||(n=ue(),y(`\u{1F680} Initializing new Flisk project...
|
|
10
10
|
`),t(`Location: ${n}
|
|
11
11
|
`,0));let g=j(n,".tdk"),m=j(g,U);if(o.check){let i=P.every(u=>b(j(n,".tdk",".tdk-out",u))),h=b(m);if(i&&h){let u=D(n);f("Project configuration is valid"),t(`Project: ${u.project.name}`,3),t(`Phases: ${Object.keys(u.phases).join(", ")}`,3),process.exit(0)}else{if(console.log(p.yellow("\u26A0\uFE0F Project configuration incomplete:")),h||t(".tdk/project.json (not found)",3),!i)for(let u of P.filter(S=>!b(j(n,".tdk/.tdk-out",S))))t(`.tdk/.tdk-out/${u} (not found)`,3);t("Run `flisk project` to create them."),process.exit(1)}}B("Project Configuration"),t(`Project root: ${n}
|
|
12
12
|
`,0),b(g)||(pe(g),f("Created: .tdk/ directory"));let k=b(m);if(k&&!o.force){f(".tdk/project.json exists");let i=JSON.parse(K(m,"utf-8")),h=D(n),u=H(n),S=Q(h,u);if((S.length>0||!i.phases)&&N(m,h),S.length>0&&t(`Auto-enabled discovered service stacks: ${S.join(", ")}`,0),y(`
|