Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 9 additions & 17 deletions Sources/ExFig/Subcommands/GenerateConfigFile.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import ArgumentParser
import ExFigCore
import Foundation
import Rainbow

extension Platform: ExpressibleByArgument {}

Expand Down Expand Up @@ -63,17 +64,8 @@ extension ExFigCommand {
}

ui.warning("Config file already exists at: \(destination)")
TerminalOutputManager.shared.writeDirect("Overwrite? [y/N] ")
ANSICodes.flushStdout()

guard let input = readLine() else {
TerminalOutputManager.shared.writeDirect("\n")
ui.error("Operation cancelled.")
return false
}

let trimmed = input.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
if trimmed != "y", trimmed != "yes" {
if !ui.confirm("Overwrite?") {
ui.info("Operation cancelled.")
return false
}
Expand All @@ -100,21 +92,21 @@ extension ExFigCommand {
ui.success("Config file generated: \(destination)")

ui.info("")
ui.info("👉 Next Steps:")
ui.info("1. Edit \(ExFigOptions.defaultConfigFilename) with your Figma file IDs")
ui.info("👉 Next Steps:".bold)
ui.info("1. Edit \(ExFigOptions.defaultConfigFilename.bold) with your Figma file IDs")

if ProcessInfo.processInfo.environment["FIGMA_PERSONAL_TOKEN"] == nil {
ui.info("2. Set your Figma token (missing):")
ui.info(" export FIGMA_PERSONAL_TOKEN=your_token_here")
ui.info(" export FIGMA_PERSONAL_TOKEN=your_token_here".yellow)
} else {
ui.info("2. Figma token detected in environment ✅")
}

ui.info("3. Run export commands:")
ui.info(" exfig colors")
ui.info(" exfig icons")
ui.info(" exfig images")
ui.info(" exfig typography")
ui.info(" exfig colors".cyan)
ui.info(" exfig icons".cyan)
ui.info(" exfig images".cyan)
ui.info(" exfig typography".cyan)
} else {
throw ExFigError.custom(errorString: "Unable to create config file at: \(destination)")
}
Expand Down
28 changes: 27 additions & 1 deletion Sources/ExFig/TerminalUI/TerminalUI.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// swiftlint:disable file_length
// swiftlint:disable file_length type_body_length
import ExFigCore
import Foundation
import Rainbow
Expand Down Expand Up @@ -404,6 +404,32 @@ final class TerminalUI: Sendable {
func cleanup() {
showCursor()
}

// MARK: - Input

/// Prompts the user for confirmation (y/n)
func confirm(_ message: String, defaultToYes: Bool = false) -> Bool {
guard TTYDetector.isTTY else { return false }

let options = defaultToYes ? "[Y/n]" : "[y/N]"
let text = "\(message) \(options) "
let formattedText = useColors ? text.bold : text

TerminalOutputManager.shared.writeDirect(formattedText)
ANSICodes.flushStdout()

guard let input = readLine() else {
TerminalOutputManager.shared.writeDirect("\n")
return false
}

let trimmed = input.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
if trimmed.isEmpty {
return defaultToYes
}

return trimmed == "y" || trimmed == "yes"
}
}

// MARK: - Signal Handling
Expand Down
Loading