@stacksjs/server 0.75.301 → 0.75.302

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.
@@ -0,0 +1,14 @@
1
+ /** Read the installed compiler's delivery registries, never its ambient types. */
2
+ export declare function browserAutoImportSurface(): Promise<BrowserAutoImportSurface | undefined>;
3
+ declare function names(values: readonly string[]): string;
4
+ /** Compact, deterministic reference read on demand by the bundled AI skills. */
5
+ export declare function renderAutoImportReference(server: readonly AutoImportGroup[], browser?: BrowserAutoImportSurface): string;
6
+ export declare interface AutoImportGroup {
7
+ source: string
8
+ names: readonly string[]
9
+ }
10
+ export declare interface BrowserAutoImportSurface {
11
+ runtime: readonly string[]
12
+ macros: readonly string[]
13
+ demand: readonly string[]
14
+ }
@@ -0,0 +1,2 @@
1
+ export async function browserAutoImportSurface(){try{const[runtime,demand,caching]=await Promise.all([import("@stacksjs/stx/runtime-globals"),import("@stacksjs/stx/unresolved-identifiers"),import("@stacksjs/stx/caching")]),aliases=[...(await caching.getCachedSignalsRuntime(!1)).matchAll(/window\.([A-Za-z_$][\w$]*)\s*=/g)].map((match)=>match[1]).filter((name)=>!name.startsWith("__")&&!name.startsWith("$"));return{runtime:[...new Set([...runtime.STX_RUNTIME_GLOBALS,...aliases])],macros:runtime.COMPILE_TIME_ONLY_GLOBALS,demand:demand.SERVER_ONLY_COMPOSABLES}}catch{return}}function names(values){return[...new Set(values)].sort().map((name)=>`\`${name}\``).join(", ")||"(none)"}export function renderAutoImportReference(server,browser){const lines=["# Available auto-imports","","<!-- Generated by buddy generate:auto-imports. Edit runtime sources, then regenerate. -->","","Use these names without imports in the context listed below. This project reference","is refreshed by buddy generate, buddy generate:types and buddy generate:auto-imports.","Read only the relevant section; package exports outside these lists need imports.","","## Server after Stacks boot","","Available in actions, routes, jobs, controllers and server-rendered templates after","injectGlobalAutoImports completes. Standalone scripts, tests and framework packages","that do not boot Stacks use explicit imports. Type-only exports always need type imports.","Models may require an enabled feature or database readiness for operations.","App definitions override defaults; explicit app-model imports retain exact inference.","If boot reports a failed package or barrel, its names are unavailable until it loads.","","| Runtime source | Names available without imports |","| --- | --- |",...server.filter((group)=>group.names.length).map((group)=>`| ${group.source} | ${names(group.names)} |`),"","Platform globals keep their built-in meaning. Import colliding app exports explicitly.","","## STX client scripts","","These names belong to `<script client>` and component client scripts. A TypeScript","module imported by a client script declares its own imports; template bindings do","not leak into module scope. Server helpers and resources/functions exports are not","automatically browser globals. Bare STX helpers can differ from imported Stacks APIs;","read stacks-composables/BROWSER.md for signatures before using them.",""];if(browser){const macros=new Set(browser.macros),runtime=new Set(browser.runtime);lines.push("### Runtime and compiler bindings","",names(browser.runtime.filter((name)=>!macros.has(name))),"","### Compiler macros","",names(browser.macros),"","### Demand-delivered calls","","The installed STX compiler emits these helpers when it detects an authored call.","Call them directly in the client script; do not assume an unused helper exists on window.","",names(browser.demand.filter((name)=>!runtime.has(name))),"")}else lines.push("Installed STX delivery registries are unavailable. Check the installed STX","runtime/compiler before omitting browser imports; ambient declarations are insufficient.","");return lines.join(`
2
+ `)}
package/dist/imports.js CHANGED
@@ -1,4 +1,4 @@
1
- var {require}=import.meta;import{existsSync,readFileSync,renameSync,statSync,unlinkSync}from"node:fs";import{dirname,isAbsolute,relative,resolve as resolvePath}from"node:path";import{fileURLToPath}from"node:url";import{plugin}from"bun";import{log}from"@stacksjs/logging/runtime";import{path}from"@stacksjs/path";import{autoImports,generateRuntimeIndex,generateGlobalsScript}from"bun-plugin-auto-imports";import{globSync}from"@stacksjs/storage/glob";import{primitiveAutoImportEntries,primitiveModules}from"./primitive-imports";import{defaultImportSpecifier,isFrameworkSourceCheckout}from"./default-import-specifier";const OPTIONAL_MODEL_MODULES={commerce:["config/commerce.ts"],Content:["config/cms.ts","config/blog.ts"],Forms:["config/forms.ts"],realtime:["config/realtime.ts"]};function configEnabled(configRelPaths){if(process.env.STACKS_CANONICAL_FEATURES==="1")return!0;return configRelPaths.some((rel)=>existsSync(path.projectPath(rel)))}export function frameworkDefaultsDir(sub){const vendored=path.storagePath(`framework/defaults/${sub}`);return resolveDefaultsDir(existsSync(vendored)?vendored:void 0,packagedDefaultsDir(sub),vendoredDefaultsAreStale())}export function resolveDefaultsDir(vendored,packaged,vendoredIsStale){if(packaged&&vendoredIsStale)return packaged;return vendored??packaged}function packagedDefaultsDir(sub){try{const packaged=`${dirname(fileURLToPath(import.meta.resolve("@stacksjs/defaults/package.json")))}/${sub}`;return existsSync(packaged)?packaged:void 0}catch{return}}function defaultsModuleSpecifier(){const roots=existingDirs([path.storagePath("framework/defaults"),packagedDefaultsDir("")]),sourceCheckout=isFrameworkSourceCheckout(path.projectPath());return(file)=>defaultImportSpecifier(file,roots,sourceCheckout)}function declarationModuleSpecifier(file,outputPath,mapper=defaultsModuleSpecifier()){if(!isAbsolute(file)&&!file.startsWith("."))return file;const canonical=mapper(file,outputPath);if(canonical)return canonical;const local=relative(dirname(outputPath),file).replace(/\\/g,"/").replace(/\.ts$/,"");return local.startsWith(".")?local:`./${local}`}let defaultsAreStale;function vendoredDefaultsAreStale(){if(defaultsAreStale===void 0)defaultsAreStale=path.inspectDefaultsProvenance().status==="stale";return defaultsAreStale}function existingDirs(dirs){return dirs.filter((dir)=>Boolean(dir)&&existsSync(dir))}function packageModelDirs(){try{const{packageModelRoots}=require("@stacksjs/config");return packageModelRoots().map((root)=>root.dir)}catch{return[]}}async function writeGeneratedFile(outputPath,contents){const temp=`${outputPath}.${process.pid}.tmp`;try{await Bun.write(temp,contents);renameSync(temp,outputPath)}catch(error){try{unlinkSync(temp)}catch{}throw error}}function packageJobDirs(){try{const{packageJobRoots}=require("@stacksjs/config");return packageJobRoots().map((root)=>root.dir)}catch{return[]}}function resolveDefaultModelDirs(){const root=frameworkDefaultsDir("app/Models");if(!root)return[];const dirs=[root];for(const[subdir,configPaths]of Object.entries(OPTIONAL_MODEL_MODULES))if(configEnabled(configPaths))dirs.push(`${root}/${subdir}`);return dirs}function scanDirTopLevel(dir){try{return globSync(`${dir}/*.ts`,{ignore:["**/*.d.ts","**/index.ts","**/README*"]}).sort()}catch{return[]}}function scanDefineModelExports(dir,opts={}){const{recursive=!0}=opts;let files=[];try{const pattern=recursive?`${dir}/**/*.ts`:`${dir}/*.ts`;files=globSync(pattern,{ignore:["**/*.d.ts","**/index.ts","**/README*"]}).sort()}catch{return[]}const exports=[],seen=new Set;for(const file of files){const basename=file.split("/").pop()?.replace(".ts","")||"";if(basename&&!seen.has(basename)){seen.add(basename);exports.push({name:basename,file,isDefault:!0})}}return exports}const GLOBAL_SHADOW_BLOCKLIST=new Set(["Error","Request","Response","URL","Map","Set","Object","Array","Number","String","Date","Promise","Symbol"]);async function generateDefineModelIndex(entries,outputPath){const lines=["// Generated by bun-plugin-auto-imports"],seen=new Set,moduleSpecifier=defaultsModuleSpecifier();for(const entry of entries){const dir=typeof entry==="string"?entry:entry.dir,recursive=typeof entry==="string"?!0:entry.recursive;let files=[];try{const pattern=recursive?`${dir}/**/*.ts`:`${dir}/*.ts`;files=globSync(pattern,{ignore:["**/*.d.ts","**/index.ts","**/README*"]}).sort()}catch{continue}for(const file of files){const basename=file.split("/").pop()?.replace(".ts","")||"";if(!basename||seen.has(basename))continue;seen.add(basename);const relativePath=moduleSpecifier(file,outputPath)??relative(dirname(outputPath),file).replace(/\\/g,"/").replace(/\.ts$/,"");if(GLOBAL_SHADOW_BLOCKLIST.has(basename)){lines.push(`// Skipped '${basename}' - would shadow a built-in global. Import directly if needed.`);lines.push(`// export { default as ${basename} } from '${relativePath}'`);continue}lines.push(`export { default as ${basename} } from '${relativePath}'`)}}await writeGeneratedFile(outputPath,`${lines.join(`
1
+ var {require}=import.meta;import{existsSync,readFileSync,renameSync,statSync,unlinkSync}from"node:fs";import{dirname,isAbsolute,relative,resolve as resolvePath}from"node:path";import{fileURLToPath}from"node:url";import{plugin}from"bun";import{log}from"@stacksjs/logging/runtime";import{path}from"@stacksjs/path";import{autoImports,generateRuntimeIndex,generateGlobalsScript}from"bun-plugin-auto-imports";import{globSync}from"@stacksjs/storage/glob";import{primitiveAutoImportEntries,primitiveModules}from"./primitive-imports";import{defaultImportSpecifier,isFrameworkSourceCheckout}from"./default-import-specifier";import{browserAutoImportSurface,renderAutoImportReference}from"./auto-import-reference";const OPTIONAL_MODEL_MODULES={commerce:["config/commerce.ts"],Content:["config/cms.ts","config/blog.ts"],Forms:["config/forms.ts"],realtime:["config/realtime.ts"]};function configEnabled(configRelPaths){if(process.env.STACKS_CANONICAL_FEATURES==="1")return!0;return configRelPaths.some((rel)=>existsSync(path.projectPath(rel)))}export function frameworkDefaultsDir(sub){const vendored=path.storagePath(`framework/defaults/${sub}`);return resolveDefaultsDir(existsSync(vendored)?vendored:void 0,packagedDefaultsDir(sub),vendoredDefaultsAreStale())}export function resolveDefaultsDir(vendored,packaged,vendoredIsStale){if(packaged&&vendoredIsStale)return packaged;return vendored??packaged}function packagedDefaultsDir(sub){try{const packaged=`${dirname(fileURLToPath(import.meta.resolve("@stacksjs/defaults/package.json")))}/${sub}`;return existsSync(packaged)?packaged:void 0}catch{return}}function defaultsModuleSpecifier(){const roots=existingDirs([path.storagePath("framework/defaults"),packagedDefaultsDir("")]),sourceCheckout=isFrameworkSourceCheckout(path.projectPath());return(file)=>defaultImportSpecifier(file,roots,sourceCheckout)}function declarationModuleSpecifier(file,outputPath,mapper=defaultsModuleSpecifier()){if(!isAbsolute(file)&&!file.startsWith("."))return file;const canonical=mapper(file,outputPath);if(canonical)return canonical;const local=relative(dirname(outputPath),file).replace(/\\/g,"/").replace(/\.ts$/,"");return local.startsWith(".")?local:`./${local}`}let defaultsAreStale;function vendoredDefaultsAreStale(){if(defaultsAreStale===void 0)defaultsAreStale=path.inspectDefaultsProvenance().status==="stale";return defaultsAreStale}function existingDirs(dirs){return dirs.filter((dir)=>Boolean(dir)&&existsSync(dir))}function packageModelDirs(){try{const{packageModelRoots}=require("@stacksjs/config");return packageModelRoots().map((root)=>root.dir)}catch{return[]}}async function writeGeneratedFile(outputPath,contents){const temp=`${outputPath}.${process.pid}.tmp`;try{await Bun.write(temp,contents);renameSync(temp,outputPath)}catch(error){try{unlinkSync(temp)}catch{}throw error}}function packageJobDirs(){try{const{packageJobRoots}=require("@stacksjs/config");return packageJobRoots().map((root)=>root.dir)}catch{return[]}}function resolveDefaultModelDirs(){const root=frameworkDefaultsDir("app/Models");if(!root)return[];const dirs=[root];for(const[subdir,configPaths]of Object.entries(OPTIONAL_MODEL_MODULES))if(configEnabled(configPaths))dirs.push(`${root}/${subdir}`);return dirs}function scanDirTopLevel(dir){try{return globSync(`${dir}/*.ts`,{ignore:["**/*.d.ts","**/index.ts","**/README*"]}).sort()}catch{return[]}}function scanDefineModelExports(dir,opts={}){const{recursive=!0}=opts;let files=[];try{const pattern=recursive?`${dir}/**/*.ts`:`${dir}/*.ts`;files=globSync(pattern,{ignore:["**/*.d.ts","**/index.ts","**/README*"]}).sort()}catch{return[]}const exports=[],seen=new Set;for(const file of files){const basename=file.split("/").pop()?.replace(".ts","")||"";if(basename&&!seen.has(basename)){seen.add(basename);exports.push({name:basename,file,isDefault:!0})}}return exports}const GLOBAL_SHADOW_BLOCKLIST=new Set(["Error","Request","Response","URL","Map","Set","Object","Array","Number","String","Date","Promise","Symbol"]);async function generateDefineModelIndex(entries,outputPath){const lines=["// Generated by bun-plugin-auto-imports"],seen=new Set,moduleSpecifier=defaultsModuleSpecifier();for(const entry of entries){const dir=typeof entry==="string"?entry:entry.dir,recursive=typeof entry==="string"?!0:entry.recursive;let files=[];try{const pattern=recursive?`${dir}/**/*.ts`:`${dir}/*.ts`;files=globSync(pattern,{ignore:["**/*.d.ts","**/index.ts","**/README*"]}).sort()}catch{continue}for(const file of files){const basename=file.split("/").pop()?.replace(".ts","")||"";if(!basename||seen.has(basename))continue;seen.add(basename);const relativePath=moduleSpecifier(file,outputPath)??relative(dirname(outputPath),file).replace(/\\/g,"/").replace(/\.ts$/,"");if(GLOBAL_SHADOW_BLOCKLIST.has(basename)){lines.push(`// Skipped '${basename}' - would shadow a built-in global. Import directly if needed.`);lines.push(`// export { default as ${basename} } from '${relativePath}'`);continue}lines.push(`export { default as ${basename} } from '${relativePath}'`)}}await writeGeneratedFile(outputPath,`${lines.join(`
2
2
  `)}
3
3
  `)}async function generatePathIndex(entries,outputPath,options){const prefix=options.prefix??"",extensions=options.extensions??[".ts"],found=new Map,moduleSpecifier=defaultsModuleSpecifier();for(const entry of entries){const dir=typeof entry==="string"?entry:entry.dir,recursive=typeof entry==="string"?!0:entry.recursive;let files=[];try{for(const extension of extensions){const pattern=recursive?`${dir}/**/*${extension}`:`${dir}/*${extension}`;files.push(...globSync(pattern).sort())}}catch{continue}const rank=(file)=>extensions.findIndex((extension)=>file.endsWith(extension));files=files.sort((left,right)=>{const byRank=rank(left)-rank(right);if(byRank!==0)return byRank;return left<right?-1:left>right?1:0});for(const file of files){const basename=file.split("/").pop()??"";if(basename.endsWith(".d.ts")||basename.endsWith(".test.ts")||basename.endsWith(".spec.ts")||basename==="index.ts")continue;const extension=extensions.find((candidate)=>file.endsWith(candidate))??"",key=prefix+relative(dir,file).slice(0,extension.length?-extension.length:void 0);if(found.has(key))continue;found.set(key,moduleSpecifier(file,outputPath)??relative(dirname(outputPath),file).replace(/\\/g,"/"))}}const lines=["// Generated by bun-plugin-auto-imports","//","// Name to package export or relative file. The resolvers read it, and the name","// types are `keyof` over it - so a name that type-checks is a name that","// resolves. Values are paths rather than import thunks on purpose: thunks","// would make every compilation that touches a name resolve every module.",`export const ${options.exportName} = {`,...[...found.entries()].map(([key,file])=>` '${key}': '${file}',`),"} as const",""];await writeGeneratedFile(outputPath,lines.join(`
4
4
  `))}export function autoImportSourceDirs(){return existingDirs([path.resourcesPath("functions"),frameworkDefaultsDir("functions"),path.userModelsPath(),...resolveDefaultModelDirs(),path.userJobsPath(),frameworkDefaultsDir("app/Jobs"),...packageJobDirs(),path.userControllersPath(),frameworkDefaultsDir("app/Controllers"),path.appPath("Actions"),frameworkDefaultsDir("app/Actions"),path.appPath("Listeners"),frameworkDefaultsDir("app/Listeners"),path.appPath("Policies"),frameworkDefaultsDir("app/Policies"),path.appPath("Middleware"),frameworkDefaultsDir("app/Middleware"),path.resourcesPath("emails"),frameworkDefaultsDir("resources/emails")])}export function autoImportsAreStale(){const manifest=path.storagePath("framework/auto-imports/functions.ts");if(!existsSync(manifest))return!0;let manifestTime;try{manifestTime=statSync(manifest).mtimeMs}catch{return!0}const discovered=path.storagePath("framework/discovered-packages.json");try{if(existsSync(discovered)&&statSync(discovered).mtimeMs>manifestTime)return!0}catch{}for(const dir of autoImportSourceDirs()){if(!existsSync(dir))continue;try{if(statSync(dir).mtimeMs>manifestTime)return!0;for(const file of globSync(`${dir}/**/*.ts`,{ignore:["**/*.d.ts"]}))if(statSync(file).mtimeMs>manifestTime)return!0}catch{continue}}return recordedSourceFingerprint()!==autoImportSourceFingerprint()}export function autoImportSourceFingerprint(){const root=path.projectPath(),files=[];for(const dir of autoImportSourceDirs())for(const file of globSync(`${dir}/**/*.ts`,{ignore:["**/*.d.ts"]}))files.push(relative(root,file));files.sort();let packages="";try{const manifest=JSON.parse(readFileSync(path.storagePath("framework/discovered-packages.json"),"utf8"));packages=JSON.stringify(Object.keys(manifest.packages??{}).sort().map((name)=>[name,manifest.packages[name]]))}catch{}return new Bun.CryptoHasher("sha256").update(files.join(`
@@ -8,7 +8,7 @@ var {require}=import.meta;import{existsSync,readFileSync,renameSync,statSync,unl
8
8
  `)}
9
9
  `}async function invalidateTypeScriptBuildInfo(){const cacheDir=path.storagePath("framework/.cache/typescript");try{const{readdirSync,rmSync}=await import("node:fs");for(const entry of readdirSync(cacheDir)){if(!entry.endsWith(".tsbuildinfo"))continue;rmSync(`${cacheDir}/${entry}`,{force:!0});log.debug(`[auto-imports] dropped stale ${entry}`)}}catch{}}export function initiateImports(){const moduleSpecifier=defaultsModuleSpecifier(),functionsPath=path.resourcesPath("functions"),defaultFunctionsPath=frameworkDefaultsDir("functions"),userModelsPath=path.userModelsPath(),defaultModelDirs=resolveDefaultModelDirs(),[defaultsRoot,...enabledSubdirs]=defaultModelDirs,userJobsPath=path.userJobsPath(),userControllersPath=path.userControllersPath(),defaultControllersPath=frameworkDefaultsDir("app/Controllers"),defineModelExports=[...scanDefineModelExports(userModelsPath),...packageModelDirs().flatMap((dir)=>scanDefineModelExports(dir)),...defaultsRoot?scanDefineModelExports(defaultsRoot,{recursive:!1}):[],...enabledSubdirs.flatMap((d)=>scanDefineModelExports(d))],seenJobs=new Set,jobExports=[...scanDefineModelExports(userJobsPath),...packageJobDirs().flatMap((dir)=>scanDefineModelExports(dir))].filter((exp)=>{if(seenJobs.has(exp.name))return!1;seenJobs.add(exp.name);return!0}),seen=new Set,uniqueDefineModelExports=defineModelExports.filter((exp)=>{if(seen.has(exp.name))return!1;seen.add(exp.name);return!0}),dtsDir=dirname(path.storagePath("framework/types/server-auto-imports.d.ts")),defineModelImports=uniqueDefineModelExports.map((exp)=>({from:declarationModuleSpecifier(exp.file,`${dtsDir}/server-auto-imports.d.ts`,moduleSpecifier),name:"default",as:exp.name})),jobImports=jobExports.map((exp)=>({from:declarationModuleSpecifier(exp.file,`${dtsDir}/server-auto-imports.d.ts`,moduleSpecifier),name:"default",as:exp.name})),controllerExports=[...scanDefineModelExports(userControllersPath),...defaultControllersPath?scanDefineModelExports(defaultControllersPath):[]],seenControllers=new Set,controllerImports=controllerExports.filter((exp)=>{if(seenControllers.has(exp.name))return!1;seenControllers.add(exp.name);return!0}).map((exp)=>({from:declarationModuleSpecifier(exp.file,`${dtsDir}/server-auto-imports.d.ts`,moduleSpecifier),name:"default",as:exp.name})),options={moduleSpecifier,dts:path.storagePath("framework/types/server-auto-imports.d.ts"),imports:[...primitiveAutoImportEntries(),...defineModelImports,...jobImports,...controllerImports],dirs:existingDirs([functionsPath,defaultFunctionsPath]),eslint:{enabled:!0,filepath:path.storagePath("framework/server-auto-imports.json")}};plugin(autoImports(options));generateAutoImportFiles().catch((err)=>{console.error("[Server] Failed to generate auto-import files:",err)})}export async function generateServerAutoImportTypes(){const moduleSpecifier=defaultsModuleSpecifier(),seen=new Set,valueExports=[...barrelExports("models"),...barrelExports("jobs"),...barrelExports("controllers"),...await ormModelGlobals()].filter((exp)=>!GLOBAL_SHADOW_BLOCKLIST.has(exp.name)).filter((exp)=>{if(seen.has(exp.name))return!1;seen.add(exp.name);return!0}),outputPath=path.storagePath("framework/types/server-auto-imports.d.ts"),declaredValues=new Set(valueExports.map((exp)=>exp.name)),lines=["// Generated by Stacks server auto-imports","// This file is regenerated automatically when the API starts.","export {}","declare global {"];for(const{from,name,as}of primitiveAutoImportEntries())if(!declaredValues.has(as))lines.push(` const ${as}: typeof import('${from}')['${name}']`);for(const exp of valueExports){if(!exp.isDefault){lines.push(` const ${exp.name}: typeof import('${exp.file}')['${exp.name}']`);continue}const relativePath=declarationModuleSpecifier(exp.file,outputPath,moduleSpecifier);lines.push(` const ${exp.name}: typeof import('${relativePath}')['default']`)}lines.push("}","");await writeGeneratedFile(outputPath,lines.join(`
10
10
  `));const globals={};for(const{as}of primitiveAutoImportEntries())if(!declaredValues.has(as))globals[as]=!0;for(const exp of valueExports)globals[exp.name]=!0;await Bun.write(path.storagePath("framework/server-auto-imports.json"),`${JSON.stringify({globals:Object.fromEntries(Object.keys(globals).sort().map((k)=>[k,!0]))},null,2)}
11
- `)}function barrelExports(barrel){const file=path.storagePath(`framework/auto-imports/${barrel}.ts`);if(!existsSync(file))return[];const source=readFileSync(file,"utf8"),outputDir=dirname(file),found=[];for(const line of source.split(`
11
+ `);const groups=primitiveModules.map(([source,names])=>({source:`\`${source}\``,names:[...names]}));for(const barrel of COMBINED_BARRELS){const file=path.storagePath(`framework/auto-imports/${barrel}.ts`),names=[...existsSync(file)?barrelExportNames(readFileSync(file,"utf8")):new Map].filter(([name,info])=>!info.typeOnly&&!GLOBAL_SHADOW_BLOCKLIST.has(name)).map(([name])=>name);if(barrel==="models")names.push(...valueExports.filter((exp)=>!exp.isDefault).map((exp)=>exp.name));groups.push({source:`\`auto-imports/${barrel}.ts\`${barrel==="models"?" + ORM proxies":""}`,names})}const claimed=new Set;for(const group of[...groups].reverse())group.names=group.names.filter((name)=>{if(claimed.has(name))return!1;claimed.add(name);return!0});await writeGeneratedFile(path.storagePath("framework/auto-imports/RUNTIME.md"),renderAutoImportReference(groups,await browserAutoImportSurface()))}function barrelExports(barrel){const file=path.storagePath(`framework/auto-imports/${barrel}.ts`);if(!existsSync(file))return[];const source=readFileSync(file,"utf8"),outputDir=dirname(file),found=[];for(const line of source.split(`
12
12
  `)){const match=/^export \{ default as (\w+) \} from '([^']+)'/.exec(line.trim());if(!match)continue;const[,name,relativePath]=match,specifier=relativePath,file=specifier.startsWith(".")||isAbsolute(specifier)?resolvePath(outputDir,specifier.endsWith(".ts")?specifier:`${specifier}.ts`):specifier;found.push({name,file,isDefault:!0})}return found}export async function pruneBrowserAutoImportTypes(){const outputPath=path.storagePath("framework/types/browser-auto-imports.d.ts");if(!existsSync(outputPath))return[];const source=readFileSync(outputPath,"utf8"),removed=[],kept=[];for(const line of source.split(`
13
13
  `)){const match=/^ {2}const (\w+): typeof import\('([^']+)'\)\['(\w+)'\]/.exec(line);if(!match){kept.push(line);continue}const[,declaredAs]=match;removed.push(declaredAs)}const staleHeaders=new Set(["// Generated by unplugin-auto-import","// Pruned by Stacks: every name below is exported by the module beside it."]),pruned=kept.filter((line)=>line.trim()!=="// @ts-nocheck").map((line)=>staleHeaders.has(line.trim())?"// Emptied by Stacks: nothing injects a bare name into a template. See stacksjs/stacks#2585.":line).join(`
14
14
  `);if(pruned===source)return removed;await Bun.write(outputPath,pruned);const globals=[...pruned.matchAll(/^ {2}const (\w+):/gm)].map((match)=>match[1]).sort();await Bun.write(path.storagePath("framework/browser-auto-imports.json"),`${JSON.stringify({globals:Object.fromEntries(globals.map((name)=>[name,!0]))},null,2)}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@stacksjs/server",
3
3
  "type": "module",
4
4
  "sideEffects": false,
5
- "version": "0.75.301",
5
+ "version": "0.75.302",
6
6
  "description": "Local development and production-ready.",
7
7
  "author": "Chris Breuer",
8
8
  "contributors": [
@@ -58,21 +58,22 @@
58
58
  "prepublishOnly": "bun run build"
59
59
  },
60
60
  "dependencies": {
61
- "@stacksjs/auth": "0.75.301",
61
+ "@stacksjs/auth": "0.75.302",
62
62
  "@stacksjs/bun-router": "^0.1.24",
63
- "@stacksjs/config": "0.75.301",
64
- "@stacksjs/events": "0.75.301",
65
- "@stacksjs/i18n": "0.75.301",
66
- "@stacksjs/logging": "0.75.301",
67
- "@stacksjs/orm": "0.75.301",
68
- "@stacksjs/path": "0.75.301",
69
- "@stacksjs/payments": "0.75.301",
70
- "@stacksjs/router": "0.75.301",
71
- "@stacksjs/storage": "0.75.301",
63
+ "@stacksjs/config": "0.75.302",
64
+ "@stacksjs/events": "0.75.302",
65
+ "@stacksjs/i18n": "0.75.302",
66
+ "@stacksjs/logging": "0.75.302",
67
+ "@stacksjs/orm": "0.75.302",
68
+ "@stacksjs/path": "0.75.302",
69
+ "@stacksjs/payments": "0.75.302",
70
+ "@stacksjs/router": "0.75.302",
71
+ "@stacksjs/storage": "0.75.302",
72
+ "@stacksjs/stx": "0.2.687",
72
73
  "bun-plugin-auto-imports": "^0.4.4"
73
74
  },
74
75
  "devDependencies": {
75
- "@stacksjs/validation": "0.75.301",
76
+ "@stacksjs/validation": "0.75.302",
76
77
  "better-dx": "^0.2.24"
77
78
  }
78
79
  }