ProcessorsHow-To Guides
Resolve All Files
Load all files into memory with full content
Resolve All Files
Use resolveAll() to load all files matching the processor's globs into memory.
When to Use
Best for:
- Small to medium files where you need full content
- Simple transformations on all files
- When you need random access to any file
Avoid with:
- Very large files (use streaming instead)
- Many files where you only need some (use lazy loading)
Usage
filename="processor.ts"
import { StartProcessorWithLambda } from '@atomicloud/cyan-sdk';StartProcessorWithLambda(async (input, fileHelper) => {// Load ALL files with their content// Returns: VirtualFile[] with content already loaded// Note: Copy-type globs are automatically handled - files are copied directlyconst files = fileHelper.resolveAll();files.forEach(file => {console.log(file.relative); // Path relative to read_dirconsole.log(file.content); // Full file content// Transform and writefile.content = processContent(file.content);file.writeFile();});return { directory: input.writeDir };});
filename="processor.py"
from cyanprintsdk import start_processor_with_fnfrom cyanprintsdk.domain.processor.input import ProcessorInputfrom cyanprintsdk.domain.core.fs.cyan_fs_helper import CyanFileHelperasync def my_processor(input: ProcessorInput, fileHelper: CyanFileHelper):# Load ALL files with their content# Returns: List[VirtualFile] with content already loaded# Note: Copy-type globs are automatically handled - files are copied directlyfiles = fileHelper.resolve_all()for file in files:print(file.relative) # Path relative to read_dirprint(file.content) # Full file content# Transform and writefile.content = process_content(file.content)file.write_file()return {'directory': input.write_directory}start_processor_with_fn(my_processor)
filename="Processor.cs"
using sulfone_helium;using sulfone_helium.Domain.Core.FileSystem;using sulfone_helium.Domain.Processor;CyanEngine.StartProcessor(args, async (input, fileHelper) =>{// Load ALL files with their content// Returns: List<VirtualFile> with content already loaded// Note: Copy-type globs are automatically handled - files are copied directlyvar files = fileHelper.ResolveAll();foreach (var file in files){Console.WriteLine(file.Relative); // Path relative to read_dirConsole.WriteLine(file.Content); // Full file content// Transform and writefile.Content = ProcessContent(file.Content);file.WriteFile();}return new ProcessorOutput { Directory = input.WriteDirectory };});
VirtualFile Properties
Prop
Type
VirtualFile Methods
| Method | Return | Description |
|---|---|---|
writeFile() | void | Write file to write directory |
Example: Variable Substitution
filename="processor.ts"
StartProcessorWithLambda(async (input, fileHelper) => {const files = fileHelper.resolveAll();const config = input.config as { vars: Record<string, string> };files.forEach(file => {// Simple variable substitutionfor (const [key, value] of Object.entries(config.vars)) {file.content = file.content.replaceAll(`{{${key}}}`, value);}file.writeFile();});return { directory: input.writeDir };});
filename="processor.py"
from cyanprintsdk import start_processor_with_fnfrom cyanprintsdk.domain.processor.input import ProcessorInputfrom cyanprintsdk.domain.core.fs.cyan_fs_helper import CyanFileHelperfrom typing import TypedDict, Dictclass Config(TypedDict):vars: Dict[str, str]async def my_processor(input: ProcessorInput, fileHelper: CyanFileHelper):files = fileHelper.resolve_all()config: Config = input.config or {'vars': {}}for file in files:# Simple variable substitutionfor key, value in config.get('vars', {}).items():file.content = file.content.replace(f'{{{{{key}}}}}', value)file.write_file()return {'directory': input.write_directory}start_processor_with_fn(my_processor)
filename="Processor.cs"
using sulfone_helium;using sulfone_helium.Domain.Core.FileSystem;using sulfone_helium.Domain.Processor;public class Config{public Dictionary<string, string> Vars { get; set; } = new();}CyanEngine.StartProcessor(args, async (input, fileHelper) =>{var files = fileHelper.ResolveAll();var config = input.Config.Deserialize<Config>() ?? new Config();foreach (var file in files){// Simple variable substitutionforeach (var kvp in config.Vars){file.Content = file.Content.Replace($"{{{{{kvp.Key}}}}}", kvp.Value);}file.WriteFile();}return new ProcessorOutput { Directory = input.WriteDirectory };});
Example: Filter and Transform
filename="processor.ts"
StartProcessorWithLambda(async (input, fileHelper) => {const files = fileHelper.resolveAll();files.forEach(file => {// Only process markdown filesif (file.relative.endsWith('.md')) {file.content = addFrontmatter(file.content);}// Write all files (including non-md unchanged)file.writeFile();});return { directory: input.writeDir };});
filename="processor.py"
from cyanprintsdk import start_processor_with_fnfrom cyanprintsdk.domain.processor.input import ProcessorInputfrom cyanprintsdk.domain.core.fs.cyan_fs_helper import CyanFileHelperasync def my_processor(input: ProcessorInput, fileHelper: CyanFileHelper):files = fileHelper.resolve_all()for file in files:# Only process markdown filesif file.relative.endswith('.md'):file.content = add_frontmatter(file.content)# Write all files (including non-md unchanged)file.write_file()return {'directory': input.write_directory}start_processor_with_fn(my_processor)
filename="Processor.cs"
using sulfone_helium;using sulfone_helium.Domain.Core.FileSystem;using sulfone_helium.Domain.Processor;CyanEngine.StartProcessor(args, async (input, fileHelper) =>{var files = fileHelper.ResolveAll();foreach (var file in files){// Only process markdown filesif (file.Relative.EndsWith(".md")){file.Content = AddFrontmatter(file.Content);}// Write all files (including non-md unchanged)file.WriteFile();}return new ProcessorOutput { Directory = input.WriteDirectory };});
resolveAll() loads all matched files into memory. For large templates, consider using get() for lazy loading or readAsStream() for memory efficiency. Note: get() returns VirtualFileReference[] which requires calling readFile() to load the content.