From cffe7eb55966710b3cc6000d8ba60053ea356231 Mon Sep 17 00:00:00 2001 From: khyeji98 Date: Wed, 22 Apr 2026 04:11:20 +0900 Subject: [PATCH] =?UTF-8?q?[REFACTOR]:=20DesignSystem=20=EC=BB=A4=EC=8A=A4?= =?UTF-8?q?=ED=85=80=20ResourceSynthesizer=20=EB=8F=84=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Project+Templete/Project+Template.swift | 12 +- .../Derived/Sources/TuistFonts+Bangawo.swift | 132 ++++++---------- .../Sources/TuistFonts+BangawoDebug.swift | 132 ++++++---------- .../Sources/TuistFonts+BangawoProd.swift | 132 ++++++---------- .../Sources/TuistFonts+BangawoStage.swift | 132 ++++++---------- .../Sources/TuistAssets+DesignSystem.swift | 39 ----- .../Sources/TuistColors+DesignSystem.swift | 12 ++ .../Sources/TuistFonts+DesignSystem.swift | 132 ++++++---------- .../Sources/TuistImages+DesignSystem.swift | 12 ++ .../TuistLocalizable+DesignSystem.swift | 116 ++++++++++++++ Projects/Shared/DesignSystem/Project.swift | 20 ++- .../Contents.json | 0 .../Resources/Images.xcassets/Contents.json | 6 + .../Resources/ko.lproj/Localizable.strings | 4 + Tuist/ResourceSynthesizers/Colors.stencil | 23 +++ Tuist/ResourceSynthesizers/Fonts.stencil | 65 ++++++++ Tuist/ResourceSynthesizers/Images.stencil | 23 +++ .../ResourceSynthesizers/Localizable.stencil | 146 ++++++++++++++++++ 18 files changed, 669 insertions(+), 469 deletions(-) delete mode 100644 Projects/Shared/DesignSystem/Derived/Sources/TuistAssets+DesignSystem.swift create mode 100644 Projects/Shared/DesignSystem/Derived/Sources/TuistColors+DesignSystem.swift create mode 100644 Projects/Shared/DesignSystem/Derived/Sources/TuistImages+DesignSystem.swift create mode 100644 Projects/Shared/DesignSystem/Derived/Sources/TuistLocalizable+DesignSystem.swift rename Projects/Shared/DesignSystem/Resources/{ImageAssets.xcassets => Colors.xcassets}/Contents.json (100%) create mode 100644 Projects/Shared/DesignSystem/Resources/Images.xcassets/Contents.json create mode 100644 Projects/Shared/DesignSystem/Resources/ko.lproj/Localizable.strings create mode 100644 Tuist/ResourceSynthesizers/Colors.stencil create mode 100644 Tuist/ResourceSynthesizers/Fonts.stencil create mode 100644 Tuist/ResourceSynthesizers/Images.stencil create mode 100644 Tuist/ResourceSynthesizers/Localizable.stencil diff --git a/Plugins/ProjectTemplatePlugin/ProjectDescriptionHelpers/Project+Templete/Project+Template.swift b/Plugins/ProjectTemplatePlugin/ProjectDescriptionHelpers/Project+Templete/Project+Template.swift index 2a6a534..f8a0592 100644 --- a/Plugins/ProjectTemplatePlugin/ProjectDescriptionHelpers/Project+Templete/Project+Template.swift +++ b/Plugins/ProjectTemplatePlugin/ProjectDescriptionHelpers/Project+Templete/Project+Template.swift @@ -23,7 +23,8 @@ public extension Project { resources: ProjectDescription.ResourceFileElements? = nil, infoPlist: ProjectDescription.InfoPlist = .default, entitlements: ProjectDescription.Entitlements? = nil, - schemes: [ProjectDescription.Scheme] = [] + schemes: [ProjectDescription.Scheme] = [], + resourceSynthesizers: [ProjectDescription.ResourceSynthesizer]? = nil ) -> Project { let appTarget: Target = .target( @@ -106,7 +107,8 @@ public extension Project { packages: packages, settings: settings, targets: targets, - schemes: schemes + schemes: schemes, + resourceSynthesizers: resourceSynthesizers ?? .default ) } @@ -126,7 +128,8 @@ public extension Project { infoPlist: ProjectDescription.InfoPlist = .default, entitlements: ProjectDescription.Entitlements? = nil, schemes: [ProjectDescription.Scheme] = [], - hasTests: Bool = false + hasTests: Bool = false, + resourceSynthesizers: [ProjectDescription.ResourceSynthesizer]? = nil ) -> Project { let appTarget: Target = .target( @@ -164,7 +167,8 @@ public extension Project { packages: packages, settings: settings, targets: targets, - schemes: schemes + schemes: schemes, + resourceSynthesizers: resourceSynthesizers ?? .default ) } } diff --git a/Projects/App/Derived/Sources/TuistFonts+Bangawo.swift b/Projects/App/Derived/Sources/TuistFonts+Bangawo.swift index 3999e06..fb2d0a9 100644 --- a/Projects/App/Derived/Sources/TuistFonts+Bangawo.swift +++ b/Projects/App/Derived/Sources/TuistFonts+Bangawo.swift @@ -1,104 +1,66 @@ -// swiftlint:disable:this file_name // swiftlint:disable all -// swift-format-ignore-file -// swiftformat:disable all -// Generated using tuist — https://github.com/tuist/tuist +// Generated using Tuist (SwiftGen) — https://github.com/tuist/tuist -#if os(macOS) - import AppKit.NSFont -#elseif os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) - import UIKit.UIFont +#if canImport(UIKit) +import UIKit #endif #if canImport(SwiftUI) - import SwiftUI +import SwiftUI #endif +import CoreText -// swiftlint:disable superfluous_disable_command -// swiftlint:disable file_length - -// MARK: - Fonts - -// swiftlint:disable identifier_name line_length type_body_length -public enum BangawoFontFamily: Sendable { - public enum PretendardVariable: Sendable { - public static let black = BangawoFontConvertible(name: "PretendardVariable-Black", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let bold = BangawoFontConvertible(name: "PretendardVariable-Bold", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let extraBold = BangawoFontConvertible(name: "PretendardVariable-ExtraBold", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let extraLight = BangawoFontConvertible(name: "PretendardVariable-ExtraLight", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let light = BangawoFontConvertible(name: "PretendardVariable-Light", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let medium = BangawoFontConvertible(name: "PretendardVariable-Medium", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let regular = BangawoFontConvertible(name: "PretendardVariable-Regular", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let semiBold = BangawoFontConvertible(name: "PretendardVariable-SemiBold", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let thin = BangawoFontConvertible(name: "PretendardVariable-Thin", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let all: [BangawoFontConvertible] = [black, bold, extraBold, extraLight, light, medium, regular, semiBold, thin] - } - public static let allCustomFonts: [BangawoFontConvertible] = [PretendardVariable.all].flatMap { $0 } - public static func registerAllCustomFonts() { - allCustomFonts.forEach { $0.register() } - } -} -// swiftlint:enable identifier_name line_length type_body_length - -// MARK: - Implementation Details - -public struct BangawoFontConvertible: Sendable { - public let name: String - public let family: String - public let path: String - - #if os(macOS) - public typealias Font = NSFont - #elseif os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) - public typealias Font = UIFont - #endif - - public func font(size: CGFloat) -> Font { - guard let font = Font(font: self, size: size) else { - fatalError("Unable to initialize font '\(name)' (\(family))") - } - return font +public enum DesignSystemFontFamily { + public enum PretendardVariable { + public static let black: String = "PretendardVariable-Black" + public static let bold: String = "PretendardVariable-Bold" + public static let extraBold: String = "PretendardVariable-ExtraBold" + public static let extraLight: String = "PretendardVariable-ExtraLight" + public static let light: String = "PretendardVariable-Light" + public static let medium: String = "PretendardVariable-Medium" + public static let regular: String = "PretendardVariable-Regular" + public static let semiBold: String = "PretendardVariable-SemiBold" + public static let thin: String = "PretendardVariable-Thin" + public static let all: [String] = [ + "PretendardVariable-Black", "PretendardVariable-Bold", "PretendardVariable-ExtraBold", "PretendardVariable-ExtraLight", "PretendardVariable-Light", "PretendardVariable-Medium", "PretendardVariable-Regular", "PretendardVariable-SemiBold", "PretendardVariable-Thin" ] } - #if canImport(SwiftUI) - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - public func swiftUIFont(size: CGFloat) -> SwiftUI.Font { - guard let font = Font(font: self, size: size) else { - fatalError("Unable to initialize font '\(name)' (\(family))") - } - #if os(macOS) - return SwiftUI.Font.custom(font.fontName, size: font.pointSize) - #elseif os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) - return SwiftUI.Font(font) - #endif + public static func registerAllCustomFonts() { + let paths: Set = [ + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + ] + paths.forEach { registerFont(path: $0) } } - #endif - public func register() { - // swiftlint:disable:next conditional_returns_on_newline - guard let url = url else { return } + private static func registerFont(path: String) { + let filename = (path as NSString).lastPathComponent + let resourceName = (filename as NSString).deletingPathExtension + let resourceExt = (filename as NSString).pathExtension + guard let url = Bundle.module.url(forResource: resourceName, withExtension: resourceExt) else { return } CTFontManagerRegisterFontsForURL(url as CFURL, .process, nil) } +} - fileprivate var url: URL? { - // swiftlint:disable:next implicit_return - return Bundle.module.url(forResource: path, withExtension: nil) +#if canImport(SwiftUI) +public extension Font { + static func designSystem(_ name: String, size: CGFloat) -> Font { + return Font.custom(name, size: size) } } +#endif -public extension BangawoFontConvertible.Font { - convenience init?(font: BangawoFontConvertible, size: CGFloat) { - #if os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) - if !UIFont.fontNames(forFamilyName: font.family).contains(font.name) { - font.register() - } - #elseif os(macOS) - if let url = font.url, CTFontManagerGetScopeForURL(url as CFURL) == .none { - font.register() - } - #endif - - self.init(name: font.name, size: size) +#if canImport(UIKit) +public extension UIFont { + static func designSystem(_ name: String, size: CGFloat) -> UIFont { + return UIFont(name: name, size: size) ?? UIFont.systemFont(ofSize: size) } } -// swiftformat:enable all +#endif // swiftlint:enable all diff --git a/Projects/App/Derived/Sources/TuistFonts+BangawoDebug.swift b/Projects/App/Derived/Sources/TuistFonts+BangawoDebug.swift index 7f2136f..fb2d0a9 100644 --- a/Projects/App/Derived/Sources/TuistFonts+BangawoDebug.swift +++ b/Projects/App/Derived/Sources/TuistFonts+BangawoDebug.swift @@ -1,104 +1,66 @@ -// swiftlint:disable:this file_name // swiftlint:disable all -// swift-format-ignore-file -// swiftformat:disable all -// Generated using tuist — https://github.com/tuist/tuist +// Generated using Tuist (SwiftGen) — https://github.com/tuist/tuist -#if os(macOS) - import AppKit.NSFont -#elseif os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) - import UIKit.UIFont +#if canImport(UIKit) +import UIKit #endif #if canImport(SwiftUI) - import SwiftUI +import SwiftUI #endif +import CoreText -// swiftlint:disable superfluous_disable_command -// swiftlint:disable file_length - -// MARK: - Fonts - -// swiftlint:disable identifier_name line_length type_body_length -public enum BangawoDebugFontFamily: Sendable { - public enum PretendardVariable: Sendable { - public static let black = BangawoDebugFontConvertible(name: "PretendardVariable-Black", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let bold = BangawoDebugFontConvertible(name: "PretendardVariable-Bold", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let extraBold = BangawoDebugFontConvertible(name: "PretendardVariable-ExtraBold", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let extraLight = BangawoDebugFontConvertible(name: "PretendardVariable-ExtraLight", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let light = BangawoDebugFontConvertible(name: "PretendardVariable-Light", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let medium = BangawoDebugFontConvertible(name: "PretendardVariable-Medium", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let regular = BangawoDebugFontConvertible(name: "PretendardVariable-Regular", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let semiBold = BangawoDebugFontConvertible(name: "PretendardVariable-SemiBold", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let thin = BangawoDebugFontConvertible(name: "PretendardVariable-Thin", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let all: [BangawoDebugFontConvertible] = [black, bold, extraBold, extraLight, light, medium, regular, semiBold, thin] - } - public static let allCustomFonts: [BangawoDebugFontConvertible] = [PretendardVariable.all].flatMap { $0 } - public static func registerAllCustomFonts() { - allCustomFonts.forEach { $0.register() } - } -} -// swiftlint:enable identifier_name line_length type_body_length - -// MARK: - Implementation Details - -public struct BangawoDebugFontConvertible: Sendable { - public let name: String - public let family: String - public let path: String - - #if os(macOS) - public typealias Font = NSFont - #elseif os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) - public typealias Font = UIFont - #endif - - public func font(size: CGFloat) -> Font { - guard let font = Font(font: self, size: size) else { - fatalError("Unable to initialize font '\(name)' (\(family))") - } - return font +public enum DesignSystemFontFamily { + public enum PretendardVariable { + public static let black: String = "PretendardVariable-Black" + public static let bold: String = "PretendardVariable-Bold" + public static let extraBold: String = "PretendardVariable-ExtraBold" + public static let extraLight: String = "PretendardVariable-ExtraLight" + public static let light: String = "PretendardVariable-Light" + public static let medium: String = "PretendardVariable-Medium" + public static let regular: String = "PretendardVariable-Regular" + public static let semiBold: String = "PretendardVariable-SemiBold" + public static let thin: String = "PretendardVariable-Thin" + public static let all: [String] = [ + "PretendardVariable-Black", "PretendardVariable-Bold", "PretendardVariable-ExtraBold", "PretendardVariable-ExtraLight", "PretendardVariable-Light", "PretendardVariable-Medium", "PretendardVariable-Regular", "PretendardVariable-SemiBold", "PretendardVariable-Thin" ] } - #if canImport(SwiftUI) - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - public func swiftUIFont(size: CGFloat) -> SwiftUI.Font { - guard let font = Font(font: self, size: size) else { - fatalError("Unable to initialize font '\(name)' (\(family))") - } - #if os(macOS) - return SwiftUI.Font.custom(font.fontName, size: font.pointSize) - #elseif os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) - return SwiftUI.Font(font) - #endif + public static func registerAllCustomFonts() { + let paths: Set = [ + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + ] + paths.forEach { registerFont(path: $0) } } - #endif - public func register() { - // swiftlint:disable:next conditional_returns_on_newline - guard let url = url else { return } + private static func registerFont(path: String) { + let filename = (path as NSString).lastPathComponent + let resourceName = (filename as NSString).deletingPathExtension + let resourceExt = (filename as NSString).pathExtension + guard let url = Bundle.module.url(forResource: resourceName, withExtension: resourceExt) else { return } CTFontManagerRegisterFontsForURL(url as CFURL, .process, nil) } +} - fileprivate var url: URL? { - // swiftlint:disable:next implicit_return - return Bundle.module.url(forResource: path, withExtension: nil) +#if canImport(SwiftUI) +public extension Font { + static func designSystem(_ name: String, size: CGFloat) -> Font { + return Font.custom(name, size: size) } } +#endif -public extension BangawoDebugFontConvertible.Font { - convenience init?(font: BangawoDebugFontConvertible, size: CGFloat) { - #if os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) - if !UIFont.fontNames(forFamilyName: font.family).contains(font.name) { - font.register() - } - #elseif os(macOS) - if let url = font.url, CTFontManagerGetScopeForURL(url as CFURL) == .none { - font.register() - } - #endif - - self.init(name: font.name, size: size) +#if canImport(UIKit) +public extension UIFont { + static func designSystem(_ name: String, size: CGFloat) -> UIFont { + return UIFont(name: name, size: size) ?? UIFont.systemFont(ofSize: size) } } -// swiftformat:enable all +#endif // swiftlint:enable all diff --git a/Projects/App/Derived/Sources/TuistFonts+BangawoProd.swift b/Projects/App/Derived/Sources/TuistFonts+BangawoProd.swift index 7e29322..fb2d0a9 100644 --- a/Projects/App/Derived/Sources/TuistFonts+BangawoProd.swift +++ b/Projects/App/Derived/Sources/TuistFonts+BangawoProd.swift @@ -1,104 +1,66 @@ -// swiftlint:disable:this file_name // swiftlint:disable all -// swift-format-ignore-file -// swiftformat:disable all -// Generated using tuist — https://github.com/tuist/tuist +// Generated using Tuist (SwiftGen) — https://github.com/tuist/tuist -#if os(macOS) - import AppKit.NSFont -#elseif os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) - import UIKit.UIFont +#if canImport(UIKit) +import UIKit #endif #if canImport(SwiftUI) - import SwiftUI +import SwiftUI #endif +import CoreText -// swiftlint:disable superfluous_disable_command -// swiftlint:disable file_length - -// MARK: - Fonts - -// swiftlint:disable identifier_name line_length type_body_length -public enum BangawoProdFontFamily: Sendable { - public enum PretendardVariable: Sendable { - public static let black = BangawoProdFontConvertible(name: "PretendardVariable-Black", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let bold = BangawoProdFontConvertible(name: "PretendardVariable-Bold", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let extraBold = BangawoProdFontConvertible(name: "PretendardVariable-ExtraBold", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let extraLight = BangawoProdFontConvertible(name: "PretendardVariable-ExtraLight", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let light = BangawoProdFontConvertible(name: "PretendardVariable-Light", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let medium = BangawoProdFontConvertible(name: "PretendardVariable-Medium", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let regular = BangawoProdFontConvertible(name: "PretendardVariable-Regular", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let semiBold = BangawoProdFontConvertible(name: "PretendardVariable-SemiBold", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let thin = BangawoProdFontConvertible(name: "PretendardVariable-Thin", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let all: [BangawoProdFontConvertible] = [black, bold, extraBold, extraLight, light, medium, regular, semiBold, thin] - } - public static let allCustomFonts: [BangawoProdFontConvertible] = [PretendardVariable.all].flatMap { $0 } - public static func registerAllCustomFonts() { - allCustomFonts.forEach { $0.register() } - } -} -// swiftlint:enable identifier_name line_length type_body_length - -// MARK: - Implementation Details - -public struct BangawoProdFontConvertible: Sendable { - public let name: String - public let family: String - public let path: String - - #if os(macOS) - public typealias Font = NSFont - #elseif os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) - public typealias Font = UIFont - #endif - - public func font(size: CGFloat) -> Font { - guard let font = Font(font: self, size: size) else { - fatalError("Unable to initialize font '\(name)' (\(family))") - } - return font +public enum DesignSystemFontFamily { + public enum PretendardVariable { + public static let black: String = "PretendardVariable-Black" + public static let bold: String = "PretendardVariable-Bold" + public static let extraBold: String = "PretendardVariable-ExtraBold" + public static let extraLight: String = "PretendardVariable-ExtraLight" + public static let light: String = "PretendardVariable-Light" + public static let medium: String = "PretendardVariable-Medium" + public static let regular: String = "PretendardVariable-Regular" + public static let semiBold: String = "PretendardVariable-SemiBold" + public static let thin: String = "PretendardVariable-Thin" + public static let all: [String] = [ + "PretendardVariable-Black", "PretendardVariable-Bold", "PretendardVariable-ExtraBold", "PretendardVariable-ExtraLight", "PretendardVariable-Light", "PretendardVariable-Medium", "PretendardVariable-Regular", "PretendardVariable-SemiBold", "PretendardVariable-Thin" ] } - #if canImport(SwiftUI) - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - public func swiftUIFont(size: CGFloat) -> SwiftUI.Font { - guard let font = Font(font: self, size: size) else { - fatalError("Unable to initialize font '\(name)' (\(family))") - } - #if os(macOS) - return SwiftUI.Font.custom(font.fontName, size: font.pointSize) - #elseif os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) - return SwiftUI.Font(font) - #endif + public static func registerAllCustomFonts() { + let paths: Set = [ + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + ] + paths.forEach { registerFont(path: $0) } } - #endif - public func register() { - // swiftlint:disable:next conditional_returns_on_newline - guard let url = url else { return } + private static func registerFont(path: String) { + let filename = (path as NSString).lastPathComponent + let resourceName = (filename as NSString).deletingPathExtension + let resourceExt = (filename as NSString).pathExtension + guard let url = Bundle.module.url(forResource: resourceName, withExtension: resourceExt) else { return } CTFontManagerRegisterFontsForURL(url as CFURL, .process, nil) } +} - fileprivate var url: URL? { - // swiftlint:disable:next implicit_return - return Bundle.module.url(forResource: path, withExtension: nil) +#if canImport(SwiftUI) +public extension Font { + static func designSystem(_ name: String, size: CGFloat) -> Font { + return Font.custom(name, size: size) } } +#endif -public extension BangawoProdFontConvertible.Font { - convenience init?(font: BangawoProdFontConvertible, size: CGFloat) { - #if os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) - if !UIFont.fontNames(forFamilyName: font.family).contains(font.name) { - font.register() - } - #elseif os(macOS) - if let url = font.url, CTFontManagerGetScopeForURL(url as CFURL) == .none { - font.register() - } - #endif - - self.init(name: font.name, size: size) +#if canImport(UIKit) +public extension UIFont { + static func designSystem(_ name: String, size: CGFloat) -> UIFont { + return UIFont(name: name, size: size) ?? UIFont.systemFont(ofSize: size) } } -// swiftformat:enable all +#endif // swiftlint:enable all diff --git a/Projects/App/Derived/Sources/TuistFonts+BangawoStage.swift b/Projects/App/Derived/Sources/TuistFonts+BangawoStage.swift index 87da023..fb2d0a9 100644 --- a/Projects/App/Derived/Sources/TuistFonts+BangawoStage.swift +++ b/Projects/App/Derived/Sources/TuistFonts+BangawoStage.swift @@ -1,104 +1,66 @@ -// swiftlint:disable:this file_name // swiftlint:disable all -// swift-format-ignore-file -// swiftformat:disable all -// Generated using tuist — https://github.com/tuist/tuist +// Generated using Tuist (SwiftGen) — https://github.com/tuist/tuist -#if os(macOS) - import AppKit.NSFont -#elseif os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) - import UIKit.UIFont +#if canImport(UIKit) +import UIKit #endif #if canImport(SwiftUI) - import SwiftUI +import SwiftUI #endif +import CoreText -// swiftlint:disable superfluous_disable_command -// swiftlint:disable file_length - -// MARK: - Fonts - -// swiftlint:disable identifier_name line_length type_body_length -public enum BangawoStageFontFamily: Sendable { - public enum PretendardVariable: Sendable { - public static let black = BangawoStageFontConvertible(name: "PretendardVariable-Black", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let bold = BangawoStageFontConvertible(name: "PretendardVariable-Bold", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let extraBold = BangawoStageFontConvertible(name: "PretendardVariable-ExtraBold", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let extraLight = BangawoStageFontConvertible(name: "PretendardVariable-ExtraLight", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let light = BangawoStageFontConvertible(name: "PretendardVariable-Light", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let medium = BangawoStageFontConvertible(name: "PretendardVariable-Medium", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let regular = BangawoStageFontConvertible(name: "PretendardVariable-Regular", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let semiBold = BangawoStageFontConvertible(name: "PretendardVariable-SemiBold", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let thin = BangawoStageFontConvertible(name: "PretendardVariable-Thin", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let all: [BangawoStageFontConvertible] = [black, bold, extraBold, extraLight, light, medium, regular, semiBold, thin] - } - public static let allCustomFonts: [BangawoStageFontConvertible] = [PretendardVariable.all].flatMap { $0 } - public static func registerAllCustomFonts() { - allCustomFonts.forEach { $0.register() } - } -} -// swiftlint:enable identifier_name line_length type_body_length - -// MARK: - Implementation Details - -public struct BangawoStageFontConvertible: Sendable { - public let name: String - public let family: String - public let path: String - - #if os(macOS) - public typealias Font = NSFont - #elseif os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) - public typealias Font = UIFont - #endif - - public func font(size: CGFloat) -> Font { - guard let font = Font(font: self, size: size) else { - fatalError("Unable to initialize font '\(name)' (\(family))") - } - return font +public enum DesignSystemFontFamily { + public enum PretendardVariable { + public static let black: String = "PretendardVariable-Black" + public static let bold: String = "PretendardVariable-Bold" + public static let extraBold: String = "PretendardVariable-ExtraBold" + public static let extraLight: String = "PretendardVariable-ExtraLight" + public static let light: String = "PretendardVariable-Light" + public static let medium: String = "PretendardVariable-Medium" + public static let regular: String = "PretendardVariable-Regular" + public static let semiBold: String = "PretendardVariable-SemiBold" + public static let thin: String = "PretendardVariable-Thin" + public static let all: [String] = [ + "PretendardVariable-Black", "PretendardVariable-Bold", "PretendardVariable-ExtraBold", "PretendardVariable-ExtraLight", "PretendardVariable-Light", "PretendardVariable-Medium", "PretendardVariable-Regular", "PretendardVariable-SemiBold", "PretendardVariable-Thin" ] } - #if canImport(SwiftUI) - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - public func swiftUIFont(size: CGFloat) -> SwiftUI.Font { - guard let font = Font(font: self, size: size) else { - fatalError("Unable to initialize font '\(name)' (\(family))") - } - #if os(macOS) - return SwiftUI.Font.custom(font.fontName, size: font.pointSize) - #elseif os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) - return SwiftUI.Font(font) - #endif + public static func registerAllCustomFonts() { + let paths: Set = [ + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + "Projects/App/Resources/FontAsset/PretendardVariable.ttf", + ] + paths.forEach { registerFont(path: $0) } } - #endif - public func register() { - // swiftlint:disable:next conditional_returns_on_newline - guard let url = url else { return } + private static func registerFont(path: String) { + let filename = (path as NSString).lastPathComponent + let resourceName = (filename as NSString).deletingPathExtension + let resourceExt = (filename as NSString).pathExtension + guard let url = Bundle.module.url(forResource: resourceName, withExtension: resourceExt) else { return } CTFontManagerRegisterFontsForURL(url as CFURL, .process, nil) } +} - fileprivate var url: URL? { - // swiftlint:disable:next implicit_return - return Bundle.module.url(forResource: path, withExtension: nil) +#if canImport(SwiftUI) +public extension Font { + static func designSystem(_ name: String, size: CGFloat) -> Font { + return Font.custom(name, size: size) } } +#endif -public extension BangawoStageFontConvertible.Font { - convenience init?(font: BangawoStageFontConvertible, size: CGFloat) { - #if os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) - if !UIFont.fontNames(forFamilyName: font.family).contains(font.name) { - font.register() - } - #elseif os(macOS) - if let url = font.url, CTFontManagerGetScopeForURL(url as CFURL) == .none { - font.register() - } - #endif - - self.init(name: font.name, size: size) +#if canImport(UIKit) +public extension UIFont { + static func designSystem(_ name: String, size: CGFloat) -> UIFont { + return UIFont(name: name, size: size) ?? UIFont.systemFont(ofSize: size) } } -// swiftformat:enable all +#endif // swiftlint:enable all diff --git a/Projects/Shared/DesignSystem/Derived/Sources/TuistAssets+DesignSystem.swift b/Projects/Shared/DesignSystem/Derived/Sources/TuistAssets+DesignSystem.swift deleted file mode 100644 index 476855e..0000000 --- a/Projects/Shared/DesignSystem/Derived/Sources/TuistAssets+DesignSystem.swift +++ /dev/null @@ -1,39 +0,0 @@ -// swiftlint:disable:this file_name -// swiftlint:disable all -// swift-format-ignore-file -// swiftformat:disable all -// Generated using tuist — https://github.com/tuist/tuist - - - -#if os(macOS) -#if hasFeature(InternalImportsByDefault) -public import AppKit -#else -import AppKit -#endif -#else -#if hasFeature(InternalImportsByDefault) -public import UIKit -#else -import UIKit -#endif -#endif - -#if canImport(SwiftUI) -#if hasFeature(InternalImportsByDefault) -public import SwiftUI -#else -import SwiftUI -#endif -#endif - -// MARK: - Asset Catalogs - -public enum DesignSystemAsset: Sendable { -} - -// MARK: - Implementation Details - -// swiftformat:enable all -// swiftlint:enable all diff --git a/Projects/Shared/DesignSystem/Derived/Sources/TuistColors+DesignSystem.swift b/Projects/Shared/DesignSystem/Derived/Sources/TuistColors+DesignSystem.swift new file mode 100644 index 0000000..343a117 --- /dev/null +++ b/Projects/Shared/DesignSystem/Derived/Sources/TuistColors+DesignSystem.swift @@ -0,0 +1,12 @@ +// swiftlint:disable all +// Generated using Tuist (SwiftGen) — https://github.com/tuist/tuist + +#if canImport(SwiftUI) +import SwiftUI + +public extension Color { + enum Palette { + } +} +#endif +// swiftlint:enable all diff --git a/Projects/Shared/DesignSystem/Derived/Sources/TuistFonts+DesignSystem.swift b/Projects/Shared/DesignSystem/Derived/Sources/TuistFonts+DesignSystem.swift index e1daf0d..1bda660 100644 --- a/Projects/Shared/DesignSystem/Derived/Sources/TuistFonts+DesignSystem.swift +++ b/Projects/Shared/DesignSystem/Derived/Sources/TuistFonts+DesignSystem.swift @@ -1,104 +1,66 @@ -// swiftlint:disable:this file_name // swiftlint:disable all -// swift-format-ignore-file -// swiftformat:disable all -// Generated using tuist — https://github.com/tuist/tuist +// Generated using Tuist (SwiftGen) — https://github.com/tuist/tuist -#if os(macOS) - import AppKit.NSFont -#elseif os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) - import UIKit.UIFont +#if canImport(UIKit) +import UIKit #endif #if canImport(SwiftUI) - import SwiftUI +import SwiftUI #endif +import CoreText -// swiftlint:disable superfluous_disable_command -// swiftlint:disable file_length - -// MARK: - Fonts - -// swiftlint:disable identifier_name line_length type_body_length -public enum DesignSystemFontFamily: Sendable { - public enum PretendardVariable: Sendable { - public static let black = DesignSystemFontConvertible(name: "PretendardVariable-Black", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let bold = DesignSystemFontConvertible(name: "PretendardVariable-Bold", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let extraBold = DesignSystemFontConvertible(name: "PretendardVariable-ExtraBold", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let extraLight = DesignSystemFontConvertible(name: "PretendardVariable-ExtraLight", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let light = DesignSystemFontConvertible(name: "PretendardVariable-Light", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let medium = DesignSystemFontConvertible(name: "PretendardVariable-Medium", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let regular = DesignSystemFontConvertible(name: "PretendardVariable-Regular", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let semiBold = DesignSystemFontConvertible(name: "PretendardVariable-SemiBold", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let thin = DesignSystemFontConvertible(name: "PretendardVariable-Thin", family: "Pretendard Variable", path: "PretendardVariable.ttf") - public static let all: [DesignSystemFontConvertible] = [black, bold, extraBold, extraLight, light, medium, regular, semiBold, thin] - } - public static let allCustomFonts: [DesignSystemFontConvertible] = [PretendardVariable.all].flatMap { $0 } - public static func registerAllCustomFonts() { - allCustomFonts.forEach { $0.register() } - } -} -// swiftlint:enable identifier_name line_length type_body_length - -// MARK: - Implementation Details - -public struct DesignSystemFontConvertible: Sendable { - public let name: String - public let family: String - public let path: String - - #if os(macOS) - public typealias Font = NSFont - #elseif os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) - public typealias Font = UIFont - #endif - - public func font(size: CGFloat) -> Font { - guard let font = Font(font: self, size: size) else { - fatalError("Unable to initialize font '\(name)' (\(family))") - } - return font +public enum DesignSystemFontFamily { + public enum PretendardVariable { + public static let black: String = "PretendardVariable-Black" + public static let bold: String = "PretendardVariable-Bold" + public static let extraBold: String = "PretendardVariable-ExtraBold" + public static let extraLight: String = "PretendardVariable-ExtraLight" + public static let light: String = "PretendardVariable-Light" + public static let medium: String = "PretendardVariable-Medium" + public static let regular: String = "PretendardVariable-Regular" + public static let semiBold: String = "PretendardVariable-SemiBold" + public static let thin: String = "PretendardVariable-Thin" + public static let all: [String] = [ + "PretendardVariable-Black", "PretendardVariable-Bold", "PretendardVariable-ExtraBold", "PretendardVariable-ExtraLight", "PretendardVariable-Light", "PretendardVariable-Medium", "PretendardVariable-Regular", "PretendardVariable-SemiBold", "PretendardVariable-Thin" ] } - #if canImport(SwiftUI) - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - public func swiftUIFont(size: CGFloat) -> SwiftUI.Font { - guard let font = Font(font: self, size: size) else { - fatalError("Unable to initialize font '\(name)' (\(family))") - } - #if os(macOS) - return SwiftUI.Font.custom(font.fontName, size: font.pointSize) - #elseif os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) - return SwiftUI.Font(font) - #endif + public static func registerAllCustomFonts() { + let paths: Set = [ + "Projects/Shared/DesignSystem/Resources/FontAsset/PretendardVariable.ttf", + "Projects/Shared/DesignSystem/Resources/FontAsset/PretendardVariable.ttf", + "Projects/Shared/DesignSystem/Resources/FontAsset/PretendardVariable.ttf", + "Projects/Shared/DesignSystem/Resources/FontAsset/PretendardVariable.ttf", + "Projects/Shared/DesignSystem/Resources/FontAsset/PretendardVariable.ttf", + "Projects/Shared/DesignSystem/Resources/FontAsset/PretendardVariable.ttf", + "Projects/Shared/DesignSystem/Resources/FontAsset/PretendardVariable.ttf", + "Projects/Shared/DesignSystem/Resources/FontAsset/PretendardVariable.ttf", + "Projects/Shared/DesignSystem/Resources/FontAsset/PretendardVariable.ttf", + ] + paths.forEach { registerFont(path: $0) } } - #endif - public func register() { - // swiftlint:disable:next conditional_returns_on_newline - guard let url = url else { return } + private static func registerFont(path: String) { + let filename = (path as NSString).lastPathComponent + let resourceName = (filename as NSString).deletingPathExtension + let resourceExt = (filename as NSString).pathExtension + guard let url = Bundle.module.url(forResource: resourceName, withExtension: resourceExt) else { return } CTFontManagerRegisterFontsForURL(url as CFURL, .process, nil) } +} - fileprivate var url: URL? { - // swiftlint:disable:next implicit_return - return Bundle.module.url(forResource: path, withExtension: nil) +#if canImport(SwiftUI) +public extension Font { + static func designSystem(_ name: String, size: CGFloat) -> Font { + return Font.custom(name, size: size) } } +#endif -public extension DesignSystemFontConvertible.Font { - convenience init?(font: DesignSystemFontConvertible, size: CGFloat) { - #if os(iOS) || os(tvOS) || os(watchOS) || os(visionOS) - if !UIFont.fontNames(forFamilyName: font.family).contains(font.name) { - font.register() - } - #elseif os(macOS) - if let url = font.url, CTFontManagerGetScopeForURL(url as CFURL) == .none { - font.register() - } - #endif - - self.init(name: font.name, size: size) +#if canImport(UIKit) +public extension UIFont { + static func designSystem(_ name: String, size: CGFloat) -> UIFont { + return UIFont(name: name, size: size) ?? UIFont.systemFont(ofSize: size) } } -// swiftformat:enable all +#endif // swiftlint:enable all diff --git a/Projects/Shared/DesignSystem/Derived/Sources/TuistImages+DesignSystem.swift b/Projects/Shared/DesignSystem/Derived/Sources/TuistImages+DesignSystem.swift new file mode 100644 index 0000000..a724252 --- /dev/null +++ b/Projects/Shared/DesignSystem/Derived/Sources/TuistImages+DesignSystem.swift @@ -0,0 +1,12 @@ +// swiftlint:disable all +// Generated using Tuist (SwiftGen) — https://github.com/tuist/tuist + +#if canImport(SwiftUI) +import SwiftUI + +public extension Image { + enum Asset { + } +} +#endif +// swiftlint:enable all diff --git a/Projects/Shared/DesignSystem/Derived/Sources/TuistLocalizable+DesignSystem.swift b/Projects/Shared/DesignSystem/Derived/Sources/TuistLocalizable+DesignSystem.swift new file mode 100644 index 0000000..23de5f8 --- /dev/null +++ b/Projects/Shared/DesignSystem/Derived/Sources/TuistLocalizable+DesignSystem.swift @@ -0,0 +1,116 @@ +// swiftlint:disable all +// Generated using Tuist (SwiftGen) — https://github.com/tuist/tuist + +import Foundation + + +public enum L10n { +} + +public protocol LocalizableParameterCount {} + +public struct LocalizableParameterCount0: LocalizableParameterCount {} +public struct LocalizableParameterCount1: LocalizableParameterCount {} +public struct LocalizableParameterCount2: LocalizableParameterCount {} +public struct LocalizableParameterCount3: LocalizableParameterCount {} +public struct LocalizableParameterCount4: LocalizableParameterCount {} +public struct LocalizableParameterCount5: LocalizableParameterCount {} + +public struct LocalizableKey: Sendable { + public let key: String + public init(key: String) { self.key = key } +} + +public extension LocalizableKey where T == LocalizableParameterCount0 { + var value: String { + return L10n.tr(key) + } +} + +public extension LocalizableKey where T == LocalizableParameterCount1 { + func value(_ p0: String) -> String { + return L10n.tr(key, p0) + } +} + +public extension LocalizableKey where T == LocalizableParameterCount2 { + func value(_ p0: String, _ p1: String) -> String { + return L10n.tr(key, p0, p1) + } +} + +public extension LocalizableKey where T == LocalizableParameterCount3 { + func value(_ p0: String, _ p1: String, _ p2: String) -> String { + return L10n.tr(key, p0, p1, p2) + } +} + +public extension LocalizableKey where T == LocalizableParameterCount4 { + func value(_ p0: String, _ p1: String, _ p2: String, _ p3: String) -> String { + return L10n.tr(key, p0, p1, p2, p3) + } +} + +public extension LocalizableKey where T == LocalizableParameterCount5 { + func value(_ p0: String, _ p1: String, _ p2: String, _ p3: String, _ p4: String) -> String { + return L10n.tr(key, p0, p1, p2, p3, p4) + } +} + +public extension L10n { + static func tr(_ key: String, _ args: CVarArg...) -> String { + let format = NSLocalizedString(key, tableName: "Localizable", bundle: Bundle.module, comment: "") + return String(format: format, locale: Locale.current, arguments: args) + } +} + +#if canImport(SwiftUI) +import SwiftUI + +public extension LocalizableKey where T == LocalizableParameterCount0 { + var text: Text { + return Text(.init(stringLiteral: key), tableName: "Localizable", bundle: Bundle.module) + } +} + +public extension LocalizableKey where T == LocalizableParameterCount1 { + func text(_ p0: String) -> Text { + return Text.localized(key, params: [p0]) + } +} + +public extension LocalizableKey where T == LocalizableParameterCount2 { + func text(_ p0: String, _ p1: String) -> Text { + return Text.localized(key, params: [p0, p1]) + } +} + +public extension LocalizableKey where T == LocalizableParameterCount3 { + func text(_ p0: String, _ p1: String, _ p2: String) -> Text { + return Text.localized(key, params: [p0, p1, p2]) + } +} + +public extension LocalizableKey where T == LocalizableParameterCount4 { + func text(_ p0: String, _ p1: String, _ p2: String, _ p3: String) -> Text { + return Text.localized(key, params: [p0, p1, p2, p3]) + } +} + +public extension LocalizableKey where T == LocalizableParameterCount5 { + func text(_ p0: String, _ p1: String, _ p2: String, _ p3: String, _ p4: String) -> Text { + return Text.localized(key, params: [p0, p1, p2, p3, p4]) + } +} + +private extension Text { + static func localized(_ key: String, params: [String]) -> Text { + let paramterRemovedKey = key.replacingOccurrences(of: "%@", with: "") + var interpolation = LocalizedStringKey.StringInterpolation(literalCapacity: paramterRemovedKey.count, interpolationCount: params.count) + interpolation.appendLiteral(paramterRemovedKey) + params.forEach { interpolation.appendInterpolation($0) } + return Text(.init(stringInterpolation: interpolation), tableName: "Localizable", bundle: Bundle.module) + } +} +#endif +// swiftlint:enable all diff --git a/Projects/Shared/DesignSystem/Project.swift b/Projects/Shared/DesignSystem/Project.swift index 26e7ff9..ceecf33 100644 --- a/Projects/Shared/DesignSystem/Project.swift +++ b/Projects/Shared/DesignSystem/Project.swift @@ -14,5 +14,23 @@ let project = Project.makeModule( ], sources: ["Sources/**"], resources: ["Resources/**", "FontAsset/**"], - hasTests: false + hasTests: false, + resourceSynthesizers: [ + .custom( + name: "Colors", + parser: .assets, + extensions: ["xcassets"] + ), + .custom( + name: "Images", + parser: .assets, + extensions: ["xcassets"] + ), + .fonts(), + .custom( + name: "Localizable", + parser: .strings, + extensions: ["strings", "stringsdict"] + ), + ] ) diff --git a/Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/Contents.json b/Projects/Shared/DesignSystem/Resources/Colors.xcassets/Contents.json similarity index 100% rename from Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/Contents.json rename to Projects/Shared/DesignSystem/Resources/Colors.xcassets/Contents.json diff --git a/Projects/Shared/DesignSystem/Resources/Images.xcassets/Contents.json b/Projects/Shared/DesignSystem/Resources/Images.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Shared/DesignSystem/Resources/ko.lproj/Localizable.strings b/Projects/Shared/DesignSystem/Resources/ko.lproj/Localizable.strings new file mode 100644 index 0000000..173eda5 --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/ko.lproj/Localizable.strings @@ -0,0 +1,4 @@ +/* + Localizable.strings + DesignSystem +*/ diff --git a/Tuist/ResourceSynthesizers/Colors.stencil b/Tuist/ResourceSynthesizers/Colors.stencil new file mode 100644 index 0000000..8a5143b --- /dev/null +++ b/Tuist/ResourceSynthesizers/Colors.stencil @@ -0,0 +1,23 @@ +// swiftlint:disable all +// Generated using Tuist (SwiftGen) — https://github.com/tuist/tuist + +{% if catalogs %} +#if canImport(SwiftUI) +import SwiftUI + +public extension Color { + enum Palette { + {% for catalog in catalogs %} + {% for asset in catalog.assets %} + {% if asset.type == "color" %} + public static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}: Color = Color("{{asset.name}}", bundle: Bundle.module) + {% endif %} + {% endfor %} + {% endfor %} + } +} +#endif +{% else %} +// No color assets found. +{% endif %} +// swiftlint:enable all diff --git a/Tuist/ResourceSynthesizers/Fonts.stencil b/Tuist/ResourceSynthesizers/Fonts.stencil new file mode 100644 index 0000000..b46a555 --- /dev/null +++ b/Tuist/ResourceSynthesizers/Fonts.stencil @@ -0,0 +1,65 @@ +// swiftlint:disable all +// Generated using Tuist (SwiftGen) — https://github.com/tuist/tuist + +#if canImport(UIKit) +import UIKit +#endif +#if canImport(SwiftUI) +import SwiftUI +#endif +import CoreText + +{% if families %} +public enum DesignSystemFontFamily { + {% for family in families %} + public enum {{family.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} { + {% for font in family.fonts %} + public static let {{font.style|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}: String = "{{font.name}}" + {% endfor %} + public static let all: [String] = [ + {% for font in family.fonts %} + "{{font.name}}"{% if not forloop.last %},{% endif %} + {% endfor %} + ] + } + {% endfor %} + + public static func registerAllCustomFonts() { + let paths: Set = [ + {% for family in families %} + {% for font in family.fonts %} + "{{font.path}}", + {% endfor %} + {% endfor %} + ] + paths.forEach { registerFont(path: $0) } + } + + private static func registerFont(path: String) { + let filename = (path as NSString).lastPathComponent + let resourceName = (filename as NSString).deletingPathExtension + let resourceExt = (filename as NSString).pathExtension + guard let url = Bundle.module.url(forResource: resourceName, withExtension: resourceExt) else { return } + CTFontManagerRegisterFontsForURL(url as CFURL, .process, nil) + } +} + +#if canImport(SwiftUI) +public extension Font { + static func designSystem(_ name: String, size: CGFloat) -> Font { + return Font.custom(name, size: size) + } +} +#endif + +#if canImport(UIKit) +public extension UIFont { + static func designSystem(_ name: String, size: CGFloat) -> UIFont { + return UIFont(name: name, size: size) ?? UIFont.systemFont(ofSize: size) + } +} +#endif +{% else %} +// No custom fonts found. +{% endif %} +// swiftlint:enable all diff --git a/Tuist/ResourceSynthesizers/Images.stencil b/Tuist/ResourceSynthesizers/Images.stencil new file mode 100644 index 0000000..8bda166 --- /dev/null +++ b/Tuist/ResourceSynthesizers/Images.stencil @@ -0,0 +1,23 @@ +// swiftlint:disable all +// Generated using Tuist (SwiftGen) — https://github.com/tuist/tuist + +{% if catalogs %} +#if canImport(SwiftUI) +import SwiftUI + +public extension Image { + enum Asset { + {% for catalog in catalogs %} + {% for asset in catalog.assets %} + {% if asset.type == "image" %} + public static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}: Image = Image("{{asset.name}}", bundle: Bundle.module) + {% endif %} + {% endfor %} + {% endfor %} + } +} +#endif +{% else %} +// No image assets found. +{% endif %} +// swiftlint:enable all diff --git a/Tuist/ResourceSynthesizers/Localizable.stencil b/Tuist/ResourceSynthesizers/Localizable.stencil new file mode 100644 index 0000000..089f107 --- /dev/null +++ b/Tuist/ResourceSynthesizers/Localizable.stencil @@ -0,0 +1,146 @@ +// swiftlint:disable all +// Generated using Tuist (SwiftGen) — https://github.com/tuist/tuist + +import Foundation + +{% if tables.count > 0 %} +{% macro argumentsBlock types %}{% filter removeNewlines:"leading" %} + {% for type in types %} + {% if type == "UnsafeRawPointer" %} + Int(bitPattern: p{{forloop.counter}}) + {% else %} + p{{forloop.counter}} + {% endif %} + {{ ", " if not forloop.last }} + {% endfor %} +{% endfilter %}{% endmacro %} +{% macro recursiveBlock table item %} + {% for string in item.strings %} + /// {{string.translation}} + {% if string.types %} + public static let {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}: LocalizableKey = .init(key: "{{string.key}}") + {% else %} + public static let {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}: LocalizableKey = .init(key: "{{string.key}}") + {% endif %} + {% endfor %} + {% for child in item.children %} + public enum {{child.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} { + {% filter indent:6 %}{% call recursiveBlock table child %}{% endfilter %} + } + {% endfor %} +{% endmacro %} + +public enum L10n { + {% call recursiveBlock tables.first.name tables.first.levels %} +} + +public protocol LocalizableParameterCount {} + +public struct LocalizableParameterCount0: LocalizableParameterCount {} +public struct LocalizableParameterCount1: LocalizableParameterCount {} +public struct LocalizableParameterCount2: LocalizableParameterCount {} +public struct LocalizableParameterCount3: LocalizableParameterCount {} +public struct LocalizableParameterCount4: LocalizableParameterCount {} +public struct LocalizableParameterCount5: LocalizableParameterCount {} + +public struct LocalizableKey: Sendable { + public let key: String + public init(key: String) { self.key = key } +} + +public extension LocalizableKey where T == LocalizableParameterCount0 { + var value: String { + return L10n.tr(key) + } +} + +public extension LocalizableKey where T == LocalizableParameterCount1 { + func value(_ p0: String) -> String { + return L10n.tr(key, p0) + } +} + +public extension LocalizableKey where T == LocalizableParameterCount2 { + func value(_ p0: String, _ p1: String) -> String { + return L10n.tr(key, p0, p1) + } +} + +public extension LocalizableKey where T == LocalizableParameterCount3 { + func value(_ p0: String, _ p1: String, _ p2: String) -> String { + return L10n.tr(key, p0, p1, p2) + } +} + +public extension LocalizableKey where T == LocalizableParameterCount4 { + func value(_ p0: String, _ p1: String, _ p2: String, _ p3: String) -> String { + return L10n.tr(key, p0, p1, p2, p3) + } +} + +public extension LocalizableKey where T == LocalizableParameterCount5 { + func value(_ p0: String, _ p1: String, _ p2: String, _ p3: String, _ p4: String) -> String { + return L10n.tr(key, p0, p1, p2, p3, p4) + } +} + +public extension L10n { + static func tr(_ key: String, _ args: CVarArg...) -> String { + let format = NSLocalizedString(key, tableName: "Localizable", bundle: Bundle.module, comment: "") + return String(format: format, locale: Locale.current, arguments: args) + } +} + +#if canImport(SwiftUI) +import SwiftUI + +public extension LocalizableKey where T == LocalizableParameterCount0 { + var text: Text { + return Text(.init(stringLiteral: key), tableName: "Localizable", bundle: Bundle.module) + } +} + +public extension LocalizableKey where T == LocalizableParameterCount1 { + func text(_ p0: String) -> Text { + return Text.localized(key, params: [p0]) + } +} + +public extension LocalizableKey where T == LocalizableParameterCount2 { + func text(_ p0: String, _ p1: String) -> Text { + return Text.localized(key, params: [p0, p1]) + } +} + +public extension LocalizableKey where T == LocalizableParameterCount3 { + func text(_ p0: String, _ p1: String, _ p2: String) -> Text { + return Text.localized(key, params: [p0, p1, p2]) + } +} + +public extension LocalizableKey where T == LocalizableParameterCount4 { + func text(_ p0: String, _ p1: String, _ p2: String, _ p3: String) -> Text { + return Text.localized(key, params: [p0, p1, p2, p3]) + } +} + +public extension LocalizableKey where T == LocalizableParameterCount5 { + func text(_ p0: String, _ p1: String, _ p2: String, _ p3: String, _ p4: String) -> Text { + return Text.localized(key, params: [p0, p1, p2, p3, p4]) + } +} + +private extension Text { + static func localized(_ key: String, params: [String]) -> Text { + let paramterRemovedKey = key.replacingOccurrences(of: "%@", with: "") + var interpolation = LocalizedStringKey.StringInterpolation(literalCapacity: paramterRemovedKey.count, interpolationCount: params.count) + interpolation.appendLiteral(paramterRemovedKey) + params.forEach { interpolation.appendInterpolation($0) } + return Text(.init(stringInterpolation: interpolation), tableName: "Localizable", bundle: Bundle.module) + } +} +#endif +{% else %} +public enum L10n {} +{% endif %} +// swiftlint:enable all