@stacksjs/actions 0.75.240 → 0.75.241

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,4 +1,4 @@
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,runPostSyncDatabaseTypesRefresh,runPostSyncDependencyRefresh,runPostSyncMigration,shouldRefreshPostSyncDependencies,shouldRunPostSyncHooks}from"./framework-hooks";import{describeDanglingRouteActions,findDanglingRouteActions,pruneRetiredScaffoldRoutes}from"./route-actions";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,runPostSyncDatabaseTypesRefresh,runPostSyncDependencyRefresh,runPostSyncMigration,shouldRefreshPostSyncDependencies,shouldRunPostSyncHooks}from"./framework-hooks";import{describeDanglingRouteActions,findDanglingRouteActions,pruneRetiredScaffoldRoutes}from"./route-actions";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),explicitLocal=options.from?p.projectPath(options.from):null,detectedLocal=explicitLocal??(shouldAutoDetectLocalStacks(options)?detectLocalStacks(projectRoot):null),usingLocal=!!detectedLocal,willResolveStable=!usingLocal&&!options.version&&!options.canary&&(!!options.stable||currentChannel!=="canary");let latestStableRef=currentVersion?`v${currentVersion}`:"main";if(willResolveStable)latestStableRef=await resolveLatestStableTag()??latestStableRef;const ctx=resolveUpgradeContext(options,currentChannel,latestStableRef);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,5 +9,5 @@ import{chmodSync,copyFileSync,cpSync,existsSync,mkdirSync,mkdtempSync,readFileSy
9
9
  A real run would:`);console.log(" - sync the managed paths above into place");if(!ctx.targetVersion){console.log(` - write channel "${ctx.channel}" to .stacks-channel`);console.log(previewSha?` - record synced sha ${previewSha.slice(0,7)} in .stacks-version`:" - record the resolved commit sha in .stacks-version (unavailable in this preview)")}if(!(!options.noPostinstall&&options.postinstall!==!1))console.log(" - skip post-sync hooks (--no-postinstall)");else if(aggregate.added+aggregate.changed+aggregate.removed===0)console.log(" - skip post-sync hooks (nothing changed)");else{console.log(" - regenerate the auto-import manifest");if(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))}))console.log(" - run `bun install` to refresh dependencies");if(existsSync(join(projectRoot,"database","types.d.ts")))console.log(" - regenerate database/types.d.ts");if(existsSync(join(projectRoot,"database","migrations")))console.log(" - run pending migrations")}if(sawRemoved>0)console.log(`
10
10
  (-N counts files no longer shipped upstream; the sync leaves them in place.)`);console.log(`
11
11
  \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(`
12
- `).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((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 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(`
13
13
  `).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}`)}}try{if(await runPostSyncDatabaseTypesRefresh({cmd:[process.argv[0]||"bun",p.frameworkPath("core/buddy/src/cli.ts"),"generate:db-types"],projectRoot,spawn:(spawnOptions)=>Bun.spawn(spawnOptions),exists:existsSync}))console.log("Regenerated database/types.d.ts")}catch(err){console.warn(` database/types.d.ts was not regenerated (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)}}
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.240",
5
+ "version": "0.75.241",
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.240",
70
- "@stacksjs/ai": "0.75.240",
71
- "@stacksjs/analytics": "0.75.240",
72
- "@stacksjs/api": "0.75.240",
73
- "@stacksjs/auth": "0.75.240",
74
- "@stacksjs/build": "0.75.240",
69
+ "@stacksjs/action-runner": "0.75.241",
70
+ "@stacksjs/ai": "0.75.241",
71
+ "@stacksjs/analytics": "0.75.241",
72
+ "@stacksjs/api": "0.75.241",
73
+ "@stacksjs/auth": "0.75.241",
74
+ "@stacksjs/build": "0.75.241",
75
75
  "@stacksjs/bumpx": "^0.2.25",
76
76
  "@stacksjs/bunpress": "^0.2.15",
77
- "@stacksjs/cli": "0.75.240",
78
- "@stacksjs/cloud": "0.75.240",
79
- "@stacksjs/cms": "0.75.240",
77
+ "@stacksjs/cli": "0.75.241",
78
+ "@stacksjs/cloud": "0.75.241",
79
+ "@stacksjs/cms": "0.75.241",
80
80
  "@stacksjs/components": "^0.2.604",
81
- "@stacksjs/config": "0.75.240",
82
- "@stacksjs/database": "0.75.240",
83
- "@stacksjs/desktop-build": "0.75.240",
84
- "@stacksjs/dns": "0.75.240",
85
- "@stacksjs/enums": "0.75.240",
86
- "@stacksjs/env": "0.75.240",
87
- "@stacksjs/error-handling": "0.75.240",
88
- "@stacksjs/github": "0.75.240",
81
+ "@stacksjs/config": "0.75.241",
82
+ "@stacksjs/database": "0.75.241",
83
+ "@stacksjs/desktop-build": "0.75.241",
84
+ "@stacksjs/dns": "0.75.241",
85
+ "@stacksjs/enums": "0.75.241",
86
+ "@stacksjs/env": "0.75.241",
87
+ "@stacksjs/error-handling": "0.75.241",
88
+ "@stacksjs/github": "0.75.241",
89
89
  "@stacksjs/gitit": "^0.2.5",
90
- "@stacksjs/i18n": "0.75.240",
91
- "@stacksjs/image": "0.75.240",
92
- "@stacksjs/logging": "0.75.240",
90
+ "@stacksjs/i18n": "0.75.241",
91
+ "@stacksjs/image": "0.75.241",
92
+ "@stacksjs/logging": "0.75.241",
93
93
  "@stacksjs/logsmith": "^0.2.11",
94
- "@stacksjs/mobile": "0.75.240",
95
- "@stacksjs/orm": "0.75.240",
96
- "@stacksjs/path": "0.75.240",
97
- "@stacksjs/payments": "0.75.240",
98
- "@stacksjs/queue": "0.75.240",
99
- "@stacksjs/registry": "0.75.240",
100
- "@stacksjs/router": "0.75.240",
94
+ "@stacksjs/mobile": "0.75.241",
95
+ "@stacksjs/orm": "0.75.241",
96
+ "@stacksjs/path": "0.75.241",
97
+ "@stacksjs/payments": "0.75.241",
98
+ "@stacksjs/queue": "0.75.241",
99
+ "@stacksjs/registry": "0.75.241",
100
+ "@stacksjs/router": "0.75.241",
101
101
  "@stacksjs/rpx": "^0.11.54",
102
- "@stacksjs/scheduler": "0.75.240",
103
- "@stacksjs/search-engine": "0.75.240",
104
- "@stacksjs/security": "0.75.240",
105
- "@stacksjs/server": "0.75.240",
106
- "@stacksjs/sites": "0.75.240",
107
- "@stacksjs/storage": "0.75.240",
108
- "@stacksjs/strings": "0.75.240",
102
+ "@stacksjs/scheduler": "0.75.241",
103
+ "@stacksjs/search-engine": "0.75.241",
104
+ "@stacksjs/security": "0.75.241",
105
+ "@stacksjs/server": "0.75.241",
106
+ "@stacksjs/sites": "0.75.241",
107
+ "@stacksjs/storage": "0.75.241",
108
+ "@stacksjs/strings": "0.75.241",
109
109
  "@stacksjs/stx": "^0.2.604",
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.240",
114
- "@stacksjs/types": "0.75.240",
115
- "@stacksjs/utils": "0.75.240",
116
- "@stacksjs/whois": "0.75.240",
113
+ "@stacksjs/tunnel": "0.75.241",
114
+ "@stacksjs/types": "0.75.241",
115
+ "@stacksjs/utils": "0.75.241",
116
+ "@stacksjs/whois": "0.75.241",
117
117
  "bun-plugin-stx": "^0.2.604"
118
118
  },
119
119
  "peerDependencies": {
@@ -129,7 +129,7 @@
129
129
  }
130
130
  },
131
131
  "devDependencies": {
132
- "@stacksjs/validation": "0.75.240",
132
+ "@stacksjs/validation": "0.75.241",
133
133
  "better-dx": "^0.2.24"
134
134
  }
135
135
  }