@stacksjs/actions 0.75.12 → 0.75.13
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,2 +1,2 @@
|
|
|
1
1
|
import{existsSync,readdirSync,readFileSync,statSync,writeFileSync}from"node:fs";import{homedir}from"node:os";import{join,resolve}from"node:path";import process from"node:process";export function resolveUpgradeContext(options,currentChannel,latestStableRef){const targetVersion=options.version;if(targetVersion)return{channel:"stable",ref:targetVersion.startsWith("v")?targetVersion:`v${targetVersion}`,targetVersion};if(options.canary)return{channel:"canary",ref:"main"};if(options.stable)return{channel:"stable",ref:latestStableRef};if(currentChannel==="canary")return{channel:"canary",ref:"main"};return{channel:"stable",ref:latestStableRef}}function compareVersionParts(a,b){return a[0]-b[0]||a[1]-b[1]||a[2]-b[2]}export function pickLatestStableTag(tags){const re=/^v(\d+)\.(\d+)\.(\d+)$/;let best=null;for(const tag of tags){const m=re.exec(tag.trim());if(!m)continue;const parts=[Number(m[1]),Number(m[2]),Number(m[3])];if(!best||compareVersionParts(parts,best.parts)>0)best={tag:tag.trim(),parts}}return best?.tag??null}export async function resolveLatestStableTag(){try{const proc=Bun.spawn({cmd:["git","ls-remote","--tags","--refs","https://github.com/stacksjs/stacks.git","v*"],stdout:"pipe",stderr:"pipe"}),out=await new Response(proc.stdout).text();if(await proc.exited!==0)return null;const tags=out.split(`
|
|
2
|
-
`).map((line)=>line.split("\t")[1]?.replace("refs/tags/","")).filter((t)=>!!t);return pickLatestStableTag(tags)}catch{return null}}export function buildTemplateString(ref,subPath="storage/framework/core"){return`github:stacksjs/stacks/${subPath}#${ref}`}export function readVersion(pkgPath){try{if(existsSync(pkgPath))return JSON.parse(readFileSync(pkgPath,"utf-8")).version||null}catch{}return null}export function readChannel(channelFilePath){try{if(existsSync(channelFilePath)){if(readFileSync(channelFilePath,"utf-8").trim()==="canary")return"canary"}}catch{}return"stable"}export function writeChannel(channelFilePath,ch){try{writeFileSync(channelFilePath,ch,"utf-8")}catch{}}export function readSyncedVersion(versionFilePath){try{if(existsSync(versionFilePath)){const content=readFileSync(versionFilePath,"utf-8").trim(),[ch,sha]=content.split(/\s+/);if((ch==="stable"||ch==="canary")&&sha&&/^[0-9a-f]{40}$/i.test(sha))return{channel:ch,sha:sha.toLowerCase()}}}catch{}return null}export function writeSyncedVersion(versionFilePath,ch,sha){try{writeFileSync(versionFilePath,`${ch} ${sha}`,"utf-8")}catch{}}export function shouldCheckDirtyManagedPaths(args){return!args.force&&!args.alreadyRestarted}export function shouldShortCircuit(args){const{force,targetVersion,remoteSha,synced,channel}=args;if(force||targetVersion)return!1;if(!remoteSha||!synced)return!1;return synced.channel===channel&&synced.sha===remoteSha.toLowerCase()}export function resolveUpgradeMessage(ctx,currentChannel,isStableFlag){if(ctx.targetVersion)return`Installing Stacks v${ctx.targetVersion.replace(/^v/,"")}...`;if(ctx.channel==="canary")return"Upgrading to the latest canary build...";if(isStableFlag&¤tChannel==="canary")return"Switching back to the latest stable release...";return"Upgrading to the latest version..."}export function resolveSuccessMessage(ctx,currentVersion,newVersion,currentChannel,force){if(ctx.targetVersion){const pinned=ctx.targetVersion.replace(/^v/,"");if(currentVersion===pinned&&!force)return`Stacks is already at v${pinned}`;if(currentVersion)return`Installed Stacks v${pinned} (was v${currentVersion})`;return`Installed Stacks v${pinned}`}if(currentVersion&&newVersion&¤tVersion===newVersion&&!force){if(ctx.channel==="canary")return`Stacks is already up to date (canary ${currentVersion})`;return`Stacks is already up to date (v${currentVersion})`}if(currentVersion&&newVersion){const from=currentChannel==="canary"?`canary ${currentVersion}`:`v${currentVersion}`,to=ctx.channel==="canary"?`canary ${newVersion}`:`v${newVersion}`;return`Upgraded Stacks from ${from} to ${to}`}if(newVersion)return`Upgraded Stacks to ${ctx.channel==="canary"?`canary ${newVersion}`:`v${newVersion}`}`;return`Upgraded Stacks to ${ctx.ref} (latest)`}export const MANAGED_PATHS=[{localPath:"storage/framework/core",subPath:"storage/framework/core",label:"core",skip:["node_modules","dist","bun.lock",".DS_Store"]},{localPath:"storage/framework/defaults",subPath:"storage/framework/defaults",label:"defaults",skip:["node_modules","dist",".DS_Store",".discovered-models.json"]},{localPath:"buddy",subPath:"buddy",label:"buddy",isFile:!0,executable:!0},{localPath:"bootstrap",subPath:"bootstrap",label:"bootstrap",isFile:!0,executable:!0}];export function detectLocalStacks(projectRoot){const candidates=[process.env.STACKS_LOCAL_PATH,resolve(projectRoot,"..","stacks"),resolve(projectRoot,"..","..","stacks"),resolve(homedir(),"Code","stacks"),resolve(homedir(),"code","stacks"),resolve(homedir(),"projects","stacks"),resolve(homedir(),"src","stacks")];for(const candidate of candidates){if(!candidate)continue;const marker=join(candidate,"storage","framework","core","buddy","package.json");try{if(existsSync(marker)&&resolve(candidate)!==resolve(projectRoot))return resolve(candidate)}catch{}}return null}export function shouldAutoDetectLocalStacks(options){return!options.from&&!options.version}export async function snapshotTree(root,skip=[]){const out=new Map;if(!existsSync(root))return out;const skipSet=new Set(skip),stack=[{abs:root,rel:""}],hashJobs=[];while(stack.length>0){const{abs,rel}=stack.pop();let entries;try{entries=readdirSync(abs)}catch{continue}for(const name of entries){if(skipSet.has(name))continue;const childAbs=join(abs,name),childRel=rel?`${rel}/${name}`:name;let info;try{info=statSync(childAbs)}catch{continue}if(info.isDirectory())stack.push({abs:childAbs,rel:childRel});else if(info.isFile()){const size=info.size;hashJobs.push((async()=>{const hash=await hashFile(childAbs);out.set(childRel,{size,hash})})())}}}await Promise.all(hashJobs);return out}export function diffSnapshots(before,after){let added=0,changed=0,unchanged=0;for(const[rel,info]of after){const prev=before.get(rel);if(!prev)added++;else if(prev.size!==info.size||prev.hash!==info.hash)changed++;else unchanged++}let removed=0;for(const rel of before.keys())if(!after.has(rel))removed++;return{added,changed,removed,unchanged}}export function diffSnapshotsDetailed(before,after){const addedFiles=[],changedFiles=[],removedFiles=[];let unchanged=0;for(const[rel,info]of after){const prev=before.get(rel);if(!prev)addedFiles.push(rel);else if(prev.size!==info.size||prev.hash!==info.hash)changedFiles.push(rel);else unchanged++}for(const rel of before.keys())if(!after.has(rel))removedFiles.push(rel);addedFiles.sort();changedFiles.sort();removedFiles.sort();return{added:addedFiles.length,changed:changedFiles.length,removed:removedFiles.length,unchanged,addedFiles,changedFiles,removedFiles}}async function hashFile(absPath){try{const buf=await Bun.file(absPath).arrayBuffer();return Bun.hash(buf)}catch{return 0n}}
|
|
2
|
+
`).map((line)=>line.split("\t")[1]?.replace("refs/tags/","")).filter((t)=>!!t);return pickLatestStableTag(tags)}catch{return null}}export function buildTemplateString(ref,subPath="storage/framework/core"){return`github:stacksjs/stacks/${subPath}#${ref}`}export function readVersion(pkgPath){try{if(existsSync(pkgPath))return JSON.parse(readFileSync(pkgPath,"utf-8")).version||null}catch{}return null}export function readChannel(channelFilePath){try{if(existsSync(channelFilePath)){if(readFileSync(channelFilePath,"utf-8").trim()==="canary")return"canary"}}catch{}return"stable"}export function writeChannel(channelFilePath,ch){try{writeFileSync(channelFilePath,ch,"utf-8")}catch{}}export function readSyncedVersion(versionFilePath){try{if(existsSync(versionFilePath)){const content=readFileSync(versionFilePath,"utf-8").trim(),[ch,sha]=content.split(/\s+/);if((ch==="stable"||ch==="canary")&&sha&&/^[0-9a-f]{40}$/i.test(sha))return{channel:ch,sha:sha.toLowerCase()}}}catch{}return null}export function writeSyncedVersion(versionFilePath,ch,sha){try{writeFileSync(versionFilePath,`${ch} ${sha}`,"utf-8")}catch{}}export function shouldCheckDirtyManagedPaths(args){return!args.force&&!args.alreadyRestarted}export function shouldShortCircuit(args){const{force,targetVersion,remoteSha,synced,channel}=args;if(force||targetVersion)return!1;if(!remoteSha||!synced)return!1;return synced.channel===channel&&synced.sha===remoteSha.toLowerCase()}export function resolveUpgradeMessage(ctx,currentChannel,isStableFlag){if(ctx.targetVersion)return`Installing Stacks v${ctx.targetVersion.replace(/^v/,"")}...`;if(ctx.channel==="canary")return"Upgrading to the latest canary build...";if(isStableFlag&¤tChannel==="canary")return"Switching back to the latest stable release...";return"Upgrading to the latest version..."}export function resolveSuccessMessage(ctx,currentVersion,newVersion,currentChannel,force){if(ctx.targetVersion){const pinned=ctx.targetVersion.replace(/^v/,"");if(currentVersion===pinned&&!force)return`Stacks is already at v${pinned}`;if(currentVersion)return`Installed Stacks v${pinned} (was v${currentVersion})`;return`Installed Stacks v${pinned}`}if(currentVersion&&newVersion&¤tVersion===newVersion&&!force){if(ctx.channel==="canary")return`Stacks is already up to date (canary ${currentVersion})`;return`Stacks is already up to date (v${currentVersion})`}if(currentVersion&&newVersion){const from=currentChannel==="canary"?`canary ${currentVersion}`:`v${currentVersion}`,to=ctx.channel==="canary"?`canary ${newVersion}`:`v${newVersion}`;return`Upgraded Stacks from ${from} to ${to}`}if(newVersion)return`Upgraded Stacks to ${ctx.channel==="canary"?`canary ${newVersion}`:`v${newVersion}`}`;return`Upgraded Stacks to ${ctx.ref} (latest)`}export const MANAGED_PATHS=[{localPath:"storage/framework/core",subPath:"storage/framework/core",label:"core",skip:["node_modules","dist","bun.lock",".DS_Store"]},{localPath:"storage/framework/defaults",subPath:"storage/framework/defaults",label:"defaults",skip:["node_modules","dist",".DS_Store",".discovered-models.json"]},{localPath:"storage/framework/types",subPath:"storage/framework/types",label:"types",skip:["server-auto-imports.d.ts","browser-auto-imports.d.ts",".DS_Store"]},{localPath:"buddy",subPath:"buddy",label:"buddy",isFile:!0,executable:!0},{localPath:"bootstrap",subPath:"bootstrap",label:"bootstrap",isFile:!0,executable:!0}];export function detectLocalStacks(projectRoot){const candidates=[process.env.STACKS_LOCAL_PATH,resolve(projectRoot,"..","stacks"),resolve(projectRoot,"..","..","stacks"),resolve(homedir(),"Code","stacks"),resolve(homedir(),"code","stacks"),resolve(homedir(),"projects","stacks"),resolve(homedir(),"src","stacks")];for(const candidate of candidates){if(!candidate)continue;const marker=join(candidate,"storage","framework","core","buddy","package.json");try{if(existsSync(marker)&&resolve(candidate)!==resolve(projectRoot))return resolve(candidate)}catch{}}return null}export function shouldAutoDetectLocalStacks(options){return!options.from&&!options.version}export async function snapshotTree(root,skip=[]){const out=new Map;if(!existsSync(root))return out;const skipSet=new Set(skip),stack=[{abs:root,rel:""}],hashJobs=[];while(stack.length>0){const{abs,rel}=stack.pop();let entries;try{entries=readdirSync(abs)}catch{continue}for(const name of entries){if(skipSet.has(name))continue;const childAbs=join(abs,name),childRel=rel?`${rel}/${name}`:name;let info;try{info=statSync(childAbs)}catch{continue}if(info.isDirectory())stack.push({abs:childAbs,rel:childRel});else if(info.isFile()){const size=info.size;hashJobs.push((async()=>{const hash=await hashFile(childAbs);out.set(childRel,{size,hash})})())}}}await Promise.all(hashJobs);return out}export function diffSnapshots(before,after){let added=0,changed=0,unchanged=0;for(const[rel,info]of after){const prev=before.get(rel);if(!prev)added++;else if(prev.size!==info.size||prev.hash!==info.hash)changed++;else unchanged++}let removed=0;for(const rel of before.keys())if(!after.has(rel))removed++;return{added,changed,removed,unchanged}}export function diffSnapshotsDetailed(before,after){const addedFiles=[],changedFiles=[],removedFiles=[];let unchanged=0;for(const[rel,info]of after){const prev=before.get(rel);if(!prev)addedFiles.push(rel);else if(prev.size!==info.size||prev.hash!==info.hash)changedFiles.push(rel);else unchanged++}for(const rel of before.keys())if(!after.has(rel))removedFiles.push(rel);addedFiles.sort();changedFiles.sort();removedFiles.sort();return{added:addedFiles.length,changed:changedFiles.length,removed:removedFiles.length,unchanged,addedFiles,changedFiles,removedFiles}}async function hashFile(absPath){try{const buf=await Bun.file(absPath).arrayBuffer();return Bun.hash(buf)}catch{return 0n}}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{chmodSync,copyFileSync,cpSync,existsSync,mkdirSync,mkdtempSync,readFileSync,rmSync}from"node:fs";import{tmpdir}from"node:os";import{dirname,join}from"node:path";import process from"node:process";import{parseOptions}from"@stacksjs/cli";import{downloadTemplate}from"@stacksjs/gitit";import{path as p}from"@stacksjs/path";import{ExitCode}from"@stacksjs/types";import{buildTemplateString,detectLocalStacks,diffSnapshots,diffSnapshotsDetailed,MANAGED_PATHS,readChannel,readSyncedVersion,readVersion,resolveLatestStableTag,resolveSuccessMessage,resolveUpgradeContext,resolveUpgradeMessage,shouldAutoDetectLocalStacks,shouldCheckDirtyManagedPaths,shouldShortCircuit,snapshotTree,writeChannel,writeSyncedVersion}from"./framework-utils";import{detectDependencyInstaller,resolveDependencyRefreshCommand,resolvePantryExecutable,runPostSyncDependencyRefresh,runPostSyncMigration,shouldRefreshPostSyncDependencies,shouldRunPostSyncHooks}from"./framework-hooks";const options=parseOptions(),projectRoot=p.projectPath();if(!existsSync(p.projectPath("storage/framework/core"))){const{upgradeStacksPackages}=await import("./packages");await upgradeStacksPackages(projectRoot,{version:options.version,canary:options.canary,stable:options.stable,force:options.force,dryRun:options.dryRun,noPostinstall:options.noPostinstall??options.postinstall===!1})}const channelFile=join(projectRoot,".stacks-channel"),versionFile=join(projectRoot,".stacks-version"),currentChannel=readChannel(channelFile),corePkgPath=p.projectPath("storage/framework/core/buddy/package.json"),currentVersion=readVersion(corePkgPath),willResolveStable=!options.version&&!options.canary&&(!!options.stable||currentChannel!=="canary");let latestStableRef="";if(willResolveStable)latestStableRef=await resolveLatestStableTag()??(currentVersion?`v${currentVersion}`:"main");const ctx=resolveUpgradeContext(options,currentChannel,latestStableRef),explicitLocal=options.from?p.projectPath(options.from):null,detectedLocal=explicitLocal??(shouldAutoDetectLocalStacks(options)?detectLocalStacks(projectRoot):null),usingLocal=!!detectedLocal;console.log(resolveUpgradeMessage(ctx,currentChannel,!!options.stable));console.log(usingLocal?` source: local checkout at ${detectedLocal}`:` source: github:stacksjs/stacks#${ctx.ref}`);if(options.dryRun){await runDryRunPreview();process.exit(ExitCode.Success)}const alreadyRestarted=process.argv.includes("--__restarted");if(shouldCheckDirtyManagedPaths({force:!!options.force,alreadyRestarted})){const dirty=await detectDirtyManagedPaths(projectRoot);if(dirty.length>0){console.warn(`
|
|
1
|
+
import{chmodSync,copyFileSync,cpSync,existsSync,mkdirSync,mkdtempSync,readFileSync,rmSync,statSync,writeFileSync}from"node:fs";import{tmpdir}from"node:os";import{dirname,join}from"node:path";import process from"node:process";import{parseOptions}from"@stacksjs/cli";import{downloadTemplate}from"@stacksjs/gitit";import{path as p}from"@stacksjs/path";import{ExitCode}from"@stacksjs/types";import{buildTemplateString,detectLocalStacks,diffSnapshots,diffSnapshotsDetailed,MANAGED_PATHS,readChannel,readSyncedVersion,readVersion,resolveLatestStableTag,resolveSuccessMessage,resolveUpgradeContext,resolveUpgradeMessage,shouldAutoDetectLocalStacks,shouldCheckDirtyManagedPaths,shouldShortCircuit,snapshotTree,writeChannel,writeSyncedVersion}from"./framework-utils";import{detectDependencyInstaller,resolveDependencyRefreshCommand,resolvePantryExecutable,runPostSyncDependencyRefresh,runPostSyncMigration,shouldRefreshPostSyncDependencies,shouldRunPostSyncHooks}from"./framework-hooks";const options=parseOptions(),projectRoot=p.projectPath();if(!existsSync(p.projectPath("storage/framework/core"))){const{upgradeStacksPackages}=await import("./packages");await upgradeStacksPackages(projectRoot,{version:options.version,canary:options.canary,stable:options.stable,force:options.force,dryRun:options.dryRun,noPostinstall:options.noPostinstall??options.postinstall===!1})}const channelFile=join(projectRoot,".stacks-channel"),versionFile=join(projectRoot,".stacks-version"),currentChannel=readChannel(channelFile),corePkgPath=p.projectPath("storage/framework/core/buddy/package.json"),currentVersion=readVersion(corePkgPath),willResolveStable=!options.version&&!options.canary&&(!!options.stable||currentChannel!=="canary");let latestStableRef="";if(willResolveStable)latestStableRef=await resolveLatestStableTag()??(currentVersion?`v${currentVersion}`:"main");const ctx=resolveUpgradeContext(options,currentChannel,latestStableRef),explicitLocal=options.from?p.projectPath(options.from):null,detectedLocal=explicitLocal??(shouldAutoDetectLocalStacks(options)?detectLocalStacks(projectRoot):null),usingLocal=!!detectedLocal;console.log(resolveUpgradeMessage(ctx,currentChannel,!!options.stable));console.log(usingLocal?` source: local checkout at ${detectedLocal}`:` source: github:stacksjs/stacks#${ctx.ref}`);if(options.dryRun){await runDryRunPreview();process.exit(ExitCode.Success)}const alreadyRestarted=process.argv.includes("--__restarted");if(shouldCheckDirtyManagedPaths({force:!!options.force,alreadyRestarted})){const dirty=await detectDirtyManagedPaths(projectRoot);if(dirty.length>0){console.warn(`
|
|
2
2
|
\u26A0 The following framework-managed paths have uncommitted changes:`);for(const path of dirty)console.warn(` - ${path}`);console.warn(`
|
|
3
3
|
Aborting to avoid clobbering your edits.`);console.warn(` Re-run with --force to overwrite, or commit / stash the changes first.
|
|
4
4
|
`);process.exit(ExitCode.FatalError)}}let resolvedRemoteSha=null;if(!options.force&&!ctx.targetVersion){resolvedRemoteSha=await getRemoteSha(ctx,usingLocal,detectedLocal);const synced=readSyncedVersion(versionFile);if(shouldShortCircuit({force:!!options.force,targetVersion:ctx.targetVersion,remoteSha:resolvedRemoteSha,synced,channel:ctx.channel})){console.log(`\u2714 Already on the latest ${ctx.channel} (${resolvedRemoteSha.slice(0,7)}).`);process.exit(ExitCode.Success)}}const ownPath=p.frameworkPath("core/actions/src/upgrade/framework.ts"),ownHashBefore=await hashFileOrZero(ownPath),aggregate={added:0,changed:0,removed:0,unchanged:0},perPath=[];try{for(const managed of MANAGED_PATHS){const localTarget=join(projectRoot,managed.localPath),before=managed.isFile?await singleFileSnapshot(localTarget):await snapshotTree(localTarget,managed.skip);if(usingLocal&&detectedLocal)await syncFromLocal(detectedLocal,managed,localTarget);else{if(managed.isFile)continue;await syncFromGitHub(ctx.ref,managed,localTarget,!!options.force)}const after=managed.isFile?await singleFileSnapshot(localTarget):await snapshotTree(localTarget,managed.skip),summary=diffSnapshots(before,after);aggregate.added+=summary.added;aggregate.changed+=summary.changed;aggregate.removed+=summary.removed;aggregate.unchanged+=summary.unchanged;perPath.push({managed,summary})}if(!usingLocal)await syncRootFilesFromGitHub(ctx.ref)}catch(err){console.error("\u2718 Failed to upgrade Stacks framework:",err?.message||err);process.exit(ExitCode.FatalError)}const newVersion=readVersion(corePkgPath),ownHashAfter=await hashFileOrZero(ownPath);if(ownHashBefore!==0n&&ownHashAfter!==0n&&ownHashBefore!==ownHashAfter&&!alreadyRestarted){console.log(`Upgrade pulled a newer version of the upgrade action - re-running once to pick up new sync paths and hooks.
|
|
@@ -9,4 +9,4 @@ import{chmodSync,copyFileSync,cpSync,existsSync,mkdirSync,mkdtempSync,readFileSy
|
|
|
9
9
|
(-N counts files no longer shipped upstream; the sync leaves them in place.)`);console.log(`
|
|
10
10
|
\u2714 Dry run complete. No changes were made.`)}async function detectDirtyManagedPaths(root){const gitDir=join(root,".git");if(!existsSync(gitDir))return[];try{const proc=Bun.spawn({cmd:["git","-C",root,"status","--porcelain","--",...MANAGED_PATHS.map((m)=>m.localPath)],stdout:"pipe",stderr:"pipe"}),output=await new Response(proc.stdout).text();await proc.exited;return output.split(`
|
|
11
11
|
`).filter((line)=>line.length>0).map((line)=>line.slice(3))}catch{return[]}}async function getRemoteSha(context,fromLocal,stacksRoot){const SHA_RE=/^[0-9a-f]{40}$/i;try{if(fromLocal&&stacksRoot){const proc=Bun.spawn({cmd:["git","-C",stacksRoot,"rev-parse",context.ref],stdout:"pipe",stderr:"pipe"}),out=(await new Response(proc.stdout).text()).trim();if(await proc.exited===0&&SHA_RE.test(out))return out.toLowerCase();const head=Bun.spawn({cmd:["git","-C",stacksRoot,"rev-parse","HEAD"],stdout:"pipe",stderr:"pipe"}),h=(await new Response(head.stdout).text()).trim();return await head.exited===0&&SHA_RE.test(h)?h.toLowerCase():null}const proc=Bun.spawn({cmd:["git","ls-remote","https://github.com/stacksjs/stacks.git",`refs/heads/${context.ref}`,`refs/tags/${context.ref}`,`refs/tags/${context.ref}^{}`],stdout:"pipe",stderr:"pipe"}),out=await new Response(proc.stdout).text();if(await proc.exited!==0)return null;const lines=out.split(`
|
|
12
|
-
`).filter(Boolean),m=(lines.find((l)=>l.includes("^{}"))??lines[0])?.match(/^([0-9a-f]{40})\s/i);return m?.[1]?m[1].toLowerCase():null}catch{return null}}async function hashFileOrZero(absPath){try{if(!existsSync(absPath))return 0n;const buf=await Bun.file(absPath).arrayBuffer();return Bun.hash(buf)}catch{return 0n}}async function singleFileSnapshot(absPath){const out=new Map;if(!existsSync(absPath))return out;try{const file=Bun.file(absPath);if(file.size>0){const buf=await file.arrayBuffer();out.set("self",{size:file.size,hash:Bun.hash(buf)})}}catch{}return out}async function syncFromLocal(stacksRoot,managed,localTarget){const src=join(stacksRoot,managed.subPath);if(!existsSync(src)){console.warn(` skip ${managed.label}: source missing at ${src}`);return}if(managed.isFile){mkdirSync(dirname(localTarget),{recursive:!0});copyFileSync(src,localTarget);if(managed.executable)chmodSync(localTarget,493);return}mkdirSync(localTarget,{recursive:!0});cpSync(src,localTarget,{recursive:!0,force:!0,filter:(source)=>{if(!managed.skip)return!0;const name=source.split("/").pop()||"";return!managed.skip.includes(name)}})}async function syncFromGitHub(ref,managed,localTarget,force){const template=buildTemplateString(ref,managed.subPath);await downloadTemplate(template,{dir:localTarget,force:!0,forceClean:!1,preferOffline:!force})}async function syncRootFilesFromGitHub(ref){const tmpDir=p.projectPath(".tmp-upgrade");try{await downloadTemplate(`github:stacksjs/stacks#${ref}`,{dir:tmpDir,force:!0,forceClean:!0,preferOffline:!0,silent:!0});for(const managed of MANAGED_PATHS){if(!managed.isFile)continue;const src=join(tmpDir,managed.subPath),dest=p.projectPath(managed.localPath);try{if(existsSync(src)&&existsSync(dest)){copyFileSync(src,dest);if(managed.executable)chmodSync(dest,493)}}catch{}}}catch{}finally{if(existsSync(tmpDir))rmSync(tmpDir,{recursive:!0,force:!0})}}async function runPostSyncHooks(args){const{aggregate,perPath,projectRoot,alreadyRestarted}=args,changeCount=aggregate.added+aggregate.changed+aggregate.removed;if(!shouldRunPostSyncHooks(changeCount,alreadyRestarted)){console.log("Nothing changed - skipping post-sync hooks.");return}console.log("Regenerating auto-import manifest...");try{const{generateAutoImportFiles}=await import("@stacksjs/server");await generateAutoImportFiles()}catch(err){console.warn(` auto-imports failed (non-fatal): ${err?.message||err}`)}if(shouldRefreshPostSyncDependencies(perPath.some((entry)=>{const{managed,summary}=entry;if(managed.isFile)return!1;if(managed.label!=="core"&&managed.label!=="defaults")return!1;if(summary.added+summary.changed===0)return!1;return pkgJsonInTree(join(projectRoot,managed.localPath))}),alreadyRestarted)){const installer=detectDependencyInstaller(existsSync(join(projectRoot,"pantry.lock"))),cmd=resolveDependencyRefreshCommand({installer,bunExecutable:process.argv[0]||"bun",pantryExecutable:resolvePantryExecutable(pantryExecutableCandidates(projectRoot),existsSync)});console.log(`Running \`${installer} install\` to refresh dependencies...`);try{await runPostSyncDependencyRefresh({cmd,projectRoot,spawn:(spawnOptions)=>Bun.spawn(spawnOptions)})}catch(err){console.warn(` ${installer} install failed (non-fatal): ${err?.message||err}`)}}const migrationsDir=join(projectRoot,"database","migrations");if(existsSync(migrationsDir)){console.log("Running pending migrations...");const migrateScript=p.frameworkPath("core/buddy/src/cli.ts");await runPostSyncMigration({bunExecutable:process.argv[0]||"bun",migrateScript,projectRoot,spawn:(spawnOptions)=>Bun.spawn(spawnOptions)})}}function pantryExecutableCandidates(projectRoot){const home=process.env.HOME??"";return[join(projectRoot,"pantry",".bin","pantry"),home?join(home,".local","bin","pantry"):"",home?join(home,".local","share","pantry","global","bin","pantry"):""].filter(Boolean)}function pkgJsonInTree(dir){try{if(!existsSync(dir))return!1;return readFileSync(join(dir,"package.json"),"utf-8").length>0}catch{return existsSync(dir)}}
|
|
12
|
+
`).filter(Boolean),m=(lines.find((l)=>l.includes("^{}"))??lines[0])?.match(/^([0-9a-f]{40})\s/i);return m?.[1]?m[1].toLowerCase():null}catch{return null}}async function hashFileOrZero(absPath){try{if(!existsSync(absPath))return 0n;const buf=await Bun.file(absPath).arrayBuffer();return Bun.hash(buf)}catch{return 0n}}async function singleFileSnapshot(absPath){const out=new Map;if(!existsSync(absPath))return out;try{const file=Bun.file(absPath);if(file.size>0){const buf=await file.arrayBuffer();out.set("self",{size:file.size,hash:Bun.hash(buf)})}}catch{}return out}async function syncFromLocal(stacksRoot,managed,localTarget){const src=join(stacksRoot,managed.subPath);if(!existsSync(src)){console.warn(` skip ${managed.label}: source missing at ${src}`);return}if(managed.isFile){mkdirSync(dirname(localTarget),{recursive:!0});copyFileSync(src,localTarget);if(managed.executable)chmodSync(localTarget,493);return}mkdirSync(localTarget,{recursive:!0});cpSync(src,localTarget,{recursive:!0,force:!0,filter:(source)=>{if(!managed.skip)return!0;const name=source.split("/").pop()||"";return!managed.skip.includes(name)}})}async function syncFromGitHub(ref,managed,localTarget,force){const kept=new Map;for(const name of managed.skip??[]){const file=join(localTarget,name);try{if(existsSync(file)&&statSync(file).isFile())kept.set(file,readFileSync(file))}catch{}}const template=buildTemplateString(ref,managed.subPath);await downloadTemplate(template,{dir:localTarget,force:!0,forceClean:!1,preferOffline:!force});for(const[file,contents]of kept)writeFileSync(file,contents)}async function syncRootFilesFromGitHub(ref){const tmpDir=p.projectPath(".tmp-upgrade");try{await downloadTemplate(`github:stacksjs/stacks#${ref}`,{dir:tmpDir,force:!0,forceClean:!0,preferOffline:!0,silent:!0});for(const managed of MANAGED_PATHS){if(!managed.isFile)continue;const src=join(tmpDir,managed.subPath),dest=p.projectPath(managed.localPath);try{if(existsSync(src)&&existsSync(dest)){copyFileSync(src,dest);if(managed.executable)chmodSync(dest,493)}}catch{}}}catch{}finally{if(existsSync(tmpDir))rmSync(tmpDir,{recursive:!0,force:!0})}}async function runPostSyncHooks(args){const{aggregate,perPath,projectRoot,alreadyRestarted}=args,changeCount=aggregate.added+aggregate.changed+aggregate.removed;if(!shouldRunPostSyncHooks(changeCount,alreadyRestarted)){console.log("Nothing changed - skipping post-sync hooks.");return}console.log("Regenerating auto-import manifest...");try{const{generateAutoImportFiles}=await import("@stacksjs/server");await generateAutoImportFiles()}catch(err){console.warn(` auto-imports failed (non-fatal): ${err?.message||err}`)}if(shouldRefreshPostSyncDependencies(perPath.some((entry)=>{const{managed,summary}=entry;if(managed.isFile)return!1;if(managed.label!=="core"&&managed.label!=="defaults")return!1;if(summary.added+summary.changed===0)return!1;return pkgJsonInTree(join(projectRoot,managed.localPath))}),alreadyRestarted)){const installer=detectDependencyInstaller(existsSync(join(projectRoot,"pantry.lock"))),cmd=resolveDependencyRefreshCommand({installer,bunExecutable:process.argv[0]||"bun",pantryExecutable:resolvePantryExecutable(pantryExecutableCandidates(projectRoot),existsSync)});console.log(`Running \`${installer} install\` to refresh dependencies...`);try{await runPostSyncDependencyRefresh({cmd,projectRoot,spawn:(spawnOptions)=>Bun.spawn(spawnOptions)})}catch(err){console.warn(` ${installer} install failed (non-fatal): ${err?.message||err}`)}}const migrationsDir=join(projectRoot,"database","migrations");if(existsSync(migrationsDir)){console.log("Running pending migrations...");const migrateScript=p.frameworkPath("core/buddy/src/cli.ts");await runPostSyncMigration({bunExecutable:process.argv[0]||"bun",migrateScript,projectRoot,spawn:(spawnOptions)=>Bun.spawn(spawnOptions)})}}function pantryExecutableCandidates(projectRoot){const home=process.env.HOME??"";return[join(projectRoot,"pantry",".bin","pantry"),home?join(home,".local","bin","pantry"):"",home?join(home,".local","share","pantry","global","bin","pantry"):""].filter(Boolean)}function pkgJsonInTree(dir){try{if(!existsSync(dir))return!1;return readFileSync(join(dir,"package.json"),"utf-8").length>0}catch{return existsSync(dir)}}
|
|
@@ -27,6 +27,33 @@ export declare function migratePackageProjectTsconfig(projectRoot: string, optio
|
|
|
27
27
|
* AGENTS.md is always present after an update.
|
|
28
28
|
*/
|
|
29
29
|
export declare function detectProjectAiProviders(projectRoot: string): DetectedAiProvider[];
|
|
30
|
+
/**
|
|
31
|
+
* The framework's type declarations, which an app needs and never regenerates.
|
|
32
|
+
*
|
|
33
|
+
* `storage/framework/types` is mostly hand-written declarations ("derived
|
|
34
|
+
* rather than generated": model events, env, gates, registries, ...). A new app
|
|
35
|
+
* gets them with the rest of the scaffold, and `buddy upgrade` used to deliver
|
|
36
|
+
* none of them, so every declaration added after an app was created was simply
|
|
37
|
+
* missing - `model-events.d.ts` among them, which is what makes
|
|
38
|
+
* `'user:created'` exist on `AppEvents` (trifitla, upgrading 0.72.57 -> 0.75.11,
|
|
39
|
+
* failed typecheck on its own `app/Events.ts`).
|
|
40
|
+
*
|
|
41
|
+
* Added and updated, never pruned: an app can still hold older generated
|
|
42
|
+
* declarations here that something imports. The two files the runtime writes
|
|
43
|
+
* for this app are left alone.
|
|
44
|
+
* @defaultValue `{ source: 'project/storage/framework/types', target: 'storage/framework/types' }`
|
|
45
|
+
*/
|
|
46
|
+
export declare const FRAMEWORK_TYPES_SUPPORT_DIRECTORY: {
|
|
47
|
+
/** @defaultValue 'project/storage/framework/types' */
|
|
48
|
+
source: string;
|
|
49
|
+
/** @defaultValue 'storage/framework/types' */
|
|
50
|
+
target: string
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Declarations the runtime generates per app; syncing them would clobber that.
|
|
54
|
+
* @defaultValue `['server-auto-imports.d.ts', 'browser-auto-imports.d.ts']`
|
|
55
|
+
*/
|
|
56
|
+
export declare const GENERATED_FRAMEWORK_TYPES: string[];
|
|
30
57
|
export declare interface ProjectStructureChange {
|
|
31
58
|
path: string
|
|
32
59
|
action: 'add' | 'update' | 'remove'
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{chmodSync,existsSync,lstatSync,mkdirSync,readFileSync,readdirSync,rmSync,statSync,writeFileSync}from"node:fs";import{dirname,join,relative}from"node:path";import{DEFAULTS_SYNC_MARKER,defaultsPackagePath}from"@stacksjs/path";const DEFAULTS_PACKAGE_IGNORES=new Set(["README.md","build.ts","node_modules","package.json","project","tests"]),LOCAL_DEFAULT_IGNORES=new Set([".DS_Store",".discovered-models.json",DEFAULTS_SYNC_MARKER,"dist","node_modules"]),LEGACY_PACKAGE_PROJECT_FILES=["pantry.lock"],SUPPORT_FILES=[{source:"project/buddy",target:"buddy",executable:!0},{source:"project/bootstrap",target:"bootstrap",executable:!0},{source:"project/storage/framework/tsconfig.app.json",target:"storage/framework/tsconfig.app.json"},{source:"project/storage/framework/tsconfig.base.json",target:"storage/framework/tsconfig.base.json"},{source:"project/storage/framework/server/tsconfig.docker.json",target:"storage/framework/server/tsconfig.docker.json"}];function sameFile(left,right,shallow=!1){if(!existsSync(left)||!existsSync(right))return!1;const leftStat=statSync(left),rightStat=statSync(right);if(leftStat.size!==rightStat.size)return!1;if(shallow)return!0;return readFileSync(left).equals(readFileSync(right))}function copyFileIfChanged(source,target,projectRoot,changes,options,executable=!1){if(sameFile(source,target,options.shallow&&options.dryRun)){if(executable&&!options.dryRun)chmodSync(target,493);return}changes.push({path:relative(projectRoot,target),action:existsSync(target)?"update":"add"});if(options.dryRun)return;mkdirSync(dirname(target),{recursive:!0});writeFileSync(target,readFileSync(source));if(executable)chmodSync(target,493)}function syncDirectory(source,target,projectRoot,changes,options,isRoot=!1){if(!options.dryRun)mkdirSync(target,{recursive:!0});const sourceEntries=new Set;for(const entry of readdirSync(source)){if(isRoot&&DEFAULTS_PACKAGE_IGNORES.has(entry))continue;sourceEntries.add(entry);const sourcePath=join(source,entry),targetPath=join(target,entry);if(lstatSync(sourcePath).isDirectory()){syncDirectory(sourcePath,targetPath,projectRoot,changes,options);continue}copyFileIfChanged(sourcePath,targetPath,projectRoot,changes,options)}if(!existsSync(target))return;for(const entry of readdirSync(target)){if(LOCAL_DEFAULT_IGNORES.has(entry)||sourceEntries.has(entry))continue;const targetPath=join(target,entry);changes.push({path:relative(projectRoot,targetPath),action:"remove"});if(!options.dryRun)rmSync(targetPath,{recursive:!0,force:!0})}}export function syncPackageProjectFiles(projectRoot,defaultsPackageRoot,options={}){const changes=[],targetDefaults=join(projectRoot,"storage/framework/defaults");syncDirectory(defaultsPackageRoot,targetDefaults,projectRoot,changes,options,!0);for(const file of SUPPORT_FILES){const source=join(defaultsPackageRoot,file.source);if(!existsSync(source))continue;copyFileIfChanged(source,join(projectRoot,file.target),projectRoot,changes,options,file.executable)}for(const legacyFile of LEGACY_PACKAGE_PROJECT_FILES){const target=join(projectRoot,legacyFile);if(!existsSync(target))continue;changes.push({path:legacyFile,action:"remove"});if(!options.dryRun)rmSync(target,{force:!0})}if(!options.dryRun)stampDefaultsSync(targetDefaults,defaultsPackageRoot);return changes}function stampDefaultsSync(targetDefaults,defaultsPackageRoot){const version=manifestVersion(defaultsPackageRoot);if(!version)return;const marker={version,syncedAt:new Date().toISOString()};mkdirSync(targetDefaults,{recursive:!0});writeFileSync(join(targetDefaults,DEFAULTS_SYNC_MARKER),`${JSON.stringify(marker,null,2)}
|
|
1
|
+
import{chmodSync,existsSync,lstatSync,mkdirSync,readFileSync,readdirSync,rmSync,statSync,writeFileSync}from"node:fs";import{dirname,join,relative}from"node:path";import{DEFAULTS_SYNC_MARKER,defaultsPackagePath}from"@stacksjs/path";const DEFAULTS_PACKAGE_IGNORES=new Set(["README.md","build.ts","node_modules","package.json","project","tests"]),LOCAL_DEFAULT_IGNORES=new Set([".DS_Store",".discovered-models.json",DEFAULTS_SYNC_MARKER,"dist","node_modules"]),LEGACY_PACKAGE_PROJECT_FILES=["pantry.lock"],SUPPORT_FILES=[{source:"project/buddy",target:"buddy",executable:!0},{source:"project/bootstrap",target:"bootstrap",executable:!0},{source:"project/storage/framework/tsconfig.app.json",target:"storage/framework/tsconfig.app.json"},{source:"project/storage/framework/tsconfig.base.json",target:"storage/framework/tsconfig.base.json"},{source:"project/storage/framework/server/tsconfig.docker.json",target:"storage/framework/server/tsconfig.docker.json"}];export const FRAMEWORK_TYPES_SUPPORT_DIRECTORY={source:"project/storage/framework/types",target:"storage/framework/types"},GENERATED_FRAMEWORK_TYPES=["server-auto-imports.d.ts","browser-auto-imports.d.ts"];function copyDirectoryIfChanged(source,target,projectRoot,changes,options,skip){for(const entry of readdirSync(source)){if(skip.has(entry)||LOCAL_DEFAULT_IGNORES.has(entry))continue;const sourcePath=join(source,entry),targetPath=join(target,entry);if(lstatSync(sourcePath).isDirectory())copyDirectoryIfChanged(sourcePath,targetPath,projectRoot,changes,options,skip);else copyFileIfChanged(sourcePath,targetPath,projectRoot,changes,options)}}function sameFile(left,right,shallow=!1){if(!existsSync(left)||!existsSync(right))return!1;const leftStat=statSync(left),rightStat=statSync(right);if(leftStat.size!==rightStat.size)return!1;if(shallow)return!0;return readFileSync(left).equals(readFileSync(right))}function copyFileIfChanged(source,target,projectRoot,changes,options,executable=!1){if(sameFile(source,target,options.shallow&&options.dryRun)){if(executable&&!options.dryRun)chmodSync(target,493);return}changes.push({path:relative(projectRoot,target),action:existsSync(target)?"update":"add"});if(options.dryRun)return;mkdirSync(dirname(target),{recursive:!0});writeFileSync(target,readFileSync(source));if(executable)chmodSync(target,493)}function syncDirectory(source,target,projectRoot,changes,options,isRoot=!1){if(!options.dryRun)mkdirSync(target,{recursive:!0});const sourceEntries=new Set;for(const entry of readdirSync(source)){if(isRoot&&DEFAULTS_PACKAGE_IGNORES.has(entry))continue;sourceEntries.add(entry);const sourcePath=join(source,entry),targetPath=join(target,entry);if(lstatSync(sourcePath).isDirectory()){syncDirectory(sourcePath,targetPath,projectRoot,changes,options);continue}copyFileIfChanged(sourcePath,targetPath,projectRoot,changes,options)}if(!existsSync(target))return;for(const entry of readdirSync(target)){if(LOCAL_DEFAULT_IGNORES.has(entry)||sourceEntries.has(entry))continue;const targetPath=join(target,entry);changes.push({path:relative(projectRoot,targetPath),action:"remove"});if(!options.dryRun)rmSync(targetPath,{recursive:!0,force:!0})}}export function syncPackageProjectFiles(projectRoot,defaultsPackageRoot,options={}){const changes=[],targetDefaults=join(projectRoot,"storage/framework/defaults");syncDirectory(defaultsPackageRoot,targetDefaults,projectRoot,changes,options,!0);for(const file of SUPPORT_FILES){const source=join(defaultsPackageRoot,file.source);if(!existsSync(source))continue;copyFileIfChanged(source,join(projectRoot,file.target),projectRoot,changes,options,file.executable)}const typesSource=join(defaultsPackageRoot,FRAMEWORK_TYPES_SUPPORT_DIRECTORY.source);if(existsSync(typesSource))copyDirectoryIfChanged(typesSource,join(projectRoot,FRAMEWORK_TYPES_SUPPORT_DIRECTORY.target),projectRoot,changes,options,new Set(GENERATED_FRAMEWORK_TYPES));for(const legacyFile of LEGACY_PACKAGE_PROJECT_FILES){const target=join(projectRoot,legacyFile);if(!existsSync(target))continue;changes.push({path:legacyFile,action:"remove"});if(!options.dryRun)rmSync(target,{force:!0})}if(!options.dryRun)stampDefaultsSync(targetDefaults,defaultsPackageRoot);return changes}function stampDefaultsSync(targetDefaults,defaultsPackageRoot){const version=manifestVersion(defaultsPackageRoot);if(!version)return;const marker={version,syncedAt:new Date().toISOString()};mkdirSync(targetDefaults,{recursive:!0});writeFileSync(join(targetDefaults,DEFAULTS_SYNC_MARKER),`${JSON.stringify(marker,null,2)}
|
|
2
2
|
`)}function manifestVersion(packageRoot){try{const version=JSON.parse(readFileSync(join(packageRoot,"package.json"),"utf8"))?.version;return typeof version==="string"?version:null}catch{return null}}export function measureDefaultsDrift(projectRoot,options={}){const packageRoot=defaultsPackagePath(projectRoot);if(!existsSync(join(packageRoot,"package.json")))return null;return syncPackageProjectFiles(projectRoot,packageRoot,{dryRun:!0,shallow:options.shallow})}export function summarizeStructureChanges(changes){const added=changes.filter((change)=>change.action==="add").length,updated=changes.filter((change)=>change.action==="update").length,removed=changes.filter((change)=>change.action==="remove").length;return`+${added} ~${updated} -${removed}`}export function migratePackageProjectManifest(pkg){const changes=[],scripts=pkg.scripts??{},setScript=(name,value)=>{if(scripts[name]===value)return;scripts[name]=value;changes.push({path:`package.json#scripts.${name}`,action:"update"})};setScript("buddy","./buddy");setScript("typecheck","bun x --bun tsc --noEmit -p tsconfig.json --pretty false");setScript("typecheck:app","bun x --bun tsc --noEmit -p tsconfig.json --pretty false");setScript("types:check","bun x --bun tsc --noEmit -p tsconfig.json --pretty false");if(scripts["build:reset"]?.includes("storage/framework"))setScript("build:reset","rm -rf node_modules pantry.lock && bun install && ./buddy generate:types && ./buddy lint:fix");if(scripts["build:framework-types"]){delete scripts["build:framework-types"];changes.push({path:"package.json#scripts.build:framework-types",action:"remove"})}pkg.scripts=scripts;if(Array.isArray(pkg.workspaces)){const next=pkg.workspaces.filter((workspace)=>workspace!=="storage/framework/core"&&!workspace.startsWith("storage/framework/core/"));if(next.length!==pkg.workspaces.length){pkg.workspaces=next;changes.push({path:"package.json#workspaces",action:"update"})}}return changes}export function migratePackageProjectTsconfig(projectRoot,options={}){const path=join(projectRoot,"tsconfig.json");if(!existsSync(path))return[];const raw=readFileSync(path,"utf8"),next=raw.replace(/"extends"\s*:\s*"\.\/storage\/framework\/core\/tsconfig\.json"/,'"extends": "./storage/framework/tsconfig.app.json"');if(next===raw)return[];if(!options.dryRun)writeFileSync(path,next);return[{path:"tsconfig.json",action:"update"}]}export function detectProjectAiProviders(projectRoot){const providers=new Set(["codex"]);if(existsSync(join(projectRoot,"CLAUDE.md"))||existsSync(join(projectRoot,".claude")))providers.add("claude");if(existsSync(join(projectRoot,".cursor")))providers.add("cursor");if(existsSync(join(projectRoot,".github/copilot-instructions.md")))providers.add("copilot");if(existsSync(join(projectRoot,"GEMINI.md")))providers.add("gemini");return[...providers]}
|
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.13",
|
|
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.75.
|
|
64
|
-
"@stacksjs/ai": "0.75.
|
|
65
|
-
"@stacksjs/analytics": "0.75.
|
|
66
|
-
"@stacksjs/api": "0.75.
|
|
67
|
-
"@stacksjs/auth": "0.75.
|
|
68
|
-
"@stacksjs/build": "0.75.
|
|
63
|
+
"@stacksjs/action-runner": "0.75.13",
|
|
64
|
+
"@stacksjs/ai": "0.75.13",
|
|
65
|
+
"@stacksjs/analytics": "0.75.13",
|
|
66
|
+
"@stacksjs/api": "0.75.13",
|
|
67
|
+
"@stacksjs/auth": "0.75.13",
|
|
68
|
+
"@stacksjs/build": "0.75.13",
|
|
69
69
|
"@stacksjs/bumpx": "^0.2.6",
|
|
70
70
|
"@stacksjs/bunpress": "^0.2.8",
|
|
71
|
-
"@stacksjs/cli": "0.75.
|
|
72
|
-
"@stacksjs/cloud": "0.75.
|
|
73
|
-
"@stacksjs/cms": "0.75.
|
|
74
|
-
"@stacksjs/components": "^0.2.
|
|
75
|
-
"@stacksjs/config": "0.75.
|
|
76
|
-
"@stacksjs/database": "0.75.
|
|
77
|
-
"@stacksjs/desktop-build": "0.75.
|
|
78
|
-
"@stacksjs/dns": "0.75.
|
|
79
|
-
"@stacksjs/enums": "0.75.
|
|
80
|
-
"@stacksjs/env": "0.75.
|
|
81
|
-
"@stacksjs/error-handling": "0.75.
|
|
71
|
+
"@stacksjs/cli": "0.75.13",
|
|
72
|
+
"@stacksjs/cloud": "0.75.13",
|
|
73
|
+
"@stacksjs/cms": "0.75.13",
|
|
74
|
+
"@stacksjs/components": "^0.2.320",
|
|
75
|
+
"@stacksjs/config": "0.75.13",
|
|
76
|
+
"@stacksjs/database": "0.75.13",
|
|
77
|
+
"@stacksjs/desktop-build": "0.75.13",
|
|
78
|
+
"@stacksjs/dns": "0.75.13",
|
|
79
|
+
"@stacksjs/enums": "0.75.13",
|
|
80
|
+
"@stacksjs/env": "0.75.13",
|
|
81
|
+
"@stacksjs/error-handling": "0.75.13",
|
|
82
82
|
"@stacksjs/gitit": "^0.2.5",
|
|
83
|
-
"@stacksjs/i18n": "0.75.
|
|
84
|
-
"@stacksjs/image": "0.75.
|
|
85
|
-
"@stacksjs/logging": "0.75.
|
|
83
|
+
"@stacksjs/i18n": "0.75.13",
|
|
84
|
+
"@stacksjs/image": "0.75.13",
|
|
85
|
+
"@stacksjs/logging": "0.75.13",
|
|
86
86
|
"@stacksjs/logsmith": "^0.2.3",
|
|
87
|
-
"@stacksjs/orm": "0.75.
|
|
88
|
-
"@stacksjs/path": "0.75.
|
|
89
|
-
"@stacksjs/payments": "0.75.
|
|
90
|
-
"@stacksjs/queue": "0.75.
|
|
91
|
-
"@stacksjs/registry": "0.75.
|
|
92
|
-
"@stacksjs/router": "0.75.
|
|
87
|
+
"@stacksjs/orm": "0.75.13",
|
|
88
|
+
"@stacksjs/path": "0.75.13",
|
|
89
|
+
"@stacksjs/payments": "0.75.13",
|
|
90
|
+
"@stacksjs/queue": "0.75.13",
|
|
91
|
+
"@stacksjs/registry": "0.75.13",
|
|
92
|
+
"@stacksjs/router": "0.75.13",
|
|
93
93
|
"@stacksjs/rpx": "^0.11.54",
|
|
94
|
-
"@stacksjs/scheduler": "0.75.
|
|
95
|
-
"@stacksjs/search-engine": "0.75.
|
|
96
|
-
"@stacksjs/security": "0.75.
|
|
97
|
-
"@stacksjs/server": "0.75.
|
|
98
|
-
"@stacksjs/sites": "0.75.
|
|
99
|
-
"@stacksjs/storage": "0.75.
|
|
100
|
-
"@stacksjs/strings": "0.75.
|
|
101
|
-
"@stacksjs/stx": "^0.2.
|
|
94
|
+
"@stacksjs/scheduler": "0.75.13",
|
|
95
|
+
"@stacksjs/search-engine": "0.75.13",
|
|
96
|
+
"@stacksjs/security": "0.75.13",
|
|
97
|
+
"@stacksjs/server": "0.75.13",
|
|
98
|
+
"@stacksjs/sites": "0.75.13",
|
|
99
|
+
"@stacksjs/storage": "0.75.13",
|
|
100
|
+
"@stacksjs/strings": "0.75.13",
|
|
101
|
+
"@stacksjs/stx": "^0.2.320",
|
|
102
102
|
"@stacksjs/tlsx": "^0.13.19",
|
|
103
103
|
"@stacksjs/ts-cloud": "^0.16.14",
|
|
104
104
|
"@stacksjs/ts-md": "^0.1.1",
|
|
105
|
-
"@stacksjs/tunnel": "0.75.
|
|
106
|
-
"@stacksjs/types": "0.75.
|
|
107
|
-
"@stacksjs/utils": "0.75.
|
|
108
|
-
"@stacksjs/whois": "0.75.
|
|
109
|
-
"bun-plugin-stx": "^0.2.
|
|
105
|
+
"@stacksjs/tunnel": "0.75.13",
|
|
106
|
+
"@stacksjs/types": "0.75.13",
|
|
107
|
+
"@stacksjs/utils": "0.75.13",
|
|
108
|
+
"@stacksjs/whois": "0.75.13",
|
|
109
|
+
"bun-plugin-stx": "^0.2.320"
|
|
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.75.
|
|
124
|
+
"@stacksjs/validation": "0.75.13",
|
|
125
125
|
"better-dx": "^0.2.24"
|
|
126
126
|
}
|
|
127
127
|
}
|