PSSnips.psm1

#Requires -Version 7.0

Set-StrictMode -Version Latest
# $ErrorActionPreference is intentionally NOT set at module scope to avoid bleeding
# into the caller's session. Individual functions use -ErrorAction Stop/Continue as needed.

# Load private files in dependency order
foreach ($file in @(
    'Private\Models.ps1',             # class definitions — must be first
    'Private\RepositoryBase.ps1',     # base class (before JsonSnipRepository)
    'Private\Data.ps1',
    'Private\Logging.ps1',
    'Private\Parsing.ps1',
    'Private\EventDispatch.ps1',
    'Private\IO.ps1',
    'Private\DataStore.ps1',          # InitEnv + delegate scriptblocks defined here
    'Private\JsonSnipRepository.ps1', # concrete repository (after DataStore so delegates exist)
    'Private\RepositoryFactory.ps1',
    'Private\Credentials.ps1',
    'Private\ApiClients.ps1',
    'Private\Fts.ps1',
    'Private\Audit.ps1',
    'Private\Helpers.ps1',
    'Private\Highlighting.ps1',
    'Private\Providers\RemoteProvider.ps1',
    'Private\Providers\GitHubProvider.ps1',
    'Private\Providers\GitLabProvider.ps1',
    'Private\Providers\BitbucketProvider.ps1',
    'Private\ProviderFactory.ps1'
)) {
    . (Join-Path $PSScriptRoot $file)
}

# Load public files
foreach ($file in @(
    'Public\Config.ps1',
    'Public\Core.ps1',
    'Public\Backup.ps1',
    'Public\GitHub.ps1',
    'Public\GitLab.ps1',
    'Public\Bitbucket.ps1',
    'Public\Remote.ps1',
    'Public\Sharing.ps1',
    'Public\Profile.ps1',
    'Public\TUI.ps1',
    'Public\Dispatcher.ps1',
    'Public\Analytics.ps1',
    'Public\Templates.ps1',
    'Public\Linting.ps1'
)) {
    . (Join-Path $PSScriptRoot $file)
}

# Argument completers
. (Join-Path $PSScriptRoot 'Private\Completers.ps1')

#region ─── Auto-init ────────────────────────────────────────────────────────
# Initialize-PSSnips is the public-facing init function.
# script:InitEnv is called automatically at module load (bottom of this region).

function Initialize-PSSnips {
    <#
    .SYNOPSIS
        Initializes the PSSnips data directory and writes the default configuration.
 
    .DESCRIPTION
        Creates the ~/.pssnips directory and its snippets subdirectory if they do not
        exist. Writes a default config.json and an empty index.json when those files
        are absent. Displays the detected editor and reminds the user to configure a
        GitHub token if Gist features are needed. This function is called automatically
        when the module is imported; calling it manually is useful after a fresh
        installation or to repair a missing configuration.
 
    .EXAMPLE
        Initialize-PSSnips
 
        Ensures the data directory and config files exist and reports the ready state.
 
    .EXAMPLE
        # Re-initialise after manually deleting the config directory
        Remove-Item ~/.pssnips -Recurse -Force
        Initialize-PSSnips
 
    .INPUTS
        None. This function does not accept pipeline input.
 
    .OUTPUTS
        None. Writes status messages to the host.
 
    .NOTES
        The module calls script:InitEnv automatically on import, so explicit calls to
        Initialize-PSSnips are typically not needed in normal usage.
        Data directory: ~/.pssnips (controlled by $script:Home)
    #>

    [CmdletBinding()]
    param()
    script:InitEnv
    script:Out-OK "PSSnips ready at: $script:Home"
    script:Out-Info "Editor: $(script:GetEditor)"
    script:Out-Info "Run 'snip config -GitHubToken <token>' to enable GitHub Gist features."
}

# Initialize on module load
script:InitEnv

#endregion

Export-ModuleMember -Function @(
    'Initialize-PSSnips',
    'Get-SnipConfig', 'Set-SnipConfig',
    'Get-Snip', 'Show-Snip', 'New-Snip', 'Add-Snip', 'Remove-Snip', 'Edit-Snip', 'Invoke-Snip', 'Copy-Snip', 'Set-SnipTag',
    'Export-SnipCollection', 'Import-SnipCollection',
    'Get-GistList', 'Get-Gist', 'Import-Gist', 'Export-Gist', 'Invoke-Gist', 'Sync-Gist',
    'Get-GitLabSnipList', 'Get-GitLabSnip', 'Import-GitLabSnip', 'Export-GitLabSnip',
    'Get-BitbucketSnipList', 'Import-BitbucketSnip', 'Export-BitbucketSnip', 'Sync-BitbucketSnips',
    'Get-RemoteSnip', 'Sync-RemoteSnip',
    'Publish-Snip', 'Sync-SharedSnips',
    'Install-PSSnips', 'Uninstall-PSSnips',
    'Start-SnipManager',
    'Get-SnipHistory', 'Restore-Snip', 'Test-Snip',
    'Invoke-SnipCLI',
    'Get-StaleSnip', 'Get-SnipStats', 'Export-VSCodeSnips', 'Invoke-FuzzySnip',
    'Add-SnipTerminalProfile',
    'Get-SnipAuditLog',
    'Set-SnipRating', 'Add-SnipComment',
    'New-SnipFromTemplate', 'Get-SnipTemplate',
    'New-SnipSchedule', 'Get-SnipSchedule', 'Remove-SnipSchedule',
    'Initialize-SnipPreCommitHook',
    'Sync-SnipMetadata',
    'Register-SnipEvent', 'Unregister-SnipEvent',
    'Invoke-SnipLint', 'Test-SnipLint'
) -Alias 'snip'