The resolver walked your selection's dependency graph and produced the closure
below. Items under Auto-included were pulled in because the items you
ticked reference them; unticking
Include all dependencies exports the seed alone.
{ _includeDependencies = ((bool?)e.Value) == true; await ReresolveAsync(); }" />
Selected by you
@foreach (var t in _resolved.Templates.Where(t => seedTemplateIds.Contains(t.Id)).OrderBy(t => t.Name, StringComparer.OrdinalIgnoreCase))
{
- Template: @t.Name
}
@foreach (var s in _resolved.SharedScripts.Where(s => seedSharedScripts.Contains(s.Id)).OrderBy(s => s.Name, StringComparer.OrdinalIgnoreCase))
{
- SharedScript: @s.Name
}
@foreach (var e in _resolved.ExternalSystems.Where(e => seedExternalSystems.Contains(e.Id)).OrderBy(e => e.Name, StringComparer.OrdinalIgnoreCase))
{
- ExternalSystem: @e.Name
}
@foreach (var d in _resolved.DatabaseConnections.OrderBy(d => d.Name, StringComparer.OrdinalIgnoreCase))
{
- DatabaseConnection: @d.Name
}
@foreach (var n in _resolved.NotificationLists.OrderBy(n => n.Name, StringComparer.OrdinalIgnoreCase))
{
- NotificationList: @n.Name
}
@foreach (var s in _resolved.SmtpConfigs.OrderBy(s => s.Host, StringComparer.OrdinalIgnoreCase))
{
- SmtpConfig: @s.Host
}
@* SMS configs in the closure, mirroring SmtpConfig above; AccountSid only, never AuthToken. *@
@foreach (var s in _resolved.SmsConfigs.OrderBy(s => s.AccountSid, StringComparer.OrdinalIgnoreCase))
{
- SmsConfig: @s.AccountSid
}
@* Inbound API keys are not transported — methods only. *@
@foreach (var m in _resolved.ApiMethods.OrderBy(m => m.Name, StringComparer.OrdinalIgnoreCase))
{
- ApiMethod: @m.Name
}
@foreach (var s in _resolved.Sites.Where(s => seedSiteIds.Contains(s.Id)).OrderBy(s => s.SiteIdentifier, StringComparer.OrdinalIgnoreCase))
{
- Site: @s.Name (@s.SiteIdentifier)
}
@foreach (var i in _resolved.Instances.Where(i => seedInstanceIds.Contains(i.Id)).OrderBy(i => i.UniqueName, StringComparer.OrdinalIgnoreCase))
{
- Instance: @i.UniqueName
}
Auto-included (dependencies)
@if (autoTemplates.Count + autoShared.Count + autoExternals.Count
+ autoSites.Count + autoInstances.Count + _resolved.DataConnections.Count
+ _resolved.TemplateFolders.Count == 0)
{
No additional dependencies.
}
else
{
@foreach (var f in _resolved.TemplateFolders.OrderBy(f => f.Name, StringComparer.OrdinalIgnoreCase))
{
- TemplateFolder: @f.Name
}
@foreach (var t in autoTemplates.OrderBy(t => t.Name, StringComparer.OrdinalIgnoreCase))
{
- Template: @t.Name
}
@foreach (var s in autoShared.OrderBy(s => s.Name, StringComparer.OrdinalIgnoreCase))
{
- SharedScript: @s.Name
}
@foreach (var e in autoExternals.OrderBy(e => e.Name, StringComparer.OrdinalIgnoreCase))
{
- ExternalSystem: @e.Name
}
@foreach (var s in autoSites.OrderBy(s => s.SiteIdentifier, StringComparer.OrdinalIgnoreCase))
{
- Site: @s.Name (@s.SiteIdentifier)
}
@foreach (var i in autoInstances.OrderBy(i => i.UniqueName, StringComparer.OrdinalIgnoreCase))
{
- Instance: @i.UniqueName
}
@foreach (var c in _resolved.DataConnections.OrderBy(c => c.Name, StringComparer.OrdinalIgnoreCase))
{
- DataConnection: @c.Name
}
}
};
// ============================================================
// Step 3 — Encrypt
// ============================================================
private RenderFragment RenderStepEncrypt() => __builder =>
{
var strength = PassphraseStrength(_passphrase);
var strengthLabel = strength switch
{
0 => "Too short",
1 => "Weak",
2 => "Fair",
3 => "Good",
_ => "Strong",
};
var strengthColor = strength switch
{
<= 1 => "bg-danger",
2 => "bg-warning",
3 => "bg-info",
_ => "bg-success",
};
@if (_secretCount > 0)
{
@_secretCount secret @(_secretCount == 1 ? "field" : "fields")
will be encrypted (external-system credentials, SMTP credentials, SMS auth
tokens, and database connection strings).
}
else
{
The selected closure contains no secret fields, but the bundle's content
payload will still be encrypted in full when a passphrase is supplied.
}
@if (!string.IsNullOrEmpty(_passphraseConfirm) && _passphrase != _passphraseConfirm)
{
Passphrases do not match.
}
Export without encryption…
@if (_showUnencryptedConfirm)
{
Unencrypted export — the bundle will contain all secret fields
in plaintext. Anyone with the file can read external-system credentials, SMTP
passwords, SMS auth tokens, and database connection strings. The audit log will record this as
UnencryptedBundleExport.
}
};
// ============================================================
// Step 4 — Download
// ============================================================
private RenderFragment RenderStepDownload() => __builder =>
{
@if (_downloadInProgress)
{
Building bundle…
}
else if (_downloadError != null)
{
Export failed: @_downloadError
}
else
{
Bundle ready. Your browser is downloading the file.
- Filename
@_downloadFilename
- Size
- @FormatBytes(_downloadSize)
- SHA-256
@_downloadSha256
- Encryption
-
@if (_exportUnencrypted)
{
Unencrypted (audited as
UnencryptedBundleExport)
}
else
{
AES-256-GCM with PBKDF2-SHA256
}
}
};
private static string FormatBytes(long bytes)
{
if (bytes < 1024) return $"{bytes} B";
if (bytes < 1024 * 1024) return $"{bytes / 1024.0:0.0} KB";
return $"{bytes / (1024.0 * 1024.0):0.00} MB";
}
}