diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1561016..ce27d16 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,34 +11,37 @@ jobs: runs-on: macos-latest steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup Xcode - uses: maxim-lobanov/setup-xcode@v1 - with: - xcode-version: latest-stable - - - name: Create xcconfig files - run: | - # Debug.xcconfig 생성 - touch Common.xcconfig - - echo "✅ xcconfig files created" - - - name: Build project - run: | - # .xcodeproj 파일 찾기 - - PROJECT=$(find . -maxdepth 2 -name "*.xcodeproj") - SCHEME=$(basename "$PROJECT" .xcodeproj) - - echo "Found Project: $PROJECT" - echo "Found Scheme: $SCHEME" - - xcodebuild -project "$PROJECT" \ - -scheme "$SCHEME" \ - -configuration Debug \ - -skipMacroValidation \ - -destination "platform=iOS Simulator,name=iPhone 16 Pro,OS=26.2" \ - clean build + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Xcode + uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: latest-stable + + - name: Setup mise and Tuist + uses: jdx/mise-action@v2 + + - name: Prepare xcconfig files + run: | + mkdir -p Projects/App/Resources + if [ ! -f Projects/App/Resources/Common.xcconfig ]; then + printf "BASE_URL = https://hellodoriworld.com\n" > Projects/App/Resources/Common.xcconfig + fi + echo "✅ xcconfig file is ready" + + - name: Install Tuist dependencies + run: tuist install + + - name: Generate workspace + run: tuist generate --no-open + + - name: Build project + run: | + xcodebuild \ + -workspace Dori-iOS.xcworkspace \ + -scheme DoriApp \ + -configuration Debug \ + -skipMacroValidation \ + -destination "generic/platform=iOS Simulator" \ + clean build diff --git a/Dori-iOS.xcodeproj/project.pbxproj b/Dori-iOS.xcodeproj/project.pbxproj deleted file mode 100644 index cd7ca8b..0000000 --- a/Dori-iOS.xcodeproj/project.pbxproj +++ /dev/null @@ -1,347 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 77; - objects = { - -/* Begin PBXFileReference section */ - B5C7D66B2F33BCB700C20E14 /* Dori-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Dori-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFileSystemSynchronizedRootGroup section */ - B5C7D66D2F33BCB700C20E14 /* Dori-iOS */ = { - isa = PBXFileSystemSynchronizedRootGroup; - path = "Dori-iOS"; - sourceTree = ""; - }; -/* End PBXFileSystemSynchronizedRootGroup section */ - -/* Begin PBXFrameworksBuildPhase section */ - B5C7D6682F33BCB700C20E14 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - B5C7D6622F33BCB700C20E14 = { - isa = PBXGroup; - children = ( - B5C7D66D2F33BCB700C20E14 /* Dori-iOS */, - B5C7D66C2F33BCB700C20E14 /* Products */, - ); - sourceTree = ""; - }; - B5C7D66C2F33BCB700C20E14 /* Products */ = { - isa = PBXGroup; - children = ( - B5C7D66B2F33BCB700C20E14 /* Dori-iOS.app */, - ); - name = Products; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - B5C7D66A2F33BCB700C20E14 /* Dori-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = B5C7D6762F33BCB900C20E14 /* Build configuration list for PBXNativeTarget "Dori-iOS" */; - buildPhases = ( - B5C7D6672F33BCB700C20E14 /* Sources */, - B5C7D6682F33BCB700C20E14 /* Frameworks */, - B5C7D6692F33BCB700C20E14 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - fileSystemSynchronizedGroups = ( - B5C7D66D2F33BCB700C20E14 /* Dori-iOS */, - ); - name = "Dori-iOS"; - packageProductDependencies = ( - ); - productName = "Dori-iOS"; - productReference = B5C7D66B2F33BCB700C20E14 /* Dori-iOS.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - B5C7D6632F33BCB700C20E14 /* Project object */ = { - isa = PBXProject; - attributes = { - BuildIndependentTargetsInParallel = 1; - LastSwiftUpdateCheck = 2620; - LastUpgradeCheck = 2620; - TargetAttributes = { - B5C7D66A2F33BCB700C20E14 = { - CreatedOnToolsVersion = 26.2; - }; - }; - }; - buildConfigurationList = B5C7D6662F33BCB700C20E14 /* Build configuration list for PBXProject "Dori-iOS" */; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = B5C7D6622F33BCB700C20E14; - minimizedProjectReferenceProxies = 1; - preferredProjectObjectVersion = 77; - productRefGroup = B5C7D66C2F33BCB700C20E14 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - B5C7D66A2F33BCB700C20E14 /* Dori-iOS */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - B5C7D6692F33BCB700C20E14 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - B5C7D6672F33BCB700C20E14 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - B5C7D6742F33BCB900C20E14 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = FL4QTRRKMD; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; - GCC_C_LANGUAGE_STANDARD = gnu17; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 26.2; - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - B5C7D6752F33BCB900C20E14 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = FL4QTRRKMD; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; - GCC_C_LANGUAGE_STANDARD = gnu17; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 26.2; - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - B5C7D6772F33BCB900C20E14 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = FL4QTRRKMD; - ENABLE_PREVIEWS = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; - INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; - INFOPLIST_KEY_UILaunchScreen_Generation = YES; - INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - IPHONEOS_DEPLOYMENT_TARGET = 17.6; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.arex.dori; - PRODUCT_NAME = "$(TARGET_NAME)"; - STRING_CATALOG_GENERATE_SYMBOLS = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_APPROACHABLE_CONCURRENCY = YES; - SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 1; - }; - name = Debug; - }; - B5C7D6782F33BCB900C20E14 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = FL4QTRRKMD; - ENABLE_PREVIEWS = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; - INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; - INFOPLIST_KEY_UILaunchScreen_Generation = YES; - INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - IPHONEOS_DEPLOYMENT_TARGET = 17.6; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.arex.dori; - PRODUCT_NAME = "$(TARGET_NAME)"; - STRING_CATALOG_GENERATE_SYMBOLS = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_APPROACHABLE_CONCURRENCY = YES; - SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 1; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - B5C7D6662F33BCB700C20E14 /* Build configuration list for PBXProject "Dori-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - B5C7D6742F33BCB900C20E14 /* Debug */, - B5C7D6752F33BCB900C20E14 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - B5C7D6762F33BCB900C20E14 /* Build configuration list for PBXNativeTarget "Dori-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - B5C7D6772F33BCB900C20E14 /* Debug */, - B5C7D6782F33BCB900C20E14 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = B5C7D6632F33BCB700C20E14 /* Project object */; -} diff --git a/Dori-iOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Dori-iOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/Dori-iOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Dori-iOS/ContentView.swift b/Dori-iOS/ContentView.swift deleted file mode 100644 index 7d7998b..0000000 --- a/Dori-iOS/ContentView.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// ContentView.swift -// Dori-iOS -// -// Created by 강동영 on 2/5/26. -// - -import SwiftUI - -struct ContentView: View { - var body: some View { - Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) - } -} - -#Preview { - ContentView() -} diff --git a/Dori-iOS/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/Dori-iOS/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 2305880..0000000 --- a/Dori-iOS/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "tinted" - } - ], - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Dori-iOS/Resources/Assets.xcassets/sample_dori.imageset/Contents.json b/Dori-iOS/Resources/Assets.xcassets/sample_dori.imageset/Contents.json deleted file mode 100644 index ce3cf73..0000000 --- a/Dori-iOS/Resources/Assets.xcassets/sample_dori.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "unnamed.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Dori-iOS/Resources/Assets.xcassets/sample_dori.imageset/unnamed.png b/Dori-iOS/Resources/Assets.xcassets/sample_dori.imageset/unnamed.png deleted file mode 100644 index b71f16e..0000000 Binary files a/Dori-iOS/Resources/Assets.xcassets/sample_dori.imageset/unnamed.png and /dev/null differ diff --git a/Project.swift b/Project.swift new file mode 100644 index 0000000..2ab307a --- /dev/null +++ b/Project.swift @@ -0,0 +1,83 @@ +import ProjectDescription + +let deploymentTarget: DeploymentTargets = .iOS("17.6") + +let commonSettings: SettingsDictionary = [ + "SWIFT_VERSION": "6.0", + "SWIFT_APPROACHABLE_CONCURRENCY": "YES", + "SWIFT_DEFAULT_ACTOR_ISOLATION": "MainActor", +] + +func framework( + name: String, + path: String, + dependencies: [TargetDependency] = [], + hasResources: Bool = false +) -> Target { + .target( + name: name, + destinations: .iOS, + product: .staticFramework, + bundleId: "com.arex.dori.\(name)", + deploymentTargets: deploymentTarget, + sources: ["\(path)/Sources/**"], + resources: hasResources ? ["\(path)/Resources/**"] : nil, + dependencies: dependencies, + settings: .settings(base: commonSettings) + ) +} + +let project = Project( + name: "Dori-iOS", + organizationName: "com.arex", + settings: .settings(base: commonSettings), + targets: [ + // App + .target( + name: "DoriApp", + destinations: .iOS, + product: .app, + bundleId: "com.arex.dori", + deploymentTargets: deploymentTarget, + infoPlist: .extendingDefault(with: [ + "UILaunchScreen": .dictionary([:]), + "BASE_URL": "$(BASE_URL)", + "Appearance": "Light", + ]), + sources: ["Projects/App/Sources/**"], + resources: ["Projects/App/Resources/**"], + dependencies: [ + .target(name: "FeatureOnboarding"), + .target(name: "DoriNetworkImpl"), + .target(name: "DoriDesignSystem"), + .target(name: "DoriCore"), + ], + settings: .settings( + base: commonSettings, + configurations: [ + .debug(name: "Debug", xcconfig: "Projects/App/Resources/Common.xcconfig"), + .release(name: "Release", xcconfig: "Projects/App/Resources/Common.xcconfig"), + ] + ) + ), + + // Core + framework(name: "DoriCore", path: "Projects/Core/DoriCore"), + framework(name: "DoriDesignSystem", path: "Projects/Core/DoriDesignSystem", + dependencies: [.target(name: "DoriCore")], + hasResources: true), + + // Infra + framework(name: "DoriNetwork", path: "Projects/Infra/DoriNetwork"), + framework(name: "DoriNetworkImpl", path: "Projects/Infra/DoriNetworkImpl", + dependencies: [ + .target(name: "DoriNetwork"), + .external(name: "Alamofire"), + ]), + + // Feature + framework(name: "FeatureOnboarding", path: "Projects/Feature/Onboarding", + dependencies: [.target(name: "DoriDesignSystem"), .target(name: "DoriCore")], + hasResources: true), + ] +) diff --git a/Dori-iOS/Resources/Assets.xcassets/AccentColor.colorset/Contents.json b/Projects/App/Resources/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from Dori-iOS/Resources/Assets.xcassets/AccentColor.colorset/Contents.json rename to Projects/App/Resources/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..dacb18e --- /dev/null +++ b/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images" : [ + { + "filename" : "IMG_1198 1.jpg", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/appIcon.jpg b/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/appIcon.jpg new file mode 100644 index 0000000..54ca88f Binary files /dev/null and b/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/appIcon.jpg differ diff --git a/Dori-iOS/Resources/Assets.xcassets/Contents.json b/Projects/App/Resources/Assets.xcassets/Contents.json similarity index 100% rename from Dori-iOS/Resources/Assets.xcassets/Contents.json rename to Projects/App/Resources/Assets.xcassets/Contents.json diff --git a/Projects/App/Resources/info.plist b/Projects/App/Resources/info.plist new file mode 100644 index 0000000..4ec5a7d --- /dev/null +++ b/Projects/App/Resources/info.plist @@ -0,0 +1,10 @@ + + + + + Appearance + Light + BASE_URL + $(BASE_URL) + + diff --git a/Dori-iOS/DoriApp.swift b/Projects/App/Sources/DoriApp.swift similarity index 84% rename from Dori-iOS/DoriApp.swift rename to Projects/App/Sources/DoriApp.swift index dd72b15..d609a51 100644 --- a/Dori-iOS/DoriApp.swift +++ b/Projects/App/Sources/DoriApp.swift @@ -6,6 +6,7 @@ // import SwiftUI +import DoriDesignSystem @main struct DoriApp: App { @@ -16,7 +17,7 @@ struct DoriApp: App { var body: some Scene { WindowGroup { - ContentView() + MainTabView() } } } diff --git a/Projects/App/Sources/MainTabView.swift b/Projects/App/Sources/MainTabView.swift new file mode 100644 index 0000000..3ed34bb --- /dev/null +++ b/Projects/App/Sources/MainTabView.swift @@ -0,0 +1,38 @@ +// +// MainTabView.swift +// Dori-iOS +// +// Created by 강동영 on 2/5/26. +// + +import SwiftUI + +struct MainTabView: View { + @State private var selectedTab = 0 + + var body: some View { + TabView(selection: $selectedTab) { + Text("캘린더") + .tabItem { + Label("캘린더", systemImage: "calendar") + } + .tag(0) + + Text("내역") + .tabItem { + Label("내역", systemImage: "list.bullet.rectangle") + } + .tag(1) + + Text("마이페이지") + .tabItem { + Label("마이페이지", systemImage: "person.circle") + } + .tag(2) + } + } +} + +#Preview { + MainTabView() +} diff --git a/Dori-iOS/Resources/Colors.xcassets/Brand/Contents.json b/Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Brand/Contents.json similarity index 100% rename from Dori-iOS/Resources/Colors.xcassets/Brand/Contents.json rename to Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Brand/Contents.json diff --git a/Dori-iOS/Resources/Colors.xcassets/Brand/Main_100.colorset/Contents.json b/Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Brand/Main_100.colorset/Contents.json similarity index 100% rename from Dori-iOS/Resources/Colors.xcassets/Brand/Main_100.colorset/Contents.json rename to Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Brand/Main_100.colorset/Contents.json diff --git a/Dori-iOS/Resources/Colors.xcassets/Brand/Main_200.colorset/Contents.json b/Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Brand/Main_200.colorset/Contents.json similarity index 100% rename from Dori-iOS/Resources/Colors.xcassets/Brand/Main_200.colorset/Contents.json rename to Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Brand/Main_200.colorset/Contents.json diff --git a/Dori-iOS/Resources/Colors.xcassets/Brand/Main_300.colorset/Contents.json b/Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Brand/Main_300.colorset/Contents.json similarity index 100% rename from Dori-iOS/Resources/Colors.xcassets/Brand/Main_300.colorset/Contents.json rename to Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Brand/Main_300.colorset/Contents.json diff --git a/Dori-iOS/Resources/Colors.xcassets/Contents.json b/Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Contents.json similarity index 100% rename from Dori-iOS/Resources/Colors.xcassets/Contents.json rename to Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Contents.json diff --git a/Dori-iOS/Resources/Colors.xcassets/Greyscale/Contents.json b/Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Greyscale/Contents.json similarity index 100% rename from Dori-iOS/Resources/Colors.xcassets/Greyscale/Contents.json rename to Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Greyscale/Contents.json diff --git a/Dori-iOS/Resources/Colors.xcassets/Greyscale/Black.colorset/Contents.json b/Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Greyscale/DoriBlack.colorset/Contents.json similarity index 100% rename from Dori-iOS/Resources/Colors.xcassets/Greyscale/Black.colorset/Contents.json rename to Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Greyscale/DoriBlack.colorset/Contents.json diff --git a/Dori-iOS/Resources/Colors.xcassets/Greyscale/White.colorset/Contents.json b/Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Greyscale/DoriWhite.colorset/Contents.json similarity index 100% rename from Dori-iOS/Resources/Colors.xcassets/Greyscale/White.colorset/Contents.json rename to Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Greyscale/DoriWhite.colorset/Contents.json diff --git a/Dori-iOS/Resources/Colors.xcassets/Greyscale/Grey-100.colorset/Contents.json b/Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Greyscale/Grey-100.colorset/Contents.json similarity index 100% rename from Dori-iOS/Resources/Colors.xcassets/Greyscale/Grey-100.colorset/Contents.json rename to Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Greyscale/Grey-100.colorset/Contents.json diff --git a/Dori-iOS/Resources/Colors.xcassets/Greyscale/Grey-200.colorset/Contents.json b/Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Greyscale/Grey-200.colorset/Contents.json similarity index 100% rename from Dori-iOS/Resources/Colors.xcassets/Greyscale/Grey-200.colorset/Contents.json rename to Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Greyscale/Grey-200.colorset/Contents.json diff --git a/Dori-iOS/Resources/Colors.xcassets/Greyscale/Grey-300.colorset/Contents.json b/Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Greyscale/Grey-300.colorset/Contents.json similarity index 100% rename from Dori-iOS/Resources/Colors.xcassets/Greyscale/Grey-300.colorset/Contents.json rename to Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Greyscale/Grey-300.colorset/Contents.json diff --git a/Dori-iOS/Resources/Colors.xcassets/Greyscale/Grey-400.colorset/Contents.json b/Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Greyscale/Grey-400.colorset/Contents.json similarity index 100% rename from Dori-iOS/Resources/Colors.xcassets/Greyscale/Grey-400.colorset/Contents.json rename to Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Greyscale/Grey-400.colorset/Contents.json diff --git a/Dori-iOS/Resources/Colors.xcassets/Greyscale/Grey-500.colorset/Contents.json b/Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Greyscale/Grey-500.colorset/Contents.json similarity index 100% rename from Dori-iOS/Resources/Colors.xcassets/Greyscale/Grey-500.colorset/Contents.json rename to Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Greyscale/Grey-500.colorset/Contents.json diff --git a/Dori-iOS/Resources/Colors.xcassets/Greyscale/Grey-600.colorset/Contents.json b/Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Greyscale/Grey-600.colorset/Contents.json similarity index 100% rename from Dori-iOS/Resources/Colors.xcassets/Greyscale/Grey-600.colorset/Contents.json rename to Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Greyscale/Grey-600.colorset/Contents.json diff --git a/Dori-iOS/Resources/Colors.xcassets/Greyscale/Grey-700.colorset/Contents.json b/Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Greyscale/Grey-700.colorset/Contents.json similarity index 100% rename from Dori-iOS/Resources/Colors.xcassets/Greyscale/Grey-700.colorset/Contents.json rename to Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Greyscale/Grey-700.colorset/Contents.json diff --git a/Dori-iOS/Resources/Colors.xcassets/Greyscale/Grey-800.colorset/Contents.json b/Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Greyscale/Grey-800.colorset/Contents.json similarity index 100% rename from Dori-iOS/Resources/Colors.xcassets/Greyscale/Grey-800.colorset/Contents.json rename to Projects/Core/DoriDesignSystem/Resources/Colors.xcassets/Greyscale/Grey-800.colorset/Contents.json diff --git a/Dori-iOS/Resources/Font/Pretendard-Bold.otf b/Projects/Core/DoriDesignSystem/Resources/Font/Pretendard-Bold.otf similarity index 100% rename from Dori-iOS/Resources/Font/Pretendard-Bold.otf rename to Projects/Core/DoriDesignSystem/Resources/Font/Pretendard-Bold.otf diff --git a/Dori-iOS/Resources/Font/Pretendard-Medium.otf b/Projects/Core/DoriDesignSystem/Resources/Font/Pretendard-Medium.otf similarity index 100% rename from Dori-iOS/Resources/Font/Pretendard-Medium.otf rename to Projects/Core/DoriDesignSystem/Resources/Font/Pretendard-Medium.otf diff --git a/Dori-iOS/Resources/Font/Pretendard-Regular.otf b/Projects/Core/DoriDesignSystem/Resources/Font/Pretendard-Regular.otf similarity index 100% rename from Dori-iOS/Resources/Font/Pretendard-Regular.otf rename to Projects/Core/DoriDesignSystem/Resources/Font/Pretendard-Regular.otf diff --git a/Dori-iOS/Resources/Font/Pretendard-SemiBold.otf b/Projects/Core/DoriDesignSystem/Resources/Font/Pretendard-SemiBold.otf similarity index 100% rename from Dori-iOS/Resources/Font/Pretendard-SemiBold.otf rename to Projects/Core/DoriDesignSystem/Resources/Font/Pretendard-SemiBold.otf diff --git a/Dori-iOS/DesignSystem/Typography/DesignTokenDemoView.swift b/Projects/Core/DoriDesignSystem/Sources/Typography/DesignTokenDemoView.swift similarity index 86% rename from Dori-iOS/DesignSystem/Typography/DesignTokenDemoView.swift rename to Projects/Core/DoriDesignSystem/Sources/Typography/DesignTokenDemoView.swift index 34fb460..f9d21aa 100644 --- a/Dori-iOS/DesignSystem/Typography/DesignTokenDemoView.swift +++ b/Projects/Core/DoriDesignSystem/Sources/Typography/DesignTokenDemoView.swift @@ -45,7 +45,7 @@ fileprivate struct DesignTokenDemoView: View { ZStack { Rectangle() .frame(height: 50) - .foregroundStyle(.grey100) + .foregroundStyle(Color.grey100) Text("도리 화이팅") .pretendard(.heading(heading)) } @@ -54,9 +54,9 @@ fileprivate struct DesignTokenDemoView: View { Text("헤딩") .padding() .pretendard(.heading(.h15)) - .foregroundStyle(.white) + .foregroundStyle(Color.white) .frame(maxWidth: .infinity) - .background(.main200) + .background(Color.main200) .padding() } @@ -65,7 +65,7 @@ fileprivate struct DesignTokenDemoView: View { ZStack { Rectangle() .frame(height: 50) - .foregroundStyle(.grey200) + .foregroundStyle(Color.grey200) Text("도리 화이팅") .pretendard(.subtitle(subtitle)) } @@ -74,9 +74,9 @@ fileprivate struct DesignTokenDemoView: View { Text("서브 타이틀") .padding() .pretendard(.heading(.h15)) - .foregroundStyle(.white) + .foregroundStyle(Color.white) .frame(maxWidth: .infinity) - .background(.main200) + .background(Color.main200) .padding() } @@ -85,7 +85,7 @@ fileprivate struct DesignTokenDemoView: View { ZStack { Rectangle() .frame(height: 50) - .foregroundStyle(.grey300) + .foregroundStyle(Color.grey300) Text("도리 화이팅") .pretendard(.body(body)) } @@ -94,9 +94,9 @@ fileprivate struct DesignTokenDemoView: View { Text("바디") .padding() .pretendard(.heading(.h15)) - .foregroundStyle(.white) + .foregroundStyle(Color.white) .frame(maxWidth: .infinity) - .background(.main200) + .background(Color.main200) .padding() } @@ -105,7 +105,7 @@ fileprivate struct DesignTokenDemoView: View { ZStack { Rectangle() .frame(height: 50) - .foregroundStyle(.grey400) + .foregroundStyle(Color.grey400) Text("도리 화이팅") .pretendard(.caption(caption)) } @@ -114,9 +114,9 @@ fileprivate struct DesignTokenDemoView: View { Text("캡션") .padding() .pretendard(.heading(.h15)) - .foregroundStyle(.white) + .foregroundStyle(Color.white) .frame(maxWidth: .infinity) - .background(.main200) + .background(Color.main200) .padding() } } diff --git a/Dori-iOS/DesignSystem/Typography/FontManager.swift b/Projects/Core/DoriDesignSystem/Sources/Typography/FontManager.swift similarity index 88% rename from Dori-iOS/DesignSystem/Typography/FontManager.swift rename to Projects/Core/DoriDesignSystem/Sources/Typography/FontManager.swift index 016d0ab..2e90ab3 100644 --- a/Dori-iOS/DesignSystem/Typography/FontManager.swift +++ b/Projects/Core/DoriDesignSystem/Sources/Typography/FontManager.swift @@ -1,10 +1,3 @@ -// -// FontManager.swift -// Dori-iOS -// -// Created by 강동영 on 2/6/26. -// - import Foundation import CoreGraphics import CoreText @@ -12,20 +5,20 @@ import CoreText @MainActor public enum FontManager { private static var registeredFonts: Set = [] - + /// 폰트가 필요할 때마다 자동으로 등록하는 함수 public static func registerFontIfNeeded(_ fontName: String) { // 이미 등록된 폰트는 스킵 guard !registeredFonts.contains(fontName) else { return } - + // Bundle.module에서 폰트 파일 찾기 guard let fontURL = findFontURL(for: fontName) else { print("⚠️ Font file not found for: \(fontName)") return } - + var error: Unmanaged? - + // 폰트 등록 if CTFontManagerRegisterFontsForURL(fontURL as CFURL, .process, &error) { registeredFonts.insert(fontName) @@ -34,21 +27,21 @@ public enum FontManager { print("⚠️ Font registration failed for \(fontName): \(error)") } } - + /// Bundle.module에서 폰트 파일 URL 찾기 private static func findFontURL(for fontName: String) -> URL? { let extensions = FontExtension.allCases - + for ext in extensions { - if let url = Bundle.main.url(forResource: fontName, withExtension: ext.rawValue) { + if let url = Bundle.module.url(forResource: fontName, withExtension: ext.rawValue) { return url } } - + print("⚠️ Font file not found for: \(fontName)") return nil } - + /// 모든 Pretendard 폰트를 한번에 등록하는 함수 (옵션) public static func registerAllFonts() { let fontNames = [ diff --git a/Dori-iOS/DesignSystem/Typography/FontProvider.swift b/Projects/Core/DoriDesignSystem/Sources/Typography/FontProvider.swift similarity index 100% rename from Dori-iOS/DesignSystem/Typography/FontProvider.swift rename to Projects/Core/DoriDesignSystem/Sources/Typography/FontProvider.swift diff --git a/Dori-iOS/DesignSystem/Typography/FontStyle.swift b/Projects/Core/DoriDesignSystem/Sources/Typography/FontStyle.swift similarity index 100% rename from Dori-iOS/DesignSystem/Typography/FontStyle.swift rename to Projects/Core/DoriDesignSystem/Sources/Typography/FontStyle.swift diff --git a/Dori-iOS/DesignSystem/Typography/TypoStyle.swift b/Projects/Core/DoriDesignSystem/Sources/Typography/TypoStyle.swift similarity index 100% rename from Dori-iOS/DesignSystem/Typography/TypoStyle.swift rename to Projects/Core/DoriDesignSystem/Sources/Typography/TypoStyle.swift diff --git a/Dori-iOS/DesignSystem/Typography/View+.swift b/Projects/Core/DoriDesignSystem/Sources/Typography/View+.swift similarity index 100% rename from Dori-iOS/DesignSystem/Typography/View+.swift rename to Projects/Core/DoriDesignSystem/Sources/Typography/View+.swift diff --git a/Projects/Feature/Onboarding/Sources/SplashView.swift b/Projects/Feature/Onboarding/Sources/SplashView.swift new file mode 100644 index 0000000..32cd61a --- /dev/null +++ b/Projects/Feature/Onboarding/Sources/SplashView.swift @@ -0,0 +1,18 @@ +// +// SplashView.swift +// Dori-iOS +// +// Created by 강동영 on 2/10/26. +// + +import SwiftUI + +struct SplashView: View { + var body: some View { + Text("Splash View") + } +} + +#Preview { + SplashView() +} diff --git a/Tuist.swift b/Tuist.swift new file mode 100644 index 0000000..4eae126 --- /dev/null +++ b/Tuist.swift @@ -0,0 +1,6 @@ +import ProjectDescription + +let config = Config( + compatibleXcodeVersions: .upToNextMajor("26.0"), + swiftVersion: "6.0" +) diff --git a/Tuist/Package.swift b/Tuist/Package.swift new file mode 100644 index 0000000..9f859d7 --- /dev/null +++ b/Tuist/Package.swift @@ -0,0 +1,19 @@ +// swift-tools-version: 6.0 +import PackageDescription + +#if TUIST +import struct ProjectDescription.PackageSettings + +let packageSettings = PackageSettings( + productTypes: [ + "Alamofire": .staticFramework, + ] +) +#endif + +let package = Package( + name: "DoriDependencies", + dependencies: [ + .package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.11.1"), + ] +) diff --git a/mise.toml b/mise.toml new file mode 100644 index 0000000..ee10b7d --- /dev/null +++ b/mise.toml @@ -0,0 +1,2 @@ +[tools] +tuist = "4.140.1"