LogoCyanPrint
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 directly
const files = fileHelper.resolveAll();
files.forEach(file => {
console.log(file.relative); // Path relative to read_dir
console.log(file.content); // Full file content
// Transform and write
file.content = processContent(file.content);
file.writeFile();
});
return { directory: input.writeDir };
});
filename="processor.py"
from cyanprintsdk import start_processor_with_fn
from cyanprintsdk.domain.processor.input import ProcessorInput
from cyanprintsdk.domain.core.fs.cyan_fs_helper import CyanFileHelper
async 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 directly
files = fileHelper.resolve_all()
for file in files:
print(file.relative) # Path relative to read_dir
print(file.content) # Full file content
# Transform and write
file.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 directly
var files = fileHelper.ResolveAll();
foreach (var file in files)
{
Console.WriteLine(file.Relative); // Path relative to read_dir
Console.WriteLine(file.Content); // Full file content
// Transform and write
file.Content = ProcessContent(file.Content);
file.WriteFile();
}
return new ProcessorOutput { Directory = input.WriteDirectory };
});

VirtualFile Properties

Prop

Type

VirtualFile Methods

MethodReturnDescription
writeFile()voidWrite 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 substitution
for (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_fn
from cyanprintsdk.domain.processor.input import ProcessorInput
from cyanprintsdk.domain.core.fs.cyan_fs_helper import CyanFileHelper
from typing import TypedDict, Dict
class 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 substitution
for 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 substitution
foreach (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 files
if (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_fn
from cyanprintsdk.domain.processor.input import ProcessorInput
from cyanprintsdk.domain.core.fs.cyan_fs_helper import CyanFileHelper
async def my_processor(input: ProcessorInput, fileHelper: CyanFileHelper):
files = fileHelper.resolve_all()
for file in files:
# Only process markdown files
if 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 files
if (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.