@stacksjs/actions 0.74.63 → 0.74.65

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/blog.js CHANGED
@@ -1,4 +1,4 @@
1
- import{existsSync,mkdirSync,readdirSync,readFileSync,writeFileSync}from"node:fs";import{homedir}from"node:os";import{join}from"node:path";const CONTENT_DIR=join(process.cwd(),"content/blog"),THEME_FILE=join(CONTENT_DIR,".theme.css"),STACKS_DEFAULTS={title:"The Stacks Blog",description:"Notes from building a full-stack TypeScript framework whose only dependencies are TypeScript and Bun.",siteTitle:"Stacks Blog",author:"The Stacks Team",url:"https://stacksjs.com",nav:[{text:"Blog",link:"/blog"},{text:"Docs",link:"/docs"},{text:"GitHub",link:"https://github.com/stacksjs/stacks"}],themes:["colored","light","dark"],defaultTheme:"colored",colophon:'Built with Stacks \xB7 TypeScript &amp; Bun \xB7 <a href="/blog/feed.xml">RSS</a>',emptyTitle:"No posts yet",emptyText:"The first one is in the works. Leave your email and it will land in your inbox the moment it ships."};let sitePromise=null;function site(){if(!sitePromise)sitePromise=(async()=>{try{const cfg=(await import(join(process.cwd(),"config/blog.ts"))).default??{},merged={...STACKS_DEFAULTS,...cfg};if(!cfg.siteTitle&&cfg.title)merged.siteTitle=cfg.title;return merged}catch{return STACKS_DEFAULTS}})();return sitePromise}let bunpressPromise=null;async function loadBunPress(){if(!bunpressPromise)bunpressPromise=(async()=>{const candidates=[join(homedir(),"Code/Tools/bunpress/packages/bunpress/dist/src/index.js"),join(process.cwd(),"pantry/@stacksjs/bunpress/dist/src/index.js")].filter((entry)=>existsSync(entry));try{candidates.push(Bun.resolveSync("@stacksjs/bunpress",import.meta.dir))}catch{}for(const entry of new Set(candidates))try{return await import(entry)}catch(cause){const detail=cause instanceof Error?cause.message:String(cause);throw Error(`[blog] Failed to import BunPress from ${entry}: ${detail}`,{cause})}return null})();return bunpressPromise}function escapeHtml(s){return String(s).replace(/[&<>"]/g,(c)=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[c])}function escapeXml(s){return String(s).replace(/[&<>"']/g,(c)=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&apos;"})[c])}export function usableOrigin(value){if(!value)return"";try{const url=new URL(/^https?:\/\//.test(value)?value:`https://${value}`);if(url.protocol!=="http:"&&url.protocol!=="https:")return"";if(!url.hostname.includes(".")||!/^[a-z0-9.-]+$/i.test(url.hostname))return"";return url.origin}catch{return""}}function postUrl(baseUrl,slug){return`${baseUrl.replace(/\/$/,"")}/blog/${slug}`}function rssDate(date){if(!date)return"";const parsed=new Date(date);return Number.isNaN(parsed.getTime())?date:parsed.toUTCString()}async function fallbackFeedXml(baseUrl){const cfg=await site(),origin=usableOrigin(baseUrl)||usableOrigin(cfg.url)||cfg.url,items=listPosts().slice(0,50).map((p)=>{const url=postUrl(origin,p.slug);return` <item>
1
+ import{existsSync,mkdirSync,readdirSync,readFileSync,writeFileSync}from"node:fs";import{homedir}from"node:os";import{join}from"node:path";const CONTENT_DIR=join(process.cwd(),"content/blog"),THEME_FILE=join(CONTENT_DIR,".theme.css");function blogDefaults(){const appName=(process.env.APP_NAME||"").trim(),appUrl=(process.env.APP_URL||"").trim().replace(/\/+$/,""),title=appName?`${appName} Blog`:"Blog";return{title,description:"",siteTitle:title,author:appName,url:appUrl&&!/^https?:\/\//.test(appUrl)?`https://${appUrl}`:appUrl,nav:[{text:"Home",link:"/"},{text:"Blog",link:"/blog"}],themes:["colored","light","dark"],defaultTheme:"colored",colophon:'<a href="/blog/feed.xml">RSS</a>',emptyTitle:"No posts yet",emptyText:"The first one is in the works. Leave your email and it will land in your inbox the moment it ships."}}let sitePromise=null;function site(){if(!sitePromise)sitePromise=(async()=>{try{const cfg=(await import(join(process.cwd(),"config/blog.ts"))).default??{},merged={...blogDefaults(),...cfg};if(!cfg.siteTitle&&cfg.title)merged.siteTitle=cfg.title;return merged}catch{return blogDefaults()}})();return sitePromise}let bunpressPromise=null;async function loadBunPress(){if(!bunpressPromise)bunpressPromise=(async()=>{const candidates=[join(homedir(),"Code/Tools/bunpress/packages/bunpress/dist/src/index.js"),join(process.cwd(),"pantry/@stacksjs/bunpress/dist/src/index.js")].filter((entry)=>existsSync(entry));try{candidates.push(Bun.resolveSync("@stacksjs/bunpress",import.meta.dir))}catch{}for(const entry of new Set(candidates))try{return await import(entry)}catch(cause){const detail=cause instanceof Error?cause.message:String(cause);throw Error(`[blog] Failed to import BunPress from ${entry}: ${detail}`,{cause})}return null})();return bunpressPromise}function escapeHtml(s){return String(s).replace(/[&<>"]/g,(c)=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[c])}function escapeXml(s){return String(s).replace(/[&<>"']/g,(c)=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&apos;"})[c])}export function usableOrigin(value){if(!value)return"";try{const url=new URL(/^https?:\/\//.test(value)?value:`https://${value}`);if(url.protocol!=="http:"&&url.protocol!=="https:")return"";if(!url.hostname.includes(".")||!/^[a-z0-9.-]+$/i.test(url.hostname))return"";return url.origin}catch{return""}}function postUrl(baseUrl,slug){return`${baseUrl.replace(/\/$/,"")}/blog/${slug}`}function rssDate(date){if(!date)return"";const parsed=new Date(date);return Number.isNaN(parsed.getTime())?date:parsed.toUTCString()}async function fallbackFeedXml(baseUrl){const cfg=await site(),origin=usableOrigin(baseUrl)||usableOrigin(cfg.url)||cfg.url,items=listPosts().slice(0,50).map((p)=>{const url=postUrl(origin,p.slug);return` <item>
2
2
  <title>${escapeXml(p.fm.title||p.slug)}</title>
3
3
  <link>${escapeXml(url)}</link>
4
4
  <guid>${escapeXml(url)}</guid>
@@ -19,7 +19,7 @@ ${items}
19
19
  ${[`${origin}/blog`,...listPosts().map((p)=>postUrl(origin,p.slug))].map((url)=>` <url><loc>${escapeXml(url)}</loc></url>`).join(`
20
20
  `)}
21
21
  </urlset>`}function parseFrontmatter(md){const m=md.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);if(!m)return{data:{},body:md};const data={},frontmatter=m[1]??"";for(const line of frontmatter.split(`
22
- `)){const i=line.indexOf(":");if(i===-1)continue;const key=line.slice(0,i).trim();let val=line.slice(i+1).trim();if(val.startsWith('"')&&val.endsWith('"')||val.startsWith("'")&&val.endsWith("'"))val=val.slice(1,-1);data[key]=val}return{data,body:m[2]??""}}function formatDate(d){if(!d)return"";const date=new Date(d);if(Number.isNaN(date.getTime()))return d;return`${["January","February","March","April","May","June","July","August","September","October","November","December"][date.getUTCMonth()]} ${date.getUTCDate()}, ${date.getUTCFullYear()}`}const THEME_BUTTONS={colored:{label:"Glacier theme",glyph:"\uD83C\uDF32"},light:{label:"Light theme",glyph:"\u2600"},dark:{label:"Dark theme",glyph:"\uD83C\uDF19"}};async function blogChrome(){const cfg=await site(),modes=cfg.themes.length?cfg.themes:STACKS_DEFAULTS.themes,fallback=modes.includes(cfg.defaultTheme)?cfg.defaultTheme:modes[0],buttons=modes.map((m)=>`<button type="button" data-t="${m}" title="${THEME_BUTTONS[m].label}" aria-label="${THEME_BUTTONS[m].label}" onclick="stxBlogTheme('${m}')">${THEME_BUTTONS[m].glyph}</button>`).join(`
22
+ `)){const i=line.indexOf(":");if(i===-1)continue;const key=line.slice(0,i).trim();let val=line.slice(i+1).trim();if(val.startsWith('"')&&val.endsWith('"')||val.startsWith("'")&&val.endsWith("'"))val=val.slice(1,-1);data[key]=val}return{data,body:m[2]??""}}function formatDate(d){if(!d)return"";const date=new Date(d);if(Number.isNaN(date.getTime()))return d;return`${["January","February","March","April","May","June","July","August","September","October","November","December"][date.getUTCMonth()]} ${date.getUTCDate()}, ${date.getUTCFullYear()}`}const THEME_BUTTONS={colored:{label:"Glacier theme",glyph:"\uD83C\uDF32"},light:{label:"Light theme",glyph:"\u2600"},dark:{label:"Dark theme",glyph:"\uD83C\uDF19"}};async function blogChrome(){const cfg=await site(),modes=cfg.themes.length?cfg.themes:blogDefaults().themes,fallback=modes.includes(cfg.defaultTheme)?cfg.defaultTheme:modes[0],buttons=modes.map((m)=>`<button type="button" data-t="${m}" title="${THEME_BUTTONS[m].label}" aria-label="${THEME_BUTTONS[m].label}" onclick="stxBlogTheme('${m}')">${THEME_BUTTONS[m].glyph}</button>`).join(`
23
23
  `),toggle=modes.length>1?`<div class="blog-theme-toggle" role="group" aria-label="Theme">
24
24
  ${buttons}
25
25
  </div>`:"";return`<script>
@@ -1,4 +1,4 @@
1
1
  import process from"node:process";import{log}from"@stacksjs/logging";import{FailedJob}from"@stacksjs/orm";const options=parseArgs(),{queue:queueName,since:sinceArg}=options,sinceCutoff=sinceArg?parseSinceDuration(sinceArg):null;try{log.info(`Fetching failed jobs...
2
- `);let failedJobs;if(queueName)failedJobs=await FailedJob.where("queue",queueName).get();else failedJobs=await FailedJob.all();if(sinceCutoff)failedJobs=failedJobs.filter((j)=>{if(!j.failed_at)return!1;const ts=Date.parse(j.failed_at);return Number.isFinite(ts)&&ts>=sinceCutoff});if(failedJobs.length===0){if(sinceCutoff)console.log(`\u2713 No failed jobs found since ${sinceArg}`);else console.log("\u2713 No failed jobs found");process.exit(0)}console.log("\u250C\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510");console.log("\u2502 ID \u2502 Queue \u2502 Failed At \u2502 Exception \u2502");console.log("\u251C\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524");for(const job of failedJobs){const id=String(job.id).padEnd(3),queue=(job.queue||"default").substring(0,48).padEnd(48),failedAt=(job.failed_at||"N/A").substring(0,21).padEnd(21),exception=(job.exception||"Unknown error").substring(0,31).padEnd(31);console.log(`\u2502 ${id} \u2502 ${queue} \u2502 ${failedAt} \u2502 ${exception} \u2502`)}console.log("\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518");console.log(`
2
+ `);let failedJobs;if(queueName)failedJobs=await FailedJob.where("queue",queueName).get();else failedJobs=await FailedJob.all();if(sinceCutoff)failedJobs=failedJobs.filter((j)=>{if(!j.failed_at)return!1;const ts=Date.parse(j.failed_at);return Number.isFinite(ts)&&ts>=sinceCutoff});if(failedJobs.length===0){if(sinceCutoff)console.log(`\u2713 No failed jobs found since ${sinceArg}`);else console.log("\u2713 No failed jobs found");process.exit(0)}console.log("\u250C\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510");console.log("\u2502 ID \u2502 Queue \u2502 Failed At \u2502 Exception \u2502");console.log("\u251C\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524");for(const job of failedJobs){const id=String(job.id).padEnd(3),queue=(job.queue||"default").substring(0,48).padEnd(48),failedAt=String(job.failed_at||"N/A").substring(0,21).padEnd(21),exception=String(job.exception||"Unknown error").substring(0,31).padEnd(31);console.log(`\u2502 ${id} \u2502 ${queue} \u2502 ${failedAt} \u2502 ${exception} \u2502`)}console.log("\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518");console.log(`
3
3
  Total: ${failedJobs.length} failed job(s)`);process.exit(0)}catch(error){const message=error instanceof Error?error.message:String(error);if(/no such table:\s*(?:jobs|failed_jobs)\b/i.test(message)){process.stdout.write(`Queue tables are not set up yet.
4
4
  `);process.stdout.write("Run `buddy queue:table` to create the migrations, then `buddy migrate` to apply them.\n");process.exit(0)}await log.error("Failed to fetch failed jobs",error);process.exit(1)}function parseArgs(){const args={};process.argv.forEach((arg)=>{if(arg.startsWith("--")){const[key,value]=arg.slice(2).split("=");if(key&&value)args[key]=value}});return args}function parseSinceDuration(input){const m=/^(\d+)([smhd])$/.exec(input.trim());if(!m)return null;const n=Number(m[1]);if(!Number.isFinite(n)||n<=0)return null;const mult=m[2]==="s"?1000:m[2]==="m"?60000:m[2]==="h"?3600000:86400000;return Date.now()-n*mult}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@stacksjs/actions",
3
3
  "type": "module",
4
4
  "sideEffects": false,
5
- "version": "0.74.63",
5
+ "version": "0.74.65",
6
6
  "description": "The Stacks actions.",
7
7
  "author": "Chris Breuer",
8
8
  "contributors": [
@@ -60,53 +60,53 @@
60
60
  "prepublishOnly": "bun run build"
61
61
  },
62
62
  "dependencies": {
63
- "@stacksjs/action-runner": "0.74.63",
64
- "@stacksjs/ai": "0.74.63",
65
- "@stacksjs/analytics": "0.74.63",
66
- "@stacksjs/api": "0.74.63",
67
- "@stacksjs/auth": "0.74.63",
68
- "@stacksjs/build": "0.74.63",
63
+ "@stacksjs/action-runner": "0.74.65",
64
+ "@stacksjs/ai": "0.74.65",
65
+ "@stacksjs/analytics": "0.74.65",
66
+ "@stacksjs/api": "0.74.65",
67
+ "@stacksjs/auth": "0.74.65",
68
+ "@stacksjs/build": "0.74.65",
69
69
  "@stacksjs/bumpx": "^0.2.6",
70
70
  "@stacksjs/bunpress": "^0.2.8",
71
- "@stacksjs/cli": "0.74.63",
72
- "@stacksjs/cloud": "0.74.63",
73
- "@stacksjs/cms": "0.74.63",
74
- "@stacksjs/components": "^0.2.246",
75
- "@stacksjs/config": "0.74.63",
76
- "@stacksjs/database": "0.74.63",
77
- "@stacksjs/desktop-build": "0.74.63",
78
- "@stacksjs/dns": "0.74.63",
79
- "@stacksjs/enums": "0.74.63",
80
- "@stacksjs/env": "0.74.63",
81
- "@stacksjs/error-handling": "0.74.63",
71
+ "@stacksjs/cli": "0.74.65",
72
+ "@stacksjs/cloud": "0.74.65",
73
+ "@stacksjs/cms": "0.74.65",
74
+ "@stacksjs/components": "^0.2.306",
75
+ "@stacksjs/config": "0.74.65",
76
+ "@stacksjs/database": "0.74.65",
77
+ "@stacksjs/desktop-build": "0.74.65",
78
+ "@stacksjs/dns": "0.74.65",
79
+ "@stacksjs/enums": "0.74.65",
80
+ "@stacksjs/env": "0.74.65",
81
+ "@stacksjs/error-handling": "0.74.65",
82
82
  "@stacksjs/gitit": "^0.2.5",
83
- "@stacksjs/i18n": "0.74.63",
84
- "@stacksjs/image": "0.74.63",
85
- "@stacksjs/logging": "0.74.63",
83
+ "@stacksjs/i18n": "0.74.65",
84
+ "@stacksjs/image": "0.74.65",
85
+ "@stacksjs/logging": "0.74.65",
86
86
  "@stacksjs/logsmith": "^0.2.3",
87
- "@stacksjs/orm": "0.74.63",
88
- "@stacksjs/path": "0.74.63",
89
- "@stacksjs/payments": "0.74.63",
90
- "@stacksjs/queue": "0.74.63",
91
- "@stacksjs/registry": "0.74.63",
92
- "@stacksjs/router": "0.74.63",
87
+ "@stacksjs/orm": "0.74.65",
88
+ "@stacksjs/path": "0.74.65",
89
+ "@stacksjs/payments": "0.74.65",
90
+ "@stacksjs/queue": "0.74.65",
91
+ "@stacksjs/registry": "0.74.65",
92
+ "@stacksjs/router": "0.74.65",
93
93
  "@stacksjs/rpx": "^0.11.54",
94
- "@stacksjs/scheduler": "0.74.63",
95
- "@stacksjs/search-engine": "0.74.63",
96
- "@stacksjs/security": "0.74.63",
97
- "@stacksjs/server": "0.74.63",
98
- "@stacksjs/sites": "0.74.63",
99
- "@stacksjs/storage": "0.74.63",
100
- "@stacksjs/strings": "0.74.63",
101
- "@stacksjs/stx": "^0.2.286",
94
+ "@stacksjs/scheduler": "0.74.65",
95
+ "@stacksjs/search-engine": "0.74.65",
96
+ "@stacksjs/security": "0.74.65",
97
+ "@stacksjs/server": "0.74.65",
98
+ "@stacksjs/sites": "0.74.65",
99
+ "@stacksjs/storage": "0.74.65",
100
+ "@stacksjs/strings": "0.74.65",
101
+ "@stacksjs/stx": "^0.2.306",
102
102
  "@stacksjs/tlsx": "^0.13.19",
103
- "@stacksjs/ts-cloud": "^0.16.0",
103
+ "@stacksjs/ts-cloud": "^0.16.11",
104
104
  "@stacksjs/ts-md": "^0.1.1",
105
- "@stacksjs/tunnel": "0.74.63",
106
- "@stacksjs/types": "0.74.63",
107
- "@stacksjs/utils": "0.74.63",
108
- "@stacksjs/whois": "0.74.63",
109
- "bun-plugin-stx": "^0.2.286"
105
+ "@stacksjs/tunnel": "0.74.65",
106
+ "@stacksjs/types": "0.74.65",
107
+ "@stacksjs/utils": "0.74.65",
108
+ "@stacksjs/whois": "0.74.65",
109
+ "bun-plugin-stx": "^0.2.306"
110
110
  },
111
111
  "peerDependencies": {
112
112
  "craft-native": ">=0.0.72",
@@ -121,7 +121,7 @@
121
121
  }
122
122
  },
123
123
  "devDependencies": {
124
- "@stacksjs/validation": "0.74.63",
124
+ "@stacksjs/validation": "0.74.65",
125
125
  "better-dx": "^0.2.24"
126
126
  }
127
127
  }