@stacksjs/actions 0.75.255 → 0.75.256
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dev/dashboard-supervisor.js +1 -1
- package/dist/dev/dashboard-utils.d.ts +1 -1
- package/dist/dev/dashboard.js +3 -3
- package/dist/dev/system-tray.js +2 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -1
- package/dist/stx-source.d.ts +28 -0
- package/dist/stx-source.js +1 -0
- package/package.json +40 -40
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{existsSync,readdirSync,watch}from"node:fs";import process from"node:process";import{join}from"node:path";import{projectPath,storagePath}from"@stacksjs/path";const BACKEND_SOURCE_RE=/\.(?:[cm]?[jt]sx?|json)$/i,DECLARATION_RE=/\.d\.[cm]?ts$/i;export function isDashboardBackendSource(filename){return BACKEND_SOURCE_RE.test(filename)&&!DECLARATION_RE.test(filename)}export function dashboardBackendWatchRoots(){const coreRoot=storagePath("framework/core"),coreSources=existsSync(coreRoot)?readdirSync(coreRoot,{withFileTypes:!0}).filter((entry)=>entry.isDirectory()).map((entry)=>join(coreRoot,entry.name,"src")).filter(existsSync):[];return[projectPath("app"),projectPath("routes"),projectPath("config"),projectPath("resources/functions"),
|
|
1
|
+
import{existsSync,readdirSync,watch}from"node:fs";import process from"node:process";import{join}from"node:path";import{defaultsPath,projectPath,storagePath}from"@stacksjs/path";const BACKEND_SOURCE_RE=/\.(?:[cm]?[jt]sx?|json)$/i,DECLARATION_RE=/\.d\.[cm]?ts$/i;export function isDashboardBackendSource(filename){return BACKEND_SOURCE_RE.test(filename)&&!DECLARATION_RE.test(filename)}export function dashboardBackendWatchRoots(){const coreRoot=storagePath("framework/core"),coreSources=existsSync(coreRoot)?readdirSync(coreRoot,{withFileTypes:!0}).filter((entry)=>entry.isDirectory()).map((entry)=>join(coreRoot,entry.name,"src")).filter(existsSync):[];return[projectPath("app"),projectPath("routes"),projectPath("config"),projectPath("resources/functions"),defaultsPath("app"),defaultsPath("routes"),defaultsPath("resources/functions"),...coreSources].filter(existsSync)}export async function runDashboardSupervisor(entry,args){const watchers=[];let child=null,generation=0,restarting=!1,stopping=!1,restartTimer,settled=!1;return new Promise((resolve)=>{const finish=(code)=>{if(settled)return;settled=!0;if(restartTimer)clearTimeout(restartTimer);for(const watcher of watchers)watcher.close();process.off("SIGINT",stop);process.off("SIGTERM",stop);resolve(code)},startChild=()=>{const currentGeneration=++generation;child=Bun.spawn([process.execPath,entry,...args],{cwd:process.cwd(),env:{...process.env,STACKS_DASHBOARD_WORKER:"1"},stdin:"inherit",stdout:"inherit",stderr:"inherit"});child.exited.then((code)=>{if(!stopping&&!restarting&¤tGeneration===generation)finish(code)})},restart=async()=>{if(restarting||stopping)return;restarting=!0;const previous=child;generation++;if(previous){previous.kill("SIGTERM");await previous.exited}if(!stopping)startChild();restarting=!1},scheduleRestart=()=>{if(restartTimer)clearTimeout(restartTimer);restartTimer=setTimeout(()=>{console.log(`
|
|
2
2
|
Backend source changed. Restarting the dashboard server.
|
|
3
3
|
`);restart()},100)};function stop(){if(stopping)return;stopping=!0;generation++;if(restartTimer)clearTimeout(restartTimer);const running=child;if(!running){finish(0);return}running.kill("SIGTERM");running.exited.then(()=>finish(0))}startChild();for(const root of dashboardBackendWatchRoots())try{const watcher=watch(root,{recursive:!0},(_event,filename)=>{if(!filename||isDashboardBackendSource(String(filename)))scheduleRestart()});watchers.push(watcher)}catch(error){console.warn(`[dashboard] Could not watch backend source root ${root}:`,error)}process.once("SIGINT",stop);process.once("SIGTERM",stop)})}
|
|
@@ -106,7 +106,7 @@ export declare interface DiscoveredModel {
|
|
|
106
106
|
dashboard?: DashboardModelOptions
|
|
107
107
|
}
|
|
108
108
|
/**
|
|
109
|
-
* Manifest row written to `storage/framework/runtime/dashboard
|
|
109
|
+
* Manifest row written to `storage/framework/runtime/dashboard/.discovered-models.json`
|
|
110
110
|
* for the web-side sidebar to consume. Includes the per-model `dashboard`
|
|
111
111
|
* config (stacksjs/stacks#1843) so both sidebar builders (the native one
|
|
112
112
|
* here and the HTML one in `defaults/resources/functions/dashboard/sidebar.ts`)
|
package/dist/dev/dashboard.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import process from"node:process";import{randomUUID}from"node:crypto";import{existsSync,mkdirSync,renameSync,unlinkSync,writeFileSync}from"node:fs";import{
|
|
2
|
-
`);throw Error(errors||`Failed to bundle ${entrypoint}`)}const output=result.outputs.find((file)=>file.path.endsWith(".js"));if(!output)throw Error(`No JavaScript output produced for ${entrypoint}`);return output.text()})();dependencyBundles.set(entrypoint,build);return build}function browserDependencyRoute(entrypoint){return async()=>{try{return new Response(await buildDashboardDependency(entrypoint),{headers:{"content-type":"text/javascript; charset=utf-8","cache-control":"no-cache"}})}catch(error){dependencyBundles.delete(entrypoint);return new Response(`throw new Error(${JSON.stringify(error.message)})`,{status:500,headers:{"content-type":"text/javascript; charset=utf-8"}})}}}let dashboardIconCss=null;async function buildDashboardIconCss(){const{generateCss}=await import("@stacksjs/stx"),dirs=[dashboardPath,userDashboardPath,
|
|
1
|
+
import process from"node:process";import{randomUUID}from"node:crypto";import{existsSync,mkdirSync,renameSync,unlinkSync,writeFileSync}from"node:fs";import{connect}from"node:net";import{bold,cyan,dim,green}from"@stacksjs/cli";import{defaultsPath,projectPath,publicPath,storagePath}from"@stacksjs/path";import{seedCsrfPageResponse,validateDevCsrfRequest}from"./csrf";import{resolveComponentsLibraryRoot}from"./defaults-resources";import{shouldDelegateDashboardRequest}from"./dashboard-request-routing";import{resolveDashboardCraftExecutable}from"./dashboard-native";import{resolveDashboardDomain,resolveDashboardProxyStrategy}from"./dashboard-proxy";import{buildManifest,discoverModels,findAvailablePort,waitForServer}from"./dashboard-utils";import{runDashboardSupervisor}from"./dashboard-supervisor";import{ensureDiscoveredPackages}from"../discover-packages";import{resolveStxSource}from"../stx-source";if(process.env.STACKS_DASHBOARD_WORKER!=="1"){const exitCode=await runDashboardSupervisor(import.meta.path,process.argv.slice(2));process.exit(exitCode)}const verboseIdx=process.argv.indexOf("--verbose"),verbose=verboseIdx!==-1&&process.argv[verboseIdx+1]!=="false",startTime=Bun.nanoseconds(),{log:originalConsoleLog,warn:originalConsoleWarn}=console,bufferedLogs=[];console.log=(...args)=>{bufferedLogs.push(args.map(String).join(" "))};console.warn=(...args)=>{bufferedLogs.push(args.map(String).join(" "))};const dashboardPath=defaultsPath("views/dashboard"),userDashboardPath=projectPath("resources/views/dashboard"),preferredPort=Number(process.env.PORT_ADMIN)||3002,dashboardPort=await findAvailablePort(preferredPort),appUrl=process.env.APP_URL||"",dashboardDomain=resolveDashboardDomain(appUrl),sslBasePath=`${process.env.HOME}/.stacks/ssl`;function restoreConsole(){console.log=originalConsoleLog;console.warn=(...args)=>{const msg=args.map(String).join(" ");if(msg.includes("[STX] DOM API violation")||msg.includes("unsafe expression"))return;originalConsoleWarn(...args)}}async function startStxServer(){const{overridesReady}=await import("@stacksjs/config"),{autoImportsAreStale,generateAutoImportFiles,injectGlobalAutoImports}=await import("@stacksjs/server");await overridesReady;await ensureDiscoveredPackages();if(!existsSync(storagePath("framework/auto-imports/models.ts"))||autoImportsAreStale())await generateAutoImportFiles();await injectGlobalAutoImports();const serveSource=resolveStxSource({value:process.env.BUN_PLUGIN_STX_SRC});if(serveSource.kind==="missing")throw Error(`BUN_PLUGIN_STX_SRC points at ${serveSource.path}, which does not exist. Unset it to use the installed bun-plugin-stx.`);let serve;if(serveSource.kind==="override"){serve=(await import(serveSource.path)).serve;console.log(`[Dashboard] bun-plugin-stx from ${serveSource.path}`)}else serve=(await import("bun-plugin-stx/serve")).serve;const stxSource=resolveStxSource({value:process.env.STX_SRC});if(stxSource.kind==="missing")throw Error(`STX_SRC points at ${stxSource.path}, which does not exist. Unset it to use the installed @stacksjs/stx.`);let stxModule;if(stxSource.kind==="override"){stxModule=await import(stxSource.path);console.log(`[Dashboard] stx from ${stxSource.path}`)}const{listConfigFiles,readConfig,updateConfigKeys}=await import(defaultsPath("resources/functions/dashboard/config-io.ts")),localTsChartsRoot=process.env.TS_CHARTS_SRC,dependencyBundles=new Map;function resolveTsChartsSource(packageName){return[...localTsChartsRoot?[`${localTsChartsRoot}/packages/${packageName}/src/index.ts`]:[],projectPath(`node_modules/@ts-charts/${packageName}/src/index.ts`)].find(existsSync)||null}const tsChartsEntry=[...localTsChartsRoot?[`${localTsChartsRoot}/packages/ts-charts/src/index.ts`]:[],projectPath("node_modules/ts-charts/src/index.ts")].find(existsSync);async function buildDashboardDependency(entrypoint){const cached=dependencyBundles.get(entrypoint);if(cached)return cached;const build=(async()=>{const result=await Bun.build({entrypoints:[entrypoint],target:"browser",format:"esm",minify:!0,plugins:[{name:"dashboard-ts-charts-source",setup(builder){builder.onResolve({filter:/^@ts-charts\/[a-z0-9-]+$/},(args)=>{const packageName=args.path.slice(11),source=resolveTsChartsSource(packageName);if(source)return{path:source};return null})}}]});if(!result.success){const errors=result.logs.filter((log)=>log.level==="error").map((log)=>log.message).join(`
|
|
2
|
+
`);throw Error(errors||`Failed to bundle ${entrypoint}`)}const output=result.outputs.find((file)=>file.path.endsWith(".js"));if(!output)throw Error(`No JavaScript output produced for ${entrypoint}`);return output.text()})();dependencyBundles.set(entrypoint,build);return build}function browserDependencyRoute(entrypoint){return async()=>{try{return new Response(await buildDashboardDependency(entrypoint),{headers:{"content-type":"text/javascript; charset=utf-8","cache-control":"no-cache"}})}catch(error){dependencyBundles.delete(entrypoint);return new Response(`throw new Error(${JSON.stringify(error.message)})`,{status:500,headers:{"content-type":"text/javascript; charset=utf-8"}})}}}let dashboardIconCss=null;async function buildDashboardIconCss(){const{generateCss}=await import("@stacksjs/stx"),dirs=[dashboardPath,userDashboardPath,defaultsPath("resources/components/Dashboard")],icons=new Set;for(const dir of dirs){if(!existsSync(dir))continue;const glob=new Bun.Glob("**/*.{stx,ts}");for await(const file of glob.scan({cwd:dir,absolute:!0})){const text=await Bun.file(file).text();for(const match of text.matchAll(/\bi-[a-z][a-z0-9]*(?:-[a-z0-9]+)+/g))icons.add(match[0])}}if(icons.size===0)return"";return generateCss(`<div class="${[...icons].join(" ")}"></div>`,process.cwd())}const configRoutes={"/__deps/charts.js":browserDependencyRoute(storagePath("framework/core/charts/src/index.ts")),"/__deps/ts-charts.js":browserDependencyRoute(tsChartsEntry||`${localTsChartsRoot}/packages/ts-charts/src/index.ts`),"/__deps/dashboard-icons.css":async()=>{if(!dashboardIconCss)dashboardIconCss=buildDashboardIconCss();return new Response(await dashboardIconCss,{headers:{"content-type":"text/css; charset=utf-8","cache-control":"no-cache"}})},"/api/config/list":async()=>{try{return Response.json({ok:!0,files:listConfigFiles()})}catch(e){return Response.json({ok:!1,error:e?.message},{status:500})}},"/api/config/read":async(req)=>{try{const name=new URL(req.url).searchParams.get("name")||"";if(!/^[\w-]+$/.test(name))return Response.json({ok:!1,error:"Invalid config name"},{status:400});const result=await readConfig(name);if(!result)return Response.json({ok:!1,error:"Not found"},{status:404});return Response.json({ok:!0,name,fields:result.fields})}catch(e){return Response.json({ok:!1,error:e?.message},{status:500})}},"/api/config/source":async(req)=>{try{const name=new URL(req.url).searchParams.get("name")||"";if(!/^[\w-]+$/.test(name))return Response.json({ok:!1,error:"Invalid config name"},{status:400});const result=await readConfig(name);if(!result)return Response.json({ok:!1,error:"Not found"},{status:404});return new Response(result.source,{headers:{"content-type":"text/plain; charset=utf-8"}})}catch(e){return Response.json({ok:!1,error:e?.message},{status:500})}},"/api/config/update":async(req)=>{if(req.method!=="POST")return Response.json({ok:!1,error:"Method not allowed"},{status:405});try{await validateDevCsrfRequest(req);const body=await req.json(),file=body.file?.replace(/\.ts$/,"");if(!file||!/^[\w-]+$/.test(file))return Response.json({ok:!1,error:"Invalid file"},{status:400});const updates=[];if(Array.isArray(body.updates))for(const u of body.updates){const k=u.key??u.path;if(typeof k==="string")updates.push({key:k,value:u.value})}else if(body.key)updates.push({key:body.key,value:body.value});if(updates.length===0)return Response.json({ok:!1,error:"No updates supplied"},{status:400});const invalid=updates.find((update)=>!/^[A-Za-z_$][\w$]*$/.test(update.key)||typeof update.value!=="string"&&typeof update.value!=="number"&&typeof update.value!=="boolean"||typeof update.value==="number"&&!Number.isFinite(update.value));if(invalid)return Response.json({ok:!1,error:`Invalid value for configuration key "${invalid.key}"`},{status:400});const typedUpdates=updates;try{await updateConfigKeys(file,typedUpdates)}catch(err){const error=err?.message||"Configuration values could not be updated.",results=typedUpdates.map((update)=>({key:update.key,ok:!1,error}));return Response.json({ok:!1,file,results,error},{status:422})}const results=typedUpdates.map((update)=>({key:update.key,ok:!0,newValue:update.value}));return Response.json({ok:!0,file,results})}catch(e){if(e?.status===403)return Response.json({ok:!1,error:"Forbidden",message:"CSRF token mismatch"},{status:403});return Response.json({ok:!1,error:e?.message},{status:500})}}},router=await import("@stacksjs/router");await router.loadRoutes(await router.appRouteRegistry());const stacksRoute=router.route;serve({root:projectPath("resources"),patterns:[userDashboardPath,dashboardPath],port:dashboardPort,componentsDir:defaultsPath("resources/components/Dashboard"),fallbackComponentsDir:resolveComponentsLibraryRoot(),layoutsDir:dashboardPath,partialsDir:dashboardPath,publicDir:publicPath(),renderCache:!0,renderCacheVary:"source",prewarmRenderCache:4,watchDirs:[projectPath("resources/functions"),defaultsPath("resources/functions")],quiet:!0,routes:configRoutes,onRequest:async(req)=>{const pathname=new URL(req.url).pathname;if(shouldDelegateDashboardRequest(pathname,req.method))return stacksRoute.handleRequest(req);return null},onResponse:seedCsrfPageResponse,auth:!1,...stxModule&&{stxModule}}).catch((err)=>{restoreConsole();console.error(`
|
|
3
3
|
Failed to start dashboard server: ${err?.message||err}
|
|
4
|
-
`);process.exit(1)})}function portAnswers(port,timeoutMs=800){return new Promise((resolve)=>{const socket=connect({port,host:"127.0.0.1"}),finish=(answered)=>{try{socket.destroy()}catch{}resolve(answered)};socket.once("connect",()=>finish(!0));socket.once("error",()=>finish(!1));setTimeout(()=>finish(!1),timeoutMs).unref?.()})}async function registerWithRpxDaemon(domainToServe){const{writeEntry}=await import("@stacksjs/rpx");await writeEntry({id:`${domainToServe}-dashboard`,from:`localhost:${dashboardPort}`,to:domainToServe,cwd:process.cwd(),createdAt:new Date().toISOString(),pid:process.pid},void 0,verbose);return!0}async function startReverseProxy(){if(!dashboardDomain)return!1;try{let rpx;const loadRpx=async()=>rpx??=await import("@stacksjs/rpx"),strategy=await resolveDashboardProxyStrategy(dashboardDomain,{proxyManagedExternally:Boolean(process.env.STACKS_PROXY_MANAGED),isDaemonRunning:async()=>(await loadRpx()).isDaemonRunning(),httpsPortAnswers:()=>portAnswers(443)});if(strategy==="origin-only")return!1;if(strategy==="parent-managed")return!0;if(strategy==="daemon-route")return await registerWithRpxDaemon(dashboardDomain);await(await loadRpx()).startProxies({proxies:[{from:`localhost:${dashboardPort}`,to:dashboardDomain,cleanUrls:!1}],https:{basePath:sslBasePath,validityDays:825},regenerateUntrustedCerts:!1,verbose});return await portAnswers(443)}catch(error){if(verbose)originalConsoleLog(` ${dim(`Proxy: ${error}`)}`);return!1}}const[,discoveredModels]=await Promise.all([startStxServer(),discoverModels(projectPath("app/Models"),
|
|
4
|
+
`);process.exit(1)})}function portAnswers(port,timeoutMs=800){return new Promise((resolve)=>{const socket=connect({port,host:"127.0.0.1"}),finish=(answered)=>{try{socket.destroy()}catch{}resolve(answered)};socket.once("connect",()=>finish(!0));socket.once("error",()=>finish(!1));setTimeout(()=>finish(!1),timeoutMs).unref?.()})}async function registerWithRpxDaemon(domainToServe){const{writeEntry}=await import("@stacksjs/rpx");await writeEntry({id:`${domainToServe}-dashboard`,from:`localhost:${dashboardPort}`,to:domainToServe,cwd:process.cwd(),createdAt:new Date().toISOString(),pid:process.pid},void 0,verbose);return!0}async function startReverseProxy(){if(!dashboardDomain)return!1;try{let rpx;const loadRpx=async()=>rpx??=await import("@stacksjs/rpx"),strategy=await resolveDashboardProxyStrategy(dashboardDomain,{proxyManagedExternally:Boolean(process.env.STACKS_PROXY_MANAGED),isDaemonRunning:async()=>(await loadRpx()).isDaemonRunning(),httpsPortAnswers:()=>portAnswers(443)});if(strategy==="origin-only")return!1;if(strategy==="parent-managed")return!0;if(strategy==="daemon-route")return await registerWithRpxDaemon(dashboardDomain);await(await loadRpx()).startProxies({proxies:[{from:`localhost:${dashboardPort}`,to:dashboardDomain,cleanUrls:!1}],https:{basePath:sslBasePath,validityDays:825},regenerateUntrustedCerts:!1,verbose});return await portAnswers(443)}catch(error){if(verbose)originalConsoleLog(` ${dim(`Proxy: ${error}`)}`);return!1}}const[,discoveredModels]=await Promise.all([startStxServer(),discoverModels(projectPath("app/Models"),defaultsPath("app/Models"))]),{loadDashboardConfig}=await import(defaultsPath("resources/functions/dashboard/toggles.ts")),{feature:featureEnabled}=await import("@stacksjs/config"),{toggles:dashboardToggles,nav:dashboardNav}=await loadDashboardConfig(projectPath("config/dashboard.ts"),featureEnabled),manifestDir=storagePath("framework/runtime/dashboard"),manifestPath=storagePath("framework/runtime/dashboard/.discovered-models.json");mkdirSync(manifestDir,{recursive:!0});const manifestPayload={models:buildManifest(discoveredModels),sections:dashboardToggles,nav:dashboardNav},manifestTempPath=`${manifestPath}.${process.pid}.${randomUUID()}.tmp`;try{writeFileSync(manifestTempPath,JSON.stringify(manifestPayload,null,2),{flag:"wx"});renameSync(manifestTempPath,manifestPath)}finally{if(existsSync(manifestTempPath))unlinkSync(manifestTempPath)}const serverReady=await waitForServer(dashboardPort);restoreConsole();const proxyStarted=await startReverseProxy().catch((err)=>{if(verbose)console.warn("[Dashboard] Reverse proxy failed:",err);return!1}),dashboardHttpsUrl=dashboardDomain?`https://${dashboardDomain}`:null,dashboardLocalUrl=`http://localhost:${dashboardPort}`,initialUrl=dashboardHttpsUrl&&proxyStarted?`${dashboardHttpsUrl}/`:`${dashboardLocalUrl}/`,elapsedMs=(Bun.nanoseconds()-startTime)/1e6;console.log();console.log(` ${bold(cyan("stacks dashboard"))}`);console.log();if(dashboardHttpsUrl&&proxyStarted){console.log(` ${green("\u279C")} ${bold("Local")}: ${cyan(dashboardHttpsUrl)}`);console.log(` ${dim("\u279C")} ${dim("Origin")}: ${dim(dashboardLocalUrl)}`)}else{console.log(` ${green("\u279C")} ${bold("Local")}: ${cyan(dashboardLocalUrl)}`);if(dashboardHttpsUrl)console.log(` ${dim("\u279C")} ${dim("Pretty")}: ${dim(`${dashboardHttpsUrl} needs the rpx proxy - run \`buddy dev\``)}`)}console.log(` ${green("\u279C")} ${bold("Window")}: ${dim("Stacks Dashboard")} ${dim("1400\xD7900")}`);console.log(` ${green("\u279C")} ${bold("Models")}: ${dim(`${discoveredModels.length} discovered`)}`);if(dashboardPort!==preferredPort)console.log(` ${dim("\u279C")} ${dim(`Port ${preferredPort} in use, using ${dashboardPort}`)}`);if(!serverReady)console.log(` ${dim("\u26A0")} ${dim("Dev server may not be ready yet")}`);console.log();console.log(` ${dim(`ready in ${elapsedMs.toFixed(0)} ms`)}`);if(verbose){console.log();console.log(` ${dim("\u279C")} ${dim("URL")}: ${dim(initialUrl)}`);if(dashboardDomain){console.log(` ${dim("\u279C")} ${dim("SSL")}: ${dim(sslBasePath)}`);console.log(` ${dim("\u279C")} ${dim("Proxy")}: ${dim(`localhost:${dashboardPort} \u2192 ${dashboardDomain}`)}`)}if(bufferedLogs.length>0){console.log();for(const line of bufferedLogs)console.log(` ${dim(line)}`)}}console.log();let createApp,resolveCraftBinary;const nativeDisabled=process.env.STACKS_NO_NATIVE==="1",explicitCraftSdk=process.env.CRAFT_SDK_SRC;if(!nativeDisabled&&explicitCraftSdk){if(!existsSync(explicitCraftSdk))throw Error(`CRAFT_SDK_SRC not found: ${explicitCraftSdk}`);try{({createApp,resolveCraftBinary}=await import(explicitCraftSdk));if(!createApp||!resolveCraftBinary)throw Error("CRAFT_SDK_SRC must export createApp and resolveCraftBinary")}catch(error){throw Error(`Could not load CRAFT_SDK_SRC ${explicitCraftSdk}: ${error instanceof Error?error.message:String(error)}`)}}if(!nativeDisabled&&!explicitCraftSdk)try{({createApp,resolveCraftBinary}=await import("craft-native"))}catch{}const craftBinaryPath=createApp&&resolveCraftBinary?resolveDashboardCraftExecutable(resolveCraftBinary):void 0;if(createApp&&craftBinaryPath){const userIconPath=projectPath("resources/assets/images/app-icon.png"),defaultIconPath=defaultsPath("resources/assets/images/app-icon.png"),appIconPath=await Bun.file(userIconPath).exists()?userIconPath:await Bun.file(defaultIconPath).exists()?defaultIconPath:void 0,app=createApp({url:dashboardLocalUrl,quiet:!verbose,craftPath:craftBinaryPath,window:{title:"Stacks Dashboard",width:1400,height:900,titlebarHidden:!0,webSidebarMaterial:!0,webSidebarWidth:250,...appIconPath&&{icon:appIconPath}}});process.on("SIGINT",()=>{app.close();process.exit(0)});process.on("SIGTERM",()=>{app.close();process.exit(0)});try{await app.show();process.exit(0)}catch(error){const fallbackUrl=dashboardHttpsUrl||dashboardLocalUrl;console.log(` ${dim("Native Craft window failed:")} ${dim(error instanceof Error?error.message:String(error))}`);console.log(` ${dim("Dashboard available at:")} ${cyan(fallbackUrl)}
|
|
5
5
|
`);await new Promise(()=>{})}}else{console.log(` ${dim(nativeDisabled?"Native window disabled by STACKS_NO_NATIVE=1. Open the URL above in a browser.":"Native window unavailable. Run pantry install craft, set CRAFT_BIN, or open the URL above in a browser.")}
|
|
6
6
|
`);process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));await new Promise(()=>{})}
|
package/dist/dev/system-tray.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{homedir,networkInterfaces}from"node:os";import{basename,join}from"node:path";import process from"node:process";import{bold,cyan,dim,green}from"@stacksjs/cli";import{openDevWindow}from"@stacksjs/desktop-build";import{projectPath
|
|
2
|
-
`).trim(),exitCode}}function openPath(path){const command=process.platform==="darwin"?["open",path]:process.platform==="win32"?["cmd","/c","start","",path]:["xdg-open",path];Bun.spawn(command,{stdout:"ignore",stderr:"ignore"}).unref()}function openTerminal(project){const command=process.platform==="darwin"?["open","-a","Terminal",project]:process.platform==="win32"?["cmd","/c","start","cmd","/K",`cd /d ${project}`]:["x-terminal-emulator","--working-directory",project];Bun.spawn(command,{stdout:"ignore",stderr:"ignore"}).unref()}function localIpAddress(){for(const addresses of Object.values(networkInterfaces()))for(const address of addresses||[])if(address.family==="IPv4"&&!address.internal)return address.address;return"127.0.0.1"}function dashboardUrl(path=""){return`${hasPrettyDomain?`https://dashboard.${domain}`:`http://localhost:${Number(process.env.PORT_ADMIN)||3002}`}${path}`}async function handleAction(input){const projects=await discoverProjects(),project=input.project||projectPath();if(!projects.includes(project))return Response.json({ok:!1,error:"Unknown Stacks project"},{status:400});switch(input.action){case"refresh":return Response.json({ok:!0,projects:await discoverProjects(!0)});case"open-terminal":openTerminal(project);return Response.json({ok:!0,message:`Opened Terminal in ${basename(project)}`});case"env-check":{const result=await runBuddy(project,["doctor"]);return Response.json({ok:result.exitCode===0,...result})}case"settings":openPath(dashboardUrl("/settings"));return Response.json({ok:!0,message:"Opened dashboard settings"});case"check-updates":{const result=await runBuddy(project,["outdated"]);return Response.json({ok:result.exitCode===0,...result})}case"copy-ip":return Response.json({ok:!0,value:localIpAddress(),message:"IP address ready to copy"});case"open-dashboard":openPath(dashboardUrl());return Response.json({ok:!0,message:"Opened dashboard"});case"buddy-commands":{const result=await runBuddy(project,["list"]);return Response.json({ok:result.exitCode===0,...result})}case"deploy":{if(!input.confirmed)return Response.json({ok:!1,confirmationRequired:!0,error:"Deployment confirmation required"},{status:409});Bun.spawn([join(project,"buddy"),"deploy","--no-interaction"],{cwd:project,stdout:"inherit",stderr:"inherit"}).unref();return Response.json({ok:!0,message:`Deployment started for ${basename(project)}`})}case"deploy-logs":openPath(join(project,"storage/logs"));return Response.json({ok:!0,message:"Opened deployment logs"});case"site-logs":openPath(join(project,"storage/logs"));return Response.json({ok:!0,message:"Opened site logs"});case"error-logs":openPath(join(project,"storage/logs"));return Response.json({ok:!0,message:"Opened error logs"});case"edit-env":openPath(join(project,".env"));return Response.json({ok:!0,message:"Opened .env"});case"edit-dns":openPath(join(project,"config/dns.ts"));return Response.json({ok:!0,message:"Opened DNS configuration"});case"edit-email":openPath(join(project,"config/email.ts"));return Response.json({ok:!0,message:"Opened email configuration"});case"ask-buddy":openPath(dashboardUrl("/buddy"));return Response.json({ok:!0,message:"Opened Ask Buddy"});default:return Response.json({ok:!1,error:"Unknown tray action"},{status:400})}}const{serve}=await import("bun-plugin-stx/serve"),serverPromise=serve({patterns:[trayViews],port,componentsDir:
|
|
1
|
+
import{homedir,networkInterfaces}from"node:os";import{basename,join}from"node:path";import process from"node:process";import{bold,cyan,dim,green}from"@stacksjs/cli";import{openDevWindow}from"@stacksjs/desktop-build";import{defaultsPath,projectPath}from"@stacksjs/path";import{findStacksProjects}from"@stacksjs/utils";import{findAvailablePort,waitForServer}from"./dashboard-utils";const preferredPort=Number(process.env.PORT_SYSTEM_TRAY)||3009,port=await findAvailablePort(preferredPort),trayViews=defaultsPath("views/system-tray"),appUrl=process.env.APP_URL||"stacks.test",domain=appUrl.replace(/^https?:\/\//,"").replace(/\/$/,""),hasPrettyDomain=!domain.includes("localhost:")&&domain!=="localhost",trayDomain=hasPrettyDomain?`tray.${domain}`:null,localUrl=`http://localhost:${port}`;let cachedProjects;async function discoverProjects(refresh=!1){if(cachedProjects&&!refresh)return cachedProjects;const discovered=await findStacksProjects(join(homedir(),"Code"),{quiet:!0}).catch(()=>[]),candidates=[...new Set([projectPath(),...discovered])];cachedProjects=(await Promise.all(candidates.map(async(project)=>({project,valid:await Bun.file(join(project,"buddy")).exists()})))).filter((check)=>check.valid).map((check)=>check.project).sort((a,b)=>basename(a).localeCompare(basename(b)));return cachedProjects}async function runBuddy(project,args){const child=Bun.spawn([join(project,"buddy"),...args,"--no-interaction"],{cwd:project,stdout:"pipe",stderr:"pipe"}),[stdout,stderr,exitCode]=await Promise.all([new Response(child.stdout).text(),new Response(child.stderr).text(),child.exited]);return{output:[stdout,stderr].filter(Boolean).join(`
|
|
2
|
+
`).trim(),exitCode}}function openPath(path){const command=process.platform==="darwin"?["open",path]:process.platform==="win32"?["cmd","/c","start","",path]:["xdg-open",path];Bun.spawn(command,{stdout:"ignore",stderr:"ignore"}).unref()}function openTerminal(project){const command=process.platform==="darwin"?["open","-a","Terminal",project]:process.platform==="win32"?["cmd","/c","start","cmd","/K",`cd /d ${project}`]:["x-terminal-emulator","--working-directory",project];Bun.spawn(command,{stdout:"ignore",stderr:"ignore"}).unref()}function localIpAddress(){for(const addresses of Object.values(networkInterfaces()))for(const address of addresses||[])if(address.family==="IPv4"&&!address.internal)return address.address;return"127.0.0.1"}function dashboardUrl(path=""){return`${hasPrettyDomain?`https://dashboard.${domain}`:`http://localhost:${Number(process.env.PORT_ADMIN)||3002}`}${path}`}async function handleAction(input){const projects=await discoverProjects(),project=input.project||projectPath();if(!projects.includes(project))return Response.json({ok:!1,error:"Unknown Stacks project"},{status:400});switch(input.action){case"refresh":return Response.json({ok:!0,projects:await discoverProjects(!0)});case"open-terminal":openTerminal(project);return Response.json({ok:!0,message:`Opened Terminal in ${basename(project)}`});case"env-check":{const result=await runBuddy(project,["doctor"]);return Response.json({ok:result.exitCode===0,...result})}case"settings":openPath(dashboardUrl("/settings"));return Response.json({ok:!0,message:"Opened dashboard settings"});case"check-updates":{const result=await runBuddy(project,["outdated"]);return Response.json({ok:result.exitCode===0,...result})}case"copy-ip":return Response.json({ok:!0,value:localIpAddress(),message:"IP address ready to copy"});case"open-dashboard":openPath(dashboardUrl());return Response.json({ok:!0,message:"Opened dashboard"});case"buddy-commands":{const result=await runBuddy(project,["list"]);return Response.json({ok:result.exitCode===0,...result})}case"deploy":{if(!input.confirmed)return Response.json({ok:!1,confirmationRequired:!0,error:"Deployment confirmation required"},{status:409});Bun.spawn([join(project,"buddy"),"deploy","--no-interaction"],{cwd:project,stdout:"inherit",stderr:"inherit"}).unref();return Response.json({ok:!0,message:`Deployment started for ${basename(project)}`})}case"deploy-logs":openPath(join(project,"storage/logs"));return Response.json({ok:!0,message:"Opened deployment logs"});case"site-logs":openPath(join(project,"storage/logs"));return Response.json({ok:!0,message:"Opened site logs"});case"error-logs":openPath(join(project,"storage/logs"));return Response.json({ok:!0,message:"Opened error logs"});case"edit-env":openPath(join(project,".env"));return Response.json({ok:!0,message:"Opened .env"});case"edit-dns":openPath(join(project,"config/dns.ts"));return Response.json({ok:!0,message:"Opened DNS configuration"});case"edit-email":openPath(join(project,"config/email.ts"));return Response.json({ok:!0,message:"Opened email configuration"});case"ask-buddy":openPath(dashboardUrl("/buddy"));return Response.json({ok:!0,message:"Opened Ask Buddy"});default:return Response.json({ok:!1,error:"Unknown tray action"},{status:400})}}const{serve}=await import("bun-plugin-stx/serve"),serverPromise=serve({patterns:[trayViews],port,componentsDir:defaultsPath("resources/components"),quiet:!0,auth:!1,routes:{"/api/tray/projects":async()=>Response.json({ok:!0,projects:await discoverProjects()}),"/api/tray/action":async(request)=>{if(request.method!=="POST")return Response.json({ok:!1,error:"Method not allowed"},{status:405});return handleAction(await request.json())}}});serverPromise.catch((error)=>{console.error(`System tray server failed: ${error.message}`);process.exit(1)});let proxyStarted=!1;if(trayDomain&&!process.env.STACKS_PROXY_MANAGED)try{const{startProxies}=await import("@stacksjs/rpx");await startProxies({proxies:[{from:`localhost:${port}`,to:trayDomain,cleanUrls:!1}],https:{basePath:`${process.env.HOME}/.stacks/ssl`,validityDays:825},regenerateUntrustedCerts:!1});proxyStarted=!0}catch{proxyStarted=!1}await waitForServer(port,2000);const url=trayDomain&&proxyStarted?`https://${trayDomain}`:localUrl;console.log();console.log(` ${bold(cyan("stacks tray"))}`);console.log();console.log(` ${green("\u279C")} ${bold("Local")}: ${cyan(url)}`);if(trayDomain)console.log(` ${dim("\u279C")} ${dim("Origin")}: ${dim(localUrl)}`);console.log();await openDevWindow(port,{url,title:"Stacks",width:440,height:680,systemTray:!0,hideDockIcon:!0,hotReload:!0});const stop=()=>{process.exit(0)};process.on("SIGINT",stop);process.on("SIGTERM",stop);await new Promise(()=>{});
|
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export type { RouteActionReference } from './upgrade/route-actions';
|
|
|
5
5
|
export type { ProjectStructureChange } from './upgrade/package-project';
|
|
6
6
|
export type { CrudField } from './scaffold-crud';
|
|
7
7
|
export type { DiscoveredPackagesManifest, PackageStacksMeta } from './discover-packages';
|
|
8
|
+
export type { ResolveStxSourceOptions, StxSource } from './stx-source';
|
|
8
9
|
export * from './action';
|
|
9
10
|
export { add as runAdd } from './add';
|
|
10
11
|
// The write side of the markdown blog (content/blog/*.md), used by the
|
|
@@ -83,3 +84,4 @@ export { makeJob } from './make-job';
|
|
|
83
84
|
export { makeCommand } from './make-command';
|
|
84
85
|
export { makePolicy } from './make-policy';
|
|
85
86
|
export { makeResource } from './make-resource';
|
|
87
|
+
export { resolveStxSource } from './stx-source';
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{setActionRunner}from"@stacksjs/action-runner";import{runAction}from"./helpers";setActionRunner((action,options)=>runAction(action,options));export*from"./action";export{add as runAdd}from"./add";export{BlogAdminError,deleteBlogPost,getBlogPost,listBlogPosts,saveBlogPost,slugify as blogSlugify}from"./blog-admin";export{commit as runCommit}from"./commit";export*from"./dev";export*from"./generate";export*from"./helpers";export*from"./library";export{formatProject,lintFix,lintProject}from"./lint/lint";export{describeGitHubRelease,parseGitHubRemote,publishGitHubRelease}from"./github-release";export{DEFAULT_IOS_DEPENDENCIES,IosToolchainError,loadIosDependencies,pantryExecutable,pantryInstallArgs,resolveXcodegen,XCODE_NOTE,xcodeDeveloperDir}from"./build/ios-toolchain";export{DEFAULT_STX_LINT_CONFIG,loadStxLintConfig,runStxLint}from"./lint/stx-gate";export{measureDefaultsDrift,summarizeStructureChanges}from"./upgrade/package-project";export{describeDanglingRouteActions,findDanglingRouteActions}from"./upgrade/route-actions";export*from"./setup";export{createComponent,createDatabase,createFactory,createFunction,createLanguage,createMiddleware,createMigration,createModel,createMail,createNotification,createPage,isDryRunActive,makeAction,makeCertificate,makeComponent,makeDatabase,makeFunction,makeLanguage,makeMail,makeNotification,makePage,makeQueueTable,makeStack,make as runMake,setDryRun}from"./make";export{discoverPackages,ensureDiscoveredPackages}from"./discover-packages";export{parseFields,scaffoldCrud}from"./scaffold-crud";export{installStack,uninstallStack,listStacks}from"./stacks";export{makeJob}from"./make-job";export{makeCommand}from"./make-command";export{makePolicy}from"./make-policy";export{makeResource}from"./make-resource";
|
|
1
|
+
import{setActionRunner}from"@stacksjs/action-runner";import{runAction}from"./helpers";setActionRunner((action,options)=>runAction(action,options));export*from"./action";export{add as runAdd}from"./add";export{BlogAdminError,deleteBlogPost,getBlogPost,listBlogPosts,saveBlogPost,slugify as blogSlugify}from"./blog-admin";export{commit as runCommit}from"./commit";export*from"./dev";export*from"./generate";export*from"./helpers";export*from"./library";export{formatProject,lintFix,lintProject}from"./lint/lint";export{describeGitHubRelease,parseGitHubRemote,publishGitHubRelease}from"./github-release";export{DEFAULT_IOS_DEPENDENCIES,IosToolchainError,loadIosDependencies,pantryExecutable,pantryInstallArgs,resolveXcodegen,XCODE_NOTE,xcodeDeveloperDir}from"./build/ios-toolchain";export{DEFAULT_STX_LINT_CONFIG,loadStxLintConfig,runStxLint}from"./lint/stx-gate";export{measureDefaultsDrift,summarizeStructureChanges}from"./upgrade/package-project";export{describeDanglingRouteActions,findDanglingRouteActions}from"./upgrade/route-actions";export*from"./setup";export{createComponent,createDatabase,createFactory,createFunction,createLanguage,createMiddleware,createMigration,createModel,createMail,createNotification,createPage,isDryRunActive,makeAction,makeCertificate,makeComponent,makeDatabase,makeFunction,makeLanguage,makeMail,makeNotification,makePage,makeQueueTable,makeStack,make as runMake,setDryRun}from"./make";export{discoverPackages,ensureDiscoveredPackages}from"./discover-packages";export{parseFields,scaffoldCrud}from"./scaffold-crud";export{installStack,uninstallStack,listStacks}from"./stacks";export{makeJob}from"./make-job";export{makeCommand}from"./make-command";export{makePolicy}from"./make-policy";export{makeResource}from"./make-resource";export{resolveStxSource}from"./stx-source";
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export declare function resolveStxSource(options: ResolveStxSourceOptions): StxSource;
|
|
2
|
+
export declare interface ResolveStxSourceOptions {
|
|
3
|
+
value: string | undefined
|
|
4
|
+
exists?: (path: string) => boolean
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Which copy of stx the production server should render through.
|
|
8
|
+
*
|
|
9
|
+
* The answer is "the installed dependency" unless an operator names another
|
|
10
|
+
* one by path. It used to be "a hardcoded worktree under `~/Code`, else the
|
|
11
|
+
* project's `pantry/` directory, else the installed dependency", chosen
|
|
12
|
+
* silently and in that order.
|
|
13
|
+
*
|
|
14
|
+
* That inverted the thing a deployment depends on: an untracked directory
|
|
15
|
+
* outranked the declared dependency in the server that answers real traffic.
|
|
16
|
+
* stacksjs/stacks#2369 is what it cost - an app on `bun-plugin-stx@0.2.231`
|
|
17
|
+
* served every page through a `pantry/bun-plugin-stx@0.2.76` copy from four
|
|
18
|
+
* months earlier, which predates the page-response read-back added in 0.2.219.
|
|
19
|
+
* Pages calling `notFound()` recorded a 404 that nothing read, so deleted
|
|
20
|
+
* pages answered 200 with their own not-found body.
|
|
21
|
+
*
|
|
22
|
+
* Kept in its own module so the rule can be tested without binding a port.
|
|
23
|
+
*/
|
|
24
|
+
export type StxSource = | { kind: 'installed' }
|
|
25
|
+
/** Use the file the operator named, which is present. */
|
|
26
|
+
| { kind: 'override', path: string }
|
|
27
|
+
/** The operator named a file that is not there. Refuse rather than guess. */
|
|
28
|
+
| { kind: 'missing', path: string }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{existsSync}from"node:fs";export function resolveStxSource(options){const exists=options.exists??existsSync,path=options.value?.trim();if(!path)return{kind:"installed"};return exists(path)?{kind:"override",path}:{kind:"missing",path}}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@stacksjs/actions",
|
|
3
3
|
"type": "module",
|
|
4
4
|
"sideEffects": false,
|
|
5
|
-
"version": "0.75.
|
|
5
|
+
"version": "0.75.256",
|
|
6
6
|
"description": "The Stacks actions.",
|
|
7
7
|
"author": "Chris Breuer",
|
|
8
8
|
"contributors": [
|
|
@@ -66,54 +66,54 @@
|
|
|
66
66
|
"prepublishOnly": "bun run build"
|
|
67
67
|
},
|
|
68
68
|
"dependencies": {
|
|
69
|
-
"@stacksjs/action-runner": "0.75.
|
|
70
|
-
"@stacksjs/ai": "0.75.
|
|
71
|
-
"@stacksjs/analytics": "0.75.
|
|
72
|
-
"@stacksjs/api": "0.75.
|
|
73
|
-
"@stacksjs/auth": "0.75.
|
|
74
|
-
"@stacksjs/build": "0.75.
|
|
69
|
+
"@stacksjs/action-runner": "0.75.256",
|
|
70
|
+
"@stacksjs/ai": "0.75.256",
|
|
71
|
+
"@stacksjs/analytics": "0.75.256",
|
|
72
|
+
"@stacksjs/api": "0.75.256",
|
|
73
|
+
"@stacksjs/auth": "0.75.256",
|
|
74
|
+
"@stacksjs/build": "0.75.256",
|
|
75
75
|
"@stacksjs/bumpx": "^0.2.25",
|
|
76
76
|
"@stacksjs/bunpress": "^0.2.15",
|
|
77
|
-
"@stacksjs/cli": "0.75.
|
|
78
|
-
"@stacksjs/cloud": "0.75.
|
|
79
|
-
"@stacksjs/cms": "0.75.
|
|
77
|
+
"@stacksjs/cli": "0.75.256",
|
|
78
|
+
"@stacksjs/cloud": "0.75.256",
|
|
79
|
+
"@stacksjs/cms": "0.75.256",
|
|
80
80
|
"@stacksjs/components": "^0.2.631",
|
|
81
|
-
"@stacksjs/config": "0.75.
|
|
82
|
-
"@stacksjs/database": "0.75.
|
|
83
|
-
"@stacksjs/desktop-build": "0.75.
|
|
84
|
-
"@stacksjs/dns": "0.75.
|
|
85
|
-
"@stacksjs/enums": "0.75.
|
|
86
|
-
"@stacksjs/env": "0.75.
|
|
87
|
-
"@stacksjs/error-handling": "0.75.
|
|
88
|
-
"@stacksjs/github": "0.75.
|
|
81
|
+
"@stacksjs/config": "0.75.256",
|
|
82
|
+
"@stacksjs/database": "0.75.256",
|
|
83
|
+
"@stacksjs/desktop-build": "0.75.256",
|
|
84
|
+
"@stacksjs/dns": "0.75.256",
|
|
85
|
+
"@stacksjs/enums": "0.75.256",
|
|
86
|
+
"@stacksjs/env": "0.75.256",
|
|
87
|
+
"@stacksjs/error-handling": "0.75.256",
|
|
88
|
+
"@stacksjs/github": "0.75.256",
|
|
89
89
|
"@stacksjs/gitit": "^0.2.5",
|
|
90
|
-
"@stacksjs/i18n": "0.75.
|
|
91
|
-
"@stacksjs/image": "0.75.
|
|
92
|
-
"@stacksjs/logging": "0.75.
|
|
90
|
+
"@stacksjs/i18n": "0.75.256",
|
|
91
|
+
"@stacksjs/image": "0.75.256",
|
|
92
|
+
"@stacksjs/logging": "0.75.256",
|
|
93
93
|
"@stacksjs/logsmith": "^0.2.11",
|
|
94
|
-
"@stacksjs/mobile": "0.75.
|
|
95
|
-
"@stacksjs/orm": "0.75.
|
|
96
|
-
"@stacksjs/path": "0.75.
|
|
97
|
-
"@stacksjs/payments": "0.75.
|
|
98
|
-
"@stacksjs/queue": "0.75.
|
|
99
|
-
"@stacksjs/registry": "0.75.
|
|
100
|
-
"@stacksjs/router": "0.75.
|
|
94
|
+
"@stacksjs/mobile": "0.75.256",
|
|
95
|
+
"@stacksjs/orm": "0.75.256",
|
|
96
|
+
"@stacksjs/path": "0.75.256",
|
|
97
|
+
"@stacksjs/payments": "0.75.256",
|
|
98
|
+
"@stacksjs/queue": "0.75.256",
|
|
99
|
+
"@stacksjs/registry": "0.75.256",
|
|
100
|
+
"@stacksjs/router": "0.75.256",
|
|
101
101
|
"@stacksjs/rpx": "^0.11.54",
|
|
102
|
-
"@stacksjs/scheduler": "0.75.
|
|
103
|
-
"@stacksjs/search-engine": "0.75.
|
|
104
|
-
"@stacksjs/security": "0.75.
|
|
105
|
-
"@stacksjs/server": "0.75.
|
|
106
|
-
"@stacksjs/sites": "0.75.
|
|
107
|
-
"@stacksjs/storage": "0.75.
|
|
108
|
-
"@stacksjs/strings": "0.75.
|
|
102
|
+
"@stacksjs/scheduler": "0.75.256",
|
|
103
|
+
"@stacksjs/search-engine": "0.75.256",
|
|
104
|
+
"@stacksjs/security": "0.75.256",
|
|
105
|
+
"@stacksjs/server": "0.75.256",
|
|
106
|
+
"@stacksjs/sites": "0.75.256",
|
|
107
|
+
"@stacksjs/storage": "0.75.256",
|
|
108
|
+
"@stacksjs/strings": "0.75.256",
|
|
109
109
|
"@stacksjs/stx": "^0.2.631",
|
|
110
110
|
"@stacksjs/tlsx": "^0.13.19",
|
|
111
111
|
"@stacksjs/ts-cloud": "^0.16.58",
|
|
112
112
|
"@stacksjs/ts-md": "^0.1.1",
|
|
113
|
-
"@stacksjs/tunnel": "0.75.
|
|
114
|
-
"@stacksjs/types": "0.75.
|
|
115
|
-
"@stacksjs/utils": "0.75.
|
|
116
|
-
"@stacksjs/whois": "0.75.
|
|
113
|
+
"@stacksjs/tunnel": "0.75.256",
|
|
114
|
+
"@stacksjs/types": "0.75.256",
|
|
115
|
+
"@stacksjs/utils": "0.75.256",
|
|
116
|
+
"@stacksjs/whois": "0.75.256",
|
|
117
117
|
"bun-plugin-stx": "^0.2.631"
|
|
118
118
|
},
|
|
119
119
|
"peerDependencies": {
|
|
@@ -129,7 +129,7 @@
|
|
|
129
129
|
}
|
|
130
130
|
},
|
|
131
131
|
"devDependencies": {
|
|
132
|
-
"@stacksjs/validation": "0.75.
|
|
132
|
+
"@stacksjs/validation": "0.75.256",
|
|
133
133
|
"better-dx": "^0.2.24"
|
|
134
134
|
}
|
|
135
135
|
}
|