@fnet/cli 1.0.16 → 1.0.18

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.
@@ -1,3 +1,3 @@
1
- import{b as CT,c as jT,d as hT}from"./index.s0nk6cv8.js";import{f as j}from"./index.05n3mvs9.js";import"./index.cvxrf34y.js";import C from"node:fs";import b from"node:path";import aT from"nunjucks";import eT from"@flownet/lib-parse-imports-js";import T0 from"@flownet/lib-parse-node-url";import _ from"lodash.merge";import h from"node:fs";import R from"node:path";import F from"@flownet/lib-parse-imports-js";import wT from"lodash.merge";function S({feature:$,features:z,packageDevDependencies:O}){let{name:W,packages:T,options:K,extraCheck:H,explicit:G}=$,Y=`${W}_enabled`,M=z.rollup_output||{},A=Object.keys(M),V=K||{},J=z[W]?.options;if(J)V=wT(V,J);let X=!z[W]||z[W]?.enabled===!1;A.forEach((Z)=>{let q=z.rollup_output[Z];if(!q)return;if(Reflect.has(q,W)){if(X||!q[W]||q[W]?.enabled===!1){delete q[W];return}if(q[W]===!0)q[W]={enabled:!0,options:V}}else if(!X&&!G&&z[Y]!==!1)q[W]={enabled:!0};else return;q[W]=q[W]||{},q[W].options={...V,...q[W].options}});let y=A.some((Z)=>z.rollup_output[Z][W]?.enabled===!0);if(H)y=H()&&y;if(z[Y]=y,y)T.forEach((Z)=>O.push({package:Z[0],version:Z[1]}))}function w($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;S({feature:{name:"workbox",packages:[["rollup-plugin-workbox","^8"]],options:{generate:{swDest:"dist/app/esm/sw.js",globDirectory:"dist/app/esm",globPatterns:["**/*.{html,js,css,png,jpg}"],skipWaiting:!0,clientsClaim:!0}},explicit:!0},features:W,packageDevDependencies:O})}function P($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;S({feature:{name:"gzip",packages:[["rollup-plugin-gzip","^4"]],explicit:!0},features:W,packageDevDependencies:O})}function v($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;S({feature:{name:"nunjucks",packages:[["@fnet/rollup-plugin-nunjucks","0.1.8"]]},features:W,packageDevDependencies:O})}function m($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;S({feature:{name:"polyfill",packages:[["rollup-plugin-node-polyfills","^0.2"]]},features:W,packageDevDependencies:O})}function k($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;S({feature:{name:"visualizer",packages:[["rollup-plugin-visualizer","^5"]],expilicit:!0},features:W,packageDevDependencies:O})}function g($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;S({feature:{name:"analyzer",packages:[["rollup-plugin-analyzer","^3"]],options:{summaryOnly:!0,limit:12},explicit:!0},features:W,packageDevDependencies:O})}function f($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;S({feature:{name:"string",packages:[["rollup-plugin-string","^3"]]},features:W,packageDevDependencies:O})}function i($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;S({feature:{name:"image",packages:[["@rollup/plugin-image","^3"]]},features:W,packageDevDependencies:O})}function o($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;if(W.runtime.type==="bun")return;S({feature:{name:"json",packages:[["@rollup/plugin-json","^6"]]},features:W,packageDevDependencies:O})}function u($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;S({feature:{name:"terser",packages:[["@rollup/plugin-terser","^0.4"]]},features:W,packageDevDependencies:O})}function d($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;S({feature:{name:"wasm",packages:[["@rollup/plugin-wasm","^6"]]},features:W,packageDevDependencies:O})}function D($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;if(W.runtime.type==="bun")return;let T={};if(W.app?.enabled===!0){if(T.targets=T.targets||[],T.targets.push({src:"./src/app/index.html",dest:W.app.dir}),!Reflect.has(W.app,"copy")){if(!Reflect.has(W,"copy"))W.copy=!0}}S({feature:{name:"copy",packages:[["rollup-plugin-copy","^3"],["chokidar","^3"]],options:T},features:W,packageDevDependencies:O})}function c($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features,T=W.css&&W.css.enabled!==!1,K=[];if(T)K.push(["rollup-plugin-postcss","^4"]),K.push(["sass","^1.66"]),(W.css?.options?.plugins||[]).forEach((G)=>{switch(G.name){case"postcss-import":K.push(["postcss-import","^15"]);break;case"postcss-url":K.push(["postcss-url","^10"]);break;case"postcss-preset-env":K.push(["postcss-preset-env","^9"]);break;case"autoprefixer":K.push(["autoprefixer","^10"]);break;case"cssnano":K.push(["cssnano","^6"]);break}});S({feature:{name:"css",packages:K},features:W,packageDevDependencies:O})}function r({dir:$,name:z="index"}){let O=R.resolve($,`./${z}.tsx`);if(!h.existsSync(O))O=R.resolve($,`./${z}.ts`);if(!h.existsSync(O))O=R.resolve($,`./${z}.jsx`);if(!h.existsSync(O))O=R.resolve($,`./${z}.js`);if(!h.existsSync(O))return{};let W=O,T=R.extname(O);return{file:W,ext:T,ts:T===".ts"||T===".tsx",name:z}}async function n($){let{atom:z,context:O,setProgress:W}=$;W("Initializing features..."),z.doc.features=z.doc.features||{};let T=z.doc.features;T.project=T.project||{},T.project.format=T.project.format||T.project_format||"esm",T.project_format=T.project.format,T.dts_enabled=T.dts===!0||typeof T.dts<"u"&&T.dts!==!1;let K=R.resolve(O.project.projectDir),H=r({dir:R.resolve(K,"./app")});if(H.file){W("Parsing app entry imports...");let Z=await F({file:H.file,recursive:!0}),q=Z.all.some((Q)=>Q.usesJSX===!0&&Q.type==="local");T.app_uses_jsx=q,T.app_has_entry=!0,Z=await F({file:H.file}),q=Z.all.some((Q)=>Q.usesJSX===!0&&Q.type==="local"),T.app_entry_uses_jsx=q,T.app_entry_is_ts=H.ts,T.app_entry_ext=H.ext}let G=r({dir:R.resolve(K,"./cli")});if(G.file){W("Parsing cli entry imports...");let Z=await F({file:G.file,recursive:!0}),q=Z.all.some((Q)=>Q.usesJSX===!0&&Q.type==="local");T.cli_uses_jsx=q,T.cli_has_entry=!0,Z=await F({file:G.file}),q=Z.all.some((Q)=>Q.usesJSX===!0&&Q.type==="local"),T.cli_entry_uses_jsx=q,T.cli_entry_is_ts=G.ts,T.cli_entry_ext=G.ext}if(z.type==="workflow.lib"){let Z=r({dir:R.resolve(K,"./src")});if(Z.file){W("Parsing src entry imports...");let q=await F({file:Z.file,recursive:!0}),Q=q.all.some((U)=>U.usesJSX===!0&&U.type==="local");T.src_uses_jsx=Q,T.src_has_entry=!0,q=await F({file:Z.file}),Q=q.all.some((U)=>U.usesJSX===!0&&U.type==="local"),T.src_entry_uses_jsx=Q,T.src_entry_is_ts=Z.ts,T.src_entry_ext=Z.ext}}let Y=Reflect.has(T,"app_entry_uses_jsx")?T.app_entry_uses_jsx===!0:T.src_entry_uses_jsx===!0,M=Reflect.has(T,"cli_entry_uses_jsx")?T.cli_entry_uses_jsx===!0:T.src_entry_uses_jsx===!0;if(T.form_enabled=Y||M||T.form===!0||T.form?.enabled===!0,T.multiple_enabled=T.multiple_enabled||T.multiple===!0||T.multiple?.enabled===!0,T.app===!1)T.app={enabled:!1};else if(T.app===!0)T.app={enabled:!0,extend:T.app_has_entry===!0,export:!0,react:Y};else T.app={enabled:!0,extend:T.app_has_entry===!0,export:!0,react:Y,...T.app||{}};if(T.app.enabled=T.app.enabled===!0&&(z.doc.features.form_enabled===!0||T.app.extend===!0||T.app.enabled===!0),T.app.format=T.app.format||"esm",T.app.folder=T.app.folder||T.app.format||"default",T.cli===!1)T.cli={enabled:!1};else if(T.cli===!0)T.cli={enabled:!0,extend:T.cli_has_entry===!0,export:!0,react:M};else T.cli={enabled:!0,extend:T.cli_has_entry===!0,export:!0,react:M,...T.cli||{}};if(T.cli.enabled=T.cli.enabled===!0&&(z.doc.features.form_enabled===!1||T.cli.extend===!0||T.cli.enabled===!0),T.cli.format=T.cli.format||"esm",T.cli.folder=T.cli.folder||T.cli.folder||"esm",T.cli.node_options=T.cli.node?.options||T.cli.node_options||"",T.cli.bin=T.cli.bin||z.doc.name,T.cli.installable=T.cli.installable===!0,T.cli.enabled)z.doc["npm::bin"]=T.cli.bin;T.json=T.cli.enabled||T.json;let A={cjs:{format:"cjs",context:T.form_enabled?"window":"global",babel:T.src_uses_jsx===!0||!1,browser:!1,replace:!0,terser:!0,enabled:T.cjs!==!1,copy:!1},esm:{format:"esm",context:T.form_enabled?"window":"global",babel:T.src_uses_jsx===!0||!1,browser:!1,replace:!0,terser:!1,enabled:T.esm!==!1,copy:!0},iife:{format:"iife",context:T.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0,enabled:T.iife===!0,terser:!0,copy:!1}},V={targets:{browsers:"last 9 versions, not dead",node:"18"}},J={};if(T.webos===!0)A.webos={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,input:"./src/app/index.js",output_dir:"./dist/app/webos",copy:!1,babel_options:{targets:{chrome:"79"}}};if(T.electron===!0)A.electron={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,copy:!1,input:"./src/app/index.js",output_dir:"./dist/app/electron"};if(T.nextjs===!0)A.nextjs={format:"esm",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,copy:!1,input:"./src/app/index.js",output_dir:"./dist/app/nextjs"};if(T.ios===!0)A.ios={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,copy:!1,input:"./src/app/index.js",output_dir:"./dist/app/ios"};if(T.macos===!0)A.macos={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,copy:!1,input:"./src/app/index.js",output_dir:"./dist/app/macos"};if(T.app.enabled===!0)T.app.dir=`./dist/app/${T.app.folder}`,T.app.output={file:`./dist/app/${T.app.folder}/index.js`,dir:`./dist/app/${T.app.folder}/`,...T.app.output||{}},T.app.input={file:"./src/app/index.js",dir:"./src/app/",...T.app.input||{}},A.app={format:T.app.format,browser:!0,babel:!0,context:"window",replace:!0,input:T.app.input.file,output_dir:T.app.dir,terser:!0,output_exports:T.app.export===!1?"none":"auto",browsersync:!0};if(T.cli.enabled===!0)T.cli.dir=`./dist/cli/${T.cli.folder}`,T.cli.output={file:`./dist/cli/${T.cli.folder}/index.js`,dir:`./dist/cli/${T.cli.folder}/`,...T.cli.output||{}},T.cli.input={file:"./src/cli/index.js",dir:"./src/cli/",...T.cli.input||{}},A.cli={format:T.cli.format,context:"global",babel:T.src_uses_jsx===!0||T.cli_uses_jsx===!0||!1,browser:!1,replace:!0,enabled:!0,input:T.cli.input.file,output_dir:T.cli.dir,banner:"#!/usr/bin/env bun",terser:!0,output_exports:T.cli.export===!1?"none":"auto"};let X={server:".",startPath:`${R.normalize(T.app.dir||".")}`,files:[R.normalize("./dist/**/*")],cors:!0,open:!1};if(T.babel_options=_(V,T.babel_options||T.babel?.options),T.browsersync_options=_(X,T.browsersync_options||T.browsersync?.options||{}),T.replace_options=_(J,T.replace_options||T.replace?.options||{}),Reflect.has(T.browsersync_options,"proxy"))delete T.browsersync_options.server;T.rollup=T.rollup||{},T.rollup_output=_(A,T.rollup_output||T.rollup?.output||{}),T.preact_enabled=T.preact===!0||T.preact&&T.preact?.enabled!==!1;let y=Object.keys(A);for(let Z of y){let q=A[Z];if(!q)continue;if(T.rollup[Z]===!1){delete T.rollup_output[Z];continue}if(q.babel_options=q.babel_options||T.babel_options,q.browsersync_options=_(T.browsersync_options,q.browsersync_options),q.replace_options=_(T.replace_options,q.replace_options),T.preact_enabled)q.alias_enabled=!0,q.alias=q.alias||{},q.alias.entries=q.alias.entries||{},q.alias.entries.react="preact/compat",q.alias.entries["react-dom"]="preact/compat";if(T.form_enabled||T.babel)q.babel=!0}y=Object.keys(T.rollup_output),T.babel_enabled=y.some((Z)=>T.rollup_output[Z].babel===!0),T.browser_enabled=y.some((Z)=>T.rollup_output[Z].babel===!0),T.browsersync_enabled=T.browsersync!==!1&&y.some((Z)=>T.rollup_output[Z].browsersync===!0),T.browsersync_enabled=T.browsersync_enabled&&T.app.enabled,T.dependency_auto_enabled=T.dependency_auto!==!1&&T.dependency_auto?.enabled!==!1,T.npm_install_flags=T.npm_install_flags||"",T.react_version=T.react_version||T.react?.version||18,T.bpmn=T.bpmn||{},T.bpmn.enabled=T.bpmn.enabled!==!1,T.bpmn.per_flow=T.bpmn.per_flow===!0,c($),D($),d($),u($),o($),f($),i($),g($),k($),m($),v($),w($),P($)}import PT from"@fnet/npm-list-versions";async function p({atom:$,packageDependencies:z,packageDevDependencies:O,setProgress:W}){W("Initializing dependencies");let T=$.doc.dependencies||[];if(T.filter((K)=>!K.dev).forEach((K)=>z.push(K)),T.filter((K)=>K.dev).forEach((K)=>O.push(K)),$.type==="workflow")z.push({package:"dot-prop",version:"^10"});if($.doc.features.form_enabled){if($.doc.features.dependency_auto_enabled){let K="^18.2";if(W("Fetching React versions"),K=`^${(await PT({name:"react",groupBy:{major:!0}})).find((Y)=>Y[0]===$.doc.features.react_version.toString())[0]}`,z.push({package:"react",version:K}),z.push({package:"react-dom",version:K}),$.type==="workflow")z.push({package:"@fnet/react-app",version:"^0.1"}),z.push({package:"@fnet/react-app-state",version:"^0.1"})}}if($.doc.features.preact_enabled)z.push({package:"preact",version:"^10"});if($.doc.features.cli.enabled===!0){if(z.push({package:"@fnet/args",version:"^0.1"}),$.doc.features.cli.fargs&&$.doc.features.cli.fargs?.enabled!==!1)z.push({package:"@fnet/config",version:"0.2.21"});if($.doc.features.cli.mcp&&$.doc.features.cli.mcp.enabled===!0)z.push({package:"@modelcontextprotocol/sdk",version:"^1.10"}),z.push({package:"express",version:"^4.18"})}if($.doc.features.render&&$.doc.features.render.enabled!==!1)O.push({package:"@flownet/lib-render-templates-dir",version:"0.1.19"});if(O.push({package:"@babel/core",version:"^7"}),O.push({package:"@rollup/plugin-commonjs",version:"^28"}),O.push({package:"@rollup/plugin-node-resolve",version:"^16"}),O.push({package:"@rollup/plugin-replace",version:"^6"}),O.push({package:"rollup",version:"^4"}),$.doc.features.dts_enabled)O.push({package:"rollup-plugin-dts",version:"^6"});if(O.push({package:"rollup-plugin-peer-deps-external",version:"^2"}),O.push({package:"@rollup/plugin-alias",version:"^5"}),O.push({package:"fs-extra",version:"^11"}),$.doc.features.babel_enabled)O.push({package:"@rollup/plugin-babel",version:"^6"}),O.push({package:"@babel/preset-env",version:"^7"}),O.push({package:"@babel/preset-react",version:"^7"}),$.doc.features.babel?.options?.plugins?.forEach((K)=>{switch(K[0]){case"@babel/plugin-proposal-decorators":O.push({package:"@babel/plugin-proposal-decorators",version:"^7"});break;case"@babel/plugin-proposal-class-properties":O.push({package:"@babel/plugin-proposal-class-properties",version:"^7"});break;case"@babel/plugin-proposal-private-methods":O.push({package:"@babel/plugin-proposal-private-methods",version:"^7"});break;case"@babel/plugin-proposal-private-property-in-object":O.push({package:"@babel/plugin-proposal-private-property-in-object",version:"^7"});break;case"@babel/plugin-proposal-optional-chaining":O.push({package:"@babel/plugin-proposal-optional-chaining",version:"^7"});break}});if(O.push({package:"@fnet/rollup-plugin-delete",version:"0.1.10"}),$.doc.features.browsersync_enabled)O.push({package:"@fnet/rollup-plugin-browsersync",version:"0.1.11"})}import vT from"@fnet/npm-list-versions";async function s({atom:$,packageDependencies:z,packageDevDependencies:O,setProgress:W}){W("Initializing dependencies for Bun");let T=$.doc.dependencies||[];if(T.filter((K)=>!K.dev).forEach((K)=>z.push(K)),T.filter((K)=>K.dev).forEach((K)=>O.push(K)),$.type==="workflow")z.push({package:"dot-prop",version:"^10"});if($.doc.features.form_enabled){if($.doc.features.dependency_auto_enabled){let K="^18.2";if(W("Fetching React versions"),K=`^${(await vT({name:"react",groupBy:{major:!0}})).find((Y)=>Y[0]===$.doc.features.react_version.toString())[0]}`,z.push({package:"react",version:K}),z.push({package:"react-dom",version:K}),$.type==="workflow")z.push({package:"@fnet/react-app",version:"^0.1"}),z.push({package:"@fnet/react-app-state",version:"^0.1"})}}if($.doc.features.preact_enabled)z.push({package:"preact",version:"^10"});if($.doc.features.cli.enabled===!0){if(z.push({package:"@fnet/args",version:"^0.1"}),$.doc.features.cli.fargs&&$.doc.features.cli.fargs?.enabled!==!1)z.push({package:"@fnet/config",version:"0.2.21"});if($.doc.features.cli.mcp&&$.doc.features.cli.mcp.enabled===!0)z.push({package:"@modelcontextprotocol/sdk",version:"^1.10"}),z.push({package:"express",version:"^4.18"})}if($.doc.features.render&&$.doc.features.render.enabled!==!1)O.push({package:"@flownet/lib-render-templates-dir",version:"0.1.19"})}import AT from"node:fs";import ST from"node:path";import mT from"@flownet/lib-render-templates-dir";async function t({atom:$,setProgress:z,context:O,packageDependencies:W}){if($.doc.features.app.enabled!==!0)return;await z({message:"Creating app folder"});let T={atom:$,packageDependencies:W,ts:Date.now()},K=O.templateDir,H=ST.resolve(O.projectDir,"src/app");if(!AT.existsSync(H))AT.mkdirSync(H,{recursive:!0});let G=["index.js.njk"];if($.doc.features.app.html!==!1)G.push("index.html.njk");await mT({pattern:G,dir:ST.resolve(K,"src/app"),outDir:H,context:T})}import yT from"nunjucks";import N from"node:fs";import E from"node:path";import fT from"@flownet/lib-parse-imports-js";import kT from"@fnet/npm-pick-versions";import gT from"object-hash";import l from"node:fs";import UT from"node:path";async function I({projectDir:$,name:z,setProgress:O,count:W=1}){let T,H=gT(["npm-pick-versions",z,W]),G=UT.join($,".cache"),Y=UT.join(G,H+".json");if(l.existsSync(Y)){if(O)O(`Picking npm version of ${z} from cache ...`);T=JSON.parse(l.readFileSync(Y,"utf8"))}else{if(O)O(`Picking npm version of ${z} ...`);T=await kT({name:z,count:W}),l.mkdirSync(G,{recursive:!0}),l.writeFileSync(Y,JSON.stringify(T),"utf8")}return T}async function a({atom:$,context:z,packageDependencies:O,packageDevDependencies:W,setProgress:T}){await T({message:"Creating package.json."}),O.filter((q)=>q.dev===!0).forEach((q)=>{if(!W.find((U)=>U.package===q.package))W.push(q);let Q=O.findIndex((U)=>U.package===q.package);O.splice(Q,1)});let H=O.find((q)=>q.package==="react"),G=O.find((q)=>q.package==="react-dom");if(H&&!G)O.push({package:"react-dom",version:H.version});else if(H&&G)G.version=H.version;if(H&&$.doc.features.react_version>=17){if(!O.find((q)=>q.package==="@emotion/react"))O.push({package:"@emotion/react",version:"^11"});if(!O.find((q)=>q.package==="@emotion/styled"))O.push({package:"@emotion/styled",version:"^11"})}let Y=[];if($.doc.features.app.enabled===!0)Y.push({file:E.resolve(z.projectDir,"src/app/index.js"),dev:$.doc.features.app.dev===!0});if($.doc.features.cli.enabled===!0)Y.push({file:E.resolve(z.projectDir,"src/cli/index.js"),dev:$.doc.features.cli.dev===!0});for await(let q of Y){let Q=q.file;if(!N.existsSync(Q))throw Error(`App file not found: ${Q}`);let L=(await fT({file:Q,recursive:!0,verbose:!1})).all;for await(let B of L){if(B.type!=="npm")continue;if(O.find((x)=>x.package===B.package))continue;if(W.find((x)=>x.package===B.package))continue;let xT=await I({name:B.package,projectDir:z.projectDir,setProgress:T});(q.dev===!0?W:O).push({package:B.package,subpath:B.subpath,version:xT.minorRange,type:"npm"})}}for await(let q of O){if(q.version!==void 0)continue;let Q=await I({name:q.package,projectDir:z.projectDir,setProgress:T});q.version=Q.minorRange}for await(let q of W){if(q.version!==void 0)continue;let Q=await I({name:q.package,projectDir:z.projectDir,setProgress:T});q.version=Q.minorRange}let M={atom:$,packageDependencies:O,packageDevDependencies:W},A=z.templateDir,J=yT.compile(N.readFileSync(E.resolve(A,"package.json.njk"),"utf8"),yT.configure(A)).render(M),X=z.projectDir,y=E.resolve(X,"package.json");N.writeFileSync(y,J,"utf8");let Z=E.resolve(z.project.projectDir,"fnet");if(N.existsSync(Z)){let q=E.resolve(z.projectDir,"fnet");if(!N.existsSync(q))N.mkdirSync(q);let Q=N.readdirSync(Z);for(let U of Q){let L=E.resolve(Z,U);if(!N.lstatSync(L).isFile())continue;let B=E.resolve(q,U);N.copyFileSync(L,B)}}}import XT from"node:fs";import JT from"node:path";import iT from"@flownet/lib-render-templates-dir";async function e({atom:$,setProgress:z,context:O,packageDependencies:W}){if($.doc.features.cli.enabled!==!0)return;await z({message:"Creating cli."});let T={atom:$,packageDependencies:W},K=O.templateDir,H=JT.resolve(O.projectDir,"src/cli");if(!XT.existsSync(H))XT.mkdirSync(H,{recursive:!0});await iT({pattern:["index.js.njk"],dir:JT.resolve(K,"src/cli"),outDir:H,context:T})}import TT from"node:fs";import $T from"node:path";import VT from"nunjucks";import oT from"@flownet/lib-parse-imports-js";async function OT({atom:$,setProgress:z,context:O,packageDependencies:W}){await z({message:"Creating rollup file."});let T={atom:$,packageDependencies:W},K=$T.resolve(O.projectDir,"src","default/index.js");if(!TT.existsSync(K))throw Error(`Entry file not found: ${K}`);let G=(await oT({file:K,recursive:!0})).all.filter((Z)=>Z.type==="node").map((Z)=>Z.path),Y=$.doc.features.rollup_output,M=Object.keys(Y);for(let Z=0;Z<M.length;Z++){let q=M[Z],Q=Y[q];if(Q.browser===!0){if(G.length>0){Q.globals_enabled=!0,Q.globals=Q.globals||[],Q.globals=Q.globals.concat(G.map((U)=>{return{key:U,value:U}})),Q.alias_enabled=!0,Q.alias=Q.alias||{},Q.alias.entries=Q.alias.entries||{};for(let U=0;U<G.length;U++){let L=G[U];Q.alias.entries[L]=`node:${L}`,Q.alias.entries[`node:${L}`]=L}Q.external_enabled=!0,Q.external=Q.external||[],Q.external=Q.external.concat(G)}}}let A=O.templateDir,J=VT.compile(TT.readFileSync($T.resolve(A,"rollup.config.mjs.njk"),"utf8"),VT.configure(A)).render(T),X=O.projectDir,y=$T.resolve(X,"rollup.config.mjs");TT.writeFileSync(y,J,"utf8")}import zT from"node:fs";import bT from"node:path";import RT from"nunjucks";async function WT({atom:$,setProgress:z,context:O,packageDependencies:W}){await z({message:"Creating build.js file."});let T={atom:$,packageDependencies:W},K=O.templateDir,G=RT.compile(zT.readFileSync(bT.resolve(K,"build.js.njk"),"utf8"),RT.configure(K)).render(T),Y=O.projectDir,M=bT.resolve(Y,"build.js");zT.writeFileSync(M,G,"utf8"),zT.chmodSync(M,"755")}import KT from"node:fs";import qT from"node:path";import uT from"nunjucks";import dT from"ajv/dist/2020.js";import DT from"ajv/dist/standalone/index.js";import cT from"ajv-formats";async function GT({atom:$,setProgress:z,context:O,njEnv:W}){if($.doc.features.cli.enabled!==!0)return;await z({message:"Creating input args."});let T={},K=[];if($.doc.input)T=$.doc.input;else T={type:"object",properties:{},required:[]};if($.doc.features.cli.fargs&&$.doc.features.cli.fargs?.enabled!==!1){let Q=$.doc.features.cli.fargs,U={type:"string",description:"Config name to load args",hidden:!1},L={type:"array",description:"Tags to filter the config",hidden:!1};if(Reflect.has(Q,"default"))U.default=Q.default}let G={imports:K,atom:$},Y=O.templateDir,A=uT.compile(KT.readFileSync(qT.resolve(Y,"src/default/input.args.js.njk"),"utf8"),W).render(G),V=O.projectDir,J=qT.resolve(V,"src/default/input.args.js");KT.writeFileSync(J,A,"utf8");let X=new dT({allErrors:!0,useDefaults:!0,formats:{},strict:!1,code:{esm:!0,lines:!0,optimize:!1,source:!0}});cT(X);let y=X.compile(T),q=DT(X,y)+`
1
+ import{b as CT,c as jT,d as hT}from"./index.8c71g5r3.js";import{f as j}from"./index.05n3mvs9.js";import"./index.cvxrf34y.js";import C from"node:fs";import b from"node:path";import aT from"nunjucks";import eT from"@flownet/lib-parse-imports-js";import T0 from"@flownet/lib-parse-node-url";import _ from"lodash.merge";import h from"node:fs";import R from"node:path";import F from"@flownet/lib-parse-imports-js";import wT from"lodash.merge";function S({feature:$,features:z,packageDevDependencies:O}){let{name:W,packages:T,options:K,extraCheck:H,explicit:G}=$,Y=`${W}_enabled`,M=z.rollup_output||{},A=Object.keys(M),V=K||{},J=z[W]?.options;if(J)V=wT(V,J);let X=!z[W]||z[W]?.enabled===!1;A.forEach((Z)=>{let q=z.rollup_output[Z];if(!q)return;if(Reflect.has(q,W)){if(X||!q[W]||q[W]?.enabled===!1){delete q[W];return}if(q[W]===!0)q[W]={enabled:!0,options:V}}else if(!X&&!G&&z[Y]!==!1)q[W]={enabled:!0};else return;q[W]=q[W]||{},q[W].options={...V,...q[W].options}});let y=A.some((Z)=>z.rollup_output[Z][W]?.enabled===!0);if(H)y=H()&&y;if(z[Y]=y,y)T.forEach((Z)=>O.push({package:Z[0],version:Z[1]}))}function w($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;S({feature:{name:"workbox",packages:[["rollup-plugin-workbox","^8"]],options:{generate:{swDest:"dist/app/esm/sw.js",globDirectory:"dist/app/esm",globPatterns:["**/*.{html,js,css,png,jpg}"],skipWaiting:!0,clientsClaim:!0}},explicit:!0},features:W,packageDevDependencies:O})}function P($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;S({feature:{name:"gzip",packages:[["rollup-plugin-gzip","^4"]],explicit:!0},features:W,packageDevDependencies:O})}function v($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;S({feature:{name:"nunjucks",packages:[["@fnet/rollup-plugin-nunjucks","0.1.8"]]},features:W,packageDevDependencies:O})}function m($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;S({feature:{name:"polyfill",packages:[["rollup-plugin-node-polyfills","^0.2"]]},features:W,packageDevDependencies:O})}function k($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;S({feature:{name:"visualizer",packages:[["rollup-plugin-visualizer","^5"]],expilicit:!0},features:W,packageDevDependencies:O})}function g($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;S({feature:{name:"analyzer",packages:[["rollup-plugin-analyzer","^3"]],options:{summaryOnly:!0,limit:12},explicit:!0},features:W,packageDevDependencies:O})}function f($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;S({feature:{name:"string",packages:[["rollup-plugin-string","^3"]]},features:W,packageDevDependencies:O})}function i($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;S({feature:{name:"image",packages:[["@rollup/plugin-image","^3"]]},features:W,packageDevDependencies:O})}function o($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;if(W.runtime.type==="bun")return;S({feature:{name:"json",packages:[["@rollup/plugin-json","^6"]]},features:W,packageDevDependencies:O})}function u($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;S({feature:{name:"terser",packages:[["@rollup/plugin-terser","^0.4"]]},features:W,packageDevDependencies:O})}function d($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;S({feature:{name:"wasm",packages:[["@rollup/plugin-wasm","^6"]]},features:W,packageDevDependencies:O})}function D($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features;if(W.runtime.type==="bun")return;let T={};if(W.app?.enabled===!0){if(T.targets=T.targets||[],T.targets.push({src:"./src/app/index.html",dest:W.app.dir}),!Reflect.has(W.app,"copy")){if(!Reflect.has(W,"copy"))W.copy=!0}}S({feature:{name:"copy",packages:[["rollup-plugin-copy","^3"],["chokidar","^3"]],options:T},features:W,packageDevDependencies:O})}function c($){let{atom:z,packageDevDependencies:O}=$,W=z.doc.features,T=W.css&&W.css.enabled!==!1,K=[];if(T)K.push(["rollup-plugin-postcss","^4"]),K.push(["sass","^1.66"]),(W.css?.options?.plugins||[]).forEach((G)=>{switch(G.name){case"postcss-import":K.push(["postcss-import","^15"]);break;case"postcss-url":K.push(["postcss-url","^10"]);break;case"postcss-preset-env":K.push(["postcss-preset-env","^9"]);break;case"autoprefixer":K.push(["autoprefixer","^10"]);break;case"cssnano":K.push(["cssnano","^6"]);break}});S({feature:{name:"css",packages:K},features:W,packageDevDependencies:O})}function r({dir:$,name:z="index"}){let O=R.resolve($,`./${z}.tsx`);if(!h.existsSync(O))O=R.resolve($,`./${z}.ts`);if(!h.existsSync(O))O=R.resolve($,`./${z}.jsx`);if(!h.existsSync(O))O=R.resolve($,`./${z}.js`);if(!h.existsSync(O))return{};let W=O,T=R.extname(O);return{file:W,ext:T,ts:T===".ts"||T===".tsx",name:z}}async function n($){let{atom:z,context:O,setProgress:W}=$;W("Initializing features..."),z.doc.features=z.doc.features||{};let T=z.doc.features;T.project=T.project||{},T.project.format=T.project.format||T.project_format||"esm",T.project_format=T.project.format,T.dts_enabled=T.dts===!0||typeof T.dts<"u"&&T.dts!==!1;let K=R.resolve(O.project.projectDir),H=r({dir:R.resolve(K,"./app")});if(H.file){W("Parsing app entry imports...");let Z=await F({file:H.file,recursive:!0}),q=Z.all.some((Q)=>Q.usesJSX===!0&&Q.type==="local");T.app_uses_jsx=q,T.app_has_entry=!0,Z=await F({file:H.file}),q=Z.all.some((Q)=>Q.usesJSX===!0&&Q.type==="local"),T.app_entry_uses_jsx=q,T.app_entry_is_ts=H.ts,T.app_entry_ext=H.ext}let G=r({dir:R.resolve(K,"./cli")});if(G.file){W("Parsing cli entry imports...");let Z=await F({file:G.file,recursive:!0}),q=Z.all.some((Q)=>Q.usesJSX===!0&&Q.type==="local");T.cli_uses_jsx=q,T.cli_has_entry=!0,Z=await F({file:G.file}),q=Z.all.some((Q)=>Q.usesJSX===!0&&Q.type==="local"),T.cli_entry_uses_jsx=q,T.cli_entry_is_ts=G.ts,T.cli_entry_ext=G.ext}if(z.type==="workflow.lib"){let Z=r({dir:R.resolve(K,"./src")});if(Z.file){W("Parsing src entry imports...");let q=await F({file:Z.file,recursive:!0}),Q=q.all.some((U)=>U.usesJSX===!0&&U.type==="local");T.src_uses_jsx=Q,T.src_has_entry=!0,q=await F({file:Z.file}),Q=q.all.some((U)=>U.usesJSX===!0&&U.type==="local"),T.src_entry_uses_jsx=Q,T.src_entry_is_ts=Z.ts,T.src_entry_ext=Z.ext}}let Y=Reflect.has(T,"app_entry_uses_jsx")?T.app_entry_uses_jsx===!0:T.src_entry_uses_jsx===!0,M=Reflect.has(T,"cli_entry_uses_jsx")?T.cli_entry_uses_jsx===!0:T.src_entry_uses_jsx===!0;if(T.form_enabled=Y||M||T.form===!0||T.form?.enabled===!0,T.multiple_enabled=T.multiple_enabled||T.multiple===!0||T.multiple?.enabled===!0,T.app===!1)T.app={enabled:!1};else if(T.app===!0)T.app={enabled:!0,extend:T.app_has_entry===!0,export:!0,react:Y};else T.app={enabled:!0,extend:T.app_has_entry===!0,export:!0,react:Y,...T.app||{}};if(T.app.enabled=T.app.enabled===!0&&(z.doc.features.form_enabled===!0||T.app.extend===!0||T.app.enabled===!0),T.app.format=T.app.format||"esm",T.app.folder=T.app.folder||T.app.format||"default",T.cli===!1)T.cli={enabled:!1};else if(T.cli===!0)T.cli={enabled:!0,extend:T.cli_has_entry===!0,export:!0,react:M};else T.cli={enabled:!0,extend:T.cli_has_entry===!0,export:!0,react:M,...T.cli||{}};if(T.cli.enabled=T.cli.enabled===!0&&(z.doc.features.form_enabled===!1||T.cli.extend===!0||T.cli.enabled===!0),T.cli.format=T.cli.format||"esm",T.cli.folder=T.cli.folder||T.cli.folder||"esm",T.cli.node_options=T.cli.node?.options||T.cli.node_options||"",T.cli.bin=T.cli.bin||z.doc.name,T.cli.installable=T.cli.installable===!0,T.cli.enabled)z.doc["npm::bin"]=T.cli.bin;T.json=T.cli.enabled||T.json;let A={cjs:{format:"cjs",context:T.form_enabled?"window":"global",babel:T.src_uses_jsx===!0||!1,browser:!1,replace:!0,terser:!0,enabled:T.cjs!==!1,copy:!1},esm:{format:"esm",context:T.form_enabled?"window":"global",babel:T.src_uses_jsx===!0||!1,browser:!1,replace:!0,terser:!1,enabled:T.esm!==!1,copy:!0},iife:{format:"iife",context:T.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0,enabled:T.iife===!0,terser:!0,copy:!1}},V={targets:{browsers:"last 9 versions, not dead",node:"18"}},J={};if(T.webos===!0)A.webos={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,input:"./src/app/index.js",output_dir:"./dist/app/webos",copy:!1,babel_options:{targets:{chrome:"79"}}};if(T.electron===!0)A.electron={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,copy:!1,input:"./src/app/index.js",output_dir:"./dist/app/electron"};if(T.nextjs===!0)A.nextjs={format:"esm",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,copy:!1,input:"./src/app/index.js",output_dir:"./dist/app/nextjs"};if(T.ios===!0)A.ios={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,copy:!1,input:"./src/app/index.js",output_dir:"./dist/app/ios"};if(T.macos===!0)A.macos={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,copy:!1,input:"./src/app/index.js",output_dir:"./dist/app/macos"};if(T.app.enabled===!0)T.app.dir=`./dist/app/${T.app.folder}`,T.app.output={file:`./dist/app/${T.app.folder}/index.js`,dir:`./dist/app/${T.app.folder}/`,...T.app.output||{}},T.app.input={file:"./src/app/index.js",dir:"./src/app/",...T.app.input||{}},A.app={format:T.app.format,browser:!0,babel:!0,context:"window",replace:!0,input:T.app.input.file,output_dir:T.app.dir,terser:!0,output_exports:T.app.export===!1?"none":"auto",browsersync:!0};if(T.cli.enabled===!0)T.cli.dir=`./dist/cli/${T.cli.folder}`,T.cli.output={file:`./dist/cli/${T.cli.folder}/index.js`,dir:`./dist/cli/${T.cli.folder}/`,...T.cli.output||{}},T.cli.input={file:"./src/cli/index.js",dir:"./src/cli/",...T.cli.input||{}},A.cli={format:T.cli.format,context:"global",babel:T.src_uses_jsx===!0||T.cli_uses_jsx===!0||!1,browser:!1,replace:!0,enabled:!0,input:T.cli.input.file,output_dir:T.cli.dir,banner:"#!/usr/bin/env bun",terser:!0,output_exports:T.cli.export===!1?"none":"auto"};let X={server:".",startPath:`${R.normalize(T.app.dir||".")}`,files:[R.normalize("./dist/**/*")],cors:!0,open:!1};if(T.babel_options=_(V,T.babel_options||T.babel?.options),T.browsersync_options=_(X,T.browsersync_options||T.browsersync?.options||{}),T.replace_options=_(J,T.replace_options||T.replace?.options||{}),Reflect.has(T.browsersync_options,"proxy"))delete T.browsersync_options.server;T.rollup=T.rollup||{},T.rollup_output=_(A,T.rollup_output||T.rollup?.output||{}),T.preact_enabled=T.preact===!0||T.preact&&T.preact?.enabled!==!1;let y=Object.keys(A);for(let Z of y){let q=A[Z];if(!q)continue;if(T.rollup[Z]===!1){delete T.rollup_output[Z];continue}if(q.babel_options=q.babel_options||T.babel_options,q.browsersync_options=_(T.browsersync_options,q.browsersync_options),q.replace_options=_(T.replace_options,q.replace_options),T.preact_enabled)q.alias_enabled=!0,q.alias=q.alias||{},q.alias.entries=q.alias.entries||{},q.alias.entries.react="preact/compat",q.alias.entries["react-dom"]="preact/compat";if(T.form_enabled||T.babel)q.babel=!0}y=Object.keys(T.rollup_output),T.babel_enabled=y.some((Z)=>T.rollup_output[Z].babel===!0),T.browser_enabled=y.some((Z)=>T.rollup_output[Z].babel===!0),T.browsersync_enabled=T.browsersync!==!1&&y.some((Z)=>T.rollup_output[Z].browsersync===!0),T.browsersync_enabled=T.browsersync_enabled&&T.app.enabled,T.dependency_auto_enabled=T.dependency_auto!==!1&&T.dependency_auto?.enabled!==!1,T.npm_install_flags=T.npm_install_flags||"",T.react_version=T.react_version||T.react?.version||18,T.bpmn=T.bpmn||{},T.bpmn.enabled=T.bpmn.enabled!==!1,T.bpmn.per_flow=T.bpmn.per_flow===!0,c($),D($),d($),u($),o($),f($),i($),g($),k($),m($),v($),w($),P($)}import PT from"@fnet/npm-list-versions";async function p({atom:$,packageDependencies:z,packageDevDependencies:O,setProgress:W}){W("Initializing dependencies");let T=$.doc.dependencies||[];if(T.filter((K)=>!K.dev).forEach((K)=>z.push(K)),T.filter((K)=>K.dev).forEach((K)=>O.push(K)),$.type==="workflow")z.push({package:"dot-prop",version:"^10"});if($.doc.features.form_enabled){if($.doc.features.dependency_auto_enabled){let K="^18.2";if(W("Fetching React versions"),K=`^${(await PT({name:"react",groupBy:{major:!0}})).find((Y)=>Y[0]===$.doc.features.react_version.toString())[0]}`,z.push({package:"react",version:K}),z.push({package:"react-dom",version:K}),$.type==="workflow")z.push({package:"@fnet/react-app",version:"^0.1"}),z.push({package:"@fnet/react-app-state",version:"^0.1"})}}if($.doc.features.preact_enabled)z.push({package:"preact",version:"^10"});if($.doc.features.cli.enabled===!0){if(z.push({package:"@fnet/args",version:"^0.1"}),$.doc.features.cli.fargs&&$.doc.features.cli.fargs?.enabled!==!1)z.push({package:"@fnet/config",version:"0.2.21"});if($.doc.features.cli.mcp&&$.doc.features.cli.mcp.enabled===!0)z.push({package:"@modelcontextprotocol/sdk",version:"^1.10"}),z.push({package:"express",version:"^4.18"})}if($.doc.features.render&&$.doc.features.render.enabled!==!1)O.push({package:"@flownet/lib-render-templates-dir",version:"0.1.19"});if(O.push({package:"@babel/core",version:"^7"}),O.push({package:"@rollup/plugin-commonjs",version:"^28"}),O.push({package:"@rollup/plugin-node-resolve",version:"^16"}),O.push({package:"@rollup/plugin-replace",version:"^6"}),O.push({package:"rollup",version:"^4"}),$.doc.features.dts_enabled)O.push({package:"rollup-plugin-dts",version:"^6"});if(O.push({package:"rollup-plugin-peer-deps-external",version:"^2"}),O.push({package:"@rollup/plugin-alias",version:"^5"}),O.push({package:"fs-extra",version:"^11"}),$.doc.features.babel_enabled)O.push({package:"@rollup/plugin-babel",version:"^6"}),O.push({package:"@babel/preset-env",version:"^7"}),O.push({package:"@babel/preset-react",version:"^7"}),$.doc.features.babel?.options?.plugins?.forEach((K)=>{switch(K[0]){case"@babel/plugin-proposal-decorators":O.push({package:"@babel/plugin-proposal-decorators",version:"^7"});break;case"@babel/plugin-proposal-class-properties":O.push({package:"@babel/plugin-proposal-class-properties",version:"^7"});break;case"@babel/plugin-proposal-private-methods":O.push({package:"@babel/plugin-proposal-private-methods",version:"^7"});break;case"@babel/plugin-proposal-private-property-in-object":O.push({package:"@babel/plugin-proposal-private-property-in-object",version:"^7"});break;case"@babel/plugin-proposal-optional-chaining":O.push({package:"@babel/plugin-proposal-optional-chaining",version:"^7"});break}});if(O.push({package:"@fnet/rollup-plugin-delete",version:"0.1.10"}),$.doc.features.browsersync_enabled)O.push({package:"@fnet/rollup-plugin-browsersync",version:"0.1.11"})}import vT from"@fnet/npm-list-versions";async function s({atom:$,packageDependencies:z,packageDevDependencies:O,setProgress:W}){W("Initializing dependencies for Bun");let T=$.doc.dependencies||[];if(T.filter((K)=>!K.dev).forEach((K)=>z.push(K)),T.filter((K)=>K.dev).forEach((K)=>O.push(K)),$.type==="workflow")z.push({package:"dot-prop",version:"^10"});if($.doc.features.form_enabled){if($.doc.features.dependency_auto_enabled){let K="^18.2";if(W("Fetching React versions"),K=`^${(await vT({name:"react",groupBy:{major:!0}})).find((Y)=>Y[0]===$.doc.features.react_version.toString())[0]}`,z.push({package:"react",version:K}),z.push({package:"react-dom",version:K}),$.type==="workflow")z.push({package:"@fnet/react-app",version:"^0.1"}),z.push({package:"@fnet/react-app-state",version:"^0.1"})}}if($.doc.features.preact_enabled)z.push({package:"preact",version:"^10"});if($.doc.features.cli.enabled===!0){if(z.push({package:"@fnet/args",version:"^0.1"}),$.doc.features.cli.fargs&&$.doc.features.cli.fargs?.enabled!==!1)z.push({package:"@fnet/config",version:"0.2.21"});if($.doc.features.cli.mcp&&$.doc.features.cli.mcp.enabled===!0)z.push({package:"@modelcontextprotocol/sdk",version:"^1.10"}),z.push({package:"express",version:"^4.18"})}if($.doc.features.render&&$.doc.features.render.enabled!==!1)O.push({package:"@flownet/lib-render-templates-dir",version:"0.1.19"})}import AT from"node:fs";import ST from"node:path";import mT from"@flownet/lib-render-templates-dir";async function t({atom:$,setProgress:z,context:O,packageDependencies:W}){if($.doc.features.app.enabled!==!0)return;await z({message:"Creating app folder"});let T={atom:$,packageDependencies:W,ts:Date.now()},K=O.templateDir,H=ST.resolve(O.projectDir,"src/app");if(!AT.existsSync(H))AT.mkdirSync(H,{recursive:!0});let G=["index.js.njk"];if($.doc.features.app.html!==!1)G.push("index.html.njk");await mT({pattern:G,dir:ST.resolve(K,"src/app"),outDir:H,context:T})}import yT from"nunjucks";import N from"node:fs";import E from"node:path";import fT from"@flownet/lib-parse-imports-js";import kT from"@fnet/npm-pick-versions";import gT from"object-hash";import l from"node:fs";import UT from"node:path";async function I({projectDir:$,name:z,setProgress:O,count:W=1}){let T,H=gT(["npm-pick-versions",z,W]),G=UT.join($,".cache"),Y=UT.join(G,H+".json");if(l.existsSync(Y)){if(O)O(`Picking npm version of ${z} from cache ...`);T=JSON.parse(l.readFileSync(Y,"utf8"))}else{if(O)O(`Picking npm version of ${z} ...`);T=await kT({name:z,count:W}),l.mkdirSync(G,{recursive:!0}),l.writeFileSync(Y,JSON.stringify(T),"utf8")}return T}async function a({atom:$,context:z,packageDependencies:O,packageDevDependencies:W,setProgress:T}){await T({message:"Creating package.json."}),O.filter((q)=>q.dev===!0).forEach((q)=>{if(!W.find((U)=>U.package===q.package))W.push(q);let Q=O.findIndex((U)=>U.package===q.package);O.splice(Q,1)});let H=O.find((q)=>q.package==="react"),G=O.find((q)=>q.package==="react-dom");if(H&&!G)O.push({package:"react-dom",version:H.version});else if(H&&G)G.version=H.version;if(H&&$.doc.features.react_version>=17){if(!O.find((q)=>q.package==="@emotion/react"))O.push({package:"@emotion/react",version:"^11"});if(!O.find((q)=>q.package==="@emotion/styled"))O.push({package:"@emotion/styled",version:"^11"})}let Y=[];if($.doc.features.app.enabled===!0)Y.push({file:E.resolve(z.projectDir,"src/app/index.js"),dev:$.doc.features.app.dev===!0});if($.doc.features.cli.enabled===!0)Y.push({file:E.resolve(z.projectDir,"src/cli/index.js"),dev:$.doc.features.cli.dev===!0});for await(let q of Y){let Q=q.file;if(!N.existsSync(Q))throw Error(`App file not found: ${Q}`);let L=(await fT({file:Q,recursive:!0,verbose:!1})).all;for await(let B of L){if(B.type!=="npm")continue;if(O.find((x)=>x.package===B.package))continue;if(W.find((x)=>x.package===B.package))continue;let xT=await I({name:B.package,projectDir:z.projectDir,setProgress:T});(q.dev===!0?W:O).push({package:B.package,subpath:B.subpath,version:xT.minorRange,type:"npm"})}}for await(let q of O){if(q.version!==void 0)continue;let Q=await I({name:q.package,projectDir:z.projectDir,setProgress:T});q.version=Q.minorRange}for await(let q of W){if(q.version!==void 0)continue;let Q=await I({name:q.package,projectDir:z.projectDir,setProgress:T});q.version=Q.minorRange}let M={atom:$,packageDependencies:O,packageDevDependencies:W},A=z.templateDir,J=yT.compile(N.readFileSync(E.resolve(A,"package.json.njk"),"utf8"),yT.configure(A)).render(M),X=z.projectDir,y=E.resolve(X,"package.json");N.writeFileSync(y,J,"utf8");let Z=E.resolve(z.project.projectDir,"fnet");if(N.existsSync(Z)){let q=E.resolve(z.projectDir,"fnet");if(!N.existsSync(q))N.mkdirSync(q);let Q=N.readdirSync(Z);for(let U of Q){let L=E.resolve(Z,U);if(!N.lstatSync(L).isFile())continue;let B=E.resolve(q,U);N.copyFileSync(L,B)}}}import XT from"node:fs";import JT from"node:path";import iT from"@flownet/lib-render-templates-dir";async function e({atom:$,setProgress:z,context:O,packageDependencies:W}){if($.doc.features.cli.enabled!==!0)return;await z({message:"Creating cli."});let T={atom:$,packageDependencies:W},K=O.templateDir,H=JT.resolve(O.projectDir,"src/cli");if(!XT.existsSync(H))XT.mkdirSync(H,{recursive:!0});await iT({pattern:["index.js.njk"],dir:JT.resolve(K,"src/cli"),outDir:H,context:T})}import TT from"node:fs";import $T from"node:path";import VT from"nunjucks";import oT from"@flownet/lib-parse-imports-js";async function OT({atom:$,setProgress:z,context:O,packageDependencies:W}){await z({message:"Creating rollup file."});let T={atom:$,packageDependencies:W},K=$T.resolve(O.projectDir,"src","default/index.js");if(!TT.existsSync(K))throw Error(`Entry file not found: ${K}`);let G=(await oT({file:K,recursive:!0})).all.filter((Z)=>Z.type==="node").map((Z)=>Z.path),Y=$.doc.features.rollup_output,M=Object.keys(Y);for(let Z=0;Z<M.length;Z++){let q=M[Z],Q=Y[q];if(Q.browser===!0){if(G.length>0){Q.globals_enabled=!0,Q.globals=Q.globals||[],Q.globals=Q.globals.concat(G.map((U)=>{return{key:U,value:U}})),Q.alias_enabled=!0,Q.alias=Q.alias||{},Q.alias.entries=Q.alias.entries||{};for(let U=0;U<G.length;U++){let L=G[U];Q.alias.entries[L]=`node:${L}`,Q.alias.entries[`node:${L}`]=L}Q.external_enabled=!0,Q.external=Q.external||[],Q.external=Q.external.concat(G)}}}let A=O.templateDir,J=VT.compile(TT.readFileSync($T.resolve(A,"rollup.config.mjs.njk"),"utf8"),VT.configure(A)).render(T),X=O.projectDir,y=$T.resolve(X,"rollup.config.mjs");TT.writeFileSync(y,J,"utf8")}import zT from"node:fs";import bT from"node:path";import RT from"nunjucks";async function WT({atom:$,setProgress:z,context:O,packageDependencies:W}){await z({message:"Creating build.js file."});let T={atom:$,packageDependencies:W},K=O.templateDir,G=RT.compile(zT.readFileSync(bT.resolve(K,"build.js.njk"),"utf8"),RT.configure(K)).render(T),Y=O.projectDir,M=bT.resolve(Y,"build.js");zT.writeFileSync(M,G,"utf8"),zT.chmodSync(M,"755")}import KT from"node:fs";import qT from"node:path";import uT from"nunjucks";import dT from"ajv/dist/2020.js";import DT from"ajv/dist/standalone/index.js";import cT from"ajv-formats";async function GT({atom:$,setProgress:z,context:O,njEnv:W}){if($.doc.features.cli.enabled!==!0)return;await z({message:"Creating input args."});let T={},K=[];if($.doc.input)T=$.doc.input;else T={type:"object",properties:{},required:[]};if($.doc.features.cli.fargs&&$.doc.features.cli.fargs?.enabled!==!1){let Q=$.doc.features.cli.fargs,U={type:"string",description:"Config name to load args",hidden:!1},L={type:"array",description:"Tags to filter the config",hidden:!1};if(Reflect.has(Q,"default"))U.default=Q.default}let G={imports:K,atom:$},Y=O.templateDir,A=uT.compile(KT.readFileSync(qT.resolve(Y,"src/default/input.args.js.njk"),"utf8"),W).render(G),V=O.projectDir,J=qT.resolve(V,"src/default/input.args.js");KT.writeFileSync(J,A,"utf8");let X=new dT({allErrors:!0,useDefaults:!0,formats:{},strict:!1,code:{esm:!0,lines:!0,optimize:!1,source:!0}});cT(X);let y=X.compile(T),q=DT(X,y)+`
2
2
  export { schema31 as schema };`;KT.writeFileSync(qT.resolve(V,"src/default/validate_input.js"),q,"utf8")}import LT from"node:fs";import NT from"node:path";import BT from"nunjucks";async function QT({atom:$,setProgress:z,context:O,packageDependencies:W}){await z({message:"Creating tsconfig.json."});let T={atom:$,packageDependencies:W},K=O.templateDir,G=BT.compile(LT.readFileSync(NT.resolve(K,"tsconfig.json.njk"),"utf8"),BT.configure(K)).render(T),Y=O.projectDir,M=NT.resolve(Y,"tsconfig.json");LT.writeFileSync(M,G,"utf8")}import rT from"node:path";import ET from"@fnet/shelljs";async function YT({setProgress:$,context:z}){let O=z.projectDir;await $({message:"Prettifiying source files."});let W=rT.join("src","**","*");if(j("bun")){let T=await ET(`prettier --write ${W} *.{js,cjs,mjs,json,yaml,html} --no-error-on-unmatched-pattern`,{cwd:O});if(T.code!==0)throw Error(T.stderr)}else{let T=await ET(`prettier --write ${W} *.{js,cjs,mjs,json,yaml,html} --no-error-on-unmatched-pattern`,{cwd:O});if(T.code!==0)throw Error(T.stderr)}}import nT from"@fnet/shelljs";async function ZT({atom:$,setProgress:z,context:O}){if(!$.doc.features.dts_enabled)return;let W=O.projectDir;if(await z({message:"Creating .d.ts"}),(await nT("tsc",{cwd:W})).code!==0)throw Error("Couldnt create .d.ts files.")}import IT from"@fnet/shelljs";async function HT({setProgress:$,atom:z,context:O}){let W=O.projectDir;if(await $({message:"Installing npm packages."}),j("bun")){if((await IT(`bun install ${z.doc.features.npm_install_flags}`,{cwd:W})).code!==0)throw Error("Couldnt install npm packages.")}else if((await IT(`npm install ${z.doc.features.npm_install_flags}`,{cwd:W})).code!==0)throw Error("Couldnt install npm packages.")}import _T from"node:fs";import pT from"node:path";import{spawn as sT}from"node:child_process";async function FT($){let{projectDir:z,scriptName:O,args:W=[],env:T=process.env,shell:K=!0,detached:H=!0,onSpawn:G}=$;if(!z||!O)throw Error("projectDir and scriptName are required");let Y=pT.resolve(z,"package.json");if(!_T.existsSync(Y))throw Error(`package.json not found at ${Y}`);let M=JSON.parse(_T.readFileSync(Y,"utf8")),A=M.scripts?.[O];if(!A){let X=Object.keys(M.scripts||{}).join(", ");throw Error(`Script '${O}' not found. Available: ${X}`)}let V=W.length>0?`${A} ${W.join(" ")}`:A,J=sT(V,[],{cwd:z,stdio:"inherit",shell:K,detached:H,env:{...T}});if(G)G(J);return new Promise((X,y)=>{J.on("error",(Z)=>{y(Error(`Failed to start '${O}': ${Z.message}`))}),J.on("close",(Z)=>{X({subprocess:J,exitCode:Z})})})}import tT from"node:path";async function MT({setProgress:$,context:z}){let O=z.projectDir;await $({message:"Building main project."});let W=z.dev?"build:dev":"build",T={...process.env},K=tT.join(O,"node_modules");T.NODE_PATH=K,T.NODE_PRESERVE_SYMLINKS=1,await FT({projectDir:O,scriptName:W,shell:!0,detached:!0,env:T})}class lT extends CT{async initRuntime(){if(await n(this.apiContext),this.apiContext.context.project.runtime.type==="bun")await s(this.apiContext);else await p(this.apiContext);await this.initLibraryDir(),await this.initNunjucks(),await this.initLibs()}async initLibs(){this.setProgress({message:"Initializing external libs."});let $=[{name:this.atom.doc.name,type:"atom",parent_id:this.atom.parent_id}];this.libs=$,await this.initAtomLibsAndDeps({libs:$,packageDependencies:this.apiContext.packageDependencies})}async initAtomLibsAndDeps({libs:$,packageDependencies:z}){let O=$.filter((W)=>W.type==="atom");for(let W=0;W<O.length;W++){let T=O[W],K=await this.findAtomLibrary({url:T.name});T.atom=K,K.doc.dependencies?.filter((G)=>typeof G.repo>"u"||G.repo==="npm")?.forEach((G)=>{let Y=z.find((M)=>M.package===G.package);if(Y){if(typeof G.path==="string"){if(!(Y.path||[]).some((M)=>M===G.path))Y.path=Y.path||[],Y.path.push(G.path)}else if(Array.isArray(G.path))G.path.forEach((M)=>{if(!(Y.path||[]).some((A)=>A===M))Y.path=Y.path||[],Y.path.push(M)})}else z.push(G)})}z.sort((W,T)=>W.package?.localeCompare(T.package))}async findAtomLibrary({url:$}){let z=T0({url:$});if(!z)throw Error(`Invalid package name: ${$}`);if(!z.protocol)z.protocol=this.context.protocol;if(z.protocol==="ac:"){let O=z.pathname.split("/");if(O.length===1)return await this.apiContext.Atom.first({where:{name:$,parent_id:this.atomConfig.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(O.length===2){let W=await this.apiContext.Atom.first({where:{name:O[0],parent_id:this.atomConfig.env.ATOM_LIBRARIES_ID,type:"folder"}});return await this.apiContext.Atom.first({where:{name:O[1],parent_id:W.id,type:"workflow.lib"}})}}else if(z.protocol==="src:"){let O=this.atom;O.protocol="src:",O.doc.dependencies=O.doc.dependencies||[],O.name=O.doc.name;let W=b.resolve(this.context.projectSrcDir,"index.js"),T=await eT({file:W,recursive:!0}),K=O.doc.dependencies,H=T.all;for await(let G of H){if(G.type!=="npm")continue;if(K.find((M)=>M.package===G.package))continue;let Y=await I({name:G.package,projectDir:this.context.projectDir,setProgress:this.apiContext.setProgress});K.push({package:G.package,subpath:G.subpath,version:Y.minorRange,type:"npm"})}return O}}async createAtomLibFiles({libs:$}){await this.setProgress({message:"Creating external lib files."}),this.atom.typesDir="./types";let z=$.filter((O)=>O.type==="atom");for(let O=0;O<z.length;O++){let T=z[O].atom,K=this.context.projectDir;if(T.protocol==="src:"){let H=b.resolve(this.context.projectSrcDir,`${T.fileName||T.name}.js`),G=b.relative(b.join(this.context.projectDir,"src","default"),H);if(!C.existsSync(H)){C.mkdirSync(b.dirname(H),{recursive:!0});let Y=`export default async (input)=>{
3
3
  `;Y+="}",C.writeFileSync(H,Y,"utf8")}T.relativePath=G.split(b.sep).join("/"),this.atom.typesDir=`./types/${b.basename(K)}/src`}else{let H=b.join(K,"src","libs",`${T.id}.js`),G=T.doc.contents?.find((Y)=>Y.format==="esm")||T.doc;C.writeFileSync(H,G.content,"utf8")}}}async createEngine(){await this.setProgress({message:"Creating engine file."});let z={libs:this.libs.filter((G)=>G.type==="atom"),libraryAtom:this.atom,atom:this.atom},O=this.context.templateDir,T=aT.compile(C.readFileSync(b.resolve(O,b.join("src","default","engine.js.njk")),"utf8"),this.apiContext.njEnv).render(z),K=this.context.projectDir,H=b.resolve(K,b.join("src","default","index.js"));C.writeFileSync(H,T,"utf8")}async build(){try{if(this.fileMode){let $=this.apiContext.context.project;if(await this.createAtomLibFiles({libs:this.libs}),await this.createEngine(),await this.createProjectYaml(),await hT(this.apiContext),await QT(this.apiContext),await jT(this.apiContext),await GT(this.apiContext),await e(this.apiContext),await t(this.apiContext),$.runtime.type==="bun")await WT(this.apiContext);else await OT(this.apiContext);if(await a(this.apiContext),await YT(this.apiContext),await ZT(this.apiContext),this.buildMode){if(await HT(this.apiContext),await MT(this.apiContext),this.deployMode)await this.deploy()}}await this._cache_set(this.buildKey,{status:"COMPLETED"})}catch($){throw await this._cache_set(this.buildKey,{status:"FAILED",message:$.message||$}),console.log($),$}}}var B1=lT;export{B1 as default};
@@ -0,0 +1 @@
1
+ import{b as a,c as b,d as c,e as d}from"./index.vyehyfst.js";export{c as getStatusColor,d as default,b as createTableWithData,a as createTable};
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
- import{a as V,b as A,c as o}from"./index.q01yvaz0.js";import rz from"yargs";import{hideBin as sz}from"yargs/helpers";import l from"chalk";import T from"chalk";import Zz from"@fnet/object-from-schema";import _z from"@fnet/prompt";import H from"node:fs";import P from"node:path";import zz from"node:os";import S from"chalk";import Jz from"yaml";import Bz from"@fnet/service";import q from"node:fs";import $ from"node:path";import F from"node:os";import B from"chalk";function n(){return $.join(F.homedir(),".fnet","bin")}function f(){return $.join(F.homedir(),".fnet","metadata")}function c(){return $.join(f(),"binaries.json")}function Lz(z){return(process.env.PATH||"").split($.delimiter).includes(z)}function m(){try{if(process.platform==="win32"){if(process.env.PSModulePath&&process.env.PSModulePath.includes("PowerShell"))return"powershell-core";if(process.env.PSModulePath)return"powershell";return"cmd"}let z=process.env.SHELL||"";if(z.includes("bash"))return"bash";if(z.includes("zsh"))return"zsh";if(z.includes("fish"))return"fish";if(z.includes("ksh"))return"ksh";if(z.includes("csh")||z.includes("tcsh"))return"csh";if(q.existsSync($.join(F.homedir(),".bashrc")))return"bash";if(q.existsSync($.join(F.homedir(),".zshrc")))return"zsh";if(q.existsSync($.join(F.homedir(),".config","fish","config.fish")))return"fish";return"unknown"}catch(z){return"unknown"}}function r(z){let J=F.homedir(),Q=[];switch(z){case"bash":Q.push({name:".bashrc",path:$.join(J,".bashrc")}),Q.push({name:".bash_profile",path:$.join(J,".bash_profile")}),Q.push({name:".profile",path:$.join(J,".profile")});break;case"zsh":Q.push({name:".zshrc",path:$.join(J,".zshrc")}),Q.push({name:".zprofile",path:$.join(J,".zprofile")});break;case"fish":Q.push({name:"config.fish",path:$.join(J,".config","fish","config.fish")});break;case"ksh":Q.push({name:".kshrc",path:$.join(J,".kshrc")}),Q.push({name:".profile",path:$.join(J,".profile")});break;case"csh":Q.push({name:".cshrc",path:$.join(J,".cshrc")}),Q.push({name:".tcshrc",path:$.join(J,".tcshrc")});break;case"powershell":Q.push({name:"Microsoft.PowerShell_profile.ps1",path:$.join(J,"Documents","WindowsPowerShell","Microsoft.PowerShell_profile.ps1")}),Q.push({name:"profile.ps1",path:$.join(J,"Documents","WindowsPowerShell","profile.ps1")});break;case"powershell-core":Q.push({name:"Microsoft.PowerShell_profile.ps1",path:$.join(J,"Documents","PowerShell","Microsoft.PowerShell_profile.ps1")}),Q.push({name:"profile.ps1",path:$.join(J,"Documents","PowerShell","profile.ps1")});break;case"cmd":Q.push({name:"fnet-path.bat",path:$.join(J,"fnet-path.bat")});break;default:break}return Q}function Oz(){let z=m(),J=r(z);for(let Q of J)if(q.existsSync(Q.path))return Q.path;return J.length>0?J[0].path:null}async function wz(){let z=n(),J=f(),Q=c();if(!q.existsSync(z))q.mkdirSync(z,{recursive:!0});if(!q.existsSync(J))q.mkdirSync(J,{recursive:!0});if(!q.existsSync(Q))q.writeFileSync(Q,JSON.stringify({binaries:{},lastUpdated:new Date().toISOString()},null,2))}function s(z,J){switch(z){case"bash":case"zsh":case"ksh":return`export PATH="${J}:$PATH"`;case"fish":return`set -gx PATH ${J} $PATH`;case"csh":return`setenv PATH ${J}:$PATH`;case"powershell":case"powershell-core":return`$env:PATH = "${J};" + $env:PATH`;case"cmd":return`@echo off
2
+ import{a as V,e as v}from"./index.vyehyfst.js";import mz from"yargs";import{hideBin as rz}from"yargs/helpers";import o from"chalk";import T from"chalk";import Yz from"@fnet/object-from-schema";import Zz from"@fnet/prompt";import H from"node:fs";import D from"node:path";import e from"node:os";import b from"chalk";import zz from"yaml";import Az from"@fnet/service";import q from"node:fs";import $ from"node:path";import x from"node:os";import A from"chalk";function l(){return $.join(x.homedir(),".fnet","bin")}function g(){return $.join(x.homedir(),".fnet","metadata")}function n(){return $.join(g(),"binaries.json")}function Iz(z){return(process.env.PATH||"").split($.delimiter).includes(z)}function c(){try{if(process.platform==="win32"){if(process.env.PSModulePath&&process.env.PSModulePath.includes("PowerShell"))return"powershell-core";if(process.env.PSModulePath)return"powershell";return"cmd"}let z=process.env.SHELL||"";if(z.includes("bash"))return"bash";if(z.includes("zsh"))return"zsh";if(z.includes("fish"))return"fish";if(z.includes("ksh"))return"ksh";if(z.includes("csh")||z.includes("tcsh"))return"csh";if(q.existsSync($.join(x.homedir(),".bashrc")))return"bash";if(q.existsSync($.join(x.homedir(),".zshrc")))return"zsh";if(q.existsSync($.join(x.homedir(),".config","fish","config.fish")))return"fish";return"unknown"}catch(z){return"unknown"}}function m(z){let J=x.homedir(),Q=[];switch(z){case"bash":Q.push({name:".bashrc",path:$.join(J,".bashrc")}),Q.push({name:".bash_profile",path:$.join(J,".bash_profile")}),Q.push({name:".profile",path:$.join(J,".profile")});break;case"zsh":Q.push({name:".zshrc",path:$.join(J,".zshrc")}),Q.push({name:".zprofile",path:$.join(J,".zprofile")});break;case"fish":Q.push({name:"config.fish",path:$.join(J,".config","fish","config.fish")});break;case"ksh":Q.push({name:".kshrc",path:$.join(J,".kshrc")}),Q.push({name:".profile",path:$.join(J,".profile")});break;case"csh":Q.push({name:".cshrc",path:$.join(J,".cshrc")}),Q.push({name:".tcshrc",path:$.join(J,".tcshrc")});break;case"powershell":Q.push({name:"Microsoft.PowerShell_profile.ps1",path:$.join(J,"Documents","WindowsPowerShell","Microsoft.PowerShell_profile.ps1")}),Q.push({name:"profile.ps1",path:$.join(J,"Documents","WindowsPowerShell","profile.ps1")});break;case"powershell-core":Q.push({name:"Microsoft.PowerShell_profile.ps1",path:$.join(J,"Documents","PowerShell","Microsoft.PowerShell_profile.ps1")}),Q.push({name:"profile.ps1",path:$.join(J,"Documents","PowerShell","profile.ps1")});break;case"cmd":Q.push({name:"fnet-path.bat",path:$.join(J,"fnet-path.bat")});break;default:break}return Q}function Lz(){let z=c(),J=m(z);for(let Q of J)if(q.existsSync(Q.path))return Q.path;return J.length>0?J[0].path:null}async function Oz(){let z=l(),J=g(),Q=n();if(!q.existsSync(z))q.mkdirSync(z,{recursive:!0});if(!q.existsSync(J))q.mkdirSync(J,{recursive:!0});if(!q.existsSync(Q))q.writeFileSync(Q,JSON.stringify({binaries:{},lastUpdated:new Date().toISOString()},null,2))}function r(z,J){switch(z){case"bash":case"zsh":case"ksh":return`export PATH="${J}:$PATH"`;case"fish":return`set -gx PATH ${J} $PATH`;case"csh":return`setenv PATH ${J}:$PATH`;case"powershell":case"powershell-core":return`$env:PATH = "${J};" + $env:PATH`;case"cmd":return`@echo off
3
3
  SETX PATH "%PATH%;${J}"
4
- echo Path updated successfully`;default:return`export PATH="${J}:$PATH"`}}async function Vz(z,J,Q,K={}){try{let{autoBackup:X=!0}=K,W=s(z,Q);if(z==="cmd")return q.writeFileSync(J,W),console.log(B.yellow(`Created batch file at ${J}`)),console.log(B.yellow("Run this file to add the bin directory to your PATH")),!0;if((z==="powershell"||z==="powershell-core")&&!q.existsSync($.dirname(J)))q.mkdirSync($.dirname(J),{recursive:!0});if(!q.existsSync(J)){let R=z==="fish"?`# Fish shell configuration
4
+ echo Path updated successfully`;default:return`export PATH="${J}:$PATH"`}}async function wz(z,J,Q,K={}){try{let{autoBackup:X=!0}=K,W=r(z,Q);if(z==="cmd")return q.writeFileSync(J,W),console.log(A.yellow(`Created batch file at ${J}`)),console.log(A.yellow("Run this file to add the bin directory to your PATH")),!0;if((z==="powershell"||z==="powershell-core")&&!q.existsSync($.dirname(J)))q.mkdirSync($.dirname(J),{recursive:!0});if(!q.existsSync(J)){let R=z==="fish"?`# Fish shell configuration
5
5
 
6
6
  `:z==="powershell"||z==="powershell-core"?`# PowerShell profile
7
7
 
8
8
  `:`# Shell configuration
9
9
 
10
- `;q.writeFileSync(J,R),console.log(B.green(`Created config file at ${J}`))}let Z=q.readFileSync(J,"utf8");if(Z.includes(Q))return!0;if(X&&q.existsSync(J)){let R=i(),w=$.basename(J);if(t(J,$.join(R,"configs"),w))a(R,{type:"auto",command:"addBinToPath",message:`Automatic backup before modifying ${w}`,files:[J]}),e(R),console.log(B.green(`✓ Backed up ${w} to ${R}`))}let _=`${Z.trim()}
10
+ `;q.writeFileSync(J,R),console.log(A.green(`Created config file at ${J}`))}let Z=q.readFileSync(J,"utf8");if(Z.includes(Q))return!0;if(X&&q.existsSync(J)){let R=s(),w=$.basename(J);if(i(J,$.join(R,"configs"),w))t(R,{type:"auto",command:"addBinToPath",message:`Automatic backup before modifying ${w}`,files:[J]}),a(R),console.log(A.green(`✓ Backed up ${w} to ${R}`))}let _=`${Z.trim()}
11
11
 
12
12
  # Added by @fnet/cli
13
13
  ${W}
14
- `;if(q.writeFileSync(J,_),z==="powershell"||z==="powershell-core")console.log(B.yellow("You may need to set the PowerShell execution policy to run scripts:")),console.log(B.green("Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned"));return!0}catch(X){return console.error(B.red(`Failed to add bin directory to PATH: ${X.message}`)),!1}}function u(){return $.join(F.homedir(),".fnet","backups")}function i(){let z=new Date().toISOString().replace(/:/g,"-").replace(/\..+/,""),J=$.join(u(),z);if(!q.existsSync(J))q.mkdirSync(J,{recursive:!0});return J}function t(z,J,Q=null){try{if(!q.existsSync(z))return!1;let K=Q||$.basename(z),X=$.join(J,K),W=$.dirname(X);if(!q.existsSync(W))q.mkdirSync(W,{recursive:!0});return q.copyFileSync(z,X),!0}catch(K){return console.error(B.red(`Failed to backup file ${z}: ${K.message}`)),!1}}function a(z,J={}){let Q={timestamp:new Date().toISOString(),type:J.type||"manual",message:J.message||"",command:J.command||"",files:J.files||[],...J},K=$.join(z,"metadata.json");q.writeFileSync(K,JSON.stringify(Q,null,2))}function Az(){let z=u();if(!q.existsSync(z))return[];let J=[],Q=q.readdirSync(z);for(let K of Q){let X=$.join(z,K),W=q.statSync(X);if(W.isDirectory()&&K!=="latest"){let Z=$.join(X,"metadata.json"),_={};if(q.existsSync(Z))try{_=JSON.parse(q.readFileSync(Z,"utf8"))}catch(R){}J.push({timestamp:K,path:X,created:W.mtime,..._})}}return J.sort((K,X)=>new Date(X.created)-new Date(K.created)),J}function e(z){let J=$.join(u(),"latest");try{if(q.existsSync(J))q.unlinkSync(J);if(process.platform==="win32")q.writeFileSync(J+".txt",z);else q.symlinkSync(z,J)}catch(Q){console.warn(B.yellow(`Could not create latest symlink: ${Q.message}`))}}var D={getBinDirectory:n,getMetadataDirectory:f,getMetadataFilePath:c,checkIfInPath:Lz,detectUserShell:m,getShellConfigPath:Oz,getAllShellConfigPaths:r,createBinDirectoryStructure:wz,getExportPathCommand:s,addBinToPath:Vz,getBackupDirectory:u,createBackupDirectory:i,backupFile:t,createBackupMetadata:a,listBackups:Az,updateLatestSymlink:e};function k(){return P.join(zz.homedir(),".fnet","services")}function h(){return P.join(zz.homedir(),".fnet","metadata")}function p(){return P.join(h(),"services.json")}async function Uz(){let z=k(),J=h(),Q=p();if(!H.existsSync(z))H.mkdirSync(z,{recursive:!0});if(!H.existsSync(J))H.mkdirSync(J,{recursive:!0});if(!H.existsSync(Q))H.writeFileSync(Q,JSON.stringify({services:{},lastUpdated:new Date().toISOString()},null,2))}function Kz(){let z=p();if(!H.existsSync(z))return{services:{},lastUpdated:new Date().toISOString()};try{return JSON.parse(H.readFileSync(z,"utf8"))}catch(J){return console.warn(S.yellow(`Failed to parse service metadata file: ${J.message}`)),{services:{},lastUpdated:new Date().toISOString()}}}function Qz(z){let J=p();z.lastUpdated=new Date().toISOString(),H.writeFileSync(J,JSON.stringify(z,null,2))}function N(z){return P.join(k(),`${z}.yaml`)}function xz(z){let J=N(z);return H.existsSync(J)}function Wz(z){let J=N(z);if(!H.existsSync(J))return null;try{let Q=H.readFileSync(J,"utf8");return Jz.parse(Q)}catch(Q){return console.warn(S.yellow(`Failed to parse service manifest file: ${Q.message}`)),null}}function Fz(z,J){let Q=N(z);try{let K=Jz.stringify(J);return H.writeFileSync(Q,K),!0}catch(K){return console.error(S.red(`Failed to save service manifest: ${K.message}`)),!1}}function Mz(z){let J=N(z);if(!H.existsSync(J))return!1;try{return H.unlinkSync(J),!0}catch(Q){return console.error(S.red(`Failed to delete service manifest: ${Q.message}`)),!1}}function Cz(){let z=k();if(!H.existsSync(z))return[];try{return H.readdirSync(z).filter((J)=>J.endsWith(".yaml")).map((J)=>J.replace(".yaml",""))}catch(J){return console.error(S.red(`Failed to list service definitions: ${J.message}`)),[]}}function Xz(z){let J=[];if(!z.name)J.push("Service name is required");if(!z.binary)J.push("Binary name is required");if(z.binary){let Q=D.getBinDirectory(),K=P.join(Q,z.binary);if(!H.existsSync(K))J.push(`Binary '${z.binary}' not found in bin directory`)}return{valid:J.length===0,errors:J}}async function jz(z,J={}){let Q=Wz(z);if(!Q)throw Error(`Service manifest '${z}' not found`);let K=Xz(Q);if(!K.valid)throw Error(`Invalid service manifest: ${K.errors.join(", ")}`);let X=D.getBinDirectory(),W=P.join(X,Q.binary);try{await Bz({action:"register",name:Q.name,description:Q.description||`Service for ${Q.binary}`,command:[W,...Q.args||[]],env:Q.env||{},wdir:Q.workingDir,system:Q.system!==!1,autoStart:Q.autoStart===!0,restartOnFailure:Q.restartOnFailure!==!1,user:Q.user});let Z=Kz();return Z.services[Q.name]={manifest:z,binary:Q.binary,registered:new Date().toISOString(),status:"registered"},Qz(Z),{success:!0,name:Q.name,manifest:z}}catch(Z){throw Error(`Failed to register service: ${Z.message}`)}}var Y={getServicesDirectory:k,getServiceMetadataDirectory:h,getServiceMetadataFilePath:p,createServiceDirectoryStructure:Uz,loadServiceMetadata:Kz,saveServiceMetadata:Qz,getServiceManifestPath:N,servicManifestExists:xz,loadServiceManifest:Wz,saveServiceManifest:Fz,deleteServiceManifest:Mz,listServiceManifests:Cz,validateServiceManifest:Xz,registerService:jz};async function E(z){await Y.createServiceDirectoryStructure();let J=Y.getServicesDirectory(),Q=Y.getServiceMetadataDirectory(),K=Y.loadServiceMetadata();return{servicesDir:J,metadataDir:Q,metadata:K,args:z}}import d from"node:fs";function Dz(z=!0){let J=[];if(z)try{let Q=D.getBinDirectory(),K=D.getMetadataFilePath();if(d.existsSync(K)){let X=JSON.parse(d.readFileSync(K,"utf8"));J=Object.keys(X.binaries).map((W)=>({name:W,message:`${W} (${X.binaries[W].version||"unknown"})`}))}else if(d.existsSync(Q))J=d.readdirSync(Q).map((X)=>({name:X,message:X}))}catch(Q){console.warn(`Failed to get binary choices: ${Q.message}`)}return{type:"object",required:["name","binary"],properties:{name:{type:"string",description:"Service name","x-prompt":{type:"input",message:"Enter service name:"}},binary:{type:"string",description:"Binary name in the bin directory","x-prompt":{type:"select",message:"Select binary:",choices:J}},description:{type:"string",description:"Service description","x-prompt":{type:"input",message:"Enter service description:"}},args:{type:"array",items:{type:"string"},description:"Command line arguments","x-prompt":{type:"input",message:"Enter command line arguments (space-separated):",result:(Q)=>Q?Q.split(" "):[]}},env:{type:"object",additionalProperties:{type:"string"},description:"Environment variables","x-prompt":{type:"input",message:"Enter environment variables (KEY=VALUE format, one per line):",result:(Q)=>{if(!Q)return{};return Q.split(`
15
- `).filter((K)=>K.includes("=")).reduce((K,X)=>{let[W,...Z]=X.split("=");return K[W.trim()]=Z.join("=").trim(),K},{})}}},workingDir:{type:"string",description:"Working directory","x-prompt":{type:"input",message:"Enter working directory (optional):"}},autoStart:{type:"boolean",description:"Start on boot",default:!1,"x-prompt":{type:"confirm",message:"Start service on boot?",initial:!1}},restartOnFailure:{type:"boolean",description:"Restart on failure",default:!0,"x-prompt":{type:"confirm",message:"Restart service on failure?",initial:!0}},system:{type:"boolean",description:"System service",default:!0,"x-prompt":{type:"confirm",message:"Register as system service?",initial:!0}},user:{type:"string",description:"User to run the service as","x-prompt":{type:"input",message:"Enter user to run the service as (optional):"}},instances:{type:"integer",description:"Number of instances to run",default:1,minimum:1,"x-prompt":{type:"number",message:"Enter number of instances to run:",initial:1}},metadata:{type:"object",additionalProperties:!0,description:"Custom metadata"}}}}var v={getServiceManifestSchema:Dz};import g from"chalk";import Yz from"@fnet/prompt";async function Pz(z){let{items:J,message:Q,nameField:K="name",valueField:X="name",initialValue:W=null,allowAbort:Z=!0}=z;if(!J||J.length===0)return console.log(g.yellow("No items available for selection.")),null;if(J.length===1&&!Z){let G=J[0],b=typeof G==="string"?G:G[X];return console.log(g.blue(`Only one option available: ${typeof G==="string"?G:G[K]}`)),b}let _=J.map((G)=>{if(typeof G==="string")return{name:G,value:G,message:G};else return{name:G[X],value:G[X],message:G[K]||G[X]}});if(Z)_.push({name:"cancel",value:null,message:g.yellow("Cancel")});let R=null;if(W){let G=_.findIndex((b)=>b.name===W);if(G!==-1)R=G}let w="selectedItem",{[w]:j}=await Yz({type:"select",name:w,message:Q,choices:_,initial:R});if(j==="cancel")return null;return j}async function bz(z){let{items:J,message:Q,nameField:K="name",valueField:X="name",initialValues:W=[],allowAbort:Z=!0}=z;if(!J||J.length===0)return console.log(g.yellow("No items available for selection.")),null;let _=J.map((G)=>{if(typeof G==="string")return{name:G,value:G,message:G};else return{name:G[X],value:G[X],message:G[K]||G[X]}}),R=[];if(W&&W.length>0)R=_.map((G,b)=>W.includes(G.name)?b:-1).filter((G)=>G!==-1);let w="selectedItems",j=await Yz({type:"multiselect",name:w,message:Q,choices:_,initial:R,hint:"(Use space to select, enter to confirm)",validate:(G)=>{if(G.length===0&&!Z)return"Please select at least one item";return!0}});if(Z&&j[w].length===0)return null;return j[w]}var L={promptForSelection:Pz,promptForMultipleSelection:bz};var Sz={command:"manifest <subcommand>",describe:"Manage service manifests",builder:(z)=>{return z.command({command:"create",describe:"Create a new service manifest",builder:(J)=>{return J.option("name",{describe:"Service manifest name",type:"string"}).option("output",{describe:"Output file path",type:"string",alias:"o"})},handler:Nz}).command({command:"list",describe:"List service manifests",builder:(J)=>{return J.option("format",{describe:"Output format",type:"string",choices:["json","text","table"],default:"table"})},handler:yz}).command({command:"show [n]",describe:"Show service manifest details",builder:(J)=>{return J.positional("name",{describe:"Service manifest name",type:"string",demandOption:!1}).option("format",{describe:"Output format",type:"string",choices:["json","yaml"],default:"yaml"})},handler:uz}).command({command:"edit [n]",describe:"Edit a service manifest",builder:(J)=>{return J.positional("name",{describe:"Service manifest name",type:"string",demandOption:!1})},handler:kz}).command({command:"delete [n]",describe:"Delete a service manifest",builder:(J)=>{return J.positional("name",{describe:"Service manifest name",type:"string",demandOption:!1}).option("force",{describe:"Force deletion without confirmation",type:"boolean",default:!1,alias:"f"})},handler:pz}).command({command:"validate [n]",describe:"Validate a service manifest",builder:(J)=>{return J.positional("name",{describe:"Service manifest name",type:"string",demandOption:!1})},handler:dz}).demandCommand(1,"You need to specify a subcommand")},handler:()=>{}};async function Nz(z){try{let J=await E(z),Q=v.getServiceManifestSchema(),K=await Zz({schema:Q,format:"yaml"});console.log("Result from fnetObjectFromSchema:",K);let X;if(typeof K==="string")try{X=(await import("yaml")).default.parse(K)}catch(_){console.warn(T.yellow(`Failed to parse YAML: ${_.message}`)),X={name:"service-"+Date.now()}}else if(K&&typeof K==="object")X=K.data||K;else X={name:"service-"+Date.now()};console.log("Generated manifest:",X);let W=z.name||(X&&X.name?X.name:"service-"+Date.now());if(Y.servicManifestExists(W)&&!z.force){let{confirmOverwrite:_}=await _z({type:"confirm",name:"confirmOverwrite",message:`Service manifest '${W}' already exists. Overwrite?`,initial:!1});if(!_){console.log(T.yellow("Operation cancelled."));return}}if(Y.saveServiceManifest(W,X))console.log(T.green(`Service manifest '${W}' created successfully.`)),console.log(T.blue(`Location: ${Y.getServiceManifestPath(W)}`));else console.error(T.red(`Failed to create service manifest '${W}'.`))}catch(J){console.error(T.red(`Error: ${J.message}`)),process.exit(1)}}async function yz(z){try{let J=await E(z),Q=Y.listServiceManifests();if(Q.length===0){console.log(T.yellow("No service manifests found."));return}if(z.format==="json")console.log(JSON.stringify(Q,null,2));else if(z.format==="text")Q.forEach((K)=>console.log(K));else{console.log(T.bold(`
16
- Service Definitions:`));let K=(await import("./index.q01yvaz0.js")).default,X=["NAME","BINARY","DESCRIPTION"],W=K.createTable(X,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}});for(let Z of Q){let _=Y.loadServiceManifest(Z);if(_)W.push([T.white(Z),T.cyan(_.binary||"undefined"),_.description||""])}console.log(W.toString()),console.log(`Total: ${Q.length} manifest(s)`)}}catch(J){console.error(T.red(`Error: ${J.message}`)),process.exit(1)}}async function uz(z){try{let J=await E(z);if(!z.name){let K=Y.listServiceManifests();if(K.length===0){console.log(T.yellow("No service manifests found."));return}let X=await L.promptForSelection({items:K,message:"Select a service manifest to show:",allowAbort:!0});if(X===null){console.log(T.yellow("Operation cancelled."));return}z.name=X}let Q=Y.loadServiceManifest(z.name);if(!Q)console.error(T.red(`Service manifest '${z.name}' not found.`)),process.exit(1);if(z.format==="json")console.log(JSON.stringify(Q,null,2));else{let K=(await import("yaml")).default;console.log(K.stringify(Q))}}catch(J){console.error(T.red(`Error: ${J.message}`)),process.exit(1)}}async function kz(z){try{let J=await E(z);if(!z.name){let _=Y.listServiceManifests();if(_.length===0){console.log(T.yellow("No service manifests found."));return}let R=await L.promptForSelection({items:_,message:"Select a service manifest to edit:",allowAbort:!0});if(R===null){console.log(T.yellow("Operation cancelled."));return}z.name=R}let Q=Y.loadServiceManifest(z.name);if(!Q)console.error(T.red(`Service manifest '${z.name}' not found.`)),process.exit(1);let K=v.getServiceManifestSchema(),W=(await Zz({schema:K,ref:Q,format:"yaml"})).data;if(Y.saveServiceManifest(z.name,W))console.log(T.green(`Service manifest '${z.name}' updated successfully.`));else console.error(T.red(`Failed to update service manifest '${z.name}'.`))}catch(J){console.error(T.red(`Error: ${J.message}`)),process.exit(1)}}async function pz(z){try{let J=await E(z);if(!z.name){let K=Y.listServiceManifests();if(K.length===0){console.log(T.yellow("No service manifests found."));return}let X=await L.promptForSelection({items:K,message:"Select a service manifest to delete:",allowAbort:!0});if(X===null){console.log(T.yellow("Operation cancelled."));return}z.name=X}if(!Y.servicManifestExists(z.name))console.error(T.red(`Service manifest '${z.name}' not found.`)),process.exit(1);if(!z.force){let{confirmDelete:K}=await _z({type:"confirm",name:"confirmDelete",message:`Are you sure you want to delete service manifest '${z.name}'?`,initial:!1});if(!K){console.log(T.yellow("Operation cancelled."));return}}if(Y.deleteServiceManifest(z.name))console.log(T.green(`Service manifest '${z.name}' deleted successfully.`));else console.error(T.red(`Failed to delete service manifest '${z.name}'.`))}catch(J){console.error(T.red(`Error: ${J.message}`)),process.exit(1)}}async function dz(z){try{let J=await E(z);if(!z.name){let X=Y.listServiceManifests();if(X.length===0){console.log(T.yellow("No service manifests found."));return}let W=await L.promptForSelection({items:X,message:"Select a service manifest to validate:",allowAbort:!0});if(W===null){console.log(T.yellow("Operation cancelled."));return}z.name=W}let Q=Y.loadServiceManifest(z.name);if(!Q)console.error(T.red(`Service manifest '${z.name}' not found.`)),process.exit(1);let K=Y.validateServiceManifest(Q);if(K.valid)console.log(T.green(`Service manifest '${z.name}' is valid.`));else console.error(T.red(`Service manifest '${z.name}' is invalid:`)),K.errors.forEach((X)=>{console.error(T.red(`- ${X}`))}),process.exit(1)}catch(J){console.error(T.red(`Error: ${J.message}`)),process.exit(1)}}var $z=Sz;import U from"chalk";var gz={command:"register",describe:"Register a service manifest as a system service",builder:(z)=>{return z.option("manifest",{describe:"Service manifest name",type:"string",demandOption:!1,alias:"d"}).option("start",{describe:"Start the service after registration",type:"boolean",default:!1})},handler:async(z)=>{try{let J=await E(z),Q=z.manifest;if(!Q){let X=Y.listServiceManifests();if(X.length===0)console.log(U.yellow('No service manifests found. Create one first using "fservice manifest create".')),process.exit(1);if(Q=await L.promptForSelection({items:X,message:"Select a service manifest to register:",allowAbort:!0}),!Q){console.log(U.yellow("Operation cancelled."));return}}if(!Y.servicManifestExists(Q))console.error(U.red(`Service manifest '${Q}' not found.`)),process.exit(1);console.log(U.blue(`Registering service from manifest '${Q}'...`));let K=await Y.registerService(Q);if(console.log(U.green(`Service '${K.name}' registered successfully.`)),z.start){console.log(U.blue(`Starting service '${K.name}'...`));let X=(await import("@fnet/service")).default;try{await X({action:"start",name:K.name}),console.log(U.green(`Service '${K.name}' started successfully.`));let W=Y.loadServiceMetadata();if(W.services[K.name])W.services[K.name].status="running",W.services[K.name].lastStarted=new Date().toISOString(),Y.saveServiceMetadata(W)}catch(W){console.error(U.red(`Failed to start service: ${W.message}`))}}}catch(J){console.error(U.red(`Error: ${J.message}`)),process.exit(1)}}},Tz=gz;import O from"chalk";import fz from"@fnet/prompt";var hz={command:"unregister",describe:"Unregister a service from the system",builder:(z)=>{return z.option("name",{describe:"Service name",type:"string",demandOption:!1,alias:"n"}).option("keep-manifest",{describe:"Keep the service manifest",type:"boolean",default:!0}).option("force",{describe:"Force unregistration without confirmation",type:"boolean",default:!1,alias:"f"})},handler:async(z)=>{try{let J=await E(z),Q=Y.loadServiceMetadata(),K=z.name;if(!K){let W=Object.keys(Q.services);if(W.length===0)console.log(O.yellow("No registered services found.")),process.exit(1);if(K=await L.promptForSelection({items:W,message:"Select a service to unregister:",allowAbort:!0}),!K){console.log(O.yellow("Operation cancelled."));return}}if(!Q.services[K])console.error(O.red(`Service '${K}' not found in metadata.`)),process.exit(1);if(!z.force){let{confirmUnregister:W}=await fz({type:"confirm",name:"confirmUnregister",message:`Are you sure you want to unregister service '${K}'?`,initial:!1});if(!W){console.log(O.yellow("Operation cancelled."));return}}console.log(O.blue(`Unregistering service '${K}'...`));let X=(await import("@fnet/service")).default;try{let W=Q.services[K].manifest,Z=Y.loadServiceManifest(W);if(!Z)throw Error(`Service manifest '${W}' not found`);let _=Z.system!==!1;try{await X({action:"stop",name:K,system:_}),console.log(O.blue(`Service '${K}' stopped.`))}catch(R){console.warn(O.yellow(`Warning: Failed to stop service: ${R.message}`))}if(await X({action:"unregister",name:K,system:_}),console.log(O.green(`Service '${K}' unregistered successfully.`)),delete Q.services[K],Y.saveServiceMetadata(Q),!z.keepDefinition&&W){if(Y.servicManifestExists(W))if(Y.deleteServiceManifest(W))console.log(O.green(`Service manifest '${W}' deleted.`));else console.warn(O.yellow(`Warning: Failed to delete service manifest '${W}'.`))}}catch(W){console.error(O.red(`Failed to unregister service: ${W.message}`)),process.exit(1)}}catch(J){console.error(O.red(`Error: ${J.message}`)),process.exit(1)}}},qz=hz;import M from"chalk";var vz={command:"start",describe:"Start a registered service",builder:(z)=>{return z.option("name",{describe:"Service name",type:"string",demandOption:!1,alias:"n"})},handler:async(z)=>{try{let J=await E(z),Q=Y.loadServiceMetadata(),K=z.name;if(!K){let W=Object.keys(Q.services);if(W.length===0)console.log(M.yellow("No registered services found.")),process.exit(1);if(K=await L.promptForSelection({items:W,message:"Select a service to start:",allowAbort:!0}),!K){console.log(M.yellow("Operation cancelled."));return}}if(!Q.services[K])console.error(M.red(`Service '${K}' not found in metadata.`)),process.exit(1);console.log(M.blue(`Starting service '${K}'...`));let X=(await import("@fnet/service")).default;try{let W=Q.services[K].manifest,Z=Y.loadServiceManifest(W);if(!Z)throw Error(`Service manifest '${W}' not found`);await X({action:"start",name:K,system:Z.system!==!1}),console.log(M.green(`Service '${K}' started successfully.`)),Q.services[K].status="running",Q.services[K].lastStarted=new Date().toISOString(),Y.saveServiceMetadata(Q)}catch(W){console.error(M.red(`Failed to start service: ${W.message}`)),process.exit(1)}}catch(J){console.error(M.red(`Error: ${J.message}`)),process.exit(1)}}},Gz=vz;import C from"chalk";var oz={command:"stop",describe:"Stop a running service",builder:(z)=>{return z.option("name",{describe:"Service name",type:"string",demandOption:!1,alias:"n"})},handler:async(z)=>{try{let J=await E(z),Q=Y.loadServiceMetadata(),K=z.name;if(!K){let W=Object.keys(Q.services);if(W.length===0)console.log(C.yellow("No registered services found.")),process.exit(1);if(K=await L.promptForSelection({items:W,message:"Select a service to stop:",allowAbort:!0}),!K){console.log(C.yellow("Operation cancelled."));return}}if(!Q.services[K])console.error(C.red(`Service '${K}' not found in metadata.`)),process.exit(1);console.log(C.blue(`Stopping service '${K}'...`));let X=(await import("@fnet/service")).default;try{let W=Q.services[K].manifest,Z=Y.loadServiceManifest(W);if(!Z)throw Error(`Service manifest '${W}' not found`);await X({action:"stop",name:K,system:Z.system!==!1}),console.log(C.green(`Service '${K}' stopped successfully.`)),Q.services[K].status="stopped",Q.services[K].lastStopped=new Date().toISOString(),Y.saveServiceMetadata(Q)}catch(W){console.error(C.red(`Failed to stop service: ${W.message}`)),process.exit(1)}}catch(J){console.error(C.red(`Error: ${J.message}`)),process.exit(1)}}},Ez=oz;import x from"chalk";var lz={command:"restart",describe:"Restart a service",builder:(z)=>{return z.option("name",{describe:"Service name",type:"string",demandOption:!1,alias:"n"})},handler:async(z)=>{try{let J=await E(z),Q=Y.loadServiceMetadata(),K=z.name;if(!K){let W=Object.keys(Q.services);if(W.length===0)console.log(x.yellow("No registered services found.")),process.exit(1);if(K=await L.promptForSelection({items:W,message:"Select a service to restart:",allowAbort:!0}),!K){console.log(x.yellow("Operation cancelled."));return}}if(!Q.services[K])console.error(x.red(`Service '${K}' not found in metadata.`)),process.exit(1);console.log(x.blue(`Restarting service '${K}'...`));let X=(await import("@fnet/service")).default;try{await X({action:"stop",name:K}),console.log(x.blue(`Service '${K}' stopped.`)),await X({action:"start",name:K}),console.log(x.green(`Service '${K}' restarted successfully.`)),Q.services[K].status="running",Q.services[K].lastRestarted=new Date().toISOString(),Y.saveServiceMetadata(Q)}catch(W){console.error(x.red(`Failed to restart service: ${W.message}`)),process.exit(1)}}catch(J){console.error(x.red(`Error: ${J.message}`)),process.exit(1)}}},Rz=lz;import I from"chalk";var nz={command:"status",describe:"Check the status of a service",builder:(z)=>{return z.option("name",{describe:"Service name",type:"string",demandOption:!1,alias:"n"}).option("format",{describe:"Output format",type:"string",choices:["json","text","table"],default:"table"})},handler:async(z)=>{try{let J=await E(z),Q=Y.loadServiceMetadata(),K=z.name;if(!K){let W=Object.keys(Q.services);if(W.length===0)console.log(I.yellow("No registered services found.")),process.exit(1);if(K=await L.promptForSelection({items:W,message:"Select a service to check status:",allowAbort:!0}),!K){console.log(I.yellow("Operation cancelled."));return}}if(!Q.services[K])console.error(I.red(`Service '${K}' not found in metadata.`)),process.exit(1);console.log(I.blue(`Checking status of service '${K}'...`));let X=(await import("@fnet/service")).default;try{let W=Q.services[K].manifest,Z=Y.loadServiceManifest(W);if(!Z)throw Error(`Service manifest '${W}' not found`);let _=await X({action:"status",name:K,system:Z.system!==!1});if(console.log(I.green(`Service '${K}' status: ${_}`)),Q.services[K].status=_||"unknown",Q.services[K].lastChecked=new Date().toISOString(),Y.saveServiceMetadata(Q),z.format==="json")console.log(JSON.stringify({name:K,status:_||"unknown",manifest:W,binary:Q.services[K].binary},null,2));else if(z.format==="text")console.log(`Name: ${K}`),console.log(`Status: ${_||"unknown"}`),console.log(`Definition: ${W}`),console.log(`Binary: ${Q.services[K].binary}`);else console.log(I.bold(`
17
- Service Status:`)),console.log(I.bold("─".repeat(50))),console.log(`${I.bold("Name:")} ${K}`),console.log(`${I.bold("Status:")} ${cz(_)(_||"unknown")}`),console.log(`${I.bold("Definition:")} ${W}`),console.log(`${I.bold("Binary:")} ${Q.services[K].binary}`),console.log(I.bold("─".repeat(50)))}catch(W){console.error(I.red(`Failed to check service status: ${W.message}`)),process.exit(1)}}catch(J){console.error(I.red(`Error: ${J.message}`)),process.exit(1)}}};function cz(z){switch(z){case"running":return I.green;case"stopped":return I.yellow;case"failed":return I.red;default:return I.gray}}var Hz=nz;import y from"chalk";var mz={command:"list",describe:"List all registered services",builder:(z)=>{return z.option("binary",{describe:"Filter by binary name",type:"string",alias:"b"}).option("status",{describe:"Filter by status",type:"string",choices:["running","stopped","failed","unknown"],alias:"s"}).option("format",{describe:"Output format",type:"string",choices:["json","text","table"],default:"table"})},handler:async(z)=>{try{let J=await E(z),Q=Y.loadServiceMetadata(),K=Object.entries(Q.services).map(([X,W])=>({name:X,...W}));if(z.binary)K=K.filter((X)=>X.binary===z.binary);if(z.status)K=K.filter((X)=>X.status===z.status);if(K.length===0){console.log(y.yellow("No services found."));return}if(z.format==="json")console.log(JSON.stringify(K,null,2));else if(z.format==="text")K.forEach((X)=>{console.log(`${X.name} (${X.status||"unknown"})`)});else{let X=["NAME","STATUS","BINARY","DEFINITION"],W=o.createTable(X,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}});K.forEach((Z)=>{let _=o.getStatusColor(Z.status);W.push([y.white(Z.name),_(Z.status||"unknown"),y.cyan(Z.binary),Z.manifest])}),console.log(y.bold(`
18
- Registered Services:`)),console.log(W.toString()),console.log(`Total: ${K.length} service(s)`)}}catch(J){console.error(y.red(`Error: ${J.message}`)),process.exit(1)}}},Iz=mz;import{createRequire as iz}from"module";var tz=iz(import.meta.url),{version:az}=tz("../../package.json"),BK=rz(sz(process.argv)).scriptName("fservice").usage("Usage: $0 <command> [options]").version(az).command($z).command(Tz).command(qz).command(Gz).command(Ez).command(Rz).command(Hz).command(Iz).demandCommand(1,"You need to specify a command").strict().help().alias("h","help").alias("v","version").fail((z,J,Q)=>{if(J)console.error(l.red(`Error: ${J.message}`)),console.error(J);else console.error(l.red(`Error: ${z}`));console.error(l.yellow(`
14
+ `;if(q.writeFileSync(J,_),z==="powershell"||z==="powershell-core")console.log(A.yellow("You may need to set the PowerShell execution policy to run scripts:")),console.log(A.green("Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned"));return!0}catch(X){return console.error(A.red(`Failed to add bin directory to PATH: ${X.message}`)),!1}}function y(){return $.join(x.homedir(),".fnet","backups")}function s(){let z=new Date().toISOString().replace(/:/g,"-").replace(/\..+/,""),J=$.join(y(),z);if(!q.existsSync(J))q.mkdirSync(J,{recursive:!0});return J}function i(z,J,Q=null){try{if(!q.existsSync(z))return!1;let K=Q||$.basename(z),X=$.join(J,K),W=$.dirname(X);if(!q.existsSync(W))q.mkdirSync(W,{recursive:!0});return q.copyFileSync(z,X),!0}catch(K){return console.error(A.red(`Failed to backup file ${z}: ${K.message}`)),!1}}function t(z,J={}){let Q={timestamp:new Date().toISOString(),type:J.type||"manual",message:J.message||"",command:J.command||"",files:J.files||[],...J},K=$.join(z,"metadata.json");q.writeFileSync(K,JSON.stringify(Q,null,2))}function Vz(){let z=y();if(!q.existsSync(z))return[];let J=[],Q=q.readdirSync(z);for(let K of Q){let X=$.join(z,K),W=q.statSync(X);if(W.isDirectory()&&K!=="latest"){let Z=$.join(X,"metadata.json"),_={};if(q.existsSync(Z))try{_=JSON.parse(q.readFileSync(Z,"utf8"))}catch(R){}J.push({timestamp:K,path:X,created:W.mtime,..._})}}return J.sort((K,X)=>new Date(X.created)-new Date(K.created)),J}function a(z){let J=$.join(y(),"latest");try{if(q.existsSync(J))q.unlinkSync(J);if(process.platform==="win32")q.writeFileSync(J+".txt",z);else q.symlinkSync(z,J)}catch(Q){console.warn(A.yellow(`Could not create latest symlink: ${Q.message}`))}}var j={getBinDirectory:l,getMetadataDirectory:g,getMetadataFilePath:n,checkIfInPath:Iz,detectUserShell:c,getShellConfigPath:Lz,getAllShellConfigPaths:m,createBinDirectoryStructure:Oz,getExportPathCommand:r,addBinToPath:wz,getBackupDirectory:y,createBackupDirectory:s,backupFile:i,createBackupMetadata:t,listBackups:Vz,updateLatestSymlink:a};function u(){return D.join(e.homedir(),".fnet","services")}function f(){return D.join(e.homedir(),".fnet","metadata")}function k(){return D.join(f(),"services.json")}async function Bz(){let z=u(),J=f(),Q=k();if(!H.existsSync(z))H.mkdirSync(z,{recursive:!0});if(!H.existsSync(J))H.mkdirSync(J,{recursive:!0});if(!H.existsSync(Q))H.writeFileSync(Q,JSON.stringify({services:{},lastUpdated:new Date().toISOString()},null,2))}function Jz(){let z=k();if(!H.existsSync(z))return{services:{},lastUpdated:new Date().toISOString()};try{return JSON.parse(H.readFileSync(z,"utf8"))}catch(J){return console.warn(b.yellow(`Failed to parse service metadata file: ${J.message}`)),{services:{},lastUpdated:new Date().toISOString()}}}function Kz(z){let J=k();z.lastUpdated=new Date().toISOString(),H.writeFileSync(J,JSON.stringify(z,null,2))}function S(z){return D.join(u(),`${z}.yaml`)}function Uz(z){let J=S(z);return H.existsSync(J)}function Qz(z){let J=S(z);if(!H.existsSync(J))return null;try{let Q=H.readFileSync(J,"utf8");return zz.parse(Q)}catch(Q){return console.warn(b.yellow(`Failed to parse service manifest file: ${Q.message}`)),null}}function xz(z,J){let Q=S(z);try{let K=zz.stringify(J);return H.writeFileSync(Q,K),!0}catch(K){return console.error(b.red(`Failed to save service manifest: ${K.message}`)),!1}}function Fz(z){let J=S(z);if(!H.existsSync(J))return!1;try{return H.unlinkSync(J),!0}catch(Q){return console.error(b.red(`Failed to delete service manifest: ${Q.message}`)),!1}}function Mz(){let z=u();if(!H.existsSync(z))return[];try{return H.readdirSync(z).filter((J)=>J.endsWith(".yaml")).map((J)=>J.replace(".yaml",""))}catch(J){return console.error(b.red(`Failed to list service definitions: ${J.message}`)),[]}}function Wz(z){let J=[];if(!z.name)J.push("Service name is required");if(!z.binary)J.push("Binary name is required");if(z.binary){let Q=j.getBinDirectory(),K=D.join(Q,z.binary);if(!H.existsSync(K))J.push(`Binary '${z.binary}' not found in bin directory`)}return{valid:J.length===0,errors:J}}async function Cz(z,J={}){let Q=Qz(z);if(!Q)throw Error(`Service manifest '${z}' not found`);let K=Wz(Q);if(!K.valid)throw Error(`Invalid service manifest: ${K.errors.join(", ")}`);let X=j.getBinDirectory(),W=D.join(X,Q.binary);try{await Az({action:"register",name:Q.name,description:Q.description||`Service for ${Q.binary}`,command:[W,...Q.args||[]],env:Q.env||{},wdir:Q.workingDir,system:Q.system!==!1,autoStart:Q.autoStart===!0,restartOnFailure:Q.restartOnFailure!==!1,user:Q.user});let Z=Jz();return Z.services[Q.name]={manifest:z,binary:Q.binary,registered:new Date().toISOString(),status:"registered"},Kz(Z),{success:!0,name:Q.name,manifest:z}}catch(Z){throw Error(`Failed to register service: ${Z.message}`)}}var Y={getServicesDirectory:u,getServiceMetadataDirectory:f,getServiceMetadataFilePath:k,createServiceDirectoryStructure:Bz,loadServiceMetadata:Jz,saveServiceMetadata:Kz,getServiceManifestPath:S,servicManifestExists:Uz,loadServiceManifest:Qz,saveServiceManifest:xz,deleteServiceManifest:Fz,listServiceManifests:Mz,validateServiceManifest:Wz,registerService:Cz};async function E(z){await Y.createServiceDirectoryStructure();let J=Y.getServicesDirectory(),Q=Y.getServiceMetadataDirectory(),K=Y.loadServiceMetadata();return{servicesDir:J,metadataDir:Q,metadata:K,args:z}}import p from"node:fs";function jz(z=!0){let J=[];if(z)try{let Q=j.getBinDirectory(),K=j.getMetadataFilePath();if(p.existsSync(K)){let X=JSON.parse(p.readFileSync(K,"utf8"));J=Object.keys(X.binaries).map((W)=>({name:W,message:`${W} (${X.binaries[W].version||"unknown"})`}))}else if(p.existsSync(Q))J=p.readdirSync(Q).map((X)=>({name:X,message:X}))}catch(Q){console.warn(`Failed to get binary choices: ${Q.message}`)}return{type:"object",required:["name","binary"],properties:{name:{type:"string",description:"Service name","x-prompt":{type:"input",message:"Enter service name:"}},binary:{type:"string",description:"Binary name in the bin directory","x-prompt":{type:"select",message:"Select binary:",choices:J}},description:{type:"string",description:"Service description","x-prompt":{type:"input",message:"Enter service description:"}},args:{type:"array",items:{type:"string"},description:"Command line arguments","x-prompt":{type:"input",message:"Enter command line arguments (space-separated):",result:(Q)=>Q?Q.split(" "):[]}},env:{type:"object",additionalProperties:{type:"string"},description:"Environment variables","x-prompt":{type:"input",message:"Enter environment variables (KEY=VALUE format, one per line):",result:(Q)=>{if(!Q)return{};return Q.split(`
15
+ `).filter((K)=>K.includes("=")).reduce((K,X)=>{let[W,...Z]=X.split("=");return K[W.trim()]=Z.join("=").trim(),K},{})}}},workingDir:{type:"string",description:"Working directory","x-prompt":{type:"input",message:"Enter working directory (optional):"}},autoStart:{type:"boolean",description:"Start on boot",default:!1,"x-prompt":{type:"confirm",message:"Start service on boot?",initial:!1}},restartOnFailure:{type:"boolean",description:"Restart on failure",default:!0,"x-prompt":{type:"confirm",message:"Restart service on failure?",initial:!0}},system:{type:"boolean",description:"System service",default:!0,"x-prompt":{type:"confirm",message:"Register as system service?",initial:!0}},user:{type:"string",description:"User to run the service as","x-prompt":{type:"input",message:"Enter user to run the service as (optional):"}},instances:{type:"integer",description:"Number of instances to run",default:1,minimum:1,"x-prompt":{type:"number",message:"Enter number of instances to run:",initial:1}},metadata:{type:"object",additionalProperties:!0,description:"Custom metadata"}}}}var h={getServiceManifestSchema:jz};import d from"chalk";import Xz from"@fnet/prompt";async function Dz(z){let{items:J,message:Q,nameField:K="name",valueField:X="name",initialValue:W=null,allowAbort:Z=!0}=z;if(!J||J.length===0)return console.log(d.yellow("No items available for selection.")),null;if(J.length===1&&!Z){let G=J[0],P=typeof G==="string"?G:G[X];return console.log(d.blue(`Only one option available: ${typeof G==="string"?G:G[K]}`)),P}let _=J.map((G)=>{if(typeof G==="string")return{name:G,value:G,message:G};else return{name:G[X],value:G[X],message:G[K]||G[X]}});if(Z)_.push({name:"cancel",value:null,message:d.yellow("Cancel")});let R=null;if(W){let G=_.findIndex((P)=>P.name===W);if(G!==-1)R=G}let w="selectedItem",{[w]:C}=await Xz({type:"select",name:w,message:Q,choices:_,initial:R});if(C==="cancel")return null;return C}async function Pz(z){let{items:J,message:Q,nameField:K="name",valueField:X="name",initialValues:W=[],allowAbort:Z=!0}=z;if(!J||J.length===0)return console.log(d.yellow("No items available for selection.")),null;let _=J.map((G)=>{if(typeof G==="string")return{name:G,value:G,message:G};else return{name:G[X],value:G[X],message:G[K]||G[X]}}),R=[];if(W&&W.length>0)R=_.map((G,P)=>W.includes(G.name)?P:-1).filter((G)=>G!==-1);let w="selectedItems",C=await Xz({type:"multiselect",name:w,message:Q,choices:_,initial:R,hint:"(Use space to select, enter to confirm)",validate:(G)=>{if(G.length===0&&!Z)return"Please select at least one item";return!0}});if(Z&&C[w].length===0)return null;return C[w]}var L={promptForSelection:Dz,promptForMultipleSelection:Pz};var bz={command:"manifest <subcommand>",describe:"Manage service manifests",builder:(z)=>{return z.command({command:"create",describe:"Create a new service manifest",builder:(J)=>{return J.option("name",{describe:"Service manifest name",type:"string"}).option("output",{describe:"Output file path",type:"string",alias:"o"})},handler:Sz}).command({command:"list",describe:"List service manifests",builder:(J)=>{return J.option("format",{describe:"Output format",type:"string",choices:["json","text","table"],default:"table"})},handler:Nz}).command({command:"show [n]",describe:"Show service manifest details",builder:(J)=>{return J.positional("name",{describe:"Service manifest name",type:"string",demandOption:!1}).option("format",{describe:"Output format",type:"string",choices:["json","yaml"],default:"yaml"})},handler:yz}).command({command:"edit [n]",describe:"Edit a service manifest",builder:(J)=>{return J.positional("name",{describe:"Service manifest name",type:"string",demandOption:!1})},handler:uz}).command({command:"delete [n]",describe:"Delete a service manifest",builder:(J)=>{return J.positional("name",{describe:"Service manifest name",type:"string",demandOption:!1}).option("force",{describe:"Force deletion without confirmation",type:"boolean",default:!1,alias:"f"})},handler:kz}).command({command:"validate [n]",describe:"Validate a service manifest",builder:(J)=>{return J.positional("name",{describe:"Service manifest name",type:"string",demandOption:!1})},handler:pz}).demandCommand(1,"You need to specify a subcommand")},handler:()=>{}};async function Sz(z){try{let J=await E(z),Q=h.getServiceManifestSchema(),K=await Yz({schema:Q,format:"yaml"});console.log("Result from fnetObjectFromSchema:",K);let X;if(typeof K==="string")try{X=(await import("yaml")).default.parse(K)}catch(_){console.warn(T.yellow(`Failed to parse YAML: ${_.message}`)),X={name:"service-"+Date.now()}}else if(K&&typeof K==="object")X=K.data||K;else X={name:"service-"+Date.now()};console.log("Generated manifest:",X);let W=z.name||(X&&X.name?X.name:"service-"+Date.now());if(Y.servicManifestExists(W)&&!z.force){let{confirmOverwrite:_}=await Zz({type:"confirm",name:"confirmOverwrite",message:`Service manifest '${W}' already exists. Overwrite?`,initial:!1});if(!_){console.log(T.yellow("Operation cancelled."));return}}if(Y.saveServiceManifest(W,X))console.log(T.green(`Service manifest '${W}' created successfully.`)),console.log(T.blue(`Location: ${Y.getServiceManifestPath(W)}`));else console.error(T.red(`Failed to create service manifest '${W}'.`))}catch(J){console.error(T.red(`Error: ${J.message}`)),process.exit(1)}}async function Nz(z){try{let J=await E(z),Q=Y.listServiceManifests();if(Q.length===0){console.log(T.yellow("No service manifests found."));return}if(z.format==="json")console.log(JSON.stringify(Q,null,2));else if(z.format==="text")Q.forEach((K)=>console.log(K));else{console.log(T.bold(`
16
+ Service Definitions:`));let K=(await import("./index.bavsyt65.js")).default,X=["NAME","BINARY","DESCRIPTION"],W=K.createTable(X,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}});for(let Z of Q){let _=Y.loadServiceManifest(Z);if(_)W.push([T.white(Z),T.cyan(_.binary||"undefined"),_.description||""])}console.log(W.toString()),console.log(`Total: ${Q.length} manifest(s)`)}}catch(J){console.error(T.red(`Error: ${J.message}`)),process.exit(1)}}async function yz(z){try{let J=await E(z);if(!z.name){let K=Y.listServiceManifests();if(K.length===0){console.log(T.yellow("No service manifests found."));return}let X=await L.promptForSelection({items:K,message:"Select a service manifest to show:",allowAbort:!0});if(X===null){console.log(T.yellow("Operation cancelled."));return}z.name=X}let Q=Y.loadServiceManifest(z.name);if(!Q)console.error(T.red(`Service manifest '${z.name}' not found.`)),process.exit(1);if(z.format==="json")console.log(JSON.stringify(Q,null,2));else{let K=(await import("yaml")).default;console.log(K.stringify(Q))}}catch(J){console.error(T.red(`Error: ${J.message}`)),process.exit(1)}}async function uz(z){try{let J=await E(z);if(!z.name){let _=Y.listServiceManifests();if(_.length===0){console.log(T.yellow("No service manifests found."));return}let R=await L.promptForSelection({items:_,message:"Select a service manifest to edit:",allowAbort:!0});if(R===null){console.log(T.yellow("Operation cancelled."));return}z.name=R}let Q=Y.loadServiceManifest(z.name);if(!Q)console.error(T.red(`Service manifest '${z.name}' not found.`)),process.exit(1);let K=h.getServiceManifestSchema(),W=(await Yz({schema:K,ref:Q,format:"yaml"})).data;if(Y.saveServiceManifest(z.name,W))console.log(T.green(`Service manifest '${z.name}' updated successfully.`));else console.error(T.red(`Failed to update service manifest '${z.name}'.`))}catch(J){console.error(T.red(`Error: ${J.message}`)),process.exit(1)}}async function kz(z){try{let J=await E(z);if(!z.name){let K=Y.listServiceManifests();if(K.length===0){console.log(T.yellow("No service manifests found."));return}let X=await L.promptForSelection({items:K,message:"Select a service manifest to delete:",allowAbort:!0});if(X===null){console.log(T.yellow("Operation cancelled."));return}z.name=X}if(!Y.servicManifestExists(z.name))console.error(T.red(`Service manifest '${z.name}' not found.`)),process.exit(1);if(!z.force){let{confirmDelete:K}=await Zz({type:"confirm",name:"confirmDelete",message:`Are you sure you want to delete service manifest '${z.name}'?`,initial:!1});if(!K){console.log(T.yellow("Operation cancelled."));return}}if(Y.deleteServiceManifest(z.name))console.log(T.green(`Service manifest '${z.name}' deleted successfully.`));else console.error(T.red(`Failed to delete service manifest '${z.name}'.`))}catch(J){console.error(T.red(`Error: ${J.message}`)),process.exit(1)}}async function pz(z){try{let J=await E(z);if(!z.name){let X=Y.listServiceManifests();if(X.length===0){console.log(T.yellow("No service manifests found."));return}let W=await L.promptForSelection({items:X,message:"Select a service manifest to validate:",allowAbort:!0});if(W===null){console.log(T.yellow("Operation cancelled."));return}z.name=W}let Q=Y.loadServiceManifest(z.name);if(!Q)console.error(T.red(`Service manifest '${z.name}' not found.`)),process.exit(1);let K=Y.validateServiceManifest(Q);if(K.valid)console.log(T.green(`Service manifest '${z.name}' is valid.`));else console.error(T.red(`Service manifest '${z.name}' is invalid:`)),K.errors.forEach((X)=>{console.error(T.red(`- ${X}`))}),process.exit(1)}catch(J){console.error(T.red(`Error: ${J.message}`)),process.exit(1)}}var _z=bz;import B from"chalk";var dz={command:"register",describe:"Register a service manifest as a system service",builder:(z)=>{return z.option("manifest",{describe:"Service manifest name",type:"string",demandOption:!1,alias:"d"}).option("start",{describe:"Start the service after registration",type:"boolean",default:!1})},handler:async(z)=>{try{let J=await E(z),Q=z.manifest;if(!Q){let X=Y.listServiceManifests();if(X.length===0)console.log(B.yellow('No service manifests found. Create one first using "fservice manifest create".')),process.exit(1);if(Q=await L.promptForSelection({items:X,message:"Select a service manifest to register:",allowAbort:!0}),!Q){console.log(B.yellow("Operation cancelled."));return}}if(!Y.servicManifestExists(Q))console.error(B.red(`Service manifest '${Q}' not found.`)),process.exit(1);console.log(B.blue(`Registering service from manifest '${Q}'...`));let K=await Y.registerService(Q);if(console.log(B.green(`Service '${K.name}' registered successfully.`)),z.start){console.log(B.blue(`Starting service '${K.name}'...`));let X=(await import("@fnet/service")).default;try{await X({action:"start",name:K.name}),console.log(B.green(`Service '${K.name}' started successfully.`));let W=Y.loadServiceMetadata();if(W.services[K.name])W.services[K.name].status="running",W.services[K.name].lastStarted=new Date().toISOString(),Y.saveServiceMetadata(W)}catch(W){console.error(B.red(`Failed to start service: ${W.message}`))}}}catch(J){console.error(B.red(`Error: ${J.message}`)),process.exit(1)}}},$z=dz;import O from"chalk";import gz from"@fnet/prompt";var fz={command:"unregister",describe:"Unregister a service from the system",builder:(z)=>{return z.option("name",{describe:"Service name",type:"string",demandOption:!1,alias:"n"}).option("keep-manifest",{describe:"Keep the service manifest",type:"boolean",default:!0}).option("force",{describe:"Force unregistration without confirmation",type:"boolean",default:!1,alias:"f"})},handler:async(z)=>{try{let J=await E(z),Q=Y.loadServiceMetadata(),K=z.name;if(!K){let W=Object.keys(Q.services);if(W.length===0)console.log(O.yellow("No registered services found.")),process.exit(1);if(K=await L.promptForSelection({items:W,message:"Select a service to unregister:",allowAbort:!0}),!K){console.log(O.yellow("Operation cancelled."));return}}if(!Q.services[K])console.error(O.red(`Service '${K}' not found in metadata.`)),process.exit(1);if(!z.force){let{confirmUnregister:W}=await gz({type:"confirm",name:"confirmUnregister",message:`Are you sure you want to unregister service '${K}'?`,initial:!1});if(!W){console.log(O.yellow("Operation cancelled."));return}}console.log(O.blue(`Unregistering service '${K}'...`));let X=(await import("@fnet/service")).default;try{let W=Q.services[K].manifest,Z=Y.loadServiceManifest(W);if(!Z)throw Error(`Service manifest '${W}' not found`);let _=Z.system!==!1;try{await X({action:"stop",name:K,system:_}),console.log(O.blue(`Service '${K}' stopped.`))}catch(R){console.warn(O.yellow(`Warning: Failed to stop service: ${R.message}`))}if(await X({action:"unregister",name:K,system:_}),console.log(O.green(`Service '${K}' unregistered successfully.`)),delete Q.services[K],Y.saveServiceMetadata(Q),!z.keepDefinition&&W){if(Y.servicManifestExists(W))if(Y.deleteServiceManifest(W))console.log(O.green(`Service manifest '${W}' deleted.`));else console.warn(O.yellow(`Warning: Failed to delete service manifest '${W}'.`))}}catch(W){console.error(O.red(`Failed to unregister service: ${W.message}`)),process.exit(1)}}catch(J){console.error(O.red(`Error: ${J.message}`)),process.exit(1)}}},Tz=fz;import F from"chalk";var hz={command:"start",describe:"Start a registered service",builder:(z)=>{return z.option("name",{describe:"Service name",type:"string",demandOption:!1,alias:"n"})},handler:async(z)=>{try{let J=await E(z),Q=Y.loadServiceMetadata(),K=z.name;if(!K){let W=Object.keys(Q.services);if(W.length===0)console.log(F.yellow("No registered services found.")),process.exit(1);if(K=await L.promptForSelection({items:W,message:"Select a service to start:",allowAbort:!0}),!K){console.log(F.yellow("Operation cancelled."));return}}if(!Q.services[K])console.error(F.red(`Service '${K}' not found in metadata.`)),process.exit(1);console.log(F.blue(`Starting service '${K}'...`));let X=(await import("@fnet/service")).default;try{let W=Q.services[K].manifest,Z=Y.loadServiceManifest(W);if(!Z)throw Error(`Service manifest '${W}' not found`);await X({action:"start",name:K,system:Z.system!==!1}),console.log(F.green(`Service '${K}' started successfully.`)),Q.services[K].status="running",Q.services[K].lastStarted=new Date().toISOString(),Y.saveServiceMetadata(Q)}catch(W){console.error(F.red(`Failed to start service: ${W.message}`)),process.exit(1)}}catch(J){console.error(F.red(`Error: ${J.message}`)),process.exit(1)}}},qz=hz;import M from"chalk";var vz={command:"stop",describe:"Stop a running service",builder:(z)=>{return z.option("name",{describe:"Service name",type:"string",demandOption:!1,alias:"n"})},handler:async(z)=>{try{let J=await E(z),Q=Y.loadServiceMetadata(),K=z.name;if(!K){let W=Object.keys(Q.services);if(W.length===0)console.log(M.yellow("No registered services found.")),process.exit(1);if(K=await L.promptForSelection({items:W,message:"Select a service to stop:",allowAbort:!0}),!K){console.log(M.yellow("Operation cancelled."));return}}if(!Q.services[K])console.error(M.red(`Service '${K}' not found in metadata.`)),process.exit(1);console.log(M.blue(`Stopping service '${K}'...`));let X=(await import("@fnet/service")).default;try{let W=Q.services[K].manifest,Z=Y.loadServiceManifest(W);if(!Z)throw Error(`Service manifest '${W}' not found`);await X({action:"stop",name:K,system:Z.system!==!1}),console.log(M.green(`Service '${K}' stopped successfully.`)),Q.services[K].status="stopped",Q.services[K].lastStopped=new Date().toISOString(),Y.saveServiceMetadata(Q)}catch(W){console.error(M.red(`Failed to stop service: ${W.message}`)),process.exit(1)}}catch(J){console.error(M.red(`Error: ${J.message}`)),process.exit(1)}}},Gz=vz;import U from"chalk";var oz={command:"restart",describe:"Restart a service",builder:(z)=>{return z.option("name",{describe:"Service name",type:"string",demandOption:!1,alias:"n"})},handler:async(z)=>{try{let J=await E(z),Q=Y.loadServiceMetadata(),K=z.name;if(!K){let W=Object.keys(Q.services);if(W.length===0)console.log(U.yellow("No registered services found.")),process.exit(1);if(K=await L.promptForSelection({items:W,message:"Select a service to restart:",allowAbort:!0}),!K){console.log(U.yellow("Operation cancelled."));return}}if(!Q.services[K])console.error(U.red(`Service '${K}' not found in metadata.`)),process.exit(1);console.log(U.blue(`Restarting service '${K}'...`));let X=(await import("@fnet/service")).default;try{await X({action:"stop",name:K}),console.log(U.blue(`Service '${K}' stopped.`)),await X({action:"start",name:K}),console.log(U.green(`Service '${K}' restarted successfully.`)),Q.services[K].status="running",Q.services[K].lastRestarted=new Date().toISOString(),Y.saveServiceMetadata(Q)}catch(W){console.error(U.red(`Failed to restart service: ${W.message}`)),process.exit(1)}}catch(J){console.error(U.red(`Error: ${J.message}`)),process.exit(1)}}},Ez=oz;import I from"chalk";var lz={command:"status",describe:"Check the status of a service",builder:(z)=>{return z.option("name",{describe:"Service name",type:"string",demandOption:!1,alias:"n"}).option("format",{describe:"Output format",type:"string",choices:["json","text","table"],default:"table"})},handler:async(z)=>{try{let J=await E(z),Q=Y.loadServiceMetadata(),K=z.name;if(!K){let W=Object.keys(Q.services);if(W.length===0)console.log(I.yellow("No registered services found.")),process.exit(1);if(K=await L.promptForSelection({items:W,message:"Select a service to check status:",allowAbort:!0}),!K){console.log(I.yellow("Operation cancelled."));return}}if(!Q.services[K])console.error(I.red(`Service '${K}' not found in metadata.`)),process.exit(1);console.log(I.blue(`Checking status of service '${K}'...`));let X=(await import("@fnet/service")).default;try{let W=Q.services[K].manifest,Z=Y.loadServiceManifest(W);if(!Z)throw Error(`Service manifest '${W}' not found`);let _=await X({action:"status",name:K,system:Z.system!==!1});if(console.log(I.green(`Service '${K}' status: ${_}`)),Q.services[K].status=_||"unknown",Q.services[K].lastChecked=new Date().toISOString(),Y.saveServiceMetadata(Q),z.format==="json")console.log(JSON.stringify({name:K,status:_||"unknown",manifest:W,binary:Q.services[K].binary},null,2));else if(z.format==="text")console.log(`Name: ${K}`),console.log(`Status: ${_||"unknown"}`),console.log(`Definition: ${W}`),console.log(`Binary: ${Q.services[K].binary}`);else console.log(I.bold(`
17
+ Service Status:`)),console.log(I.bold("─".repeat(50))),console.log(`${I.bold("Name:")} ${K}`),console.log(`${I.bold("Status:")} ${nz(_)(_||"unknown")}`),console.log(`${I.bold("Definition:")} ${W}`),console.log(`${I.bold("Binary:")} ${Q.services[K].binary}`),console.log(I.bold("─".repeat(50)))}catch(W){console.error(I.red(`Failed to check service status: ${W.message}`)),process.exit(1)}}catch(J){console.error(I.red(`Error: ${J.message}`)),process.exit(1)}}};function nz(z){switch(z){case"running":return I.green;case"stopped":return I.yellow;case"failed":return I.red;default:return I.gray}}var Rz=lz;import N from"chalk";var cz={command:"list",describe:"List all registered services",builder:(z)=>{return z.option("binary",{describe:"Filter by binary name",type:"string",alias:"b"}).option("status",{describe:"Filter by status",type:"string",choices:["running","stopped","failed","unknown"],alias:"s"}).option("format",{describe:"Output format",type:"string",choices:["json","text","table"],default:"table"})},handler:async(z)=>{try{let J=await E(z),Q=Y.loadServiceMetadata(),K=Object.entries(Q.services).map(([X,W])=>({name:X,...W}));if(z.binary)K=K.filter((X)=>X.binary===z.binary);if(z.status)K=K.filter((X)=>X.status===z.status);if(K.length===0){console.log(N.yellow("No services found."));return}if(z.format==="json")console.log(JSON.stringify(K,null,2));else if(z.format==="text")K.forEach((X)=>{console.log(`${X.name} (${X.status||"unknown"})`)});else{let X=["NAME","STATUS","BINARY","DEFINITION"],W=v.createTable(X,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}});K.forEach((Z)=>{let _=v.getStatusColor(Z.status);W.push([N.white(Z.name),_(Z.status||"unknown"),N.cyan(Z.binary),Z.manifest])}),console.log(N.bold(`
18
+ Registered Services:`)),console.log(W.toString()),console.log(`Total: ${K.length} service(s)`)}}catch(J){console.error(N.red(`Error: ${J.message}`)),process.exit(1)}}},Hz=cz;import{createRequire as sz}from"module";var iz=sz(import.meta.url),{version:tz}=iz("../../package.json"),AK=mz(rz(process.argv)).scriptName("fservice").usage("Usage: $0 <command> [options]").version(tz).command(_z).command($z).command(Tz).command(qz).command(Gz).command(Ez).command(Rz).command(Hz).demandCommand(1,"You need to specify a command").strict().help().alias("h","help").alias("v","version").fail((z,J,Q)=>{if(J)console.error(o.red(`Error: ${J.message}`)),console.error(J);else console.error(o.red(`Error: ${z}`));console.error(o.yellow(`
19
19
  Usage:`),Q.help()),process.exit(1)}).parse();
@@ -0,0 +1,2 @@
1
+ import{createRequire as E}from"node:module";var L=E(import.meta.url);import H from"cli-table3";import j from"chalk";function B(q,x={}){let y={...{chars:{top:"─","top-mid":"─","top-left":" ","top-right":" ",bottom:"─","bottom-mid":"─","bottom-left":" ","bottom-right":" ",left:" ","left-mid":" ",mid:"─","mid-mid":"─",right:" ","right-mid":" ",middle:" "},style:{head:[],border:[],compact:!0},wordWrap:!0},...x,head:q.map((z)=>j.bold(z))};return new H(y)}function I(q,x,A={}){let y=B(q,A);if(Array.isArray(x))x.forEach((z)=>{y.push(z)});return y.toString()}function J(q){switch(q){case"running":return j.green;case"stopped":return j.yellow;case"failed":return j.red;case"registered":return j.blue;default:return j.gray}}var Q={createTable:B,createTableWithData:I,getStatusColor:J};
2
+ export{L as a,B as b,I as c,J as d,Q as e};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fnet/cli",
3
- "version": "1.0.16",
3
+ "version": "1.0.18",
4
4
  "files": [
5
5
  "dist",
6
6
  "template"
@@ -72,6 +72,7 @@
72
72
  {% if atom.doc.features.cli.enabled %}
73
73
  {% if atom.doc.features.project.format ==='cjs' %}
74
74
  ,"cli": "bun {{atom.doc.features.cli.node_options}} {{atom.doc.features.cli.dir}}/index.cjs"
75
+ ,"cli:dev": "NODE_PRESERVE_SYMLINKS=1 bun {{atom.doc.features.cli.node_options}} {{atom.doc.features.cli.input.file}}"
75
76
  {% if atom.doc.features.cli.mcp.enabled === true %}
76
77
  ,"mcp": "bun {{atom.doc.features.cli.node_options}} {{atom.doc.features.cli.dir}}/index.cjs --cli-mode=mcp"
77
78
  ,"mcp-inspect": "bunx @modelcontextprotocol/inspector bun {{atom.doc.features.cli.node_options}} {{atom.doc.features.cli.dir}}/index.cjs --cli-mode=mcp"
@@ -4,7 +4,7 @@
4
4
 
5
5
  {% elif atom.doc.features.project.format === 'cjs' %}
6
6
  const {default:fnetArgs,argsParser} = require('@fnet/args');
7
- const validate,{schema as inputSchema} = require("./validate_input.js");
7
+ const {default:validate, schema: inputSchema} = require("./validate_input.js");
8
8
  {% endif %}
9
9
 
10
10
  {% if atom.doc.features.cli.fargs and atom.doc.features.cli.fargs?.enabled !== false %}
@@ -78,12 +78,12 @@
78
78
  export { argsParser };
79
79
  {% elif atom.doc.features.project.format === 'cjs' %}
80
80
 
81
- module.exports = async () => {
81
+ const defaultExport = async () => {
82
82
 
83
83
  let schema = inputSchema;
84
84
  let initial;
85
85
 
86
- {% if atom.doc.features.cli.fargs and atom.doc.features.cli.fargs?.enabled !== false %}
86
+ {% if atom.doc.features.cli.fargs and atom.doc.features.cli.fargs?.enabled !== false %}
87
87
  const fargs = get_fargs(process.argv.slice(2));
88
88
  const ftags = get_ftags(process.argv.slice(2));
89
89
 
@@ -121,5 +121,7 @@
121
121
  return await fnetArgs({schema,initial,validate,packageCallback});
122
122
  };
123
123
 
124
+ module.exports = defaultExport;
125
+ module.exports.default = defaultExport;
124
126
  module.exports.argsParser = argsParser;
125
127
  {% endif %}
@@ -71,6 +71,7 @@
71
71
  {% if atom.doc.features.cli.enabled %}
72
72
  {% if atom.doc.features.project.format ==='cjs' %}
73
73
  ,"cli": "bun {{atom.doc.features.cli.node_options}} {{atom.doc.features.cli.dir}}/index.cjs"
74
+ ,"cli:dev": "NODE_PRESERVE_SYMLINKS=1 bun {{atom.doc.features.cli.node_options}} {{atom.doc.features.cli.input.file}}"
74
75
  {% if atom.doc.features.cli.mcp.enabled === true %}
75
76
  ,"mcp": "bun {{atom.doc.features.cli.node_options}} {{atom.doc.features.cli.dir}}/index.cjs --cli-mode=mcp"
76
77
  ,"mcp-inspect": "bunx @modelcontextprotocol/inspector bun {{atom.doc.features.cli.node_options}} {{atom.doc.features.cli.dir}}/index.cjs --cli-mode=mcp"
@@ -4,7 +4,7 @@
4
4
 
5
5
  {% elif atom.doc.features.project.format === 'cjs' %}
6
6
  const {default:fnetArgs,argsParser} = require('@fnet/args');
7
- const validate,{schema as inputSchema} = require("./validate_input");
7
+ const {default:validate, schema: inputSchema} = require("./validate_input");
8
8
  {% endif %}
9
9
 
10
10
  {% if atom.doc.features.cli.fargs and atom.doc.features.cli.fargs?.enabled !== false %}
@@ -79,12 +79,12 @@
79
79
 
80
80
  {% elif atom.doc.features.project.format === 'cjs' %}
81
81
 
82
- module.exports = async () => {
82
+ const defaultExport = async () => {
83
83
 
84
84
  let schema = inputSchema;
85
85
  let initial;
86
86
 
87
- {% if atom.doc.features.cli.fargs and atom.doc.features.cli.fargs?.enabled !== false %}
87
+ {% if atom.doc.features.cli.fargs and atom.doc.features.cli.fargs?.enabled !== false %}
88
88
  const fargs = get_fargs(process.argv.slice(2));
89
89
  const ftags = get_ftags(process.argv.slice(2));
90
90
 
@@ -122,5 +122,7 @@
122
122
  return await fnetArgs({schema,initial,validate,packageCallback});
123
123
  };
124
124
 
125
+ module.exports = defaultExport;
126
+ module.exports.default = defaultExport;
125
127
  module.exports.argsParser = argsParser;
126
128
  {% endif %}