diff --git a/.gitconfig b/.gitconfig
new file mode 100644
index 000000000..04c63d28b
--- /dev/null
+++ b/.gitconfig
@@ -0,0 +1,2 @@
+[core]
+ hookspath = .githooks
\ No newline at end of file
diff --git a/.githooks/pre-push b/.githooks/pre-push
new file mode 100755
index 000000000..92ce4bcd1
--- /dev/null
+++ b/.githooks/pre-push
@@ -0,0 +1,43 @@
+#!/bin/sh
+
+FORMAT=$(which swiftformat)
+
+if [[ -e "${FORMAT}" ]]; then
+ echo "🚀 SwiftFormat 시작..."
+ echo "🔍 SwiftFormat 적용 경로: $(pwd)/Projects"
+else
+ echo "SwiftFormat이 존재하지 않습니다. 설치해주세요 ! 'brew install swiftformat'"
+ exit 1
+fi
+
+RESULT=$($FORMAT ./Projects --config .swiftformat)
+
+if [ "$RESULT" == '' ]; then
+ git add .
+ git commit -m "🎨 :: 코드 Formatting 적용"
+ printf "\n 🎉 SwiftFormat 적용을 완료했습니다 !! \n"
+else
+ echo ""
+ printf "❌ SwiftFormat Failed 아래 내용을 확인해주세요 \n"
+ while read -r line; do
+ FILEPATH=$(echo $line | cut -d : -f 1)
+ L=$(echo $line | cut -d : -f 2)
+ C=$(echo $line | cut -d : -f 3)
+ TYPE=$(echo $line | cut -d : -f 4 | cut -c 2-)
+ MESSAGE=$(echo $line | cut -d : -f 5 | cut -c 2-)
+ DESCRIPTION=$(echo $line | cut -d : -f 6 | cut -c 2-)
+ if [ $TYPE == 'warning' ]; then
+ printf "\n 🚧 $TYPE\n"
+ printf " $FILEPATH:$L:$C\n"
+ printf " 📌 $MESSAGE: - $DESCRIPTION\n"
+ exit 0
+ elif [ $TYPE == 'error' ]; then
+ printf "\n 🚨 $TYPE\n"
+ fi
+ printf " ✅ $FILEPATH:$L:$C\n"
+ printf " 📌 $MESSAGE: - $DESCRIPTION\n"
+ done <<< "$RESULT"
+
+ printf "\n 🚑 커밋실패!! SwiftFormat 실행이 실패하였습니다 🥺 \n"
+ exit 1
+fi
\ No newline at end of file
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 1e137a278..3245f3906 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -1 +1 @@
-* @yongbeomkwak @kimdaehee0824 @CoCoE1203 @KangTaeHoon @youn9k
+* @yongbeomkwak @kimdaehee0824 @KangTaeHoon @youn9k @baekteun
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index fcae229a4..c65464a91 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -1,6 +1,41 @@
+## 💡 배경 및 개요
-## 개요
+
-## 작업사항
+
-Closes #이슈번호
\ No newline at end of file
+Resolves: #{이슈번호}
+
+## 📃 작업내용
+
+
+
+## 🙋♂️ 리뷰노트
+
+
+
+## ✅ PR 체크리스트
+
+
+
+- [ ] 이 작업으로 인해 변경이 필요한 문서가 변경되었나요? (e.g. `XCConfig`, `노션`, `README`)
+- [ ] 이 작업을 하고나서 공유해야할 팀원들에게 공유되었나요? (e.g. `"API 개발 완료됐어요"`, `"XCConfig 값 추가되었어요"`)
+- [ ] 작업한 코드가 정상적으로 동작하나요?
+- [ ] Merge 대상 브랜치가 올바른가요?
+- [ ] PR과 관련 없는 작업이 있지는 않나요?
+
+## 🎸 기타
diff --git a/.github/actions/Auto_close_associate_issue/Dockerfile b/.github/actions/Auto_close_associate_issue/Dockerfile
new file mode 100644
index 000000000..9fa45294b
--- /dev/null
+++ b/.github/actions/Auto_close_associate_issue/Dockerfile
@@ -0,0 +1,5 @@
+FROM node:20.14
+
+COPY . .
+
+CMD [ "node", "/main.js"]
\ No newline at end of file
diff --git a/.github/actions/Auto_close_associate_issue/action.yml b/.github/actions/Auto_close_associate_issue/action.yml
new file mode 100644
index 000000000..729630a2b
--- /dev/null
+++ b/.github/actions/Auto_close_associate_issue/action.yml
@@ -0,0 +1,16 @@
+name: "Auto_close_associate_issue"
+
+description: "Auto close an issue which associate with a PR."
+
+inputs:
+ prbody:
+ description: "The body of the PR to search for related issues"
+ required: true
+
+outputs:
+ issurNumber:
+ description: "The issue number"
+
+runs:
+ using: "docker"
+ image: "Dockerfile"
\ No newline at end of file
diff --git a/.github/actions/Auto_close_associate_issue/main.js b/.github/actions/Auto_close_associate_issue/main.js
new file mode 100644
index 000000000..010c4d8a4
--- /dev/null
+++ b/.github/actions/Auto_close_associate_issue/main.js
@@ -0,0 +1,16 @@
+let body = process.env["INPUT_PRBODY"];
+
+/*
+PR Template의 resolved issue 넘버 표기 방식 변경 시 해당 코드 또한 변경 필요
+*/
+let pattern = /Resolves: #\d+/;
+
+let issueNumber;
+
+try {
+ issueNumber = body.match(pattern)[0].replace("Resolves: #", "").trim();
+} catch {
+ issueNumber = -1;
+}
+
+console.log(`::set-output name=issueNumber::${issueNumber}`);
diff --git a/.github/workflows/AutoAssign.yml b/.github/workflows/AutoAssign.yml
new file mode 100644
index 000000000..dd580a85b
--- /dev/null
+++ b/.github/workflows/AutoAssign.yml
@@ -0,0 +1,40 @@
+name: Auto assign PR author
+
+on:
+ pull_request:
+ types:
+ - opened
+ - reopened
+
+jobs:
+ assign-pr-author:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+
+ - name: Get PR author
+ id: get-pr-author
+ run: echo "author=${{ github.event.pull_request.user.login }}" >> $GITHUB_OUTPUT
+
+ - name: Assign PR author
+ run: gh pr edit ${{ github.event.number }} --add-assignee ${{ steps.get-pr-author.outputs.author }}
+ env:
+ GH_TOKEN: ${{ github.token }}
+
+ - name: Comment success result to PR
+ uses: mshick/add-pr-comment@v2
+ if: ${{ success() }}
+ with:
+ message: |
+ ## ✅ Assign 자동 지정을 성공했어요!
+ @${{ steps.get-pr-author.outputs.author }}
+ allow-repeats: true
+
+ - name: Comment failure result to PR
+ uses: mshick/add-pr-comment@v2
+ if: ${{ failure() }}
+ with:
+ message: "## ❌ PR의 Assign 자동 지정을 실패했어요."
+ allow-repeats: true
diff --git a/.github/workflows/AutoCloseIssueByPullRequest.yml b/.github/workflows/AutoCloseIssueByPullRequest.yml
new file mode 100644
index 000000000..f2fac78bc
--- /dev/null
+++ b/.github/workflows/AutoCloseIssueByPullRequest.yml
@@ -0,0 +1,31 @@
+name: Auto close issue when PR is merged
+
+on:
+ pull_request_target:
+ branches-ignore:
+ - "develop"
+ types: [closed]
+
+jobs:
+ close-issue:
+ runs-on: ubuntu-latest
+ if: github.event.pull_request.merged == true || github.event.action != 'closed'
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+
+ - name: Run Auto issue closer
+ uses: ./.github/actions/Auto_close_associate_issue/
+ id: Closer
+ with:
+ prbody: ${{ github.event.pull_request.body }}
+
+ - name: Close Issue
+ uses: peter-evans/close-issue@v2
+ if: ${{ github.event.pull_request.merged }}
+ with:
+ issue-number: ${{ steps.Closer.outputs.issueNumber }}
+ comment: The associated PR has been merged, this issue is automatically closed, you can reopend if necessary. \#${{ github.event.pull_request.number }}
+ env:
+ Github_Token: ${{ secrets.GITHUB_TOKEN }}
+ PRNUM: ${{ github.event.pull_request.number }}
diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml
index dbbcbb437..167de5273 100644
--- a/.github/workflows/CI.yml
+++ b/.github/workflows/CI.yml
@@ -2,130 +2,143 @@ name: CI
on:
pull_request:
+ paths:
+ - ".github/workflows/CI.yml"
+ - "**/*.swift"
+ push:
branches:
- develop
+ - master
env:
- CACHED_DEPENDENCY_PATHS: ${{ github.workspace }}/Tuist/Dependencies
+ CACHED_PACKAGE_DEPENDENCY_PATHS: ${{ github.workspace }}/.build
+ CACHED_CARTHAGE_DEPENDENCY_PATHS: ${{ github.workspace }}/Carthage
+ GOOGLE_SERVICE_INFO_PLIST_PATH: Projects/App/Resources/GoogleService-Info.plist
+ SECRET_XCCONFIG_PATH: Projects/App/XCConfig/Secrets.xcconfig
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
jobs:
prepare-ci:
- name: Prepare CI
- runs-on: macOS-latest
- outputs:
- NAME: ${{ steps.get_name.outputs.NAME }}
- CI-NEEDED: ${{ steps.check_ci_needed.outputs.CI-NEEDED }}
- WROKING-PATH: ${{ steps.get_working_directory.outputs.PATH }}
- TESTS-EXISTENCE: ${{ steps.check_tests_existence.outputs.files_exists }}
- steps:
- - uses: actions/checkout@v1
-
- - name: Get Branch Name
- uses: tj-actions/branch-names@v6.2
- id: branch_name
-
- - name: Get Type
- id: get_type
- run: |
- echo ${{ steps.branch_name.outputs.current_branch }} | cut -d / -f 1
- echo "TYPE=$(echo ${{ steps.branch_name.outputs.current_branch }} | cut -d / -f 1)" >> $GITHUB_OUTPUT
-
- - name: Get Name
- id: get_name
- run: |
- echo ${{ steps.branch_name.outputs.current_branch }} | cut -d / -f 2
- echo "NAME=$(echo ${{ steps.branch_name.outputs.current_branch }} | cut -d / -f 2)" >> $GITHUB_OUTPUT
-
- - name: Check CI Needed
- id: check_ci_needed
- run: |
- echo ${{steps.get_type.outputs.TYPE == 'Application' || steps.get_type.outputs.TYPE == 'Modules' || steps.get_type.outputs.TYPE == 'Services'}}
- echo "CI-NEEDED=${{steps.get_type.outputs.TYPE == 'Application' || steps.get_type.outputs.TYPE == 'Modules' || steps.get_type.outputs.TYPE == 'Services'}}" >> $GITHUB_OUTPUT
-
- - name: Get Working Directory
- id: get_working_directory
- if: steps.check_ci_needed.outputs.CI-NEEDED == 'true'
- run: |
- cd ${{ steps.get_type.outputs.TYPE }}
- if [ ${{ steps.get_type.outputs.TYPE }} != "Application" ]
- then
- cd ${{ steps.get_name.outputs.NAME }}
- fi
- echo "PATH=$(pwd)" >> $GITHUB_OUTPUT
-
- - name: Check tests existence
- id: check_tests_existence
- if: steps.check_ci_needed.outputs.CI-NEEDED == 'true'
- uses: andstor/file-existence-action@v1
- with:
- files: "${{ steps.get_working_directory.outputs.PATH }}/Tests"
-
-
-
-
- build:
- name: ⚡️ Build
- runs-on: macOS-latest
- needs: prepare-ci
- if: needs.prepare-ci.outputs.CI-NEEDED == 'true'
+ name: ⚙️ Prepare CI
+ runs-on: macos-14
steps:
- - uses: actions/checkout@v2
-
- - name: install needs
- run: |
- bash <(curl -Ls https://install.tuist.io)
-
- - name: Compute dependency cache key
- id: compute_hash
- run: echo "hash=${{ hashFiles('Tuist/Dependencies.swift') }}" >> $GITHUB_OUTPUT
-
- - name: Check dependency cache
- uses: actions/cache@v3
- id: cache_dependencies
- with:
- path: ${{ env.CACHED_DEPENDENCY_PATHS }}
- key: ${{ steps.compute_hash.outputs.hash }}
-
- - name: Install dependencies
- if: steps.cache_dependencies.outputs.cache-hit != 'true'
- run: tuist fetch
-
- - name: build codes
- working-directory: ${{ needs.prepare-ci.outputs.WROKING-PATH }}
- run: tuist build
-
-
+ - uses: actions/checkout@v3
+
+ - name: Select Xcode 15.4
+ run: sudo xcode-select -s /Applications/Xcode_15.4.app/Contents/Developer
+
+ - name: Compute package dependency cache key
+ id: compute_package_hash
+ run: echo "package_hash=${{ hashFiles('Package.swift') }}" >> $GITHUB_OUTPUT
+
+ - name: Check package dependency cache
+ uses: actions/cache@v3
+ id: cache_package_dependencies
+ with:
+ path: ${{ env.CACHED_PACKAGE_DEPENDENCY_PATHS }}
+ key: ${{ steps.compute_package_hash.outputs.package_hash }}
+
+ - name: Compute carthage dependency cache key
+ id: compute_carthage_hash
+ run: echo "carthage_hash=${{ hashFiles('Cartfile') }}" >> $GITHUB_OUTPUT
+
+ - name: Check carthage dependency cache
+ uses: actions/cache@v3
+ id: cache_carthage_dependencies
+ with:
+ path: ${{ env.CACHED_CARTHAGE_DEPENDENCY_PATHS }}
+ key: ${{ steps.compute_carthage_hash.outputs.carthage_hash }}
+
+ - name: Echo dependency cache hit
+ run: |
+ echo "package cache hit = ${{ steps.cache_package_dependencies.outputs.cache-hit }}"
+ echo "carthage cache hit = ${{ steps.cache_carthage_dependencies.outputs.cache-hit }}"
+
+ - uses: jdx/mise-action@v2
+ if: steps.cache_package_dependencies.outputs.cache-hit == '' || steps.cache_carthage_dependencies.outputs.cache-hit == ''
+
+ - name: Install tuist
+ if: steps.cache_package_dependencies.outputs.cache-hit == '' || steps.cache_carthage_dependencies.outputs.cache-hit == ''
+ run: |
+ brew install carthage
+ mise install tuist
+
+ - name: Install dependencies needs
+ if: steps.cache_package_dependencies.outputs.cache-hit == '' || steps.cache_carthage_dependencies.outputs.cache-hit == ''
+ run: make install
+ outputs:
+ package_dependency_cache_key: ${{ steps.compute_package_hash.outputs.package_hash }}
+ carthage_dependency_cache_key: ${{ steps.compute_carthage_hash.outputs.carthage_hash }}
test:
name: 🧪 Test
- runs-on: macOS-latest
- needs: [prepare-ci]
- if: needs.prepare-ci.outputs.TESTS-EXISTENCE == 'true'
+ runs-on: macos-14
+ needs: prepare-ci
steps:
- - uses: actions/checkout@v2
-
- - name: install needs
- run: |
- bash <(curl -Ls https://install.tuist.io)
-
- - name: Compute dependency cache key
- id: compute_hash
- run: echo "hash=${{ hashFiles('Tuist/Dependencies.swift') }}" >> $GITHUB_OUTPUT
-
- - name: Check dependency cache
- uses: actions/cache@v3
- id: cache_dependencies
- with:
- path: ${{ env.CACHED_DEPENDENCY_PATHS }}
- key: ${{ steps.compute_hash.outputs.hash }}
-
- - name: Install dependencies
- if: steps.cache_dependencies.outputs.cache-hit != 'true'
- run: tuist fetch
-
- - name: test codes
- working-directory: ${{ needs.prepare-ci.outputs.WROKING-PATH }}
- run: tuist test ${{ needs.prepare-ci.outputs.NAME }}Test
-
+ - uses: actions/checkout@v3
+
+ - name: List Xcode installations
+ run: sudo ls -1 /Applications | grep "Xcode"
+
+ - name: Select Xcode 15.4
+ run: sudo xcode-select -s /Applications/Xcode_15.4.app/Contents/Developer
+
+ - name: Show swift version
+ run: swift --version
+
+ - uses: jdx/mise-action@v2
+
+ - name: Install tuist
+ run: |
+ brew install carthage
+ mise install tuist
+
+ - name: Check package dependency cache
+ uses: actions/cache@v3
+ id: cache_package_dependencies
+ with:
+ path: ${{ env.CACHED_PACKAGE_DEPENDENCY_PATHS }}
+ key: ${{ needs.prepare-ci.outputs.package_dependency_cache_key }}
+
+ - name: Check carthage dependency cache
+ uses: actions/cache@v3
+ id: cache_carthage_dependencies
+ with:
+ path: ${{ env.CACHED_CARTHAGE_DEPENDENCY_PATHS }}
+ key: ${{ needs.prepare-ci.outputs.carthage_dependency_cache_key }}
+
+ - name: Echo dependency cache hit
+ run: |
+ echo "package cache hit = ${{ steps.cache_package_dependencies.outputs.cache-hit }}"
+ echo "carthage cache hit = ${{ steps.cache_carthage_dependencies.outputs.cache-hit }}"
+
+ - name: Install needle
+ run: brew install needle
+
+ - name: Install dependencies needs
+ if: steps.cache_package_dependencies.outputs.cache-hit == '' || steps.cache_carthage_dependencies.outputs.cache-hit == ''
+ run: make install
+
+ - name: Make `Secrets.xcconfig`
+ run: |
+ mkdir Projects/App/XCConfig
+ touch ${{ env.SECRET_XCCONFIG_PATH }}
+ echo "" > ${{ env.SECRET_XCCONFIG_PATH }}
+
+ - name: Make `GoogleService-Info.plist`
+ run: |
+ touch ${{ env.GOOGLE_SERVICE_INFO_PLIST_PATH }}
+ echo "${{ secrets.GOOGLE_INFO_PLIST }}" > ${{ env.GOOGLE_SERVICE_INFO_PLIST_PATH }}
+
+ - name: Generate NeedleGenerated.swift
+ run: |
+ sh Scripts/NeedleRunScript.sh ci
+ echo finish NeedleRunScript
+
+ - name: Test with tuist
+ run: make test
diff --git a/.github/workflows/CachingDependencies.yml b/.github/workflows/CachingDependencies.yml
deleted file mode 100644
index 537bd9515..000000000
--- a/.github/workflows/CachingDependencies.yml
+++ /dev/null
@@ -1,33 +0,0 @@
-name: CachingDependencies
-
-on:
- push:
- branches:
- - develop
-
-env:
- CACHED_DEPENDENCY_PATHS: ${{ github.workspace }}/Tuist/Dependencies
-
-jobs:
- install-dependencies:
- name: Install dependencies
- runs-on: macOS-latest
- steps:
- - uses: actions/checkout@v2
- - name: Compute dependency cache key
- id: compute_hash
- run: echo "hash=${{ hashFiles('Tuist/Dependencies.swift') }}" >> $GITHUB_OUTPUT
- - name: Check dependency cache
- uses: actions/cache@v3
- id: cache_dependencies
- with:
- path: ${{ env.CACHED_DEPENDENCY_PATHS }}
- key: ${{ steps.compute_hash.outputs.hash }}
- - name: install tuist
- if: steps.cache_dependencies.outputs.cache-hit != 'true'
- run: bash <(curl -Ls https://install.tuist.io)
- - name: Install dependencies
- if: steps.cache_dependencies.outputs.cache-hit != 'true'
- run: tuist fetch
- outputs:
- dependency_cache_key: ${{ steps.compute_hash.outputs.hash }}
diff --git a/.github/workflows/IssueToPRLabelSync.yml b/.github/workflows/IssueToPRLabelSync.yml
new file mode 100644
index 000000000..d93b50461
--- /dev/null
+++ b/.github/workflows/IssueToPRLabelSync.yml
@@ -0,0 +1,55 @@
+name: Issue to PR label sync
+
+on:
+ pull_request:
+ types:
+ - opened
+ - reopened
+
+jobs:
+ add-label:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+
+ - name: Extract issue number from PR title
+ id: extract-issue-number
+ run: |
+ sh .github/workflows/IssueToPRLabelSync/ExtractIssueNumber.sh >> $GITHUB_OUTPUT
+ env:
+ PR_TITLE: ${{ github.event.pull_request.title }}
+
+ - name: Check if issue number is found
+ id: check-issue-number
+ run: echo "valid_format=$(if [[ -n "${{ steps.extract-issue-number.outputs.issue_number }}" ]]; then echo "true"; else echo "false"; fi)" >> $GITHUB_OUTPUT
+
+ - name: Add label if valid issue format
+ if: steps.check-issue-number.outputs.valid_format == 'true'
+ run: |
+ ISSUE_NUMBER="${{ steps.extract-issue-number.outputs.issue_number }}"
+ echo "Found Issue Number: $ISSUE_NUMBER"
+ gh issue view $ISSUE_NUMBER --json labels --template "{{range .labels}}'{{.name}}',{{end}}" \
+ | sed 's/.$//g' \
+ | xargs -I LABELS gh pr edit ${{ github.event.number }} --add-label "LABELS"
+ env:
+ GH_TOKEN: ${{ github.token }}
+
+ - name: Skip if invalid issue format
+ if: steps.check-issue-number.outputs.valid_format == 'false'
+ run: echo "Invalid issue format. Skipping label addition."
+
+ - name: Comment success result to PR
+ uses: mshick/add-pr-comment@v2
+ if: steps.check-issue-number.outputs.valid_format == 'true'
+ with:
+ message: "## ✅ 이슈와 PR의 Labels 동기화를 성공했어요!"
+ allow-repeats: true
+
+ - name: Comment skip result to PR
+ uses: mshick/add-pr-comment@v2
+ if: steps.check-issue-number.outputs.valid_format == 'false'
+ with:
+ message: "## 🛠️ 이슈와 PR의 Labels 동기화를 스킵했어요."
+ allow-repeats: true
diff --git a/.github/workflows/IssueToPRLabelSync/ExtractIssueNumber.sh b/.github/workflows/IssueToPRLabelSync/ExtractIssueNumber.sh
new file mode 100644
index 000000000..d411c2886
--- /dev/null
+++ b/.github/workflows/IssueToPRLabelSync/ExtractIssueNumber.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+echo "issue_number=$(echo $PR_TITLE | grep -oP '\(#[0-9]+\)' | grep -oP '[0-9]+')"
\ No newline at end of file
diff --git a/.github/workflows/SwiftLint.yml b/.github/workflows/SwiftLint.yml
index 7c9ab585c..b1c66dff8 100644
--- a/.github/workflows/SwiftLint.yml
+++ b/.github/workflows/SwiftLint.yml
@@ -1,31 +1,31 @@
name: SwiftLint
on:
- push:
- paths:
- - '.github/workflows/SwiftLint.yml'
- - '.swiftlint.yml'
- - '**/*.swift'
pull_request:
paths:
- - '.github/workflows/SwiftLint.yml'
- - '.swiftlint.yml'
- - '**/*.swift'
+ - ".github/workflows/SwiftLint.yml"
+ - ".swiftlint.yml"
+ - "**/*.swift"
jobs:
- SwiftLint:
+ swiftlint:
runs-on: ubuntu-latest
+ permissions:
+ pull-requests: write
steps:
- - uses: actions/checkout@v1
+ - uses: actions/checkout@v3
+
- name: GitHub Action for SwiftLint
uses: norio-nomura/action-swiftlint@3.2.1
- - name: GitHub Action for SwiftLint with --strict
- uses: norio-nomura/action-swiftlint@3.2.1
+
+ - name: Comment success result to PR
+ uses: mshick/add-pr-comment@v2
+ if: ${{ success() }}
with:
- args: --strict
- - name: GitHub Action for SwiftLint (Only files changed in the PR)
- uses: norio-nomura/action-swiftlint@3.2.1
- env:
- DIFF_BASE: ${{ github.base_ref }}
- - name: GitHub Action for SwiftLint (Different working directory)
- uses: norio-nomura/action-swiftlint@3.2.1
+ message: "## ✅ Successful finished SwiftLint"
+
+ - name: Comment failure result ot PR
+ uses: mshick/add-pr-comment@v2
+ if: ${{ failure() }}
+ with:
+ message: "## ❌ Error detected on SwiftLint"
diff --git a/.gitignore b/.gitignore
index adfd0277d..fa1024f89 100644
--- a/.gitignore
+++ b/.gitignore
@@ -65,6 +65,8 @@ DerivedData/
!default.mode2v3
*.perspectivev3
!default.perspectivev3
+.build/
+Carthage/
### Xcode Patch ###
*.xcodeproj/*
@@ -109,3 +111,6 @@ amplifytools.xcconfig
### Google
GoogleService-Info.plist
+
+### Needle
+Projects/App/Sources/Application/NeedleGenerated.swift
\ No newline at end of file
diff --git a/.mise.toml b/.mise.toml
new file mode 100644
index 000000000..58d10e97a
--- /dev/null
+++ b/.mise.toml
@@ -0,0 +1,2 @@
+[tools]
+tuist = "4.12.1"
diff --git a/.package.resolved b/.package.resolved
index 0f967cd78..9529bfa4c 100644
--- a/.package.resolved
+++ b/.package.resolved
@@ -1,4 +1,5 @@
{
+ "originHash" : "838cedc1ff704f14426befc05257203bf3aaf397162004377a05b8e903ad2a57",
"pins" : [
{
"identity" : "youtubeplayerkit",
@@ -10,5 +11,5 @@
}
}
],
- "version" : 2
+ "version" : 3
}
diff --git a/.swiftformat b/.swiftformat
new file mode 100644
index 000000000..3830d679f
--- /dev/null
+++ b/.swiftformat
@@ -0,0 +1,64 @@
+
+--exclude fastlane,Tuist,Dependencies,Carthage,**/NeedleGenerated.swift
+
+# options
+--maxwidth 120
+--indent 4
+--trimwhitespace always # trailingSpace
+--lineaftermarks false # fileHeader
+--wraparguments before-first # wrapArguments
+--wrapparameters before-first # wrapArguments
+--wrapcollections before-first # wrapArguments
+
+# rules
+--rules anyObjectProtocol
+--rules blankLineAfterImports
+--rules blankLinesAroundMark
+--rules blankLinesAtEndOfScope
+--rules blankLinesAtStartOfScope
+--rules blankLinesBetweenImports
+--rules blankLinesBetweenScopes
+--rules braces
+--rules consecutiveBlankLines
+--rules consecutiveSpaces
+--rules docComments
+--rules duplicateImports
+--rules elseOnSameLine
+--rules emptyBraces
+--rules enumNamespaces
+--rules extensionAccessControl
+--rules fileHeader
+--rules hoistAwait
+--rules hoistPatternLet
+--rules hoistTry
+--rules initCoderUnavailable
+--rules indent
+--rules isEmpty
+--rules leadingDelimiters
+--rules linebreakAtEndOfFile
+--rules modifierOrder
+--rules numberFormatting
+--rules opaqueGenericParameters
+--rules redundantExtensionACL
+--rules redundantOptionalBinding
+--rules redundantParens
+--rules redundantVoidReturnType
+--rules semicolons
+--rules sortImports
+--rules spaceAroundBraces
+--rules spaceAroundBrackets
+--rules spaceAroundComments
+--rules spaceAroundGenerics
+--rules spaceAroundOperators
+--rules spaceInsideBraces
+--rules spaceInsideBrackets
+--rules spaceInsideComments
+--rules spaceInsideGenerics
+--rules spaceInsideParens
+--rules todos
+--rules trailingClosures
+--rules trailingSpace
+--rules typeSugar
+--rules void
+--rules wrap
+--rules wrapArguments
\ No newline at end of file
diff --git a/.swiftlint.yml b/.swiftlint.yml
new file mode 100644
index 000000000..9e79480a0
--- /dev/null
+++ b/.swiftlint.yml
@@ -0,0 +1,28 @@
+excluded:
+ - "**/*/NeedleGenerated.swift"
+ - "Tuist"
+ - "Plugin"
+
+force_cast: # From https://realm.github.io/SwiftLint/force_cast.html
+ warning # 강제 캐스팅은 error에서 warning으로 변경
+
+identifier_name:
+ min_length:
+ warning: 1
+ allowed_symbols: ["_"]
+
+nesting:
+ type_label:
+ warning: 3
+
+type_name:
+ max_length:
+ warning: 60
+
+function_body_length:
+ warning: 100
+ error: 300
+
+function_parameter_count:
+ warning: 10
+ error: 15
diff --git a/.tuist-bin/ProjectDescription.framework.dSYM/Contents/Info.plist b/.tuist-bin/ProjectDescription.framework.dSYM/Contents/Info.plist
deleted file mode 100644
index bb3ab9af2..000000000
--- a/.tuist-bin/ProjectDescription.framework.dSYM/Contents/Info.plist
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
- CFBundleDevelopmentRegion
- English
- CFBundleIdentifier
- com.apple.xcode.dsym.ProjectDescription
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundlePackageType
- dSYM
- CFBundleSignature
- ????
- CFBundleShortVersionString
- 1.0
- CFBundleVersion
- 1
-
-
diff --git a/.tuist-bin/ProjectDescription.framework.dSYM/Contents/Resources/DWARF/ProjectDescription b/.tuist-bin/ProjectDescription.framework.dSYM/Contents/Resources/DWARF/ProjectDescription
deleted file mode 100644
index 885f07c91..000000000
Binary files a/.tuist-bin/ProjectDescription.framework.dSYM/Contents/Resources/DWARF/ProjectDescription and /dev/null differ
diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64-apple-macos.swiftdoc b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64-apple-macos.swiftdoc
deleted file mode 100644
index afc20046e..000000000
Binary files a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64-apple-macos.swiftdoc and /dev/null differ
diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64-apple-macos.swiftinterface b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64-apple-macos.swiftinterface
deleted file mode 100644
index 99e7d8a4b..000000000
--- a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64-apple-macos.swiftinterface
+++ /dev/null
@@ -1,1418 +0,0 @@
-// swift-interface-format-version: 1.0
-// swift-compiler-version: Apple Swift version 5.5.1 (swiftlang-1300.0.31.4 clang-1300.0.29.6)
-// swift-module-flags: -target arm64-apple-macos11.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -module-name ProjectDescription
-import Foundation
-import Swift
-import _Concurrency
-public struct AnalyzeAction : Swift.Equatable, Swift.Codable {
- public let configuration: ProjectDescription.ConfigurationName
- public static func analyzeAction(configuration: ProjectDescription.ConfigurationName) -> ProjectDescription.AnalyzeAction
- public static func == (a: ProjectDescription.AnalyzeAction, b: ProjectDescription.AnalyzeAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct ArchiveAction : Swift.Equatable, Swift.Codable {
- public let configuration: ProjectDescription.ConfigurationName
- public let revealArchiveInOrganizer: Swift.Bool
- public let customArchiveName: Swift.String?
- public let preActions: [ProjectDescription.ExecutionAction]
- public let postActions: [ProjectDescription.ExecutionAction]
- public static func archiveAction(configuration: ProjectDescription.ConfigurationName, revealArchiveInOrganizer: Swift.Bool = true, customArchiveName: Swift.String? = nil, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = []) -> ProjectDescription.ArchiveAction
- public static func == (a: ProjectDescription.ArchiveAction, b: ProjectDescription.ArchiveAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Arguments : Swift.Equatable, Swift.Codable {
- public let environment: [Swift.String : Swift.String]
- public let launchArguments: [ProjectDescription.LaunchArgument]
- public init(environment: [Swift.String : Swift.String] = [:], launchArguments: [ProjectDescription.LaunchArgument] = [])
- public static func == (a: ProjectDescription.Arguments, b: ProjectDescription.Arguments) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct BuildAction : Swift.Equatable, Swift.Codable {
- public let targets: [ProjectDescription.TargetReference]
- public let preActions: [ProjectDescription.ExecutionAction]
- public let postActions: [ProjectDescription.ExecutionAction]
- public let runPostActionsOnFailure: Swift.Bool
- public init(targets: [ProjectDescription.TargetReference], preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], runPostActionsOnFailure: Swift.Bool = false)
- public static func buildAction(targets: [ProjectDescription.TargetReference], preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], runPostActionsOnFailure: Swift.Bool = false) -> ProjectDescription.BuildAction
- public static func == (a: ProjectDescription.BuildAction, b: ProjectDescription.BuildAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Cache : Swift.Codable, Swift.Equatable {
- public struct Profile : Swift.Codable, Swift.Equatable {
- public let name: Swift.String
- public let configuration: Swift.String
- public let device: Swift.String?
- public let os: Swift.String?
- public static func profile(name: Swift.String, configuration: Swift.String, device: Swift.String? = nil, os: Swift.String? = nil) -> ProjectDescription.Cache.Profile
- public static func == (a: ProjectDescription.Cache.Profile, b: ProjectDescription.Cache.Profile) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public let profiles: [ProjectDescription.Cache.Profile]
- public let path: ProjectDescription.Path?
- public static func cache(profiles: [ProjectDescription.Cache.Profile] = [], path: ProjectDescription.Path? = nil) -> ProjectDescription.Cache
- public static func == (a: ProjectDescription.Cache, b: ProjectDescription.Cache) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Cloud : Swift.Codable, Swift.Equatable {
- public enum Option : Swift.String, Swift.Codable, Swift.Equatable {
- case analytics
- case optional
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public let url: Swift.String
- public let projectId: Swift.String
- public let options: [ProjectDescription.Cloud.Option]
- public static func cloud(projectId: Swift.String, url: Swift.String, options: [ProjectDescription.Cloud.Option] = []) -> ProjectDescription.Cloud
- public static func == (a: ProjectDescription.Cloud, b: ProjectDescription.Cloud) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum CompatibleXcodeVersions : Swift.ExpressibleByArrayLiteral, Swift.ExpressibleByStringInterpolation, Swift.Codable, Swift.Equatable {
- case all
- case exact(ProjectDescription.Version)
- case upToNextMajor(ProjectDescription.Version)
- case upToNextMinor(ProjectDescription.Version)
- case list([ProjectDescription.CompatibleXcodeVersions])
- public init(arrayLiteral elements: [ProjectDescription.CompatibleXcodeVersions])
- public init(arrayLiteral elements: ProjectDescription.CompatibleXcodeVersions...)
- public init(stringLiteral value: Swift.String)
- public static func == (a: ProjectDescription.CompatibleXcodeVersions, b: ProjectDescription.CompatibleXcodeVersions) -> Swift.Bool
- public typealias ArrayLiteralElement = ProjectDescription.CompatibleXcodeVersions
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Config : Swift.Codable, Swift.Equatable {
- public let generationOptions: ProjectDescription.Config.GenerationOptions
- public let compatibleXcodeVersions: ProjectDescription.CompatibleXcodeVersions
- public let plugins: [ProjectDescription.PluginLocation]
- public let cloud: ProjectDescription.Cloud?
- public let cache: ProjectDescription.Cache?
- public let swiftVersion: ProjectDescription.Version?
- public init(compatibleXcodeVersions: ProjectDescription.CompatibleXcodeVersions = .all, cloud: ProjectDescription.Cloud? = nil, cache: ProjectDescription.Cache? = nil, swiftVersion: ProjectDescription.Version? = nil, plugins: [ProjectDescription.PluginLocation] = [], generationOptions: ProjectDescription.Config.GenerationOptions = .options())
- public static func == (a: ProjectDescription.Config, b: ProjectDescription.Config) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Config {
- public struct GenerationOptions : Swift.Codable, Swift.Equatable {
- public let resolveDependenciesWithSystemScm: Swift.Bool
- public let disablePackageVersionLocking: Swift.Bool
- public static func options(resolveDependenciesWithSystemScm: Swift.Bool = false, disablePackageVersionLocking: Swift.Bool = false) -> ProjectDescription.Config.GenerationOptions
- public static func == (a: ProjectDescription.Config.GenerationOptions, b: ProjectDescription.Config.GenerationOptions) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-public struct ConfigurationName : Swift.ExpressibleByStringLiteral, Swift.Codable, Swift.Equatable {
- public let rawValue: Swift.String
- public init(stringLiteral value: Swift.StringLiteralType)
- public static func configuration(_ name: Swift.String) -> ProjectDescription.ConfigurationName
- public static var debug: ProjectDescription.ConfigurationName {
- get
- }
- public static var release: ProjectDescription.ConfigurationName {
- get
- }
- public static func == (a: ProjectDescription.ConfigurationName, b: ProjectDescription.ConfigurationName) -> Swift.Bool
- public typealias ExtendedGraphemeClusterLiteralType = Swift.StringLiteralType
- public typealias StringLiteralType = Swift.StringLiteralType
- public typealias UnicodeScalarLiteralType = Swift.StringLiteralType
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct CopyFilesAction : Swift.Codable, Swift.Equatable {
- public var name: Swift.String
- public var destination: ProjectDescription.CopyFilesAction.Destination
- public var subpath: Swift.String?
- public var files: [ProjectDescription.FileElement]
- public enum Destination : Swift.String, Swift.Codable, Swift.Equatable {
- case absolutePath
- case productsDirectory
- case wrapper
- case executables
- case resources
- case javaResources
- case frameworks
- case sharedFrameworks
- case sharedSupport
- case plugins
- case other
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public static func productsDirectory(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func wrapper(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func executables(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func resources(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func javaResources(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func frameworks(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func sharedFrameworks(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func sharedSupport(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func plugins(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func == (a: ProjectDescription.CopyFilesAction, b: ProjectDescription.CopyFilesAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct CoreDataModel : Swift.Codable, Swift.Equatable {
- public let path: ProjectDescription.Path
- public let currentVersion: Swift.String?
- public init(_ path: ProjectDescription.Path, currentVersion: Swift.String? = nil)
- public static func == (a: ProjectDescription.CoreDataModel, b: ProjectDescription.CoreDataModel) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct CarthageDependencies : Swift.Codable, Swift.Equatable {
- public let dependencies: [ProjectDescription.CarthageDependencies.Dependency]
- public init(_ dependencies: [ProjectDescription.CarthageDependencies.Dependency])
- public static func == (a: ProjectDescription.CarthageDependencies, b: ProjectDescription.CarthageDependencies) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.CarthageDependencies : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: ProjectDescription.CarthageDependencies.Dependency...)
- public typealias ArrayLiteralElement = ProjectDescription.CarthageDependencies.Dependency
-}
-extension ProjectDescription.CarthageDependencies {
- public enum Dependency : Swift.Codable, Swift.Equatable {
- case github(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement)
- case git(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement)
- case binary(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement)
- public static func == (a: ProjectDescription.CarthageDependencies.Dependency, b: ProjectDescription.CarthageDependencies.Dependency) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public enum Requirement : Swift.Codable, Swift.Equatable {
- case exact(ProjectDescription.Version)
- case upToNext(ProjectDescription.Version)
- case atLeast(ProjectDescription.Version)
- case branch(Swift.String)
- case revision(Swift.String)
- public static func == (a: ProjectDescription.CarthageDependencies.Requirement, b: ProjectDescription.CarthageDependencies.Requirement) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-public struct Dependencies : Swift.Codable, Swift.Equatable {
- public let carthage: ProjectDescription.CarthageDependencies?
- public let swiftPackageManager: ProjectDescription.SwiftPackageManagerDependencies?
- public let platforms: Swift.Set
- public init(carthage: ProjectDescription.CarthageDependencies? = nil, swiftPackageManager: ProjectDescription.SwiftPackageManagerDependencies? = nil, platforms: Swift.Set = Set(Platform.allCases))
- public static func == (a: ProjectDescription.Dependencies, b: ProjectDescription.Dependencies) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct SwiftPackageManagerDependencies : Swift.Codable, Swift.Equatable {
- public let packages: [ProjectDescription.Package]
- public let productTypes: [Swift.String : ProjectDescription.Product]
- public let baseSettings: ProjectDescription.Settings
- public let targetSettings: [Swift.String : ProjectDescription.SettingsDictionary]
- public let projectOptions: [Swift.String : ProjectDescription.Project.Options]
- public init(_ packages: [ProjectDescription.Package], productTypes: [Swift.String : ProjectDescription.Product] = [:], baseSettings: ProjectDescription.Settings = .settings(), targetSettings: [Swift.String : ProjectDescription.SettingsDictionary] = [:], projectOptions: [Swift.String : ProjectDescription.Project.Options] = [:])
- public static func == (a: ProjectDescription.SwiftPackageManagerDependencies, b: ProjectDescription.SwiftPackageManagerDependencies) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.SwiftPackageManagerDependencies : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: ProjectDescription.Package...)
- public typealias ArrayLiteralElement = ProjectDescription.Package
-}
-public struct DeploymentDevice : Swift.OptionSet, Swift.Codable, Swift.Hashable {
- public static let iphone: ProjectDescription.DeploymentDevice
- public static let ipad: ProjectDescription.DeploymentDevice
- public static let mac: ProjectDescription.DeploymentDevice
- public let rawValue: Swift.UInt
- public init(rawValue: Swift.UInt)
- public typealias ArrayLiteralElement = ProjectDescription.DeploymentDevice
- public typealias Element = ProjectDescription.DeploymentDevice
- public typealias RawValue = Swift.UInt
-}
-public enum DeploymentTarget : Swift.Codable, Swift.Hashable {
- case iOS(targetVersion: Swift.String, devices: ProjectDescription.DeploymentDevice)
- case macOS(targetVersion: Swift.String)
- case watchOS(targetVersion: Swift.String)
- case tvOS(targetVersion: Swift.String)
- public var targetVersion: Swift.String {
- get
- }
- public func hash(into hasher: inout Swift.Hasher)
- public static func == (a: ProjectDescription.DeploymentTarget, b: ProjectDescription.DeploymentTarget) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public var hashValue: Swift.Int {
- get
- }
- public init(from decoder: Swift.Decoder) throws
-}
-@dynamicMemberLookup public enum Environment {
- public enum Value : Swift.Equatable {
- case boolean(Swift.Bool)
- case string(Swift.String)
- public static func == (a: ProjectDescription.Environment.Value, b: ProjectDescription.Environment.Value) -> Swift.Bool
- }
- public static subscript(dynamicMember member: Swift.String) -> ProjectDescription.Environment.Value? {
- get
- }
-}
-extension Swift.Optional where Wrapped == ProjectDescription.Environment.Value {
- public func getString(default defaultString: Swift.String) -> Swift.String
- public func getBoolean(default defaultBoolean: Swift.Bool) -> Swift.Bool
-}
-public struct ExecutionAction : Swift.Equatable, Swift.Codable {
- public let title: Swift.String
- public let scriptText: Swift.String
- public let target: ProjectDescription.TargetReference?
- public init(title: Swift.String = "Run Script", scriptText: Swift.String, target: ProjectDescription.TargetReference? = nil)
- public static func == (a: ProjectDescription.ExecutionAction, b: ProjectDescription.ExecutionAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum FileCodeGen : Swift.String, Swift.Codable, Swift.Equatable {
- case `public`
- case `private`
- case project
- case disabled
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public enum FileElement : Swift.Codable, Swift.Equatable {
- case glob(pattern: ProjectDescription.Path)
- case folderReference(path: ProjectDescription.Path)
- public static func == (a: ProjectDescription.FileElement, b: ProjectDescription.FileElement) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.FileElement : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension Swift.Array : Swift.ExpressibleByUnicodeScalarLiteral where Element == ProjectDescription.FileElement {
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension Swift.Array : Swift.ExpressibleByExtendedGraphemeClusterLiteral where Element == ProjectDescription.FileElement {
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
-}
-extension Swift.Array : Swift.ExpressibleByStringLiteral where Element == ProjectDescription.FileElement {
- public typealias StringLiteralType = Swift.String
- public init(stringLiteral value: Swift.String)
-}
-public enum FileHeaderTemplate : Swift.Codable, Swift.Equatable, Swift.ExpressibleByStringInterpolation {
- case file(ProjectDescription.Path)
- case string(Swift.String)
- public init(stringLiteral value: Swift.String)
- public static func == (a: ProjectDescription.FileHeaderTemplate, b: ProjectDescription.FileHeaderTemplate) -> Swift.Bool
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct FileList : Swift.Codable, Swift.Equatable {
- public let globs: [ProjectDescription.FileListGlob]
- public static func list(_ globs: [ProjectDescription.FileListGlob]) -> ProjectDescription.FileList
- public static func == (a: ProjectDescription.FileList, b: ProjectDescription.FileList) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.FileList : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.FileList : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: Swift.String...)
- public typealias ArrayLiteralElement = Swift.String
-}
-public struct FileListGlob : Swift.Codable, Swift.Equatable {
- public var glob: ProjectDescription.Path
- public var excluding: [ProjectDescription.Path]
- public static func glob(_ glob: ProjectDescription.Path, excluding: [ProjectDescription.Path] = []) -> ProjectDescription.FileListGlob
- public static func glob(_ glob: ProjectDescription.Path, excluding: ProjectDescription.Path?) -> ProjectDescription.FileListGlob
- public static func == (a: ProjectDescription.FileListGlob, b: ProjectDescription.FileListGlob) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.FileListGlob : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-public struct Headers : Swift.Codable, Swift.Equatable {
- public enum AutomaticExclusionRule : Swift.Int, Swift.Codable {
- case projectExcludesPrivateAndPublic
- case publicExcludesPrivateAndProject
- public init?(rawValue: Swift.Int)
- public typealias RawValue = Swift.Int
- public var rawValue: Swift.Int {
- get
- }
- }
- public let umbrellaHeader: ProjectDescription.Path?
- public let `public`: ProjectDescription.FileList?
- public let `private`: ProjectDescription.FileList?
- public let project: ProjectDescription.FileList?
- public let exclusionRule: ProjectDescription.Headers.AutomaticExclusionRule
- public static func headers(public: ProjectDescription.FileList? = nil, private: ProjectDescription.FileList? = nil, project: ProjectDescription.FileList? = nil, exclusionRule: ProjectDescription.Headers.AutomaticExclusionRule = .projectExcludesPrivateAndPublic) -> ProjectDescription.Headers
- public static func allHeaders(from list: ProjectDescription.FileList, umbrella: ProjectDescription.Path, private privateHeaders: ProjectDescription.FileList? = nil) -> ProjectDescription.Headers
- public static func onlyHeaders(from list: ProjectDescription.FileList, umbrella: ProjectDescription.Path, private privateHeaders: ProjectDescription.FileList? = nil) -> ProjectDescription.Headers
- public static func == (a: ProjectDescription.Headers, b: ProjectDescription.Headers) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum InfoPlist : Swift.Codable, Swift.Equatable {
- indirect public enum Value : Swift.Codable, Swift.Equatable {
- case string(Swift.String)
- case integer(Swift.Int)
- case real(Swift.Double)
- case boolean(Swift.Bool)
- case dictionary([Swift.String : ProjectDescription.InfoPlist.Value])
- case array([ProjectDescription.InfoPlist.Value])
- public static func == (a: ProjectDescription.InfoPlist.Value, b: ProjectDescription.InfoPlist.Value) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- case file(path: ProjectDescription.Path)
- case dictionary([Swift.String : ProjectDescription.InfoPlist.Value])
- case extendingDefault(with: [Swift.String : ProjectDescription.InfoPlist.Value])
- public static var `default`: ProjectDescription.InfoPlist {
- get
- }
- public enum CodingError : Swift.Error {
- case invalidType(Swift.String)
- }
- public var path: ProjectDescription.Path? {
- get
- }
- public static func == (a: ProjectDescription.InfoPlist, b: ProjectDescription.InfoPlist) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.InfoPlist : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByIntegerLiteral {
- public init(integerLiteral value: Swift.Int)
- public typealias IntegerLiteralType = Swift.Int
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByFloatLiteral {
- public init(floatLiteral value: Swift.Double)
- public typealias FloatLiteralType = Swift.Double
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByBooleanLiteral {
- public init(booleanLiteral value: Swift.Bool)
- public typealias BooleanLiteralType = Swift.Bool
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByDictionaryLiteral {
- public init(dictionaryLiteral elements: (Swift.String, ProjectDescription.InfoPlist.Value)...)
- public typealias Key = Swift.String
- public typealias Value = ProjectDescription.InfoPlist.Value
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: ProjectDescription.InfoPlist.Value...)
- public typealias ArrayLiteralElement = ProjectDescription.InfoPlist.Value
-}
-public struct LaunchArgument : Swift.Equatable, Swift.Codable {
- public let name: Swift.String
- public let isEnabled: Swift.Bool
- public init(name: Swift.String, isEnabled: Swift.Bool)
- public static func == (a: ProjectDescription.LaunchArgument, b: ProjectDescription.LaunchArgument) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum Package : Swift.Equatable, Swift.Codable {
- case remote(url: Swift.String, requirement: ProjectDescription.Package.Requirement)
- case local(path: ProjectDescription.Path)
- public static func == (a: ProjectDescription.Package, b: ProjectDescription.Package) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Package {
- public enum Requirement : Swift.Codable, Swift.Equatable {
- case upToNextMajor(from: ProjectDescription.Version)
- case upToNextMinor(from: ProjectDescription.Version)
- case range(from: ProjectDescription.Version, to: ProjectDescription.Version)
- case exact(ProjectDescription.Version)
- case branch(Swift.String)
- case revision(Swift.String)
- public static func == (a: ProjectDescription.Package.Requirement, b: ProjectDescription.Package.Requirement) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-extension ProjectDescription.Package {
- public static func package(url: Swift.String, from version: ProjectDescription.Version) -> ProjectDescription.Package
- public static func package(url: Swift.String, _ requirement: ProjectDescription.Package.Requirement) -> ProjectDescription.Package
- public static func package(url: Swift.String, _ range: Swift.Range) -> ProjectDescription.Package
- public static func package(url: Swift.String, _ range: Swift.ClosedRange) -> ProjectDescription.Package
- public static func package(path: ProjectDescription.Path) -> ProjectDescription.Package
-}
-extension ProjectDescription.Package {
- @available(*, unavailable, message: "use package(url:_:) with the .exact(Version) initializer instead")
- public static func package(url _: Swift.String, version _: ProjectDescription.Version) -> ProjectDescription.Package
- @available(*, unavailable, message: "use package(url:_:) with the .branch(String) initializer instead")
- public static func package(url _: Swift.String, branch _: Swift.String) -> ProjectDescription.Package
- @available(*, unavailable, message: "use package(url:_:) with the .revision(String) initializer instead")
- public static func package(url _: Swift.String, revision _: Swift.String) -> ProjectDescription.Package
- @available(*, unavailable, message: "use package(url:_:) without the range label instead")
- public static func package(url _: Swift.String, range _: Swift.Range) -> ProjectDescription.Package
-}
-public struct Path : Swift.ExpressibleByStringInterpolation, Swift.Codable, Swift.Hashable {
- public enum PathType : Swift.String, Swift.Codable {
- case relativeToCurrentFile
- case relativeToManifest
- case relativeToRoot
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public let type: ProjectDescription.Path.PathType
- public let pathString: Swift.String
- public let callerPath: Swift.String?
- public init(_ path: Swift.String)
- public static func relativeToCurrentFile(_ pathString: Swift.String, callerPath: Swift.StaticString = #file) -> ProjectDescription.Path
- public static func relativeToManifest(_ pathString: Swift.String) -> ProjectDescription.Path
- public static func relativeToRoot(_ pathString: Swift.String) -> ProjectDescription.Path
- public init(stringLiteral: Swift.String)
- public static func == (a: ProjectDescription.Path, b: ProjectDescription.Path) -> Swift.Bool
- public func hash(into hasher: inout Swift.Hasher)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public var hashValue: Swift.Int {
- get
- }
- public init(from decoder: Swift.Decoder) throws
-}
-public enum Platform : Swift.String, Swift.Codable, Swift.Equatable, Swift.CaseIterable {
- case iOS
- case macOS
- case watchOS
- case tvOS
- public init?(rawValue: Swift.String)
- public typealias AllCases = [ProjectDescription.Platform]
- public typealias RawValue = Swift.String
- public static var allCases: [ProjectDescription.Platform] {
- get
- }
- public var rawValue: Swift.String {
- get
- }
-}
-public struct Plugin : Swift.Codable, Swift.Equatable {
- public let name: Swift.String
- public init(name: Swift.String)
- public static func == (a: ProjectDescription.Plugin, b: ProjectDescription.Plugin) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct PluginLocation : Swift.Codable, Swift.Equatable {
- public let type: ProjectDescription.PluginLocation.LocationType
- public static func local(path: ProjectDescription.Path) -> ProjectDescription.PluginLocation
- public static func git(url: Swift.String, tag: Swift.String, directory: Swift.String? = nil) -> ProjectDescription.PluginLocation
- public static func git(url: Swift.String, sha: Swift.String, directory: Swift.String? = nil) -> ProjectDescription.PluginLocation
- public static func == (a: ProjectDescription.PluginLocation, b: ProjectDescription.PluginLocation) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.PluginLocation {
- public enum LocationType : Swift.Codable, Swift.Equatable {
- case local(path: ProjectDescription.Path)
- case gitWithTag(url: Swift.String, tag: Swift.String, directory: Swift.String?)
- case gitWithSha(url: Swift.String, sha: Swift.String, directory: Swift.String?)
- public static func == (a: ProjectDescription.PluginLocation.LocationType, b: ProjectDescription.PluginLocation.LocationType) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-public enum Product : Swift.String, Swift.Codable, Swift.Equatable {
- case app
- case staticLibrary
- case dynamicLibrary
- case framework
- case staticFramework
- case unitTests
- case uiTests
- case bundle
- case commandLineTool
- case appClip
- case appExtension
- case watch2App
- case watch2Extension
- case tvTopShelfExtension
- case messagesExtension
- case stickerPackExtension
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public struct ProfileAction : Swift.Equatable, Swift.Codable {
- public let configuration: ProjectDescription.ConfigurationName
- public let preActions: [ProjectDescription.ExecutionAction]
- public let postActions: [ProjectDescription.ExecutionAction]
- public let executable: ProjectDescription.TargetReference?
- public let arguments: ProjectDescription.Arguments?
- public static func profileAction(configuration: ProjectDescription.ConfigurationName = .release, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], executable: ProjectDescription.TargetReference? = nil, arguments: ProjectDescription.Arguments? = nil) -> ProjectDescription.ProfileAction
- public static func == (a: ProjectDescription.ProfileAction, b: ProjectDescription.ProfileAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Project : Swift.Codable, Swift.Equatable {
- public let name: Swift.String
- public let organizationName: Swift.String?
- public let options: ProjectDescription.Project.Options
- public let packages: [ProjectDescription.Package]
- public let targets: [ProjectDescription.Target]
- public let schemes: [ProjectDescription.Scheme]
- public let settings: ProjectDescription.Settings?
- public let fileHeaderTemplate: ProjectDescription.FileHeaderTemplate?
- public let additionalFiles: [ProjectDescription.FileElement]
- public let resourceSynthesizers: [ProjectDescription.ResourceSynthesizer]
- public init(name: Swift.String, organizationName: Swift.String? = nil, options: ProjectDescription.Project.Options = .options(), packages: [ProjectDescription.Package] = [], settings: ProjectDescription.Settings? = nil, targets: [ProjectDescription.Target] = [], schemes: [ProjectDescription.Scheme] = [], fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? = nil, additionalFiles: [ProjectDescription.FileElement] = [], resourceSynthesizers: [ProjectDescription.ResourceSynthesizer] = .default)
- public static func == (a: ProjectDescription.Project, b: ProjectDescription.Project) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Project {
- public struct Options : Swift.Codable, Swift.Equatable {
- public let automaticSchemesOptions: ProjectDescription.Project.Options.AutomaticSchemesOptions
- public let developmentRegion: Swift.String?
- public let disableBundleAccessors: Swift.Bool
- public let disableShowEnvironmentVarsInScriptPhases: Swift.Bool
- public let disableSynthesizedResourceAccessors: Swift.Bool
- public let textSettings: ProjectDescription.Project.Options.TextSettings
- public let xcodeProjectName: Swift.String?
- public static func options(automaticSchemesOptions: ProjectDescription.Project.Options.AutomaticSchemesOptions = .enabled(), developmentRegion: Swift.String? = nil, disableBundleAccessors: Swift.Bool = false, disableShowEnvironmentVarsInScriptPhases: Swift.Bool = false, disableSynthesizedResourceAccessors: Swift.Bool = false, textSettings: ProjectDescription.Project.Options.TextSettings = .textSettings(), xcodeProjectName: Swift.String? = nil) -> ProjectDescription.Project.Options
- public static func == (a: ProjectDescription.Project.Options, b: ProjectDescription.Project.Options) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-extension ProjectDescription.Project.Options {
- public enum AutomaticSchemesOptions : Swift.Codable, Swift.Equatable {
- public enum TargetSchemesGrouping : Swift.Codable, Swift.Equatable {
- case singleScheme
- case byNameSuffix(build: Swift.Set, test: Swift.Set, run: Swift.Set)
- case notGrouped
- public static func == (a: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping, b: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- case enabled(targetSchemesGrouping: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping = .byNameSuffix(
- build: ["Implementation", "Interface", "Mocks", "Testing"],
- test: ["Tests", "IntegrationTests", "UITests", "SnapshotTests"],
- run: ["App", "Demo"]
- ), codeCoverageEnabled: Swift.Bool = false, testingOptions: ProjectDescription.TestingOptions = [])
- case disabled
- public static func == (a: ProjectDescription.Project.Options.AutomaticSchemesOptions, b: ProjectDescription.Project.Options.AutomaticSchemesOptions) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public struct TextSettings : Swift.Codable, Swift.Equatable {
- public let usesTabs: Swift.Bool?
- public let indentWidth: Swift.UInt?
- public let tabWidth: Swift.UInt?
- public let wrapsLines: Swift.Bool?
- public static func textSettings(usesTabs: Swift.Bool? = nil, indentWidth: Swift.UInt? = nil, tabWidth: Swift.UInt? = nil, wrapsLines: Swift.Bool? = nil) -> ProjectDescription.Project.Options.TextSettings
- public static func == (a: ProjectDescription.Project.Options.TextSettings, b: ProjectDescription.Project.Options.TextSettings) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-public enum ResourceFileElement : Swift.Codable, Swift.Equatable {
- case glob(pattern: ProjectDescription.Path, excluding: [ProjectDescription.Path] = [], tags: [Swift.String] = [])
- case folderReference(path: ProjectDescription.Path, tags: [Swift.String] = [])
- public static func == (a: ProjectDescription.ResourceFileElement, b: ProjectDescription.ResourceFileElement) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.ResourceFileElement : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-public struct ResourceFileElements : Swift.Codable, Swift.Equatable {
- public let resources: [ProjectDescription.ResourceFileElement]
- public init(resources: [ProjectDescription.ResourceFileElement])
- public static func == (a: ProjectDescription.ResourceFileElements, b: ProjectDescription.ResourceFileElements) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.ResourceFileElements : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.ResourceFileElements : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: ProjectDescription.ResourceFileElement...)
- public typealias ArrayLiteralElement = ProjectDescription.ResourceFileElement
-}
-public struct ResourceSynthesizer : Swift.Codable, Swift.Equatable {
- public let templateType: ProjectDescription.ResourceSynthesizer.TemplateType
- public let parser: ProjectDescription.ResourceSynthesizer.Parser
- public let extensions: Swift.Set
- public enum TemplateType : Swift.Codable, Swift.Equatable {
- case plugin(name: Swift.String, resourceName: Swift.String)
- case defaultTemplate(resourceName: Swift.String)
- public static func == (a: ProjectDescription.ResourceSynthesizer.TemplateType, b: ProjectDescription.ResourceSynthesizer.TemplateType) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public enum Parser : Swift.String, Swift.Codable {
- case strings
- case assets
- case plists
- case fonts
- case coreData
- case interfaceBuilder
- case json
- case yaml
- case files
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public static func strings() -> ProjectDescription.ResourceSynthesizer
- public static func strings(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func assets() -> ProjectDescription.ResourceSynthesizer
- public static func assets(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func fonts() -> ProjectDescription.ResourceSynthesizer
- public static func fonts(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func plists() -> ProjectDescription.ResourceSynthesizer
- public static func plists(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func coreData(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func coreData() -> ProjectDescription.ResourceSynthesizer
- public static func interfaceBuilder(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func interfaceBuilder() -> ProjectDescription.ResourceSynthesizer
- public static func json(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func json() -> ProjectDescription.ResourceSynthesizer
- public static func yaml(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func yaml() -> ProjectDescription.ResourceSynthesizer
- public static func files(plugin: Swift.String, extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer
- public static func files(extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer
- public static func custom(plugin: Swift.String, parser: ProjectDescription.ResourceSynthesizer.Parser, extensions: Swift.Set, resourceName: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func custom(name: Swift.String, parser: ProjectDescription.ResourceSynthesizer.Parser, extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer
- public static func == (a: ProjectDescription.ResourceSynthesizer, b: ProjectDescription.ResourceSynthesizer) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension Swift.Array where Element == ProjectDescription.ResourceSynthesizer {
- public static var `default`: Swift.Array {
- get
- }
-}
-public struct RunAction : Swift.Equatable, Swift.Codable {
- public let configuration: ProjectDescription.ConfigurationName
- public let attachDebugger: Swift.Bool
- public let preActions: [ProjectDescription.ExecutionAction]
- public let postActions: [ProjectDescription.ExecutionAction]
- public let executable: ProjectDescription.TargetReference?
- public let arguments: ProjectDescription.Arguments?
- public let options: ProjectDescription.RunActionOptions
- public let diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption]
- public static func runAction(configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], executable: ProjectDescription.TargetReference? = nil, arguments: ProjectDescription.Arguments? = nil, options: ProjectDescription.RunActionOptions = .options(), diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] = [.mainThreadChecker]) -> ProjectDescription.RunAction
- public static func == (a: ProjectDescription.RunAction, b: ProjectDescription.RunAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct RunActionOptions : Swift.Equatable, Swift.Codable {
- public let language: ProjectDescription.SchemeLanguage?
- public let storeKitConfigurationPath: ProjectDescription.Path?
- public let simulatedLocation: ProjectDescription.RunActionOptions.SimulatedLocation?
- public let enableGPUFrameCaptureMode: ProjectDescription.RunActionOptions.GPUFrameCaptureMode
- public static func options(language: ProjectDescription.SchemeLanguage? = nil, storeKitConfigurationPath: ProjectDescription.Path? = nil, simulatedLocation: ProjectDescription.RunActionOptions.SimulatedLocation? = nil, enableGPUFrameCaptureMode: ProjectDescription.RunActionOptions.GPUFrameCaptureMode = GPUFrameCaptureMode.default) -> ProjectDescription.RunActionOptions
- public static func == (a: ProjectDescription.RunActionOptions, b: ProjectDescription.RunActionOptions) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.RunActionOptions {
- public struct SimulatedLocation : Swift.Codable, Swift.Equatable {
- public let identifier: Swift.String?
- public let gpxFile: ProjectDescription.Path?
- public static func custom(gpxFile: ProjectDescription.Path) -> ProjectDescription.RunActionOptions.SimulatedLocation
- public static var london: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var johannesburg: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var moscow: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var mumbai: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var tokyo: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var sydney: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var hongKong: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var honolulu: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var sanFrancisco: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var mexicoCity: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var newYork: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var rioDeJaneiro: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static func == (a: ProjectDescription.RunActionOptions.SimulatedLocation, b: ProjectDescription.RunActionOptions.SimulatedLocation) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-extension ProjectDescription.RunActionOptions {
- public enum GPUFrameCaptureMode : Swift.String, Swift.Codable, Swift.Equatable {
- case autoEnabled
- case metal
- case openGL
- case disabled
- public static var `default`: ProjectDescription.RunActionOptions.GPUFrameCaptureMode {
- get
- }
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
-}
-public struct Scheme : Swift.Equatable, Swift.Codable {
- public let name: Swift.String
- public let shared: Swift.Bool
- public let hidden: Swift.Bool
- public let buildAction: ProjectDescription.BuildAction?
- public let testAction: ProjectDescription.TestAction?
- public let runAction: ProjectDescription.RunAction?
- public let archiveAction: ProjectDescription.ArchiveAction?
- public let profileAction: ProjectDescription.ProfileAction?
- public let analyzeAction: ProjectDescription.AnalyzeAction?
- public init(name: Swift.String, shared: Swift.Bool = true, hidden: Swift.Bool = false, buildAction: ProjectDescription.BuildAction? = nil, testAction: ProjectDescription.TestAction? = nil, runAction: ProjectDescription.RunAction? = nil, archiveAction: ProjectDescription.ArchiveAction? = nil, profileAction: ProjectDescription.ProfileAction? = nil, analyzeAction: ProjectDescription.AnalyzeAction? = nil)
- public static func == (a: ProjectDescription.Scheme, b: ProjectDescription.Scheme) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum SchemeDiagnosticsOption : Swift.String, Swift.Equatable, Swift.Codable {
- case mainThreadChecker
- case performanceAntipatternChecker
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public struct SchemeLanguage : Swift.Codable, Swift.Equatable, Swift.ExpressibleByStringLiteral {
- public let identifier: Swift.String
- public init(identifier: Swift.String)
- public init(stringLiteral: Swift.String)
- public static func == (a: ProjectDescription.SchemeLanguage, b: ProjectDescription.SchemeLanguage) -> Swift.Bool
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.SchemeLanguage {
- public static var doubleLengthPseudoLanguage: ProjectDescription.SchemeLanguage {
- get
- }
- public static var rightToLeftPseudoLanguage: ProjectDescription.SchemeLanguage {
- get
- }
- public static var accentedPseudoLanguage: ProjectDescription.SchemeLanguage {
- get
- }
- public static var boundedStringPseudoLanguage: ProjectDescription.SchemeLanguage {
- get
- }
- public static var rightToLeftWithStringsPseudoLanguage: ProjectDescription.SchemeLanguage {
- get
- }
-}
-public typealias SettingsDictionary = [Swift.String : ProjectDescription.SettingValue]
-public enum SettingValue : Swift.ExpressibleByStringInterpolation, Swift.ExpressibleByArrayLiteral, Swift.ExpressibleByBooleanLiteral, Swift.Equatable, Swift.Codable {
- case string(Swift.String)
- case array([Swift.String])
- public init(stringLiteral value: Swift.String)
- public init(arrayLiteral elements: Swift.String...)
- public typealias BooleanLiteralType = Swift.Bool
- public init(booleanLiteral value: Swift.Bool)
- public init(_ stringRawRepresentable: T) where T : Swift.RawRepresentable, T.RawValue == Swift.String
- public static func == (a: ProjectDescription.SettingValue, b: ProjectDescription.SettingValue) -> Swift.Bool
- public typealias ArrayLiteralElement = Swift.String
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Configuration : Swift.Equatable, Swift.Codable {
- public enum Variant : Swift.String, Swift.Codable {
- case debug
- case release
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public let name: ProjectDescription.ConfigurationName
- public let variant: ProjectDescription.Configuration.Variant
- public let settings: ProjectDescription.SettingsDictionary
- public let xcconfig: ProjectDescription.Path?
- public static func debug(name: ProjectDescription.ConfigurationName, settings: ProjectDescription.SettingsDictionary = [:], xcconfig: ProjectDescription.Path? = nil) -> ProjectDescription.Configuration
- public static func release(name: ProjectDescription.ConfigurationName, settings: ProjectDescription.SettingsDictionary = [:], xcconfig: ProjectDescription.Path? = nil) -> ProjectDescription.Configuration
- public static func == (a: ProjectDescription.Configuration, b: ProjectDescription.Configuration) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum DefaultSettings : Swift.Codable, Swift.Equatable {
- case recommended(excluding: Swift.Set = [])
- case essential(excluding: Swift.Set = [])
- case none
- public static func == (a: ProjectDescription.DefaultSettings, b: ProjectDescription.DefaultSettings) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.DefaultSettings {
- public static var recommended: ProjectDescription.DefaultSettings {
- get
- }
- public static var essential: ProjectDescription.DefaultSettings {
- get
- }
-}
-public struct Settings : Swift.Equatable, Swift.Codable {
- public let base: ProjectDescription.SettingsDictionary
- public let configurations: [ProjectDescription.Configuration]
- public let defaultSettings: ProjectDescription.DefaultSettings
- public static func settings(base: ProjectDescription.SettingsDictionary = [:], debug: ProjectDescription.SettingsDictionary = [:], release: ProjectDescription.SettingsDictionary = [:], defaultSettings: ProjectDescription.DefaultSettings = .recommended) -> ProjectDescription.Settings
- public static func settings(base: ProjectDescription.SettingsDictionary = [:], configurations: [ProjectDescription.Configuration], defaultSettings: ProjectDescription.DefaultSettings = .recommended) -> ProjectDescription.Settings
- public static func == (a: ProjectDescription.Settings, b: ProjectDescription.Settings) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension Swift.Dictionary where Key == Swift.String, Value == ProjectDescription.SettingValue {
- public mutating func merge(_ other: ProjectDescription.SettingsDictionary)
- public func merging(_ other: ProjectDescription.SettingsDictionary) -> ProjectDescription.SettingsDictionary
-}
-public enum SwiftCompilationMode : Swift.String {
- case singlefile
- case wholemodule
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public enum DebugInformationFormat : Swift.String {
- case dwarf
- case dwarfWithDsym
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public enum SwiftOptimizationLevel : Swift.String {
- case o
- case oNone
- case oSize
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-extension Swift.Dictionary where Key == Swift.String, Value == ProjectDescription.SettingValue {
- public func manualCodeSigning(identity: Swift.String? = nil, provisioningProfileSpecifier: Swift.String? = nil) -> ProjectDescription.SettingsDictionary
- public func automaticCodeSigning(devTeam: Swift.String) -> ProjectDescription.SettingsDictionary
- public func codeSignIdentityAppleDevelopment() -> ProjectDescription.SettingsDictionary
- public func codeSignIdentity(_ identity: Swift.String) -> ProjectDescription.SettingsDictionary
- public func currentProjectVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary
- public func marketingVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary
- public func appleGenericVersioningSystem() -> ProjectDescription.SettingsDictionary
- public func versionInfo(_ version: Swift.String, prefix: Swift.String? = nil, suffix: Swift.String? = nil) -> ProjectDescription.SettingsDictionary
- public func swiftVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary
- public func otherSwiftFlags(_ flags: Swift.String...) -> ProjectDescription.SettingsDictionary
- public func swiftActiveCompilationConditions(_ conditions: Swift.String...) -> ProjectDescription.SettingsDictionary
- public func swiftCompilationMode(_ mode: ProjectDescription.SwiftCompilationMode) -> ProjectDescription.SettingsDictionary
- public func swiftOptimizationLevel(_ level: ProjectDescription.SwiftOptimizationLevel) -> ProjectDescription.SettingsDictionary
- public func swiftOptimizeObjectLifetimes(_ enabled: Swift.Bool) -> ProjectDescription.SettingsDictionary
- public func swiftObjcBridingHeaderPath(_ path: Swift.String) -> ProjectDescription.SettingsDictionary
- public func otherCFlags(_ flags: [Swift.String]) -> ProjectDescription.SettingsDictionary
- public func otherLinkerFlags(_ flags: [Swift.String]) -> ProjectDescription.SettingsDictionary
- public func bitcodeEnabled(_ enabled: Swift.Bool) -> ProjectDescription.SettingsDictionary
- public func debugInformationFormat(_ format: ProjectDescription.DebugInformationFormat) -> ProjectDescription.SettingsDictionary
-}
-public struct SourceFileGlob : Swift.Codable, Swift.Equatable {
- public let glob: ProjectDescription.Path
- public let excluding: [ProjectDescription.Path]
- public let compilerFlags: Swift.String?
- public let codeGen: ProjectDescription.FileCodeGen?
- public static func glob(_ glob: ProjectDescription.Path, excluding: [ProjectDescription.Path] = [], compilerFlags: Swift.String? = nil, codeGen: ProjectDescription.FileCodeGen? = nil) -> ProjectDescription.SourceFileGlob
- public static func glob(_ glob: ProjectDescription.Path, excluding: ProjectDescription.Path?, compilerFlags: Swift.String? = nil, codeGen: ProjectDescription.FileCodeGen? = nil) -> ProjectDescription.SourceFileGlob
- public static func == (a: ProjectDescription.SourceFileGlob, b: ProjectDescription.SourceFileGlob) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.SourceFileGlob : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-public struct SourceFilesList : Swift.Codable, Swift.Equatable {
- public let globs: [ProjectDescription.SourceFileGlob]
- public init(globs: [ProjectDescription.SourceFileGlob])
- public init(globs: [Swift.String])
- public static func paths(_ paths: [ProjectDescription.Path]) -> ProjectDescription.SourceFilesList
- public static func == (a: ProjectDescription.SourceFilesList, b: ProjectDescription.SourceFilesList) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.SourceFilesList : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.SourceFilesList : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: ProjectDescription.SourceFileGlob...)
- public typealias ArrayLiteralElement = ProjectDescription.SourceFileGlob
-}
-public struct Target : Swift.Codable, Swift.Equatable {
- public let name: Swift.String
- public let platform: ProjectDescription.Platform
- public let product: ProjectDescription.Product
- public let productName: Swift.String?
- public let bundleId: Swift.String
- public let deploymentTarget: ProjectDescription.DeploymentTarget?
- public let infoPlist: ProjectDescription.InfoPlist?
- public let sources: ProjectDescription.SourceFilesList?
- public let resources: ProjectDescription.ResourceFileElements?
- public let copyFiles: [ProjectDescription.CopyFilesAction]?
- public let headers: ProjectDescription.Headers?
- public let entitlements: ProjectDescription.Path?
- public let scripts: [ProjectDescription.TargetScript]
- public let dependencies: [ProjectDescription.TargetDependency]
- public let settings: ProjectDescription.Settings?
- public let coreDataModels: [ProjectDescription.CoreDataModel]
- public let environment: [Swift.String : Swift.String]
- public let launchArguments: [ProjectDescription.LaunchArgument]
- public let additionalFiles: [ProjectDescription.FileElement]
- public init(name: Swift.String, platform: ProjectDescription.Platform, product: ProjectDescription.Product, productName: Swift.String? = nil, bundleId: Swift.String, deploymentTarget: ProjectDescription.DeploymentTarget? = nil, infoPlist: ProjectDescription.InfoPlist? = .default, sources: ProjectDescription.SourceFilesList? = nil, resources: ProjectDescription.ResourceFileElements? = nil, copyFiles: [ProjectDescription.CopyFilesAction]? = nil, headers: ProjectDescription.Headers? = nil, entitlements: ProjectDescription.Path? = nil, scripts: [ProjectDescription.TargetScript] = [], dependencies: [ProjectDescription.TargetDependency] = [], settings: ProjectDescription.Settings? = nil, coreDataModels: [ProjectDescription.CoreDataModel] = [], environment: [Swift.String : Swift.String] = [:], launchArguments: [ProjectDescription.LaunchArgument] = [], additionalFiles: [ProjectDescription.FileElement] = [])
- public static func == (a: ProjectDescription.Target, b: ProjectDescription.Target) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum SDKStatus : Swift.String, Swift.Codable, Swift.Hashable {
- case required
- case optional
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public enum SDKType : Swift.String, Swift.Codable, Swift.Hashable {
- case library
- case framework
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public enum TargetDependency : Swift.Codable, Swift.Hashable {
- case target(name: Swift.String)
- case project(target: Swift.String, path: ProjectDescription.Path)
- case framework(path: ProjectDescription.Path)
- case library(path: ProjectDescription.Path, publicHeaders: ProjectDescription.Path, swiftModuleMap: ProjectDescription.Path?)
- case package(product: Swift.String)
- case sdk(name: Swift.String, type: ProjectDescription.SDKType, status: ProjectDescription.SDKStatus)
- case xcframework(path: ProjectDescription.Path)
- case xctest
- case external(name: Swift.String)
- public static func sdk(name: Swift.String, type: ProjectDescription.SDKType) -> ProjectDescription.TargetDependency
- public var typeName: Swift.String {
- get
- }
- public func hash(into hasher: inout Swift.Hasher)
- public static func == (a: ProjectDescription.TargetDependency, b: ProjectDescription.TargetDependency) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public var hashValue: Swift.Int {
- get
- }
- public init(from decoder: Swift.Decoder) throws
-}
-public struct TargetReference : Swift.Hashable, Swift.Codable, Swift.ExpressibleByStringInterpolation {
- public var projectPath: ProjectDescription.Path?
- public var targetName: Swift.String
- public init(projectPath: ProjectDescription.Path?, target: Swift.String)
- public init(stringLiteral value: Swift.String)
- public static func project(path: ProjectDescription.Path, target: Swift.String) -> ProjectDescription.TargetReference
- public func hash(into hasher: inout Swift.Hasher)
- public static func == (a: ProjectDescription.TargetReference, b: ProjectDescription.TargetReference) -> Swift.Bool
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public var hashValue: Swift.Int {
- get
- }
- public init(from decoder: Swift.Decoder) throws
-}
-public struct TargetScript : Swift.Codable, Swift.Equatable {
- public enum Order : Swift.String, Swift.Codable, Swift.Equatable {
- case pre
- case post
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public enum Script : Swift.Equatable, Swift.Codable {
- case tool(path: Swift.String, args: [Swift.String])
- case scriptPath(path: ProjectDescription.Path, args: [Swift.String])
- case embedded(Swift.String)
- public static func == (a: ProjectDescription.TargetScript.Script, b: ProjectDescription.TargetScript.Script) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public let name: Swift.String
- public let script: ProjectDescription.TargetScript.Script
- public let order: ProjectDescription.TargetScript.Order
- public let inputPaths: [ProjectDescription.Path]
- public let inputFileListPaths: [ProjectDescription.Path]
- public let outputPaths: [ProjectDescription.Path]
- public let outputFileListPaths: [ProjectDescription.Path]
- public let basedOnDependencyAnalysis: Swift.Bool?
- public let runForInstallBuildsOnly: Swift.Bool
- public let shellPath: Swift.String
- public static func pre(path: ProjectDescription.Path, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func pre(path: ProjectDescription.Path, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func post(path: ProjectDescription.Path, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func post(path: ProjectDescription.Path, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func pre(tool: Swift.String, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func pre(tool: Swift.String, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func post(tool: Swift.String, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func post(tool: Swift.String, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func pre(script: Swift.String, name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func post(script: Swift.String, name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func == (a: ProjectDescription.TargetScript, b: ProjectDescription.TargetScript) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Template : Swift.Codable, Swift.Equatable {
- public let description: Swift.String
- public let attributes: [ProjectDescription.Template.Attribute]
- public let items: [ProjectDescription.Template.Item]
- public init(description: Swift.String, attributes: [ProjectDescription.Template.Attribute] = [], items: [ProjectDescription.Template.Item] = [])
- public enum Contents : Swift.Codable, Swift.Equatable {
- case string(Swift.String)
- case file(ProjectDescription.Path)
- case directory(ProjectDescription.Path)
- public static func == (a: ProjectDescription.Template.Contents, b: ProjectDescription.Template.Contents) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public struct Item : Swift.Codable, Swift.Equatable {
- public let path: Swift.String
- public let contents: ProjectDescription.Template.Contents
- public init(path: Swift.String, contents: ProjectDescription.Template.Contents)
- public static func == (a: ProjectDescription.Template.Item, b: ProjectDescription.Template.Item) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public enum Attribute : Swift.Codable, Swift.Equatable {
- case required(Swift.String)
- case optional(Swift.String, default: Swift.String)
- public static func == (a: ProjectDescription.Template.Attribute, b: ProjectDescription.Template.Attribute) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public static func == (a: ProjectDescription.Template, b: ProjectDescription.Template) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Template.Item {
- public static func string(path: Swift.String, contents: Swift.String) -> ProjectDescription.Template.Item
- public static func file(path: Swift.String, templatePath: ProjectDescription.Path) -> ProjectDescription.Template.Item
- public static func directory(path: Swift.String, sourcePath: ProjectDescription.Path) -> ProjectDescription.Template.Item
-}
-extension Swift.DefaultStringInterpolation {
- public mutating func appendInterpolation(_ value: ProjectDescription.Template.Attribute)
-}
-public struct TemplateString : Swift.Encodable, Swift.Decodable, Swift.Equatable {
- public static func == (a: ProjectDescription.TemplateString, b: ProjectDescription.TemplateString) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.TemplateString : Swift.ExpressibleByStringLiteral {
- public init(stringLiteral: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.TemplateString : Swift.CustomStringConvertible {
- public var description: Swift.String {
- get
- }
-}
-extension ProjectDescription.TemplateString : Swift.ExpressibleByStringInterpolation {
- public init(stringInterpolation: ProjectDescription.TemplateString.StringInterpolation)
- public struct StringInterpolation : Swift.StringInterpolationProtocol {
- public init(literalCapacity _: Swift.Int, interpolationCount _: Swift.Int)
- public mutating func appendLiteral(_ literal: Swift.String)
- public mutating func appendInterpolation(_ token: ProjectDescription.TemplateString.Token)
- public typealias StringLiteralType = Swift.String
- }
-}
-extension ProjectDescription.TemplateString {
- public enum Token : Swift.String, Swift.Equatable {
- case projectName
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
-}
-public struct TestAction : Swift.Equatable, Swift.Codable {
- public let testPlans: [ProjectDescription.Path]?
- public let targets: [ProjectDescription.TestableTarget]
- public let arguments: ProjectDescription.Arguments?
- public let configuration: ProjectDescription.ConfigurationName
- public let attachDebugger: Swift.Bool
- public let expandVariableFromTarget: ProjectDescription.TargetReference?
- public let preActions: [ProjectDescription.ExecutionAction]
- public let postActions: [ProjectDescription.ExecutionAction]
- public let options: ProjectDescription.TestActionOptions
- public let diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption]
- public static func targets(_ targets: [ProjectDescription.TestableTarget], arguments: ProjectDescription.Arguments? = nil, configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, expandVariableFromTarget: ProjectDescription.TargetReference? = nil, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], options: ProjectDescription.TestActionOptions = .options(), diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] = [.mainThreadChecker]) -> ProjectDescription.TestAction
- public static func testPlans(_ testPlans: [ProjectDescription.Path], configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = []) -> ProjectDescription.TestAction
- public static func == (a: ProjectDescription.TestAction, b: ProjectDescription.TestAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct TestActionOptions : Swift.Equatable, Swift.Codable {
- public let language: ProjectDescription.SchemeLanguage?
- public let region: Swift.String?
- public let coverage: Swift.Bool
- public let codeCoverageTargets: [ProjectDescription.TargetReference]
- public static func options(language: ProjectDescription.SchemeLanguage? = nil, region: Swift.String? = nil, coverage: Swift.Bool = false, codeCoverageTargets: [ProjectDescription.TargetReference] = []) -> ProjectDescription.TestActionOptions
- public static func == (a: ProjectDescription.TestActionOptions, b: ProjectDescription.TestActionOptions) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct TestableTarget : Swift.Equatable, Swift.Codable, Swift.ExpressibleByStringInterpolation {
- public let target: ProjectDescription.TargetReference
- public let isSkipped: Swift.Bool
- public let isParallelizable: Swift.Bool
- public let isRandomExecutionOrdering: Swift.Bool
- public init(target: ProjectDescription.TargetReference, skipped: Swift.Bool = false, parallelizable: Swift.Bool = false, randomExecutionOrdering: Swift.Bool = false)
- public init(stringLiteral value: Swift.String)
- public static func == (a: ProjectDescription.TestableTarget, b: ProjectDescription.TestableTarget) -> Swift.Bool
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct TestingOptions : Swift.OptionSet, Swift.Codable, Swift.Equatable {
- public let rawValue: Swift.Int
- public init(rawValue: Swift.Int)
- public static let parallelizable: ProjectDescription.TestingOptions
- public static let randomExecutionOrdering: ProjectDescription.TestingOptions
- public typealias ArrayLiteralElement = ProjectDescription.TestingOptions
- public typealias Element = ProjectDescription.TestingOptions
- public typealias RawValue = Swift.Int
-}
-public struct Version : Swift.Hashable, Swift.Codable {
- public let major: Swift.Int
- public let minor: Swift.Int
- public let patch: Swift.Int
- public let prereleaseIdentifiers: [Swift.String]
- public let buildMetadataIdentifiers: [Swift.String]
- public init(_ major: Swift.Int, _ minor: Swift.Int, _ patch: Swift.Int, prereleaseIdentifiers: [Swift.String] = [], buildMetadataIdentifiers: [Swift.String] = [])
- public static func == (a: ProjectDescription.Version, b: ProjectDescription.Version) -> Swift.Bool
- public func hash(into hasher: inout Swift.Hasher)
- public func encode(to encoder: Swift.Encoder) throws
- public var hashValue: Swift.Int {
- get
- }
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Version : Swift.Comparable {
- public static func < (lhs: ProjectDescription.Version, rhs: ProjectDescription.Version) -> Swift.Bool
-}
-extension ProjectDescription.Version : Swift.CustomStringConvertible {
- public var description: Swift.String {
- get
- }
-}
-extension ProjectDescription.Version {
- public init?(string: Swift.String)
-}
-extension ProjectDescription.Version : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension Swift.ClosedRange where Bound == ProjectDescription.Version {
- public func contains(_: ProjectDescription.Version) -> Swift.Bool
-}
-extension Swift.Range where Bound == ProjectDescription.Version {
- public func contains(_: ProjectDescription.Version) -> Swift.Bool
-}
-extension Swift.Range where Bound == ProjectDescription.Version {
- public func contains(version: ProjectDescription.Version) -> Swift.Bool
-}
-public struct Workspace : Swift.Codable, Swift.Equatable {
- public let name: Swift.String
- public let projects: [ProjectDescription.Path]
- public let schemes: [ProjectDescription.Scheme]
- public let fileHeaderTemplate: ProjectDescription.FileHeaderTemplate?
- public let additionalFiles: [ProjectDescription.FileElement]
- public let generationOptions: ProjectDescription.Workspace.GenerationOptions
- public init(name: Swift.String, projects: [ProjectDescription.Path], schemes: [ProjectDescription.Scheme] = [], fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? = nil, additionalFiles: [ProjectDescription.FileElement] = [], generationOptions: ProjectDescription.Workspace.GenerationOptions = .options())
- public static func == (a: ProjectDescription.Workspace, b: ProjectDescription.Workspace) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Workspace {
- public struct GenerationOptions : Swift.Codable, Swift.Equatable {
- public enum AutogeneratedWorkspaceSchemes : Swift.Codable, Swift.Equatable {
- public enum CodeCoverageMode : Swift.Codable, Swift.Equatable {
- case all
- case relevant
- case targets([ProjectDescription.TargetReference])
- case disabled
- public static func == (a: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode, b: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- case disabled
- case enabled(codeCoverageMode: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode = .disabled, testingOptions: ProjectDescription.TestingOptions = [])
- public static func == (a: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes, b: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public let enableAutomaticXcodeSchemes: Swift.Bool?
- public let autogeneratedWorkspaceSchemes: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes
- public let lastXcodeUpgradeCheck: ProjectDescription.Version?
- public let renderMarkdownReadme: Swift.Bool
- public static func options(enableAutomaticXcodeSchemes: Swift.Bool? = false, autogeneratedWorkspaceSchemes: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes = .enabled(), lastXcodeUpgradeCheck: ProjectDescription.Version? = nil, renderMarkdownReadme: Swift.Bool = false) -> ProjectDescription.Workspace.GenerationOptions
- public static func == (a: ProjectDescription.Workspace.GenerationOptions, b: ProjectDescription.Workspace.GenerationOptions) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-extension ProjectDescription.Cloud.Option : Swift.Hashable {}
-extension ProjectDescription.Cloud.Option : Swift.RawRepresentable {}
-extension ProjectDescription.CopyFilesAction.Destination : Swift.Hashable {}
-extension ProjectDescription.CopyFilesAction.Destination : Swift.RawRepresentable {}
-extension ProjectDescription.FileCodeGen : Swift.Hashable {}
-extension ProjectDescription.FileCodeGen : Swift.RawRepresentable {}
-extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.Equatable {}
-extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.Hashable {}
-extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.RawRepresentable {}
-extension ProjectDescription.Path.PathType : Swift.Equatable {}
-extension ProjectDescription.Path.PathType : Swift.Hashable {}
-extension ProjectDescription.Path.PathType : Swift.RawRepresentable {}
-extension ProjectDescription.Platform : Swift.Hashable {}
-extension ProjectDescription.Platform : Swift.RawRepresentable {}
-extension ProjectDescription.Product : Swift.Hashable {}
-extension ProjectDescription.Product : Swift.RawRepresentable {}
-extension ProjectDescription.ResourceSynthesizer.Parser : Swift.Equatable {}
-extension ProjectDescription.ResourceSynthesizer.Parser : Swift.Hashable {}
-extension ProjectDescription.ResourceSynthesizer.Parser : Swift.RawRepresentable {}
-extension ProjectDescription.RunActionOptions.GPUFrameCaptureMode : Swift.Hashable {}
-extension ProjectDescription.RunActionOptions.GPUFrameCaptureMode : Swift.RawRepresentable {}
-extension ProjectDescription.SchemeDiagnosticsOption : Swift.Hashable {}
-extension ProjectDescription.SchemeDiagnosticsOption : Swift.RawRepresentable {}
-extension ProjectDescription.Configuration.Variant : Swift.Equatable {}
-extension ProjectDescription.Configuration.Variant : Swift.Hashable {}
-extension ProjectDescription.Configuration.Variant : Swift.RawRepresentable {}
-extension ProjectDescription.SwiftCompilationMode : Swift.Equatable {}
-extension ProjectDescription.SwiftCompilationMode : Swift.Hashable {}
-extension ProjectDescription.SwiftCompilationMode : Swift.RawRepresentable {}
-extension ProjectDescription.DebugInformationFormat : Swift.Equatable {}
-extension ProjectDescription.DebugInformationFormat : Swift.Hashable {}
-extension ProjectDescription.DebugInformationFormat : Swift.RawRepresentable {}
-extension ProjectDescription.SwiftOptimizationLevel : Swift.Equatable {}
-extension ProjectDescription.SwiftOptimizationLevel : Swift.Hashable {}
-extension ProjectDescription.SwiftOptimizationLevel : Swift.RawRepresentable {}
-extension ProjectDescription.SDKStatus : Swift.RawRepresentable {}
-extension ProjectDescription.SDKType : Swift.RawRepresentable {}
-extension ProjectDescription.TargetScript.Order : Swift.Hashable {}
-extension ProjectDescription.TargetScript.Order : Swift.RawRepresentable {}
-extension ProjectDescription.TemplateString.Token : Swift.Hashable {}
-extension ProjectDescription.TemplateString.Token : Swift.RawRepresentable {}
diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64-apple-macos.swiftmodule b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64-apple-macos.swiftmodule
deleted file mode 100644
index b26ec9477..000000000
Binary files a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64-apple-macos.swiftmodule and /dev/null differ
diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64.swiftdoc b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64.swiftdoc
deleted file mode 100644
index afc20046e..000000000
Binary files a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64.swiftdoc and /dev/null differ
diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64.swiftinterface b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64.swiftinterface
deleted file mode 100644
index 99e7d8a4b..000000000
--- a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64.swiftinterface
+++ /dev/null
@@ -1,1418 +0,0 @@
-// swift-interface-format-version: 1.0
-// swift-compiler-version: Apple Swift version 5.5.1 (swiftlang-1300.0.31.4 clang-1300.0.29.6)
-// swift-module-flags: -target arm64-apple-macos11.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -module-name ProjectDescription
-import Foundation
-import Swift
-import _Concurrency
-public struct AnalyzeAction : Swift.Equatable, Swift.Codable {
- public let configuration: ProjectDescription.ConfigurationName
- public static func analyzeAction(configuration: ProjectDescription.ConfigurationName) -> ProjectDescription.AnalyzeAction
- public static func == (a: ProjectDescription.AnalyzeAction, b: ProjectDescription.AnalyzeAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct ArchiveAction : Swift.Equatable, Swift.Codable {
- public let configuration: ProjectDescription.ConfigurationName
- public let revealArchiveInOrganizer: Swift.Bool
- public let customArchiveName: Swift.String?
- public let preActions: [ProjectDescription.ExecutionAction]
- public let postActions: [ProjectDescription.ExecutionAction]
- public static func archiveAction(configuration: ProjectDescription.ConfigurationName, revealArchiveInOrganizer: Swift.Bool = true, customArchiveName: Swift.String? = nil, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = []) -> ProjectDescription.ArchiveAction
- public static func == (a: ProjectDescription.ArchiveAction, b: ProjectDescription.ArchiveAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Arguments : Swift.Equatable, Swift.Codable {
- public let environment: [Swift.String : Swift.String]
- public let launchArguments: [ProjectDescription.LaunchArgument]
- public init(environment: [Swift.String : Swift.String] = [:], launchArguments: [ProjectDescription.LaunchArgument] = [])
- public static func == (a: ProjectDescription.Arguments, b: ProjectDescription.Arguments) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct BuildAction : Swift.Equatable, Swift.Codable {
- public let targets: [ProjectDescription.TargetReference]
- public let preActions: [ProjectDescription.ExecutionAction]
- public let postActions: [ProjectDescription.ExecutionAction]
- public let runPostActionsOnFailure: Swift.Bool
- public init(targets: [ProjectDescription.TargetReference], preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], runPostActionsOnFailure: Swift.Bool = false)
- public static func buildAction(targets: [ProjectDescription.TargetReference], preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], runPostActionsOnFailure: Swift.Bool = false) -> ProjectDescription.BuildAction
- public static func == (a: ProjectDescription.BuildAction, b: ProjectDescription.BuildAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Cache : Swift.Codable, Swift.Equatable {
- public struct Profile : Swift.Codable, Swift.Equatable {
- public let name: Swift.String
- public let configuration: Swift.String
- public let device: Swift.String?
- public let os: Swift.String?
- public static func profile(name: Swift.String, configuration: Swift.String, device: Swift.String? = nil, os: Swift.String? = nil) -> ProjectDescription.Cache.Profile
- public static func == (a: ProjectDescription.Cache.Profile, b: ProjectDescription.Cache.Profile) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public let profiles: [ProjectDescription.Cache.Profile]
- public let path: ProjectDescription.Path?
- public static func cache(profiles: [ProjectDescription.Cache.Profile] = [], path: ProjectDescription.Path? = nil) -> ProjectDescription.Cache
- public static func == (a: ProjectDescription.Cache, b: ProjectDescription.Cache) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Cloud : Swift.Codable, Swift.Equatable {
- public enum Option : Swift.String, Swift.Codable, Swift.Equatable {
- case analytics
- case optional
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public let url: Swift.String
- public let projectId: Swift.String
- public let options: [ProjectDescription.Cloud.Option]
- public static func cloud(projectId: Swift.String, url: Swift.String, options: [ProjectDescription.Cloud.Option] = []) -> ProjectDescription.Cloud
- public static func == (a: ProjectDescription.Cloud, b: ProjectDescription.Cloud) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum CompatibleXcodeVersions : Swift.ExpressibleByArrayLiteral, Swift.ExpressibleByStringInterpolation, Swift.Codable, Swift.Equatable {
- case all
- case exact(ProjectDescription.Version)
- case upToNextMajor(ProjectDescription.Version)
- case upToNextMinor(ProjectDescription.Version)
- case list([ProjectDescription.CompatibleXcodeVersions])
- public init(arrayLiteral elements: [ProjectDescription.CompatibleXcodeVersions])
- public init(arrayLiteral elements: ProjectDescription.CompatibleXcodeVersions...)
- public init(stringLiteral value: Swift.String)
- public static func == (a: ProjectDescription.CompatibleXcodeVersions, b: ProjectDescription.CompatibleXcodeVersions) -> Swift.Bool
- public typealias ArrayLiteralElement = ProjectDescription.CompatibleXcodeVersions
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Config : Swift.Codable, Swift.Equatable {
- public let generationOptions: ProjectDescription.Config.GenerationOptions
- public let compatibleXcodeVersions: ProjectDescription.CompatibleXcodeVersions
- public let plugins: [ProjectDescription.PluginLocation]
- public let cloud: ProjectDescription.Cloud?
- public let cache: ProjectDescription.Cache?
- public let swiftVersion: ProjectDescription.Version?
- public init(compatibleXcodeVersions: ProjectDescription.CompatibleXcodeVersions = .all, cloud: ProjectDescription.Cloud? = nil, cache: ProjectDescription.Cache? = nil, swiftVersion: ProjectDescription.Version? = nil, plugins: [ProjectDescription.PluginLocation] = [], generationOptions: ProjectDescription.Config.GenerationOptions = .options())
- public static func == (a: ProjectDescription.Config, b: ProjectDescription.Config) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Config {
- public struct GenerationOptions : Swift.Codable, Swift.Equatable {
- public let resolveDependenciesWithSystemScm: Swift.Bool
- public let disablePackageVersionLocking: Swift.Bool
- public static func options(resolveDependenciesWithSystemScm: Swift.Bool = false, disablePackageVersionLocking: Swift.Bool = false) -> ProjectDescription.Config.GenerationOptions
- public static func == (a: ProjectDescription.Config.GenerationOptions, b: ProjectDescription.Config.GenerationOptions) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-public struct ConfigurationName : Swift.ExpressibleByStringLiteral, Swift.Codable, Swift.Equatable {
- public let rawValue: Swift.String
- public init(stringLiteral value: Swift.StringLiteralType)
- public static func configuration(_ name: Swift.String) -> ProjectDescription.ConfigurationName
- public static var debug: ProjectDescription.ConfigurationName {
- get
- }
- public static var release: ProjectDescription.ConfigurationName {
- get
- }
- public static func == (a: ProjectDescription.ConfigurationName, b: ProjectDescription.ConfigurationName) -> Swift.Bool
- public typealias ExtendedGraphemeClusterLiteralType = Swift.StringLiteralType
- public typealias StringLiteralType = Swift.StringLiteralType
- public typealias UnicodeScalarLiteralType = Swift.StringLiteralType
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct CopyFilesAction : Swift.Codable, Swift.Equatable {
- public var name: Swift.String
- public var destination: ProjectDescription.CopyFilesAction.Destination
- public var subpath: Swift.String?
- public var files: [ProjectDescription.FileElement]
- public enum Destination : Swift.String, Swift.Codable, Swift.Equatable {
- case absolutePath
- case productsDirectory
- case wrapper
- case executables
- case resources
- case javaResources
- case frameworks
- case sharedFrameworks
- case sharedSupport
- case plugins
- case other
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public static func productsDirectory(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func wrapper(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func executables(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func resources(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func javaResources(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func frameworks(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func sharedFrameworks(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func sharedSupport(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func plugins(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func == (a: ProjectDescription.CopyFilesAction, b: ProjectDescription.CopyFilesAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct CoreDataModel : Swift.Codable, Swift.Equatable {
- public let path: ProjectDescription.Path
- public let currentVersion: Swift.String?
- public init(_ path: ProjectDescription.Path, currentVersion: Swift.String? = nil)
- public static func == (a: ProjectDescription.CoreDataModel, b: ProjectDescription.CoreDataModel) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct CarthageDependencies : Swift.Codable, Swift.Equatable {
- public let dependencies: [ProjectDescription.CarthageDependencies.Dependency]
- public init(_ dependencies: [ProjectDescription.CarthageDependencies.Dependency])
- public static func == (a: ProjectDescription.CarthageDependencies, b: ProjectDescription.CarthageDependencies) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.CarthageDependencies : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: ProjectDescription.CarthageDependencies.Dependency...)
- public typealias ArrayLiteralElement = ProjectDescription.CarthageDependencies.Dependency
-}
-extension ProjectDescription.CarthageDependencies {
- public enum Dependency : Swift.Codable, Swift.Equatable {
- case github(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement)
- case git(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement)
- case binary(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement)
- public static func == (a: ProjectDescription.CarthageDependencies.Dependency, b: ProjectDescription.CarthageDependencies.Dependency) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public enum Requirement : Swift.Codable, Swift.Equatable {
- case exact(ProjectDescription.Version)
- case upToNext(ProjectDescription.Version)
- case atLeast(ProjectDescription.Version)
- case branch(Swift.String)
- case revision(Swift.String)
- public static func == (a: ProjectDescription.CarthageDependencies.Requirement, b: ProjectDescription.CarthageDependencies.Requirement) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-public struct Dependencies : Swift.Codable, Swift.Equatable {
- public let carthage: ProjectDescription.CarthageDependencies?
- public let swiftPackageManager: ProjectDescription.SwiftPackageManagerDependencies?
- public let platforms: Swift.Set
- public init(carthage: ProjectDescription.CarthageDependencies? = nil, swiftPackageManager: ProjectDescription.SwiftPackageManagerDependencies? = nil, platforms: Swift.Set = Set(Platform.allCases))
- public static func == (a: ProjectDescription.Dependencies, b: ProjectDescription.Dependencies) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct SwiftPackageManagerDependencies : Swift.Codable, Swift.Equatable {
- public let packages: [ProjectDescription.Package]
- public let productTypes: [Swift.String : ProjectDescription.Product]
- public let baseSettings: ProjectDescription.Settings
- public let targetSettings: [Swift.String : ProjectDescription.SettingsDictionary]
- public let projectOptions: [Swift.String : ProjectDescription.Project.Options]
- public init(_ packages: [ProjectDescription.Package], productTypes: [Swift.String : ProjectDescription.Product] = [:], baseSettings: ProjectDescription.Settings = .settings(), targetSettings: [Swift.String : ProjectDescription.SettingsDictionary] = [:], projectOptions: [Swift.String : ProjectDescription.Project.Options] = [:])
- public static func == (a: ProjectDescription.SwiftPackageManagerDependencies, b: ProjectDescription.SwiftPackageManagerDependencies) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.SwiftPackageManagerDependencies : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: ProjectDescription.Package...)
- public typealias ArrayLiteralElement = ProjectDescription.Package
-}
-public struct DeploymentDevice : Swift.OptionSet, Swift.Codable, Swift.Hashable {
- public static let iphone: ProjectDescription.DeploymentDevice
- public static let ipad: ProjectDescription.DeploymentDevice
- public static let mac: ProjectDescription.DeploymentDevice
- public let rawValue: Swift.UInt
- public init(rawValue: Swift.UInt)
- public typealias ArrayLiteralElement = ProjectDescription.DeploymentDevice
- public typealias Element = ProjectDescription.DeploymentDevice
- public typealias RawValue = Swift.UInt
-}
-public enum DeploymentTarget : Swift.Codable, Swift.Hashable {
- case iOS(targetVersion: Swift.String, devices: ProjectDescription.DeploymentDevice)
- case macOS(targetVersion: Swift.String)
- case watchOS(targetVersion: Swift.String)
- case tvOS(targetVersion: Swift.String)
- public var targetVersion: Swift.String {
- get
- }
- public func hash(into hasher: inout Swift.Hasher)
- public static func == (a: ProjectDescription.DeploymentTarget, b: ProjectDescription.DeploymentTarget) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public var hashValue: Swift.Int {
- get
- }
- public init(from decoder: Swift.Decoder) throws
-}
-@dynamicMemberLookup public enum Environment {
- public enum Value : Swift.Equatable {
- case boolean(Swift.Bool)
- case string(Swift.String)
- public static func == (a: ProjectDescription.Environment.Value, b: ProjectDescription.Environment.Value) -> Swift.Bool
- }
- public static subscript(dynamicMember member: Swift.String) -> ProjectDescription.Environment.Value? {
- get
- }
-}
-extension Swift.Optional where Wrapped == ProjectDescription.Environment.Value {
- public func getString(default defaultString: Swift.String) -> Swift.String
- public func getBoolean(default defaultBoolean: Swift.Bool) -> Swift.Bool
-}
-public struct ExecutionAction : Swift.Equatable, Swift.Codable {
- public let title: Swift.String
- public let scriptText: Swift.String
- public let target: ProjectDescription.TargetReference?
- public init(title: Swift.String = "Run Script", scriptText: Swift.String, target: ProjectDescription.TargetReference? = nil)
- public static func == (a: ProjectDescription.ExecutionAction, b: ProjectDescription.ExecutionAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum FileCodeGen : Swift.String, Swift.Codable, Swift.Equatable {
- case `public`
- case `private`
- case project
- case disabled
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public enum FileElement : Swift.Codable, Swift.Equatable {
- case glob(pattern: ProjectDescription.Path)
- case folderReference(path: ProjectDescription.Path)
- public static func == (a: ProjectDescription.FileElement, b: ProjectDescription.FileElement) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.FileElement : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension Swift.Array : Swift.ExpressibleByUnicodeScalarLiteral where Element == ProjectDescription.FileElement {
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension Swift.Array : Swift.ExpressibleByExtendedGraphemeClusterLiteral where Element == ProjectDescription.FileElement {
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
-}
-extension Swift.Array : Swift.ExpressibleByStringLiteral where Element == ProjectDescription.FileElement {
- public typealias StringLiteralType = Swift.String
- public init(stringLiteral value: Swift.String)
-}
-public enum FileHeaderTemplate : Swift.Codable, Swift.Equatable, Swift.ExpressibleByStringInterpolation {
- case file(ProjectDescription.Path)
- case string(Swift.String)
- public init(stringLiteral value: Swift.String)
- public static func == (a: ProjectDescription.FileHeaderTemplate, b: ProjectDescription.FileHeaderTemplate) -> Swift.Bool
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct FileList : Swift.Codable, Swift.Equatable {
- public let globs: [ProjectDescription.FileListGlob]
- public static func list(_ globs: [ProjectDescription.FileListGlob]) -> ProjectDescription.FileList
- public static func == (a: ProjectDescription.FileList, b: ProjectDescription.FileList) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.FileList : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.FileList : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: Swift.String...)
- public typealias ArrayLiteralElement = Swift.String
-}
-public struct FileListGlob : Swift.Codable, Swift.Equatable {
- public var glob: ProjectDescription.Path
- public var excluding: [ProjectDescription.Path]
- public static func glob(_ glob: ProjectDescription.Path, excluding: [ProjectDescription.Path] = []) -> ProjectDescription.FileListGlob
- public static func glob(_ glob: ProjectDescription.Path, excluding: ProjectDescription.Path?) -> ProjectDescription.FileListGlob
- public static func == (a: ProjectDescription.FileListGlob, b: ProjectDescription.FileListGlob) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.FileListGlob : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-public struct Headers : Swift.Codable, Swift.Equatable {
- public enum AutomaticExclusionRule : Swift.Int, Swift.Codable {
- case projectExcludesPrivateAndPublic
- case publicExcludesPrivateAndProject
- public init?(rawValue: Swift.Int)
- public typealias RawValue = Swift.Int
- public var rawValue: Swift.Int {
- get
- }
- }
- public let umbrellaHeader: ProjectDescription.Path?
- public let `public`: ProjectDescription.FileList?
- public let `private`: ProjectDescription.FileList?
- public let project: ProjectDescription.FileList?
- public let exclusionRule: ProjectDescription.Headers.AutomaticExclusionRule
- public static func headers(public: ProjectDescription.FileList? = nil, private: ProjectDescription.FileList? = nil, project: ProjectDescription.FileList? = nil, exclusionRule: ProjectDescription.Headers.AutomaticExclusionRule = .projectExcludesPrivateAndPublic) -> ProjectDescription.Headers
- public static func allHeaders(from list: ProjectDescription.FileList, umbrella: ProjectDescription.Path, private privateHeaders: ProjectDescription.FileList? = nil) -> ProjectDescription.Headers
- public static func onlyHeaders(from list: ProjectDescription.FileList, umbrella: ProjectDescription.Path, private privateHeaders: ProjectDescription.FileList? = nil) -> ProjectDescription.Headers
- public static func == (a: ProjectDescription.Headers, b: ProjectDescription.Headers) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum InfoPlist : Swift.Codable, Swift.Equatable {
- indirect public enum Value : Swift.Codable, Swift.Equatable {
- case string(Swift.String)
- case integer(Swift.Int)
- case real(Swift.Double)
- case boolean(Swift.Bool)
- case dictionary([Swift.String : ProjectDescription.InfoPlist.Value])
- case array([ProjectDescription.InfoPlist.Value])
- public static func == (a: ProjectDescription.InfoPlist.Value, b: ProjectDescription.InfoPlist.Value) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- case file(path: ProjectDescription.Path)
- case dictionary([Swift.String : ProjectDescription.InfoPlist.Value])
- case extendingDefault(with: [Swift.String : ProjectDescription.InfoPlist.Value])
- public static var `default`: ProjectDescription.InfoPlist {
- get
- }
- public enum CodingError : Swift.Error {
- case invalidType(Swift.String)
- }
- public var path: ProjectDescription.Path? {
- get
- }
- public static func == (a: ProjectDescription.InfoPlist, b: ProjectDescription.InfoPlist) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.InfoPlist : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByIntegerLiteral {
- public init(integerLiteral value: Swift.Int)
- public typealias IntegerLiteralType = Swift.Int
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByFloatLiteral {
- public init(floatLiteral value: Swift.Double)
- public typealias FloatLiteralType = Swift.Double
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByBooleanLiteral {
- public init(booleanLiteral value: Swift.Bool)
- public typealias BooleanLiteralType = Swift.Bool
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByDictionaryLiteral {
- public init(dictionaryLiteral elements: (Swift.String, ProjectDescription.InfoPlist.Value)...)
- public typealias Key = Swift.String
- public typealias Value = ProjectDescription.InfoPlist.Value
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: ProjectDescription.InfoPlist.Value...)
- public typealias ArrayLiteralElement = ProjectDescription.InfoPlist.Value
-}
-public struct LaunchArgument : Swift.Equatable, Swift.Codable {
- public let name: Swift.String
- public let isEnabled: Swift.Bool
- public init(name: Swift.String, isEnabled: Swift.Bool)
- public static func == (a: ProjectDescription.LaunchArgument, b: ProjectDescription.LaunchArgument) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum Package : Swift.Equatable, Swift.Codable {
- case remote(url: Swift.String, requirement: ProjectDescription.Package.Requirement)
- case local(path: ProjectDescription.Path)
- public static func == (a: ProjectDescription.Package, b: ProjectDescription.Package) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Package {
- public enum Requirement : Swift.Codable, Swift.Equatable {
- case upToNextMajor(from: ProjectDescription.Version)
- case upToNextMinor(from: ProjectDescription.Version)
- case range(from: ProjectDescription.Version, to: ProjectDescription.Version)
- case exact(ProjectDescription.Version)
- case branch(Swift.String)
- case revision(Swift.String)
- public static func == (a: ProjectDescription.Package.Requirement, b: ProjectDescription.Package.Requirement) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-extension ProjectDescription.Package {
- public static func package(url: Swift.String, from version: ProjectDescription.Version) -> ProjectDescription.Package
- public static func package(url: Swift.String, _ requirement: ProjectDescription.Package.Requirement) -> ProjectDescription.Package
- public static func package(url: Swift.String, _ range: Swift.Range) -> ProjectDescription.Package
- public static func package(url: Swift.String, _ range: Swift.ClosedRange) -> ProjectDescription.Package
- public static func package(path: ProjectDescription.Path) -> ProjectDescription.Package
-}
-extension ProjectDescription.Package {
- @available(*, unavailable, message: "use package(url:_:) with the .exact(Version) initializer instead")
- public static func package(url _: Swift.String, version _: ProjectDescription.Version) -> ProjectDescription.Package
- @available(*, unavailable, message: "use package(url:_:) with the .branch(String) initializer instead")
- public static func package(url _: Swift.String, branch _: Swift.String) -> ProjectDescription.Package
- @available(*, unavailable, message: "use package(url:_:) with the .revision(String) initializer instead")
- public static func package(url _: Swift.String, revision _: Swift.String) -> ProjectDescription.Package
- @available(*, unavailable, message: "use package(url:_:) without the range label instead")
- public static func package(url _: Swift.String, range _: Swift.Range) -> ProjectDescription.Package
-}
-public struct Path : Swift.ExpressibleByStringInterpolation, Swift.Codable, Swift.Hashable {
- public enum PathType : Swift.String, Swift.Codable {
- case relativeToCurrentFile
- case relativeToManifest
- case relativeToRoot
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public let type: ProjectDescription.Path.PathType
- public let pathString: Swift.String
- public let callerPath: Swift.String?
- public init(_ path: Swift.String)
- public static func relativeToCurrentFile(_ pathString: Swift.String, callerPath: Swift.StaticString = #file) -> ProjectDescription.Path
- public static func relativeToManifest(_ pathString: Swift.String) -> ProjectDescription.Path
- public static func relativeToRoot(_ pathString: Swift.String) -> ProjectDescription.Path
- public init(stringLiteral: Swift.String)
- public static func == (a: ProjectDescription.Path, b: ProjectDescription.Path) -> Swift.Bool
- public func hash(into hasher: inout Swift.Hasher)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public var hashValue: Swift.Int {
- get
- }
- public init(from decoder: Swift.Decoder) throws
-}
-public enum Platform : Swift.String, Swift.Codable, Swift.Equatable, Swift.CaseIterable {
- case iOS
- case macOS
- case watchOS
- case tvOS
- public init?(rawValue: Swift.String)
- public typealias AllCases = [ProjectDescription.Platform]
- public typealias RawValue = Swift.String
- public static var allCases: [ProjectDescription.Platform] {
- get
- }
- public var rawValue: Swift.String {
- get
- }
-}
-public struct Plugin : Swift.Codable, Swift.Equatable {
- public let name: Swift.String
- public init(name: Swift.String)
- public static func == (a: ProjectDescription.Plugin, b: ProjectDescription.Plugin) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct PluginLocation : Swift.Codable, Swift.Equatable {
- public let type: ProjectDescription.PluginLocation.LocationType
- public static func local(path: ProjectDescription.Path) -> ProjectDescription.PluginLocation
- public static func git(url: Swift.String, tag: Swift.String, directory: Swift.String? = nil) -> ProjectDescription.PluginLocation
- public static func git(url: Swift.String, sha: Swift.String, directory: Swift.String? = nil) -> ProjectDescription.PluginLocation
- public static func == (a: ProjectDescription.PluginLocation, b: ProjectDescription.PluginLocation) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.PluginLocation {
- public enum LocationType : Swift.Codable, Swift.Equatable {
- case local(path: ProjectDescription.Path)
- case gitWithTag(url: Swift.String, tag: Swift.String, directory: Swift.String?)
- case gitWithSha(url: Swift.String, sha: Swift.String, directory: Swift.String?)
- public static func == (a: ProjectDescription.PluginLocation.LocationType, b: ProjectDescription.PluginLocation.LocationType) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-public enum Product : Swift.String, Swift.Codable, Swift.Equatable {
- case app
- case staticLibrary
- case dynamicLibrary
- case framework
- case staticFramework
- case unitTests
- case uiTests
- case bundle
- case commandLineTool
- case appClip
- case appExtension
- case watch2App
- case watch2Extension
- case tvTopShelfExtension
- case messagesExtension
- case stickerPackExtension
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public struct ProfileAction : Swift.Equatable, Swift.Codable {
- public let configuration: ProjectDescription.ConfigurationName
- public let preActions: [ProjectDescription.ExecutionAction]
- public let postActions: [ProjectDescription.ExecutionAction]
- public let executable: ProjectDescription.TargetReference?
- public let arguments: ProjectDescription.Arguments?
- public static func profileAction(configuration: ProjectDescription.ConfigurationName = .release, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], executable: ProjectDescription.TargetReference? = nil, arguments: ProjectDescription.Arguments? = nil) -> ProjectDescription.ProfileAction
- public static func == (a: ProjectDescription.ProfileAction, b: ProjectDescription.ProfileAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Project : Swift.Codable, Swift.Equatable {
- public let name: Swift.String
- public let organizationName: Swift.String?
- public let options: ProjectDescription.Project.Options
- public let packages: [ProjectDescription.Package]
- public let targets: [ProjectDescription.Target]
- public let schemes: [ProjectDescription.Scheme]
- public let settings: ProjectDescription.Settings?
- public let fileHeaderTemplate: ProjectDescription.FileHeaderTemplate?
- public let additionalFiles: [ProjectDescription.FileElement]
- public let resourceSynthesizers: [ProjectDescription.ResourceSynthesizer]
- public init(name: Swift.String, organizationName: Swift.String? = nil, options: ProjectDescription.Project.Options = .options(), packages: [ProjectDescription.Package] = [], settings: ProjectDescription.Settings? = nil, targets: [ProjectDescription.Target] = [], schemes: [ProjectDescription.Scheme] = [], fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? = nil, additionalFiles: [ProjectDescription.FileElement] = [], resourceSynthesizers: [ProjectDescription.ResourceSynthesizer] = .default)
- public static func == (a: ProjectDescription.Project, b: ProjectDescription.Project) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Project {
- public struct Options : Swift.Codable, Swift.Equatable {
- public let automaticSchemesOptions: ProjectDescription.Project.Options.AutomaticSchemesOptions
- public let developmentRegion: Swift.String?
- public let disableBundleAccessors: Swift.Bool
- public let disableShowEnvironmentVarsInScriptPhases: Swift.Bool
- public let disableSynthesizedResourceAccessors: Swift.Bool
- public let textSettings: ProjectDescription.Project.Options.TextSettings
- public let xcodeProjectName: Swift.String?
- public static func options(automaticSchemesOptions: ProjectDescription.Project.Options.AutomaticSchemesOptions = .enabled(), developmentRegion: Swift.String? = nil, disableBundleAccessors: Swift.Bool = false, disableShowEnvironmentVarsInScriptPhases: Swift.Bool = false, disableSynthesizedResourceAccessors: Swift.Bool = false, textSettings: ProjectDescription.Project.Options.TextSettings = .textSettings(), xcodeProjectName: Swift.String? = nil) -> ProjectDescription.Project.Options
- public static func == (a: ProjectDescription.Project.Options, b: ProjectDescription.Project.Options) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-extension ProjectDescription.Project.Options {
- public enum AutomaticSchemesOptions : Swift.Codable, Swift.Equatable {
- public enum TargetSchemesGrouping : Swift.Codable, Swift.Equatable {
- case singleScheme
- case byNameSuffix(build: Swift.Set, test: Swift.Set, run: Swift.Set)
- case notGrouped
- public static func == (a: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping, b: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- case enabled(targetSchemesGrouping: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping = .byNameSuffix(
- build: ["Implementation", "Interface", "Mocks", "Testing"],
- test: ["Tests", "IntegrationTests", "UITests", "SnapshotTests"],
- run: ["App", "Demo"]
- ), codeCoverageEnabled: Swift.Bool = false, testingOptions: ProjectDescription.TestingOptions = [])
- case disabled
- public static func == (a: ProjectDescription.Project.Options.AutomaticSchemesOptions, b: ProjectDescription.Project.Options.AutomaticSchemesOptions) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public struct TextSettings : Swift.Codable, Swift.Equatable {
- public let usesTabs: Swift.Bool?
- public let indentWidth: Swift.UInt?
- public let tabWidth: Swift.UInt?
- public let wrapsLines: Swift.Bool?
- public static func textSettings(usesTabs: Swift.Bool? = nil, indentWidth: Swift.UInt? = nil, tabWidth: Swift.UInt? = nil, wrapsLines: Swift.Bool? = nil) -> ProjectDescription.Project.Options.TextSettings
- public static func == (a: ProjectDescription.Project.Options.TextSettings, b: ProjectDescription.Project.Options.TextSettings) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-public enum ResourceFileElement : Swift.Codable, Swift.Equatable {
- case glob(pattern: ProjectDescription.Path, excluding: [ProjectDescription.Path] = [], tags: [Swift.String] = [])
- case folderReference(path: ProjectDescription.Path, tags: [Swift.String] = [])
- public static func == (a: ProjectDescription.ResourceFileElement, b: ProjectDescription.ResourceFileElement) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.ResourceFileElement : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-public struct ResourceFileElements : Swift.Codable, Swift.Equatable {
- public let resources: [ProjectDescription.ResourceFileElement]
- public init(resources: [ProjectDescription.ResourceFileElement])
- public static func == (a: ProjectDescription.ResourceFileElements, b: ProjectDescription.ResourceFileElements) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.ResourceFileElements : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.ResourceFileElements : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: ProjectDescription.ResourceFileElement...)
- public typealias ArrayLiteralElement = ProjectDescription.ResourceFileElement
-}
-public struct ResourceSynthesizer : Swift.Codable, Swift.Equatable {
- public let templateType: ProjectDescription.ResourceSynthesizer.TemplateType
- public let parser: ProjectDescription.ResourceSynthesizer.Parser
- public let extensions: Swift.Set
- public enum TemplateType : Swift.Codable, Swift.Equatable {
- case plugin(name: Swift.String, resourceName: Swift.String)
- case defaultTemplate(resourceName: Swift.String)
- public static func == (a: ProjectDescription.ResourceSynthesizer.TemplateType, b: ProjectDescription.ResourceSynthesizer.TemplateType) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public enum Parser : Swift.String, Swift.Codable {
- case strings
- case assets
- case plists
- case fonts
- case coreData
- case interfaceBuilder
- case json
- case yaml
- case files
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public static func strings() -> ProjectDescription.ResourceSynthesizer
- public static func strings(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func assets() -> ProjectDescription.ResourceSynthesizer
- public static func assets(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func fonts() -> ProjectDescription.ResourceSynthesizer
- public static func fonts(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func plists() -> ProjectDescription.ResourceSynthesizer
- public static func plists(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func coreData(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func coreData() -> ProjectDescription.ResourceSynthesizer
- public static func interfaceBuilder(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func interfaceBuilder() -> ProjectDescription.ResourceSynthesizer
- public static func json(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func json() -> ProjectDescription.ResourceSynthesizer
- public static func yaml(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func yaml() -> ProjectDescription.ResourceSynthesizer
- public static func files(plugin: Swift.String, extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer
- public static func files(extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer
- public static func custom(plugin: Swift.String, parser: ProjectDescription.ResourceSynthesizer.Parser, extensions: Swift.Set, resourceName: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func custom(name: Swift.String, parser: ProjectDescription.ResourceSynthesizer.Parser, extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer
- public static func == (a: ProjectDescription.ResourceSynthesizer, b: ProjectDescription.ResourceSynthesizer) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension Swift.Array where Element == ProjectDescription.ResourceSynthesizer {
- public static var `default`: Swift.Array {
- get
- }
-}
-public struct RunAction : Swift.Equatable, Swift.Codable {
- public let configuration: ProjectDescription.ConfigurationName
- public let attachDebugger: Swift.Bool
- public let preActions: [ProjectDescription.ExecutionAction]
- public let postActions: [ProjectDescription.ExecutionAction]
- public let executable: ProjectDescription.TargetReference?
- public let arguments: ProjectDescription.Arguments?
- public let options: ProjectDescription.RunActionOptions
- public let diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption]
- public static func runAction(configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], executable: ProjectDescription.TargetReference? = nil, arguments: ProjectDescription.Arguments? = nil, options: ProjectDescription.RunActionOptions = .options(), diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] = [.mainThreadChecker]) -> ProjectDescription.RunAction
- public static func == (a: ProjectDescription.RunAction, b: ProjectDescription.RunAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct RunActionOptions : Swift.Equatable, Swift.Codable {
- public let language: ProjectDescription.SchemeLanguage?
- public let storeKitConfigurationPath: ProjectDescription.Path?
- public let simulatedLocation: ProjectDescription.RunActionOptions.SimulatedLocation?
- public let enableGPUFrameCaptureMode: ProjectDescription.RunActionOptions.GPUFrameCaptureMode
- public static func options(language: ProjectDescription.SchemeLanguage? = nil, storeKitConfigurationPath: ProjectDescription.Path? = nil, simulatedLocation: ProjectDescription.RunActionOptions.SimulatedLocation? = nil, enableGPUFrameCaptureMode: ProjectDescription.RunActionOptions.GPUFrameCaptureMode = GPUFrameCaptureMode.default) -> ProjectDescription.RunActionOptions
- public static func == (a: ProjectDescription.RunActionOptions, b: ProjectDescription.RunActionOptions) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.RunActionOptions {
- public struct SimulatedLocation : Swift.Codable, Swift.Equatable {
- public let identifier: Swift.String?
- public let gpxFile: ProjectDescription.Path?
- public static func custom(gpxFile: ProjectDescription.Path) -> ProjectDescription.RunActionOptions.SimulatedLocation
- public static var london: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var johannesburg: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var moscow: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var mumbai: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var tokyo: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var sydney: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var hongKong: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var honolulu: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var sanFrancisco: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var mexicoCity: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var newYork: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var rioDeJaneiro: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static func == (a: ProjectDescription.RunActionOptions.SimulatedLocation, b: ProjectDescription.RunActionOptions.SimulatedLocation) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-extension ProjectDescription.RunActionOptions {
- public enum GPUFrameCaptureMode : Swift.String, Swift.Codable, Swift.Equatable {
- case autoEnabled
- case metal
- case openGL
- case disabled
- public static var `default`: ProjectDescription.RunActionOptions.GPUFrameCaptureMode {
- get
- }
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
-}
-public struct Scheme : Swift.Equatable, Swift.Codable {
- public let name: Swift.String
- public let shared: Swift.Bool
- public let hidden: Swift.Bool
- public let buildAction: ProjectDescription.BuildAction?
- public let testAction: ProjectDescription.TestAction?
- public let runAction: ProjectDescription.RunAction?
- public let archiveAction: ProjectDescription.ArchiveAction?
- public let profileAction: ProjectDescription.ProfileAction?
- public let analyzeAction: ProjectDescription.AnalyzeAction?
- public init(name: Swift.String, shared: Swift.Bool = true, hidden: Swift.Bool = false, buildAction: ProjectDescription.BuildAction? = nil, testAction: ProjectDescription.TestAction? = nil, runAction: ProjectDescription.RunAction? = nil, archiveAction: ProjectDescription.ArchiveAction? = nil, profileAction: ProjectDescription.ProfileAction? = nil, analyzeAction: ProjectDescription.AnalyzeAction? = nil)
- public static func == (a: ProjectDescription.Scheme, b: ProjectDescription.Scheme) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum SchemeDiagnosticsOption : Swift.String, Swift.Equatable, Swift.Codable {
- case mainThreadChecker
- case performanceAntipatternChecker
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public struct SchemeLanguage : Swift.Codable, Swift.Equatable, Swift.ExpressibleByStringLiteral {
- public let identifier: Swift.String
- public init(identifier: Swift.String)
- public init(stringLiteral: Swift.String)
- public static func == (a: ProjectDescription.SchemeLanguage, b: ProjectDescription.SchemeLanguage) -> Swift.Bool
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.SchemeLanguage {
- public static var doubleLengthPseudoLanguage: ProjectDescription.SchemeLanguage {
- get
- }
- public static var rightToLeftPseudoLanguage: ProjectDescription.SchemeLanguage {
- get
- }
- public static var accentedPseudoLanguage: ProjectDescription.SchemeLanguage {
- get
- }
- public static var boundedStringPseudoLanguage: ProjectDescription.SchemeLanguage {
- get
- }
- public static var rightToLeftWithStringsPseudoLanguage: ProjectDescription.SchemeLanguage {
- get
- }
-}
-public typealias SettingsDictionary = [Swift.String : ProjectDescription.SettingValue]
-public enum SettingValue : Swift.ExpressibleByStringInterpolation, Swift.ExpressibleByArrayLiteral, Swift.ExpressibleByBooleanLiteral, Swift.Equatable, Swift.Codable {
- case string(Swift.String)
- case array([Swift.String])
- public init(stringLiteral value: Swift.String)
- public init(arrayLiteral elements: Swift.String...)
- public typealias BooleanLiteralType = Swift.Bool
- public init(booleanLiteral value: Swift.Bool)
- public init(_ stringRawRepresentable: T) where T : Swift.RawRepresentable, T.RawValue == Swift.String
- public static func == (a: ProjectDescription.SettingValue, b: ProjectDescription.SettingValue) -> Swift.Bool
- public typealias ArrayLiteralElement = Swift.String
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Configuration : Swift.Equatable, Swift.Codable {
- public enum Variant : Swift.String, Swift.Codable {
- case debug
- case release
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public let name: ProjectDescription.ConfigurationName
- public let variant: ProjectDescription.Configuration.Variant
- public let settings: ProjectDescription.SettingsDictionary
- public let xcconfig: ProjectDescription.Path?
- public static func debug(name: ProjectDescription.ConfigurationName, settings: ProjectDescription.SettingsDictionary = [:], xcconfig: ProjectDescription.Path? = nil) -> ProjectDescription.Configuration
- public static func release(name: ProjectDescription.ConfigurationName, settings: ProjectDescription.SettingsDictionary = [:], xcconfig: ProjectDescription.Path? = nil) -> ProjectDescription.Configuration
- public static func == (a: ProjectDescription.Configuration, b: ProjectDescription.Configuration) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum DefaultSettings : Swift.Codable, Swift.Equatable {
- case recommended(excluding: Swift.Set = [])
- case essential(excluding: Swift.Set = [])
- case none
- public static func == (a: ProjectDescription.DefaultSettings, b: ProjectDescription.DefaultSettings) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.DefaultSettings {
- public static var recommended: ProjectDescription.DefaultSettings {
- get
- }
- public static var essential: ProjectDescription.DefaultSettings {
- get
- }
-}
-public struct Settings : Swift.Equatable, Swift.Codable {
- public let base: ProjectDescription.SettingsDictionary
- public let configurations: [ProjectDescription.Configuration]
- public let defaultSettings: ProjectDescription.DefaultSettings
- public static func settings(base: ProjectDescription.SettingsDictionary = [:], debug: ProjectDescription.SettingsDictionary = [:], release: ProjectDescription.SettingsDictionary = [:], defaultSettings: ProjectDescription.DefaultSettings = .recommended) -> ProjectDescription.Settings
- public static func settings(base: ProjectDescription.SettingsDictionary = [:], configurations: [ProjectDescription.Configuration], defaultSettings: ProjectDescription.DefaultSettings = .recommended) -> ProjectDescription.Settings
- public static func == (a: ProjectDescription.Settings, b: ProjectDescription.Settings) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension Swift.Dictionary where Key == Swift.String, Value == ProjectDescription.SettingValue {
- public mutating func merge(_ other: ProjectDescription.SettingsDictionary)
- public func merging(_ other: ProjectDescription.SettingsDictionary) -> ProjectDescription.SettingsDictionary
-}
-public enum SwiftCompilationMode : Swift.String {
- case singlefile
- case wholemodule
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public enum DebugInformationFormat : Swift.String {
- case dwarf
- case dwarfWithDsym
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public enum SwiftOptimizationLevel : Swift.String {
- case o
- case oNone
- case oSize
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-extension Swift.Dictionary where Key == Swift.String, Value == ProjectDescription.SettingValue {
- public func manualCodeSigning(identity: Swift.String? = nil, provisioningProfileSpecifier: Swift.String? = nil) -> ProjectDescription.SettingsDictionary
- public func automaticCodeSigning(devTeam: Swift.String) -> ProjectDescription.SettingsDictionary
- public func codeSignIdentityAppleDevelopment() -> ProjectDescription.SettingsDictionary
- public func codeSignIdentity(_ identity: Swift.String) -> ProjectDescription.SettingsDictionary
- public func currentProjectVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary
- public func marketingVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary
- public func appleGenericVersioningSystem() -> ProjectDescription.SettingsDictionary
- public func versionInfo(_ version: Swift.String, prefix: Swift.String? = nil, suffix: Swift.String? = nil) -> ProjectDescription.SettingsDictionary
- public func swiftVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary
- public func otherSwiftFlags(_ flags: Swift.String...) -> ProjectDescription.SettingsDictionary
- public func swiftActiveCompilationConditions(_ conditions: Swift.String...) -> ProjectDescription.SettingsDictionary
- public func swiftCompilationMode(_ mode: ProjectDescription.SwiftCompilationMode) -> ProjectDescription.SettingsDictionary
- public func swiftOptimizationLevel(_ level: ProjectDescription.SwiftOptimizationLevel) -> ProjectDescription.SettingsDictionary
- public func swiftOptimizeObjectLifetimes(_ enabled: Swift.Bool) -> ProjectDescription.SettingsDictionary
- public func swiftObjcBridingHeaderPath(_ path: Swift.String) -> ProjectDescription.SettingsDictionary
- public func otherCFlags(_ flags: [Swift.String]) -> ProjectDescription.SettingsDictionary
- public func otherLinkerFlags(_ flags: [Swift.String]) -> ProjectDescription.SettingsDictionary
- public func bitcodeEnabled(_ enabled: Swift.Bool) -> ProjectDescription.SettingsDictionary
- public func debugInformationFormat(_ format: ProjectDescription.DebugInformationFormat) -> ProjectDescription.SettingsDictionary
-}
-public struct SourceFileGlob : Swift.Codable, Swift.Equatable {
- public let glob: ProjectDescription.Path
- public let excluding: [ProjectDescription.Path]
- public let compilerFlags: Swift.String?
- public let codeGen: ProjectDescription.FileCodeGen?
- public static func glob(_ glob: ProjectDescription.Path, excluding: [ProjectDescription.Path] = [], compilerFlags: Swift.String? = nil, codeGen: ProjectDescription.FileCodeGen? = nil) -> ProjectDescription.SourceFileGlob
- public static func glob(_ glob: ProjectDescription.Path, excluding: ProjectDescription.Path?, compilerFlags: Swift.String? = nil, codeGen: ProjectDescription.FileCodeGen? = nil) -> ProjectDescription.SourceFileGlob
- public static func == (a: ProjectDescription.SourceFileGlob, b: ProjectDescription.SourceFileGlob) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.SourceFileGlob : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-public struct SourceFilesList : Swift.Codable, Swift.Equatable {
- public let globs: [ProjectDescription.SourceFileGlob]
- public init(globs: [ProjectDescription.SourceFileGlob])
- public init(globs: [Swift.String])
- public static func paths(_ paths: [ProjectDescription.Path]) -> ProjectDescription.SourceFilesList
- public static func == (a: ProjectDescription.SourceFilesList, b: ProjectDescription.SourceFilesList) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.SourceFilesList : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.SourceFilesList : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: ProjectDescription.SourceFileGlob...)
- public typealias ArrayLiteralElement = ProjectDescription.SourceFileGlob
-}
-public struct Target : Swift.Codable, Swift.Equatable {
- public let name: Swift.String
- public let platform: ProjectDescription.Platform
- public let product: ProjectDescription.Product
- public let productName: Swift.String?
- public let bundleId: Swift.String
- public let deploymentTarget: ProjectDescription.DeploymentTarget?
- public let infoPlist: ProjectDescription.InfoPlist?
- public let sources: ProjectDescription.SourceFilesList?
- public let resources: ProjectDescription.ResourceFileElements?
- public let copyFiles: [ProjectDescription.CopyFilesAction]?
- public let headers: ProjectDescription.Headers?
- public let entitlements: ProjectDescription.Path?
- public let scripts: [ProjectDescription.TargetScript]
- public let dependencies: [ProjectDescription.TargetDependency]
- public let settings: ProjectDescription.Settings?
- public let coreDataModels: [ProjectDescription.CoreDataModel]
- public let environment: [Swift.String : Swift.String]
- public let launchArguments: [ProjectDescription.LaunchArgument]
- public let additionalFiles: [ProjectDescription.FileElement]
- public init(name: Swift.String, platform: ProjectDescription.Platform, product: ProjectDescription.Product, productName: Swift.String? = nil, bundleId: Swift.String, deploymentTarget: ProjectDescription.DeploymentTarget? = nil, infoPlist: ProjectDescription.InfoPlist? = .default, sources: ProjectDescription.SourceFilesList? = nil, resources: ProjectDescription.ResourceFileElements? = nil, copyFiles: [ProjectDescription.CopyFilesAction]? = nil, headers: ProjectDescription.Headers? = nil, entitlements: ProjectDescription.Path? = nil, scripts: [ProjectDescription.TargetScript] = [], dependencies: [ProjectDescription.TargetDependency] = [], settings: ProjectDescription.Settings? = nil, coreDataModels: [ProjectDescription.CoreDataModel] = [], environment: [Swift.String : Swift.String] = [:], launchArguments: [ProjectDescription.LaunchArgument] = [], additionalFiles: [ProjectDescription.FileElement] = [])
- public static func == (a: ProjectDescription.Target, b: ProjectDescription.Target) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum SDKStatus : Swift.String, Swift.Codable, Swift.Hashable {
- case required
- case optional
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public enum SDKType : Swift.String, Swift.Codable, Swift.Hashable {
- case library
- case framework
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public enum TargetDependency : Swift.Codable, Swift.Hashable {
- case target(name: Swift.String)
- case project(target: Swift.String, path: ProjectDescription.Path)
- case framework(path: ProjectDescription.Path)
- case library(path: ProjectDescription.Path, publicHeaders: ProjectDescription.Path, swiftModuleMap: ProjectDescription.Path?)
- case package(product: Swift.String)
- case sdk(name: Swift.String, type: ProjectDescription.SDKType, status: ProjectDescription.SDKStatus)
- case xcframework(path: ProjectDescription.Path)
- case xctest
- case external(name: Swift.String)
- public static func sdk(name: Swift.String, type: ProjectDescription.SDKType) -> ProjectDescription.TargetDependency
- public var typeName: Swift.String {
- get
- }
- public func hash(into hasher: inout Swift.Hasher)
- public static func == (a: ProjectDescription.TargetDependency, b: ProjectDescription.TargetDependency) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public var hashValue: Swift.Int {
- get
- }
- public init(from decoder: Swift.Decoder) throws
-}
-public struct TargetReference : Swift.Hashable, Swift.Codable, Swift.ExpressibleByStringInterpolation {
- public var projectPath: ProjectDescription.Path?
- public var targetName: Swift.String
- public init(projectPath: ProjectDescription.Path?, target: Swift.String)
- public init(stringLiteral value: Swift.String)
- public static func project(path: ProjectDescription.Path, target: Swift.String) -> ProjectDescription.TargetReference
- public func hash(into hasher: inout Swift.Hasher)
- public static func == (a: ProjectDescription.TargetReference, b: ProjectDescription.TargetReference) -> Swift.Bool
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public var hashValue: Swift.Int {
- get
- }
- public init(from decoder: Swift.Decoder) throws
-}
-public struct TargetScript : Swift.Codable, Swift.Equatable {
- public enum Order : Swift.String, Swift.Codable, Swift.Equatable {
- case pre
- case post
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public enum Script : Swift.Equatable, Swift.Codable {
- case tool(path: Swift.String, args: [Swift.String])
- case scriptPath(path: ProjectDescription.Path, args: [Swift.String])
- case embedded(Swift.String)
- public static func == (a: ProjectDescription.TargetScript.Script, b: ProjectDescription.TargetScript.Script) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public let name: Swift.String
- public let script: ProjectDescription.TargetScript.Script
- public let order: ProjectDescription.TargetScript.Order
- public let inputPaths: [ProjectDescription.Path]
- public let inputFileListPaths: [ProjectDescription.Path]
- public let outputPaths: [ProjectDescription.Path]
- public let outputFileListPaths: [ProjectDescription.Path]
- public let basedOnDependencyAnalysis: Swift.Bool?
- public let runForInstallBuildsOnly: Swift.Bool
- public let shellPath: Swift.String
- public static func pre(path: ProjectDescription.Path, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func pre(path: ProjectDescription.Path, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func post(path: ProjectDescription.Path, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func post(path: ProjectDescription.Path, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func pre(tool: Swift.String, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func pre(tool: Swift.String, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func post(tool: Swift.String, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func post(tool: Swift.String, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func pre(script: Swift.String, name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func post(script: Swift.String, name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func == (a: ProjectDescription.TargetScript, b: ProjectDescription.TargetScript) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Template : Swift.Codable, Swift.Equatable {
- public let description: Swift.String
- public let attributes: [ProjectDescription.Template.Attribute]
- public let items: [ProjectDescription.Template.Item]
- public init(description: Swift.String, attributes: [ProjectDescription.Template.Attribute] = [], items: [ProjectDescription.Template.Item] = [])
- public enum Contents : Swift.Codable, Swift.Equatable {
- case string(Swift.String)
- case file(ProjectDescription.Path)
- case directory(ProjectDescription.Path)
- public static func == (a: ProjectDescription.Template.Contents, b: ProjectDescription.Template.Contents) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public struct Item : Swift.Codable, Swift.Equatable {
- public let path: Swift.String
- public let contents: ProjectDescription.Template.Contents
- public init(path: Swift.String, contents: ProjectDescription.Template.Contents)
- public static func == (a: ProjectDescription.Template.Item, b: ProjectDescription.Template.Item) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public enum Attribute : Swift.Codable, Swift.Equatable {
- case required(Swift.String)
- case optional(Swift.String, default: Swift.String)
- public static func == (a: ProjectDescription.Template.Attribute, b: ProjectDescription.Template.Attribute) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public static func == (a: ProjectDescription.Template, b: ProjectDescription.Template) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Template.Item {
- public static func string(path: Swift.String, contents: Swift.String) -> ProjectDescription.Template.Item
- public static func file(path: Swift.String, templatePath: ProjectDescription.Path) -> ProjectDescription.Template.Item
- public static func directory(path: Swift.String, sourcePath: ProjectDescription.Path) -> ProjectDescription.Template.Item
-}
-extension Swift.DefaultStringInterpolation {
- public mutating func appendInterpolation(_ value: ProjectDescription.Template.Attribute)
-}
-public struct TemplateString : Swift.Encodable, Swift.Decodable, Swift.Equatable {
- public static func == (a: ProjectDescription.TemplateString, b: ProjectDescription.TemplateString) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.TemplateString : Swift.ExpressibleByStringLiteral {
- public init(stringLiteral: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.TemplateString : Swift.CustomStringConvertible {
- public var description: Swift.String {
- get
- }
-}
-extension ProjectDescription.TemplateString : Swift.ExpressibleByStringInterpolation {
- public init(stringInterpolation: ProjectDescription.TemplateString.StringInterpolation)
- public struct StringInterpolation : Swift.StringInterpolationProtocol {
- public init(literalCapacity _: Swift.Int, interpolationCount _: Swift.Int)
- public mutating func appendLiteral(_ literal: Swift.String)
- public mutating func appendInterpolation(_ token: ProjectDescription.TemplateString.Token)
- public typealias StringLiteralType = Swift.String
- }
-}
-extension ProjectDescription.TemplateString {
- public enum Token : Swift.String, Swift.Equatable {
- case projectName
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
-}
-public struct TestAction : Swift.Equatable, Swift.Codable {
- public let testPlans: [ProjectDescription.Path]?
- public let targets: [ProjectDescription.TestableTarget]
- public let arguments: ProjectDescription.Arguments?
- public let configuration: ProjectDescription.ConfigurationName
- public let attachDebugger: Swift.Bool
- public let expandVariableFromTarget: ProjectDescription.TargetReference?
- public let preActions: [ProjectDescription.ExecutionAction]
- public let postActions: [ProjectDescription.ExecutionAction]
- public let options: ProjectDescription.TestActionOptions
- public let diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption]
- public static func targets(_ targets: [ProjectDescription.TestableTarget], arguments: ProjectDescription.Arguments? = nil, configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, expandVariableFromTarget: ProjectDescription.TargetReference? = nil, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], options: ProjectDescription.TestActionOptions = .options(), diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] = [.mainThreadChecker]) -> ProjectDescription.TestAction
- public static func testPlans(_ testPlans: [ProjectDescription.Path], configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = []) -> ProjectDescription.TestAction
- public static func == (a: ProjectDescription.TestAction, b: ProjectDescription.TestAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct TestActionOptions : Swift.Equatable, Swift.Codable {
- public let language: ProjectDescription.SchemeLanguage?
- public let region: Swift.String?
- public let coverage: Swift.Bool
- public let codeCoverageTargets: [ProjectDescription.TargetReference]
- public static func options(language: ProjectDescription.SchemeLanguage? = nil, region: Swift.String? = nil, coverage: Swift.Bool = false, codeCoverageTargets: [ProjectDescription.TargetReference] = []) -> ProjectDescription.TestActionOptions
- public static func == (a: ProjectDescription.TestActionOptions, b: ProjectDescription.TestActionOptions) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct TestableTarget : Swift.Equatable, Swift.Codable, Swift.ExpressibleByStringInterpolation {
- public let target: ProjectDescription.TargetReference
- public let isSkipped: Swift.Bool
- public let isParallelizable: Swift.Bool
- public let isRandomExecutionOrdering: Swift.Bool
- public init(target: ProjectDescription.TargetReference, skipped: Swift.Bool = false, parallelizable: Swift.Bool = false, randomExecutionOrdering: Swift.Bool = false)
- public init(stringLiteral value: Swift.String)
- public static func == (a: ProjectDescription.TestableTarget, b: ProjectDescription.TestableTarget) -> Swift.Bool
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct TestingOptions : Swift.OptionSet, Swift.Codable, Swift.Equatable {
- public let rawValue: Swift.Int
- public init(rawValue: Swift.Int)
- public static let parallelizable: ProjectDescription.TestingOptions
- public static let randomExecutionOrdering: ProjectDescription.TestingOptions
- public typealias ArrayLiteralElement = ProjectDescription.TestingOptions
- public typealias Element = ProjectDescription.TestingOptions
- public typealias RawValue = Swift.Int
-}
-public struct Version : Swift.Hashable, Swift.Codable {
- public let major: Swift.Int
- public let minor: Swift.Int
- public let patch: Swift.Int
- public let prereleaseIdentifiers: [Swift.String]
- public let buildMetadataIdentifiers: [Swift.String]
- public init(_ major: Swift.Int, _ minor: Swift.Int, _ patch: Swift.Int, prereleaseIdentifiers: [Swift.String] = [], buildMetadataIdentifiers: [Swift.String] = [])
- public static func == (a: ProjectDescription.Version, b: ProjectDescription.Version) -> Swift.Bool
- public func hash(into hasher: inout Swift.Hasher)
- public func encode(to encoder: Swift.Encoder) throws
- public var hashValue: Swift.Int {
- get
- }
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Version : Swift.Comparable {
- public static func < (lhs: ProjectDescription.Version, rhs: ProjectDescription.Version) -> Swift.Bool
-}
-extension ProjectDescription.Version : Swift.CustomStringConvertible {
- public var description: Swift.String {
- get
- }
-}
-extension ProjectDescription.Version {
- public init?(string: Swift.String)
-}
-extension ProjectDescription.Version : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension Swift.ClosedRange where Bound == ProjectDescription.Version {
- public func contains(_: ProjectDescription.Version) -> Swift.Bool
-}
-extension Swift.Range where Bound == ProjectDescription.Version {
- public func contains(_: ProjectDescription.Version) -> Swift.Bool
-}
-extension Swift.Range where Bound == ProjectDescription.Version {
- public func contains(version: ProjectDescription.Version) -> Swift.Bool
-}
-public struct Workspace : Swift.Codable, Swift.Equatable {
- public let name: Swift.String
- public let projects: [ProjectDescription.Path]
- public let schemes: [ProjectDescription.Scheme]
- public let fileHeaderTemplate: ProjectDescription.FileHeaderTemplate?
- public let additionalFiles: [ProjectDescription.FileElement]
- public let generationOptions: ProjectDescription.Workspace.GenerationOptions
- public init(name: Swift.String, projects: [ProjectDescription.Path], schemes: [ProjectDescription.Scheme] = [], fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? = nil, additionalFiles: [ProjectDescription.FileElement] = [], generationOptions: ProjectDescription.Workspace.GenerationOptions = .options())
- public static func == (a: ProjectDescription.Workspace, b: ProjectDescription.Workspace) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Workspace {
- public struct GenerationOptions : Swift.Codable, Swift.Equatable {
- public enum AutogeneratedWorkspaceSchemes : Swift.Codable, Swift.Equatable {
- public enum CodeCoverageMode : Swift.Codable, Swift.Equatable {
- case all
- case relevant
- case targets([ProjectDescription.TargetReference])
- case disabled
- public static func == (a: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode, b: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- case disabled
- case enabled(codeCoverageMode: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode = .disabled, testingOptions: ProjectDescription.TestingOptions = [])
- public static func == (a: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes, b: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public let enableAutomaticXcodeSchemes: Swift.Bool?
- public let autogeneratedWorkspaceSchemes: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes
- public let lastXcodeUpgradeCheck: ProjectDescription.Version?
- public let renderMarkdownReadme: Swift.Bool
- public static func options(enableAutomaticXcodeSchemes: Swift.Bool? = false, autogeneratedWorkspaceSchemes: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes = .enabled(), lastXcodeUpgradeCheck: ProjectDescription.Version? = nil, renderMarkdownReadme: Swift.Bool = false) -> ProjectDescription.Workspace.GenerationOptions
- public static func == (a: ProjectDescription.Workspace.GenerationOptions, b: ProjectDescription.Workspace.GenerationOptions) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-extension ProjectDescription.Cloud.Option : Swift.Hashable {}
-extension ProjectDescription.Cloud.Option : Swift.RawRepresentable {}
-extension ProjectDescription.CopyFilesAction.Destination : Swift.Hashable {}
-extension ProjectDescription.CopyFilesAction.Destination : Swift.RawRepresentable {}
-extension ProjectDescription.FileCodeGen : Swift.Hashable {}
-extension ProjectDescription.FileCodeGen : Swift.RawRepresentable {}
-extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.Equatable {}
-extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.Hashable {}
-extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.RawRepresentable {}
-extension ProjectDescription.Path.PathType : Swift.Equatable {}
-extension ProjectDescription.Path.PathType : Swift.Hashable {}
-extension ProjectDescription.Path.PathType : Swift.RawRepresentable {}
-extension ProjectDescription.Platform : Swift.Hashable {}
-extension ProjectDescription.Platform : Swift.RawRepresentable {}
-extension ProjectDescription.Product : Swift.Hashable {}
-extension ProjectDescription.Product : Swift.RawRepresentable {}
-extension ProjectDescription.ResourceSynthesizer.Parser : Swift.Equatable {}
-extension ProjectDescription.ResourceSynthesizer.Parser : Swift.Hashable {}
-extension ProjectDescription.ResourceSynthesizer.Parser : Swift.RawRepresentable {}
-extension ProjectDescription.RunActionOptions.GPUFrameCaptureMode : Swift.Hashable {}
-extension ProjectDescription.RunActionOptions.GPUFrameCaptureMode : Swift.RawRepresentable {}
-extension ProjectDescription.SchemeDiagnosticsOption : Swift.Hashable {}
-extension ProjectDescription.SchemeDiagnosticsOption : Swift.RawRepresentable {}
-extension ProjectDescription.Configuration.Variant : Swift.Equatable {}
-extension ProjectDescription.Configuration.Variant : Swift.Hashable {}
-extension ProjectDescription.Configuration.Variant : Swift.RawRepresentable {}
-extension ProjectDescription.SwiftCompilationMode : Swift.Equatable {}
-extension ProjectDescription.SwiftCompilationMode : Swift.Hashable {}
-extension ProjectDescription.SwiftCompilationMode : Swift.RawRepresentable {}
-extension ProjectDescription.DebugInformationFormat : Swift.Equatable {}
-extension ProjectDescription.DebugInformationFormat : Swift.Hashable {}
-extension ProjectDescription.DebugInformationFormat : Swift.RawRepresentable {}
-extension ProjectDescription.SwiftOptimizationLevel : Swift.Equatable {}
-extension ProjectDescription.SwiftOptimizationLevel : Swift.Hashable {}
-extension ProjectDescription.SwiftOptimizationLevel : Swift.RawRepresentable {}
-extension ProjectDescription.SDKStatus : Swift.RawRepresentable {}
-extension ProjectDescription.SDKType : Swift.RawRepresentable {}
-extension ProjectDescription.TargetScript.Order : Swift.Hashable {}
-extension ProjectDescription.TargetScript.Order : Swift.RawRepresentable {}
-extension ProjectDescription.TemplateString.Token : Swift.Hashable {}
-extension ProjectDescription.TemplateString.Token : Swift.RawRepresentable {}
diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64.swiftmodule b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64.swiftmodule
deleted file mode 100644
index b26ec9477..000000000
Binary files a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/arm64.swiftmodule and /dev/null differ
diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64-apple-macos.swiftdoc b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64-apple-macos.swiftdoc
deleted file mode 100644
index c638986a6..000000000
Binary files a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64-apple-macos.swiftdoc and /dev/null differ
diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64-apple-macos.swiftinterface b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64-apple-macos.swiftinterface
deleted file mode 100644
index b59be5e68..000000000
--- a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64-apple-macos.swiftinterface
+++ /dev/null
@@ -1,1418 +0,0 @@
-// swift-interface-format-version: 1.0
-// swift-compiler-version: Apple Swift version 5.5.1 (swiftlang-1300.0.31.4 clang-1300.0.29.6)
-// swift-module-flags: -target x86_64-apple-macos11.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -module-name ProjectDescription
-import Foundation
-import Swift
-import _Concurrency
-public struct AnalyzeAction : Swift.Equatable, Swift.Codable {
- public let configuration: ProjectDescription.ConfigurationName
- public static func analyzeAction(configuration: ProjectDescription.ConfigurationName) -> ProjectDescription.AnalyzeAction
- public static func == (a: ProjectDescription.AnalyzeAction, b: ProjectDescription.AnalyzeAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct ArchiveAction : Swift.Equatable, Swift.Codable {
- public let configuration: ProjectDescription.ConfigurationName
- public let revealArchiveInOrganizer: Swift.Bool
- public let customArchiveName: Swift.String?
- public let preActions: [ProjectDescription.ExecutionAction]
- public let postActions: [ProjectDescription.ExecutionAction]
- public static func archiveAction(configuration: ProjectDescription.ConfigurationName, revealArchiveInOrganizer: Swift.Bool = true, customArchiveName: Swift.String? = nil, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = []) -> ProjectDescription.ArchiveAction
- public static func == (a: ProjectDescription.ArchiveAction, b: ProjectDescription.ArchiveAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Arguments : Swift.Equatable, Swift.Codable {
- public let environment: [Swift.String : Swift.String]
- public let launchArguments: [ProjectDescription.LaunchArgument]
- public init(environment: [Swift.String : Swift.String] = [:], launchArguments: [ProjectDescription.LaunchArgument] = [])
- public static func == (a: ProjectDescription.Arguments, b: ProjectDescription.Arguments) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct BuildAction : Swift.Equatable, Swift.Codable {
- public let targets: [ProjectDescription.TargetReference]
- public let preActions: [ProjectDescription.ExecutionAction]
- public let postActions: [ProjectDescription.ExecutionAction]
- public let runPostActionsOnFailure: Swift.Bool
- public init(targets: [ProjectDescription.TargetReference], preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], runPostActionsOnFailure: Swift.Bool = false)
- public static func buildAction(targets: [ProjectDescription.TargetReference], preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], runPostActionsOnFailure: Swift.Bool = false) -> ProjectDescription.BuildAction
- public static func == (a: ProjectDescription.BuildAction, b: ProjectDescription.BuildAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Cache : Swift.Codable, Swift.Equatable {
- public struct Profile : Swift.Codable, Swift.Equatable {
- public let name: Swift.String
- public let configuration: Swift.String
- public let device: Swift.String?
- public let os: Swift.String?
- public static func profile(name: Swift.String, configuration: Swift.String, device: Swift.String? = nil, os: Swift.String? = nil) -> ProjectDescription.Cache.Profile
- public static func == (a: ProjectDescription.Cache.Profile, b: ProjectDescription.Cache.Profile) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public let profiles: [ProjectDescription.Cache.Profile]
- public let path: ProjectDescription.Path?
- public static func cache(profiles: [ProjectDescription.Cache.Profile] = [], path: ProjectDescription.Path? = nil) -> ProjectDescription.Cache
- public static func == (a: ProjectDescription.Cache, b: ProjectDescription.Cache) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Cloud : Swift.Codable, Swift.Equatable {
- public enum Option : Swift.String, Swift.Codable, Swift.Equatable {
- case analytics
- case optional
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public let url: Swift.String
- public let projectId: Swift.String
- public let options: [ProjectDescription.Cloud.Option]
- public static func cloud(projectId: Swift.String, url: Swift.String, options: [ProjectDescription.Cloud.Option] = []) -> ProjectDescription.Cloud
- public static func == (a: ProjectDescription.Cloud, b: ProjectDescription.Cloud) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum CompatibleXcodeVersions : Swift.ExpressibleByArrayLiteral, Swift.ExpressibleByStringInterpolation, Swift.Codable, Swift.Equatable {
- case all
- case exact(ProjectDescription.Version)
- case upToNextMajor(ProjectDescription.Version)
- case upToNextMinor(ProjectDescription.Version)
- case list([ProjectDescription.CompatibleXcodeVersions])
- public init(arrayLiteral elements: [ProjectDescription.CompatibleXcodeVersions])
- public init(arrayLiteral elements: ProjectDescription.CompatibleXcodeVersions...)
- public init(stringLiteral value: Swift.String)
- public static func == (a: ProjectDescription.CompatibleXcodeVersions, b: ProjectDescription.CompatibleXcodeVersions) -> Swift.Bool
- public typealias ArrayLiteralElement = ProjectDescription.CompatibleXcodeVersions
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Config : Swift.Codable, Swift.Equatable {
- public let generationOptions: ProjectDescription.Config.GenerationOptions
- public let compatibleXcodeVersions: ProjectDescription.CompatibleXcodeVersions
- public let plugins: [ProjectDescription.PluginLocation]
- public let cloud: ProjectDescription.Cloud?
- public let cache: ProjectDescription.Cache?
- public let swiftVersion: ProjectDescription.Version?
- public init(compatibleXcodeVersions: ProjectDescription.CompatibleXcodeVersions = .all, cloud: ProjectDescription.Cloud? = nil, cache: ProjectDescription.Cache? = nil, swiftVersion: ProjectDescription.Version? = nil, plugins: [ProjectDescription.PluginLocation] = [], generationOptions: ProjectDescription.Config.GenerationOptions = .options())
- public static func == (a: ProjectDescription.Config, b: ProjectDescription.Config) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Config {
- public struct GenerationOptions : Swift.Codable, Swift.Equatable {
- public let resolveDependenciesWithSystemScm: Swift.Bool
- public let disablePackageVersionLocking: Swift.Bool
- public static func options(resolveDependenciesWithSystemScm: Swift.Bool = false, disablePackageVersionLocking: Swift.Bool = false) -> ProjectDescription.Config.GenerationOptions
- public static func == (a: ProjectDescription.Config.GenerationOptions, b: ProjectDescription.Config.GenerationOptions) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-public struct ConfigurationName : Swift.ExpressibleByStringLiteral, Swift.Codable, Swift.Equatable {
- public let rawValue: Swift.String
- public init(stringLiteral value: Swift.StringLiteralType)
- public static func configuration(_ name: Swift.String) -> ProjectDescription.ConfigurationName
- public static var debug: ProjectDescription.ConfigurationName {
- get
- }
- public static var release: ProjectDescription.ConfigurationName {
- get
- }
- public static func == (a: ProjectDescription.ConfigurationName, b: ProjectDescription.ConfigurationName) -> Swift.Bool
- public typealias ExtendedGraphemeClusterLiteralType = Swift.StringLiteralType
- public typealias StringLiteralType = Swift.StringLiteralType
- public typealias UnicodeScalarLiteralType = Swift.StringLiteralType
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct CopyFilesAction : Swift.Codable, Swift.Equatable {
- public var name: Swift.String
- public var destination: ProjectDescription.CopyFilesAction.Destination
- public var subpath: Swift.String?
- public var files: [ProjectDescription.FileElement]
- public enum Destination : Swift.String, Swift.Codable, Swift.Equatable {
- case absolutePath
- case productsDirectory
- case wrapper
- case executables
- case resources
- case javaResources
- case frameworks
- case sharedFrameworks
- case sharedSupport
- case plugins
- case other
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public static func productsDirectory(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func wrapper(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func executables(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func resources(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func javaResources(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func frameworks(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func sharedFrameworks(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func sharedSupport(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func plugins(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func == (a: ProjectDescription.CopyFilesAction, b: ProjectDescription.CopyFilesAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct CoreDataModel : Swift.Codable, Swift.Equatable {
- public let path: ProjectDescription.Path
- public let currentVersion: Swift.String?
- public init(_ path: ProjectDescription.Path, currentVersion: Swift.String? = nil)
- public static func == (a: ProjectDescription.CoreDataModel, b: ProjectDescription.CoreDataModel) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct CarthageDependencies : Swift.Codable, Swift.Equatable {
- public let dependencies: [ProjectDescription.CarthageDependencies.Dependency]
- public init(_ dependencies: [ProjectDescription.CarthageDependencies.Dependency])
- public static func == (a: ProjectDescription.CarthageDependencies, b: ProjectDescription.CarthageDependencies) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.CarthageDependencies : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: ProjectDescription.CarthageDependencies.Dependency...)
- public typealias ArrayLiteralElement = ProjectDescription.CarthageDependencies.Dependency
-}
-extension ProjectDescription.CarthageDependencies {
- public enum Dependency : Swift.Codable, Swift.Equatable {
- case github(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement)
- case git(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement)
- case binary(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement)
- public static func == (a: ProjectDescription.CarthageDependencies.Dependency, b: ProjectDescription.CarthageDependencies.Dependency) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public enum Requirement : Swift.Codable, Swift.Equatable {
- case exact(ProjectDescription.Version)
- case upToNext(ProjectDescription.Version)
- case atLeast(ProjectDescription.Version)
- case branch(Swift.String)
- case revision(Swift.String)
- public static func == (a: ProjectDescription.CarthageDependencies.Requirement, b: ProjectDescription.CarthageDependencies.Requirement) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-public struct Dependencies : Swift.Codable, Swift.Equatable {
- public let carthage: ProjectDescription.CarthageDependencies?
- public let swiftPackageManager: ProjectDescription.SwiftPackageManagerDependencies?
- public let platforms: Swift.Set
- public init(carthage: ProjectDescription.CarthageDependencies? = nil, swiftPackageManager: ProjectDescription.SwiftPackageManagerDependencies? = nil, platforms: Swift.Set = Set(Platform.allCases))
- public static func == (a: ProjectDescription.Dependencies, b: ProjectDescription.Dependencies) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct SwiftPackageManagerDependencies : Swift.Codable, Swift.Equatable {
- public let packages: [ProjectDescription.Package]
- public let productTypes: [Swift.String : ProjectDescription.Product]
- public let baseSettings: ProjectDescription.Settings
- public let targetSettings: [Swift.String : ProjectDescription.SettingsDictionary]
- public let projectOptions: [Swift.String : ProjectDescription.Project.Options]
- public init(_ packages: [ProjectDescription.Package], productTypes: [Swift.String : ProjectDescription.Product] = [:], baseSettings: ProjectDescription.Settings = .settings(), targetSettings: [Swift.String : ProjectDescription.SettingsDictionary] = [:], projectOptions: [Swift.String : ProjectDescription.Project.Options] = [:])
- public static func == (a: ProjectDescription.SwiftPackageManagerDependencies, b: ProjectDescription.SwiftPackageManagerDependencies) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.SwiftPackageManagerDependencies : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: ProjectDescription.Package...)
- public typealias ArrayLiteralElement = ProjectDescription.Package
-}
-public struct DeploymentDevice : Swift.OptionSet, Swift.Codable, Swift.Hashable {
- public static let iphone: ProjectDescription.DeploymentDevice
- public static let ipad: ProjectDescription.DeploymentDevice
- public static let mac: ProjectDescription.DeploymentDevice
- public let rawValue: Swift.UInt
- public init(rawValue: Swift.UInt)
- public typealias ArrayLiteralElement = ProjectDescription.DeploymentDevice
- public typealias Element = ProjectDescription.DeploymentDevice
- public typealias RawValue = Swift.UInt
-}
-public enum DeploymentTarget : Swift.Codable, Swift.Hashable {
- case iOS(targetVersion: Swift.String, devices: ProjectDescription.DeploymentDevice)
- case macOS(targetVersion: Swift.String)
- case watchOS(targetVersion: Swift.String)
- case tvOS(targetVersion: Swift.String)
- public var targetVersion: Swift.String {
- get
- }
- public func hash(into hasher: inout Swift.Hasher)
- public static func == (a: ProjectDescription.DeploymentTarget, b: ProjectDescription.DeploymentTarget) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public var hashValue: Swift.Int {
- get
- }
- public init(from decoder: Swift.Decoder) throws
-}
-@dynamicMemberLookup public enum Environment {
- public enum Value : Swift.Equatable {
- case boolean(Swift.Bool)
- case string(Swift.String)
- public static func == (a: ProjectDescription.Environment.Value, b: ProjectDescription.Environment.Value) -> Swift.Bool
- }
- public static subscript(dynamicMember member: Swift.String) -> ProjectDescription.Environment.Value? {
- get
- }
-}
-extension Swift.Optional where Wrapped == ProjectDescription.Environment.Value {
- public func getString(default defaultString: Swift.String) -> Swift.String
- public func getBoolean(default defaultBoolean: Swift.Bool) -> Swift.Bool
-}
-public struct ExecutionAction : Swift.Equatable, Swift.Codable {
- public let title: Swift.String
- public let scriptText: Swift.String
- public let target: ProjectDescription.TargetReference?
- public init(title: Swift.String = "Run Script", scriptText: Swift.String, target: ProjectDescription.TargetReference? = nil)
- public static func == (a: ProjectDescription.ExecutionAction, b: ProjectDescription.ExecutionAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum FileCodeGen : Swift.String, Swift.Codable, Swift.Equatable {
- case `public`
- case `private`
- case project
- case disabled
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public enum FileElement : Swift.Codable, Swift.Equatable {
- case glob(pattern: ProjectDescription.Path)
- case folderReference(path: ProjectDescription.Path)
- public static func == (a: ProjectDescription.FileElement, b: ProjectDescription.FileElement) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.FileElement : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension Swift.Array : Swift.ExpressibleByUnicodeScalarLiteral where Element == ProjectDescription.FileElement {
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension Swift.Array : Swift.ExpressibleByExtendedGraphemeClusterLiteral where Element == ProjectDescription.FileElement {
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
-}
-extension Swift.Array : Swift.ExpressibleByStringLiteral where Element == ProjectDescription.FileElement {
- public typealias StringLiteralType = Swift.String
- public init(stringLiteral value: Swift.String)
-}
-public enum FileHeaderTemplate : Swift.Codable, Swift.Equatable, Swift.ExpressibleByStringInterpolation {
- case file(ProjectDescription.Path)
- case string(Swift.String)
- public init(stringLiteral value: Swift.String)
- public static func == (a: ProjectDescription.FileHeaderTemplate, b: ProjectDescription.FileHeaderTemplate) -> Swift.Bool
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct FileList : Swift.Codable, Swift.Equatable {
- public let globs: [ProjectDescription.FileListGlob]
- public static func list(_ globs: [ProjectDescription.FileListGlob]) -> ProjectDescription.FileList
- public static func == (a: ProjectDescription.FileList, b: ProjectDescription.FileList) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.FileList : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.FileList : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: Swift.String...)
- public typealias ArrayLiteralElement = Swift.String
-}
-public struct FileListGlob : Swift.Codable, Swift.Equatable {
- public var glob: ProjectDescription.Path
- public var excluding: [ProjectDescription.Path]
- public static func glob(_ glob: ProjectDescription.Path, excluding: [ProjectDescription.Path] = []) -> ProjectDescription.FileListGlob
- public static func glob(_ glob: ProjectDescription.Path, excluding: ProjectDescription.Path?) -> ProjectDescription.FileListGlob
- public static func == (a: ProjectDescription.FileListGlob, b: ProjectDescription.FileListGlob) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.FileListGlob : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-public struct Headers : Swift.Codable, Swift.Equatable {
- public enum AutomaticExclusionRule : Swift.Int, Swift.Codable {
- case projectExcludesPrivateAndPublic
- case publicExcludesPrivateAndProject
- public init?(rawValue: Swift.Int)
- public typealias RawValue = Swift.Int
- public var rawValue: Swift.Int {
- get
- }
- }
- public let umbrellaHeader: ProjectDescription.Path?
- public let `public`: ProjectDescription.FileList?
- public let `private`: ProjectDescription.FileList?
- public let project: ProjectDescription.FileList?
- public let exclusionRule: ProjectDescription.Headers.AutomaticExclusionRule
- public static func headers(public: ProjectDescription.FileList? = nil, private: ProjectDescription.FileList? = nil, project: ProjectDescription.FileList? = nil, exclusionRule: ProjectDescription.Headers.AutomaticExclusionRule = .projectExcludesPrivateAndPublic) -> ProjectDescription.Headers
- public static func allHeaders(from list: ProjectDescription.FileList, umbrella: ProjectDescription.Path, private privateHeaders: ProjectDescription.FileList? = nil) -> ProjectDescription.Headers
- public static func onlyHeaders(from list: ProjectDescription.FileList, umbrella: ProjectDescription.Path, private privateHeaders: ProjectDescription.FileList? = nil) -> ProjectDescription.Headers
- public static func == (a: ProjectDescription.Headers, b: ProjectDescription.Headers) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum InfoPlist : Swift.Codable, Swift.Equatable {
- indirect public enum Value : Swift.Codable, Swift.Equatable {
- case string(Swift.String)
- case integer(Swift.Int)
- case real(Swift.Double)
- case boolean(Swift.Bool)
- case dictionary([Swift.String : ProjectDescription.InfoPlist.Value])
- case array([ProjectDescription.InfoPlist.Value])
- public static func == (a: ProjectDescription.InfoPlist.Value, b: ProjectDescription.InfoPlist.Value) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- case file(path: ProjectDescription.Path)
- case dictionary([Swift.String : ProjectDescription.InfoPlist.Value])
- case extendingDefault(with: [Swift.String : ProjectDescription.InfoPlist.Value])
- public static var `default`: ProjectDescription.InfoPlist {
- get
- }
- public enum CodingError : Swift.Error {
- case invalidType(Swift.String)
- }
- public var path: ProjectDescription.Path? {
- get
- }
- public static func == (a: ProjectDescription.InfoPlist, b: ProjectDescription.InfoPlist) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.InfoPlist : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByIntegerLiteral {
- public init(integerLiteral value: Swift.Int)
- public typealias IntegerLiteralType = Swift.Int
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByFloatLiteral {
- public init(floatLiteral value: Swift.Double)
- public typealias FloatLiteralType = Swift.Double
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByBooleanLiteral {
- public init(booleanLiteral value: Swift.Bool)
- public typealias BooleanLiteralType = Swift.Bool
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByDictionaryLiteral {
- public init(dictionaryLiteral elements: (Swift.String, ProjectDescription.InfoPlist.Value)...)
- public typealias Key = Swift.String
- public typealias Value = ProjectDescription.InfoPlist.Value
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: ProjectDescription.InfoPlist.Value...)
- public typealias ArrayLiteralElement = ProjectDescription.InfoPlist.Value
-}
-public struct LaunchArgument : Swift.Equatable, Swift.Codable {
- public let name: Swift.String
- public let isEnabled: Swift.Bool
- public init(name: Swift.String, isEnabled: Swift.Bool)
- public static func == (a: ProjectDescription.LaunchArgument, b: ProjectDescription.LaunchArgument) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum Package : Swift.Equatable, Swift.Codable {
- case remote(url: Swift.String, requirement: ProjectDescription.Package.Requirement)
- case local(path: ProjectDescription.Path)
- public static func == (a: ProjectDescription.Package, b: ProjectDescription.Package) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Package {
- public enum Requirement : Swift.Codable, Swift.Equatable {
- case upToNextMajor(from: ProjectDescription.Version)
- case upToNextMinor(from: ProjectDescription.Version)
- case range(from: ProjectDescription.Version, to: ProjectDescription.Version)
- case exact(ProjectDescription.Version)
- case branch(Swift.String)
- case revision(Swift.String)
- public static func == (a: ProjectDescription.Package.Requirement, b: ProjectDescription.Package.Requirement) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-extension ProjectDescription.Package {
- public static func package(url: Swift.String, from version: ProjectDescription.Version) -> ProjectDescription.Package
- public static func package(url: Swift.String, _ requirement: ProjectDescription.Package.Requirement) -> ProjectDescription.Package
- public static func package(url: Swift.String, _ range: Swift.Range) -> ProjectDescription.Package
- public static func package(url: Swift.String, _ range: Swift.ClosedRange) -> ProjectDescription.Package
- public static func package(path: ProjectDescription.Path) -> ProjectDescription.Package
-}
-extension ProjectDescription.Package {
- @available(*, unavailable, message: "use package(url:_:) with the .exact(Version) initializer instead")
- public static func package(url _: Swift.String, version _: ProjectDescription.Version) -> ProjectDescription.Package
- @available(*, unavailable, message: "use package(url:_:) with the .branch(String) initializer instead")
- public static func package(url _: Swift.String, branch _: Swift.String) -> ProjectDescription.Package
- @available(*, unavailable, message: "use package(url:_:) with the .revision(String) initializer instead")
- public static func package(url _: Swift.String, revision _: Swift.String) -> ProjectDescription.Package
- @available(*, unavailable, message: "use package(url:_:) without the range label instead")
- public static func package(url _: Swift.String, range _: Swift.Range) -> ProjectDescription.Package
-}
-public struct Path : Swift.ExpressibleByStringInterpolation, Swift.Codable, Swift.Hashable {
- public enum PathType : Swift.String, Swift.Codable {
- case relativeToCurrentFile
- case relativeToManifest
- case relativeToRoot
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public let type: ProjectDescription.Path.PathType
- public let pathString: Swift.String
- public let callerPath: Swift.String?
- public init(_ path: Swift.String)
- public static func relativeToCurrentFile(_ pathString: Swift.String, callerPath: Swift.StaticString = #file) -> ProjectDescription.Path
- public static func relativeToManifest(_ pathString: Swift.String) -> ProjectDescription.Path
- public static func relativeToRoot(_ pathString: Swift.String) -> ProjectDescription.Path
- public init(stringLiteral: Swift.String)
- public static func == (a: ProjectDescription.Path, b: ProjectDescription.Path) -> Swift.Bool
- public func hash(into hasher: inout Swift.Hasher)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public var hashValue: Swift.Int {
- get
- }
- public init(from decoder: Swift.Decoder) throws
-}
-public enum Platform : Swift.String, Swift.Codable, Swift.Equatable, Swift.CaseIterable {
- case iOS
- case macOS
- case watchOS
- case tvOS
- public init?(rawValue: Swift.String)
- public typealias AllCases = [ProjectDescription.Platform]
- public typealias RawValue = Swift.String
- public static var allCases: [ProjectDescription.Platform] {
- get
- }
- public var rawValue: Swift.String {
- get
- }
-}
-public struct Plugin : Swift.Codable, Swift.Equatable {
- public let name: Swift.String
- public init(name: Swift.String)
- public static func == (a: ProjectDescription.Plugin, b: ProjectDescription.Plugin) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct PluginLocation : Swift.Codable, Swift.Equatable {
- public let type: ProjectDescription.PluginLocation.LocationType
- public static func local(path: ProjectDescription.Path) -> ProjectDescription.PluginLocation
- public static func git(url: Swift.String, tag: Swift.String, directory: Swift.String? = nil) -> ProjectDescription.PluginLocation
- public static func git(url: Swift.String, sha: Swift.String, directory: Swift.String? = nil) -> ProjectDescription.PluginLocation
- public static func == (a: ProjectDescription.PluginLocation, b: ProjectDescription.PluginLocation) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.PluginLocation {
- public enum LocationType : Swift.Codable, Swift.Equatable {
- case local(path: ProjectDescription.Path)
- case gitWithTag(url: Swift.String, tag: Swift.String, directory: Swift.String?)
- case gitWithSha(url: Swift.String, sha: Swift.String, directory: Swift.String?)
- public static func == (a: ProjectDescription.PluginLocation.LocationType, b: ProjectDescription.PluginLocation.LocationType) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-public enum Product : Swift.String, Swift.Codable, Swift.Equatable {
- case app
- case staticLibrary
- case dynamicLibrary
- case framework
- case staticFramework
- case unitTests
- case uiTests
- case bundle
- case commandLineTool
- case appClip
- case appExtension
- case watch2App
- case watch2Extension
- case tvTopShelfExtension
- case messagesExtension
- case stickerPackExtension
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public struct ProfileAction : Swift.Equatable, Swift.Codable {
- public let configuration: ProjectDescription.ConfigurationName
- public let preActions: [ProjectDescription.ExecutionAction]
- public let postActions: [ProjectDescription.ExecutionAction]
- public let executable: ProjectDescription.TargetReference?
- public let arguments: ProjectDescription.Arguments?
- public static func profileAction(configuration: ProjectDescription.ConfigurationName = .release, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], executable: ProjectDescription.TargetReference? = nil, arguments: ProjectDescription.Arguments? = nil) -> ProjectDescription.ProfileAction
- public static func == (a: ProjectDescription.ProfileAction, b: ProjectDescription.ProfileAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Project : Swift.Codable, Swift.Equatable {
- public let name: Swift.String
- public let organizationName: Swift.String?
- public let options: ProjectDescription.Project.Options
- public let packages: [ProjectDescription.Package]
- public let targets: [ProjectDescription.Target]
- public let schemes: [ProjectDescription.Scheme]
- public let settings: ProjectDescription.Settings?
- public let fileHeaderTemplate: ProjectDescription.FileHeaderTemplate?
- public let additionalFiles: [ProjectDescription.FileElement]
- public let resourceSynthesizers: [ProjectDescription.ResourceSynthesizer]
- public init(name: Swift.String, organizationName: Swift.String? = nil, options: ProjectDescription.Project.Options = .options(), packages: [ProjectDescription.Package] = [], settings: ProjectDescription.Settings? = nil, targets: [ProjectDescription.Target] = [], schemes: [ProjectDescription.Scheme] = [], fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? = nil, additionalFiles: [ProjectDescription.FileElement] = [], resourceSynthesizers: [ProjectDescription.ResourceSynthesizer] = .default)
- public static func == (a: ProjectDescription.Project, b: ProjectDescription.Project) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Project {
- public struct Options : Swift.Codable, Swift.Equatable {
- public let automaticSchemesOptions: ProjectDescription.Project.Options.AutomaticSchemesOptions
- public let developmentRegion: Swift.String?
- public let disableBundleAccessors: Swift.Bool
- public let disableShowEnvironmentVarsInScriptPhases: Swift.Bool
- public let disableSynthesizedResourceAccessors: Swift.Bool
- public let textSettings: ProjectDescription.Project.Options.TextSettings
- public let xcodeProjectName: Swift.String?
- public static func options(automaticSchemesOptions: ProjectDescription.Project.Options.AutomaticSchemesOptions = .enabled(), developmentRegion: Swift.String? = nil, disableBundleAccessors: Swift.Bool = false, disableShowEnvironmentVarsInScriptPhases: Swift.Bool = false, disableSynthesizedResourceAccessors: Swift.Bool = false, textSettings: ProjectDescription.Project.Options.TextSettings = .textSettings(), xcodeProjectName: Swift.String? = nil) -> ProjectDescription.Project.Options
- public static func == (a: ProjectDescription.Project.Options, b: ProjectDescription.Project.Options) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-extension ProjectDescription.Project.Options {
- public enum AutomaticSchemesOptions : Swift.Codable, Swift.Equatable {
- public enum TargetSchemesGrouping : Swift.Codable, Swift.Equatable {
- case singleScheme
- case byNameSuffix(build: Swift.Set, test: Swift.Set, run: Swift.Set)
- case notGrouped
- public static func == (a: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping, b: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- case enabled(targetSchemesGrouping: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping = .byNameSuffix(
- build: ["Implementation", "Interface", "Mocks", "Testing"],
- test: ["Tests", "IntegrationTests", "UITests", "SnapshotTests"],
- run: ["App", "Demo"]
- ), codeCoverageEnabled: Swift.Bool = false, testingOptions: ProjectDescription.TestingOptions = [])
- case disabled
- public static func == (a: ProjectDescription.Project.Options.AutomaticSchemesOptions, b: ProjectDescription.Project.Options.AutomaticSchemesOptions) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public struct TextSettings : Swift.Codable, Swift.Equatable {
- public let usesTabs: Swift.Bool?
- public let indentWidth: Swift.UInt?
- public let tabWidth: Swift.UInt?
- public let wrapsLines: Swift.Bool?
- public static func textSettings(usesTabs: Swift.Bool? = nil, indentWidth: Swift.UInt? = nil, tabWidth: Swift.UInt? = nil, wrapsLines: Swift.Bool? = nil) -> ProjectDescription.Project.Options.TextSettings
- public static func == (a: ProjectDescription.Project.Options.TextSettings, b: ProjectDescription.Project.Options.TextSettings) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-public enum ResourceFileElement : Swift.Codable, Swift.Equatable {
- case glob(pattern: ProjectDescription.Path, excluding: [ProjectDescription.Path] = [], tags: [Swift.String] = [])
- case folderReference(path: ProjectDescription.Path, tags: [Swift.String] = [])
- public static func == (a: ProjectDescription.ResourceFileElement, b: ProjectDescription.ResourceFileElement) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.ResourceFileElement : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-public struct ResourceFileElements : Swift.Codable, Swift.Equatable {
- public let resources: [ProjectDescription.ResourceFileElement]
- public init(resources: [ProjectDescription.ResourceFileElement])
- public static func == (a: ProjectDescription.ResourceFileElements, b: ProjectDescription.ResourceFileElements) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.ResourceFileElements : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.ResourceFileElements : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: ProjectDescription.ResourceFileElement...)
- public typealias ArrayLiteralElement = ProjectDescription.ResourceFileElement
-}
-public struct ResourceSynthesizer : Swift.Codable, Swift.Equatable {
- public let templateType: ProjectDescription.ResourceSynthesizer.TemplateType
- public let parser: ProjectDescription.ResourceSynthesizer.Parser
- public let extensions: Swift.Set
- public enum TemplateType : Swift.Codable, Swift.Equatable {
- case plugin(name: Swift.String, resourceName: Swift.String)
- case defaultTemplate(resourceName: Swift.String)
- public static func == (a: ProjectDescription.ResourceSynthesizer.TemplateType, b: ProjectDescription.ResourceSynthesizer.TemplateType) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public enum Parser : Swift.String, Swift.Codable {
- case strings
- case assets
- case plists
- case fonts
- case coreData
- case interfaceBuilder
- case json
- case yaml
- case files
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public static func strings() -> ProjectDescription.ResourceSynthesizer
- public static func strings(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func assets() -> ProjectDescription.ResourceSynthesizer
- public static func assets(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func fonts() -> ProjectDescription.ResourceSynthesizer
- public static func fonts(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func plists() -> ProjectDescription.ResourceSynthesizer
- public static func plists(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func coreData(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func coreData() -> ProjectDescription.ResourceSynthesizer
- public static func interfaceBuilder(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func interfaceBuilder() -> ProjectDescription.ResourceSynthesizer
- public static func json(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func json() -> ProjectDescription.ResourceSynthesizer
- public static func yaml(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func yaml() -> ProjectDescription.ResourceSynthesizer
- public static func files(plugin: Swift.String, extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer
- public static func files(extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer
- public static func custom(plugin: Swift.String, parser: ProjectDescription.ResourceSynthesizer.Parser, extensions: Swift.Set, resourceName: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func custom(name: Swift.String, parser: ProjectDescription.ResourceSynthesizer.Parser, extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer
- public static func == (a: ProjectDescription.ResourceSynthesizer, b: ProjectDescription.ResourceSynthesizer) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension Swift.Array where Element == ProjectDescription.ResourceSynthesizer {
- public static var `default`: Swift.Array {
- get
- }
-}
-public struct RunAction : Swift.Equatable, Swift.Codable {
- public let configuration: ProjectDescription.ConfigurationName
- public let attachDebugger: Swift.Bool
- public let preActions: [ProjectDescription.ExecutionAction]
- public let postActions: [ProjectDescription.ExecutionAction]
- public let executable: ProjectDescription.TargetReference?
- public let arguments: ProjectDescription.Arguments?
- public let options: ProjectDescription.RunActionOptions
- public let diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption]
- public static func runAction(configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], executable: ProjectDescription.TargetReference? = nil, arguments: ProjectDescription.Arguments? = nil, options: ProjectDescription.RunActionOptions = .options(), diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] = [.mainThreadChecker]) -> ProjectDescription.RunAction
- public static func == (a: ProjectDescription.RunAction, b: ProjectDescription.RunAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct RunActionOptions : Swift.Equatable, Swift.Codable {
- public let language: ProjectDescription.SchemeLanguage?
- public let storeKitConfigurationPath: ProjectDescription.Path?
- public let simulatedLocation: ProjectDescription.RunActionOptions.SimulatedLocation?
- public let enableGPUFrameCaptureMode: ProjectDescription.RunActionOptions.GPUFrameCaptureMode
- public static func options(language: ProjectDescription.SchemeLanguage? = nil, storeKitConfigurationPath: ProjectDescription.Path? = nil, simulatedLocation: ProjectDescription.RunActionOptions.SimulatedLocation? = nil, enableGPUFrameCaptureMode: ProjectDescription.RunActionOptions.GPUFrameCaptureMode = GPUFrameCaptureMode.default) -> ProjectDescription.RunActionOptions
- public static func == (a: ProjectDescription.RunActionOptions, b: ProjectDescription.RunActionOptions) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.RunActionOptions {
- public struct SimulatedLocation : Swift.Codable, Swift.Equatable {
- public let identifier: Swift.String?
- public let gpxFile: ProjectDescription.Path?
- public static func custom(gpxFile: ProjectDescription.Path) -> ProjectDescription.RunActionOptions.SimulatedLocation
- public static var london: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var johannesburg: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var moscow: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var mumbai: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var tokyo: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var sydney: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var hongKong: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var honolulu: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var sanFrancisco: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var mexicoCity: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var newYork: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var rioDeJaneiro: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static func == (a: ProjectDescription.RunActionOptions.SimulatedLocation, b: ProjectDescription.RunActionOptions.SimulatedLocation) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-extension ProjectDescription.RunActionOptions {
- public enum GPUFrameCaptureMode : Swift.String, Swift.Codable, Swift.Equatable {
- case autoEnabled
- case metal
- case openGL
- case disabled
- public static var `default`: ProjectDescription.RunActionOptions.GPUFrameCaptureMode {
- get
- }
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
-}
-public struct Scheme : Swift.Equatable, Swift.Codable {
- public let name: Swift.String
- public let shared: Swift.Bool
- public let hidden: Swift.Bool
- public let buildAction: ProjectDescription.BuildAction?
- public let testAction: ProjectDescription.TestAction?
- public let runAction: ProjectDescription.RunAction?
- public let archiveAction: ProjectDescription.ArchiveAction?
- public let profileAction: ProjectDescription.ProfileAction?
- public let analyzeAction: ProjectDescription.AnalyzeAction?
- public init(name: Swift.String, shared: Swift.Bool = true, hidden: Swift.Bool = false, buildAction: ProjectDescription.BuildAction? = nil, testAction: ProjectDescription.TestAction? = nil, runAction: ProjectDescription.RunAction? = nil, archiveAction: ProjectDescription.ArchiveAction? = nil, profileAction: ProjectDescription.ProfileAction? = nil, analyzeAction: ProjectDescription.AnalyzeAction? = nil)
- public static func == (a: ProjectDescription.Scheme, b: ProjectDescription.Scheme) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum SchemeDiagnosticsOption : Swift.String, Swift.Equatable, Swift.Codable {
- case mainThreadChecker
- case performanceAntipatternChecker
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public struct SchemeLanguage : Swift.Codable, Swift.Equatable, Swift.ExpressibleByStringLiteral {
- public let identifier: Swift.String
- public init(identifier: Swift.String)
- public init(stringLiteral: Swift.String)
- public static func == (a: ProjectDescription.SchemeLanguage, b: ProjectDescription.SchemeLanguage) -> Swift.Bool
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.SchemeLanguage {
- public static var doubleLengthPseudoLanguage: ProjectDescription.SchemeLanguage {
- get
- }
- public static var rightToLeftPseudoLanguage: ProjectDescription.SchemeLanguage {
- get
- }
- public static var accentedPseudoLanguage: ProjectDescription.SchemeLanguage {
- get
- }
- public static var boundedStringPseudoLanguage: ProjectDescription.SchemeLanguage {
- get
- }
- public static var rightToLeftWithStringsPseudoLanguage: ProjectDescription.SchemeLanguage {
- get
- }
-}
-public typealias SettingsDictionary = [Swift.String : ProjectDescription.SettingValue]
-public enum SettingValue : Swift.ExpressibleByStringInterpolation, Swift.ExpressibleByArrayLiteral, Swift.ExpressibleByBooleanLiteral, Swift.Equatable, Swift.Codable {
- case string(Swift.String)
- case array([Swift.String])
- public init(stringLiteral value: Swift.String)
- public init(arrayLiteral elements: Swift.String...)
- public typealias BooleanLiteralType = Swift.Bool
- public init(booleanLiteral value: Swift.Bool)
- public init(_ stringRawRepresentable: T) where T : Swift.RawRepresentable, T.RawValue == Swift.String
- public static func == (a: ProjectDescription.SettingValue, b: ProjectDescription.SettingValue) -> Swift.Bool
- public typealias ArrayLiteralElement = Swift.String
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Configuration : Swift.Equatable, Swift.Codable {
- public enum Variant : Swift.String, Swift.Codable {
- case debug
- case release
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public let name: ProjectDescription.ConfigurationName
- public let variant: ProjectDescription.Configuration.Variant
- public let settings: ProjectDescription.SettingsDictionary
- public let xcconfig: ProjectDescription.Path?
- public static func debug(name: ProjectDescription.ConfigurationName, settings: ProjectDescription.SettingsDictionary = [:], xcconfig: ProjectDescription.Path? = nil) -> ProjectDescription.Configuration
- public static func release(name: ProjectDescription.ConfigurationName, settings: ProjectDescription.SettingsDictionary = [:], xcconfig: ProjectDescription.Path? = nil) -> ProjectDescription.Configuration
- public static func == (a: ProjectDescription.Configuration, b: ProjectDescription.Configuration) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum DefaultSettings : Swift.Codable, Swift.Equatable {
- case recommended(excluding: Swift.Set = [])
- case essential(excluding: Swift.Set = [])
- case none
- public static func == (a: ProjectDescription.DefaultSettings, b: ProjectDescription.DefaultSettings) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.DefaultSettings {
- public static var recommended: ProjectDescription.DefaultSettings {
- get
- }
- public static var essential: ProjectDescription.DefaultSettings {
- get
- }
-}
-public struct Settings : Swift.Equatable, Swift.Codable {
- public let base: ProjectDescription.SettingsDictionary
- public let configurations: [ProjectDescription.Configuration]
- public let defaultSettings: ProjectDescription.DefaultSettings
- public static func settings(base: ProjectDescription.SettingsDictionary = [:], debug: ProjectDescription.SettingsDictionary = [:], release: ProjectDescription.SettingsDictionary = [:], defaultSettings: ProjectDescription.DefaultSettings = .recommended) -> ProjectDescription.Settings
- public static func settings(base: ProjectDescription.SettingsDictionary = [:], configurations: [ProjectDescription.Configuration], defaultSettings: ProjectDescription.DefaultSettings = .recommended) -> ProjectDescription.Settings
- public static func == (a: ProjectDescription.Settings, b: ProjectDescription.Settings) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension Swift.Dictionary where Key == Swift.String, Value == ProjectDescription.SettingValue {
- public mutating func merge(_ other: ProjectDescription.SettingsDictionary)
- public func merging(_ other: ProjectDescription.SettingsDictionary) -> ProjectDescription.SettingsDictionary
-}
-public enum SwiftCompilationMode : Swift.String {
- case singlefile
- case wholemodule
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public enum DebugInformationFormat : Swift.String {
- case dwarf
- case dwarfWithDsym
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public enum SwiftOptimizationLevel : Swift.String {
- case o
- case oNone
- case oSize
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-extension Swift.Dictionary where Key == Swift.String, Value == ProjectDescription.SettingValue {
- public func manualCodeSigning(identity: Swift.String? = nil, provisioningProfileSpecifier: Swift.String? = nil) -> ProjectDescription.SettingsDictionary
- public func automaticCodeSigning(devTeam: Swift.String) -> ProjectDescription.SettingsDictionary
- public func codeSignIdentityAppleDevelopment() -> ProjectDescription.SettingsDictionary
- public func codeSignIdentity(_ identity: Swift.String) -> ProjectDescription.SettingsDictionary
- public func currentProjectVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary
- public func marketingVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary
- public func appleGenericVersioningSystem() -> ProjectDescription.SettingsDictionary
- public func versionInfo(_ version: Swift.String, prefix: Swift.String? = nil, suffix: Swift.String? = nil) -> ProjectDescription.SettingsDictionary
- public func swiftVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary
- public func otherSwiftFlags(_ flags: Swift.String...) -> ProjectDescription.SettingsDictionary
- public func swiftActiveCompilationConditions(_ conditions: Swift.String...) -> ProjectDescription.SettingsDictionary
- public func swiftCompilationMode(_ mode: ProjectDescription.SwiftCompilationMode) -> ProjectDescription.SettingsDictionary
- public func swiftOptimizationLevel(_ level: ProjectDescription.SwiftOptimizationLevel) -> ProjectDescription.SettingsDictionary
- public func swiftOptimizeObjectLifetimes(_ enabled: Swift.Bool) -> ProjectDescription.SettingsDictionary
- public func swiftObjcBridingHeaderPath(_ path: Swift.String) -> ProjectDescription.SettingsDictionary
- public func otherCFlags(_ flags: [Swift.String]) -> ProjectDescription.SettingsDictionary
- public func otherLinkerFlags(_ flags: [Swift.String]) -> ProjectDescription.SettingsDictionary
- public func bitcodeEnabled(_ enabled: Swift.Bool) -> ProjectDescription.SettingsDictionary
- public func debugInformationFormat(_ format: ProjectDescription.DebugInformationFormat) -> ProjectDescription.SettingsDictionary
-}
-public struct SourceFileGlob : Swift.Codable, Swift.Equatable {
- public let glob: ProjectDescription.Path
- public let excluding: [ProjectDescription.Path]
- public let compilerFlags: Swift.String?
- public let codeGen: ProjectDescription.FileCodeGen?
- public static func glob(_ glob: ProjectDescription.Path, excluding: [ProjectDescription.Path] = [], compilerFlags: Swift.String? = nil, codeGen: ProjectDescription.FileCodeGen? = nil) -> ProjectDescription.SourceFileGlob
- public static func glob(_ glob: ProjectDescription.Path, excluding: ProjectDescription.Path?, compilerFlags: Swift.String? = nil, codeGen: ProjectDescription.FileCodeGen? = nil) -> ProjectDescription.SourceFileGlob
- public static func == (a: ProjectDescription.SourceFileGlob, b: ProjectDescription.SourceFileGlob) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.SourceFileGlob : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-public struct SourceFilesList : Swift.Codable, Swift.Equatable {
- public let globs: [ProjectDescription.SourceFileGlob]
- public init(globs: [ProjectDescription.SourceFileGlob])
- public init(globs: [Swift.String])
- public static func paths(_ paths: [ProjectDescription.Path]) -> ProjectDescription.SourceFilesList
- public static func == (a: ProjectDescription.SourceFilesList, b: ProjectDescription.SourceFilesList) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.SourceFilesList : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.SourceFilesList : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: ProjectDescription.SourceFileGlob...)
- public typealias ArrayLiteralElement = ProjectDescription.SourceFileGlob
-}
-public struct Target : Swift.Codable, Swift.Equatable {
- public let name: Swift.String
- public let platform: ProjectDescription.Platform
- public let product: ProjectDescription.Product
- public let productName: Swift.String?
- public let bundleId: Swift.String
- public let deploymentTarget: ProjectDescription.DeploymentTarget?
- public let infoPlist: ProjectDescription.InfoPlist?
- public let sources: ProjectDescription.SourceFilesList?
- public let resources: ProjectDescription.ResourceFileElements?
- public let copyFiles: [ProjectDescription.CopyFilesAction]?
- public let headers: ProjectDescription.Headers?
- public let entitlements: ProjectDescription.Path?
- public let scripts: [ProjectDescription.TargetScript]
- public let dependencies: [ProjectDescription.TargetDependency]
- public let settings: ProjectDescription.Settings?
- public let coreDataModels: [ProjectDescription.CoreDataModel]
- public let environment: [Swift.String : Swift.String]
- public let launchArguments: [ProjectDescription.LaunchArgument]
- public let additionalFiles: [ProjectDescription.FileElement]
- public init(name: Swift.String, platform: ProjectDescription.Platform, product: ProjectDescription.Product, productName: Swift.String? = nil, bundleId: Swift.String, deploymentTarget: ProjectDescription.DeploymentTarget? = nil, infoPlist: ProjectDescription.InfoPlist? = .default, sources: ProjectDescription.SourceFilesList? = nil, resources: ProjectDescription.ResourceFileElements? = nil, copyFiles: [ProjectDescription.CopyFilesAction]? = nil, headers: ProjectDescription.Headers? = nil, entitlements: ProjectDescription.Path? = nil, scripts: [ProjectDescription.TargetScript] = [], dependencies: [ProjectDescription.TargetDependency] = [], settings: ProjectDescription.Settings? = nil, coreDataModels: [ProjectDescription.CoreDataModel] = [], environment: [Swift.String : Swift.String] = [:], launchArguments: [ProjectDescription.LaunchArgument] = [], additionalFiles: [ProjectDescription.FileElement] = [])
- public static func == (a: ProjectDescription.Target, b: ProjectDescription.Target) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum SDKStatus : Swift.String, Swift.Codable, Swift.Hashable {
- case required
- case optional
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public enum SDKType : Swift.String, Swift.Codable, Swift.Hashable {
- case library
- case framework
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public enum TargetDependency : Swift.Codable, Swift.Hashable {
- case target(name: Swift.String)
- case project(target: Swift.String, path: ProjectDescription.Path)
- case framework(path: ProjectDescription.Path)
- case library(path: ProjectDescription.Path, publicHeaders: ProjectDescription.Path, swiftModuleMap: ProjectDescription.Path?)
- case package(product: Swift.String)
- case sdk(name: Swift.String, type: ProjectDescription.SDKType, status: ProjectDescription.SDKStatus)
- case xcframework(path: ProjectDescription.Path)
- case xctest
- case external(name: Swift.String)
- public static func sdk(name: Swift.String, type: ProjectDescription.SDKType) -> ProjectDescription.TargetDependency
- public var typeName: Swift.String {
- get
- }
- public func hash(into hasher: inout Swift.Hasher)
- public static func == (a: ProjectDescription.TargetDependency, b: ProjectDescription.TargetDependency) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public var hashValue: Swift.Int {
- get
- }
- public init(from decoder: Swift.Decoder) throws
-}
-public struct TargetReference : Swift.Hashable, Swift.Codable, Swift.ExpressibleByStringInterpolation {
- public var projectPath: ProjectDescription.Path?
- public var targetName: Swift.String
- public init(projectPath: ProjectDescription.Path?, target: Swift.String)
- public init(stringLiteral value: Swift.String)
- public static func project(path: ProjectDescription.Path, target: Swift.String) -> ProjectDescription.TargetReference
- public func hash(into hasher: inout Swift.Hasher)
- public static func == (a: ProjectDescription.TargetReference, b: ProjectDescription.TargetReference) -> Swift.Bool
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public var hashValue: Swift.Int {
- get
- }
- public init(from decoder: Swift.Decoder) throws
-}
-public struct TargetScript : Swift.Codable, Swift.Equatable {
- public enum Order : Swift.String, Swift.Codable, Swift.Equatable {
- case pre
- case post
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public enum Script : Swift.Equatable, Swift.Codable {
- case tool(path: Swift.String, args: [Swift.String])
- case scriptPath(path: ProjectDescription.Path, args: [Swift.String])
- case embedded(Swift.String)
- public static func == (a: ProjectDescription.TargetScript.Script, b: ProjectDescription.TargetScript.Script) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public let name: Swift.String
- public let script: ProjectDescription.TargetScript.Script
- public let order: ProjectDescription.TargetScript.Order
- public let inputPaths: [ProjectDescription.Path]
- public let inputFileListPaths: [ProjectDescription.Path]
- public let outputPaths: [ProjectDescription.Path]
- public let outputFileListPaths: [ProjectDescription.Path]
- public let basedOnDependencyAnalysis: Swift.Bool?
- public let runForInstallBuildsOnly: Swift.Bool
- public let shellPath: Swift.String
- public static func pre(path: ProjectDescription.Path, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func pre(path: ProjectDescription.Path, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func post(path: ProjectDescription.Path, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func post(path: ProjectDescription.Path, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func pre(tool: Swift.String, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func pre(tool: Swift.String, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func post(tool: Swift.String, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func post(tool: Swift.String, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func pre(script: Swift.String, name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func post(script: Swift.String, name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func == (a: ProjectDescription.TargetScript, b: ProjectDescription.TargetScript) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Template : Swift.Codable, Swift.Equatable {
- public let description: Swift.String
- public let attributes: [ProjectDescription.Template.Attribute]
- public let items: [ProjectDescription.Template.Item]
- public init(description: Swift.String, attributes: [ProjectDescription.Template.Attribute] = [], items: [ProjectDescription.Template.Item] = [])
- public enum Contents : Swift.Codable, Swift.Equatable {
- case string(Swift.String)
- case file(ProjectDescription.Path)
- case directory(ProjectDescription.Path)
- public static func == (a: ProjectDescription.Template.Contents, b: ProjectDescription.Template.Contents) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public struct Item : Swift.Codable, Swift.Equatable {
- public let path: Swift.String
- public let contents: ProjectDescription.Template.Contents
- public init(path: Swift.String, contents: ProjectDescription.Template.Contents)
- public static func == (a: ProjectDescription.Template.Item, b: ProjectDescription.Template.Item) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public enum Attribute : Swift.Codable, Swift.Equatable {
- case required(Swift.String)
- case optional(Swift.String, default: Swift.String)
- public static func == (a: ProjectDescription.Template.Attribute, b: ProjectDescription.Template.Attribute) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public static func == (a: ProjectDescription.Template, b: ProjectDescription.Template) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Template.Item {
- public static func string(path: Swift.String, contents: Swift.String) -> ProjectDescription.Template.Item
- public static func file(path: Swift.String, templatePath: ProjectDescription.Path) -> ProjectDescription.Template.Item
- public static func directory(path: Swift.String, sourcePath: ProjectDescription.Path) -> ProjectDescription.Template.Item
-}
-extension Swift.DefaultStringInterpolation {
- public mutating func appendInterpolation(_ value: ProjectDescription.Template.Attribute)
-}
-public struct TemplateString : Swift.Encodable, Swift.Decodable, Swift.Equatable {
- public static func == (a: ProjectDescription.TemplateString, b: ProjectDescription.TemplateString) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.TemplateString : Swift.ExpressibleByStringLiteral {
- public init(stringLiteral: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.TemplateString : Swift.CustomStringConvertible {
- public var description: Swift.String {
- get
- }
-}
-extension ProjectDescription.TemplateString : Swift.ExpressibleByStringInterpolation {
- public init(stringInterpolation: ProjectDescription.TemplateString.StringInterpolation)
- public struct StringInterpolation : Swift.StringInterpolationProtocol {
- public init(literalCapacity _: Swift.Int, interpolationCount _: Swift.Int)
- public mutating func appendLiteral(_ literal: Swift.String)
- public mutating func appendInterpolation(_ token: ProjectDescription.TemplateString.Token)
- public typealias StringLiteralType = Swift.String
- }
-}
-extension ProjectDescription.TemplateString {
- public enum Token : Swift.String, Swift.Equatable {
- case projectName
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
-}
-public struct TestAction : Swift.Equatable, Swift.Codable {
- public let testPlans: [ProjectDescription.Path]?
- public let targets: [ProjectDescription.TestableTarget]
- public let arguments: ProjectDescription.Arguments?
- public let configuration: ProjectDescription.ConfigurationName
- public let attachDebugger: Swift.Bool
- public let expandVariableFromTarget: ProjectDescription.TargetReference?
- public let preActions: [ProjectDescription.ExecutionAction]
- public let postActions: [ProjectDescription.ExecutionAction]
- public let options: ProjectDescription.TestActionOptions
- public let diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption]
- public static func targets(_ targets: [ProjectDescription.TestableTarget], arguments: ProjectDescription.Arguments? = nil, configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, expandVariableFromTarget: ProjectDescription.TargetReference? = nil, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], options: ProjectDescription.TestActionOptions = .options(), diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] = [.mainThreadChecker]) -> ProjectDescription.TestAction
- public static func testPlans(_ testPlans: [ProjectDescription.Path], configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = []) -> ProjectDescription.TestAction
- public static func == (a: ProjectDescription.TestAction, b: ProjectDescription.TestAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct TestActionOptions : Swift.Equatable, Swift.Codable {
- public let language: ProjectDescription.SchemeLanguage?
- public let region: Swift.String?
- public let coverage: Swift.Bool
- public let codeCoverageTargets: [ProjectDescription.TargetReference]
- public static func options(language: ProjectDescription.SchemeLanguage? = nil, region: Swift.String? = nil, coverage: Swift.Bool = false, codeCoverageTargets: [ProjectDescription.TargetReference] = []) -> ProjectDescription.TestActionOptions
- public static func == (a: ProjectDescription.TestActionOptions, b: ProjectDescription.TestActionOptions) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct TestableTarget : Swift.Equatable, Swift.Codable, Swift.ExpressibleByStringInterpolation {
- public let target: ProjectDescription.TargetReference
- public let isSkipped: Swift.Bool
- public let isParallelizable: Swift.Bool
- public let isRandomExecutionOrdering: Swift.Bool
- public init(target: ProjectDescription.TargetReference, skipped: Swift.Bool = false, parallelizable: Swift.Bool = false, randomExecutionOrdering: Swift.Bool = false)
- public init(stringLiteral value: Swift.String)
- public static func == (a: ProjectDescription.TestableTarget, b: ProjectDescription.TestableTarget) -> Swift.Bool
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct TestingOptions : Swift.OptionSet, Swift.Codable, Swift.Equatable {
- public let rawValue: Swift.Int
- public init(rawValue: Swift.Int)
- public static let parallelizable: ProjectDescription.TestingOptions
- public static let randomExecutionOrdering: ProjectDescription.TestingOptions
- public typealias ArrayLiteralElement = ProjectDescription.TestingOptions
- public typealias Element = ProjectDescription.TestingOptions
- public typealias RawValue = Swift.Int
-}
-public struct Version : Swift.Hashable, Swift.Codable {
- public let major: Swift.Int
- public let minor: Swift.Int
- public let patch: Swift.Int
- public let prereleaseIdentifiers: [Swift.String]
- public let buildMetadataIdentifiers: [Swift.String]
- public init(_ major: Swift.Int, _ minor: Swift.Int, _ patch: Swift.Int, prereleaseIdentifiers: [Swift.String] = [], buildMetadataIdentifiers: [Swift.String] = [])
- public static func == (a: ProjectDescription.Version, b: ProjectDescription.Version) -> Swift.Bool
- public func hash(into hasher: inout Swift.Hasher)
- public func encode(to encoder: Swift.Encoder) throws
- public var hashValue: Swift.Int {
- get
- }
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Version : Swift.Comparable {
- public static func < (lhs: ProjectDescription.Version, rhs: ProjectDescription.Version) -> Swift.Bool
-}
-extension ProjectDescription.Version : Swift.CustomStringConvertible {
- public var description: Swift.String {
- get
- }
-}
-extension ProjectDescription.Version {
- public init?(string: Swift.String)
-}
-extension ProjectDescription.Version : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension Swift.ClosedRange where Bound == ProjectDescription.Version {
- public func contains(_: ProjectDescription.Version) -> Swift.Bool
-}
-extension Swift.Range where Bound == ProjectDescription.Version {
- public func contains(_: ProjectDescription.Version) -> Swift.Bool
-}
-extension Swift.Range where Bound == ProjectDescription.Version {
- public func contains(version: ProjectDescription.Version) -> Swift.Bool
-}
-public struct Workspace : Swift.Codable, Swift.Equatable {
- public let name: Swift.String
- public let projects: [ProjectDescription.Path]
- public let schemes: [ProjectDescription.Scheme]
- public let fileHeaderTemplate: ProjectDescription.FileHeaderTemplate?
- public let additionalFiles: [ProjectDescription.FileElement]
- public let generationOptions: ProjectDescription.Workspace.GenerationOptions
- public init(name: Swift.String, projects: [ProjectDescription.Path], schemes: [ProjectDescription.Scheme] = [], fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? = nil, additionalFiles: [ProjectDescription.FileElement] = [], generationOptions: ProjectDescription.Workspace.GenerationOptions = .options())
- public static func == (a: ProjectDescription.Workspace, b: ProjectDescription.Workspace) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Workspace {
- public struct GenerationOptions : Swift.Codable, Swift.Equatable {
- public enum AutogeneratedWorkspaceSchemes : Swift.Codable, Swift.Equatable {
- public enum CodeCoverageMode : Swift.Codable, Swift.Equatable {
- case all
- case relevant
- case targets([ProjectDescription.TargetReference])
- case disabled
- public static func == (a: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode, b: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- case disabled
- case enabled(codeCoverageMode: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode = .disabled, testingOptions: ProjectDescription.TestingOptions = [])
- public static func == (a: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes, b: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public let enableAutomaticXcodeSchemes: Swift.Bool?
- public let autogeneratedWorkspaceSchemes: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes
- public let lastXcodeUpgradeCheck: ProjectDescription.Version?
- public let renderMarkdownReadme: Swift.Bool
- public static func options(enableAutomaticXcodeSchemes: Swift.Bool? = false, autogeneratedWorkspaceSchemes: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes = .enabled(), lastXcodeUpgradeCheck: ProjectDescription.Version? = nil, renderMarkdownReadme: Swift.Bool = false) -> ProjectDescription.Workspace.GenerationOptions
- public static func == (a: ProjectDescription.Workspace.GenerationOptions, b: ProjectDescription.Workspace.GenerationOptions) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-extension ProjectDescription.Cloud.Option : Swift.Hashable {}
-extension ProjectDescription.Cloud.Option : Swift.RawRepresentable {}
-extension ProjectDescription.CopyFilesAction.Destination : Swift.Hashable {}
-extension ProjectDescription.CopyFilesAction.Destination : Swift.RawRepresentable {}
-extension ProjectDescription.FileCodeGen : Swift.Hashable {}
-extension ProjectDescription.FileCodeGen : Swift.RawRepresentable {}
-extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.Equatable {}
-extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.Hashable {}
-extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.RawRepresentable {}
-extension ProjectDescription.Path.PathType : Swift.Equatable {}
-extension ProjectDescription.Path.PathType : Swift.Hashable {}
-extension ProjectDescription.Path.PathType : Swift.RawRepresentable {}
-extension ProjectDescription.Platform : Swift.Hashable {}
-extension ProjectDescription.Platform : Swift.RawRepresentable {}
-extension ProjectDescription.Product : Swift.Hashable {}
-extension ProjectDescription.Product : Swift.RawRepresentable {}
-extension ProjectDescription.ResourceSynthesizer.Parser : Swift.Equatable {}
-extension ProjectDescription.ResourceSynthesizer.Parser : Swift.Hashable {}
-extension ProjectDescription.ResourceSynthesizer.Parser : Swift.RawRepresentable {}
-extension ProjectDescription.RunActionOptions.GPUFrameCaptureMode : Swift.Hashable {}
-extension ProjectDescription.RunActionOptions.GPUFrameCaptureMode : Swift.RawRepresentable {}
-extension ProjectDescription.SchemeDiagnosticsOption : Swift.Hashable {}
-extension ProjectDescription.SchemeDiagnosticsOption : Swift.RawRepresentable {}
-extension ProjectDescription.Configuration.Variant : Swift.Equatable {}
-extension ProjectDescription.Configuration.Variant : Swift.Hashable {}
-extension ProjectDescription.Configuration.Variant : Swift.RawRepresentable {}
-extension ProjectDescription.SwiftCompilationMode : Swift.Equatable {}
-extension ProjectDescription.SwiftCompilationMode : Swift.Hashable {}
-extension ProjectDescription.SwiftCompilationMode : Swift.RawRepresentable {}
-extension ProjectDescription.DebugInformationFormat : Swift.Equatable {}
-extension ProjectDescription.DebugInformationFormat : Swift.Hashable {}
-extension ProjectDescription.DebugInformationFormat : Swift.RawRepresentable {}
-extension ProjectDescription.SwiftOptimizationLevel : Swift.Equatable {}
-extension ProjectDescription.SwiftOptimizationLevel : Swift.Hashable {}
-extension ProjectDescription.SwiftOptimizationLevel : Swift.RawRepresentable {}
-extension ProjectDescription.SDKStatus : Swift.RawRepresentable {}
-extension ProjectDescription.SDKType : Swift.RawRepresentable {}
-extension ProjectDescription.TargetScript.Order : Swift.Hashable {}
-extension ProjectDescription.TargetScript.Order : Swift.RawRepresentable {}
-extension ProjectDescription.TemplateString.Token : Swift.Hashable {}
-extension ProjectDescription.TemplateString.Token : Swift.RawRepresentable {}
diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64-apple-macos.swiftmodule b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64-apple-macos.swiftmodule
deleted file mode 100644
index edc5f9da2..000000000
Binary files a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64-apple-macos.swiftmodule and /dev/null differ
diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64.swiftdoc b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64.swiftdoc
deleted file mode 100644
index c638986a6..000000000
Binary files a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64.swiftdoc and /dev/null differ
diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64.swiftinterface b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64.swiftinterface
deleted file mode 100644
index b59be5e68..000000000
--- a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64.swiftinterface
+++ /dev/null
@@ -1,1418 +0,0 @@
-// swift-interface-format-version: 1.0
-// swift-compiler-version: Apple Swift version 5.5.1 (swiftlang-1300.0.31.4 clang-1300.0.29.6)
-// swift-module-flags: -target x86_64-apple-macos11.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -module-name ProjectDescription
-import Foundation
-import Swift
-import _Concurrency
-public struct AnalyzeAction : Swift.Equatable, Swift.Codable {
- public let configuration: ProjectDescription.ConfigurationName
- public static func analyzeAction(configuration: ProjectDescription.ConfigurationName) -> ProjectDescription.AnalyzeAction
- public static func == (a: ProjectDescription.AnalyzeAction, b: ProjectDescription.AnalyzeAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct ArchiveAction : Swift.Equatable, Swift.Codable {
- public let configuration: ProjectDescription.ConfigurationName
- public let revealArchiveInOrganizer: Swift.Bool
- public let customArchiveName: Swift.String?
- public let preActions: [ProjectDescription.ExecutionAction]
- public let postActions: [ProjectDescription.ExecutionAction]
- public static func archiveAction(configuration: ProjectDescription.ConfigurationName, revealArchiveInOrganizer: Swift.Bool = true, customArchiveName: Swift.String? = nil, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = []) -> ProjectDescription.ArchiveAction
- public static func == (a: ProjectDescription.ArchiveAction, b: ProjectDescription.ArchiveAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Arguments : Swift.Equatable, Swift.Codable {
- public let environment: [Swift.String : Swift.String]
- public let launchArguments: [ProjectDescription.LaunchArgument]
- public init(environment: [Swift.String : Swift.String] = [:], launchArguments: [ProjectDescription.LaunchArgument] = [])
- public static func == (a: ProjectDescription.Arguments, b: ProjectDescription.Arguments) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct BuildAction : Swift.Equatable, Swift.Codable {
- public let targets: [ProjectDescription.TargetReference]
- public let preActions: [ProjectDescription.ExecutionAction]
- public let postActions: [ProjectDescription.ExecutionAction]
- public let runPostActionsOnFailure: Swift.Bool
- public init(targets: [ProjectDescription.TargetReference], preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], runPostActionsOnFailure: Swift.Bool = false)
- public static func buildAction(targets: [ProjectDescription.TargetReference], preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], runPostActionsOnFailure: Swift.Bool = false) -> ProjectDescription.BuildAction
- public static func == (a: ProjectDescription.BuildAction, b: ProjectDescription.BuildAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Cache : Swift.Codable, Swift.Equatable {
- public struct Profile : Swift.Codable, Swift.Equatable {
- public let name: Swift.String
- public let configuration: Swift.String
- public let device: Swift.String?
- public let os: Swift.String?
- public static func profile(name: Swift.String, configuration: Swift.String, device: Swift.String? = nil, os: Swift.String? = nil) -> ProjectDescription.Cache.Profile
- public static func == (a: ProjectDescription.Cache.Profile, b: ProjectDescription.Cache.Profile) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public let profiles: [ProjectDescription.Cache.Profile]
- public let path: ProjectDescription.Path?
- public static func cache(profiles: [ProjectDescription.Cache.Profile] = [], path: ProjectDescription.Path? = nil) -> ProjectDescription.Cache
- public static func == (a: ProjectDescription.Cache, b: ProjectDescription.Cache) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Cloud : Swift.Codable, Swift.Equatable {
- public enum Option : Swift.String, Swift.Codable, Swift.Equatable {
- case analytics
- case optional
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public let url: Swift.String
- public let projectId: Swift.String
- public let options: [ProjectDescription.Cloud.Option]
- public static func cloud(projectId: Swift.String, url: Swift.String, options: [ProjectDescription.Cloud.Option] = []) -> ProjectDescription.Cloud
- public static func == (a: ProjectDescription.Cloud, b: ProjectDescription.Cloud) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum CompatibleXcodeVersions : Swift.ExpressibleByArrayLiteral, Swift.ExpressibleByStringInterpolation, Swift.Codable, Swift.Equatable {
- case all
- case exact(ProjectDescription.Version)
- case upToNextMajor(ProjectDescription.Version)
- case upToNextMinor(ProjectDescription.Version)
- case list([ProjectDescription.CompatibleXcodeVersions])
- public init(arrayLiteral elements: [ProjectDescription.CompatibleXcodeVersions])
- public init(arrayLiteral elements: ProjectDescription.CompatibleXcodeVersions...)
- public init(stringLiteral value: Swift.String)
- public static func == (a: ProjectDescription.CompatibleXcodeVersions, b: ProjectDescription.CompatibleXcodeVersions) -> Swift.Bool
- public typealias ArrayLiteralElement = ProjectDescription.CompatibleXcodeVersions
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Config : Swift.Codable, Swift.Equatable {
- public let generationOptions: ProjectDescription.Config.GenerationOptions
- public let compatibleXcodeVersions: ProjectDescription.CompatibleXcodeVersions
- public let plugins: [ProjectDescription.PluginLocation]
- public let cloud: ProjectDescription.Cloud?
- public let cache: ProjectDescription.Cache?
- public let swiftVersion: ProjectDescription.Version?
- public init(compatibleXcodeVersions: ProjectDescription.CompatibleXcodeVersions = .all, cloud: ProjectDescription.Cloud? = nil, cache: ProjectDescription.Cache? = nil, swiftVersion: ProjectDescription.Version? = nil, plugins: [ProjectDescription.PluginLocation] = [], generationOptions: ProjectDescription.Config.GenerationOptions = .options())
- public static func == (a: ProjectDescription.Config, b: ProjectDescription.Config) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Config {
- public struct GenerationOptions : Swift.Codable, Swift.Equatable {
- public let resolveDependenciesWithSystemScm: Swift.Bool
- public let disablePackageVersionLocking: Swift.Bool
- public static func options(resolveDependenciesWithSystemScm: Swift.Bool = false, disablePackageVersionLocking: Swift.Bool = false) -> ProjectDescription.Config.GenerationOptions
- public static func == (a: ProjectDescription.Config.GenerationOptions, b: ProjectDescription.Config.GenerationOptions) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-public struct ConfigurationName : Swift.ExpressibleByStringLiteral, Swift.Codable, Swift.Equatable {
- public let rawValue: Swift.String
- public init(stringLiteral value: Swift.StringLiteralType)
- public static func configuration(_ name: Swift.String) -> ProjectDescription.ConfigurationName
- public static var debug: ProjectDescription.ConfigurationName {
- get
- }
- public static var release: ProjectDescription.ConfigurationName {
- get
- }
- public static func == (a: ProjectDescription.ConfigurationName, b: ProjectDescription.ConfigurationName) -> Swift.Bool
- public typealias ExtendedGraphemeClusterLiteralType = Swift.StringLiteralType
- public typealias StringLiteralType = Swift.StringLiteralType
- public typealias UnicodeScalarLiteralType = Swift.StringLiteralType
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct CopyFilesAction : Swift.Codable, Swift.Equatable {
- public var name: Swift.String
- public var destination: ProjectDescription.CopyFilesAction.Destination
- public var subpath: Swift.String?
- public var files: [ProjectDescription.FileElement]
- public enum Destination : Swift.String, Swift.Codable, Swift.Equatable {
- case absolutePath
- case productsDirectory
- case wrapper
- case executables
- case resources
- case javaResources
- case frameworks
- case sharedFrameworks
- case sharedSupport
- case plugins
- case other
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public static func productsDirectory(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func wrapper(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func executables(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func resources(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func javaResources(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func frameworks(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func sharedFrameworks(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func sharedSupport(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func plugins(name: Swift.String, subpath: Swift.String? = nil, files: [ProjectDescription.FileElement]) -> ProjectDescription.CopyFilesAction
- public static func == (a: ProjectDescription.CopyFilesAction, b: ProjectDescription.CopyFilesAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct CoreDataModel : Swift.Codable, Swift.Equatable {
- public let path: ProjectDescription.Path
- public let currentVersion: Swift.String?
- public init(_ path: ProjectDescription.Path, currentVersion: Swift.String? = nil)
- public static func == (a: ProjectDescription.CoreDataModel, b: ProjectDescription.CoreDataModel) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct CarthageDependencies : Swift.Codable, Swift.Equatable {
- public let dependencies: [ProjectDescription.CarthageDependencies.Dependency]
- public init(_ dependencies: [ProjectDescription.CarthageDependencies.Dependency])
- public static func == (a: ProjectDescription.CarthageDependencies, b: ProjectDescription.CarthageDependencies) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.CarthageDependencies : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: ProjectDescription.CarthageDependencies.Dependency...)
- public typealias ArrayLiteralElement = ProjectDescription.CarthageDependencies.Dependency
-}
-extension ProjectDescription.CarthageDependencies {
- public enum Dependency : Swift.Codable, Swift.Equatable {
- case github(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement)
- case git(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement)
- case binary(path: Swift.String, requirement: ProjectDescription.CarthageDependencies.Requirement)
- public static func == (a: ProjectDescription.CarthageDependencies.Dependency, b: ProjectDescription.CarthageDependencies.Dependency) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public enum Requirement : Swift.Codable, Swift.Equatable {
- case exact(ProjectDescription.Version)
- case upToNext(ProjectDescription.Version)
- case atLeast(ProjectDescription.Version)
- case branch(Swift.String)
- case revision(Swift.String)
- public static func == (a: ProjectDescription.CarthageDependencies.Requirement, b: ProjectDescription.CarthageDependencies.Requirement) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-public struct Dependencies : Swift.Codable, Swift.Equatable {
- public let carthage: ProjectDescription.CarthageDependencies?
- public let swiftPackageManager: ProjectDescription.SwiftPackageManagerDependencies?
- public let platforms: Swift.Set
- public init(carthage: ProjectDescription.CarthageDependencies? = nil, swiftPackageManager: ProjectDescription.SwiftPackageManagerDependencies? = nil, platforms: Swift.Set = Set(Platform.allCases))
- public static func == (a: ProjectDescription.Dependencies, b: ProjectDescription.Dependencies) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct SwiftPackageManagerDependencies : Swift.Codable, Swift.Equatable {
- public let packages: [ProjectDescription.Package]
- public let productTypes: [Swift.String : ProjectDescription.Product]
- public let baseSettings: ProjectDescription.Settings
- public let targetSettings: [Swift.String : ProjectDescription.SettingsDictionary]
- public let projectOptions: [Swift.String : ProjectDescription.Project.Options]
- public init(_ packages: [ProjectDescription.Package], productTypes: [Swift.String : ProjectDescription.Product] = [:], baseSettings: ProjectDescription.Settings = .settings(), targetSettings: [Swift.String : ProjectDescription.SettingsDictionary] = [:], projectOptions: [Swift.String : ProjectDescription.Project.Options] = [:])
- public static func == (a: ProjectDescription.SwiftPackageManagerDependencies, b: ProjectDescription.SwiftPackageManagerDependencies) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.SwiftPackageManagerDependencies : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: ProjectDescription.Package...)
- public typealias ArrayLiteralElement = ProjectDescription.Package
-}
-public struct DeploymentDevice : Swift.OptionSet, Swift.Codable, Swift.Hashable {
- public static let iphone: ProjectDescription.DeploymentDevice
- public static let ipad: ProjectDescription.DeploymentDevice
- public static let mac: ProjectDescription.DeploymentDevice
- public let rawValue: Swift.UInt
- public init(rawValue: Swift.UInt)
- public typealias ArrayLiteralElement = ProjectDescription.DeploymentDevice
- public typealias Element = ProjectDescription.DeploymentDevice
- public typealias RawValue = Swift.UInt
-}
-public enum DeploymentTarget : Swift.Codable, Swift.Hashable {
- case iOS(targetVersion: Swift.String, devices: ProjectDescription.DeploymentDevice)
- case macOS(targetVersion: Swift.String)
- case watchOS(targetVersion: Swift.String)
- case tvOS(targetVersion: Swift.String)
- public var targetVersion: Swift.String {
- get
- }
- public func hash(into hasher: inout Swift.Hasher)
- public static func == (a: ProjectDescription.DeploymentTarget, b: ProjectDescription.DeploymentTarget) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public var hashValue: Swift.Int {
- get
- }
- public init(from decoder: Swift.Decoder) throws
-}
-@dynamicMemberLookup public enum Environment {
- public enum Value : Swift.Equatable {
- case boolean(Swift.Bool)
- case string(Swift.String)
- public static func == (a: ProjectDescription.Environment.Value, b: ProjectDescription.Environment.Value) -> Swift.Bool
- }
- public static subscript(dynamicMember member: Swift.String) -> ProjectDescription.Environment.Value? {
- get
- }
-}
-extension Swift.Optional where Wrapped == ProjectDescription.Environment.Value {
- public func getString(default defaultString: Swift.String) -> Swift.String
- public func getBoolean(default defaultBoolean: Swift.Bool) -> Swift.Bool
-}
-public struct ExecutionAction : Swift.Equatable, Swift.Codable {
- public let title: Swift.String
- public let scriptText: Swift.String
- public let target: ProjectDescription.TargetReference?
- public init(title: Swift.String = "Run Script", scriptText: Swift.String, target: ProjectDescription.TargetReference? = nil)
- public static func == (a: ProjectDescription.ExecutionAction, b: ProjectDescription.ExecutionAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum FileCodeGen : Swift.String, Swift.Codable, Swift.Equatable {
- case `public`
- case `private`
- case project
- case disabled
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public enum FileElement : Swift.Codable, Swift.Equatable {
- case glob(pattern: ProjectDescription.Path)
- case folderReference(path: ProjectDescription.Path)
- public static func == (a: ProjectDescription.FileElement, b: ProjectDescription.FileElement) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.FileElement : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension Swift.Array : Swift.ExpressibleByUnicodeScalarLiteral where Element == ProjectDescription.FileElement {
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension Swift.Array : Swift.ExpressibleByExtendedGraphemeClusterLiteral where Element == ProjectDescription.FileElement {
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
-}
-extension Swift.Array : Swift.ExpressibleByStringLiteral where Element == ProjectDescription.FileElement {
- public typealias StringLiteralType = Swift.String
- public init(stringLiteral value: Swift.String)
-}
-public enum FileHeaderTemplate : Swift.Codable, Swift.Equatable, Swift.ExpressibleByStringInterpolation {
- case file(ProjectDescription.Path)
- case string(Swift.String)
- public init(stringLiteral value: Swift.String)
- public static func == (a: ProjectDescription.FileHeaderTemplate, b: ProjectDescription.FileHeaderTemplate) -> Swift.Bool
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct FileList : Swift.Codable, Swift.Equatable {
- public let globs: [ProjectDescription.FileListGlob]
- public static func list(_ globs: [ProjectDescription.FileListGlob]) -> ProjectDescription.FileList
- public static func == (a: ProjectDescription.FileList, b: ProjectDescription.FileList) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.FileList : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.FileList : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: Swift.String...)
- public typealias ArrayLiteralElement = Swift.String
-}
-public struct FileListGlob : Swift.Codable, Swift.Equatable {
- public var glob: ProjectDescription.Path
- public var excluding: [ProjectDescription.Path]
- public static func glob(_ glob: ProjectDescription.Path, excluding: [ProjectDescription.Path] = []) -> ProjectDescription.FileListGlob
- public static func glob(_ glob: ProjectDescription.Path, excluding: ProjectDescription.Path?) -> ProjectDescription.FileListGlob
- public static func == (a: ProjectDescription.FileListGlob, b: ProjectDescription.FileListGlob) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.FileListGlob : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-public struct Headers : Swift.Codable, Swift.Equatable {
- public enum AutomaticExclusionRule : Swift.Int, Swift.Codable {
- case projectExcludesPrivateAndPublic
- case publicExcludesPrivateAndProject
- public init?(rawValue: Swift.Int)
- public typealias RawValue = Swift.Int
- public var rawValue: Swift.Int {
- get
- }
- }
- public let umbrellaHeader: ProjectDescription.Path?
- public let `public`: ProjectDescription.FileList?
- public let `private`: ProjectDescription.FileList?
- public let project: ProjectDescription.FileList?
- public let exclusionRule: ProjectDescription.Headers.AutomaticExclusionRule
- public static func headers(public: ProjectDescription.FileList? = nil, private: ProjectDescription.FileList? = nil, project: ProjectDescription.FileList? = nil, exclusionRule: ProjectDescription.Headers.AutomaticExclusionRule = .projectExcludesPrivateAndPublic) -> ProjectDescription.Headers
- public static func allHeaders(from list: ProjectDescription.FileList, umbrella: ProjectDescription.Path, private privateHeaders: ProjectDescription.FileList? = nil) -> ProjectDescription.Headers
- public static func onlyHeaders(from list: ProjectDescription.FileList, umbrella: ProjectDescription.Path, private privateHeaders: ProjectDescription.FileList? = nil) -> ProjectDescription.Headers
- public static func == (a: ProjectDescription.Headers, b: ProjectDescription.Headers) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum InfoPlist : Swift.Codable, Swift.Equatable {
- indirect public enum Value : Swift.Codable, Swift.Equatable {
- case string(Swift.String)
- case integer(Swift.Int)
- case real(Swift.Double)
- case boolean(Swift.Bool)
- case dictionary([Swift.String : ProjectDescription.InfoPlist.Value])
- case array([ProjectDescription.InfoPlist.Value])
- public static func == (a: ProjectDescription.InfoPlist.Value, b: ProjectDescription.InfoPlist.Value) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- case file(path: ProjectDescription.Path)
- case dictionary([Swift.String : ProjectDescription.InfoPlist.Value])
- case extendingDefault(with: [Swift.String : ProjectDescription.InfoPlist.Value])
- public static var `default`: ProjectDescription.InfoPlist {
- get
- }
- public enum CodingError : Swift.Error {
- case invalidType(Swift.String)
- }
- public var path: ProjectDescription.Path? {
- get
- }
- public static func == (a: ProjectDescription.InfoPlist, b: ProjectDescription.InfoPlist) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.InfoPlist : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByIntegerLiteral {
- public init(integerLiteral value: Swift.Int)
- public typealias IntegerLiteralType = Swift.Int
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByFloatLiteral {
- public init(floatLiteral value: Swift.Double)
- public typealias FloatLiteralType = Swift.Double
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByBooleanLiteral {
- public init(booleanLiteral value: Swift.Bool)
- public typealias BooleanLiteralType = Swift.Bool
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByDictionaryLiteral {
- public init(dictionaryLiteral elements: (Swift.String, ProjectDescription.InfoPlist.Value)...)
- public typealias Key = Swift.String
- public typealias Value = ProjectDescription.InfoPlist.Value
-}
-extension ProjectDescription.InfoPlist.Value : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: ProjectDescription.InfoPlist.Value...)
- public typealias ArrayLiteralElement = ProjectDescription.InfoPlist.Value
-}
-public struct LaunchArgument : Swift.Equatable, Swift.Codable {
- public let name: Swift.String
- public let isEnabled: Swift.Bool
- public init(name: Swift.String, isEnabled: Swift.Bool)
- public static func == (a: ProjectDescription.LaunchArgument, b: ProjectDescription.LaunchArgument) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum Package : Swift.Equatable, Swift.Codable {
- case remote(url: Swift.String, requirement: ProjectDescription.Package.Requirement)
- case local(path: ProjectDescription.Path)
- public static func == (a: ProjectDescription.Package, b: ProjectDescription.Package) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Package {
- public enum Requirement : Swift.Codable, Swift.Equatable {
- case upToNextMajor(from: ProjectDescription.Version)
- case upToNextMinor(from: ProjectDescription.Version)
- case range(from: ProjectDescription.Version, to: ProjectDescription.Version)
- case exact(ProjectDescription.Version)
- case branch(Swift.String)
- case revision(Swift.String)
- public static func == (a: ProjectDescription.Package.Requirement, b: ProjectDescription.Package.Requirement) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-extension ProjectDescription.Package {
- public static func package(url: Swift.String, from version: ProjectDescription.Version) -> ProjectDescription.Package
- public static func package(url: Swift.String, _ requirement: ProjectDescription.Package.Requirement) -> ProjectDescription.Package
- public static func package(url: Swift.String, _ range: Swift.Range) -> ProjectDescription.Package
- public static func package(url: Swift.String, _ range: Swift.ClosedRange) -> ProjectDescription.Package
- public static func package(path: ProjectDescription.Path) -> ProjectDescription.Package
-}
-extension ProjectDescription.Package {
- @available(*, unavailable, message: "use package(url:_:) with the .exact(Version) initializer instead")
- public static func package(url _: Swift.String, version _: ProjectDescription.Version) -> ProjectDescription.Package
- @available(*, unavailable, message: "use package(url:_:) with the .branch(String) initializer instead")
- public static func package(url _: Swift.String, branch _: Swift.String) -> ProjectDescription.Package
- @available(*, unavailable, message: "use package(url:_:) with the .revision(String) initializer instead")
- public static func package(url _: Swift.String, revision _: Swift.String) -> ProjectDescription.Package
- @available(*, unavailable, message: "use package(url:_:) without the range label instead")
- public static func package(url _: Swift.String, range _: Swift.Range) -> ProjectDescription.Package
-}
-public struct Path : Swift.ExpressibleByStringInterpolation, Swift.Codable, Swift.Hashable {
- public enum PathType : Swift.String, Swift.Codable {
- case relativeToCurrentFile
- case relativeToManifest
- case relativeToRoot
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public let type: ProjectDescription.Path.PathType
- public let pathString: Swift.String
- public let callerPath: Swift.String?
- public init(_ path: Swift.String)
- public static func relativeToCurrentFile(_ pathString: Swift.String, callerPath: Swift.StaticString = #file) -> ProjectDescription.Path
- public static func relativeToManifest(_ pathString: Swift.String) -> ProjectDescription.Path
- public static func relativeToRoot(_ pathString: Swift.String) -> ProjectDescription.Path
- public init(stringLiteral: Swift.String)
- public static func == (a: ProjectDescription.Path, b: ProjectDescription.Path) -> Swift.Bool
- public func hash(into hasher: inout Swift.Hasher)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public var hashValue: Swift.Int {
- get
- }
- public init(from decoder: Swift.Decoder) throws
-}
-public enum Platform : Swift.String, Swift.Codable, Swift.Equatable, Swift.CaseIterable {
- case iOS
- case macOS
- case watchOS
- case tvOS
- public init?(rawValue: Swift.String)
- public typealias AllCases = [ProjectDescription.Platform]
- public typealias RawValue = Swift.String
- public static var allCases: [ProjectDescription.Platform] {
- get
- }
- public var rawValue: Swift.String {
- get
- }
-}
-public struct Plugin : Swift.Codable, Swift.Equatable {
- public let name: Swift.String
- public init(name: Swift.String)
- public static func == (a: ProjectDescription.Plugin, b: ProjectDescription.Plugin) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct PluginLocation : Swift.Codable, Swift.Equatable {
- public let type: ProjectDescription.PluginLocation.LocationType
- public static func local(path: ProjectDescription.Path) -> ProjectDescription.PluginLocation
- public static func git(url: Swift.String, tag: Swift.String, directory: Swift.String? = nil) -> ProjectDescription.PluginLocation
- public static func git(url: Swift.String, sha: Swift.String, directory: Swift.String? = nil) -> ProjectDescription.PluginLocation
- public static func == (a: ProjectDescription.PluginLocation, b: ProjectDescription.PluginLocation) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.PluginLocation {
- public enum LocationType : Swift.Codable, Swift.Equatable {
- case local(path: ProjectDescription.Path)
- case gitWithTag(url: Swift.String, tag: Swift.String, directory: Swift.String?)
- case gitWithSha(url: Swift.String, sha: Swift.String, directory: Swift.String?)
- public static func == (a: ProjectDescription.PluginLocation.LocationType, b: ProjectDescription.PluginLocation.LocationType) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-public enum Product : Swift.String, Swift.Codable, Swift.Equatable {
- case app
- case staticLibrary
- case dynamicLibrary
- case framework
- case staticFramework
- case unitTests
- case uiTests
- case bundle
- case commandLineTool
- case appClip
- case appExtension
- case watch2App
- case watch2Extension
- case tvTopShelfExtension
- case messagesExtension
- case stickerPackExtension
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public struct ProfileAction : Swift.Equatable, Swift.Codable {
- public let configuration: ProjectDescription.ConfigurationName
- public let preActions: [ProjectDescription.ExecutionAction]
- public let postActions: [ProjectDescription.ExecutionAction]
- public let executable: ProjectDescription.TargetReference?
- public let arguments: ProjectDescription.Arguments?
- public static func profileAction(configuration: ProjectDescription.ConfigurationName = .release, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], executable: ProjectDescription.TargetReference? = nil, arguments: ProjectDescription.Arguments? = nil) -> ProjectDescription.ProfileAction
- public static func == (a: ProjectDescription.ProfileAction, b: ProjectDescription.ProfileAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Project : Swift.Codable, Swift.Equatable {
- public let name: Swift.String
- public let organizationName: Swift.String?
- public let options: ProjectDescription.Project.Options
- public let packages: [ProjectDescription.Package]
- public let targets: [ProjectDescription.Target]
- public let schemes: [ProjectDescription.Scheme]
- public let settings: ProjectDescription.Settings?
- public let fileHeaderTemplate: ProjectDescription.FileHeaderTemplate?
- public let additionalFiles: [ProjectDescription.FileElement]
- public let resourceSynthesizers: [ProjectDescription.ResourceSynthesizer]
- public init(name: Swift.String, organizationName: Swift.String? = nil, options: ProjectDescription.Project.Options = .options(), packages: [ProjectDescription.Package] = [], settings: ProjectDescription.Settings? = nil, targets: [ProjectDescription.Target] = [], schemes: [ProjectDescription.Scheme] = [], fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? = nil, additionalFiles: [ProjectDescription.FileElement] = [], resourceSynthesizers: [ProjectDescription.ResourceSynthesizer] = .default)
- public static func == (a: ProjectDescription.Project, b: ProjectDescription.Project) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Project {
- public struct Options : Swift.Codable, Swift.Equatable {
- public let automaticSchemesOptions: ProjectDescription.Project.Options.AutomaticSchemesOptions
- public let developmentRegion: Swift.String?
- public let disableBundleAccessors: Swift.Bool
- public let disableShowEnvironmentVarsInScriptPhases: Swift.Bool
- public let disableSynthesizedResourceAccessors: Swift.Bool
- public let textSettings: ProjectDescription.Project.Options.TextSettings
- public let xcodeProjectName: Swift.String?
- public static func options(automaticSchemesOptions: ProjectDescription.Project.Options.AutomaticSchemesOptions = .enabled(), developmentRegion: Swift.String? = nil, disableBundleAccessors: Swift.Bool = false, disableShowEnvironmentVarsInScriptPhases: Swift.Bool = false, disableSynthesizedResourceAccessors: Swift.Bool = false, textSettings: ProjectDescription.Project.Options.TextSettings = .textSettings(), xcodeProjectName: Swift.String? = nil) -> ProjectDescription.Project.Options
- public static func == (a: ProjectDescription.Project.Options, b: ProjectDescription.Project.Options) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-extension ProjectDescription.Project.Options {
- public enum AutomaticSchemesOptions : Swift.Codable, Swift.Equatable {
- public enum TargetSchemesGrouping : Swift.Codable, Swift.Equatable {
- case singleScheme
- case byNameSuffix(build: Swift.Set, test: Swift.Set, run: Swift.Set)
- case notGrouped
- public static func == (a: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping, b: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- case enabled(targetSchemesGrouping: ProjectDescription.Project.Options.AutomaticSchemesOptions.TargetSchemesGrouping = .byNameSuffix(
- build: ["Implementation", "Interface", "Mocks", "Testing"],
- test: ["Tests", "IntegrationTests", "UITests", "SnapshotTests"],
- run: ["App", "Demo"]
- ), codeCoverageEnabled: Swift.Bool = false, testingOptions: ProjectDescription.TestingOptions = [])
- case disabled
- public static func == (a: ProjectDescription.Project.Options.AutomaticSchemesOptions, b: ProjectDescription.Project.Options.AutomaticSchemesOptions) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public struct TextSettings : Swift.Codable, Swift.Equatable {
- public let usesTabs: Swift.Bool?
- public let indentWidth: Swift.UInt?
- public let tabWidth: Swift.UInt?
- public let wrapsLines: Swift.Bool?
- public static func textSettings(usesTabs: Swift.Bool? = nil, indentWidth: Swift.UInt? = nil, tabWidth: Swift.UInt? = nil, wrapsLines: Swift.Bool? = nil) -> ProjectDescription.Project.Options.TextSettings
- public static func == (a: ProjectDescription.Project.Options.TextSettings, b: ProjectDescription.Project.Options.TextSettings) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-public enum ResourceFileElement : Swift.Codable, Swift.Equatable {
- case glob(pattern: ProjectDescription.Path, excluding: [ProjectDescription.Path] = [], tags: [Swift.String] = [])
- case folderReference(path: ProjectDescription.Path, tags: [Swift.String] = [])
- public static func == (a: ProjectDescription.ResourceFileElement, b: ProjectDescription.ResourceFileElement) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.ResourceFileElement : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-public struct ResourceFileElements : Swift.Codable, Swift.Equatable {
- public let resources: [ProjectDescription.ResourceFileElement]
- public init(resources: [ProjectDescription.ResourceFileElement])
- public static func == (a: ProjectDescription.ResourceFileElements, b: ProjectDescription.ResourceFileElements) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.ResourceFileElements : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.ResourceFileElements : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: ProjectDescription.ResourceFileElement...)
- public typealias ArrayLiteralElement = ProjectDescription.ResourceFileElement
-}
-public struct ResourceSynthesizer : Swift.Codable, Swift.Equatable {
- public let templateType: ProjectDescription.ResourceSynthesizer.TemplateType
- public let parser: ProjectDescription.ResourceSynthesizer.Parser
- public let extensions: Swift.Set
- public enum TemplateType : Swift.Codable, Swift.Equatable {
- case plugin(name: Swift.String, resourceName: Swift.String)
- case defaultTemplate(resourceName: Swift.String)
- public static func == (a: ProjectDescription.ResourceSynthesizer.TemplateType, b: ProjectDescription.ResourceSynthesizer.TemplateType) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public enum Parser : Swift.String, Swift.Codable {
- case strings
- case assets
- case plists
- case fonts
- case coreData
- case interfaceBuilder
- case json
- case yaml
- case files
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public static func strings() -> ProjectDescription.ResourceSynthesizer
- public static func strings(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func assets() -> ProjectDescription.ResourceSynthesizer
- public static func assets(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func fonts() -> ProjectDescription.ResourceSynthesizer
- public static func fonts(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func plists() -> ProjectDescription.ResourceSynthesizer
- public static func plists(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func coreData(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func coreData() -> ProjectDescription.ResourceSynthesizer
- public static func interfaceBuilder(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func interfaceBuilder() -> ProjectDescription.ResourceSynthesizer
- public static func json(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func json() -> ProjectDescription.ResourceSynthesizer
- public static func yaml(plugin: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func yaml() -> ProjectDescription.ResourceSynthesizer
- public static func files(plugin: Swift.String, extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer
- public static func files(extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer
- public static func custom(plugin: Swift.String, parser: ProjectDescription.ResourceSynthesizer.Parser, extensions: Swift.Set, resourceName: Swift.String) -> ProjectDescription.ResourceSynthesizer
- public static func custom(name: Swift.String, parser: ProjectDescription.ResourceSynthesizer.Parser, extensions: Swift.Set) -> ProjectDescription.ResourceSynthesizer
- public static func == (a: ProjectDescription.ResourceSynthesizer, b: ProjectDescription.ResourceSynthesizer) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension Swift.Array where Element == ProjectDescription.ResourceSynthesizer {
- public static var `default`: Swift.Array {
- get
- }
-}
-public struct RunAction : Swift.Equatable, Swift.Codable {
- public let configuration: ProjectDescription.ConfigurationName
- public let attachDebugger: Swift.Bool
- public let preActions: [ProjectDescription.ExecutionAction]
- public let postActions: [ProjectDescription.ExecutionAction]
- public let executable: ProjectDescription.TargetReference?
- public let arguments: ProjectDescription.Arguments?
- public let options: ProjectDescription.RunActionOptions
- public let diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption]
- public static func runAction(configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], executable: ProjectDescription.TargetReference? = nil, arguments: ProjectDescription.Arguments? = nil, options: ProjectDescription.RunActionOptions = .options(), diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] = [.mainThreadChecker]) -> ProjectDescription.RunAction
- public static func == (a: ProjectDescription.RunAction, b: ProjectDescription.RunAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct RunActionOptions : Swift.Equatable, Swift.Codable {
- public let language: ProjectDescription.SchemeLanguage?
- public let storeKitConfigurationPath: ProjectDescription.Path?
- public let simulatedLocation: ProjectDescription.RunActionOptions.SimulatedLocation?
- public let enableGPUFrameCaptureMode: ProjectDescription.RunActionOptions.GPUFrameCaptureMode
- public static func options(language: ProjectDescription.SchemeLanguage? = nil, storeKitConfigurationPath: ProjectDescription.Path? = nil, simulatedLocation: ProjectDescription.RunActionOptions.SimulatedLocation? = nil, enableGPUFrameCaptureMode: ProjectDescription.RunActionOptions.GPUFrameCaptureMode = GPUFrameCaptureMode.default) -> ProjectDescription.RunActionOptions
- public static func == (a: ProjectDescription.RunActionOptions, b: ProjectDescription.RunActionOptions) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.RunActionOptions {
- public struct SimulatedLocation : Swift.Codable, Swift.Equatable {
- public let identifier: Swift.String?
- public let gpxFile: ProjectDescription.Path?
- public static func custom(gpxFile: ProjectDescription.Path) -> ProjectDescription.RunActionOptions.SimulatedLocation
- public static var london: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var johannesburg: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var moscow: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var mumbai: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var tokyo: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var sydney: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var hongKong: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var honolulu: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var sanFrancisco: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var mexicoCity: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var newYork: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static var rioDeJaneiro: ProjectDescription.RunActionOptions.SimulatedLocation {
- get
- }
- public static func == (a: ProjectDescription.RunActionOptions.SimulatedLocation, b: ProjectDescription.RunActionOptions.SimulatedLocation) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-extension ProjectDescription.RunActionOptions {
- public enum GPUFrameCaptureMode : Swift.String, Swift.Codable, Swift.Equatable {
- case autoEnabled
- case metal
- case openGL
- case disabled
- public static var `default`: ProjectDescription.RunActionOptions.GPUFrameCaptureMode {
- get
- }
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
-}
-public struct Scheme : Swift.Equatable, Swift.Codable {
- public let name: Swift.String
- public let shared: Swift.Bool
- public let hidden: Swift.Bool
- public let buildAction: ProjectDescription.BuildAction?
- public let testAction: ProjectDescription.TestAction?
- public let runAction: ProjectDescription.RunAction?
- public let archiveAction: ProjectDescription.ArchiveAction?
- public let profileAction: ProjectDescription.ProfileAction?
- public let analyzeAction: ProjectDescription.AnalyzeAction?
- public init(name: Swift.String, shared: Swift.Bool = true, hidden: Swift.Bool = false, buildAction: ProjectDescription.BuildAction? = nil, testAction: ProjectDescription.TestAction? = nil, runAction: ProjectDescription.RunAction? = nil, archiveAction: ProjectDescription.ArchiveAction? = nil, profileAction: ProjectDescription.ProfileAction? = nil, analyzeAction: ProjectDescription.AnalyzeAction? = nil)
- public static func == (a: ProjectDescription.Scheme, b: ProjectDescription.Scheme) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum SchemeDiagnosticsOption : Swift.String, Swift.Equatable, Swift.Codable {
- case mainThreadChecker
- case performanceAntipatternChecker
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public struct SchemeLanguage : Swift.Codable, Swift.Equatable, Swift.ExpressibleByStringLiteral {
- public let identifier: Swift.String
- public init(identifier: Swift.String)
- public init(stringLiteral: Swift.String)
- public static func == (a: ProjectDescription.SchemeLanguage, b: ProjectDescription.SchemeLanguage) -> Swift.Bool
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.SchemeLanguage {
- public static var doubleLengthPseudoLanguage: ProjectDescription.SchemeLanguage {
- get
- }
- public static var rightToLeftPseudoLanguage: ProjectDescription.SchemeLanguage {
- get
- }
- public static var accentedPseudoLanguage: ProjectDescription.SchemeLanguage {
- get
- }
- public static var boundedStringPseudoLanguage: ProjectDescription.SchemeLanguage {
- get
- }
- public static var rightToLeftWithStringsPseudoLanguage: ProjectDescription.SchemeLanguage {
- get
- }
-}
-public typealias SettingsDictionary = [Swift.String : ProjectDescription.SettingValue]
-public enum SettingValue : Swift.ExpressibleByStringInterpolation, Swift.ExpressibleByArrayLiteral, Swift.ExpressibleByBooleanLiteral, Swift.Equatable, Swift.Codable {
- case string(Swift.String)
- case array([Swift.String])
- public init(stringLiteral value: Swift.String)
- public init(arrayLiteral elements: Swift.String...)
- public typealias BooleanLiteralType = Swift.Bool
- public init(booleanLiteral value: Swift.Bool)
- public init(_ stringRawRepresentable: T) where T : Swift.RawRepresentable, T.RawValue == Swift.String
- public static func == (a: ProjectDescription.SettingValue, b: ProjectDescription.SettingValue) -> Swift.Bool
- public typealias ArrayLiteralElement = Swift.String
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Configuration : Swift.Equatable, Swift.Codable {
- public enum Variant : Swift.String, Swift.Codable {
- case debug
- case release
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public let name: ProjectDescription.ConfigurationName
- public let variant: ProjectDescription.Configuration.Variant
- public let settings: ProjectDescription.SettingsDictionary
- public let xcconfig: ProjectDescription.Path?
- public static func debug(name: ProjectDescription.ConfigurationName, settings: ProjectDescription.SettingsDictionary = [:], xcconfig: ProjectDescription.Path? = nil) -> ProjectDescription.Configuration
- public static func release(name: ProjectDescription.ConfigurationName, settings: ProjectDescription.SettingsDictionary = [:], xcconfig: ProjectDescription.Path? = nil) -> ProjectDescription.Configuration
- public static func == (a: ProjectDescription.Configuration, b: ProjectDescription.Configuration) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum DefaultSettings : Swift.Codable, Swift.Equatable {
- case recommended(excluding: Swift.Set = [])
- case essential(excluding: Swift.Set = [])
- case none
- public static func == (a: ProjectDescription.DefaultSettings, b: ProjectDescription.DefaultSettings) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.DefaultSettings {
- public static var recommended: ProjectDescription.DefaultSettings {
- get
- }
- public static var essential: ProjectDescription.DefaultSettings {
- get
- }
-}
-public struct Settings : Swift.Equatable, Swift.Codable {
- public let base: ProjectDescription.SettingsDictionary
- public let configurations: [ProjectDescription.Configuration]
- public let defaultSettings: ProjectDescription.DefaultSettings
- public static func settings(base: ProjectDescription.SettingsDictionary = [:], debug: ProjectDescription.SettingsDictionary = [:], release: ProjectDescription.SettingsDictionary = [:], defaultSettings: ProjectDescription.DefaultSettings = .recommended) -> ProjectDescription.Settings
- public static func settings(base: ProjectDescription.SettingsDictionary = [:], configurations: [ProjectDescription.Configuration], defaultSettings: ProjectDescription.DefaultSettings = .recommended) -> ProjectDescription.Settings
- public static func == (a: ProjectDescription.Settings, b: ProjectDescription.Settings) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension Swift.Dictionary where Key == Swift.String, Value == ProjectDescription.SettingValue {
- public mutating func merge(_ other: ProjectDescription.SettingsDictionary)
- public func merging(_ other: ProjectDescription.SettingsDictionary) -> ProjectDescription.SettingsDictionary
-}
-public enum SwiftCompilationMode : Swift.String {
- case singlefile
- case wholemodule
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public enum DebugInformationFormat : Swift.String {
- case dwarf
- case dwarfWithDsym
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public enum SwiftOptimizationLevel : Swift.String {
- case o
- case oNone
- case oSize
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-extension Swift.Dictionary where Key == Swift.String, Value == ProjectDescription.SettingValue {
- public func manualCodeSigning(identity: Swift.String? = nil, provisioningProfileSpecifier: Swift.String? = nil) -> ProjectDescription.SettingsDictionary
- public func automaticCodeSigning(devTeam: Swift.String) -> ProjectDescription.SettingsDictionary
- public func codeSignIdentityAppleDevelopment() -> ProjectDescription.SettingsDictionary
- public func codeSignIdentity(_ identity: Swift.String) -> ProjectDescription.SettingsDictionary
- public func currentProjectVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary
- public func marketingVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary
- public func appleGenericVersioningSystem() -> ProjectDescription.SettingsDictionary
- public func versionInfo(_ version: Swift.String, prefix: Swift.String? = nil, suffix: Swift.String? = nil) -> ProjectDescription.SettingsDictionary
- public func swiftVersion(_ version: Swift.String) -> ProjectDescription.SettingsDictionary
- public func otherSwiftFlags(_ flags: Swift.String...) -> ProjectDescription.SettingsDictionary
- public func swiftActiveCompilationConditions(_ conditions: Swift.String...) -> ProjectDescription.SettingsDictionary
- public func swiftCompilationMode(_ mode: ProjectDescription.SwiftCompilationMode) -> ProjectDescription.SettingsDictionary
- public func swiftOptimizationLevel(_ level: ProjectDescription.SwiftOptimizationLevel) -> ProjectDescription.SettingsDictionary
- public func swiftOptimizeObjectLifetimes(_ enabled: Swift.Bool) -> ProjectDescription.SettingsDictionary
- public func swiftObjcBridingHeaderPath(_ path: Swift.String) -> ProjectDescription.SettingsDictionary
- public func otherCFlags(_ flags: [Swift.String]) -> ProjectDescription.SettingsDictionary
- public func otherLinkerFlags(_ flags: [Swift.String]) -> ProjectDescription.SettingsDictionary
- public func bitcodeEnabled(_ enabled: Swift.Bool) -> ProjectDescription.SettingsDictionary
- public func debugInformationFormat(_ format: ProjectDescription.DebugInformationFormat) -> ProjectDescription.SettingsDictionary
-}
-public struct SourceFileGlob : Swift.Codable, Swift.Equatable {
- public let glob: ProjectDescription.Path
- public let excluding: [ProjectDescription.Path]
- public let compilerFlags: Swift.String?
- public let codeGen: ProjectDescription.FileCodeGen?
- public static func glob(_ glob: ProjectDescription.Path, excluding: [ProjectDescription.Path] = [], compilerFlags: Swift.String? = nil, codeGen: ProjectDescription.FileCodeGen? = nil) -> ProjectDescription.SourceFileGlob
- public static func glob(_ glob: ProjectDescription.Path, excluding: ProjectDescription.Path?, compilerFlags: Swift.String? = nil, codeGen: ProjectDescription.FileCodeGen? = nil) -> ProjectDescription.SourceFileGlob
- public static func == (a: ProjectDescription.SourceFileGlob, b: ProjectDescription.SourceFileGlob) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.SourceFileGlob : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-public struct SourceFilesList : Swift.Codable, Swift.Equatable {
- public let globs: [ProjectDescription.SourceFileGlob]
- public init(globs: [ProjectDescription.SourceFileGlob])
- public init(globs: [Swift.String])
- public static func paths(_ paths: [ProjectDescription.Path]) -> ProjectDescription.SourceFilesList
- public static func == (a: ProjectDescription.SourceFilesList, b: ProjectDescription.SourceFilesList) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.SourceFilesList : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.SourceFilesList : Swift.ExpressibleByArrayLiteral {
- public init(arrayLiteral elements: ProjectDescription.SourceFileGlob...)
- public typealias ArrayLiteralElement = ProjectDescription.SourceFileGlob
-}
-public struct Target : Swift.Codable, Swift.Equatable {
- public let name: Swift.String
- public let platform: ProjectDescription.Platform
- public let product: ProjectDescription.Product
- public let productName: Swift.String?
- public let bundleId: Swift.String
- public let deploymentTarget: ProjectDescription.DeploymentTarget?
- public let infoPlist: ProjectDescription.InfoPlist?
- public let sources: ProjectDescription.SourceFilesList?
- public let resources: ProjectDescription.ResourceFileElements?
- public let copyFiles: [ProjectDescription.CopyFilesAction]?
- public let headers: ProjectDescription.Headers?
- public let entitlements: ProjectDescription.Path?
- public let scripts: [ProjectDescription.TargetScript]
- public let dependencies: [ProjectDescription.TargetDependency]
- public let settings: ProjectDescription.Settings?
- public let coreDataModels: [ProjectDescription.CoreDataModel]
- public let environment: [Swift.String : Swift.String]
- public let launchArguments: [ProjectDescription.LaunchArgument]
- public let additionalFiles: [ProjectDescription.FileElement]
- public init(name: Swift.String, platform: ProjectDescription.Platform, product: ProjectDescription.Product, productName: Swift.String? = nil, bundleId: Swift.String, deploymentTarget: ProjectDescription.DeploymentTarget? = nil, infoPlist: ProjectDescription.InfoPlist? = .default, sources: ProjectDescription.SourceFilesList? = nil, resources: ProjectDescription.ResourceFileElements? = nil, copyFiles: [ProjectDescription.CopyFilesAction]? = nil, headers: ProjectDescription.Headers? = nil, entitlements: ProjectDescription.Path? = nil, scripts: [ProjectDescription.TargetScript] = [], dependencies: [ProjectDescription.TargetDependency] = [], settings: ProjectDescription.Settings? = nil, coreDataModels: [ProjectDescription.CoreDataModel] = [], environment: [Swift.String : Swift.String] = [:], launchArguments: [ProjectDescription.LaunchArgument] = [], additionalFiles: [ProjectDescription.FileElement] = [])
- public static func == (a: ProjectDescription.Target, b: ProjectDescription.Target) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public enum SDKStatus : Swift.String, Swift.Codable, Swift.Hashable {
- case required
- case optional
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public enum SDKType : Swift.String, Swift.Codable, Swift.Hashable {
- case library
- case framework
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
-}
-public enum TargetDependency : Swift.Codable, Swift.Hashable {
- case target(name: Swift.String)
- case project(target: Swift.String, path: ProjectDescription.Path)
- case framework(path: ProjectDescription.Path)
- case library(path: ProjectDescription.Path, publicHeaders: ProjectDescription.Path, swiftModuleMap: ProjectDescription.Path?)
- case package(product: Swift.String)
- case sdk(name: Swift.String, type: ProjectDescription.SDKType, status: ProjectDescription.SDKStatus)
- case xcframework(path: ProjectDescription.Path)
- case xctest
- case external(name: Swift.String)
- public static func sdk(name: Swift.String, type: ProjectDescription.SDKType) -> ProjectDescription.TargetDependency
- public var typeName: Swift.String {
- get
- }
- public func hash(into hasher: inout Swift.Hasher)
- public static func == (a: ProjectDescription.TargetDependency, b: ProjectDescription.TargetDependency) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public var hashValue: Swift.Int {
- get
- }
- public init(from decoder: Swift.Decoder) throws
-}
-public struct TargetReference : Swift.Hashable, Swift.Codable, Swift.ExpressibleByStringInterpolation {
- public var projectPath: ProjectDescription.Path?
- public var targetName: Swift.String
- public init(projectPath: ProjectDescription.Path?, target: Swift.String)
- public init(stringLiteral value: Swift.String)
- public static func project(path: ProjectDescription.Path, target: Swift.String) -> ProjectDescription.TargetReference
- public func hash(into hasher: inout Swift.Hasher)
- public static func == (a: ProjectDescription.TargetReference, b: ProjectDescription.TargetReference) -> Swift.Bool
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public var hashValue: Swift.Int {
- get
- }
- public init(from decoder: Swift.Decoder) throws
-}
-public struct TargetScript : Swift.Codable, Swift.Equatable {
- public enum Order : Swift.String, Swift.Codable, Swift.Equatable {
- case pre
- case post
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
- public enum Script : Swift.Equatable, Swift.Codable {
- case tool(path: Swift.String, args: [Swift.String])
- case scriptPath(path: ProjectDescription.Path, args: [Swift.String])
- case embedded(Swift.String)
- public static func == (a: ProjectDescription.TargetScript.Script, b: ProjectDescription.TargetScript.Script) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public let name: Swift.String
- public let script: ProjectDescription.TargetScript.Script
- public let order: ProjectDescription.TargetScript.Order
- public let inputPaths: [ProjectDescription.Path]
- public let inputFileListPaths: [ProjectDescription.Path]
- public let outputPaths: [ProjectDescription.Path]
- public let outputFileListPaths: [ProjectDescription.Path]
- public let basedOnDependencyAnalysis: Swift.Bool?
- public let runForInstallBuildsOnly: Swift.Bool
- public let shellPath: Swift.String
- public static func pre(path: ProjectDescription.Path, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func pre(path: ProjectDescription.Path, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func post(path: ProjectDescription.Path, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func post(path: ProjectDescription.Path, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func pre(tool: Swift.String, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func pre(tool: Swift.String, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func post(tool: Swift.String, arguments: Swift.String..., name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func post(tool: Swift.String, arguments: [Swift.String], name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func pre(script: Swift.String, name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func post(script: Swift.String, name: Swift.String, inputPaths: [ProjectDescription.Path] = [], inputFileListPaths: [ProjectDescription.Path] = [], outputPaths: [ProjectDescription.Path] = [], outputFileListPaths: [ProjectDescription.Path] = [], basedOnDependencyAnalysis: Swift.Bool? = nil, runForInstallBuildsOnly: Swift.Bool = false, shellPath: Swift.String = "/bin/sh") -> ProjectDescription.TargetScript
- public static func == (a: ProjectDescription.TargetScript, b: ProjectDescription.TargetScript) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct Template : Swift.Codable, Swift.Equatable {
- public let description: Swift.String
- public let attributes: [ProjectDescription.Template.Attribute]
- public let items: [ProjectDescription.Template.Item]
- public init(description: Swift.String, attributes: [ProjectDescription.Template.Attribute] = [], items: [ProjectDescription.Template.Item] = [])
- public enum Contents : Swift.Codable, Swift.Equatable {
- case string(Swift.String)
- case file(ProjectDescription.Path)
- case directory(ProjectDescription.Path)
- public static func == (a: ProjectDescription.Template.Contents, b: ProjectDescription.Template.Contents) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public struct Item : Swift.Codable, Swift.Equatable {
- public let path: Swift.String
- public let contents: ProjectDescription.Template.Contents
- public init(path: Swift.String, contents: ProjectDescription.Template.Contents)
- public static func == (a: ProjectDescription.Template.Item, b: ProjectDescription.Template.Item) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public enum Attribute : Swift.Codable, Swift.Equatable {
- case required(Swift.String)
- case optional(Swift.String, default: Swift.String)
- public static func == (a: ProjectDescription.Template.Attribute, b: ProjectDescription.Template.Attribute) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public static func == (a: ProjectDescription.Template, b: ProjectDescription.Template) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Template.Item {
- public static func string(path: Swift.String, contents: Swift.String) -> ProjectDescription.Template.Item
- public static func file(path: Swift.String, templatePath: ProjectDescription.Path) -> ProjectDescription.Template.Item
- public static func directory(path: Swift.String, sourcePath: ProjectDescription.Path) -> ProjectDescription.Template.Item
-}
-extension Swift.DefaultStringInterpolation {
- public mutating func appendInterpolation(_ value: ProjectDescription.Template.Attribute)
-}
-public struct TemplateString : Swift.Encodable, Swift.Decodable, Swift.Equatable {
- public static func == (a: ProjectDescription.TemplateString, b: ProjectDescription.TemplateString) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.TemplateString : Swift.ExpressibleByStringLiteral {
- public init(stringLiteral: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension ProjectDescription.TemplateString : Swift.CustomStringConvertible {
- public var description: Swift.String {
- get
- }
-}
-extension ProjectDescription.TemplateString : Swift.ExpressibleByStringInterpolation {
- public init(stringInterpolation: ProjectDescription.TemplateString.StringInterpolation)
- public struct StringInterpolation : Swift.StringInterpolationProtocol {
- public init(literalCapacity _: Swift.Int, interpolationCount _: Swift.Int)
- public mutating func appendLiteral(_ literal: Swift.String)
- public mutating func appendInterpolation(_ token: ProjectDescription.TemplateString.Token)
- public typealias StringLiteralType = Swift.String
- }
-}
-extension ProjectDescription.TemplateString {
- public enum Token : Swift.String, Swift.Equatable {
- case projectName
- public init?(rawValue: Swift.String)
- public typealias RawValue = Swift.String
- public var rawValue: Swift.String {
- get
- }
- }
-}
-public struct TestAction : Swift.Equatable, Swift.Codable {
- public let testPlans: [ProjectDescription.Path]?
- public let targets: [ProjectDescription.TestableTarget]
- public let arguments: ProjectDescription.Arguments?
- public let configuration: ProjectDescription.ConfigurationName
- public let attachDebugger: Swift.Bool
- public let expandVariableFromTarget: ProjectDescription.TargetReference?
- public let preActions: [ProjectDescription.ExecutionAction]
- public let postActions: [ProjectDescription.ExecutionAction]
- public let options: ProjectDescription.TestActionOptions
- public let diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption]
- public static func targets(_ targets: [ProjectDescription.TestableTarget], arguments: ProjectDescription.Arguments? = nil, configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, expandVariableFromTarget: ProjectDescription.TargetReference? = nil, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = [], options: ProjectDescription.TestActionOptions = .options(), diagnosticsOptions: [ProjectDescription.SchemeDiagnosticsOption] = [.mainThreadChecker]) -> ProjectDescription.TestAction
- public static func testPlans(_ testPlans: [ProjectDescription.Path], configuration: ProjectDescription.ConfigurationName = .debug, attachDebugger: Swift.Bool = true, preActions: [ProjectDescription.ExecutionAction] = [], postActions: [ProjectDescription.ExecutionAction] = []) -> ProjectDescription.TestAction
- public static func == (a: ProjectDescription.TestAction, b: ProjectDescription.TestAction) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct TestActionOptions : Swift.Equatable, Swift.Codable {
- public let language: ProjectDescription.SchemeLanguage?
- public let region: Swift.String?
- public let coverage: Swift.Bool
- public let codeCoverageTargets: [ProjectDescription.TargetReference]
- public static func options(language: ProjectDescription.SchemeLanguage? = nil, region: Swift.String? = nil, coverage: Swift.Bool = false, codeCoverageTargets: [ProjectDescription.TargetReference] = []) -> ProjectDescription.TestActionOptions
- public static func == (a: ProjectDescription.TestActionOptions, b: ProjectDescription.TestActionOptions) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct TestableTarget : Swift.Equatable, Swift.Codable, Swift.ExpressibleByStringInterpolation {
- public let target: ProjectDescription.TargetReference
- public let isSkipped: Swift.Bool
- public let isParallelizable: Swift.Bool
- public let isRandomExecutionOrdering: Swift.Bool
- public init(target: ProjectDescription.TargetReference, skipped: Swift.Bool = false, parallelizable: Swift.Bool = false, randomExecutionOrdering: Swift.Bool = false)
- public init(stringLiteral value: Swift.String)
- public static func == (a: ProjectDescription.TestableTarget, b: ProjectDescription.TestableTarget) -> Swift.Bool
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-public struct TestingOptions : Swift.OptionSet, Swift.Codable, Swift.Equatable {
- public let rawValue: Swift.Int
- public init(rawValue: Swift.Int)
- public static let parallelizable: ProjectDescription.TestingOptions
- public static let randomExecutionOrdering: ProjectDescription.TestingOptions
- public typealias ArrayLiteralElement = ProjectDescription.TestingOptions
- public typealias Element = ProjectDescription.TestingOptions
- public typealias RawValue = Swift.Int
-}
-public struct Version : Swift.Hashable, Swift.Codable {
- public let major: Swift.Int
- public let minor: Swift.Int
- public let patch: Swift.Int
- public let prereleaseIdentifiers: [Swift.String]
- public let buildMetadataIdentifiers: [Swift.String]
- public init(_ major: Swift.Int, _ minor: Swift.Int, _ patch: Swift.Int, prereleaseIdentifiers: [Swift.String] = [], buildMetadataIdentifiers: [Swift.String] = [])
- public static func == (a: ProjectDescription.Version, b: ProjectDescription.Version) -> Swift.Bool
- public func hash(into hasher: inout Swift.Hasher)
- public func encode(to encoder: Swift.Encoder) throws
- public var hashValue: Swift.Int {
- get
- }
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Version : Swift.Comparable {
- public static func < (lhs: ProjectDescription.Version, rhs: ProjectDescription.Version) -> Swift.Bool
-}
-extension ProjectDescription.Version : Swift.CustomStringConvertible {
- public var description: Swift.String {
- get
- }
-}
-extension ProjectDescription.Version {
- public init?(string: Swift.String)
-}
-extension ProjectDescription.Version : Swift.ExpressibleByStringInterpolation {
- public init(stringLiteral value: Swift.String)
- public typealias ExtendedGraphemeClusterLiteralType = Swift.String
- public typealias StringInterpolation = Swift.DefaultStringInterpolation
- public typealias StringLiteralType = Swift.String
- public typealias UnicodeScalarLiteralType = Swift.String
-}
-extension Swift.ClosedRange where Bound == ProjectDescription.Version {
- public func contains(_: ProjectDescription.Version) -> Swift.Bool
-}
-extension Swift.Range where Bound == ProjectDescription.Version {
- public func contains(_: ProjectDescription.Version) -> Swift.Bool
-}
-extension Swift.Range where Bound == ProjectDescription.Version {
- public func contains(version: ProjectDescription.Version) -> Swift.Bool
-}
-public struct Workspace : Swift.Codable, Swift.Equatable {
- public let name: Swift.String
- public let projects: [ProjectDescription.Path]
- public let schemes: [ProjectDescription.Scheme]
- public let fileHeaderTemplate: ProjectDescription.FileHeaderTemplate?
- public let additionalFiles: [ProjectDescription.FileElement]
- public let generationOptions: ProjectDescription.Workspace.GenerationOptions
- public init(name: Swift.String, projects: [ProjectDescription.Path], schemes: [ProjectDescription.Scheme] = [], fileHeaderTemplate: ProjectDescription.FileHeaderTemplate? = nil, additionalFiles: [ProjectDescription.FileElement] = [], generationOptions: ProjectDescription.Workspace.GenerationOptions = .options())
- public static func == (a: ProjectDescription.Workspace, b: ProjectDescription.Workspace) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
-}
-extension ProjectDescription.Workspace {
- public struct GenerationOptions : Swift.Codable, Swift.Equatable {
- public enum AutogeneratedWorkspaceSchemes : Swift.Codable, Swift.Equatable {
- public enum CodeCoverageMode : Swift.Codable, Swift.Equatable {
- case all
- case relevant
- case targets([ProjectDescription.TargetReference])
- case disabled
- public static func == (a: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode, b: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- case disabled
- case enabled(codeCoverageMode: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes.CodeCoverageMode = .disabled, testingOptions: ProjectDescription.TestingOptions = [])
- public static func == (a: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes, b: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
- public let enableAutomaticXcodeSchemes: Swift.Bool?
- public let autogeneratedWorkspaceSchemes: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes
- public let lastXcodeUpgradeCheck: ProjectDescription.Version?
- public let renderMarkdownReadme: Swift.Bool
- public static func options(enableAutomaticXcodeSchemes: Swift.Bool? = false, autogeneratedWorkspaceSchemes: ProjectDescription.Workspace.GenerationOptions.AutogeneratedWorkspaceSchemes = .enabled(), lastXcodeUpgradeCheck: ProjectDescription.Version? = nil, renderMarkdownReadme: Swift.Bool = false) -> ProjectDescription.Workspace.GenerationOptions
- public static func == (a: ProjectDescription.Workspace.GenerationOptions, b: ProjectDescription.Workspace.GenerationOptions) -> Swift.Bool
- public func encode(to encoder: Swift.Encoder) throws
- public init(from decoder: Swift.Decoder) throws
- }
-}
-extension ProjectDescription.Cloud.Option : Swift.Hashable {}
-extension ProjectDescription.Cloud.Option : Swift.RawRepresentable {}
-extension ProjectDescription.CopyFilesAction.Destination : Swift.Hashable {}
-extension ProjectDescription.CopyFilesAction.Destination : Swift.RawRepresentable {}
-extension ProjectDescription.FileCodeGen : Swift.Hashable {}
-extension ProjectDescription.FileCodeGen : Swift.RawRepresentable {}
-extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.Equatable {}
-extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.Hashable {}
-extension ProjectDescription.Headers.AutomaticExclusionRule : Swift.RawRepresentable {}
-extension ProjectDescription.Path.PathType : Swift.Equatable {}
-extension ProjectDescription.Path.PathType : Swift.Hashable {}
-extension ProjectDescription.Path.PathType : Swift.RawRepresentable {}
-extension ProjectDescription.Platform : Swift.Hashable {}
-extension ProjectDescription.Platform : Swift.RawRepresentable {}
-extension ProjectDescription.Product : Swift.Hashable {}
-extension ProjectDescription.Product : Swift.RawRepresentable {}
-extension ProjectDescription.ResourceSynthesizer.Parser : Swift.Equatable {}
-extension ProjectDescription.ResourceSynthesizer.Parser : Swift.Hashable {}
-extension ProjectDescription.ResourceSynthesizer.Parser : Swift.RawRepresentable {}
-extension ProjectDescription.RunActionOptions.GPUFrameCaptureMode : Swift.Hashable {}
-extension ProjectDescription.RunActionOptions.GPUFrameCaptureMode : Swift.RawRepresentable {}
-extension ProjectDescription.SchemeDiagnosticsOption : Swift.Hashable {}
-extension ProjectDescription.SchemeDiagnosticsOption : Swift.RawRepresentable {}
-extension ProjectDescription.Configuration.Variant : Swift.Equatable {}
-extension ProjectDescription.Configuration.Variant : Swift.Hashable {}
-extension ProjectDescription.Configuration.Variant : Swift.RawRepresentable {}
-extension ProjectDescription.SwiftCompilationMode : Swift.Equatable {}
-extension ProjectDescription.SwiftCompilationMode : Swift.Hashable {}
-extension ProjectDescription.SwiftCompilationMode : Swift.RawRepresentable {}
-extension ProjectDescription.DebugInformationFormat : Swift.Equatable {}
-extension ProjectDescription.DebugInformationFormat : Swift.Hashable {}
-extension ProjectDescription.DebugInformationFormat : Swift.RawRepresentable {}
-extension ProjectDescription.SwiftOptimizationLevel : Swift.Equatable {}
-extension ProjectDescription.SwiftOptimizationLevel : Swift.Hashable {}
-extension ProjectDescription.SwiftOptimizationLevel : Swift.RawRepresentable {}
-extension ProjectDescription.SDKStatus : Swift.RawRepresentable {}
-extension ProjectDescription.SDKType : Swift.RawRepresentable {}
-extension ProjectDescription.TargetScript.Order : Swift.Hashable {}
-extension ProjectDescription.TargetScript.Order : Swift.RawRepresentable {}
-extension ProjectDescription.TemplateString.Token : Swift.Hashable {}
-extension ProjectDescription.TemplateString.Token : Swift.RawRepresentable {}
diff --git a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64.swiftmodule b/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64.swiftmodule
deleted file mode 100644
index edc5f9da2..000000000
Binary files a/.tuist-bin/ProjectDescription.framework/Modules/ProjectDescription.swiftmodule/x86_64.swiftmodule and /dev/null differ
diff --git a/.tuist-bin/ProjectDescription.framework/ProjectDescription b/.tuist-bin/ProjectDescription.framework/ProjectDescription
deleted file mode 120000
index cc4e4e89d..000000000
--- a/.tuist-bin/ProjectDescription.framework/ProjectDescription
+++ /dev/null
@@ -1 +0,0 @@
-Versions/Current/ProjectDescription
\ No newline at end of file
diff --git a/.tuist-bin/ProjectDescription.framework/Resources b/.tuist-bin/ProjectDescription.framework/Resources
deleted file mode 120000
index 953ee36f3..000000000
--- a/.tuist-bin/ProjectDescription.framework/Resources
+++ /dev/null
@@ -1 +0,0 @@
-Versions/Current/Resources
\ No newline at end of file
diff --git a/.tuist-bin/ProjectDescription.framework/Versions/A/ProjectDescription b/.tuist-bin/ProjectDescription.framework/Versions/A/ProjectDescription
deleted file mode 100755
index 443b9b266..000000000
Binary files a/.tuist-bin/ProjectDescription.framework/Versions/A/ProjectDescription and /dev/null differ
diff --git a/.tuist-bin/ProjectDescription.framework/Versions/A/Resources/Info.plist b/.tuist-bin/ProjectDescription.framework/Versions/A/Resources/Info.plist
deleted file mode 100644
index 70c5199e0..000000000
--- a/.tuist-bin/ProjectDescription.framework/Versions/A/Resources/Info.plist
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
- BuildMachineOSBuild
- 20G817
- CFBundleDevelopmentRegion
- en
- CFBundleExecutable
- ProjectDescription
- CFBundleIdentifier
- ProjectDescription
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- ProjectDescription
- CFBundlePackageType
- FMWK
- CFBundleShortVersionString
- 1.0
- CFBundleSupportedPlatforms
-
- MacOSX
-
- CFBundleVersion
- 1
- DTCompiler
- com.apple.compilers.llvm.clang.1_0
- DTPlatformBuild
- 13A1030d
- DTPlatformName
- macosx
- DTPlatformVersion
- 12.0
- DTSDKBuild
- 21A344
- DTSDKName
- macosx12.0
- DTXcode
- 1310
- DTXcodeBuild
- 13A1030d
- LSMinimumSystemVersion
- 11.0
-
-
diff --git a/.tuist-bin/ProjectDescription.framework/Versions/Current b/.tuist-bin/ProjectDescription.framework/Versions/Current
deleted file mode 120000
index 8c7e5a667..000000000
--- a/.tuist-bin/ProjectDescription.framework/Versions/Current
+++ /dev/null
@@ -1 +0,0 @@
-A
\ No newline at end of file
diff --git a/.tuist-bin/Templates/AppProject.stencil b/.tuist-bin/Templates/AppProject.stencil
deleted file mode 100644
index 692ba5b54..000000000
--- a/.tuist-bin/Templates/AppProject.stencil
+++ /dev/null
@@ -1,29 +0,0 @@
-import ProjectDescription
-import ProjectDescriptionHelpers
-import MyPlugin
-
-/*
- +-------------+
- | |
- | App | Contains {{ name }} App target and {{ name }} unit-test target
- | |
- +------+-------------+-------+
- | depends on |
- | |
- +----v-----+ +-----v-----+
- | | | |
- | Kit | | UI | Two independent frameworks to share code and start modularising your app
- | | | |
- +----------+ +-----------+
-
- */
-
-// MARK: - Project
-
-// Local plugin loaded
-let localHelper = LocalHelper(name: "MyPlugin")
-
-// Creates our project using a helper function defined in ProjectDescriptionHelpers
-let project = Project.app(name: "{{ name }}",
- platform: .{{ platform }},
- additionalTargets: ["{{name}}Kit", "{{name}}UI"])
diff --git a/.tuist-bin/Templates/AppTests.stencil b/.tuist-bin/Templates/AppTests.stencil
deleted file mode 100644
index fb7776aa5..000000000
--- a/.tuist-bin/Templates/AppTests.stencil
+++ /dev/null
@@ -1,8 +0,0 @@
-import Foundation
-import XCTest
-
-final class {{ name }}Tests: XCTestCase {
- func test_twoPlusTwo_isFour() {
- XCTAssertEqual(2+2, 4)
- }
-}
\ No newline at end of file
diff --git a/.tuist-bin/Templates/Config.stencil b/.tuist-bin/Templates/Config.stencil
deleted file mode 100644
index 66e92c6e0..000000000
--- a/.tuist-bin/Templates/Config.stencil
+++ /dev/null
@@ -1,7 +0,0 @@
-import ProjectDescription
-
-let config = Config(
- plugins: [
- .local(path: .relativeToManifest("../../Plugins/{{ name }}")),
- ]
-)
diff --git a/.tuist-bin/Templates/Gitignore.stencil b/.tuist-bin/Templates/Gitignore.stencil
deleted file mode 100644
index 551a3f504..000000000
--- a/.tuist-bin/Templates/Gitignore.stencil
+++ /dev/null
@@ -1,70 +0,0 @@
-### macOS ###
-# General
-.DS_Store
-.AppleDouble
-.LSOverride
-
-# Icon must end with two
-Icon
-
-# Thumbnails
-._*
-
-# Files that might appear in the root of a volume
-.DocumentRevisions-V100
-.fseventsd
-.Spotlight-V100
-.TemporaryItems
-.Trashes
-.VolumeIcon.icns
-.com.apple.timemachine.donotpresent
-
-# Directories potentially created on remote AFP share
-.AppleDB
-.AppleDesktop
-Network Trash Folder
-Temporary Items
-.apdisk
-
-### Xcode ###
-# Xcode
-#
-# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
-
-## User settings
-xcuserdata/
-
-## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
-*.xcscmblueprint
-*.xccheckout
-
-## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
-build/
-DerivedData/
-*.moved-aside
-*.pbxuser
-!default.pbxuser
-*.mode1v3
-!default.mode1v3
-*.mode2v3
-!default.mode2v3
-*.perspectivev3
-!default.perspectivev3
-
-### Xcode Patch ###
-*.xcodeproj/*
-!*.xcodeproj/project.pbxproj
-!*.xcodeproj/xcshareddata/
-!*.xcworkspace/contents.xcworkspacedata
-/*.gcno
-
-### Projects ###
-*.xcodeproj
-*.xcworkspace
-
-### Tuist derived files ###
-graph.dot
-Derived/
-
-### Tuist managed dependencies ###
-Tuist/Dependencies
diff --git a/.tuist-bin/Templates/KitSource.stencil b/.tuist-bin/Templates/KitSource.stencil
deleted file mode 100644
index 89d02ef60..000000000
--- a/.tuist-bin/Templates/KitSource.stencil
+++ /dev/null
@@ -1,7 +0,0 @@
-import Foundation
-
-public final class {{ name }}Kit {
- public static func hello() {
- print("Hello, from your Kit framework")
- }
-}
diff --git a/.tuist-bin/Templates/KitTests.stencil b/.tuist-bin/Templates/KitTests.stencil
deleted file mode 100644
index c7cfa7789..000000000
--- a/.tuist-bin/Templates/KitTests.stencil
+++ /dev/null
@@ -1,8 +0,0 @@
-import Foundation
-import XCTest
-
-final class {{ name }}KitTests: XCTestCase {
- func test_example() {
- XCTAssertEqual("{{ name }}Kit", "{{ name }}Kit")
- }
-}
\ No newline at end of file
diff --git a/.tuist-bin/Templates/LaunchScreen+macOS.stencil b/.tuist-bin/Templates/LaunchScreen+macOS.stencil
deleted file mode 100644
index be1034ddd..000000000
--- a/.tuist-bin/Templates/LaunchScreen+macOS.stencil
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/.tuist-bin/Templates/LaunchScreen+tvOS.stencil b/.tuist-bin/Templates/LaunchScreen+tvOS.stencil
deleted file mode 100644
index eadb1feac..000000000
--- a/.tuist-bin/Templates/LaunchScreen+tvOS.stencil
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.tuist-bin/Templates/LocalHelper.stencil b/.tuist-bin/Templates/LocalHelper.stencil
deleted file mode 100644
index 6f49a442d..000000000
--- a/.tuist-bin/Templates/LocalHelper.stencil
+++ /dev/null
@@ -1,9 +0,0 @@
-import Foundation
-
-public struct LocalHelper {
- let name: String
-
- public init(name: String) {
- self.name = name
- }
-}
diff --git a/.tuist-bin/Templates/Package.stencil b/.tuist-bin/Templates/Package.stencil
deleted file mode 100644
index 258c84c7c..000000000
--- a/.tuist-bin/Templates/Package.stencil
+++ /dev/null
@@ -1,15 +0,0 @@
-// swift-tools-version: 5.4
-
-import PackageDescription
-
-let package = Package(
- name: "MyPlugin",
- products: [
- .executable(name: "tuist-my-cli", targets: ["tuist-my-cli"]),
- ],
- targets: [
- .executableTarget(
- name: "tuist-my-cli"
- ),
- ]
-)
diff --git a/.tuist-bin/Templates/Package.swift b/.tuist-bin/Templates/Package.swift
deleted file mode 100644
index 9f926b36a..000000000
--- a/.tuist-bin/Templates/Package.swift
+++ /dev/null
@@ -1 +0,0 @@
-import PackageDescription
diff --git a/.tuist-bin/Templates/Plugin.stencil b/.tuist-bin/Templates/Plugin.stencil
deleted file mode 100644
index 86a1e55b8..000000000
--- a/.tuist-bin/Templates/Plugin.stencil
+++ /dev/null
@@ -1,3 +0,0 @@
-import ProjectDescription
-
-let plugin = Plugin(name: "MyPlugin")
\ No newline at end of file
diff --git a/.tuist-bin/Templates/Project+Templates.stencil b/.tuist-bin/Templates/Project+Templates.stencil
deleted file mode 100644
index 01b4ec00d..000000000
--- a/.tuist-bin/Templates/Project+Templates.stencil
+++ /dev/null
@@ -1,76 +0,0 @@
-import ProjectDescription
-
-/// Project helpers are functions that simplify the way you define your project.
-/// Share code to create targets, settings, dependencies,
-/// Create your own conventions, e.g: a func that makes sure all shared targets are "static frameworks"
-/// See https://docs.tuist.io/guides/helpers/
-
-extension Project {
- /// Helper function to create the Project for this ExampleApp
- public static func app(name: String, platform: Platform, additionalTargets: [String]) -> Project {
- var targets = makeAppTargets(name: name,
- platform: platform,
- dependencies: additionalTargets.map { TargetDependency.target(name: $0) })
- targets += additionalTargets.flatMap({ makeFrameworkTargets(name: $0, platform: platform) })
- return Project(name: name,
- organizationName: "tuist.io",
- targets: targets)
- }
-
- // MARK: - Private
-
- /// Helper function to create a framework target and an associated unit test target
- private static func makeFrameworkTargets(name: String, platform: Platform) -> [Target] {
- let sources = Target(name: name,
- platform: platform,
- product: .framework,
- bundleId: "io.tuist.\(name)",
- infoPlist: .default,
- sources: ["Targets/\(name)/Sources/**"],
- resources: [],
- dependencies: [])
- let tests = Target(name: "\(name)Tests",
- platform: platform,
- product: .unitTests,
- bundleId: "io.tuist.\(name)Tests",
- infoPlist: .default,
- sources: ["Targets/\(name)/Tests/**"],
- resources: [],
- dependencies: [.target(name: name)])
- return [sources, tests]
- }
-
- /// Helper function to create the application target and the unit test target.
- private static func makeAppTargets(name: String, platform: Platform, dependencies: [TargetDependency]) -> [Target] {
- let platform: Platform = platform
- let infoPlist: [String: InfoPlist.Value] = [
- "CFBundleShortVersionString": "1.0",
- "CFBundleVersion": "1",
- {% if platform == "macOS" %}"NSMainStoryboardFile"{% else %}"UIMainStoryboardFile"{% endif %}: "",
- "UILaunchStoryboardName": "LaunchScreen"
- ]
-
- let mainTarget = Target(
- name: name,
- platform: platform,
- product: .app,
- bundleId: "io.tuist.\(name)",
- infoPlist: .extendingDefault(with: infoPlist),
- sources: ["Targets/\(name)/Sources/**"],
- resources: ["Targets/\(name)/Resources/**"],
- dependencies: dependencies
- )
-
- let testTarget = Target(
- name: "\(name)Tests",
- platform: platform,
- product: .unitTests,
- bundleId: "io.tuist.\(name)Tests",
- infoPlist: .default,
- sources: ["Targets/\(name)/Tests/**"],
- dependencies: [
- .target(name: "\(name)")
- ])
- return [mainTarget, testTarget]
- }
-}
diff --git a/.tuist-bin/Templates/UISource.stencil b/.tuist-bin/Templates/UISource.stencil
deleted file mode 100644
index 3fc2ac74a..000000000
--- a/.tuist-bin/Templates/UISource.stencil
+++ /dev/null
@@ -1,7 +0,0 @@
-import Foundation
-
-public final class {{ name }}UI {
- public static func hello() {
- print("Hello, from your UI framework")
- }
-}
diff --git a/.tuist-bin/Templates/UITests.stencil b/.tuist-bin/Templates/UITests.stencil
deleted file mode 100644
index 67c7bf615..000000000
--- a/.tuist-bin/Templates/UITests.stencil
+++ /dev/null
@@ -1,8 +0,0 @@
-import Foundation
-import XCTest
-
-final class {{ name }}UITests: XCTestCase {
- func test_example() {
- XCTAssertEqual("{{ name }}UI", "{{ name }}UI")
- }
-}
\ No newline at end of file
diff --git a/.tuist-bin/Templates/default/AppDelegate.stencil b/.tuist-bin/Templates/default/AppDelegate.stencil
deleted file mode 100644
index 99814119a..000000000
--- a/.tuist-bin/Templates/default/AppDelegate.stencil
+++ /dev/null
@@ -1,43 +0,0 @@
-{% if platform == "macOS" %}import Cocoa
-import {{ name }}Kit
-import {{ name }}UI
-
-@main
-class AppDelegate: NSObject, NSApplicationDelegate {
-
- @IBOutlet weak var window: NSWindow!
-
- func applicationDidFinishLaunching(_ aNotification: Notification) {
- // Insert code here to initialize your application
- }
-
- func applicationWillTerminate(_ aNotification: Notification) {
- // Insert code here to tear down your application
- }
-
-}{% else %}import UIKit
-import {{ name }}Kit
-import {{ name }}UI
-
-@main
-class AppDelegate: UIResponder, UIApplicationDelegate {
-
- var window: UIWindow?
-
- func application(
- _ application: UIApplication,
- didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil
- ) -> Bool {
- window = UIWindow(frame: UIScreen.main.bounds)
- let viewController = UIViewController()
- viewController.view.backgroundColor = .white
- window?.rootViewController = viewController
- window?.makeKeyAndVisible()
-
- {{ name }}Kit.hello()
- {{ name }}UI.hello()
-
- return true
- }
-
-}{% endif %}
diff --git a/.tuist-bin/Templates/default/default.swift b/.tuist-bin/Templates/default/default.swift
deleted file mode 100644
index e8da38ecc..000000000
--- a/.tuist-bin/Templates/default/default.swift
+++ /dev/null
@@ -1,83 +0,0 @@
-import ProjectDescription
-
-let nameAttribute: Template.Attribute = .required("name")
-let platformAttribute: Template.Attribute = .optional("platform", default: "iOS")
-let projectPath = "."
-let appPath = "Targets/\(nameAttribute)"
-let kitFrameworkPath = "Targets/\(nameAttribute)Kit"
-let uiFrameworkPath = "Targets/\(nameAttribute)UI"
-let taskPath = "Plugins/\(nameAttribute)"
-
-func templatePath(_ path: String) -> Path {
- "../\(path)"
-}
-
-let template = Template(
- description: "Default template",
- attributes: [
- nameAttribute,
- platformAttribute,
- ],
- items: [
- .file(
- path: "Tuist/ProjectDescriptionHelpers/Project+Templates.swift",
- templatePath: templatePath("Project+Templates.stencil")
- ),
- .file(
- path: projectPath + "/Project.swift",
- templatePath: templatePath("AppProject.stencil")
- ),
- .file(
- path: appPath + "/Sources/AppDelegate.swift",
- templatePath: "AppDelegate.stencil"
- ),
- .file(
- path: appPath + "/Resources/LaunchScreen.storyboard",
- templatePath: templatePath("LaunchScreen+\(platformAttribute).stencil")
- ),
- .file(
- path: appPath + "/Tests/AppTests.swift",
- templatePath: templatePath("AppTests.stencil")
- ),
- .file(
- path: kitFrameworkPath + "/Sources/\(nameAttribute)Kit.swift",
- templatePath: templatePath("/KitSource.stencil")
- ),
- .file(
- path: kitFrameworkPath + "/Tests/\(nameAttribute)KitTests.swift",
- templatePath: templatePath("/KitTests.stencil")
- ),
- .file(
- path: uiFrameworkPath + "/Sources/\(nameAttribute)UI.swift",
- templatePath: templatePath("/UISource.stencil")
- ),
- .file(
- path: uiFrameworkPath + "/Tests/\(nameAttribute)UITests.swift",
- templatePath: templatePath("/UITests.stencil")
- ),
- .file(
- path: taskPath + "/Sources/tuist-my-cli/main.swift",
- templatePath: templatePath("/main.stencil")
- ),
- .file(
- path: taskPath + "/ProjectDescriptionHelpers/LocalHelper.swift",
- templatePath: templatePath("/LocalHelper.stencil")
- ),
- .file(
- path: taskPath + "/Package.swift",
- templatePath: templatePath("/Package.stencil")
- ),
- .file(
- path: taskPath + "/Plugin.swift",
- templatePath: templatePath("/Plugin.stencil")
- ),
- .file(
- path: ".gitignore",
- templatePath: templatePath("Gitignore.stencil")
- ),
- .file(
- path: "Tuist/Config.swift",
- templatePath: templatePath("Config.stencil")
- ),
- ]
-)
diff --git a/.tuist-bin/Templates/main.stencil b/.tuist-bin/Templates/main.stencil
deleted file mode 100644
index 6f059694c..000000000
--- a/.tuist-bin/Templates/main.stencil
+++ /dev/null
@@ -1 +0,0 @@
-print("Hello, from your Tuist Task")
\ No newline at end of file
diff --git a/.tuist-bin/Templates/swiftui/ContentView.stencil b/.tuist-bin/Templates/swiftui/ContentView.stencil
deleted file mode 100644
index fc75cd1f4..000000000
--- a/.tuist-bin/Templates/swiftui/ContentView.stencil
+++ /dev/null
@@ -1,17 +0,0 @@
-import SwiftUI
-
-public struct ContentView: View {
- public init() {}
-
- public var body: some View {
- Text("Hello, World!")
- .padding()
- }
-}
-
-
-struct ContentView_Previews: PreviewProvider {
- static var previews: some View {
- ContentView()
- }
-}
diff --git a/.tuist-bin/Templates/swiftui/app.stencil b/.tuist-bin/Templates/swiftui/app.stencil
deleted file mode 100644
index be85e855a..000000000
--- a/.tuist-bin/Templates/swiftui/app.stencil
+++ /dev/null
@@ -1,11 +0,0 @@
-import SwiftUI
-import {{ name }}UI
-
-@main
-struct {{ name }}App: App {
- var body: some Scene {
- WindowGroup {
- ContentView()
- }
- }
-}
diff --git a/.tuist-bin/Templates/swiftui/ios/Assets.xcassets/AccentColor.colorset/Contents.json b/.tuist-bin/Templates/swiftui/ios/Assets.xcassets/AccentColor.colorset/Contents.json
deleted file mode 100644
index eb8789700..000000000
--- a/.tuist-bin/Templates/swiftui/ios/Assets.xcassets/AccentColor.colorset/Contents.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "colors" : [
- {
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/.tuist-bin/Templates/swiftui/ios/Assets.xcassets/AppIcon.appiconset/Contents.json b/.tuist-bin/Templates/swiftui/ios/Assets.xcassets/AppIcon.appiconset/Contents.json
deleted file mode 100644
index 9221b9bb1..000000000
--- a/.tuist-bin/Templates/swiftui/ios/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ /dev/null
@@ -1,98 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "iphone",
- "scale" : "2x",
- "size" : "20x20"
- },
- {
- "idiom" : "iphone",
- "scale" : "3x",
- "size" : "20x20"
- },
- {
- "idiom" : "iphone",
- "scale" : "2x",
- "size" : "29x29"
- },
- {
- "idiom" : "iphone",
- "scale" : "3x",
- "size" : "29x29"
- },
- {
- "idiom" : "iphone",
- "scale" : "2x",
- "size" : "40x40"
- },
- {
- "idiom" : "iphone",
- "scale" : "3x",
- "size" : "40x40"
- },
- {
- "idiom" : "iphone",
- "scale" : "2x",
- "size" : "60x60"
- },
- {
- "idiom" : "iphone",
- "scale" : "3x",
- "size" : "60x60"
- },
- {
- "idiom" : "ipad",
- "scale" : "1x",
- "size" : "20x20"
- },
- {
- "idiom" : "ipad",
- "scale" : "2x",
- "size" : "20x20"
- },
- {
- "idiom" : "ipad",
- "scale" : "1x",
- "size" : "29x29"
- },
- {
- "idiom" : "ipad",
- "scale" : "2x",
- "size" : "29x29"
- },
- {
- "idiom" : "ipad",
- "scale" : "1x",
- "size" : "40x40"
- },
- {
- "idiom" : "ipad",
- "scale" : "2x",
- "size" : "40x40"
- },
- {
- "idiom" : "ipad",
- "scale" : "1x",
- "size" : "76x76"
- },
- {
- "idiom" : "ipad",
- "scale" : "2x",
- "size" : "76x76"
- },
- {
- "idiom" : "ipad",
- "scale" : "2x",
- "size" : "83.5x83.5"
- },
- {
- "idiom" : "ios-marketing",
- "scale" : "1x",
- "size" : "1024x1024"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/.tuist-bin/Templates/swiftui/macos/Assets.xcassets/AccentColor.colorset/Contents.json b/.tuist-bin/Templates/swiftui/macos/Assets.xcassets/AccentColor.colorset/Contents.json
deleted file mode 100644
index eb8789700..000000000
--- a/.tuist-bin/Templates/swiftui/macos/Assets.xcassets/AccentColor.colorset/Contents.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "colors" : [
- {
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/.tuist-bin/Templates/swiftui/macos/Assets.xcassets/AppIcon.appiconset/Contents.json b/.tuist-bin/Templates/swiftui/macos/Assets.xcassets/AppIcon.appiconset/Contents.json
deleted file mode 100644
index 3f00db43e..000000000
--- a/.tuist-bin/Templates/swiftui/macos/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "mac",
- "scale" : "1x",
- "size" : "16x16"
- },
- {
- "idiom" : "mac",
- "scale" : "2x",
- "size" : "16x16"
- },
- {
- "idiom" : "mac",
- "scale" : "1x",
- "size" : "32x32"
- },
- {
- "idiom" : "mac",
- "scale" : "2x",
- "size" : "32x32"
- },
- {
- "idiom" : "mac",
- "scale" : "1x",
- "size" : "128x128"
- },
- {
- "idiom" : "mac",
- "scale" : "2x",
- "size" : "128x128"
- },
- {
- "idiom" : "mac",
- "scale" : "1x",
- "size" : "256x256"
- },
- {
- "idiom" : "mac",
- "scale" : "2x",
- "size" : "256x256"
- },
- {
- "idiom" : "mac",
- "scale" : "1x",
- "size" : "512x512"
- },
- {
- "idiom" : "mac",
- "scale" : "2x",
- "size" : "512x512"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/.tuist-bin/Templates/swiftui/swiftui.swift b/.tuist-bin/Templates/swiftui/swiftui.swift
deleted file mode 100644
index a1f937a4d..000000000
--- a/.tuist-bin/Templates/swiftui/swiftui.swift
+++ /dev/null
@@ -1,87 +0,0 @@
-import ProjectDescription
-
-let nameAttribute: Template.Attribute = .required("name")
-let platformAttribute: Template.Attribute = .optional("platform", default: "iOS")
-let projectPath = "."
-let appPath = "Targets/\(nameAttribute)"
-let kitFrameworkPath = "Targets/\(nameAttribute)Kit"
-let uiFrameworkPath = "Targets/\(nameAttribute)UI"
-let taskPath = "Plugins/\(nameAttribute)"
-
-func templatePath(_ path: String) -> Path {
- "../\(path)"
-}
-
-let template = Template(
- description: "SwiftUI template",
- attributes: [
- nameAttribute,
- platformAttribute,
- ],
- items: [
- .file(
- path: "Tuist/ProjectDescriptionHelpers/Project+Templates.swift",
- templatePath: templatePath("Project+Templates.stencil")
- ),
- .file(
- path: projectPath + "/Project.swift",
- templatePath: templatePath("AppProject.stencil")
- ),
- .file(
- path: appPath + "/Sources/\(nameAttribute)App.swift",
- templatePath: "app.stencil"
- ),
- .file(
- path: uiFrameworkPath + "/Sources/ContentView.swift",
- templatePath: "ContentView.stencil"
- ),
- .directory(
- path: appPath + "/Resources",
- sourcePath: "\(platformAttribute)/Assets.xcassets"
- ),
- .directory(
- path: appPath + "/Resources",
- sourcePath: "Preview Content"
- ),
- .file(
- path: appPath + "/Tests/\(nameAttribute)Tests.swift",
- templatePath: templatePath("AppTests.stencil")
- ),
- .file(
- path: kitFrameworkPath + "/Sources/\(nameAttribute)Kit.swift",
- templatePath: templatePath("KitSource.stencil")
- ),
- .file(
- path: kitFrameworkPath + "/Tests/\(nameAttribute)KitTests.swift",
- templatePath: templatePath("/KitTests.stencil")
- ),
- .file(
- path: uiFrameworkPath + "/Tests/\(nameAttribute)UITests.swift",
- templatePath: templatePath("/UITests.stencil")
- ),
- .file(
- path: taskPath + "/Sources/tuist-my-cli/main.swift",
- templatePath: templatePath("/main.stencil")
- ),
- .file(
- path: taskPath + "/ProjectDescriptionHelpers/LocalHelper.swift",
- templatePath: templatePath("/LocalHelper.stencil")
- ),
- .file(
- path: taskPath + "/Package.swift",
- templatePath: templatePath("/Package.stencil")
- ),
- .file(
- path: taskPath + "/Plugin.swift",
- templatePath: templatePath("/Plugin.stencil")
- ),
- .file(
- path: ".gitignore",
- templatePath: templatePath("Gitignore.stencil")
- ),
- .file(
- path: "Tuist/Config.swift",
- templatePath: templatePath("Config.stencil")
- ),
- ]
-)
diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/AccentColor.colorset/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/AccentColor.colorset/Contents.json
deleted file mode 100644
index eb8789700..000000000
--- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/AccentColor.colorset/Contents.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "colors" : [
- {
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json
deleted file mode 100644
index 2e003356c..000000000
--- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "tv"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json
deleted file mode 100644
index de59d885a..000000000
--- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "info" : {
- "author" : "xcode",
- "version" : 1
- },
- "layers" : [
- {
- "filename" : "Front.imagestacklayer"
- },
- {
- "filename" : "Middle.imagestacklayer"
- },
- {
- "filename" : "Back.imagestacklayer"
- }
- ]
-}
diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json
deleted file mode 100644
index 2e003356c..000000000
--- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "tv"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json
deleted file mode 100644
index 2e003356c..000000000
--- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "tv"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json
deleted file mode 100644
index 795cce172..000000000
--- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "tv",
- "scale" : "1x"
- },
- {
- "idiom" : "tv",
- "scale" : "2x"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json
deleted file mode 100644
index de59d885a..000000000
--- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "info" : {
- "author" : "xcode",
- "version" : 1
- },
- "layers" : [
- {
- "filename" : "Front.imagestacklayer"
- },
- {
- "filename" : "Middle.imagestacklayer"
- },
- {
- "filename" : "Back.imagestacklayer"
- }
- ]
-}
diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json
deleted file mode 100644
index 795cce172..000000000
--- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "tv",
- "scale" : "1x"
- },
- {
- "idiom" : "tv",
- "scale" : "2x"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json
deleted file mode 100644
index 795cce172..000000000
--- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "tv",
- "scale" : "1x"
- },
- {
- "idiom" : "tv",
- "scale" : "2x"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json
deleted file mode 100644
index f47ba43da..000000000
--- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "assets" : [
- {
- "filename" : "App Icon - App Store.imagestack",
- "idiom" : "tv",
- "role" : "primary-app-icon",
- "size" : "1280x768"
- },
- {
- "filename" : "App Icon.imagestack",
- "idiom" : "tv",
- "role" : "primary-app-icon",
- "size" : "400x240"
- },
- {
- "filename" : "Top Shelf Image Wide.imageset",
- "idiom" : "tv",
- "role" : "top-shelf-image-wide",
- "size" : "2320x720"
- },
- {
- "filename" : "Top Shelf Image.imageset",
- "idiom" : "tv",
- "role" : "top-shelf-image",
- "size" : "1920x720"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json
deleted file mode 100644
index b65f0cddc..000000000
--- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "tv",
- "scale" : "1x"
- },
- {
- "idiom" : "tv",
- "scale" : "2x"
- },
- {
- "idiom" : "tv-marketing",
- "scale" : "1x"
- },
- {
- "idiom" : "tv-marketing",
- "scale" : "2x"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json b/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json
deleted file mode 100644
index b65f0cddc..000000000
--- a/.tuist-bin/Templates/swiftui/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "tv",
- "scale" : "1x"
- },
- {
- "idiom" : "tv",
- "scale" : "2x"
- },
- {
- "idiom" : "tv-marketing",
- "scale" : "1x"
- },
- {
- "idiom" : "tv-marketing",
- "scale" : "2x"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/.tuist-bin/libswift_Concurrency.dylib b/.tuist-bin/libswift_Concurrency.dylib
deleted file mode 100755
index 3f83cb528..000000000
Binary files a/.tuist-bin/libswift_Concurrency.dylib and /dev/null differ
diff --git a/.tuist-bin/tuist b/.tuist-bin/tuist
deleted file mode 100755
index 956546a7b..000000000
Binary files a/.tuist-bin/tuist and /dev/null differ
diff --git a/.tuist-bin/vendor/xcbeautify/LICENSE b/.tuist-bin/vendor/xcbeautify/LICENSE
deleted file mode 100644
index c4bde3ebd..000000000
--- a/.tuist-bin/vendor/xcbeautify/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2018 Thi Doãn
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/.tuist-bin/vendor/xcbeautify/xcbeautify b/.tuist-bin/vendor/xcbeautify/xcbeautify
deleted file mode 100755
index 43b0681c0..000000000
Binary files a/.tuist-bin/vendor/xcbeautify/xcbeautify and /dev/null differ
diff --git a/.tuist-version b/.tuist-version
deleted file mode 100644
index 87dbaa157..000000000
--- a/.tuist-version
+++ /dev/null
@@ -1 +0,0 @@
-3.12.0
\ No newline at end of file
diff --git a/Cartfile b/Cartfile
new file mode 100644
index 000000000..5d46d42f6
--- /dev/null
+++ b/Cartfile
@@ -0,0 +1 @@
+github "realm/realm-swift" == 10.50.1
diff --git a/Cartfile.resolved b/Cartfile.resolved
new file mode 100644
index 000000000..ae7b2097e
--- /dev/null
+++ b/Cartfile.resolved
@@ -0,0 +1 @@
+github "realm/realm-swift" "v10.50.1"
diff --git a/Makefile b/Makefile
index 5da24e775..e7fcf892a 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,17 @@
generate:
- tuist fetch
- TUIST_DEV=1 TUIST_ROOT_DIR=${PWD} tuist generate
+ make install
+ TUIST_ENV=DEV TUIST_ROOT_DIR=${PWD} tuist generate
+
+install:
+ carthage update --use-xcframeworks
+ tuist install
+
+test:
+ TUIST_ENV=CI TUIST_ROOT_DIR=${PWD} tuist test --platform ios
+
+deploy:
+ make install
+ TUIST_ENV=CD TUIST_ROOT_DIR=${PWD} tuist generate
clean:
rm -rf **/*.xcodeproj
@@ -12,4 +23,17 @@ reset:
rm -rf *.xcworkspace
feature:
+ echo "\033[0;31m이 명령어는 deprecated 되었습니다. 'make module'을 사용해주세요! \033[0m"
python3 Scripts/generate_new_feature.py
+
+pg:
+ swift Scripts/GeneratePlugin.swift
+
+module:
+ swift Scripts/GenerateModule.swift
+
+setup:
+ sh Scripts/Setup.sh
+
+format:
+ swiftformat ./Projects --config .swiftformat
diff --git a/Package.resolved b/Package.resolved
new file mode 100644
index 000000000..39238e883
--- /dev/null
+++ b/Package.resolved
@@ -0,0 +1,374 @@
+{
+ "pins" : [
+ {
+ "identity" : "abseil-cpp-binary",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/abseil-cpp-binary.git",
+ "state" : {
+ "revision" : "748c7837511d0e6a507737353af268484e1745e2",
+ "version" : "1.2024011601.1"
+ }
+ },
+ {
+ "identity" : "alamofire",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/Alamofire/Alamofire.git",
+ "state" : {
+ "revision" : "f455c2975872ccd2d9c81594c658af65716e9b9a",
+ "version" : "5.9.1"
+ }
+ },
+ {
+ "identity" : "app-check",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/app-check.git",
+ "state" : {
+ "revision" : "7d2688de038d5484866d835acb47b379722d610e",
+ "version" : "10.19.0"
+ }
+ },
+ {
+ "identity" : "cryptoswift",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/krzyzanowskim/CryptoSwift.git",
+ "state" : {
+ "revision" : "c9c3df6ab812de32bae61fc0cd1bf6d45170ebf0",
+ "version" : "1.8.2"
+ }
+ },
+ {
+ "identity" : "cwlcatchexception",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/mattgallagher/CwlCatchException.git",
+ "state" : {
+ "revision" : "3ef6999c73b6938cc0da422f2c912d0158abb0a0",
+ "version" : "2.2.0"
+ }
+ },
+ {
+ "identity" : "cwlpreconditiontesting",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/mattgallagher/CwlPreconditionTesting.git",
+ "state" : {
+ "revision" : "2ef56b2caf25f55fa7eef8784c30d5a767550f54",
+ "version" : "2.2.1"
+ }
+ },
+ {
+ "identity" : "firebase-ios-sdk",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/firebase/firebase-ios-sdk.git",
+ "state" : {
+ "revision" : "97940381e57703c07f31a8058d8f39ec53b7c272",
+ "version" : "10.25.0"
+ }
+ },
+ {
+ "identity" : "fittedsheets",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/gordontucker/FittedSheets.git",
+ "state" : {
+ "revision" : "5d7f5a6307ad510aa05de5a4a16ac40846d3b2d3",
+ "version" : "2.6.1"
+ }
+ },
+ {
+ "identity" : "googleappmeasurement",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/GoogleAppMeasurement.git",
+ "state" : {
+ "revision" : "16244d177c4e989f87b25e9db1012b382cfedc55",
+ "version" : "10.25.0"
+ }
+ },
+ {
+ "identity" : "googledatatransport",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/GoogleDataTransport.git",
+ "state" : {
+ "revision" : "a637d318ae7ae246b02d7305121275bc75ed5565",
+ "version" : "9.4.0"
+ }
+ },
+ {
+ "identity" : "googleutilities",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/GoogleUtilities.git",
+ "state" : {
+ "revision" : "57a1d307f42df690fdef2637f3e5b776da02aad6",
+ "version" : "7.13.3"
+ }
+ },
+ {
+ "identity" : "grpc-binary",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/grpc-binary.git",
+ "state" : {
+ "revision" : "e9fad491d0673bdda7063a0341fb6b47a30c5359",
+ "version" : "1.62.2"
+ }
+ },
+ {
+ "identity" : "gtm-session-fetcher",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/gtm-session-fetcher.git",
+ "state" : {
+ "revision" : "0382ca27f22fb3494cf657d8dc356dc282cd1193",
+ "version" : "3.4.1"
+ }
+ },
+ {
+ "identity" : "inject",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/krzysztofzablocki/Inject.git",
+ "state" : {
+ "revision" : "838e614220000a563bbaeba2974236f2c2c51e13",
+ "version" : "1.5.0"
+ }
+ },
+ {
+ "identity" : "interop-ios-for-google-sdks",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/interop-ios-for-google-sdks.git",
+ "state" : {
+ "revision" : "2d12673670417654f08f5f90fdd62926dc3a2648",
+ "version" : "100.0.0"
+ }
+ },
+ {
+ "identity" : "kingfisher",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/onevcat/Kingfisher.git",
+ "state" : {
+ "revision" : "5b92f029fab2cce44386d28588098b5be0824ef5",
+ "version" : "7.11.0"
+ }
+ },
+ {
+ "identity" : "leveldb",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/firebase/leveldb.git",
+ "state" : {
+ "revision" : "a0bc79961d7be727d258d33d5a6b2f1023270ba1",
+ "version" : "1.22.5"
+ }
+ },
+ {
+ "identity" : "lottie-ios",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/airbnb/lottie-ios.git",
+ "state" : {
+ "revision" : "769b88d83a42ca8d5572b020c96f47e3690b3796",
+ "version" : "4.4.3"
+ }
+ },
+ {
+ "identity" : "marqueelabel",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/cbpowell/MarqueeLabel.git",
+ "state" : {
+ "revision" : "877e810534cda9afabb8143ae319b7c3341b121b",
+ "version" : "4.5.0"
+ }
+ },
+ {
+ "identity" : "moya",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/Moya/Moya.git",
+ "state" : {
+ "revision" : "c263811c1f3dbf002be9bd83107f7cdc38992b26",
+ "version" : "15.0.3"
+ }
+ },
+ {
+ "identity" : "nanopb",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/firebase/nanopb.git",
+ "state" : {
+ "revision" : "b7e1104502eca3a213b46303391ca4d3bc8ddec1",
+ "version" : "2.30910.0"
+ }
+ },
+ {
+ "identity" : "naveridlogin-sdk-ios",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/naver/naveridlogin-sdk-ios.git",
+ "state" : {
+ "branch" : "master",
+ "revision" : "d8d2128b8bcef8cd93068a058ea898d6dbb7d486"
+ }
+ },
+ {
+ "identity" : "needle",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/uber/needle.git",
+ "state" : {
+ "revision" : "6db73ae873952794b94fd6bb5111554e23c160af",
+ "version" : "0.24.0"
+ }
+ },
+ {
+ "identity" : "nimble",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/Quick/Nimble.git",
+ "state" : {
+ "revision" : "1c49fc1243018f81a7ea99cb5e0985b00096e9f4",
+ "version" : "13.3.0"
+ }
+ },
+ {
+ "identity" : "nvactivityindicatorview",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/ninjaprox/NVActivityIndicatorView.git",
+ "state" : {
+ "revision" : "121455c4e630fcb95aaefd7e4257b0c2e3cfe6d5",
+ "version" : "5.2.0"
+ }
+ },
+ {
+ "identity" : "pageboy",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/uias/Pageboy",
+ "state" : {
+ "revision" : "be0c1f6f1964cfb07f9d819b0863f2c3f255f612",
+ "version" : "4.2.0"
+ }
+ },
+ {
+ "identity" : "promises",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/promises.git",
+ "state" : {
+ "revision" : "540318ecedd63d883069ae7f1ed811a2df00b6ac",
+ "version" : "2.4.0"
+ }
+ },
+ {
+ "identity" : "quick",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/Quick/Quick.git",
+ "state" : {
+ "revision" : "26529ff2209c40ae50fd642b031f930d9d68ea02",
+ "version" : "7.5.0"
+ }
+ },
+ {
+ "identity" : "reachability.swift",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/ashleymills/Reachability.swift",
+ "state" : {
+ "revision" : "57da4b1270cab7c2228919eabc0e4e1bf93e48ea",
+ "version" : "5.2.2"
+ }
+ },
+ {
+ "identity" : "reactiveswift",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/ReactiveCocoa/ReactiveSwift.git",
+ "state" : {
+ "revision" : "c43bae3dac73fdd3cb906bd5a1914686ca71ed3c",
+ "version" : "6.7.0"
+ }
+ },
+ {
+ "identity" : "reactorkit",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/ReactorKit/ReactorKit.git",
+ "state" : {
+ "revision" : "8fa33f09c6f6621a2aa536d739956d53b84dd139",
+ "version" : "3.2.0"
+ }
+ },
+ {
+ "identity" : "rxdatasources",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/RxSwiftCommunity/RxDataSources.git",
+ "state" : {
+ "revision" : "90c29b48b628479097fe775ed1966d75ac374518",
+ "version" : "5.0.2"
+ }
+ },
+ {
+ "identity" : "rxgesture",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/RxSwiftCommunity/RxGesture.git",
+ "state" : {
+ "revision" : "1b137c576b4aaaab949235752278956697c9e4a0",
+ "version" : "4.0.4"
+ }
+ },
+ {
+ "identity" : "rxkeyboard",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/RxSwiftCommunity/RxKeyboard.git",
+ "state" : {
+ "revision" : "63f6377975c962a1d89f012a6f1e5bebb2c502b7",
+ "version" : "2.0.1"
+ }
+ },
+ {
+ "identity" : "rxswift",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/ReactiveX/RxSwift.git",
+ "state" : {
+ "revision" : "b06a8c8596e4c3e8e7788e08e720e3248563ce6a",
+ "version" : "6.7.1"
+ }
+ },
+ {
+ "identity" : "snapkit",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/SnapKit/SnapKit.git",
+ "state" : {
+ "revision" : "2842e6e84e82eb9a8dac0100ca90d9444b0307f4",
+ "version" : "5.7.1"
+ }
+ },
+ {
+ "identity" : "swift-protobuf",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/apple/swift-protobuf.git",
+ "state" : {
+ "revision" : "9f0c76544701845ad98716f3f6a774a892152bcb",
+ "version" : "1.26.0"
+ }
+ },
+ {
+ "identity" : "swiftentrykit",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/huri000/SwiftEntryKit",
+ "state" : {
+ "revision" : "5ad36cccf0c4b9fea32f4e9b17a8e38f07563ef0",
+ "version" : "2.0.0"
+ }
+ },
+ {
+ "identity" : "tabman",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/uias/Tabman.git",
+ "state" : {
+ "revision" : "3b2213290eb93e55bb50b49d1a179033005c11ab",
+ "version" : "3.2.0"
+ }
+ },
+ {
+ "identity" : "then",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/devxoul/Then",
+ "state" : {
+ "revision" : "d41ef523faef0f911369f79c0b96815d9dbb6d7a",
+ "version" : "3.0.0"
+ }
+ },
+ {
+ "identity" : "weakmaptable",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/ReactorKit/WeakMapTable.git",
+ "state" : {
+ "revision" : "cb05d64cef2bbf51e85c53adee937df46540a74e",
+ "version" : "1.2.1"
+ }
+ }
+ ],
+ "version" : 2
+}
diff --git a/Package.swift b/Package.swift
new file mode 100644
index 000000000..1e7a5772c
--- /dev/null
+++ b/Package.swift
@@ -0,0 +1,48 @@
+// swift-tools-version: 5.9
+
+import PackageDescription
+
+#if TUIST
+import ProjectDescription
+import ProjectDescriptionHelpers
+
+let packageSetting = PackageSettings(
+ productTypes: [:],
+ baseSettings: .settings(
+ configurations: [
+ .debug(name: .debug),
+ .debug(name: .qa),
+ .release(name: .release)
+ ]
+ )
+)
+#endif
+
+let package = Package(
+ name: "WaktaverseMusicPackage",
+ dependencies: [
+ .package(url: "https://github.com/Moya/Moya.git", from: "15.0.3"),
+ .package(url: "https://github.com/onevcat/Kingfisher.git", from: "7.11.0"),
+ .package(url: "https://github.com/gordontucker/FittedSheets.git", from: "2.6.1"),
+ .package(url: "https://github.com/ReactiveX/RxSwift.git",from: "6.7.1"),
+ .package(url: "https://github.com/devxoul/Then", from: "3.0.0"),
+ .package(url: "https://github.com/SnapKit/SnapKit.git", from: "5.7.1"),
+ .package(url: "https://github.com/ashleymills/Reachability.swift", from: "5.2.1"),
+ .package(url: "https://github.com/airbnb/lottie-ios.git", from: "4.4.3"),
+ .package(url: "https://github.com/uber/needle.git", from: "0.24.0"),
+ .package(url: "https://github.com/uias/Tabman.git", from: "3.2.0"),
+ .package(url: "https://github.com/RxSwiftCommunity/RxDataSources.git", from: "5.0.2"),
+ .package(url: "https://github.com/RxSwiftCommunity/RxKeyboard.git", from: "2.0.1"),
+ .package(url: "https://github.com/huri000/SwiftEntryKit", from: "2.0.0"),
+ .package(url: "https://github.com/naver/naveridlogin-sdk-ios.git", branch: "master"),
+ .package(url: "https://github.com/krzyzanowskim/CryptoSwift.git", from: "1.8.2"),
+ .package(url: "https://github.com/cbpowell/MarqueeLabel.git", from: "4.5.0"),
+ .package(url: "https://github.com/firebase/firebase-ios-sdk.git", from: "10.25.0"),
+ .package(url: "https://github.com/ninjaprox/NVActivityIndicatorView.git", from: "5.2.0"),
+ .package(url: "https://github.com/ReactorKit/ReactorKit.git", from: "3.2.0"),
+ .package(url: "https://github.com/Quick/Quick.git", from: "7.5.0"),
+ .package(url: "https://github.com/Quick/Nimble.git", from: "13.3.0"),
+ .package(url: "https://github.com/krzysztofzablocki/Inject.git", from: "1.5.0"),
+ .package(url: "https://github.com/RxSwiftCommunity/RxGesture.git", from: "4.0.4")
+ ]
+)
diff --git a/Plugin/ConfigurationPlugin/Plugin.swift b/Plugin/ConfigurationPlugin/Plugin.swift
new file mode 100644
index 000000000..e42bddc80
--- /dev/null
+++ b/Plugin/ConfigurationPlugin/Plugin.swift
@@ -0,0 +1,3 @@
+import ProjectDescription
+
+let configurationPlugin = Plugin(name: "ConfigurationPlugin")
diff --git a/Plugin/ConfigurationPlugin/ProjectDescriptionHelpers/Configuration+Ext.swift b/Plugin/ConfigurationPlugin/ProjectDescriptionHelpers/Configuration+Ext.swift
new file mode 100644
index 000000000..96724758f
--- /dev/null
+++ b/Plugin/ConfigurationPlugin/ProjectDescriptionHelpers/Configuration+Ext.swift
@@ -0,0 +1,13 @@
+import ProjectDescription
+
+public extension Array where Element == Configuration {
+ static let `default`: [Configuration] = [
+ .debug(name: .debug, xcconfig: .relativeToRoot("Projects/App/XCConfig/Secrets.xcconfig")),
+ .debug(name: .qa, xcconfig: .relativeToRoot("Projects/App/XCConfig/Secrets.xcconfig")),
+ .release(name: .release, xcconfig: .relativeToRoot("Projects/App/XCConfig/Secrets.xcconfig"))
+ ]
+}
+
+public extension ProjectDescription.ConfigurationName {
+ static let qa = ConfigurationName.configuration("QA")
+}
diff --git a/Plugin/DependencyPlugin/Plugin.swift b/Plugin/DependencyPlugin/Plugin.swift
new file mode 100644
index 000000000..16e44d2f9
--- /dev/null
+++ b/Plugin/DependencyPlugin/Plugin.swift
@@ -0,0 +1,3 @@
+import ProjectDescription
+
+let dependencyPlugin = Plugin(name: "DependencyPlugin")
diff --git a/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+Carthage.swift b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+Carthage.swift
new file mode 100644
index 000000000..3680231db
--- /dev/null
+++ b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+Carthage.swift
@@ -0,0 +1,10 @@
+import ProjectDescription
+
+public extension TargetDependency {
+ struct Carthage {}
+}
+
+public extension TargetDependency.Carthage {
+ static let Realm = TargetDependency.external(name: "Realm")
+ static let RealmSwift = TargetDependency.external(name: "RealmSwift")
+}
diff --git a/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+Project.swift b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+Project.swift
new file mode 100644
index 000000000..6c3a848de
--- /dev/null
+++ b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+Project.swift
@@ -0,0 +1,11 @@
+import ProjectDescription
+
+public extension TargetDependency {
+ struct Project {
+ public struct Features {}
+ public struct Module {}
+ public struct Service {}
+ public struct UserInterfaces {}
+ }
+}
+
diff --git a/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+SPM.swift b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+SPM.swift
new file mode 100644
index 000000000..adaef7b5a
--- /dev/null
+++ b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+SPM.swift
@@ -0,0 +1,38 @@
+import ProjectDescription
+
+public extension TargetDependency {
+ struct SPM {}
+}
+
+public extension TargetDependency.SPM {
+ // MARK: External
+ static let Moya = TargetDependency.external(name: "Moya")
+ static let RxMoya = TargetDependency.external(name: "RxMoya")
+ static let FittedSheets = TargetDependency.external(name: "FittedSheets")
+ static let RxSwift = TargetDependency.external(name: "RxSwift")
+ static let RxCocoa = TargetDependency.external(name: "RxCocoa")
+ static let Kingfisher = TargetDependency.external(name: "Kingfisher")
+ static let Then = TargetDependency.external(name: "Then")
+ static let SnapKit = TargetDependency.external(name: "SnapKit")
+ static let ReachabilitySwift = TargetDependency.external(name: "ReachabilitySwift")
+ static let Lottie = TargetDependency.external(name: "Lottie")
+ static let Needle = TargetDependency.external(name: "NeedleFoundation")
+ static let Tabman = TargetDependency.external(name: "Tabman")
+ static let RxDataSources = TargetDependency.external(name: "RxDataSources")
+ static let RxKeyboard = TargetDependency.external(name: "RxKeyboard")
+ static let SwiftEntryKit = TargetDependency.external(name: "SwiftEntryKit")
+ static let NaverLogin = TargetDependency.external(name: "NaverThirdPartyLogin")
+ static let CryptoSwift = TargetDependency.external(name: "CryptoSwift")
+ static let MarqueeLabel = TargetDependency.external(name: "MarqueeLabel")
+ static let FirebaseAnalytics = TargetDependency.external(name: "FirebaseAnalyticsWithoutAdIdSupport")
+ static let FirebaseCrashlytics = TargetDependency.external(name: "FirebaseCrashlytics")
+ static let FirebaseMessaging = TargetDependency.external(name: "FirebaseMessaging")
+ static let NVActivityIndicatorView = TargetDependency.external(name: "NVActivityIndicatorView")
+ static let ReactorKit = TargetDependency.external(name: "ReactorKit")
+ static let Quick = TargetDependency.external(name: "Quick")
+ static let Nimble = TargetDependency.external(name: "Nimble")
+ static let Inject = TargetDependency.external(name: "Inject")
+ static let Realm = TargetDependency.external(name: "Realm")
+ static let RealmSwift = TargetDependency.external(name: "RealmSwift")
+ static let RxGesture = TargetDependency.external(name: "RxGesture")
+}
diff --git a/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+XCFramework.swift b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+XCFramework.swift
new file mode 100644
index 000000000..eaab5ff05
--- /dev/null
+++ b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/Dependency+XCFramework.swift
@@ -0,0 +1,18 @@
+import ProjectDescription
+
+public extension TargetDependency {
+ struct XCFramework {}
+}
+
+public extension TargetDependency.XCFramework {
+ static let Realm = TargetDependency.xcframework(
+ path: .relativeToRoot("Carthage/Build/Realm.xcframework"),
+ status: .required,
+ condition: .when([.ios])
+ )
+ static let RealmSwift = TargetDependency.xcframework(
+ path: .relativeToRoot("Carthage/Build/RealmSwift.xcframework"),
+ status: .required,
+ condition: .when([.ios])
+ )
+}
diff --git a/Plugin/DependencyPlugin/ProjectDescriptionHelpers/ModulePaths.swift b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/ModulePaths.swift
new file mode 100644
index 000000000..3f16a2db8
--- /dev/null
+++ b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/ModulePaths.swift
@@ -0,0 +1,120 @@
+//
+// ModulePaths.swift
+// DependencyPlugin
+//
+// Created by yongbeomkwak on 2/18/24.
+//
+
+import Foundation
+
+public enum ModulePaths {
+ case feature(Feature)
+ case service(Service)
+ case module(Module)
+ case userInterface(UserInterface)
+ case domain(Domain)
+}
+
+extension ModulePaths: MicroTargetPathConvertable {
+ public func targetName(type: MicroTargetType) -> String {
+ switch self {
+ case let .feature(module as any MicroTargetPathConvertable),
+ let .module(module as any MicroTargetPathConvertable),
+ let .service(module as any MicroTargetPathConvertable),
+ let .userInterface(module as any MicroTargetPathConvertable),
+ let .domain(module as any MicroTargetPathConvertable):
+ return module.targetName(type: type)
+ }
+ }
+}
+
+public extension ModulePaths {
+ enum Feature: String, MicroTargetPathConvertable {
+ case CreditSongListFeature
+ case SongCreditFeature
+ case TeamFeature
+ case FruitDrawFeature
+ case LyricHighlightingFeature
+ case MyInfoFeature
+ case MusicDetailFeature
+ case PlaylistFeature
+ case BaseFeature
+ case ArtistFeature
+ case ChartFeature
+ case HomeFeature
+ case MainTabFeature
+ case RootFeature
+ case SearchFeature
+ case SignInFeature
+ case StorageFeature
+ }
+}
+
+public extension ModulePaths {
+ enum Domain: String, MicroTargetPathConvertable {
+ case PriceDomain
+ case CreditDomain
+ case TeamDomain
+ case NotificationDomain
+ case ImageDomain
+ case SearchDomain
+ case BaseDomain
+ case AppDomain
+ case ArtistDomain
+ case AuthDomain
+ case ChartDomain
+ case FaqDomain
+ case LikeDomain
+ case NoticeDomain
+ case PlaylistDomain
+ case SongsDomain
+ case UserDomain
+ }
+}
+
+public extension ModulePaths {
+ enum Module: String, MicroTargetPathConvertable {
+ case Localization
+ case LogManager
+ case ErrorModule
+ case FeatureThirdPartyLib
+ case KeychainModule
+ case ThirdPartyLib
+ case Utility
+ }
+}
+
+public extension ModulePaths {
+ enum Service: String, MicroTargetPathConvertable {
+ case APIKit
+ case DatabaseModule
+ case DataMappingModule
+ case DataModule
+ case DomainModule
+ case NetworkModule
+ }
+}
+
+public extension ModulePaths {
+ enum UserInterface: String, MicroTargetPathConvertable {
+ case DesignSystem
+ }
+}
+
+public enum MicroTargetType: String {
+ case interface = "Interface"
+ case sources = ""
+ case testing = "Testing"
+ case unitTest = "Tests"
+ case demo = "Demo"
+}
+
+public protocol MicroTargetPathConvertable {
+ func targetName(type: MicroTargetType) -> String
+}
+
+public extension MicroTargetPathConvertable where Self: RawRepresentable {
+ func targetName(type: MicroTargetType) -> String {
+ "\(self.rawValue)\(type.rawValue)"
+ }
+}
diff --git a/Plugin/DependencyPlugin/ProjectDescriptionHelpers/PathExtension.swift b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/PathExtension.swift
new file mode 100644
index 000000000..e48b6ede2
--- /dev/null
+++ b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/PathExtension.swift
@@ -0,0 +1,26 @@
+import ProjectDescription
+
+public extension ProjectDescription.Path {
+ static func relativeToFeature(_ path: String) -> Self {
+ return .relativeToRoot("Projects/Features/\(path)")
+ }
+ static func relativeToSections(_ path: String) -> Self {
+ return .relativeToRoot("Projects/\(path)")
+ }
+ static func relativeToModule(_ path: String) -> Self {
+ return .relativeToRoot("Projects/Modules/\(path)")
+ }
+ static func relativeToService(_ path: String) -> Self {
+ return .relativeToRoot("Projects/Services/\(path)")
+ }
+ static func relativeToUserInterfaces(_ path: String) -> Self {
+ return .relativeToRoot("Projects/UsertInterfaces/\(path)")
+ }
+ static func relativeToDomain(_ path: String) -> Self {
+ return .relativeToRoot("Projects/Domains/\(path)")
+ }
+ static var app: Self {
+ return .relativeToRoot("Projects/App")
+ }
+}
+
diff --git a/Plugin/DependencyPlugin/ProjectDescriptionHelpers/TargetDependency+MicroFeatureTarget.swift b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/TargetDependency+MicroFeatureTarget.swift
new file mode 100644
index 000000000..ab47b025c
--- /dev/null
+++ b/Plugin/DependencyPlugin/ProjectDescriptionHelpers/TargetDependency+MicroFeatureTarget.swift
@@ -0,0 +1,61 @@
+//
+// TargetDependency+MicroFeatureTarget.swift
+// DependencyPlugin
+//
+// Created by yongbeomkwak on 2/18/24.
+//
+
+import Foundation
+import ProjectDescription
+
+public extension TargetDependency {
+ static func feature(
+ target: ModulePaths.Feature,
+ type: MicroTargetType = .sources
+ ) -> TargetDependency {
+ .project(
+ target: target.targetName(type: type),
+ path: .relativeToFeature(target.rawValue)
+ )
+ }
+
+ static func service(
+ target: ModulePaths.Service,
+ type: MicroTargetType = .sources
+ ) -> TargetDependency {
+ .project(
+ target: target.targetName(type: type),
+ path: .relativeToService(target.rawValue)
+ )
+ }
+
+ static func module(
+ target: ModulePaths.Module,
+ type: MicroTargetType = .sources
+ ) -> TargetDependency {
+ .project(
+ target: target.targetName(type: type),
+ path: .relativeToModule(target.rawValue)
+ )
+ }
+
+ static func userInterface(
+ target: ModulePaths.UserInterface,
+ type: MicroTargetType = .sources
+ ) -> TargetDependency {
+ .project(
+ target: target.targetName(type: type),
+ path: .relativeToUserInterfaces(target.rawValue)
+ )
+ }
+
+ static func domain(
+ target: ModulePaths.Domain,
+ type: MicroTargetType = .sources
+ ) -> TargetDependency {
+ .project(
+ target: target.targetName(type: type),
+ path: .relativeToDomain(target.rawValue)
+ )
+ }
+}
diff --git a/Plugin/EnvironmentPlugin/Plugin.swift b/Plugin/EnvironmentPlugin/Plugin.swift
new file mode 100644
index 000000000..cbbdd337b
--- /dev/null
+++ b/Plugin/EnvironmentPlugin/Plugin.swift
@@ -0,0 +1,3 @@
+import ProjectDescription
+
+let environmentPlugin = Plugin(name: "EnvironmentPlugin")
diff --git a/Plugin/EnvironmentPlugin/ProjectDescriptionHelpers/ProjectEnvironment.swift b/Plugin/EnvironmentPlugin/ProjectDescriptionHelpers/ProjectEnvironment.swift
new file mode 100644
index 000000000..16d8a67bb
--- /dev/null
+++ b/Plugin/EnvironmentPlugin/ProjectDescriptionHelpers/ProjectEnvironment.swift
@@ -0,0 +1,28 @@
+import Foundation
+import ProjectDescription
+
+public struct ProjectEnvironment {
+ public let previousName : String
+ public let name: String
+ public let organizationName: String
+ public let deploymentTargets: DeploymentTargets
+ public let destinations : Destinations
+ public let baseSetting: SettingsDictionary
+
+
+}
+
+public let env = ProjectEnvironment(
+ previousName: "Billboardoo",
+ name: "WaktaverseMusic",
+ organizationName: "yongbeomkwak",
+ deploymentTargets: .iOS("15.0"),
+ destinations: [.iPhone],
+ baseSetting: SettingsDictionary()
+ .marketingVersion("3.0.0")
+ .currentProjectVersion("0")
+ .debugInformationFormat(DebugInformationFormat.dwarfWithDsym)
+ .otherLinkerFlags(["-ObjC"])
+ .bitcodeEnabled(false)
+)
+
diff --git a/Plugin/TemplatePlugin/Plugin.swift b/Plugin/TemplatePlugin/Plugin.swift
new file mode 100644
index 000000000..61a20da19
--- /dev/null
+++ b/Plugin/TemplatePlugin/Plugin.swift
@@ -0,0 +1,3 @@
+import ProjectDescription
+
+let templatePlugin = Plugin(name: "TemplatePlugin")
diff --git a/Plugin/TemplatePlugin/Templates/Demo/Demo.swift b/Plugin/TemplatePlugin/Templates/Demo/Demo.swift
new file mode 100644
index 000000000..a43d23cc1
--- /dev/null
+++ b/Plugin/TemplatePlugin/Templates/Demo/Demo.swift
@@ -0,0 +1,22 @@
+import ProjectDescription
+
+private let layerAttribute = Template.Attribute.required("layer")
+private let nameAttribute = Template.Attribute.required("name")
+
+private let template = Template(
+ description: "A template for a new module's demo target",
+ attributes: [
+ layerAttribute,
+ nameAttribute
+ ],
+ items: [
+ .file(
+ path: "Projects/\(layerAttribute)/\(nameAttribute)/Demo/Sources/AppDelegate.swift",
+ templatePath: "DemoSources.stencil"
+ ),
+ .file(
+ path: "Projects/\(layerAttribute)/\(nameAttribute)/Demo/Resources/LaunchScreen.storyboard",
+ templatePath: "DemoResources.stencil"
+ )
+ ]
+)
diff --git a/.tuist-bin/Templates/LaunchScreen+iOS.stencil b/Plugin/TemplatePlugin/Templates/Demo/DemoResources.stencil
similarity index 100%
rename from .tuist-bin/Templates/LaunchScreen+iOS.stencil
rename to Plugin/TemplatePlugin/Templates/Demo/DemoResources.stencil
diff --git a/Plugin/TemplatePlugin/Templates/Demo/DemoSources.stencil b/Plugin/TemplatePlugin/Templates/Demo/DemoSources.stencil
new file mode 100644
index 000000000..ef2bae045
--- /dev/null
+++ b/Plugin/TemplatePlugin/Templates/Demo/DemoSources.stencil
@@ -0,0 +1,19 @@
+import UIKit
+
+@main
+final class AppDelegate: UIResponder, UIApplicationDelegate {
+ var window: UIWindow?
+
+ func application(
+ _ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
+ ) -> Bool {
+ window = UIWindow(frame: UIScreen.main.bounds)
+ let viewController = UIViewController()
+ viewController.view.backgroundColor = .yellow
+ window?.rootViewController = viewController
+ window?.makeKeyAndVisible()
+
+ return true
+ }
+}
diff --git a/Plugin/TemplatePlugin/Templates/Interface/Interface.stencil b/Plugin/TemplatePlugin/Templates/Interface/Interface.stencil
new file mode 100644
index 000000000..b1853ce60
--- /dev/null
+++ b/Plugin/TemplatePlugin/Templates/Interface/Interface.stencil
@@ -0,0 +1 @@
+// This is for Tuist
diff --git a/Plugin/TemplatePlugin/Templates/Interface/Interface.swift b/Plugin/TemplatePlugin/Templates/Interface/Interface.swift
new file mode 100644
index 000000000..3e518fac0
--- /dev/null
+++ b/Plugin/TemplatePlugin/Templates/Interface/Interface.swift
@@ -0,0 +1,18 @@
+import ProjectDescription
+
+private let layerAttribute = Template.Attribute.required("layer")
+private let nameAttribute = Template.Attribute.required("name")
+
+private let template = Template(
+ description: "A template for a new module's interface target",
+ attributes: [
+ layerAttribute,
+ nameAttribute
+ ],
+ items: [
+ .file(
+ path: "Projects/\(layerAttribute)/\(nameAttribute)/Interface/Interface.swift",
+ templatePath: "Interface.stencil"
+ )
+ ]
+)
diff --git a/Plugin/TemplatePlugin/Templates/Sources/Sources.stencil b/Plugin/TemplatePlugin/Templates/Sources/Sources.stencil
new file mode 100644
index 000000000..b1853ce60
--- /dev/null
+++ b/Plugin/TemplatePlugin/Templates/Sources/Sources.stencil
@@ -0,0 +1 @@
+// This is for Tuist
diff --git a/Plugin/TemplatePlugin/Templates/Sources/Sources.swift b/Plugin/TemplatePlugin/Templates/Sources/Sources.swift
new file mode 100644
index 000000000..dcb8bf2b8
--- /dev/null
+++ b/Plugin/TemplatePlugin/Templates/Sources/Sources.swift
@@ -0,0 +1,18 @@
+import ProjectDescription
+
+private let layerAttribute = Template.Attribute.required("layer")
+private let nameAttribute = Template.Attribute.required("name")
+
+private let template = Template(
+ description: "A template for a new module's sources target",
+ attributes: [
+ layerAttribute,
+ nameAttribute
+ ],
+ items: [
+ .file(
+ path: "Projects/\(layerAttribute)/\(nameAttribute)/Sources/Sources.swift",
+ templatePath: "Sources.stencil"
+ )
+ ]
+)
diff --git a/Plugin/TemplatePlugin/Templates/Testing/Testing.stencil b/Plugin/TemplatePlugin/Templates/Testing/Testing.stencil
new file mode 100644
index 000000000..b1853ce60
--- /dev/null
+++ b/Plugin/TemplatePlugin/Templates/Testing/Testing.stencil
@@ -0,0 +1 @@
+// This is for Tuist
diff --git a/Plugin/TemplatePlugin/Templates/Testing/Testing.swift b/Plugin/TemplatePlugin/Templates/Testing/Testing.swift
new file mode 100644
index 000000000..e945d0a03
--- /dev/null
+++ b/Plugin/TemplatePlugin/Templates/Testing/Testing.swift
@@ -0,0 +1,18 @@
+import ProjectDescription
+
+private let layerAttribute = Template.Attribute.required("layer")
+private let nameAttribute = Template.Attribute.required("name")
+
+private let template = Template(
+ description: "A template for a new module's testing target",
+ attributes: [
+ layerAttribute,
+ nameAttribute
+ ],
+ items: [
+ .file(
+ path: "Projects/\(layerAttribute)/\(nameAttribute)/Testing/Testing.swift",
+ templatePath: "Testing.stencil"
+ )
+ ]
+)
diff --git a/Plugin/TemplatePlugin/Templates/Tests/Tests.stencil b/Plugin/TemplatePlugin/Templates/Tests/Tests.stencil
new file mode 100644
index 000000000..a6a1c6579
--- /dev/null
+++ b/Plugin/TemplatePlugin/Templates/Tests/Tests.stencil
@@ -0,0 +1,11 @@
+import XCTest
+
+final class {{ name }}Tests: XCTestCase {
+ override func setUpWithError() throws {}
+
+ override func tearDownWithError() throws {}
+
+ func testExample() {
+ XCTAssertEqual(1, 1)
+ }
+}
diff --git a/Plugin/TemplatePlugin/Templates/Tests/Tests.swift b/Plugin/TemplatePlugin/Templates/Tests/Tests.swift
new file mode 100644
index 000000000..09d79c9eb
--- /dev/null
+++ b/Plugin/TemplatePlugin/Templates/Tests/Tests.swift
@@ -0,0 +1,18 @@
+import ProjectDescription
+
+private let layerAttribute = Template.Attribute.required("layer")
+private let nameAttribute = Template.Attribute.required("name")
+
+private let template = Template(
+ description: "A template for a new module's unit test target",
+ attributes: [
+ layerAttribute,
+ nameAttribute
+ ],
+ items: [
+ .file(
+ path: "Projects/\(layerAttribute)/\(nameAttribute)/Tests/\(nameAttribute)Test.swift",
+ templatePath: "Tests.stencil"
+ ),
+ ]
+)
diff --git a/Plugin/TemplatePlugin/Templates/UITests/UITests.stencil b/Plugin/TemplatePlugin/Templates/UITests/UITests.stencil
new file mode 100644
index 000000000..2a0cbf033
--- /dev/null
+++ b/Plugin/TemplatePlugin/Templates/UITests/UITests.stencil
@@ -0,0 +1,11 @@
+import XCTest
+
+final class {{ name }}Tests: XCTestCase {
+ override func setUpWithError() throws {}
+
+ override func tearDownWithError() throws {}
+
+ func testExample() throws {
+ XCTAssertEqual("A", "A")
+ }
+}
diff --git a/Plugin/TemplatePlugin/Templates/UITests/UITests.swift b/Plugin/TemplatePlugin/Templates/UITests/UITests.swift
new file mode 100644
index 000000000..716ef2460
--- /dev/null
+++ b/Plugin/TemplatePlugin/Templates/UITests/UITests.swift
@@ -0,0 +1,18 @@
+import ProjectDescription
+
+private let layerAttribute = Template.Attribute.required("layer")
+private let nameAttribute = Template.Attribute.required("name")
+
+private let template = Template(
+ description: "A template for a new module's ui test target",
+ attributes: [
+ layerAttribute,
+ nameAttribute
+ ],
+ items: [
+ .file(
+ path: "Projects/\(layerAttribute)/\(nameAttribute)/UITests/\(nameAttribute)UITests.swift",
+ templatePath: "UITests.stencil"
+ ),
+ ]
+)
diff --git a/Plugin/UtilityPlugin/Plugin.swift b/Plugin/UtilityPlugin/Plugin.swift
deleted file mode 100644
index dcf03c5cc..000000000
--- a/Plugin/UtilityPlugin/Plugin.swift
+++ /dev/null
@@ -1,3 +0,0 @@
-import ProjectDescription
-
-let utilityPlugin = Plugin(name: "UtilityPlugin")
diff --git a/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+Project.swift b/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+Project.swift
deleted file mode 100644
index 0e19b330e..000000000
--- a/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+Project.swift
+++ /dev/null
@@ -1,45 +0,0 @@
-import ProjectDescription
-
-public extension TargetDependency {
- struct Project {
- public struct Features {}
- public struct Module {}
- public struct Service {}
- public struct UserInterfaces {}
- }
-}
-
-public extension TargetDependency.Project.Features {
- static let CommonFeature = TargetDependency.feature(name: "CommonFeature")
- static let PlayerFeature = TargetDependency.feature(name: "PlayerFeature")
- static let StorageFeature = TargetDependency.feature(name: "StorageFeature")
- static let SignInFeature = TargetDependency.feature(name: "SignInFeature")
- static let HomeFeature = TargetDependency.feature(name: "HomeFeature")
- static let ChartFeature = TargetDependency.feature(name: "ChartFeature")
- static let SearchFeature = TargetDependency.feature(name: "SearchFeature")
- static let MainTabFeature = TargetDependency.feature(name: "MainTabFeature")
- static let ArtistFeature = TargetDependency.feature(name: "ArtistFeature")
- static let BaseFeature = TargetDependency.feature(name: "BaseFeature")
- static let RootFeature = TargetDependency.feature(name: "RootFeature")
-}
-
-public extension TargetDependency.Project.Module {
- static let FeatureThirdPartyLib = TargetDependency.module(name: "FeatureThirdPartyLib")
- static let ThirdPartyLib = TargetDependency.module(name: "ThirdPartyLib")
- static let Utility = TargetDependency.module(name: "Utility")
- static let KeychainModule = TargetDependency.module(name: "KeychainModule")
- static let ErrorModule = TargetDependency.module(name: "ErrorModule")
-}
-
-public extension TargetDependency.Project.Service {
- static let APIKit = TargetDependency.service(name: "APIKit")
- static let Data = TargetDependency.service(name: "DataModule")
- static let Domain = TargetDependency.service(name: "DomainModule")
- static let DatabaseModule = TargetDependency.service(name: "DatabaseModule")
- static let DataMappingModule = TargetDependency.service(name: "DataMappingModule")
- static let NetworkModule = TargetDependency.service(name: "NetworkModule")
-}
-
-public extension TargetDependency.Project.UserInterfaces {
- static let DesignSystem = TargetDependency.ui(name: "DesignSystem")
-}
diff --git a/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+SPM.swift b/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+SPM.swift
deleted file mode 100644
index 2ad216bac..000000000
--- a/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+SPM.swift
+++ /dev/null
@@ -1,50 +0,0 @@
-import ProjectDescription
-
-public extension TargetDependency {
- struct SPM {}
-}
-
-public extension TargetDependency.SPM {
- // MARK: External
- static let Moya = TargetDependency.external(name: "Moya")
- static let RxMoya = TargetDependency.external(name: "RxMoya")
- static let PanModal = TargetDependency.external(name: "PanModal")
- static let RxSwift = TargetDependency.external(name: "RxSwift")
- static let RxCocoa = TargetDependency.external(name: "RxCocoa")
- static let Kingfisher = TargetDependency.external(name: "Kingfisher")
- static let Then = TargetDependency.external(name: "Then")
- static let SnapKit = TargetDependency.external(name: "SnapKit")
- static let ReachabilitySwift = TargetDependency.external(name: "ReachabilitySwift")
- static let Lottie = TargetDependency.external(name: "Lottie")
- static let Needle = TargetDependency.external(name: "NeedleFoundation")
- static let Tabman = TargetDependency.external(name: "Tabman")
- static let RxDataSources = TargetDependency.external(name: "RxDataSources")
- static let RxKeyboard = TargetDependency.external(name: "RxKeyboard")
- static let SwiftEntryKit = TargetDependency.external(name: "SwiftEntryKit")
- static let NaverLogin = TargetDependency.external(name: "naveridlogin-ios-sp")
- static let CryptoSwift = TargetDependency.external(name: "CryptoSwift")
- static let MarqueeLabel = TargetDependency.external(name: "MarqueeLabel")
- static let FirebaseAnalytics = TargetDependency.external(name: "FirebaseAnalyticsWithoutAdIdSupport")
- static let FirebaseCrashlytics = TargetDependency.external(name: "FirebaseCrashlytics")
- static let NVActivityIndicatorView = TargetDependency.external(name: "NVActivityIndicatorView")
-
-// MARK: Native SPM
- static let YouTubePlayerKit = TargetDependency.package(product: "YouTubePlayerKit")
- // static let Amplify = TargetDependency.package(product: "Amplify")
- // static let AWSCognitoAuthPlugin = TargetDependency.package(product: "AWSCognitoAuthPlugin")
- // static let AWSS3StoragePlugin = TargetDependency.package(product:"AWSS3StoragePlugin")
-}
-
-public extension Package {
- static let YouTubePlayerKit = Package.remote(
- url: "https://github.com/SvenTiigi/YouTubePlayerKit.git",
- requirement: .upToNextMajor(from: "1.3.1")
- )
-
- /*
- static let Amplify = Package.remote(
- url: "https://github.com/aws-amplify/amplify-swift.git",
- requirement: .upToNextMajor(from: "2.10.0")
- )
- */
-}
diff --git "a/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+XCFramework\342\200\216.swift" "b/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+XCFramework\342\200\216.swift"
deleted file mode 100644
index f0c187019..000000000
--- "a/Plugin/UtilityPlugin/ProjectDescriptionHelpers/Dependency+XCFramework\342\200\216.swift"
+++ /dev/null
@@ -1,10 +0,0 @@
-import ProjectDescription
-
-public extension TargetDependency {
- struct XCFramework {}
-}
-
-public extension TargetDependency.XCFramework {
- static let Realm = TargetDependency.xcframework(path: "Frameworks/Realm.xcframework")
- static let RealmSwift = TargetDependency.xcframework(path: "Frameworks/RealmSwift.xcframework")
-}
diff --git a/Plugin/UtilityPlugin/ProjectDescriptionHelpers/PathExtension.swift b/Plugin/UtilityPlugin/ProjectDescriptionHelpers/PathExtension.swift
deleted file mode 100644
index c5cfddf0f..000000000
--- a/Plugin/UtilityPlugin/ProjectDescriptionHelpers/PathExtension.swift
+++ /dev/null
@@ -1,37 +0,0 @@
-import ProjectDescription
-
-public extension ProjectDescription.Path {
- static func relativeToFeature(_ path: String) -> Self {
- return .relativeToRoot("Projects/Features/\(path)")
- }
- static func relativeToSections(_ path: String) -> Self {
- return .relativeToRoot("Projects/\(path)")
- }
- static func relativeToModule(_ path: String) -> Self {
- return .relativeToRoot("Projects/Modules/\(path)")
- }
- static func relativeToService(_ path: String) -> Self {
- return .relativeToRoot("Projects/Services/\(path)")
- }
- static func relativeToUserInterfaces(_ path: String) -> Self {
- return .relativeToRoot("Projects/UsertInterfaces/\(path)")
- }
- static var app: Self {
- return .relativeToRoot("Projects/App")
- }
-}
-
-public extension TargetDependency {
- static func module(name: String) -> Self {
- return .project(target: name, path: .relativeToModule(name))
- }
- static func service(name: String) -> Self {
- return .project(target: name, path: .relativeToService(name))
- }
- static func feature(name: String) -> Self {
- return .project(target: name, path: .relativeToFeature(name))
- }
- static func ui(name: String) -> Self {
- return .project(target: name, path: .relativeToUserInterfaces(name))
- }
-}
diff --git a/Projects/App/.swiftlint.yml b/Projects/App/.swiftlint.yml
deleted file mode 100644
index 2ad4cc08c..000000000
--- a/Projects/App/.swiftlint.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-excluded:
- - "**/*/NeedleGenerated.swift"
- - "Tuist"
-
-
-force_cast: # From https://realm.github.io/SwiftLint/force_cast.html
- warning # 강제 캐스팅은 error에서 warning으로 변경
-
-disabled_rules:
- - trailing_whitespace
- - vertical_whitespace
- - colon
- - comma
- - comment_spacing # 주석 여백
- - mark # //MARK 관련 warning
- - opening_brace # 괄호 열 때 줄바꿈을 했는지 안했는지, (안했으면 warning)
- - line_length # 한줄에 글자 수 제한 , warning: 120, error: 200 (default)
- - statement_position # if는 반드시 else로 끝나야한다.
- - identifier_name #변수명 글자 수 제한
\ No newline at end of file
diff --git a/Projects/App/Project.swift b/Projects/App/Project.swift
index 4ddc94a6d..c73afcdfe 100644
--- a/Projects/App/Project.swift
+++ b/Projects/App/Project.swift
@@ -1,97 +1,127 @@
-import ProjectDescriptionHelpers
-import ProjectDescription
-import UtilityPlugin
+import EnvironmentPlugin
import Foundation
+import ProjectDescription
+import ProjectDescriptionHelpers
let settinges: Settings =
- .settings(base: Environment.baseSetting,
- configurations: [
- .debug(name: .debug),
- .release(name: .release)
- ],
- defaultSettings: .recommended)
-
-let isForDev = (ProcessInfo.processInfo.environment["TUIST_DEV"] ?? "0") == "1" ? true : false
+ .settings(
+ base: env.baseSetting,
+ configurations: [
+ .debug(name: .debug),
+ .debug(name: .qa),
+ .release(name: .release)
+ ],
+ defaultSettings: .recommended
+ )
-let scripts: [TargetScript] = isForDev ? [.swiftLint, .needle] : [.firebaseCrashlytics]
+let scripts: [TargetScript] = generateEnvironment.appScripts
let targets: [Target] = [
- .init(
- name: Environment.targetName,
- platform: .iOS,
+ .target(
+ name: env.name,
+ destinations: [.iPhone],
product: .app,
- productName: Environment.appName,
- bundleId: "\(Environment.organizationName).\(Environment.beforeName)",
- deploymentTarget: Environment.deploymentTarget,
+ productName: env.name,
+ bundleId: "\(env.organizationName).\(env.previousName)",
+ deploymentTargets: env.deploymentTargets,
infoPlist: .file(path: "Support/Info.plist"),
sources: ["Sources/**"],
resources: ["Resources/**"],
- entitlements: "Support/\(Environment.appName).entitlements",
+ entitlements: "Support/\(env.name).entitlements",
scripts: scripts,
dependencies: [
- .Project.Features.RootFeature,
- .Project.Module.ThirdPartyLib,
- .Project.Service.Data,
- // .SPM.Amplify,
- // .SPM.AWSCognitoAuthPlugin,
- // .SPM.AWSS3StoragePlugin,
+ .module(target: .ThirdPartyLib),
+ .feature(target: .RootFeature),
+ .feature(target: .PlaylistFeature),
+ .feature(target: .MusicDetailFeature),
+ .feature(target: .SongCreditFeature),
+ .feature(target: .CreditSongListFeature),
+ .domain(target: .AppDomain),
+ .domain(target: .ArtistDomain),
+ .domain(target: .AuthDomain),
+ .domain(target: .ChartDomain),
+ .domain(target: .FaqDomain),
+ .domain(target: .LikeDomain),
+ .domain(target: .NoticeDomain),
+ .domain(target: .SongsDomain),
+ .domain(target: .PlaylistDomain),
+ .domain(target: .UserDomain),
+ .domain(target: .SearchDomain),
+ .domain(target: .ImageDomain),
+ .domain(target: .NotificationDomain),
+ .domain(target: .TeamDomain),
+ .domain(target: .CreditDomain),
+ .domain(target: .PriceDomain)
],
- settings: .settings(base: Environment.baseSetting,
- configurations: [
- .debug(name: .debug, xcconfig: "XCConfig/Secrets.xcconfig"),
- .release(name: .release, xcconfig: "XCConfig/Secrets.xcconfig")
- ])
+ settings: .settings(
+ base: env.baseSetting,
+ configurations: [
+ .debug(name: .debug, xcconfig: "XCConfig/Secrets.xcconfig"),
+ .debug(name: .qa, xcconfig: "XCConfig/Secrets.xcconfig"),
+ .release(name: .release, xcconfig: "XCConfig/Secrets.xcconfig")
+ ]
+ ),
+ environmentVariables: ["NETWORK_LOG_LEVEL": "short"]
),
- .init(
- name: Environment.targetTestName,
- platform: .iOS,
+ .target(
+ name: "\(env.name)Tests",
+ destinations: [.iPhone],
product: .unitTests,
- bundleId: "\(Environment.organizationName).\(Environment.beforeName)Tests",
- deploymentTarget: Environment.deploymentTarget,
+ bundleId: "\(env.organizationName).\(env.previousName)Tests",
+ deploymentTargets: env.deploymentTargets,
infoPlist: .default,
sources: ["Tests/**"],
dependencies: [
- .target(name: Environment.targetName)
+ .target(name: env.name)
]
)
]
let schemes: [Scheme] = [
- .init(
- name: "\(Environment.targetName)-DEBUG",
- shared: true,
- buildAction: .buildAction(targets: ["\(Environment.targetName)"]),
- testAction: TestAction.targets(
- ["\(Environment.targetTestName)"],
- configuration: .debug,
- options: TestActionOptions.options(
- coverage: true,
- codeCoverageTargets: ["\(Environment.targetName)"]
- )
- ),
- runAction: .runAction(configuration: .debug),
- archiveAction: .archiveAction(configuration: .debug),
- profileAction: .profileAction(configuration: .debug),
- analyzeAction: .analyzeAction(configuration: .debug)
+ .scheme(
+ name: "\(env.name)-DEBUG",
+ shared: true,
+ buildAction: .buildAction(targets: ["\(env.name)"]),
+ testAction: TestAction.targets(
+ ["\(env.name)"],
+ configuration: .debug,
+ options: TestActionOptions.options(
+ coverage: true,
+ codeCoverageTargets: ["\(env.name)"]
+ )
+ ),
+ runAction: .runAction(configuration: .debug),
+ archiveAction: .archiveAction(configuration: .debug),
+ profileAction: .profileAction(configuration: .debug),
+ analyzeAction: .analyzeAction(configuration: .debug)
),
- .init(
- name: "\(Environment.targetName)-RELEASE",
- shared: true,
- buildAction: BuildAction(targets: ["\(Environment.targetName)"]),
- testAction: nil,
- runAction: .runAction(configuration: .release),
- archiveAction: .archiveAction(configuration: .release),
- profileAction: .profileAction(configuration: .release),
- analyzeAction: .analyzeAction(configuration: .release)
+ .scheme(
+ name: "\(env.name)-QA",
+ shared: true,
+ buildAction: .buildAction(targets: ["\(env.name)"]),
+ testAction: nil,
+ runAction: .runAction(configuration: .qa),
+ archiveAction: .archiveAction(configuration: .qa),
+ profileAction: .profileAction(configuration: .qa),
+ analyzeAction: .analyzeAction(configuration: .qa)
+ ),
+ .scheme(
+ name: "\(env.name)-RELEASE",
+ shared: true,
+ buildAction: .buildAction(targets: ["\(env.name)"]),
+ testAction: nil,
+ runAction: .runAction(configuration: .release),
+ archiveAction: .archiveAction(configuration: .release),
+ profileAction: .profileAction(configuration: .release),
+ analyzeAction: .analyzeAction(configuration: .release)
)
]
let project: Project =
.init(
- name: Environment.targetName,
- organizationName: Environment.organizationName,
+ name: env.name,
+ organizationName: env.organizationName,
packages: [],
- //packages: [.Amplify],
settings: settinges,
targets: targets,
schemes: schemes
diff --git a/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon.png b/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon.png
deleted file mode 100644
index 223eb6a9b..000000000
Binary files a/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon.png and /dev/null differ
diff --git a/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon_1024x1024.png b/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon_1024x1024.png
new file mode 100644
index 000000000..a87bdcdf7
Binary files /dev/null and b/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon_1024x1024.png differ
diff --git a/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json
index cefcc878e..75e969190 100644
--- a/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ b/Projects/App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -1,7 +1,7 @@
{
"images" : [
{
- "filename" : "AppIcon.png",
+ "filename" : "AppIcon_1024x1024.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
diff --git a/Projects/App/Resources/GoogleService-Info-QA.plist b/Projects/App/Resources/GoogleService-Info-QA.plist
new file mode 100644
index 000000000..f6ffe20ea
--- /dev/null
+++ b/Projects/App/Resources/GoogleService-Info-QA.plist
@@ -0,0 +1,30 @@
+
+
+
+
+ API_KEY
+ AIzaSyAgnrvQkVHTDrGimRAP1LRdP-clo6X45Ek
+ GCM_SENDER_ID
+ 121910868968
+ PLIST_VERSION
+ 1
+ BUNDLE_ID
+ yongbeomkwak.Billboardoo
+ PROJECT_ID
+ wakmusic-for-qa
+ STORAGE_BUCKET
+ wakmusic-for-qa.appspot.com
+ IS_ADS_ENABLED
+
+ IS_ANALYTICS_ENABLED
+
+ IS_APPINVITE_ENABLED
+
+ IS_GCM_ENABLED
+
+ IS_SIGNIN_ENABLED
+
+ GOOGLE_APP_ID
+ 1:121910868968:ios:5b3676f5a70ba6535a025d
+
+
\ No newline at end of file
diff --git a/Projects/App/Resources/PrivacyInfo.xcprivacy b/Projects/App/Resources/PrivacyInfo.xcprivacy
new file mode 100644
index 000000000..d9fd48f5b
--- /dev/null
+++ b/Projects/App/Resources/PrivacyInfo.xcprivacy
@@ -0,0 +1,96 @@
+
+
+
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyTracking
+
+ NSPrivacyAccessedAPITypes
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategoryUserDefaults
+ NSPrivacyAccessedAPITypeReasons
+
+ CA92.1
+
+
+
+ NSPrivacyCollectedDataTypes
+
+
+ NSPrivacyCollectedDataType
+ NSPrivacyCollectedDataTypePhotosorVideos
+ NSPrivacyCollectedDataTypeLinked
+
+ NSPrivacyCollectedDataTypeTracking
+
+ NSPrivacyCollectedDataTypePurposes
+
+ NSPrivacyCollectedDataTypePurposeAppFunctionality
+
+
+
+ NSPrivacyCollectedDataType
+ NSPrivacyCollectedDataTypeCustomerSupport
+ NSPrivacyCollectedDataTypeLinked
+
+ NSPrivacyCollectedDataTypeTracking
+
+ NSPrivacyCollectedDataTypePurposes
+
+ NSPrivacyCollectedDataTypePurposeAppFunctionality
+
+
+
+ NSPrivacyCollectedDataType
+ NSPrivacyCollectedDataTypeUserID
+ NSPrivacyCollectedDataTypeLinked
+
+ NSPrivacyCollectedDataTypeTracking
+
+ NSPrivacyCollectedDataTypePurposes
+
+ NSPrivacyCollectedDataTypePurposeAppFunctionality
+
+
+
+ NSPrivacyCollectedDataType
+ NSPrivacyCollectedDataTypeEmailsOrTextMessages
+ NSPrivacyCollectedDataTypeLinked
+
+ NSPrivacyCollectedDataTypeTracking
+
+ NSPrivacyCollectedDataTypePurposes
+
+ NSPrivacyCollectedDataTypePurposeAppFunctionality
+
+
+
+ NSPrivacyCollectedDataType
+ NSPrivacyCollectedDataTypeSearchHistory
+ NSPrivacyCollectedDataTypeLinked
+
+ NSPrivacyCollectedDataTypeTracking
+
+ NSPrivacyCollectedDataTypePurposes
+
+ NSPrivacyCollectedDataTypePurposeAppFunctionality
+
+
+
+ NSPrivacyCollectedDataType
+ NSPrivacyCollectedDataTypeProductInteraction
+ NSPrivacyCollectedDataTypeLinked
+
+ NSPrivacyCollectedDataTypeTracking
+
+ NSPrivacyCollectedDataTypePurposes
+
+ NSPrivacyCollectedDataTypePurposeAnalytics
+
+
+
+
+
diff --git a/Projects/App/Sources/Application/AppComponent+App.swift b/Projects/App/Sources/Application/AppComponent+App.swift
index 648ea070c..ac03e8760 100644
--- a/Projects/App/Sources/Application/AppComponent+App.swift
+++ b/Projects/App/Sources/Application/AppComponent+App.swift
@@ -1,38 +1,25 @@
-//
-// AppComponent+Search.swift
-// WaktaverseMusic
-//
-// Created by yongbeomkwak on 2023/02/07.
-// Copyright © 2023 yongbeomkwak. All rights reserved.
-//
-
-import DomainModule
-import DataModule
-import NetworkModule
-
-
-//MARK: 변수명 주의
-// AppComponent 내 변수 == Dependency 내 변수 이름 같아야함
+import AppDomain
+import AppDomainInterface
+// MARK: 변수명 주의
+// AppComponent 내 변수 == Dependency 내 변수 이름 같아야함
public extension AppComponent {
-
var remoteAppDataSource: any RemoteAppDataSource {
shared {
RemoteAppDataSourceImpl(keychain: keychain)
}
}
-
+
var appRepository: any AppRepository {
shared {
AppRepositoryImpl(remoteAppDataSource: remoteAppDataSource)
}
}
-
-
- var fetchCheckAppUseCase: any FetchCheckAppUseCase{
+
+ var fetchAppCheckUseCase: any FetchAppCheckUseCase {
shared {
- FetchCheckAppUseCaseImpl(appRepository: appRepository)
+ FetchAppCheckUseCaseImpl(appRepository: appRepository)
}
}
}
diff --git a/Projects/App/Sources/Application/AppComponent+Artist.swift b/Projects/App/Sources/Application/AppComponent+Artist.swift
index 52b53c047..c6ff090c8 100644
--- a/Projects/App/Sources/Application/AppComponent+Artist.swift
+++ b/Projects/App/Sources/Application/AppComponent+Artist.swift
@@ -1,58 +1,67 @@
-//
-// AppComponent+Artist.swift
-// WaktaverseMusic
-//
-// Created by KTH on 2023/02/08.
-// Copyright © 2023 yongbeomkwak. All rights reserved.
-//
-
-import DomainModule
-import DataModule
-import NetworkModule
+import ArtistDomain
+import ArtistDomainInterface
import ArtistFeature
+import ArtistFeatureInterface
public extension AppComponent {
-
- //MARK: Artist
- var artistComponent: ArtistComponent {
+ // MARK: Artist
+ var artistFactory: any ArtistFactory {
ArtistComponent(parent: self)
}
-
+
var remoteArtistDataSource: RemoteArtistDataSourceImpl {
shared {
RemoteArtistDataSourceImpl(keychain: keychain)
}
}
-
+
var artistRepository: any ArtistRepository {
shared {
ArtistRepositoryImpl(remoteArtistDataSource: remoteArtistDataSource)
}
}
-
+
var fetchArtistListUseCase: any FetchArtistListUseCase {
shared {
FetchArtistListUseCaseImpl(artistRepository: artistRepository)
}
}
-
- //MARK: Artist Detail
- var artistDetailComponent: ArtistDetailComponent {
+
+ // MARK: Artist Detail
+ var artistDetailFactory: any ArtistDetailFactory {
ArtistDetailComponent(parent: self)
}
-
+
+ var fetchArtistDetailUseCase: any FetchArtistDetailUseCase {
+ shared {
+ FetchArtistDetailUseCaseImpl(artistRepository: artistRepository)
+ }
+ }
+
var fetchArtistSongListUseCase: any FetchArtistSongListUseCase {
shared {
FetchArtistSongListUseCaseImpl(artistRepository: artistRepository)
}
}
-
- //MARK: Artist Detail > Artist Music
+
+ var fetchArtistSubscriptionStatusUseCase: any FetchArtistSubscriptionStatusUseCase {
+ shared {
+ FetchSubscriptionStatusUseCaseImpl(artistRepository: artistRepository)
+ }
+ }
+
+ var subscriptionArtistUseCase: any SubscriptionArtistUseCase {
+ shared {
+ SubscriptionArtistUseCaseImpl(artistRepository: artistRepository)
+ }
+ }
+
+ // MARK: Artist Detail > Artist Music
var artistMusicComponent: ArtistMusicComponent {
ArtistMusicComponent(parent: self)
}
- //MARK: Artist Detail > Artist Music > Artist Music Content
+ // MARK: Artist Detail > Artist Music > Artist Music Content
var artistMusicContentComponent: ArtistMusicContentComponent {
ArtistMusicContentComponent(parent: self)
}
diff --git a/Projects/App/Sources/Application/AppComponent+Auth.swift b/Projects/App/Sources/Application/AppComponent+Auth.swift
index 9255585f8..f731fde47 100644
--- a/Projects/App/Sources/Application/AppComponent+Auth.swift
+++ b/Projects/App/Sources/Application/AppComponent+Auth.swift
@@ -1,90 +1,63 @@
-//
-// AppComponent+Search.swift
-// WaktaverseMusic
-//
-// Created by yongbeomkwak on 2023/02/07.
-// Copyright © 2023 yongbeomkwak. All rights reserved.
-//
-
-import DomainModule
-import DataModule
-import NetworkModule
-import CommonFeature
+import AuthDomain
+import AuthDomainInterface
+import BaseFeature
+import MyInfoFeature
+import MyInfoFeatureInterface
import SignInFeature
+import SignInFeatureInterface
import StorageFeature
+import StorageFeatureInterface
-//MARK: 변수명 주의
+// MARK: 변수명 주의
// AppComponent 내 변수 == Dependency 내 변수 이름 같아야함
-
public extension AppComponent {
-
- var signInComponent : SignInComponent {
+ var signInFactory: any SignInFactory {
SignInComponent(parent: self)
}
-
- var storageComponent : StorageComponent {
-
- StorageComponent(parent: self)
-
- }
-
- var afterLoginComponent: AfterLoginComponent {
-
- AfterLoginComponent(parent: self)
- }
-
- var requestComponent: RequestComponent {
- RequestComponent(parent: self)
+ var localAuthDataSource: any LocalAuthDataSource {
+ shared {
+ LocalAuthDataSourceImpl(keychain: keychain)
+ }
}
-
-
-
+
var remoteAuthDataSource: any RemoteAuthDataSource {
shared {
RemoteAuthDataSourceImpl(keychain: keychain)
}
}
+
var authRepository: any AuthRepository {
shared {
- AuthRepositoryImpl(remoteAuthDataSource: remoteAuthDataSource)
+ AuthRepositoryImpl(
+ localAuthDataSource: localAuthDataSource,
+ remoteAuthDataSource: remoteAuthDataSource
+ )
}
}
-
-
+
var fetchTokenUseCase: any FetchTokenUseCase {
-
shared {
FetchTokenUseCaseImpl(authRepository: authRepository)
}
}
-
- var fetchNaverUserInfoUseCase: any FetchNaverUserInfoUseCase {
-
+
+ var regenerateAccessTokenUseCase: any ReGenerateAccessTokenUseCase {
shared {
- FetchNaverUserInfoUseCaseImpl(authRepository: authRepository)
+ ReGenerateAccessTokenUseCaseImpl(authRepository: authRepository)
}
}
-
-
-
- var fetchUserInfoUseCase: any FetchUserInfoUseCase {
-
+
+ var logoutUseCase: any LogoutUseCase {
shared {
- FetchUserInfoUseCaseImpl(authRepository: authRepository)
+ LogoutUseCaseImpl(authRepository: authRepository)
}
}
-
- var withdrawUserInfoUseCase: any WithdrawUserInfoUseCase {
-
+
+ var checkIsExistAccessTokenUseCase: any CheckIsExistAccessTokenUseCase {
shared {
- WithdrawUserInfoUseCaseImpl(authRepository: authRepository)
+ CheckIsExistAccessTokenUseCaseImpl(authRepository: authRepository)
}
-
}
-
-
-
-
}
diff --git a/Projects/App/Sources/Application/AppComponent+Base.swift b/Projects/App/Sources/Application/AppComponent+Base.swift
new file mode 100644
index 000000000..5387df404
--- /dev/null
+++ b/Projects/App/Sources/Application/AppComponent+Base.swift
@@ -0,0 +1,25 @@
+import BaseFeature
+import BaseFeatureInterface
+import Foundation
+
+public extension AppComponent {
+ var multiPurposePopupFactory: any MultiPurposePopupFactory {
+ MultiPurposePopupComponent(parent: self)
+ }
+
+ var textPopupFactory: any TextPopupFactory {
+ TextPopupComponent(parent: self)
+ }
+
+ var containSongsFactory: any ContainSongsFactory {
+ ContainSongsComponent(parent: self)
+ }
+
+ var privacyFactory: any PrivacyFactory {
+ PrivacyComponent(parent: self)
+ }
+
+ var serviceTermsFactory: any ServiceTermFactory {
+ ServiceTermsComponent(parent: self)
+ }
+}
diff --git a/Projects/App/Sources/Application/AppComponent+Chart.swift b/Projects/App/Sources/Application/AppComponent+Chart.swift
index 707531d24..83a90a6af 100644
--- a/Projects/App/Sources/Application/AppComponent+Chart.swift
+++ b/Projects/App/Sources/Application/AppComponent+Chart.swift
@@ -1,11 +1,11 @@
-import DomainModule
-import DataModule
-import NetworkModule
+import BaseFeature
+import ChartDomain
+import ChartDomainInterface
import ChartFeature
-import CommonFeature
+import ChartFeatureInterface
public extension AppComponent {
- var chartComponent: ChartComponent {
+ var chartFactory: any ChartFactory {
ChartComponent(parent: self)
}
@@ -31,10 +31,9 @@ public extension AppComponent {
}
}
- var fetchChartUpdateTimeUseCase: any FetchChartUpdateTimeUseCase {
+ var fetchCurrentVideoUseCase: any FetchCurrentVideoUseCase {
shared {
- FetchChartUpdateTimeUseCaseImpl(chartRepository: chartRepository)
+ FetchCurrentVideoUseCaseImpl(chartRepository: chartRepository)
}
}
}
-
diff --git a/Projects/App/Sources/Application/AppComponent+Credit.swift b/Projects/App/Sources/Application/AppComponent+Credit.swift
new file mode 100644
index 000000000..c59d3f88c
--- /dev/null
+++ b/Projects/App/Sources/Application/AppComponent+Credit.swift
@@ -0,0 +1,48 @@
+import CreditDomain
+import CreditDomainInterface
+import CreditSongListFeature
+import CreditSongListFeatureInterface
+import SongCreditFeature
+import SongCreditFeatureInterface
+
+public extension AppComponent {
+ var remoteCreditDataSource: any RemoteCreditDataSource {
+ shared {
+ RemoteCreditDataSourceImpl(keychain: keychain)
+ }
+ }
+
+ var creditRepository: any CreditRepository {
+ shared {
+ CreditRepositoryImpl(remoteCreditDataSource: remoteCreditDataSource)
+ }
+ }
+
+ var fetchCreditSongListUseCase: any FetchCreditSongListUseCase {
+ shared {
+ FetchCreditSongListUseCaseImpl(creditRepository: creditRepository)
+ }
+ }
+
+ var fetchCreditProfileUseCase: any FetchCreditProfileUseCase {
+ shared {
+ FetchCreditProfileUseCaseImpl(creditRepository: creditRepository)
+ }
+ }
+
+ var songCreditFactory: any SongCreditFactory {
+ SongCreditComponent(parent: self)
+ }
+
+ var creditSongListFactory: any CreditSongListFactory {
+ CreditSongListComponent(parent: self)
+ }
+
+ var creditSongListTabFactory: any CreditSongListTabFactory {
+ CreditSongListTabComponent(parent: self)
+ }
+
+ var creditSongListTabItemFactory: any CreditSongListTabItemFactory {
+ CreditSongListTabItemComponent(parent: self)
+ }
+}
diff --git a/Projects/App/Sources/Application/AppComponent+Faq.swift b/Projects/App/Sources/Application/AppComponent+Faq.swift
new file mode 100644
index 000000000..12bb97865
--- /dev/null
+++ b/Projects/App/Sources/Application/AppComponent+Faq.swift
@@ -0,0 +1,33 @@
+import BaseFeature
+import FaqDomain
+import FaqDomainInterface
+import SignInFeature
+
+// MARK: 변수명 주의
+// AppComponent 내 변수 == Dependency 내 변수 이름 같아야함
+
+public extension AppComponent {
+ var remoteFaqDataSource: any RemoteFaqDataSource {
+ shared {
+ RemoteFaqDataSourceImpl(keychain: keychain)
+ }
+ }
+
+ var faqRepository: any FaqRepository {
+ shared {
+ FaqRepositoryImpl(remoteFaqDataSource: remoteFaqDataSource)
+ }
+ }
+
+ var fetchFaqCategoriesUseCase: any FetchFaqCategoriesUseCase {
+ shared {
+ FetchFaqCategoriesUseCaseImpl(faqRepository: faqRepository)
+ }
+ }
+
+ var fetchFaqUseCase: any FetchFaqUseCase {
+ shared {
+ FetchFaqUseCaseImpl(faqRepository: faqRepository)
+ }
+ }
+}
diff --git a/Projects/App/Sources/Application/AppComponent+Fruit.swift b/Projects/App/Sources/Application/AppComponent+Fruit.swift
new file mode 100644
index 000000000..538722956
--- /dev/null
+++ b/Projects/App/Sources/Application/AppComponent+Fruit.swift
@@ -0,0 +1,13 @@
+import Foundation
+import FruitDrawFeature
+import FruitDrawFeatureInterface
+
+extension AppComponent {
+ var fruitDrawFactory: any FruitDrawFactory {
+ FruitDrawComponent(parent: self)
+ }
+
+ var fruitStorageFactory: any FruitStorageFactory {
+ FruitStorageComponent(parent: self)
+ }
+}
diff --git a/Projects/App/Sources/Application/AppComponent+Image.swift b/Projects/App/Sources/Application/AppComponent+Image.swift
new file mode 100644
index 000000000..13a531cbb
--- /dev/null
+++ b/Projects/App/Sources/Application/AppComponent+Image.swift
@@ -0,0 +1,37 @@
+import ImageDomain
+import ImageDomainInterface
+
+// MARK: 변수명 주의
+// AppComponent 내 변수 == Dependency 내 변수 이름 같아야함
+
+public extension AppComponent {
+ var remoteImageDataSource: any RemoteImageDataSource {
+ shared {
+ RemoteImageDataSourceImpl(keychain: keychain)
+ }
+ }
+
+ var imageRepository: any ImageRepository {
+ shared {
+ ImageRepositoryImpl(remoteImageDataSource: remoteImageDataSource)
+ }
+ }
+
+ var fetchLyricDecoratingBackgroundUseCase: any FetchLyricDecoratingBackgroundUseCase {
+ shared {
+ FetchLyricDecoratingBackgroundUseCaseImpl(imageRepository: imageRepository)
+ }
+ }
+
+ var fetchProfileListUseCase: any FetchProfileListUseCase {
+ shared {
+ FetchProfileListUseCaseImpl(imageRepository: imageRepository)
+ }
+ }
+
+ var fetchDefaultPlaylistImageUseCase: any FetchDefaultPlaylistImageUseCase {
+ shared {
+ FetchDefaultPlaylistImageUseCaseImpl(imageRepository: imageRepository)
+ }
+ }
+}
diff --git a/Projects/App/Sources/Application/AppComponent+Like.swift b/Projects/App/Sources/Application/AppComponent+Like.swift
index 1730db1bb..680caa3db 100644
--- a/Projects/App/Sources/Application/AppComponent+Like.swift
+++ b/Projects/App/Sources/Application/AppComponent+Like.swift
@@ -1,66 +1,34 @@
-//
-// AppComponent+Search.swift
-// WaktaverseMusic
-//
-// Created by yongbeomkwak on 2023/02/07.
-// Copyright © 2023 yongbeomkwak. All rights reserved.
-//
-
-import DomainModule
-import DataModule
-import NetworkModule
-import CommonFeature
+import BaseFeature
+import LikeDomain
+import LikeDomainInterface
import SignInFeature
import StorageFeature
-//MARK: 변수명 주의
+// MARK: 변수명 주의
// AppComponent 내 변수 == Dependency 내 변수 이름 같아야함
-
public extension AppComponent {
-
-
-
var remoteLikeDataSource: any RemoteLikeDataSource {
shared {
RemoteLikeDataSourceImpl(keychain: keychain)
}
}
-
+
var likeRepository: any LikeRepository {
shared {
LikeRepositoryImpl(remoteLikeDataSource: remoteLikeDataSource)
}
}
-
- var fetchLikeNumOfSongUseCase: any FetchLikeNumOfSongUseCase {
-
- shared {
- FetchLikeNumOfSongUseCaseImpl(likeRepository: likeRepository)
- }
-
-
- }
-
+
var addLikeSongUseCase: any AddLikeSongUseCase {
-
shared {
AddLikeSongUseCaseImpl(likeRepository: likeRepository)
}
-
-
}
-
+
var cancelLikeSongUseCase: any CancelLikeSongUseCase {
-
shared {
CancelLikeSongUseCaseImpl(likeRepository: likeRepository)
}
-
-
}
-
-
-
-
}
diff --git a/Projects/App/Sources/Application/AppComponent+MyInfo.swift b/Projects/App/Sources/Application/AppComponent+MyInfo.swift
new file mode 100644
index 000000000..9535416f7
--- /dev/null
+++ b/Projects/App/Sources/Application/AppComponent+MyInfo.swift
@@ -0,0 +1,41 @@
+import Foundation
+import MyInfoFeature
+import MyInfoFeatureInterface
+
+extension AppComponent {
+ var myInfoFactory: any MyInfoFactory {
+ MyInfoComponent(parent: self)
+ }
+
+ var settingFactory: any SettingFactory {
+ SettingComponent(parent: self)
+ }
+
+ var openSourceLicenseFactory: any OpenSourceLicenseFactory {
+ OpenSourceLicenseComponent(parent: self)
+ }
+
+ var questionFactory: any QuestionFactory {
+ QuestionComponent(parent: self)
+ }
+
+ var faqFactory: any FaqFactory {
+ FaqComponent(parent: self)
+ }
+
+ var faqContentFactory: any FaqContentFactory {
+ FaqContentComponent(parent: self)
+ }
+
+ var serviceInfoFactory: any ServiceInfoFactory {
+ ServiceInfoComponent(parent: self)
+ }
+
+ var profilePopupFactory: any ProfilePopupFactory {
+ ProfilePopupComponent(parent: self)
+ }
+
+ var playTypeTogglePopupFactory: any PlayTypeTogglePopupFactory {
+ PlayTypeTogglePopupComponent(parent: self)
+ }
+}
diff --git a/Projects/App/Sources/Application/AppComponent+Notice.swift b/Projects/App/Sources/Application/AppComponent+Notice.swift
index b5eccf7c4..3a4b64c28 100644
--- a/Projects/App/Sources/Application/AppComponent+Notice.swift
+++ b/Projects/App/Sources/Application/AppComponent+Notice.swift
@@ -1,52 +1,57 @@
-//
-// AppComponent+Notice.swift
-// WaktaverseMusic
-//
-// Created by KTH on 2023/04/08.
-// Copyright © 2023 yongbeomkwak. All rights reserved.
-//
-
-import DomainModule
-import DataModule
-import NetworkModule
-import CommonFeature
+import BaseFeature
+import MainTabFeature
+import MyInfoFeature
+import MyInfoFeatureInterface
+import NoticeDomain
+import NoticeDomainInterface
import StorageFeature
public extension AppComponent {
-
var noticePopupComponent: NoticePopupComponent {
NoticePopupComponent(parent: self)
}
-
- var noticeComponent: NoticeComponent {
+
+ var noticeFactory: any NoticeFactory {
NoticeComponent(parent: self)
}
- var noticeDetailComponent: NoticeDetailComponent {
+ var noticeDetailFactory: any NoticeDetailFactory {
NoticeDetailComponent(parent: self)
}
-
+
var remoteNoticeDataSource: any RemoteNoticeDataSource {
shared {
RemoteNoticeDataSourceImpl(keychain: keychain)
}
}
-
+
var noticeRepository: any NoticeRepository {
shared {
NoticeRepositoryImpl(remoteNoticeDataSource: remoteNoticeDataSource)
}
}
-
- var fetchNoticeUseCase: any FetchNoticeUseCase{
+
+ var fetchNoticeAllUseCase: any FetchNoticeAllUseCase {
+ shared {
+ FetchNoticeAllUseCaseImpl(noticeRepository: noticeRepository)
+ }
+ }
+
+ var fetchNoticePopupUseCase: any FetchNoticePopupUseCase {
shared {
- FetchNoticeUseCaseImpl(noticeRepository: noticeRepository)
+ FetchNoticePopupUseCaseImpl(noticeRepository: noticeRepository)
}
}
- var fetchNoticeCategoriesUseCase: any FetchNoticeCategoriesUseCase{
+ var fetchNoticeCategoriesUseCase: any FetchNoticeCategoriesUseCase {
shared {
FetchNoticeCategoriesUseCaseImpl(noticeRepository: noticeRepository)
}
}
+
+ var fetchNoticeIDListUseCase: any FetchNoticeIDListUseCase {
+ shared {
+ FetchNoticeIDListUseCaseImpl(noticeRepository: noticeRepository)
+ }
+ }
}
diff --git a/Projects/App/Sources/Application/AppComponent+Notification.swift b/Projects/App/Sources/Application/AppComponent+Notification.swift
new file mode 100644
index 000000000..d3bcd78c9
--- /dev/null
+++ b/Projects/App/Sources/Application/AppComponent+Notification.swift
@@ -0,0 +1,22 @@
+import NotificationDomain
+import NotificationDomainInterface
+
+public extension AppComponent {
+ var remoteNotificationDataSource: any RemoteNotificationDataSource {
+ shared {
+ RemoteNotificationDataSourceImpl(keychain: keychain)
+ }
+ }
+
+ var notificationRepository: any NotificationRepository {
+ shared {
+ NotificationRepositoryImpl(remoteNotificationDataSource: remoteNotificationDataSource)
+ }
+ }
+
+ var updateNotificationTokenUseCase: any UpdateNotificationTokenUseCase {
+ shared {
+ UpdateNotificationTokenUseCaseImpl(notificationRepository: notificationRepository)
+ }
+ }
+}
diff --git a/Projects/App/Sources/Application/AppComponent+Play.swift b/Projects/App/Sources/Application/AppComponent+Play.swift
deleted file mode 100644
index 5538a65a8..000000000
--- a/Projects/App/Sources/Application/AppComponent+Play.swift
+++ /dev/null
@@ -1,31 +0,0 @@
-//
-// AppComponent+Play.swift
-// WaktaverseMusic
-//
-// Created by KTH on 2023/08/27.
-// Copyright © 2023 yongbeomkwak. All rights reserved.
-//
-
-import DomainModule
-import DataModule
-import NetworkModule
-
-public extension AppComponent {
- var remotePlayDataSource: any RemotePlayDataSource {
- shared {
- RemotePlayDataSourceImpl(keychain: keychain)
- }
- }
-
- var playRepository: any PlayRepository {
- shared {
- PlayRepositoryImpl(remotePlayDataSource:remotePlayDataSource)
- }
- }
-
- var postPlaybackLogUseCase: any PostPlaybackLogUseCase {
- shared {
- PostPlaybackLogUseCaseImpl(playRepository: playRepository)
- }
- }
-}
diff --git a/Projects/App/Sources/Application/AppComponent+Playlist.swift b/Projects/App/Sources/Application/AppComponent+Playlist.swift
index c4a0208d8..cf39453fb 100644
--- a/Projects/App/Sources/Application/AppComponent+Playlist.swift
+++ b/Projects/App/Sources/Application/AppComponent+Playlist.swift
@@ -1,102 +1,148 @@
-//
-// AppComponent+Search.swift
-// WaktaverseMusic
-//
-// Created by yongbeomkwak on 2023/02/07.
-// Copyright © 2023 yongbeomkwak. All rights reserved.
-//
-
-import DomainModule
-import DataModule
-import NetworkModule
-import SearchFeature
-import CommonFeature
+import BaseFeature
+import BaseFeatureInterface
+import ImageDomain
+import ImageDomainInterface
+import PlaylistDomain
+import PlaylistDomainInterface
+import PlaylistFeature
+import PlaylistFeatureInterface
import StorageFeature
-//MARK: 변수명 주의
+// MARK: 변수명 주의
// AppComponent 내 변수 == Dependency 내 변수 이름 같아야함
-//
public extension AppComponent {
-
- var beforeSearchComponent : BeforeSearchComponent {
- BeforeSearchComponent(parent: self)
+ var playlistPresenterGlobalState: any PlayListPresenterGlobalStateProtocol {
+ shared {
+ PlayListPresenterGlobalState()
+ }
+ }
+
+ var playlistDetailFactory: any PlaylistDetailFactory {
+ PlaylistDetailComponent(parent: self)
+ }
+
+ var playlistFactory: any PlaylistFactory {
+ PlaylistComponent(parent: self)
+ }
+
+ var myPlaylistDetailFactory: any MyPlaylistDetailFactory {
+ MyPlaylistDetailComponent(parent: self)
+ }
+
+ var unknownPlaylistDetailFactory: any UnknownPlaylistDetailFactory {
+ UnknownPlaylistDetailComponent(parent: self)
+ }
+
+ var wakmusicPlaylistDetailFactory: any WakmusicPlaylistDetailFactory {
+ WakmusicPlaylistDetailComponent(parent: self)
}
-
- var playListDetailComponent: PlayListDetailComponent {
- PlayListDetailComponent(parent: self)
+
+ var playlistCoverOptionPopupFactory: any PlaylistCoverOptionPopupFactory {
+ PlaylistCoverOptionPopupComponent(parent: self)
}
-
- var multiPurposePopComponent: MultiPurposePopComponent {
- MultiPurposePopComponent(parent: self)
+
+ var checkPlaylistCoverFactory: any CheckPlaylistCoverFactory {
+ CheckPlaylistCoverComponent(parent: self)
}
-
- var myPlayListComponent: MyPlayListComponent {
- MyPlayListComponent(parent:self)
+
+ var defaultPlaylistCoverFactory: any DefaultPlaylistCoverFactory {
+ DefaultPlaylistCoverComponent(parent: self)
}
-
- var containSongsComponent: ContainSongsComponent {
- ContainSongsComponent(parent: self)
+
+ var remotePlaylistDataSource: any RemotePlaylistDataSource {
+ shared {
+ RemotePlaylistDataSourceImpl(keychain: keychain)
+ }
}
-
- var remotePlayListDataSource: any RemotePlayListDataSource {
+
+ var playlistRepository: any PlaylistRepository {
shared {
- RemotePlayListDataSourceImpl(keychain: keychain)
+ PlaylistRepositoryImpl(remotePlaylistDataSource: remotePlaylistDataSource)
}
}
-
- var playListRepository: any PlayListRepository {
+
+ var fetchRecommendPlaylistUseCase: any FetchRecommendPlaylistUseCase {
shared {
- PlayListRepositoryImpl(remotePlayListDataSource:remotePlayListDataSource)
+ FetchRecommendPlaylistUseCaseImpl(playlistRepository: playlistRepository)
}
}
-
- var fetchRecommendPlayListUseCase: any FetchRecommendPlayListUseCase {
+
+ var fetchPlaylistSongsUseCase: any FetchPlaylistSongsUseCase {
shared {
- FetchRecommendPlayListUseCaseImpl(playListRepository: playListRepository)
+ FetchPlaylistSongsUseCaseImpl(playlistRepository: playlistRepository)
}
}
-
- var fetchPlayListDetailUseCase: any FetchPlayListDetailUseCase {
-
+
+ var fetchPlaylistDetailUseCase: any FetchPlaylistDetailUseCase {
shared {
- FetchPlayListDetailUseCaseImpl(playListRepository: playListRepository)
+ FetchPlaylistDetailUseCaseImpl(playlistRepository: playlistRepository)
}
}
-
- var createPlayListUseCase: any CreatePlayListUseCase {
+
+ var fetchWMPlaylistDetailUseCase: any FetchWMPlaylistDetailUseCase {
shared {
- CreatePlayListUseCaseImpl(playListRepository: playListRepository)
+ FetchWMPlaylistDetailUseCaseImpl(playlistRepository: playlistRepository)
}
}
-
- var editPlayListUseCase: any EditPlayListUseCase {
+
+ var createPlaylistUseCase: any CreatePlaylistUseCase {
shared {
- EditPlayListUseCaseImpl(playListRepository: playListRepository)
+ CreatePlaylistUseCaseImpl(playlistRepository: playlistRepository)
}
}
-
- var editPlayListNameUseCase: any EditPlayListNameUseCase {
+
+ var updatePlaylistUseCase: any UpdatePlaylistUseCase {
shared {
- EditPlayListNameUseCaseImpl(playListRepository: playListRepository)
+ UpdatePlaylistUseCaseImpl(playlistRepository: playlistRepository)
}
}
-
- var loadPlayListUseCase: any LoadPlayListUseCase {
+
+ var updateTitleAndPrivateUseCase: any UpdateTitleAndPrivateUseCase {
shared {
- LoadPlayListUseCaseImpl(playListRepository: playListRepository)
+ UpdateTitleAndPrivateUseCaseImpl(playlistRepository: playlistRepository)
}
}
-
- var addSongIntoPlayListUseCase: any AddSongIntoPlayListUseCase {
+
+ var addSongIntoPlaylistUseCase: any AddSongIntoPlaylistUseCase {
shared {
- AddSongIntoPlayListUseCaseImpl(playListRepository: playListRepository)
+ AddSongIntoPlaylistUseCaseImpl(playlistRepository: playlistRepository)
}
}
-
+
var removeSongsUseCase: any RemoveSongsUseCase {
shared {
- RemoveSongsUseCaseImpl(playListRepository: playListRepository)
+ RemoveSongsUseCaseImpl(playlistRepository: playlistRepository)
+ }
+ }
+
+ var subscribePlaylistUseCase: any SubscribePlaylistUseCase {
+ shared {
+ SubscribePlaylistUseCaseImpl(playlistRepository: playlistRepository)
+ }
+ }
+
+ var checkSubscriptionUseCase: any CheckSubscriptionUseCase {
+ shared {
+ CheckSubscriptionUseCaseImpl(playlistRepository: playlistRepository)
+ }
+ }
+
+ var uploadDefaultPlaylistImageUseCase: any UploadDefaultPlaylistImageUseCase {
+ shared {
+ UploadDefaultPlaylistImageUseCaseImpl(playlistRepository: playlistRepository)
+ }
+ }
+
+ var requestCustomImageURLUseCase: any RequestCustomImageURLUseCase {
+ shared {
+ RequestCustomImageURLUseCaseImpl(playlistRepository: playlistRepository)
+ }
+ }
+
+ var requestPlaylistOwnerIDUsecase: any RequestPlaylistOwnerIDUsecase {
+ shared {
+ RequestPlaylistOwnerIDUsecaseImpl(playlistRepository: playlistRepository)
}
}
}
diff --git a/Projects/App/Sources/Application/AppComponent+Price.swift b/Projects/App/Sources/Application/AppComponent+Price.swift
new file mode 100644
index 000000000..954208ac9
--- /dev/null
+++ b/Projects/App/Sources/Application/AppComponent+Price.swift
@@ -0,0 +1,29 @@
+import Foundation
+import PriceDomain
+import PriceDomainInterface
+
+extension AppComponent {
+ var remotePriceDataSource: any RemotePriceDataSource {
+ shared {
+ RemotePriceDataSourceImpl(keychain: keychain)
+ }
+ }
+
+ var priceRepository: any PriceRepository {
+ shared {
+ PriceRepositoryImpl(remotePriceDataSource: remotePriceDataSource)
+ }
+ }
+
+ var fetchPlaylistCreationPriceUseCase: any FetchPlaylistCreationPriceUseCase {
+ shared {
+ FetchPlaylistCreationPriceUseCaseImpl(priceRepository: priceRepository)
+ }
+ }
+
+ var fetchPlaylistImagePriceUseCase: any FetchPlaylistImagePriceUseCase {
+ shared {
+ FetchPlaylistImagePriceUseCaseImpl(priceRepository: priceRepository)
+ }
+ }
+}
diff --git a/Projects/App/Sources/Application/AppComponent+Qna.swift b/Projects/App/Sources/Application/AppComponent+Qna.swift
deleted file mode 100644
index 1c7399530..000000000
--- a/Projects/App/Sources/Application/AppComponent+Qna.swift
+++ /dev/null
@@ -1,52 +0,0 @@
-//
-// AppComponent+Search.swift
-// WaktaverseMusic
-//
-// Created by yongbeomkwak on 2023/02/07.
-// Copyright © 2023 yongbeomkwak. All rights reserved.
-//
-
-import DomainModule
-import DataModule
-import NetworkModule
-import CommonFeature
-import SignInFeature
-import StorageFeature
-
-//MARK: 변수명 주의
-// AppComponent 내 변수 == Dependency 내 변수 이름 같아야함
-
-
-public extension AppComponent {
- var qnaComponent: QnaComponent {
- QnaComponent(parent: self)
- }
-
- var qnaContentComponent: QnaContentComponent {
- QnaContentComponent(parent: self)
- }
-
- var remoteQnaDataSource: any RemoteQnaDataSource {
- shared {
- RemoteQnaDataSourceImpl(keychain: keychain)
- }
- }
-
- var qnaRepository: any QnaRepository {
- shared {
- QnaRepositoryImpl(remoteQnaDataSource: remoteQnaDataSource)
- }
- }
-
- var fetchQnaCategoriesUseCase: any FetchQnaCategoriesUseCase{
- shared {
- FetchQnaCategoriesUseCaseImpl(qnaRepository: qnaRepository)
- }
- }
-
- var fetchQnaUseCase: any FetchQnaUseCase {
- shared {
- FetchQnaUseCaseImpl(qnaRepository: qnaRepository)
- }
- }
-}
diff --git a/Projects/App/Sources/Application/AppComponent+Search.swift b/Projects/App/Sources/Application/AppComponent+Search.swift
new file mode 100644
index 000000000..08e8f8c20
--- /dev/null
+++ b/Projects/App/Sources/Application/AppComponent+Search.swift
@@ -0,0 +1,67 @@
+import Foundation
+import SearchDomain
+import SearchDomainInterface
+import SearchFeature
+import SearchFeatureInterface
+
+extension AppComponent {
+ var searchGlobalScrollState: any SearchGlobalScrollProtocol {
+ shared {
+ SearchGlobalScrollState()
+ }
+ }
+
+ var searchFactory: any SearchFactory {
+ SearchComponent(parent: self)
+ }
+
+ var beforeSearchComponent: BeforeSearchComponent {
+ BeforeSearchComponent(parent: self)
+ }
+
+ var afterSearchComponent: AfterSearchComponent {
+ AfterSearchComponent(parent: self)
+ }
+
+ var songSearchResultFactory: any SongSearchResultFactory {
+ SongSearchResultComponent(parent: self)
+ }
+
+ var listSearchResultFactory: any ListSearchResultFactory {
+ ListSearchResultComponent(parent: self)
+ }
+
+ var wakmusicRecommendComponent: WakmusicRecommendComponent {
+ WakmusicRecommendComponent(parent: self)
+ }
+
+ var searchSortOptionComponent: SearchSortOptionComponent {
+ SearchSortOptionComponent(parent: self)
+ }
+
+ // 도메인 영역
+
+ var remoteSearchDataSource: any RemoteSearchDataSource {
+ shared {
+ RemoteSearchDataSourceImpl(keychain: keychain)
+ }
+ }
+
+ var searchRepository: any SearchRepository {
+ shared {
+ SearchRepositoryImpl(remoteSearchDataSource: remoteSearchDataSource)
+ }
+ }
+
+ var fetchSearchSongsUseCase: any FetchSearchSongsUseCase {
+ shared {
+ FetchSearchSongsUseCaseImpl(searchRepository: searchRepository)
+ }
+ }
+
+ var fetchSearchPlaylistsUseCase: any FetchSearchPlaylistsUseCase {
+ shared {
+ FetchSearchPlaylistsUseCaseImpl(searchRepository: searchRepository)
+ }
+ }
+}
diff --git a/Projects/App/Sources/Application/AppComponent+Songs.swift b/Projects/App/Sources/Application/AppComponent+Songs.swift
index 795b82db8..b0f65f952 100644
--- a/Projects/App/Sources/Application/AppComponent+Songs.swift
+++ b/Projects/App/Sources/Application/AppComponent+Songs.swift
@@ -1,36 +1,32 @@
-//
-// AppComponent+Search.swift
-// WaktaverseMusic
-//
-// Created by yongbeomkwak on 2023/02/07.
-// Copyright © 2023 yongbeomkwak. All rights reserved.
-//
-
-import DomainModule
-import DataModule
-import NetworkModule
-import SearchFeature
+import BaseFeature
import HomeFeature
-import CommonFeature
+import HomeFeatureInterface
+import LyricHighlightingFeature
+import LyricHighlightingFeatureInterface
+import MusicDetailFeature
+import MusicDetailFeatureInterface
+import SongsDomain
+import SongsDomainInterface
public extension AppComponent {
-
- var searchComponent: SearchComponent {
- SearchComponent(parent: self)
+ var songDetailPresenter: any SongDetailPresentable {
+ shared {
+ SongDetailPresenter()
+ }
}
-
- var afterSearchComponent: AfterSearchComponent {
- AfterSearchComponent(parent: self)
+
+ var homeFactory: any HomeFactory {
+ HomeComponent(parent: self)
}
-
- var afterSearchContentComponent: AfterSearchContentComponent {
- AfterSearchContentComponent(parent: self)
+
+ var musicDetailFactory: any MusicDetailFactory {
+ MusicDetailComponent(parent: self)
}
-
- var homeComponent: HomeComponent {
- HomeComponent(parent: self)
+
+ var karaokeFactory: any KaraokeFactory {
+ KaraokeComponent(parent: self)
}
-
+
var newSongsComponent: NewSongsComponent {
NewSongsComponent(parent: self)
}
@@ -39,32 +35,57 @@ public extension AppComponent {
NewSongsContentComponent(parent: self)
}
+ var lyricHighlightingFactory: any LyricHighlightingFactory {
+ LyricHighlightingComponent(parent: self)
+ }
+
+ var lyricDecoratingComponent: LyricDecoratingComponent {
+ LyricDecoratingComponent(parent: self)
+ }
+
var remoteSongsDataSource: any RemoteSongsDataSource {
shared {
RemoteSongsDataSourceImpl(keychain: keychain)
}
}
+
var songsRepository: any SongsRepository {
shared {
- SongsRepositoryImpl(remoteSongsDataSource:remoteSongsDataSource)
+ SongsRepositoryImpl(remoteSongsDataSource: remoteSongsDataSource)
}
}
-
- var fetchSearchSongUseCase: any FetchSearchSongUseCase {
+
+ var fetchSongUseCase: any FetchSongUseCase {
shared {
- FetchSearchSongUseCaseImpl(songsRepository: songsRepository)
+ FetchSongUseCaseImpl(
+ songsRepository: songsRepository,
+ likeRepository: likeRepository,
+ authRepository: authRepository
+ )
}
}
+
var fetchLyricsUseCase: any FetchLyricsUseCase {
-
shared {
FetchLyricsUseCaseImpl(songsRepository: songsRepository)
}
}
-
+
var fetchNewSongsUseCase: any FetchNewSongsUseCase {
shared {
FetchNewSongsUseCaseImpl(songsRepository: songsRepository)
}
}
+
+ var fetchNewSongsPlaylistUseCase: any FetchNewSongsPlaylistUseCase {
+ shared {
+ FetchNewSongsPlaylistUseCaseImpl(songsRepository: songsRepository)
+ }
+ }
+
+ var fetchSongCreditsUseCase: any FetchSongCreditsUseCase {
+ shared {
+ FetchSongCreditsUseCaseImpl(songsRepository: songsRepository)
+ }
+ }
}
diff --git a/Projects/App/Sources/Application/AppComponent+Storage.swift b/Projects/App/Sources/Application/AppComponent+Storage.swift
new file mode 100644
index 000000000..c753e5741
--- /dev/null
+++ b/Projects/App/Sources/Application/AppComponent+Storage.swift
@@ -0,0 +1,21 @@
+import BaseFeature
+import BaseFeatureInterface
+import StorageFeature
+import StorageFeatureInterface
+
+// MARK: 변수명 주의
+// AppComponent 내 변수 == Dependency 내 변수 이름 같아야함
+
+public extension AppComponent {
+ var storageFactory: any StorageFactory {
+ StorageComponent(parent: self)
+ }
+
+ var listStorageComponent: ListStorageComponent {
+ ListStorageComponent(parent: self)
+ }
+
+ var likeStorageComponent: LikeStorageComponent {
+ LikeStorageComponent(parent: self)
+ }
+}
diff --git a/Projects/App/Sources/Application/AppComponent+Suggest.swift b/Projects/App/Sources/Application/AppComponent+Suggest.swift
deleted file mode 100644
index 9209b1328..000000000
--- a/Projects/App/Sources/Application/AppComponent+Suggest.swift
+++ /dev/null
@@ -1,62 +0,0 @@
-//
-// AppComponent+Suggest.swift
-// WaktaverseMusic
-//
-// Created by KTH on 2023/04/14.
-// Copyright © 2023 yongbeomkwak. All rights reserved.
-//
-
-import DomainModule
-import DataModule
-import NetworkModule
-import CommonFeature
-import StorageFeature
-
-public extension AppComponent {
- var questionComponent: QuestionComponent {
- QuestionComponent(parent: self)
- }
- var suggestFunctionComponent:SuggestFunctionComponent {
- SuggestFunctionComponent(parent: self)
- }
- var wakMusicFeedbackComponent: WakMusicFeedbackComponent {
- WakMusicFeedbackComponent(parent: self)
- }
- var askSongComponent: AskSongComponent {
- AskSongComponent(parent: self)
- }
- var bugReportComponent: BugReportComponent {
- BugReportComponent(parent: self)
- }
-
- var remoteSuggestDataSource: any RemoteSuggestDataSource {
- shared {
- RemoteSuggestDataSourceImpl(keychain: keychain)
- }
- }
- var suggestRepository: any SuggestRepository {
- shared {
- SuggestRepositoryImpl(remoteSuggestDataSource: remoteSuggestDataSource)
- }
- }
- var reportBugUseCase: any ReportBugUseCase{
- shared {
- ReportBugUseCaseImpl(suggestRepository: suggestRepository)
- }
- }
- var suggestFunctionUseCase: any SuggestFunctionUseCase{
- shared {
- SuggestFunctionUseCaseImpl(suggestRepository: suggestRepository)
- }
- }
- var modifySongUseCase: any ModifySongUseCase{
- shared {
- ModifySongUseCaseImpl(suggestRepository: suggestRepository)
- }
- }
- var inquiryWeeklyChartUseCase: any InquiryWeeklyChartUseCase{
- shared {
- InquiryWeeklyChartUseCaseImpl(suggestRepository: suggestRepository)
- }
- }
-}
diff --git a/Projects/App/Sources/Application/AppComponent+Team.swift b/Projects/App/Sources/Application/AppComponent+Team.swift
new file mode 100644
index 000000000..c5c05fd94
--- /dev/null
+++ b/Projects/App/Sources/Application/AppComponent+Team.swift
@@ -0,0 +1,28 @@
+import TeamDomain
+import TeamDomainInterface
+import TeamFeature
+import TeamFeatureInterface
+
+public extension AppComponent {
+ var teamInfoFactory: any TeamInfoFactory {
+ TeamInfoComponent(parent: self)
+ }
+
+ var remoteTeamDataSource: any RemoteTeamDataSource {
+ shared {
+ RemoteTeamDataSourceImpl(keychain: keychain)
+ }
+ }
+
+ var teamRepository: any TeamRepository {
+ shared {
+ TeamRepositoryImpl(remoteTeamDataSource: remoteTeamDataSource)
+ }
+ }
+
+ var fetchTeamListUseCase: any FetchTeamListUseCase {
+ shared {
+ FetchTeamListUseCaseImpl(teamRepository: teamRepository)
+ }
+ }
+}
diff --git a/Projects/App/Sources/Application/AppComponent+User.swift b/Projects/App/Sources/Application/AppComponent+User.swift
index 773bd9517..cdf8a4b02 100644
--- a/Projects/App/Sources/Application/AppComponent+User.swift
+++ b/Projects/App/Sources/Application/AppComponent+User.swift
@@ -1,96 +1,100 @@
-//
-// AppComponent+Search.swift
-// WaktaverseMusic
-//
-// Created by yongbeomkwak on 2023/02/07.
-// Copyright © 2023 yongbeomkwak. All rights reserved.
-//
-
-import DomainModule
-import DataModule
-import NetworkModule
-import CommonFeature
+import BaseFeature
import SignInFeature
import StorageFeature
+import UserDomain
+import UserDomainInterface
-//MARK: 변수명 주의
+// MARK: 변수명 주의
// AppComponent 내 변수 == Dependency 내 변수 이름 같아야함
-
public extension AppComponent {
-
- var profilePopComponent: ProfilePopComponent {
- ProfilePopComponent(parent: self)
- }
-
- var favoriteComponent: FavoriteComponent {
- FavoriteComponent(parent: self)
- }
-
var remoteUserDataSource: any RemoteUserDataSource {
shared {
RemoteUserDataSourceImpl(keychain: keychain)
}
}
-
+
var userRepository: any UserRepository {
shared {
UserRepositoryImpl(remoteUserDataSource: remoteUserDataSource)
}
}
-
- var fetchProfileListUseCase: any FetchProfileListUseCase{
- shared {
- FetchProfileListUseCaseImpl(userRepository: userRepository)
- }
- }
-
+
var setProfileUseCase: any SetProfileUseCase {
shared {
SetProfileUseCaseImpl(userRepository: userRepository)
}
}
-
+
var setUserNameUseCase: any SetUserNameUseCase {
- shared{
+ shared {
SetUserNameUseCaseImpl(userRepository: userRepository)
}
}
-
- var fetchPlayListUseCase: any FetchPlayListUseCase {
+
+ var fetchPlayListUseCase: any FetchPlaylistUseCase {
shared {
- FetchPlayListUseCaseImpl(userRepository: userRepository)
+ FetchPlaylistUseCaseImpl(userRepository: userRepository)
}
-
}
-
+
var fetchFavoriteSongsUseCase: any FetchFavoriteSongsUseCase {
shared {
FetchFavoriteSongsUseCaseImpl(userRepository: userRepository)
}
}
-
+
var editFavoriteSongsOrderUseCase: any EditFavoriteSongsOrderUseCase {
shared {
EditFavoriteSongsOrderUseCaseImpl(userRepository: userRepository)
}
}
-
- var editPlayListOrderUseCase: any EditPlayListOrderUseCase {
+
+ var editPlayListOrderUseCase: any EditPlaylistOrderUseCase {
shared {
- EditPlayListOrderUseCaseImpl(userRepository: userRepository)
+ EditPlaylistOrderUseCaseImpl(userRepository: userRepository)
}
}
-
- var deletePlayListUseCase: any DeletePlayListUseCase {
+
+ var deletePlayListUseCase: any DeletePlaylistUseCase {
shared {
- DeletePlayListUseCaseImpl(userRepository: userRepository)
+ DeletePlaylistUseCaseImpl(userRepository: userRepository)
}
}
-
+
var deleteFavoriteListUseCase: any DeleteFavoriteListUseCase {
shared {
DeleteFavoriteListUseCaseImpl(userRepository: userRepository)
}
}
+
+ var fetchUserInfoUseCase: any FetchUserInfoUseCase {
+ shared {
+ FetchUserInfoUseCaseImpl(userRepository: userRepository)
+ }
+ }
+
+ var withdrawUserInfoUseCase: any WithdrawUserInfoUseCase {
+ shared {
+ WithdrawUserInfoUseCaseImpl(userRepository: userRepository)
+ }
+ }
+
+ var fetchFruitListUseCase: any FetchFruitListUseCase {
+ shared {
+ FetchFruitListUseCaseImpl(userRepository: userRepository)
+ }
+ }
+
+ var fetchFruitDrawStatusUseCase: any FetchFruitDrawStatusUseCase {
+ shared {
+ FetchFruitDrawStatusUseCaseImpl(userRepository: userRepository)
+ }
+ }
+
+ var drawFruitUseCase: any DrawFruitUseCase {
+ shared {
+ DrawFruitUseCaseImpl(userRepository: userRepository)
+ }
+ }
}
diff --git a/Projects/App/Sources/Application/AppComponent.swift b/Projects/App/Sources/Application/AppComponent.swift
index de543e09f..d0434b55b 100644
--- a/Projects/App/Sources/Application/AppComponent.swift
+++ b/Projects/App/Sources/Application/AppComponent.swift
@@ -1,24 +1,24 @@
+import BaseFeature
import Foundation
-import UIKit
+import KeychainModule
+import MainTabFeature
+import MyInfoFeature
import NeedleFoundation
-import PlayerFeature
import RootFeature
-import MainTabFeature
-import CommonFeature
-import KeychainModule
import StorageFeature
+import UIKit
public final class AppComponent: BootstrapComponent {
public func makeRootView() -> IntroViewController {
rootComponent.makeView()
}
-
+
public var keychain: any Keychain {
shared {
KeychainImpl()
}
}
-
+
var rootComponent: RootComponent {
shared {
RootComponent(parent: self)
@@ -31,7 +31,7 @@ public extension AppComponent {
var mainContainerComponent: MainContainerComponent {
MainContainerComponent(parent: self)
}
-
+
var bottomTabBarComponent: BottomTabBarComponent {
BottomTabBarComponent(parent: self)
}
@@ -39,29 +39,16 @@ public extension AppComponent {
var mainTabBarComponent: MainTabBarComponent {
MainTabBarComponent(parent: self)
}
-}
-// MARK: - Player
-public extension AppComponent {
- var playerComponent: PlayerComponent {
- PlayerComponent(parent: self)
- }
-
- var playlistComponent: PlaylistComponent {
- PlaylistComponent(parent: self)
+ var appEntryState: any AppEntryStateHandleable {
+ shared {
+ AppEntryState()
+ }
}
}
// MARK: - ETC
public extension AppComponent {
- var openSourceLicenseComponent: OpenSourceLicenseComponent {
- OpenSourceLicenseComponent(parent: self)
- }
-
- var serviceInfoComponent: ServiceInfoComponent {
- ServiceInfoComponent(parent: self)
- }
-
var permissionComponent: PermissionComponent {
PermissionComponent(parent: self)
}
diff --git a/Projects/App/Sources/Application/AppDelegate.swift b/Projects/App/Sources/Application/AppDelegate.swift
index 904031cbc..162350f4b 100644
--- a/Projects/App/Sources/Application/AppDelegate.swift
+++ b/Projects/App/Sources/Application/AppDelegate.swift
@@ -1,54 +1,47 @@
-import UIKit
-import RootFeature
-import NaverThirdPartyLogin
import AVKit
-import Utility
-import FirebaseCore
+import BaseFeature
import FirebaseAnalytics
+import FirebaseCore
import FirebaseCrashlytics
+import FirebaseMessaging
+import LogManager
+import NaverThirdPartyLogin
import RealmSwift
-//import Amplify
-//import AWSCognitoAuthPlugin
-//import AWSS3StoragePlugin
+import RootFeature
+import UIKit
+import Utility
@main
-class AppDelegate: UIResponder, UIApplicationDelegate {
-
- func application(_ application: UIApplication,
- didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
- // Override point for customization after application launch.
-
+final class AppDelegate: UIResponder, UIApplicationDelegate {
+ func application(
+ _ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
+ ) -> Bool {
// Use Firebase library to configure APIs
FirebaseApp.configure()
+ if let userInfo = PreferenceManager.userInfo {
+ LogManager.setUserID(userID: userInfo.decryptedID)
+ } else {
+ LogManager.setUserID(userID: nil)
+ }
+ initializeUserProperty()
+
Analytics.logEvent(AnalyticsEventAppOpen, parameters: nil)
// configure NaverThirdPartyLoginConnection
let naverInstance = NaverThirdPartyLoginConnection.getSharedInstance()
- naverInstance?.isNaverAppOauthEnable = true //네이버앱 로그인 설정
- naverInstance?.isInAppOauthEnable = true //사파리 로그인 설정
+ naverInstance?.isNaverAppOauthEnable = true // 네이버앱 로그인 설정
+ naverInstance?.isInAppOauthEnable = true // 사파리 로그인 설정
naverInstance?.setOnlyPortraitSupportInIphone(true)
-
- naverInstance?.serviceUrlScheme = NAVER_URL_SCHEME() //URL Scheme
- naverInstance?.consumerKey = NAVER_CONSUMER_KEY() //클라이언트 아이디
- naverInstance?.consumerSecret = NAVER_CONSUMER_SECRET() //시크릿 아이디
- naverInstance?.appName = NAVER_APP_NAME() //앱이름
-
- //Amplify
-// do {
-// try Amplify.add(plugin: AWSCognitoAuthPlugin())
-// try Amplify.add(plugin: AWSS3StoragePlugin())
-// try Amplify.configure()
-// DEBUG_LOG("Amplify configured with Auth and Storage plugins")
-// } catch {
-// DEBUG_LOG("Failed to initialize Amplify with \(error)")
-// }
-
- //Realm register
- RealmManager.shared.register()
+
+ naverInstance?.serviceUrlScheme = NAVER_URL_SCHEME() // URL Scheme
+ naverInstance?.consumerKey = NAVER_CONSUMER_KEY() // 클라이언트 아이디
+ naverInstance?.consumerSecret = NAVER_CONSUMER_SECRET() // 시크릿 아이디
+ naverInstance?.appName = NAVER_APP_NAME() // 앱이름
return true
}
-
+
func application(
_ application: UIApplication,
configurationForConnecting connectingSceneSession: UISceneSession,
@@ -60,9 +53,102 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
func application(
_ application: UIApplication,
didDiscardSceneSessions sceneSessions: Set
+ ) {}
+}
+
+extension AppDelegate {
+ /// [START receive_message]
+ func application(
+ _ application: UIApplication,
+ didReceiveRemoteNotification userInfo: [AnyHashable: Any]
+ ) async -> UIBackgroundFetchResult {
+ // If you are receiving a notification message while your app is in the background,
+ // this callback will not be fired till the user taps on the notification launching the application.
+
+ // With swizzling disabled you must let Messaging know about the message, for Analytics
+ Messaging.messaging().appDidReceiveMessage(userInfo)
+
+ // Print full message.
+ LogManager.printDebug("🔔:: \(userInfo)")
+
+ return UIBackgroundFetchResult.newData
+ }
+
+ // [END receive_message]
+
+ func application(
+ _ application: UIApplication,
+ didFailToRegisterForRemoteNotificationsWithError error: Error
+ ) {
+ LogManager.printDebug("🔔:: Unable to register for remote notifications: \(error.localizedDescription)")
+ }
+
+ /// This function is added here only for debugging purposes, and can be removed if swizzling is enabled.
+ /// If swizzling is disabled then this function must be implemented so that the APNs token can be paired to
+ /// the FCM registration token.
+ func application(
+ _ application: UIApplication,
+ didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
) {
+ let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
+ LogManager.printDebug("🔔:: APNs token retrieved: \(token)")
+ // With swizzling disabled you must set the APNs token here.
+ Messaging.messaging().apnsToken = deviceToken
+ Messaging.messaging().token { token, error in
+ if let error = error {
+ LogManager.printError("🔔:: Messaging.messaging().token: \(error.localizedDescription)")
+ } else if let token = token {
+ LogManager.printDebug("🔔:: Messaging.messaging().token: \(token)")
+ }
+ }
}
-
+ private func initializeUserProperty() {
+ if let loginPlatform = PreferenceManager.userInfo?.platform {
+ LogManager.setUserProperty(property: .loginPlatform(platform: loginPlatform))
+ } else {
+ LogManager.clearUserProperty(property: .loginPlatform(platform: ""))
+ }
+
+ if let fruitTotal = PreferenceManager.userInfo?.itemCount {
+ LogManager.setUserProperty(property: .fruitTotal(count: fruitTotal))
+ } else {
+ LogManager.clearUserProperty(property: .fruitTotal(count: -1))
+ }
+
+ if let playPlatform = PreferenceManager.songPlayPlatformType {
+ LogManager.setUserProperty(property: .songPlayPlatform(platform: playPlatform.display))
+ }
+
+ LogManager.setUserProperty(property: .playlistSongTotal(count: PlayState.shared.count))
+ }
}
+
+#if DEBUG || QA
+ extension UIWindow {
+ override open func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
+ super.motionEnded(motion, with: event)
+ switch motion {
+ case .motionShake:
+ let topViewController = UIApplication.shared.connectedScenes
+ .compactMap { $0 as? UIWindowScene }
+ .filter { $0.activationState == .foregroundActive }
+ .first?
+ .keyWindow?
+ .rootViewController
+ guard let topViewController else { break }
+ let logHistoryViewController = UINavigationController(rootViewController: LogHistoryViewController())
+ if let nav = topViewController as? UINavigationController,
+ !(nav.visibleViewController is LogHistoryViewController) {
+ nav.visibleViewController?.present(logHistoryViewController, animated: true)
+ } else if !(topViewController is LogHistoryViewController) {
+ topViewController.present(logHistoryViewController, animated: true)
+ }
+
+ default:
+ break
+ }
+ }
+ }
+#endif
diff --git a/Projects/App/Sources/Application/NeedleGenerated.swift b/Projects/App/Sources/Application/NeedleGenerated.swift
deleted file mode 100644
index d3ebb2ff1..000000000
--- a/Projects/App/Sources/Application/NeedleGenerated.swift
+++ /dev/null
@@ -1,1245 +0,0 @@
-
-
-import ArtistFeature
-import BaseFeature
-import ChartFeature
-import CommonFeature
-import DataMappingModule
-import DataModule
-import DesignSystem
-import DomainModule
-import Foundation
-import HomeFeature
-import KeychainModule
-import MainTabFeature
-import NeedleFoundation
-import NetworkModule
-import PanModal
-import PlayerFeature
-import RootFeature
-import RxCocoa
-import RxKeyboard
-import RxSwift
-import SearchFeature
-import SignInFeature
-import SnapKit
-import StorageFeature
-import UIKit
-import Utility
-
-// swiftlint:disable unused_declaration
-private let needleDependenciesHash : String? = nil
-
-// MARK: - Traversal Helpers
-
-private func parent1(_ component: NeedleFoundation.Scope) -> NeedleFoundation.Scope {
- return component.parent
-}
-
-// MARK: - Providers
-
-#if !NEEDLE_DYNAMIC
-
-private class ArtistDependency132a213bf62ad60c622cProvider: ArtistDependency {
- var fetchArtistListUseCase: any FetchArtistListUseCase {
- return appComponent.fetchArtistListUseCase
- }
- var artistDetailComponent: ArtistDetailComponent {
- return appComponent.artistDetailComponent
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->ArtistComponent
-private func factorye0c5444f5894148bdd93f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return ArtistDependency132a213bf62ad60c622cProvider(appComponent: parent1(component) as! AppComponent)
-}
-private class ArtistDetailDependencyee413dcf7a70e89df6d9Provider: ArtistDetailDependency {
- var artistMusicComponent: ArtistMusicComponent {
- return appComponent.artistMusicComponent
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->ArtistDetailComponent
-private func factory35314797fadaf164ece6f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return ArtistDetailDependencyee413dcf7a70e89df6d9Provider(appComponent: parent1(component) as! AppComponent)
-}
-private class ArtistMusicContentDependency1615ac8469e54ec51921Provider: ArtistMusicContentDependency {
- var fetchArtistSongListUseCase: any FetchArtistSongListUseCase {
- return appComponent.fetchArtistSongListUseCase
- }
- var containSongsComponent: ContainSongsComponent {
- return appComponent.containSongsComponent
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->ArtistMusicContentComponent
-private func factory8b6ffa46033e2529b5daf47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return ArtistMusicContentDependency1615ac8469e54ec51921Provider(appComponent: parent1(component) as! AppComponent)
-}
-private class ArtistMusicDependencya0f5073287829dfbc260Provider: ArtistMusicDependency {
- var artistMusicContentComponent: ArtistMusicContentComponent {
- return appComponent.artistMusicContentComponent
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->ArtistMusicComponent
-private func factory382e7f8466df35a3f1d9f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return ArtistMusicDependencya0f5073287829dfbc260Provider(appComponent: parent1(component) as! AppComponent)
-}
-private class PlaylistDependency6f376d117dc0f38671edProvider: PlaylistDependency {
- var containSongsComponent: ContainSongsComponent {
- return appComponent.containSongsComponent
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->PlaylistComponent
-private func factory3a0a6eb1061d8d5a2deff47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return PlaylistDependency6f376d117dc0f38671edProvider(appComponent: parent1(component) as! AppComponent)
-}
-private class PlayerDependencyf8a3d594cc3b9254f8adProvider: PlayerDependency {
- var fetchLyricsUseCase: any FetchLyricsUseCase {
- return appComponent.fetchLyricsUseCase
- }
- var addLikeSongUseCase: any AddLikeSongUseCase {
- return appComponent.addLikeSongUseCase
- }
- var cancelLikeSongUseCase: any CancelLikeSongUseCase {
- return appComponent.cancelLikeSongUseCase
- }
- var fetchLikeNumOfSongUseCase: any FetchLikeNumOfSongUseCase {
- return appComponent.fetchLikeNumOfSongUseCase
- }
- var fetchFavoriteSongsUseCase: any FetchFavoriteSongsUseCase {
- return appComponent.fetchFavoriteSongsUseCase
- }
- var postPlaybackLogUseCase: any PostPlaybackLogUseCase {
- return appComponent.postPlaybackLogUseCase
- }
- var playlistComponent: PlaylistComponent {
- return appComponent.playlistComponent
- }
- var containSongsComponent: ContainSongsComponent {
- return appComponent.containSongsComponent
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->PlayerComponent
-private func factorybc7f802f601dd5913533f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return PlayerDependencyf8a3d594cc3b9254f8adProvider(appComponent: parent1(component) as! AppComponent)
-}
-private class MainTabBarDependencycd05b79389a6a7a6c20fProvider: MainTabBarDependency {
- var fetchNoticeUseCase: any FetchNoticeUseCase {
- return appComponent.fetchNoticeUseCase
- }
- var homeComponent: HomeComponent {
- return appComponent.homeComponent
- }
- var chartComponent: ChartComponent {
- return appComponent.chartComponent
- }
- var searchComponent: SearchComponent {
- return appComponent.searchComponent
- }
- var artistComponent: ArtistComponent {
- return appComponent.artistComponent
- }
- var storageComponent: StorageComponent {
- return appComponent.storageComponent
- }
- var noticePopupComponent: NoticePopupComponent {
- return appComponent.noticePopupComponent
- }
- var noticeComponent: NoticeComponent {
- return appComponent.noticeComponent
- }
- var noticeDetailComponent: NoticeDetailComponent {
- return appComponent.noticeDetailComponent
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->MainTabBarComponent
-private func factorye547a52b3fce5887c8c7f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return MainTabBarDependencycd05b79389a6a7a6c20fProvider(appComponent: parent1(component) as! AppComponent)
-}
-private class BottomTabBarDependency237c2bd1c7be62020295Provider: BottomTabBarDependency {
-
-
- init() {
-
- }
-}
-/// ^->AppComponent->BottomTabBarComponent
-private func factoryd34fa9e493604a6295bde3b0c44298fc1c149afb(_ component: NeedleFoundation.Scope) -> AnyObject {
- return BottomTabBarDependency237c2bd1c7be62020295Provider()
-}
-private class MainContainerDependencyd9d908a1d0cf8937bbadProvider: MainContainerDependency {
- var bottomTabBarComponent: BottomTabBarComponent {
- return appComponent.bottomTabBarComponent
- }
- var mainTabBarComponent: MainTabBarComponent {
- return appComponent.mainTabBarComponent
- }
- var playerComponent: PlayerComponent {
- return appComponent.playerComponent
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->MainContainerComponent
-private func factory8e19f48d5d573d3ea539f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return MainContainerDependencyd9d908a1d0cf8937bbadProvider(appComponent: parent1(component) as! AppComponent)
-}
-private class ChartDependencyafd8882010751c9ef054Provider: ChartDependency {
- var chartContentComponent: ChartContentComponent {
- return appComponent.chartContentComponent
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->ChartComponent
-private func factoryeac6a4df54bbd391d31bf47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return ChartDependencyafd8882010751c9ef054Provider(appComponent: parent1(component) as! AppComponent)
-}
-private class ChartContentDependency3b8e41cfba060e4d16caProvider: ChartContentDependency {
- var fetchChartRankingUseCase: any FetchChartRankingUseCase {
- return appComponent.fetchChartRankingUseCase
- }
- var fetchChartUpdateTimeUseCase: any FetchChartUpdateTimeUseCase {
- return appComponent.fetchChartUpdateTimeUseCase
- }
- var containSongsComponent: ContainSongsComponent {
- return appComponent.containSongsComponent
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->ChartContentComponent
-private func factoryc9a137630ce76907f36ff47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return ChartContentDependency3b8e41cfba060e4d16caProvider(appComponent: parent1(component) as! AppComponent)
-}
-private class AskSongDependency02772625c56a0dda0140Provider: AskSongDependency {
- var modifySongUseCase: any ModifySongUseCase {
- return appComponent.modifySongUseCase
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->AskSongComponent
-private func factory37544fa026b309cd68d7f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return AskSongDependency02772625c56a0dda0140Provider(appComponent: parent1(component) as! AppComponent)
-}
-private class SuggestFunctionDependency229560bbe33097b02547Provider: SuggestFunctionDependency {
- var suggestFunctionUseCase: any SuggestFunctionUseCase {
- return appComponent.suggestFunctionUseCase
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->SuggestFunctionComponent
-private func factory63287bff3999ed1787ddf47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return SuggestFunctionDependency229560bbe33097b02547Provider(appComponent: parent1(component) as! AppComponent)
-}
-private class StorageDependency1447167c38e97ef97427Provider: StorageDependency {
- var signInComponent: SignInComponent {
- return appComponent.signInComponent
- }
- var afterLoginComponent: AfterLoginComponent {
- return appComponent.afterLoginComponent
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->StorageComponent
-private func factory2415399d25299b97b98bf47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return StorageDependency1447167c38e97ef97427Provider(appComponent: parent1(component) as! AppComponent)
-}
-private class QuestionDependencyf7010567c2d88e76d191Provider: QuestionDependency {
- var suggestFunctionComponent: SuggestFunctionComponent {
- return appComponent.suggestFunctionComponent
- }
- var wakMusicFeedbackComponent: WakMusicFeedbackComponent {
- return appComponent.wakMusicFeedbackComponent
- }
- var askSongComponent: AskSongComponent {
- return appComponent.askSongComponent
- }
- var bugReportComponent: BugReportComponent {
- return appComponent.bugReportComponent
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->QuestionComponent
-private func factoryedad1813a36115eec11ef47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return QuestionDependencyf7010567c2d88e76d191Provider(appComponent: parent1(component) as! AppComponent)
-}
-private class MyPlayListDependency067bbf42b28f80e413acProvider: MyPlayListDependency {
- var multiPurposePopComponent: MultiPurposePopComponent {
- return appComponent.multiPurposePopComponent
- }
- var playListDetailComponent: PlayListDetailComponent {
- return appComponent.playListDetailComponent
- }
- var fetchPlayListUseCase: any FetchPlayListUseCase {
- return appComponent.fetchPlayListUseCase
- }
- var editPlayListOrderUseCase: any EditPlayListOrderUseCase {
- return appComponent.editPlayListOrderUseCase
- }
- var deletePlayListUseCase: any DeletePlayListUseCase {
- return appComponent.deletePlayListUseCase
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->MyPlayListComponent
-private func factory51a57a92f76af93a9ec2f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return MyPlayListDependency067bbf42b28f80e413acProvider(appComponent: parent1(component) as! AppComponent)
-}
-private class AfterLoginDependencya880b76858e0a77ed700Provider: AfterLoginDependency {
- var fetchUserInfoUseCase: any FetchUserInfoUseCase {
- return appComponent.fetchUserInfoUseCase
- }
- var requestComponent: RequestComponent {
- return appComponent.requestComponent
- }
- var profilePopComponent: ProfilePopComponent {
- return appComponent.profilePopComponent
- }
- var myPlayListComponent: MyPlayListComponent {
- return appComponent.myPlayListComponent
- }
- var multiPurposePopComponent: MultiPurposePopComponent {
- return appComponent.multiPurposePopComponent
- }
- var favoriteComponent: FavoriteComponent {
- return appComponent.favoriteComponent
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->AfterLoginComponent
-private func factory6cc9c8141e04494113b8f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return AfterLoginDependencya880b76858e0a77ed700Provider(appComponent: parent1(component) as! AppComponent)
-}
-private class FavoriteDependency8f7fd37aeb6f0e5d0e30Provider: FavoriteDependency {
- var containSongsComponent: ContainSongsComponent {
- return appComponent.containSongsComponent
- }
- var fetchFavoriteSongsUseCase: any FetchFavoriteSongsUseCase {
- return appComponent.fetchFavoriteSongsUseCase
- }
- var editFavoriteSongsOrderUseCase: any EditFavoriteSongsOrderUseCase {
- return appComponent.editFavoriteSongsOrderUseCase
- }
- var deleteFavoriteListUseCase: any DeleteFavoriteListUseCase {
- return appComponent.deleteFavoriteListUseCase
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->FavoriteComponent
-private func factory8e4acb90bd0d9b48604af47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return FavoriteDependency8f7fd37aeb6f0e5d0e30Provider(appComponent: parent1(component) as! AppComponent)
-}
-private class QnaDependencybc3f0a2d4f873ad1b160Provider: QnaDependency {
- var qnaContentComponent: QnaContentComponent {
- return appComponent.qnaContentComponent
- }
- var fetchQnaCategoriesUseCase: any FetchQnaCategoriesUseCase {
- return appComponent.fetchQnaCategoriesUseCase
- }
- var fetchQnaUseCase: any FetchQnaUseCase {
- return appComponent.fetchQnaUseCase
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->QnaComponent
-private func factory49a98666675cb7a82038f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return QnaDependencybc3f0a2d4f873ad1b160Provider(appComponent: parent1(component) as! AppComponent)
-}
-private class RequestDependencyd4f6f0030dbf2a90cf21Provider: RequestDependency {
- var withdrawUserInfoUseCase: any WithdrawUserInfoUseCase {
- return appComponent.withdrawUserInfoUseCase
- }
- var qnaComponent: QnaComponent {
- return appComponent.qnaComponent
- }
- var questionComponent: QuestionComponent {
- return appComponent.questionComponent
- }
- var containSongsComponent: ContainSongsComponent {
- return appComponent.containSongsComponent
- }
- var noticeComponent: NoticeComponent {
- return appComponent.noticeComponent
- }
- var serviceInfoComponent: ServiceInfoComponent {
- return appComponent.serviceInfoComponent
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->RequestComponent
-private func factory13954fb3ec537bab80bcf47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return RequestDependencyd4f6f0030dbf2a90cf21Provider(appComponent: parent1(component) as! AppComponent)
-}
-private class NoticeDetailDependency714af3aed40eaebda420Provider: NoticeDetailDependency {
-
-
- init() {
-
- }
-}
-/// ^->AppComponent->NoticeDetailComponent
-private func factory3db143c2f80d621d5a7fe3b0c44298fc1c149afb(_ component: NeedleFoundation.Scope) -> AnyObject {
- return NoticeDetailDependency714af3aed40eaebda420Provider()
-}
-private class NoticeDependencyaec92ef53617a421bdf3Provider: NoticeDependency {
- var fetchNoticeUseCase: any FetchNoticeUseCase {
- return appComponent.fetchNoticeUseCase
- }
- var noticeDetailComponent: NoticeDetailComponent {
- return appComponent.noticeDetailComponent
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->NoticeComponent
-private func factoryaf8e5665e5b9217918f5f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return NoticeDependencyaec92ef53617a421bdf3Provider(appComponent: parent1(component) as! AppComponent)
-}
-private class QnaContentDependency68ed55648233d525d265Provider: QnaContentDependency {
-
-
- init() {
-
- }
-}
-/// ^->AppComponent->QnaContentComponent
-private func factory1501f7005831c8411229e3b0c44298fc1c149afb(_ component: NeedleFoundation.Scope) -> AnyObject {
- return QnaContentDependency68ed55648233d525d265Provider()
-}
-private class BugReportDependencyeea5818852f336c35729Provider: BugReportDependency {
- var reportBugUseCase: any ReportBugUseCase {
- return appComponent.reportBugUseCase
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->BugReportComponent
-private func factoryafa28e93c96a785ed32af47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return BugReportDependencyeea5818852f336c35729Provider(appComponent: parent1(component) as! AppComponent)
-}
-private class WakMusicFeedbackDependency8d09739bdcd24807ec82Provider: WakMusicFeedbackDependency {
- var inquiryWeeklyChartUseCase: any InquiryWeeklyChartUseCase {
- return appComponent.inquiryWeeklyChartUseCase
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->WakMusicFeedbackComponent
-private func factory32abe9db091bc43329a1f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return WakMusicFeedbackDependency8d09739bdcd24807ec82Provider(appComponent: parent1(component) as! AppComponent)
-}
-private class RootDependency3944cc797a4a88956fb5Provider: RootDependency {
- var mainContainerComponent: MainContainerComponent {
- return appComponent.mainContainerComponent
- }
- var permissionComponent: PermissionComponent {
- return appComponent.permissionComponent
- }
- var fetchUserInfoUseCase: any FetchUserInfoUseCase {
- return appComponent.fetchUserInfoUseCase
- }
- var fetchCheckAppUseCase: any FetchCheckAppUseCase {
- return appComponent.fetchCheckAppUseCase
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->RootComponent
-private func factory264bfc4d4cb6b0629b40f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return RootDependency3944cc797a4a88956fb5Provider(appComponent: parent1(component) as! AppComponent)
-}
-private class PermissionDependency517ed7598d8c08817d14Provider: PermissionDependency {
-
-
- init() {
-
- }
-}
-/// ^->AppComponent->PermissionComponent
-private func factoryc1d4d80afbccf86bf1c0e3b0c44298fc1c149afb(_ component: NeedleFoundation.Scope) -> AnyObject {
- return PermissionDependency517ed7598d8c08817d14Provider()
-}
-private class SignInDependency5dda0dd015447272446cProvider: SignInDependency {
- var fetchTokenUseCase: any FetchTokenUseCase {
- return appComponent.fetchTokenUseCase
- }
- var fetchNaverUserInfoUseCase: any FetchNaverUserInfoUseCase {
- return appComponent.fetchNaverUserInfoUseCase
- }
- var fetchUserInfoUseCase: any FetchUserInfoUseCase {
- return appComponent.fetchUserInfoUseCase
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->SignInComponent
-private func factoryda2925fd76da866a652af47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return SignInDependency5dda0dd015447272446cProvider(appComponent: parent1(component) as! AppComponent)
-}
-private class HomeDependency443c4e1871277bd8432aProvider: HomeDependency {
- var fetchChartRankingUseCase: any FetchChartRankingUseCase {
- return appComponent.fetchChartRankingUseCase
- }
- var fetchNewSongsUseCase: any FetchNewSongsUseCase {
- return appComponent.fetchNewSongsUseCase
- }
- var fetchRecommendPlayListUseCase: any FetchRecommendPlayListUseCase {
- return appComponent.fetchRecommendPlayListUseCase
- }
- var playListDetailComponent: PlayListDetailComponent {
- return appComponent.playListDetailComponent
- }
- var newSongsComponent: NewSongsComponent {
- return appComponent.newSongsComponent
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->HomeComponent
-private func factory67229cdf0f755562b2b1f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return HomeDependency443c4e1871277bd8432aProvider(appComponent: parent1(component) as! AppComponent)
-}
-private class AfterSearchDependency61822c19bc2eb46d7c52Provider: AfterSearchDependency {
- var afterSearchContentComponent: AfterSearchContentComponent {
- return appComponent.afterSearchContentComponent
- }
- var fetchSearchSongUseCase: any FetchSearchSongUseCase {
- return appComponent.fetchSearchSongUseCase
- }
- var containSongsComponent: ContainSongsComponent {
- return appComponent.containSongsComponent
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->AfterSearchComponent
-private func factoryeb2da679e35e2c4fb9a5f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return AfterSearchDependency61822c19bc2eb46d7c52Provider(appComponent: parent1(component) as! AppComponent)
-}
-private class AfterSearchComponentDependency028b0697c8624344f660Provider: AfterSearchComponentDependency {
-
-
- init() {
-
- }
-}
-/// ^->AppComponent->AfterSearchContentComponent
-private func factorycaaccdf52467bfa87f73e3b0c44298fc1c149afb(_ component: NeedleFoundation.Scope) -> AnyObject {
- return AfterSearchComponentDependency028b0697c8624344f660Provider()
-}
-private class SearchDependencya86903a2c751a4f762e8Provider: SearchDependency {
- var beforeSearchComponent: BeforeSearchComponent {
- return appComponent.beforeSearchComponent
- }
- var afterSearchComponent: AfterSearchComponent {
- return appComponent.afterSearchComponent
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->SearchComponent
-private func factorye3d049458b2ccbbcb3b6f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return SearchDependencya86903a2c751a4f762e8Provider(appComponent: parent1(component) as! AppComponent)
-}
-private class BeforeSearchDependencyebdecb1d478a4766488dProvider: BeforeSearchDependency {
- var playListDetailComponent: PlayListDetailComponent {
- return appComponent.playListDetailComponent
- }
- var fetchRecommendPlayListUseCase: any FetchRecommendPlayListUseCase {
- return appComponent.fetchRecommendPlayListUseCase
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->BeforeSearchComponent
-private func factory9bb852337d5550979293f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return BeforeSearchDependencyebdecb1d478a4766488dProvider(appComponent: parent1(component) as! AppComponent)
-}
-private class ContainSongsDependencydbd9ae8a072db3a22630Provider: ContainSongsDependency {
- var multiPurposePopComponent: MultiPurposePopComponent {
- return appComponent.multiPurposePopComponent
- }
- var fetchPlayListUseCase: any FetchPlayListUseCase {
- return appComponent.fetchPlayListUseCase
- }
- var addSongIntoPlayListUseCase: any AddSongIntoPlayListUseCase {
- return appComponent.addSongIntoPlayListUseCase
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->ContainSongsComponent
-private func factory4d4f4455414271fee232f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return ContainSongsDependencydbd9ae8a072db3a22630Provider(appComponent: parent1(component) as! AppComponent)
-}
-private class ServiceInfoDependency17ccca17be0fc87c9a2eProvider: ServiceInfoDependency {
- var openSourceLicenseComponent: OpenSourceLicenseComponent {
- return appComponent.openSourceLicenseComponent
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->ServiceInfoComponent
-private func factory3afd170b9974b0dbd863f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return ServiceInfoDependency17ccca17be0fc87c9a2eProvider(appComponent: parent1(component) as! AppComponent)
-}
-private class MultiPurposePopDependency30141c7a9a9e67e148afProvider: MultiPurposePopDependency {
- var createPlayListUseCase: any CreatePlayListUseCase {
- return appComponent.createPlayListUseCase
- }
- var loadPlayListUseCase: any LoadPlayListUseCase {
- return appComponent.loadPlayListUseCase
- }
- var setUserNameUseCase: any SetUserNameUseCase {
- return appComponent.setUserNameUseCase
- }
- var editPlayListNameUseCase: any EditPlayListNameUseCase {
- return appComponent.editPlayListNameUseCase
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->MultiPurposePopComponent
-private func factory972fcba2860fcb8ad7b8f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return MultiPurposePopDependency30141c7a9a9e67e148afProvider(appComponent: parent1(component) as! AppComponent)
-}
-private class NewSongsDependencyee634cc0cae21fc2a9e3Provider: NewSongsDependency {
- var newSongsContentComponent: NewSongsContentComponent {
- return appComponent.newSongsContentComponent
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->NewSongsComponent
-private func factory379179b05dd24ff979edf47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return NewSongsDependencyee634cc0cae21fc2a9e3Provider(appComponent: parent1(component) as! AppComponent)
-}
-private class PlayListDetailDependencyb06fb5392859952b82a2Provider: PlayListDetailDependency {
- var fetchPlayListDetailUseCase: any FetchPlayListDetailUseCase {
- return appComponent.fetchPlayListDetailUseCase
- }
- var editPlayListUseCase: any EditPlayListUseCase {
- return appComponent.editPlayListUseCase
- }
- var removeSongsUseCase: any RemoveSongsUseCase {
- return appComponent.removeSongsUseCase
- }
- var multiPurposePopComponent: MultiPurposePopComponent {
- return appComponent.multiPurposePopComponent
- }
- var containSongsComponent: ContainSongsComponent {
- return appComponent.containSongsComponent
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->PlayListDetailComponent
-private func factory9e077ee814ce180ea399f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return PlayListDetailDependencyb06fb5392859952b82a2Provider(appComponent: parent1(component) as! AppComponent)
-}
-private class OpenSourceLicenseDependencyb6842dcc36b26380b91aProvider: OpenSourceLicenseDependency {
-
-
- init() {
-
- }
-}
-/// ^->AppComponent->OpenSourceLicenseComponent
-private func factoryd505894818021731340ae3b0c44298fc1c149afb(_ component: NeedleFoundation.Scope) -> AnyObject {
- return OpenSourceLicenseDependencyb6842dcc36b26380b91aProvider()
-}
-private class NoticePopupDependency579e3504f53119c2eef1Provider: NoticePopupDependency {
-
-
- init() {
-
- }
-}
-/// ^->AppComponent->NoticePopupComponent
-private func factorycd081aacb61d6a707ca7e3b0c44298fc1c149afb(_ component: NeedleFoundation.Scope) -> AnyObject {
- return NoticePopupDependency579e3504f53119c2eef1Provider()
-}
-private class ProfilePopDependency081172e20caa75abdb54Provider: ProfilePopDependency {
- var fetchProfileListUseCase: any FetchProfileListUseCase {
- return appComponent.fetchProfileListUseCase
- }
- var setProfileUseCase: any SetProfileUseCase {
- return appComponent.setProfileUseCase
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->ProfilePopComponent
-private func factorybd14b11ccce6dac94a24f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return ProfilePopDependency081172e20caa75abdb54Provider(appComponent: parent1(component) as! AppComponent)
-}
-private class NewSongsContentDependency93a05f20fa300c5bbec3Provider: NewSongsContentDependency {
- var fetchNewSongsUseCase: any FetchNewSongsUseCase {
- return appComponent.fetchNewSongsUseCase
- }
- var fetchChartUpdateTimeUseCase: any FetchChartUpdateTimeUseCase {
- return appComponent.fetchChartUpdateTimeUseCase
- }
- var containSongsComponent: ContainSongsComponent {
- return appComponent.containSongsComponent
- }
- private let appComponent: AppComponent
- init(appComponent: AppComponent) {
- self.appComponent = appComponent
- }
-}
-/// ^->AppComponent->NewSongsContentComponent
-private func factorye130e1fbfcbc622a4c38f47b58f8f304c97af4d5(_ component: NeedleFoundation.Scope) -> AnyObject {
- return NewSongsContentDependency93a05f20fa300c5bbec3Provider(appComponent: parent1(component) as! AppComponent)
-}
-
-#else
-extension AppComponent: Registration {
- public func registerItems() {
-
- localTable["keychain-any Keychain"] = { self.keychain as Any }
- localTable["remotePlayDataSource-any RemotePlayDataSource"] = { self.remotePlayDataSource as Any }
- localTable["playRepository-any PlayRepository"] = { self.playRepository as Any }
- localTable["postPlaybackLogUseCase-any PostPlaybackLogUseCase"] = { self.postPlaybackLogUseCase as Any }
- localTable["searchComponent-SearchComponent"] = { self.searchComponent as Any }
- localTable["afterSearchComponent-AfterSearchComponent"] = { self.afterSearchComponent as Any }
- localTable["afterSearchContentComponent-AfterSearchContentComponent"] = { self.afterSearchContentComponent as Any }
- localTable["homeComponent-HomeComponent"] = { self.homeComponent as Any }
- localTable["newSongsComponent-NewSongsComponent"] = { self.newSongsComponent as Any }
- localTable["newSongsContentComponent-NewSongsContentComponent"] = { self.newSongsContentComponent as Any }
- localTable["remoteSongsDataSource-any RemoteSongsDataSource"] = { self.remoteSongsDataSource as Any }
- localTable["songsRepository-any SongsRepository"] = { self.songsRepository as Any }
- localTable["fetchSearchSongUseCase-any FetchSearchSongUseCase"] = { self.fetchSearchSongUseCase as Any }
- localTable["fetchLyricsUseCase-any FetchLyricsUseCase"] = { self.fetchLyricsUseCase as Any }
- localTable["fetchNewSongsUseCase-any FetchNewSongsUseCase"] = { self.fetchNewSongsUseCase as Any }
- localTable["signInComponent-SignInComponent"] = { self.signInComponent as Any }
- localTable["storageComponent-StorageComponent"] = { self.storageComponent as Any }
- localTable["afterLoginComponent-AfterLoginComponent"] = { self.afterLoginComponent as Any }
- localTable["requestComponent-RequestComponent"] = { self.requestComponent as Any }
- localTable["remoteAuthDataSource-any RemoteAuthDataSource"] = { self.remoteAuthDataSource as Any }
- localTable["authRepository-any AuthRepository"] = { self.authRepository as Any }
- localTable["fetchTokenUseCase-any FetchTokenUseCase"] = { self.fetchTokenUseCase as Any }
- localTable["fetchNaverUserInfoUseCase-any FetchNaverUserInfoUseCase"] = { self.fetchNaverUserInfoUseCase as Any }
- localTable["fetchUserInfoUseCase-any FetchUserInfoUseCase"] = { self.fetchUserInfoUseCase as Any }
- localTable["withdrawUserInfoUseCase-any WithdrawUserInfoUseCase"] = { self.withdrawUserInfoUseCase as Any }
- localTable["remoteLikeDataSource-any RemoteLikeDataSource"] = { self.remoteLikeDataSource as Any }
- localTable["likeRepository-any LikeRepository"] = { self.likeRepository as Any }
- localTable["fetchLikeNumOfSongUseCase-any FetchLikeNumOfSongUseCase"] = { self.fetchLikeNumOfSongUseCase as Any }
- localTable["addLikeSongUseCase-any AddLikeSongUseCase"] = { self.addLikeSongUseCase as Any }
- localTable["cancelLikeSongUseCase-any CancelLikeSongUseCase"] = { self.cancelLikeSongUseCase as Any }
- localTable["beforeSearchComponent-BeforeSearchComponent"] = { self.beforeSearchComponent as Any }
- localTable["playListDetailComponent-PlayListDetailComponent"] = { self.playListDetailComponent as Any }
- localTable["multiPurposePopComponent-MultiPurposePopComponent"] = { self.multiPurposePopComponent as Any }
- localTable["myPlayListComponent-MyPlayListComponent"] = { self.myPlayListComponent as Any }
- localTable["containSongsComponent-ContainSongsComponent"] = { self.containSongsComponent as Any }
- localTable["remotePlayListDataSource-any RemotePlayListDataSource"] = { self.remotePlayListDataSource as Any }
- localTable["playListRepository-any PlayListRepository"] = { self.playListRepository as Any }
- localTable["fetchRecommendPlayListUseCase-any FetchRecommendPlayListUseCase"] = { self.fetchRecommendPlayListUseCase as Any }
- localTable["fetchPlayListDetailUseCase-any FetchPlayListDetailUseCase"] = { self.fetchPlayListDetailUseCase as Any }
- localTable["createPlayListUseCase-any CreatePlayListUseCase"] = { self.createPlayListUseCase as Any }
- localTable["editPlayListUseCase-any EditPlayListUseCase"] = { self.editPlayListUseCase as Any }
- localTable["editPlayListNameUseCase-any EditPlayListNameUseCase"] = { self.editPlayListNameUseCase as Any }
- localTable["loadPlayListUseCase-any LoadPlayListUseCase"] = { self.loadPlayListUseCase as Any }
- localTable["addSongIntoPlayListUseCase-any AddSongIntoPlayListUseCase"] = { self.addSongIntoPlayListUseCase as Any }
- localTable["removeSongsUseCase-any RemoveSongsUseCase"] = { self.removeSongsUseCase as Any }
- localTable["artistComponent-ArtistComponent"] = { self.artistComponent as Any }
- localTable["remoteArtistDataSource-RemoteArtistDataSourceImpl"] = { self.remoteArtistDataSource as Any }
- localTable["artistRepository-any ArtistRepository"] = { self.artistRepository as Any }
- localTable["fetchArtistListUseCase-any FetchArtistListUseCase"] = { self.fetchArtistListUseCase as Any }
- localTable["artistDetailComponent-ArtistDetailComponent"] = { self.artistDetailComponent as Any }
- localTable["fetchArtistSongListUseCase-any FetchArtistSongListUseCase"] = { self.fetchArtistSongListUseCase as Any }
- localTable["artistMusicComponent-ArtistMusicComponent"] = { self.artistMusicComponent as Any }
- localTable["artistMusicContentComponent-ArtistMusicContentComponent"] = { self.artistMusicContentComponent as Any }
- localTable["profilePopComponent-ProfilePopComponent"] = { self.profilePopComponent as Any }
- localTable["favoriteComponent-FavoriteComponent"] = { self.favoriteComponent as Any }
- localTable["remoteUserDataSource-any RemoteUserDataSource"] = { self.remoteUserDataSource as Any }
- localTable["userRepository-any UserRepository"] = { self.userRepository as Any }
- localTable["fetchProfileListUseCase-any FetchProfileListUseCase"] = { self.fetchProfileListUseCase as Any }
- localTable["setProfileUseCase-any SetProfileUseCase"] = { self.setProfileUseCase as Any }
- localTable["setUserNameUseCase-any SetUserNameUseCase"] = { self.setUserNameUseCase as Any }
- localTable["fetchPlayListUseCase-any FetchPlayListUseCase"] = { self.fetchPlayListUseCase as Any }
- localTable["fetchFavoriteSongsUseCase-any FetchFavoriteSongsUseCase"] = { self.fetchFavoriteSongsUseCase as Any }
- localTable["editFavoriteSongsOrderUseCase-any EditFavoriteSongsOrderUseCase"] = { self.editFavoriteSongsOrderUseCase as Any }
- localTable["editPlayListOrderUseCase-any EditPlayListOrderUseCase"] = { self.editPlayListOrderUseCase as Any }
- localTable["deletePlayListUseCase-any DeletePlayListUseCase"] = { self.deletePlayListUseCase as Any }
- localTable["deleteFavoriteListUseCase-any DeleteFavoriteListUseCase"] = { self.deleteFavoriteListUseCase as Any }
- localTable["mainContainerComponent-MainContainerComponent"] = { self.mainContainerComponent as Any }
- localTable["bottomTabBarComponent-BottomTabBarComponent"] = { self.bottomTabBarComponent as Any }
- localTable["mainTabBarComponent-MainTabBarComponent"] = { self.mainTabBarComponent as Any }
- localTable["playerComponent-PlayerComponent"] = { self.playerComponent as Any }
- localTable["playlistComponent-PlaylistComponent"] = { self.playlistComponent as Any }
- localTable["openSourceLicenseComponent-OpenSourceLicenseComponent"] = { self.openSourceLicenseComponent as Any }
- localTable["serviceInfoComponent-ServiceInfoComponent"] = { self.serviceInfoComponent as Any }
- localTable["permissionComponent-PermissionComponent"] = { self.permissionComponent as Any }
- localTable["noticePopupComponent-NoticePopupComponent"] = { self.noticePopupComponent as Any }
- localTable["noticeComponent-NoticeComponent"] = { self.noticeComponent as Any }
- localTable["noticeDetailComponent-NoticeDetailComponent"] = { self.noticeDetailComponent as Any }
- localTable["remoteNoticeDataSource-any RemoteNoticeDataSource"] = { self.remoteNoticeDataSource as Any }
- localTable["noticeRepository-any NoticeRepository"] = { self.noticeRepository as Any }
- localTable["fetchNoticeUseCase-any FetchNoticeUseCase"] = { self.fetchNoticeUseCase as Any }
- localTable["fetchNoticeCategoriesUseCase-any FetchNoticeCategoriesUseCase"] = { self.fetchNoticeCategoriesUseCase as Any }
- localTable["qnaComponent-QnaComponent"] = { self.qnaComponent as Any }
- localTable["qnaContentComponent-QnaContentComponent"] = { self.qnaContentComponent as Any }
- localTable["remoteQnaDataSource-any RemoteQnaDataSource"] = { self.remoteQnaDataSource as Any }
- localTable["qnaRepository-any QnaRepository"] = { self.qnaRepository as Any }
- localTable["fetchQnaCategoriesUseCase-any FetchQnaCategoriesUseCase"] = { self.fetchQnaCategoriesUseCase as Any }
- localTable["fetchQnaUseCase-any FetchQnaUseCase"] = { self.fetchQnaUseCase as Any }
- localTable["questionComponent-QuestionComponent"] = { self.questionComponent as Any }
- localTable["suggestFunctionComponent-SuggestFunctionComponent"] = { self.suggestFunctionComponent as Any }
- localTable["wakMusicFeedbackComponent-WakMusicFeedbackComponent"] = { self.wakMusicFeedbackComponent as Any }
- localTable["askSongComponent-AskSongComponent"] = { self.askSongComponent as Any }
- localTable["bugReportComponent-BugReportComponent"] = { self.bugReportComponent as Any }
- localTable["remoteSuggestDataSource-any RemoteSuggestDataSource"] = { self.remoteSuggestDataSource as Any }
- localTable["suggestRepository-any SuggestRepository"] = { self.suggestRepository as Any }
- localTable["reportBugUseCase-any ReportBugUseCase"] = { self.reportBugUseCase as Any }
- localTable["suggestFunctionUseCase-any SuggestFunctionUseCase"] = { self.suggestFunctionUseCase as Any }
- localTable["modifySongUseCase-any ModifySongUseCase"] = { self.modifySongUseCase as Any }
- localTable["inquiryWeeklyChartUseCase-any InquiryWeeklyChartUseCase"] = { self.inquiryWeeklyChartUseCase as Any }
- localTable["remoteAppDataSource-any RemoteAppDataSource"] = { self.remoteAppDataSource as Any }
- localTable["appRepository-any AppRepository"] = { self.appRepository as Any }
- localTable["fetchCheckAppUseCase-any FetchCheckAppUseCase"] = { self.fetchCheckAppUseCase as Any }
- localTable["chartComponent-ChartComponent"] = { self.chartComponent as Any }
- localTable["chartContentComponent-ChartContentComponent"] = { self.chartContentComponent as Any }
- localTable["remoteChartDataSource-any RemoteChartDataSource"] = { self.remoteChartDataSource as Any }
- localTable["chartRepository-any ChartRepository"] = { self.chartRepository as Any }
- localTable["fetchChartRankingUseCase-any FetchChartRankingUseCase"] = { self.fetchChartRankingUseCase as Any }
- localTable["fetchChartUpdateTimeUseCase-any FetchChartUpdateTimeUseCase"] = { self.fetchChartUpdateTimeUseCase as Any }
- }
-}
-extension ArtistComponent: Registration {
- public func registerItems() {
- keyPathToName[\ArtistDependency.fetchArtistListUseCase] = "fetchArtistListUseCase-any FetchArtistListUseCase"
- keyPathToName[\ArtistDependency.artistDetailComponent] = "artistDetailComponent-ArtistDetailComponent"
- }
-}
-extension ArtistDetailComponent: Registration {
- public func registerItems() {
- keyPathToName[\ArtistDetailDependency.artistMusicComponent] = "artistMusicComponent-ArtistMusicComponent"
- }
-}
-extension ArtistMusicContentComponent: Registration {
- public func registerItems() {
- keyPathToName[\ArtistMusicContentDependency.fetchArtistSongListUseCase] = "fetchArtistSongListUseCase-any FetchArtistSongListUseCase"
- keyPathToName[\ArtistMusicContentDependency.containSongsComponent] = "containSongsComponent-ContainSongsComponent"
- }
-}
-extension ArtistMusicComponent: Registration {
- public func registerItems() {
- keyPathToName[\ArtistMusicDependency.artistMusicContentComponent] = "artistMusicContentComponent-ArtistMusicContentComponent"
- }
-}
-extension PlaylistComponent: Registration {
- public func registerItems() {
- keyPathToName[\PlaylistDependency.containSongsComponent] = "containSongsComponent-ContainSongsComponent"
- }
-}
-extension PlayerComponent: Registration {
- public func registerItems() {
- keyPathToName[\PlayerDependency.fetchLyricsUseCase] = "fetchLyricsUseCase-any FetchLyricsUseCase"
- keyPathToName[\PlayerDependency.addLikeSongUseCase] = "addLikeSongUseCase-any AddLikeSongUseCase"
- keyPathToName[\PlayerDependency.cancelLikeSongUseCase] = "cancelLikeSongUseCase-any CancelLikeSongUseCase"
- keyPathToName[\PlayerDependency.fetchLikeNumOfSongUseCase] = "fetchLikeNumOfSongUseCase-any FetchLikeNumOfSongUseCase"
- keyPathToName[\PlayerDependency.fetchFavoriteSongsUseCase] = "fetchFavoriteSongsUseCase-any FetchFavoriteSongsUseCase"
- keyPathToName[\PlayerDependency.postPlaybackLogUseCase] = "postPlaybackLogUseCase-any PostPlaybackLogUseCase"
- keyPathToName[\PlayerDependency.playlistComponent] = "playlistComponent-PlaylistComponent"
- keyPathToName[\PlayerDependency.containSongsComponent] = "containSongsComponent-ContainSongsComponent"
- }
-}
-extension MainTabBarComponent: Registration {
- public func registerItems() {
- keyPathToName[\MainTabBarDependency.fetchNoticeUseCase] = "fetchNoticeUseCase-any FetchNoticeUseCase"
- keyPathToName[\MainTabBarDependency.homeComponent] = "homeComponent-HomeComponent"
- keyPathToName[\MainTabBarDependency.chartComponent] = "chartComponent-ChartComponent"
- keyPathToName[\MainTabBarDependency.searchComponent] = "searchComponent-SearchComponent"
- keyPathToName[\MainTabBarDependency.artistComponent] = "artistComponent-ArtistComponent"
- keyPathToName[\MainTabBarDependency.storageComponent] = "storageComponent-StorageComponent"
- keyPathToName[\MainTabBarDependency.noticePopupComponent] = "noticePopupComponent-NoticePopupComponent"
- keyPathToName[\MainTabBarDependency.noticeComponent] = "noticeComponent-NoticeComponent"
- keyPathToName[\MainTabBarDependency.noticeDetailComponent] = "noticeDetailComponent-NoticeDetailComponent"
- }
-}
-extension BottomTabBarComponent: Registration {
- public func registerItems() {
-
- }
-}
-extension MainContainerComponent: Registration {
- public func registerItems() {
- keyPathToName[\MainContainerDependency.bottomTabBarComponent] = "bottomTabBarComponent-BottomTabBarComponent"
- keyPathToName[\MainContainerDependency.mainTabBarComponent] = "mainTabBarComponent-MainTabBarComponent"
- keyPathToName[\MainContainerDependency.playerComponent] = "playerComponent-PlayerComponent"
- }
-}
-extension ChartComponent: Registration {
- public func registerItems() {
- keyPathToName[\ChartDependency.chartContentComponent] = "chartContentComponent-ChartContentComponent"
- }
-}
-extension ChartContentComponent: Registration {
- public func registerItems() {
- keyPathToName[\ChartContentDependency.fetchChartRankingUseCase] = "fetchChartRankingUseCase-any FetchChartRankingUseCase"
- keyPathToName[\ChartContentDependency.fetchChartUpdateTimeUseCase] = "fetchChartUpdateTimeUseCase-any FetchChartUpdateTimeUseCase"
- keyPathToName[\ChartContentDependency.containSongsComponent] = "containSongsComponent-ContainSongsComponent"
- }
-}
-extension AskSongComponent: Registration {
- public func registerItems() {
- keyPathToName[\AskSongDependency.modifySongUseCase] = "modifySongUseCase-any ModifySongUseCase"
- }
-}
-extension SuggestFunctionComponent: Registration {
- public func registerItems() {
- keyPathToName[\SuggestFunctionDependency.suggestFunctionUseCase] = "suggestFunctionUseCase-any SuggestFunctionUseCase"
- }
-}
-extension StorageComponent: Registration {
- public func registerItems() {
- keyPathToName[\StorageDependency.signInComponent] = "signInComponent-SignInComponent"
- keyPathToName[\StorageDependency.afterLoginComponent] = "afterLoginComponent-AfterLoginComponent"
- }
-}
-extension QuestionComponent: Registration {
- public func registerItems() {
- keyPathToName[\QuestionDependency.suggestFunctionComponent] = "suggestFunctionComponent-SuggestFunctionComponent"
- keyPathToName[\QuestionDependency.wakMusicFeedbackComponent] = "wakMusicFeedbackComponent-WakMusicFeedbackComponent"
- keyPathToName[\QuestionDependency.askSongComponent] = "askSongComponent-AskSongComponent"
- keyPathToName[\QuestionDependency.bugReportComponent] = "bugReportComponent-BugReportComponent"
- }
-}
-extension MyPlayListComponent: Registration {
- public func registerItems() {
- keyPathToName[\MyPlayListDependency.multiPurposePopComponent] = "multiPurposePopComponent-MultiPurposePopComponent"
- keyPathToName[\MyPlayListDependency.playListDetailComponent] = "playListDetailComponent-PlayListDetailComponent"
- keyPathToName[\MyPlayListDependency.fetchPlayListUseCase] = "fetchPlayListUseCase-any FetchPlayListUseCase"
- keyPathToName[\MyPlayListDependency.editPlayListOrderUseCase] = "editPlayListOrderUseCase-any EditPlayListOrderUseCase"
- keyPathToName[\MyPlayListDependency.deletePlayListUseCase] = "deletePlayListUseCase-any DeletePlayListUseCase"
- }
-}
-extension AfterLoginComponent: Registration {
- public func registerItems() {
- keyPathToName[\AfterLoginDependency.fetchUserInfoUseCase] = "fetchUserInfoUseCase-any FetchUserInfoUseCase"
- keyPathToName[\AfterLoginDependency.requestComponent] = "requestComponent-RequestComponent"
- keyPathToName[\AfterLoginDependency.profilePopComponent] = "profilePopComponent-ProfilePopComponent"
- keyPathToName[\AfterLoginDependency.myPlayListComponent] = "myPlayListComponent-MyPlayListComponent"
- keyPathToName[\AfterLoginDependency.multiPurposePopComponent] = "multiPurposePopComponent-MultiPurposePopComponent"
- keyPathToName[\AfterLoginDependency.favoriteComponent] = "favoriteComponent-FavoriteComponent"
- }
-}
-extension FavoriteComponent: Registration {
- public func registerItems() {
- keyPathToName[\FavoriteDependency.containSongsComponent] = "containSongsComponent-ContainSongsComponent"
- keyPathToName[\FavoriteDependency.fetchFavoriteSongsUseCase] = "fetchFavoriteSongsUseCase-any FetchFavoriteSongsUseCase"
- keyPathToName[\FavoriteDependency.editFavoriteSongsOrderUseCase] = "editFavoriteSongsOrderUseCase-any EditFavoriteSongsOrderUseCase"
- keyPathToName[\FavoriteDependency.deleteFavoriteListUseCase] = "deleteFavoriteListUseCase-any DeleteFavoriteListUseCase"
- }
-}
-extension QnaComponent: Registration {
- public func registerItems() {
- keyPathToName[\QnaDependency.qnaContentComponent] = "qnaContentComponent-QnaContentComponent"
- keyPathToName[\QnaDependency.fetchQnaCategoriesUseCase] = "fetchQnaCategoriesUseCase-any FetchQnaCategoriesUseCase"
- keyPathToName[\QnaDependency.fetchQnaUseCase] = "fetchQnaUseCase-any FetchQnaUseCase"
- }
-}
-extension RequestComponent: Registration {
- public func registerItems() {
- keyPathToName[\RequestDependency.withdrawUserInfoUseCase] = "withdrawUserInfoUseCase-any WithdrawUserInfoUseCase"
- keyPathToName[\RequestDependency.qnaComponent] = "qnaComponent-QnaComponent"
- keyPathToName[\RequestDependency.questionComponent] = "questionComponent-QuestionComponent"
- keyPathToName[\RequestDependency.containSongsComponent] = "containSongsComponent-ContainSongsComponent"
- keyPathToName[\RequestDependency.noticeComponent] = "noticeComponent-NoticeComponent"
- keyPathToName[\RequestDependency.serviceInfoComponent] = "serviceInfoComponent-ServiceInfoComponent"
- }
-}
-extension NoticeDetailComponent: Registration {
- public func registerItems() {
-
- }
-}
-extension NoticeComponent: Registration {
- public func registerItems() {
- keyPathToName[\NoticeDependency.fetchNoticeUseCase] = "fetchNoticeUseCase-any FetchNoticeUseCase"
- keyPathToName[\NoticeDependency.noticeDetailComponent] = "noticeDetailComponent-NoticeDetailComponent"
- }
-}
-extension QnaContentComponent: Registration {
- public func registerItems() {
-
- }
-}
-extension BugReportComponent: Registration {
- public func registerItems() {
- keyPathToName[\BugReportDependency.reportBugUseCase] = "reportBugUseCase-any ReportBugUseCase"
- }
-}
-extension WakMusicFeedbackComponent: Registration {
- public func registerItems() {
- keyPathToName[\WakMusicFeedbackDependency.inquiryWeeklyChartUseCase] = "inquiryWeeklyChartUseCase-any InquiryWeeklyChartUseCase"
- }
-}
-extension RootComponent: Registration {
- public func registerItems() {
- keyPathToName[\RootDependency.mainContainerComponent] = "mainContainerComponent-MainContainerComponent"
- keyPathToName[\RootDependency.permissionComponent] = "permissionComponent-PermissionComponent"
- keyPathToName[\RootDependency.fetchUserInfoUseCase] = "fetchUserInfoUseCase-any FetchUserInfoUseCase"
- keyPathToName[\RootDependency.fetchCheckAppUseCase] = "fetchCheckAppUseCase-any FetchCheckAppUseCase"
- }
-}
-extension PermissionComponent: Registration {
- public func registerItems() {
-
- }
-}
-extension SignInComponent: Registration {
- public func registerItems() {
- keyPathToName[\SignInDependency.fetchTokenUseCase] = "fetchTokenUseCase-any FetchTokenUseCase"
- keyPathToName[\SignInDependency.fetchNaverUserInfoUseCase] = "fetchNaverUserInfoUseCase-any FetchNaverUserInfoUseCase"
- keyPathToName[\SignInDependency.fetchUserInfoUseCase] = "fetchUserInfoUseCase-any FetchUserInfoUseCase"
- }
-}
-extension HomeComponent: Registration {
- public func registerItems() {
- keyPathToName[\HomeDependency.fetchChartRankingUseCase] = "fetchChartRankingUseCase-any FetchChartRankingUseCase"
- keyPathToName[\HomeDependency.fetchNewSongsUseCase] = "fetchNewSongsUseCase-any FetchNewSongsUseCase"
- keyPathToName[\HomeDependency.fetchRecommendPlayListUseCase] = "fetchRecommendPlayListUseCase-any FetchRecommendPlayListUseCase"
- keyPathToName[\HomeDependency.playListDetailComponent] = "playListDetailComponent-PlayListDetailComponent"
- keyPathToName[\HomeDependency.newSongsComponent] = "newSongsComponent-NewSongsComponent"
- }
-}
-extension AfterSearchComponent: Registration {
- public func registerItems() {
- keyPathToName[\AfterSearchDependency.afterSearchContentComponent] = "afterSearchContentComponent-AfterSearchContentComponent"
- keyPathToName[\AfterSearchDependency.fetchSearchSongUseCase] = "fetchSearchSongUseCase-any FetchSearchSongUseCase"
- keyPathToName[\AfterSearchDependency.containSongsComponent] = "containSongsComponent-ContainSongsComponent"
- }
-}
-extension AfterSearchContentComponent: Registration {
- public func registerItems() {
-
- }
-}
-extension SearchComponent: Registration {
- public func registerItems() {
- keyPathToName[\SearchDependency.beforeSearchComponent] = "beforeSearchComponent-BeforeSearchComponent"
- keyPathToName[\SearchDependency.afterSearchComponent] = "afterSearchComponent-AfterSearchComponent"
- }
-}
-extension BeforeSearchComponent: Registration {
- public func registerItems() {
- keyPathToName[\BeforeSearchDependency.playListDetailComponent] = "playListDetailComponent-PlayListDetailComponent"
- keyPathToName[\BeforeSearchDependency.fetchRecommendPlayListUseCase] = "fetchRecommendPlayListUseCase-any FetchRecommendPlayListUseCase"
- }
-}
-extension ContainSongsComponent: Registration {
- public func registerItems() {
- keyPathToName[\ContainSongsDependency.multiPurposePopComponent] = "multiPurposePopComponent-MultiPurposePopComponent"
- keyPathToName[\ContainSongsDependency.fetchPlayListUseCase] = "fetchPlayListUseCase-any FetchPlayListUseCase"
- keyPathToName[\ContainSongsDependency.addSongIntoPlayListUseCase] = "addSongIntoPlayListUseCase-any AddSongIntoPlayListUseCase"
- }
-}
-extension ServiceInfoComponent: Registration {
- public func registerItems() {
- keyPathToName[\ServiceInfoDependency.openSourceLicenseComponent] = "openSourceLicenseComponent-OpenSourceLicenseComponent"
- }
-}
-extension MultiPurposePopComponent: Registration {
- public func registerItems() {
- keyPathToName[\MultiPurposePopDependency.createPlayListUseCase] = "createPlayListUseCase-any CreatePlayListUseCase"
- keyPathToName[\MultiPurposePopDependency.loadPlayListUseCase] = "loadPlayListUseCase-any LoadPlayListUseCase"
- keyPathToName[\MultiPurposePopDependency.setUserNameUseCase] = "setUserNameUseCase-any SetUserNameUseCase"
- keyPathToName[\MultiPurposePopDependency.editPlayListNameUseCase] = "editPlayListNameUseCase-any EditPlayListNameUseCase"
- }
-}
-extension NewSongsComponent: Registration {
- public func registerItems() {
- keyPathToName[\NewSongsDependency.newSongsContentComponent] = "newSongsContentComponent-NewSongsContentComponent"
- }
-}
-extension PlayListDetailComponent: Registration {
- public func registerItems() {
- keyPathToName[\PlayListDetailDependency.fetchPlayListDetailUseCase] = "fetchPlayListDetailUseCase-any FetchPlayListDetailUseCase"
- keyPathToName[\PlayListDetailDependency.editPlayListUseCase] = "editPlayListUseCase-any EditPlayListUseCase"
- keyPathToName[\PlayListDetailDependency.removeSongsUseCase] = "removeSongsUseCase-any RemoveSongsUseCase"
- keyPathToName[\PlayListDetailDependency.multiPurposePopComponent] = "multiPurposePopComponent-MultiPurposePopComponent"
- keyPathToName[\PlayListDetailDependency.containSongsComponent] = "containSongsComponent-ContainSongsComponent"
- }
-}
-extension OpenSourceLicenseComponent: Registration {
- public func registerItems() {
-
- }
-}
-extension NoticePopupComponent: Registration {
- public func registerItems() {
-
- }
-}
-extension ProfilePopComponent: Registration {
- public func registerItems() {
- keyPathToName[\ProfilePopDependency.fetchProfileListUseCase] = "fetchProfileListUseCase-any FetchProfileListUseCase"
- keyPathToName[\ProfilePopDependency.setProfileUseCase] = "setProfileUseCase-any SetProfileUseCase"
- }
-}
-extension NewSongsContentComponent: Registration {
- public func registerItems() {
- keyPathToName[\NewSongsContentDependency.fetchNewSongsUseCase] = "fetchNewSongsUseCase-any FetchNewSongsUseCase"
- keyPathToName[\NewSongsContentDependency.fetchChartUpdateTimeUseCase] = "fetchChartUpdateTimeUseCase-any FetchChartUpdateTimeUseCase"
- keyPathToName[\NewSongsContentDependency.containSongsComponent] = "containSongsComponent-ContainSongsComponent"
- }
-}
-
-
-#endif
-
-private func factoryEmptyDependencyProvider(_ component: NeedleFoundation.Scope) -> AnyObject {
- return EmptyDependencyProvider(component: component)
-}
-
-// MARK: - Registration
-private func registerProviderFactory(_ componentPath: String, _ factory: @escaping (NeedleFoundation.Scope) -> AnyObject) {
- __DependencyProviderRegistry.instance.registerDependencyProviderFactory(for: componentPath, factory)
-}
-
-#if !NEEDLE_DYNAMIC
-
-@inline(never) private func register1() {
- registerProviderFactory("^->AppComponent", factoryEmptyDependencyProvider)
- registerProviderFactory("^->AppComponent->ArtistComponent", factorye0c5444f5894148bdd93f47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->ArtistDetailComponent", factory35314797fadaf164ece6f47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->ArtistMusicContentComponent", factory8b6ffa46033e2529b5daf47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->ArtistMusicComponent", factory382e7f8466df35a3f1d9f47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->PlaylistComponent", factory3a0a6eb1061d8d5a2deff47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->PlayerComponent", factorybc7f802f601dd5913533f47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->MainTabBarComponent", factorye547a52b3fce5887c8c7f47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->BottomTabBarComponent", factoryd34fa9e493604a6295bde3b0c44298fc1c149afb)
- registerProviderFactory("^->AppComponent->MainContainerComponent", factory8e19f48d5d573d3ea539f47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->ChartComponent", factoryeac6a4df54bbd391d31bf47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->ChartContentComponent", factoryc9a137630ce76907f36ff47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->AskSongComponent", factory37544fa026b309cd68d7f47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->SuggestFunctionComponent", factory63287bff3999ed1787ddf47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->StorageComponent", factory2415399d25299b97b98bf47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->QuestionComponent", factoryedad1813a36115eec11ef47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->MyPlayListComponent", factory51a57a92f76af93a9ec2f47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->AfterLoginComponent", factory6cc9c8141e04494113b8f47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->FavoriteComponent", factory8e4acb90bd0d9b48604af47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->QnaComponent", factory49a98666675cb7a82038f47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->RequestComponent", factory13954fb3ec537bab80bcf47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->NoticeDetailComponent", factory3db143c2f80d621d5a7fe3b0c44298fc1c149afb)
- registerProviderFactory("^->AppComponent->NoticeComponent", factoryaf8e5665e5b9217918f5f47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->QnaContentComponent", factory1501f7005831c8411229e3b0c44298fc1c149afb)
- registerProviderFactory("^->AppComponent->BugReportComponent", factoryafa28e93c96a785ed32af47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->WakMusicFeedbackComponent", factory32abe9db091bc43329a1f47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->RootComponent", factory264bfc4d4cb6b0629b40f47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->PermissionComponent", factoryc1d4d80afbccf86bf1c0e3b0c44298fc1c149afb)
- registerProviderFactory("^->AppComponent->SignInComponent", factoryda2925fd76da866a652af47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->HomeComponent", factory67229cdf0f755562b2b1f47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->AfterSearchComponent", factoryeb2da679e35e2c4fb9a5f47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->AfterSearchContentComponent", factorycaaccdf52467bfa87f73e3b0c44298fc1c149afb)
- registerProviderFactory("^->AppComponent->SearchComponent", factorye3d049458b2ccbbcb3b6f47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->BeforeSearchComponent", factory9bb852337d5550979293f47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->ContainSongsComponent", factory4d4f4455414271fee232f47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->ServiceInfoComponent", factory3afd170b9974b0dbd863f47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->MultiPurposePopComponent", factory972fcba2860fcb8ad7b8f47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->NewSongsComponent", factory379179b05dd24ff979edf47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->PlayListDetailComponent", factory9e077ee814ce180ea399f47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->OpenSourceLicenseComponent", factoryd505894818021731340ae3b0c44298fc1c149afb)
- registerProviderFactory("^->AppComponent->NoticePopupComponent", factorycd081aacb61d6a707ca7e3b0c44298fc1c149afb)
- registerProviderFactory("^->AppComponent->ProfilePopComponent", factorybd14b11ccce6dac94a24f47b58f8f304c97af4d5)
- registerProviderFactory("^->AppComponent->NewSongsContentComponent", factorye130e1fbfcbc622a4c38f47b58f8f304c97af4d5)
-}
-#endif
-
-public func registerProviderFactories() {
-#if !NEEDLE_DYNAMIC
- register1()
-#endif
-}
diff --git a/Projects/App/Sources/Application/SceneDelegate.swift b/Projects/App/Sources/Application/SceneDelegate.swift
index 3cf617433..42cc4a2b5 100644
--- a/Projects/App/Sources/Application/SceneDelegate.swift
+++ b/Projects/App/Sources/Application/SceneDelegate.swift
@@ -1,12 +1,15 @@
-import UIKit
+import BaseFeature
+import Combine
+import LogManager
+import NaverThirdPartyLogin
import RootFeature
+import UIKit
import Utility
-import NaverThirdPartyLogin
-import CommonFeature
-import Combine
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
+ private var root: AppComponent?
+
func scene(
_ scene: UIScene,
willConnectTo session: UISceneSession,
@@ -15,62 +18,94 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
guard let scene = (scene as? UIWindowScene) else { return }
self.window = UIWindow(windowScene: scene)
registerProviderFactories()
- let root = AppComponent()
- self.window?.rootViewController = root.makeRootView().wrapNavigationController
+ self.root = AppComponent()
+ self.window?.rootViewController = root?.makeRootView().wrapNavigationController
self.window?.makeKeyAndVisible()
+
+ // Handling App Entry:: Not Running State
+ handleAppEntry(with: connectionOptions)
}
- func sceneDidDisconnect(_ scene: UIScene) {
+ func sceneDidDisconnect(_ scene: UIScene) {}
- }
- func sceneDidBecomeActive(_ scene: UIScene) {
+ func sceneDidBecomeActive(_ scene: UIScene) {}
- }
- func sceneWillResignActive(_ scene: UIScene) {
+ func sceneWillResignActive(_ scene: UIScene) {}
- }
-
- private var statePublisher: AnyCancellable?
-
- func sceneWillEnterForeground(_ scene: UIScene) {
- statePublisher?.cancel()
- }
-
- func sceneDidEnterBackground(_ scene: UIScene) {
- let isPlayed = PlayState.shared.state
- statePublisher = PlayState.shared.$state.sink { state in
- if state == .paused {
- DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
- if isPlayed == .playing { PlayState.shared.play() }
- }
- }
- }
- }
-
- ///MARK: - Handling DeepLink
+ func sceneWillEnterForeground(_ scene: UIScene) {}
+
+ func sceneDidEnterBackground(_ scene: UIScene) {}
+
+ // MARK: - Handling DeepLink
func scene(_ scene: UIScene, openURLContexts URLContexts: Set) {
guard let url = URLContexts.first?.url else { return }
-
+
let scheme: String = url.scheme ?? ""
- DEBUG_LOG("[openURLContexts] scheme: \(scheme), URL: \(url.absoluteString)")
-
+ LogManager.printDebug("[openURLContexts] scheme: \(scheme), URL: \(url.absoluteString)")
+
switch scheme {
- case GOOGLE_URL_SCHEME(): //구글
+ case GOOGLE_URL_SCHEME(): // 구글
GoogleLoginManager.shared.getGoogleToken(url)
- case NAVER_URL_SCHEME(): //네이버
+ case NAVER_URL_SCHEME(): // 네이버
NaverThirdPartyLoginConnection.getSharedInstance().receiveAccessToken(url)
-
+
+ case WM_URI_SCHEME():
+ handleDeeplink(url: url)
+
default: return
}
}
-
- ///MARK: - Handling UniversalLink
+
+ // MARK: - Handling UniversalLink
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let webpageURL = userActivity.webpageURL else {
return
}
- DEBUG_LOG(webpageURL.absoluteString)
+ LogManager.printDebug("URL: \(webpageURL.absoluteString)")
+
+ guard webpageURL.host == WM_UNIVERSALLINK_DOMAIN() else {
+ return
+ }
+ handleUniversalLink(url: webpageURL)
+ }
+}
+
+private extension SceneDelegate {
+ func handleAppEntry(with connectionOptions: UIScene.ConnectionOptions) {
+ if let url = connectionOptions.urlContexts.first?.url {
+ handleDeeplink(url: url)
+
+ } else if let userActivity = connectionOptions.userActivities.first,
+ userActivity.activityType == NSUserActivityTypeBrowsingWeb,
+ let webpageURL = userActivity.webpageURL {
+ handleUniversalLink(url: webpageURL)
+
+ } else if let notification = connectionOptions.notificationResponse?.notification {
+ let userInfo = notification.request.content.userInfo
+ root?.appEntryState.moveScene(params: userInfo.parseNotificationInfo)
+ }
+ }
+
+ func handleDeeplink(url: URL) {
+ let page: String = url.host ?? ""
+ let pathComponents: [String] = url.pathComponents.filter { $0 != "/" }
+ var params: [String: Any] = url.parseToParams()
+ params["page"] = page
+ LogManager.printDebug("host: \(page), pathComponents: \(pathComponents), params: \(params)")
+ root?.appEntryState.moveScene(params: params)
+ }
+
+ func handleUniversalLink(url: URL) {
+ let host: String = url.host ?? ""
+ let pathComponents: [String] = url.pathComponents.filter { $0 != "/" }
+ let page: String = pathComponents.first ?? ""
+ let key: String = pathComponents.last ?? ""
+ var params: [String: Any] = url.parseToParams()
+ params["page"] = page
+ params["key"] = key
+ LogManager.printDebug("host: \(host), pathComponents: \(pathComponents), params: \(params)")
+ root?.appEntryState.moveScene(params: params)
}
}
diff --git a/Projects/App/Support/Info.plist b/Projects/App/Support/Info.plist
index 15cc21b16..118c93f85 100644
--- a/Projects/App/Support/Info.plist
+++ b/Projects/App/Support/Info.plist
@@ -40,6 +40,14 @@
$(GOOGLE_URL_SCHEME)
+
+ CFBundleTypeRole
+ Editor
+ CFBundleURLSchemes
+
+ $(WM_URI_SCHEME)
+
+
CFBundleVersion
$(CURRENT_PROJECT_VERSION)
@@ -47,27 +55,29 @@
LSApplicationQueriesSchemes
- naversearchapp
- naversearchthirdlogin
+ naversearchapp
+ naversearchthirdlogin
+ youtube
+ youtubemusic
LSRequiresIPhoneOS
NSCameraUsageDescription
- [선택권한] 버그 제보 시 카메라 촬영을 하려면 권한 승인이 필요합니다.
+ [선택권한] 카메라 촬영을 하려면 권한 승인이 필요합니다.
+ NSPhotoLibraryAddUsageDescription
+ [선택권한] 앨범 사진을 첨부 하거나, 저장하려면 권한 승인이 필요합니다.
NSPhotoLibraryUsageDescription
- [선택권한] 버그 제보 시 앨범 사진을 첨부 하려면 권한 승인이 필요합니다.
+ [선택권한] 앨범 사진을 첨부 하거나, 저장하려면 권한 승인이 필요합니다.
Secrets
- BASE_IMAGE_URL
- $(BASE_IMAGE_URL)
BASE_DEV_URL
$(BASE_DEV_URL)
BASE_PROD_URL
$(BASE_PROD_URL)
+ CDN_DOMAIN_URL
+ $(CDN_DOMAIN_URL)
GOOGLE_CLIENT_ID
$(GOOGLE_CLIENT_ID)
- GOOGLE_SECRET_KEY
- $(GOOGLE_SECRET_KEY)
GOOGLE_URL_SCHEME
$(GOOGLE_URL_SCHEME)
NAVER_APP_NAME
@@ -78,8 +88,6 @@
$(NAVER_CONSUMER_SECRET)
NAVER_URL_SCHEME
$(NAVER_URL_SCHEME)
- WAKENTER_BASE_URL
- $(WAKENTER_BASE_URL)
WMDOMAIN_APP
$(WMDOMAIN_APP)
WMDOMAIN_ARTIST
@@ -88,42 +96,38 @@
$(WMDOMAIN_AUTH)
WMDOMAIN_CHARTS
$(WMDOMAIN_CHARTS)
- WMDOMAIN_IMAGE_ARTIST_ROUND
- $(WMDOMAIN_IMAGE_ARTIST_ROUND)
- WMDOMAIN_IMAGE_ARTIST_SQUARE
- $(WMDOMAIN_IMAGE_ARTIST_SQUARE)
- WMDOMAIN_IMAGE_NEWS
- $(WMDOMAIN_IMAGE_NEWS)
- WMDOMAIN_IMAGE_NOTICE
- $(WMDOMAIN_IMAGE_NOTICE)
- WMDOMAIN_IMAGE_PLAYLIST
- $(WMDOMAIN_IMAGE_PLAYLIST)
- WMDOMAIN_IMAGE_PROFILE
- $(WMDOMAIN_IMAGE_PROFILE)
- WMDOMAIN_IMAGE_RECOMMEND_PLAYLIST_ROUND
- $(WMDOMAIN_IMAGE_RECOMMEND_PLAYLIST_ROUND)
- WMDOMAIN_IMAGE_RECOMMEND_PLAYLIST_SQUARE
- $(WMDOMAIN_IMAGE_RECOMMEND_PLAYLIST_SQUARE)
+ WMDOMAIN_CREDIT
+ $(WMDOMAIN_CREDIT)
+ WMDOMAIN_FAQ
+ $(WMDOMAIN_FAQ)
+ WMDOMAIN_IMAGE
+ $(WMDOMAIN_IMAGE)
WMDOMAIN_LIKE
$(WMDOMAIN_LIKE)
WMDOMAIN_NOTICE
$(WMDOMAIN_NOTICE)
- WMDOMAIN_PLAY
- $(WMDOMAIN_PLAY)
+ WMDOMAIN_NOTIFICATION
+ $(WMDOMAIN_NOTIFICATION)
WMDOMAIN_PLAYLIST
$(WMDOMAIN_PLAYLIST)
- WMDOMAIN_QNA
- $(WMDOMAIN_QNA)
+ WMDOMAIN_PRICE
+ $(WMDOMAIN_PRICE)
+ WMDOMAIN_SEARCH
+ $(WMDOMAIN_SEARCH)
WMDOMAIN_SONGS
$(WMDOMAIN_SONGS)
- WMDOMAIN_V2_SONGS
- $(WMDOMAIN_V2_SONGS)
- WMDOMAIN_SUGGEST
- $(WMDOMAIN_SUGGEST)
+ WMDOMAIN_TEAM
+ $(WMDOMAIN_TEAM)
WMDOMAIN_USER
$(WMDOMAIN_USER)
WM_APP_ID
$(WM_APP_ID)
+ WM_UNIVERSALLINK_DOMAIN
+ $(WM_UNIVERSALLINK_DOMAIN)
+ WM_UNIVERSALLINK_TEST_DOMAIN
+ $(WM_UNIVERSALLINK_TEST_DOMAIN)
+ WM_URI_SCHEME
+ $(WM_URI_SCHEME)
UIApplicationSceneManifest
@@ -144,6 +148,10 @@
UIApplicationSupportsIndirectInputEvents
+ UIBackgroundModes
+
+ remote-notification
+
UILaunchStoryboardName
LaunchScreen
UIRequiredDeviceCapabilities
diff --git a/Projects/App/Support/WaktaverseMusic.entitlements b/Projects/App/Support/WaktaverseMusic.entitlements
index a2041499d..e3b209f7c 100644
--- a/Projects/App/Support/WaktaverseMusic.entitlements
+++ b/Projects/App/Support/WaktaverseMusic.entitlements
@@ -9,6 +9,10 @@
com.apple.developer.associated-domains
applinks:wakmusic.xyz
+ applinks:deeplink.wakmusic.xyz
+ applinks:deeplink.eatcocoa.xyz
+ aps-environment
+ development
diff --git a/Projects/App/Tests/TargetTest.swift b/Projects/App/Tests/TargetTest.swift
index b1cf79405..147c29d2f 100644
--- a/Projects/App/Tests/TargetTest.swift
+++ b/Projects/App/Tests/TargetTest.swift
@@ -1,7 +1,6 @@
import XCTest
class TargetTests: XCTestCase {
-
override func setUpWithError() throws {
// Put setup code here. This method is called before the invocation of each test method in the class.
}
@@ -13,5 +12,4 @@ class TargetTests: XCTestCase {
func testExample() throws {
XCTAssertEqual("A", "A")
}
-
}
diff --git a/Projects/Domains/AppDomain/Interface/DataSource/RemoteAppDataSource.swift b/Projects/Domains/AppDomain/Interface/DataSource/RemoteAppDataSource.swift
new file mode 100644
index 000000000..50d3cfcb7
--- /dev/null
+++ b/Projects/Domains/AppDomain/Interface/DataSource/RemoteAppDataSource.swift
@@ -0,0 +1,14 @@
+//
+// RemoteAppDataSource.swift
+// AppDomain
+//
+// Created by KTH on 2024/03/04.
+// Copyright © 2024 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+import RxSwift
+
+public protocol RemoteAppDataSource {
+ func fetchAppCheck() -> Single
+}
diff --git a/Projects/Domains/AppDomain/Interface/Entity/AppCheckEntity.swift b/Projects/Domains/AppDomain/Interface/Entity/AppCheckEntity.swift
new file mode 100644
index 000000000..e1898c66b
--- /dev/null
+++ b/Projects/Domains/AppDomain/Interface/Entity/AppCheckEntity.swift
@@ -0,0 +1,29 @@
+//
+// AppCheckEntity.swift
+// AppDomain
+//
+// Created by KTH on 2024/03/04.
+// Copyright © 2024 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+
+public struct AppCheckEntity: Equatable {
+ public init(
+ flag: AppCheckFlagType,
+ title: String,
+ description: String,
+ version: String,
+ specialLogo: Bool
+ ) {
+ self.flag = flag
+ self.title = title
+ self.description = description
+ self.version = version
+ self.specialLogo = specialLogo
+ }
+
+ public let flag: AppCheckFlagType
+ public let title, description, version: String
+ public let specialLogo: Bool
+}
diff --git a/Projects/Domains/AppDomain/Interface/Enum/AppCheckFlagType.swift b/Projects/Domains/AppDomain/Interface/Enum/AppCheckFlagType.swift
new file mode 100644
index 000000000..ceb51c120
--- /dev/null
+++ b/Projects/Domains/AppDomain/Interface/Enum/AppCheckFlagType.swift
@@ -0,0 +1,17 @@
+//
+// AppCheckFlagType.swift
+// AppDomain
+//
+// Created by KTH on 2024/03/04.
+// Copyright © 2024 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+
+public enum AppCheckFlagType: Int, Decodable {
+ case normal = 1
+ case event
+ case update
+ case forceUpdate
+ case offline
+}
diff --git a/Projects/Domains/AppDomain/Interface/Repository/AppRepository.swift b/Projects/Domains/AppDomain/Interface/Repository/AppRepository.swift
new file mode 100644
index 000000000..c7519217f
--- /dev/null
+++ b/Projects/Domains/AppDomain/Interface/Repository/AppRepository.swift
@@ -0,0 +1,14 @@
+//
+// AppRepository.swift
+// AppDomain
+//
+// Created by KTH on 2024/03/04.
+// Copyright © 2024 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+import RxSwift
+
+public protocol AppRepository {
+ func fetchAppCheck() -> Single
+}
diff --git a/Projects/Domains/AppDomain/Interface/UseCase/FetchAppCheckUseCase.swift b/Projects/Domains/AppDomain/Interface/UseCase/FetchAppCheckUseCase.swift
new file mode 100644
index 000000000..5c3bff09f
--- /dev/null
+++ b/Projects/Domains/AppDomain/Interface/UseCase/FetchAppCheckUseCase.swift
@@ -0,0 +1,14 @@
+//
+// FetchAppCheckUseCase.swift
+// AppDomain
+//
+// Created by KTH on 2024/03/04.
+// Copyright © 2024 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+import RxSwift
+
+public protocol FetchAppCheckUseCase {
+ func execute() -> Single
+}
diff --git a/Projects/Domains/AppDomain/Project.swift b/Projects/Domains/AppDomain/Project.swift
new file mode 100644
index 000000000..54dd17947
--- /dev/null
+++ b/Projects/Domains/AppDomain/Project.swift
@@ -0,0 +1,26 @@
+import DependencyPlugin
+import ProjectDescription
+import ProjectDescriptionHelpers
+
+let project = Project.module(
+ name: ModulePaths.Domain.AppDomain.rawValue,
+ targets: [
+ .interface(
+ module: .domain(.AppDomain),
+ dependencies: [
+ .domain(target: .BaseDomain, type: .interface)
+ ]
+ ),
+ .implements(
+ module: .domain(.AppDomain),
+ dependencies: [
+ .domain(target: .BaseDomain),
+ .domain(target: .AppDomain, type: .interface)
+ ]
+ ),
+ .tests(
+ module: .domain(.AppDomain),
+ dependencies: [.domain(target: .AppDomain)]
+ )
+ ]
+)
diff --git a/Projects/Domains/AppDomain/Sources/API/AppAPI.swift b/Projects/Domains/AppDomain/Sources/API/AppAPI.swift
new file mode 100644
index 000000000..c338db51a
--- /dev/null
+++ b/Projects/Domains/AppDomain/Sources/API/AppAPI.swift
@@ -0,0 +1,64 @@
+//
+// AppAPI.swift
+// AppDomain
+//
+// Created by KTH on 2024/03/04.
+// Copyright © 2024 yongbeomkwak. All rights reserved.
+//
+
+import BaseDomain
+import ErrorModule
+import Foundation
+import Moya
+
+public enum AppAPI {
+ case fetchAppCheck
+}
+
+extension AppAPI: WMAPI {
+ public var domain: WMDomain {
+ return WMDomain.app
+ }
+
+ public var urlPath: String {
+ switch self {
+ case .fetchAppCheck:
+ return "/check"
+ }
+ }
+
+ public var method: Moya.Method {
+ return .get
+ }
+
+ public var task: Moya.Task {
+ switch self {
+ case .fetchAppCheck:
+ return .requestPlain
+ }
+ }
+
+ public var jwtTokenType: JwtTokenType {
+ return .none
+ }
+
+ public var baseInfoTypes: [BaseInfoType] {
+ return [.os, .appVersion]
+ }
+
+ public var errorMap: [Int: WMError] {
+ switch self {
+ default:
+ return [
+ 400: .badRequest,
+ 401: .tokenExpired,
+ 404: .notFound,
+ 429: .tooManyRequest,
+ 500: .internalServerError,
+ 502: .internalServerError,
+ 521: .internalServerError,
+ 1009: .offline
+ ]
+ }
+ }
+}
diff --git a/Projects/Domains/AppDomain/Sources/DataSource/RemoteAppDataSourceImpl.swift b/Projects/Domains/AppDomain/Sources/DataSource/RemoteAppDataSourceImpl.swift
new file mode 100644
index 000000000..fcc7871ec
--- /dev/null
+++ b/Projects/Domains/AppDomain/Sources/DataSource/RemoteAppDataSourceImpl.swift
@@ -0,0 +1,20 @@
+//
+// RemoteAppDataSourceImpl.swift
+// AppDomain
+//
+// Created by KTH on 2024/03/04.
+// Copyright © 2024 yongbeomkwak. All rights reserved.
+//
+
+import AppDomainInterface
+import BaseDomain
+import Foundation
+import RxSwift
+
+public final class RemoteAppDataSourceImpl: BaseRemoteDataSource, RemoteAppDataSource {
+ public func fetchAppCheck() -> Single {
+ request(.fetchAppCheck)
+ .map(FetchAppCheckResponseDTO.self)
+ .map { $0.toDomain() }
+ }
+}
diff --git a/Projects/Domains/AppDomain/Sources/Repository/AppRepositoryImpl.swift b/Projects/Domains/AppDomain/Sources/Repository/AppRepositoryImpl.swift
new file mode 100644
index 000000000..52c2357af
--- /dev/null
+++ b/Projects/Domains/AppDomain/Sources/Repository/AppRepositoryImpl.swift
@@ -0,0 +1,25 @@
+//
+// AppRepositoryImpl.swift
+// AppDomain
+//
+// Created by KTH on 2024/03/04.
+// Copyright © 2024 yongbeomkwak. All rights reserved.
+//
+
+import AppDomainInterface
+import Foundation
+import RxSwift
+
+public final class AppRepositoryImpl: AppRepository {
+ private let remoteAppDataSource: any RemoteAppDataSource
+
+ public init(
+ remoteAppDataSource: RemoteAppDataSource
+ ) {
+ self.remoteAppDataSource = remoteAppDataSource
+ }
+
+ public func fetchAppCheck() -> Single {
+ remoteAppDataSource.fetchAppCheck()
+ }
+}
diff --git a/Projects/Domains/AppDomain/Sources/ResponseDTO/FetchAppCheckResponseDTO.swift b/Projects/Domains/AppDomain/Sources/ResponseDTO/FetchAppCheckResponseDTO.swift
new file mode 100644
index 000000000..2da9783e5
--- /dev/null
+++ b/Projects/Domains/AppDomain/Sources/ResponseDTO/FetchAppCheckResponseDTO.swift
@@ -0,0 +1,28 @@
+//
+// AppCheckResponseDTO.swift
+// AppDomain
+//
+// Created by KTH on 2024/03/04.
+// Copyright © 2024 yongbeomkwak. All rights reserved.
+//
+
+import AppDomainInterface
+import Foundation
+
+public struct FetchAppCheckResponseDTO: Decodable {
+ public let flag: AppCheckFlagType
+ public let title, description, version: String?
+ public let specialLogo: Bool?
+}
+
+public extension FetchAppCheckResponseDTO {
+ func toDomain() -> AppCheckEntity {
+ return AppCheckEntity(
+ flag: flag,
+ title: title ?? "",
+ description: description ?? "",
+ version: version ?? "",
+ specialLogo: specialLogo ?? false
+ )
+ }
+}
diff --git a/Projects/Domains/AppDomain/Sources/UseCase/FetchAppCheckUseCaseImpl.swift b/Projects/Domains/AppDomain/Sources/UseCase/FetchAppCheckUseCaseImpl.swift
new file mode 100644
index 000000000..a0d32619e
--- /dev/null
+++ b/Projects/Domains/AppDomain/Sources/UseCase/FetchAppCheckUseCaseImpl.swift
@@ -0,0 +1,25 @@
+//
+// FetchCheckAppUseCaseImpl.swift
+// AppDomain
+//
+// Created by KTH on 2024/03/04.
+// Copyright © 2024 yongbeomkwak. All rights reserved.
+//
+
+import AppDomainInterface
+import Foundation
+import RxSwift
+
+public struct FetchAppCheckUseCaseImpl: FetchAppCheckUseCase {
+ private let appRepository: any AppRepository
+
+ public init(
+ appRepository: AppRepository
+ ) {
+ self.appRepository = appRepository
+ }
+
+ public func execute() -> Single {
+ appRepository.fetchAppCheck()
+ }
+}
diff --git a/Projects/Domains/AppDomain/Tests/Test.swift b/Projects/Domains/AppDomain/Tests/Test.swift
new file mode 100644
index 000000000..8b1378917
--- /dev/null
+++ b/Projects/Domains/AppDomain/Tests/Test.swift
@@ -0,0 +1 @@
+
diff --git a/Projects/Domains/ArtistDomain/Interface/DataSource/RemoteArtistDataSource.swift b/Projects/Domains/ArtistDomain/Interface/DataSource/RemoteArtistDataSource.swift
new file mode 100644
index 000000000..13b9d9204
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Interface/DataSource/RemoteArtistDataSource.swift
@@ -0,0 +1,10 @@
+import Foundation
+import RxSwift
+
+public protocol RemoteArtistDataSource {
+ func fetchArtistList() -> Single<[ArtistEntity]>
+ func fetchArtistDetail(id: String) -> Single
+ func fetchArtistSongList(id: String, sort: ArtistSongSortType, page: Int) -> Single<[ArtistSongListEntity]>
+ func fetchArtistSubscriptionStatus(id: String) -> Single
+ func subscriptionArtist(id: String, on: Bool) -> Completable
+}
diff --git a/Projects/Domains/ArtistDomain/Interface/Entity/ArtistEntity.swift b/Projects/Domains/ArtistDomain/Interface/Entity/ArtistEntity.swift
new file mode 100644
index 000000000..b4cf8500a
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Interface/Entity/ArtistEntity.swift
@@ -0,0 +1,55 @@
+import Foundation
+
+public struct ArtistEntity: Equatable {
+ public init(
+ id: String,
+ krName: String,
+ enName: String,
+ groupName: String,
+ title: String,
+ description: String,
+ personalColor: String,
+ roundImage: String,
+ squareImage: String,
+ graduated: Bool,
+ playlist: ArtistEntity.Playlist,
+ isHiddenItem: Bool
+ ) {
+ self.id = id
+ self.krName = krName
+ self.enName = enName
+ self.groupName = groupName
+ self.title = title
+ self.description = description
+ self.personalColor = personalColor
+ self.roundImage = roundImage
+ self.squareImage = squareImage
+ self.graduated = graduated
+ self.playlist = playlist
+ self.isHiddenItem = isHiddenItem
+ }
+
+ public static func == (lhs: Self, rhs: Self) -> Bool {
+ return lhs.id == rhs.id
+ }
+
+ public let id, krName, enName, groupName: String
+ public let title, description: String
+ public let personalColor: String
+ public let roundImage, squareImage: String
+ public let graduated: Bool
+ public let playlist: ArtistEntity.Playlist
+ public var isHiddenItem: Bool = false
+}
+
+public extension ArtistEntity {
+ struct Playlist {
+ public let latest, popular, oldest: String
+
+ public init(latest: String, popular: String, oldest: String) {
+ self.latest = latest
+ self.popular = popular
+ self.oldest = oldest
+ }
+ }
+}
diff --git a/Projects/Domains/ArtistDomain/Interface/Entity/ArtistSongListEntity.swift b/Projects/Domains/ArtistDomain/Interface/Entity/ArtistSongListEntity.swift
new file mode 100644
index 000000000..759e69eab
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Interface/Entity/ArtistSongListEntity.swift
@@ -0,0 +1,24 @@
+import Foundation
+
+public struct ArtistSongListEntity: Equatable {
+ public init(
+ songID: String,
+ title: String,
+ artist: String,
+ date: String,
+ isSelected: Bool
+ ) {
+ self.songID = songID
+ self.title = title
+ self.artist = artist
+ self.date = date
+ self.isSelected = isSelected
+ }
+
+ public static func == (lhs: Self, rhs: Self) -> Bool {
+ return lhs.songID == rhs.songID
+ }
+
+ public let songID, title, artist, date: String
+ public var isSelected: Bool = false
+}
diff --git a/Projects/Domains/ArtistDomain/Interface/Entity/ArtistSubscriptionStatusEntity.swift b/Projects/Domains/ArtistDomain/Interface/Entity/ArtistSubscriptionStatusEntity.swift
new file mode 100644
index 000000000..d0944a114
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Interface/Entity/ArtistSubscriptionStatusEntity.swift
@@ -0,0 +1,9 @@
+import Foundation
+
+public struct ArtistSubscriptionStatusEntity {
+ public init(isSubscription: Bool) {
+ self.isSubscription = isSubscription
+ }
+
+ public let isSubscription: Bool
+}
diff --git a/Projects/Domains/ArtistDomain/Interface/Enum/ArtistSongSortType.swift b/Projects/Domains/ArtistDomain/Interface/Enum/ArtistSongSortType.swift
new file mode 100644
index 000000000..f73039655
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Interface/Enum/ArtistSongSortType.swift
@@ -0,0 +1,18 @@
+import Foundation
+
+public enum ArtistSongSortType: Int {
+ case new = 1
+ case popular
+ case old
+
+ public var display: String {
+ switch self {
+ case .new:
+ return "최신순"
+ case .popular:
+ return "인기순"
+ case .old:
+ return "과거순"
+ }
+ }
+}
diff --git a/Projects/Domains/ArtistDomain/Interface/Repository/ArtistRepository.swift b/Projects/Domains/ArtistDomain/Interface/Repository/ArtistRepository.swift
new file mode 100644
index 000000000..45d84abd2
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Interface/Repository/ArtistRepository.swift
@@ -0,0 +1,10 @@
+import Foundation
+import RxSwift
+
+public protocol ArtistRepository {
+ func fetchArtistList() -> Single<[ArtistEntity]>
+ func fetchArtistDetail(id: String) -> Single
+ func fetchArtistSongList(id: String, sort: ArtistSongSortType, page: Int) -> Single<[ArtistSongListEntity]>
+ func fetchArtistSubscriptionStatus(id: String) -> Single
+ func subscriptionArtist(id: String, on: Bool) -> Completable
+}
diff --git a/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistDetailUseCase.swift b/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistDetailUseCase.swift
new file mode 100644
index 000000000..f953bebd1
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistDetailUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol FetchArtistDetailUseCase {
+ func execute(id: String) -> Single
+}
diff --git a/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistListUseCase.swift b/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistListUseCase.swift
new file mode 100644
index 000000000..33071ee5b
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistListUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol FetchArtistListUseCase {
+ func execute() -> Single<[ArtistEntity]>
+}
diff --git a/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistSongListUseCase.swift b/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistSongListUseCase.swift
new file mode 100644
index 000000000..8ac70f402
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistSongListUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol FetchArtistSongListUseCase {
+ func execute(id: String, sort: ArtistSongSortType, page: Int) -> Single<[ArtistSongListEntity]>
+}
diff --git a/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistSubscriptionStatusUseCase.swift b/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistSubscriptionStatusUseCase.swift
new file mode 100644
index 000000000..27216630f
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Interface/UseCase/FetchArtistSubscriptionStatusUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol FetchArtistSubscriptionStatusUseCase {
+ func execute(id: String) -> Single
+}
diff --git a/Projects/Domains/ArtistDomain/Interface/UseCase/SubscriptionArtistUseCase.swift b/Projects/Domains/ArtistDomain/Interface/UseCase/SubscriptionArtistUseCase.swift
new file mode 100644
index 000000000..e8bbab6a8
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Interface/UseCase/SubscriptionArtistUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol SubscriptionArtistUseCase {
+ func execute(id: String, on: Bool) -> Completable
+}
diff --git a/Projects/Domains/ArtistDomain/Project.swift b/Projects/Domains/ArtistDomain/Project.swift
new file mode 100644
index 000000000..40e1c0f73
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Project.swift
@@ -0,0 +1,30 @@
+import DependencyPlugin
+import ProjectDescription
+import ProjectDescriptionHelpers
+
+let project = Project.module(
+ name: ModulePaths.Domain.ArtistDomain.rawValue,
+ targets: [
+ .interface(
+ module: .domain(.ArtistDomain),
+ dependencies: [
+ .domain(target: .BaseDomain, type: .interface)
+ ]
+ ),
+ .implements(
+ module: .domain(.ArtistDomain),
+ dependencies: [
+ .domain(target: .BaseDomain),
+ .domain(target: .ArtistDomain, type: .interface)
+ ]
+ ),
+ .testing(
+ module: .domain(.ArtistDomain),
+ dependencies: [.domain(target: .ArtistDomain, type: .interface)]
+ ),
+ .tests(
+ module: .domain(.ArtistDomain),
+ dependencies: [.domain(target: .ArtistDomain)]
+ )
+ ]
+)
diff --git a/Projects/Domains/ArtistDomain/Sources/API/ArtistAPI.swift b/Projects/Domains/ArtistDomain/Sources/API/ArtistAPI.swift
new file mode 100644
index 000000000..7ce3569a1
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Sources/API/ArtistAPI.swift
@@ -0,0 +1,86 @@
+import ArtistDomainInterface
+import BaseDomain
+import ErrorModule
+import Foundation
+import Moya
+
+public enum ArtistAPI {
+ case fetchArtistList
+ case fetchArtistDetail(id: String)
+ case fetchArtistSongList(id: String, sort: ArtistSongSortType, page: Int)
+ case fetchSubscriptionStatus(id: String)
+ case subscriptionArtist(id: String, on: Bool)
+}
+
+extension ArtistAPI: WMAPI {
+ public var domain: WMDomain {
+ return .artist
+ }
+
+ public var urlPath: String {
+ switch self {
+ case .fetchArtistList:
+ return "/list"
+ case let .fetchArtistDetail(id):
+ return "/\(id)"
+ case let .fetchArtistSongList(id, _, _):
+ return "/\(id)/songs"
+ case let .fetchSubscriptionStatus(id):
+ return "/\(id)/subscription"
+ case let .subscriptionArtist(id, _):
+ return "/\(id)/subscription"
+ }
+ }
+
+ public var method: Moya.Method {
+ switch self {
+ case .fetchArtistList,
+ .fetchArtistDetail,
+ .fetchArtistSongList,
+ .fetchSubscriptionStatus:
+ return .get
+ case let .subscriptionArtist(_, on):
+ return on ? .post : .delete
+ }
+ }
+
+ public var task: Moya.Task {
+ switch self {
+ case .fetchArtistList,
+ .fetchArtistDetail,
+ .fetchSubscriptionStatus,
+ .subscriptionArtist:
+ return .requestPlain
+ case let .fetchArtistSongList(_, sort, page):
+ return .requestParameters(
+ parameters: [
+ "type": sort.rawValue,
+ "page": page
+ ],
+ encoding: URLEncoding.queryString
+ )
+ }
+ }
+
+ public var jwtTokenType: JwtTokenType {
+ switch self {
+ case .fetchArtistList, .fetchArtistDetail, .fetchArtistSongList:
+ return .none
+ case .fetchSubscriptionStatus, .subscriptionArtist:
+ return .accessToken
+ }
+ }
+
+ public var errorMap: [Int: WMError] {
+ switch self {
+ default:
+ return [
+ 400: .badRequest,
+ 401: .tokenExpired,
+ 404: .notFound,
+ 429: .tooManyRequest,
+ 500: .internalServerError
+ ]
+ }
+ }
+}
diff --git a/Projects/Domains/ArtistDomain/Sources/DataSource/RemoteArtistDataSourceImpl.swift b/Projects/Domains/ArtistDomain/Sources/DataSource/RemoteArtistDataSourceImpl.swift
new file mode 100644
index 000000000..36c18ffe4
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Sources/DataSource/RemoteArtistDataSourceImpl.swift
@@ -0,0 +1,35 @@
+import ArtistDomainInterface
+import BaseDomain
+import Foundation
+import RxSwift
+
+public final class RemoteArtistDataSourceImpl: BaseRemoteDataSource, RemoteArtistDataSource {
+ public func fetchArtistList() -> Single<[ArtistEntity]> {
+ request(.fetchArtistList)
+ .map([ArtistListResponseDTO].self)
+ .map { $0.map { $0.toDomain() } }
+ }
+
+ public func fetchArtistDetail(id: String) -> Single {
+ request(.fetchArtistDetail(id: id))
+ .map(ArtistDetailResponseDTO.self)
+ .map { $0.toDomain() }
+ }
+
+ public func fetchArtistSongList(id: String, sort: ArtistSongSortType, page: Int) -> Single<[ArtistSongListEntity]> {
+ request(.fetchArtistSongList(id: id, sort: sort, page: page))
+ .map([ArtistSongListResponseDTO].self)
+ .map { $0.map { $0.toDomain() } }
+ }
+
+ public func fetchArtistSubscriptionStatus(id: String) -> Single {
+ request(.fetchSubscriptionStatus(id: id))
+ .map(ArtistSubscriptionStatusResponseDTO.self)
+ .map { $0.toDomain() }
+ }
+
+ public func subscriptionArtist(id: String, on: Bool) -> Completable {
+ request(.subscriptionArtist(id: id, on: on))
+ .asCompletable()
+ }
+}
diff --git a/Projects/Domains/ArtistDomain/Sources/Repository/ArtistRepositoryImpl.swift b/Projects/Domains/ArtistDomain/Sources/Repository/ArtistRepositoryImpl.swift
new file mode 100644
index 000000000..80b82c2ce
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Sources/Repository/ArtistRepositoryImpl.swift
@@ -0,0 +1,32 @@
+import ArtistDomainInterface
+import RxSwift
+
+public final class ArtistRepositoryImpl: ArtistRepository {
+ private let remoteArtistDataSource: any RemoteArtistDataSource
+
+ public init(
+ remoteArtistDataSource: RemoteArtistDataSource
+ ) {
+ self.remoteArtistDataSource = remoteArtistDataSource
+ }
+
+ public func fetchArtistList() -> Single<[ArtistEntity]> {
+ remoteArtistDataSource.fetchArtistList()
+ }
+
+ public func fetchArtistDetail(id: String) -> Single {
+ remoteArtistDataSource.fetchArtistDetail(id: id)
+ }
+
+ public func fetchArtistSongList(id: String, sort: ArtistSongSortType, page: Int) -> Single<[ArtistSongListEntity]> {
+ remoteArtistDataSource.fetchArtistSongList(id: id, sort: sort, page: page)
+ }
+
+ public func fetchArtistSubscriptionStatus(id: String) -> Single {
+ remoteArtistDataSource.fetchArtistSubscriptionStatus(id: id)
+ }
+
+ public func subscriptionArtist(id: String, on: Bool) -> Completable {
+ remoteArtistDataSource.subscriptionArtist(id: id, on: on)
+ }
+}
diff --git a/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistDetailResponseDTO.swift b/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistDetailResponseDTO.swift
new file mode 100644
index 000000000..90d255977
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistDetailResponseDTO.swift
@@ -0,0 +1,89 @@
+import ArtistDomainInterface
+import Foundation
+
+public struct ArtistDetailResponseDTO: Decodable, Equatable {
+ let id: String
+ let name: ArtistDetailResponseDTO.Name
+ let group: ArtistDetailResponseDTO.Group
+ let info: ArtistDetailResponseDTO.Info
+ let imageURL: ArtistDetailResponseDTO.ImageURL
+ let graduated: Bool
+
+ public static func == (lhs: Self, rhs: Self) -> Bool {
+ return lhs.id == rhs.id
+ }
+
+ private enum CodingKeys: String, CodingKey {
+ case id
+ case name
+ case group
+ case info
+ case imageURL = "imageUrl"
+ case graduated
+ }
+}
+
+public extension ArtistDetailResponseDTO {
+ struct Name: Decodable {
+ let krName: String
+ let enName: String
+
+ private enum CodingKeys: String, CodingKey {
+ case krName = "kr"
+ case enName = "en"
+ }
+ }
+
+ struct Group: Decodable {
+ let name: String
+ }
+
+ struct Info: Decodable {
+ let title: ArtistDetailResponseDTO.Info.Title
+ let description: String
+ let color: ArtistDetailResponseDTO.Info.Color
+ let playlist: ArtistDetailResponseDTO.Info.Playlist
+ }
+
+ struct ImageURL: Decodable {
+ let round: String
+ let square: String
+ }
+}
+
+public extension ArtistDetailResponseDTO.Info {
+ struct Title: Decodable {
+ let short: String
+ }
+
+ struct Color: Decodable {
+ let background: [[String]]
+ }
+
+ struct Playlist: Decodable {
+ let latest, popular, oldest: String
+ }
+}
+
+public extension ArtistDetailResponseDTO {
+ func toDomain() -> ArtistEntity {
+ ArtistEntity(
+ id: id,
+ krName: name.krName,
+ enName: name.enName,
+ groupName: group.name,
+ title: info.title.short,
+ description: info.description,
+ personalColor: info.color.background.flatMap { $0 }.first ?? "ffffff",
+ roundImage: imageURL.round,
+ squareImage: imageURL.square,
+ graduated: graduated,
+ playlist: ArtistEntity.Playlist(
+ latest: info.playlist.latest,
+ popular: info.playlist.popular,
+ oldest: info.playlist.oldest
+ ),
+ isHiddenItem: false
+ )
+ }
+}
diff --git a/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistListResponseDTO.swift b/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistListResponseDTO.swift
new file mode 100644
index 000000000..eec4fdb18
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistListResponseDTO.swift
@@ -0,0 +1,89 @@
+import ArtistDomainInterface
+import Foundation
+
+public struct ArtistListResponseDTO: Decodable, Equatable {
+ let id: String
+ let name: ArtistListResponseDTO.Name
+ let group: ArtistListResponseDTO.Group
+ let info: ArtistListResponseDTO.Info
+ let imageURL: ArtistListResponseDTO.ImageURL
+ let graduated: Bool
+
+ public static func == (lhs: Self, rhs: Self) -> Bool {
+ return lhs.id == rhs.id
+ }
+
+ private enum CodingKeys: String, CodingKey {
+ case id
+ case name
+ case group
+ case info
+ case imageURL = "imageUrl"
+ case graduated
+ }
+}
+
+public extension ArtistListResponseDTO {
+ struct Name: Decodable {
+ let krName: String
+ let enName: String
+
+ private enum CodingKeys: String, CodingKey {
+ case krName = "kr"
+ case enName = "en"
+ }
+ }
+
+ struct Group: Decodable {
+ let name: String
+ }
+
+ struct Info: Decodable {
+ let title: ArtistListResponseDTO.Info.Title
+ let description: String
+ let color: ArtistListResponseDTO.Info.Color
+ let playlist: ArtistListResponseDTO.Info.Playlist
+ }
+
+ struct ImageURL: Decodable {
+ let round: String
+ let square: String
+ }
+}
+
+public extension ArtistListResponseDTO.Info {
+ struct Title: Decodable {
+ let short: String
+ }
+
+ struct Color: Decodable {
+ let background: [[String]]
+ }
+
+ struct Playlist: Decodable {
+ let latest, popular, oldest: String
+ }
+}
+
+public extension ArtistListResponseDTO {
+ func toDomain() -> ArtistEntity {
+ ArtistEntity(
+ id: id,
+ krName: name.krName,
+ enName: name.enName,
+ groupName: group.name,
+ title: info.title.short,
+ description: info.description,
+ personalColor: info.color.background.flatMap { $0 }.first ?? "ffffff",
+ roundImage: imageURL.round,
+ squareImage: imageURL.square,
+ graduated: graduated,
+ playlist: ArtistEntity.Playlist(
+ latest: info.playlist.latest,
+ popular: info.playlist.popular,
+ oldest: info.playlist.oldest
+ ),
+ isHiddenItem: false
+ )
+ }
+}
diff --git a/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistSongListResponseDTO.swift b/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistSongListResponseDTO.swift
new file mode 100644
index 000000000..45743b532
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistSongListResponseDTO.swift
@@ -0,0 +1,30 @@
+import ArtistDomainInterface
+import Foundation
+import Utility
+
+public struct ArtistSongListResponseDTO: Decodable, Equatable {
+ let songID, title: String
+ let artists: [String]
+ let date: Int
+
+ public static func == (lhs: Self, rhs: Self) -> Bool {
+ return lhs.songID == rhs.songID
+ }
+
+ enum CodingKeys: String, CodingKey {
+ case songID = "videoId"
+ case title, artists, date
+ }
+}
+
+public extension ArtistSongListResponseDTO {
+ func toDomain() -> ArtistSongListEntity {
+ ArtistSongListEntity(
+ songID: songID,
+ title: title,
+ artist: artists.joined(separator: ", "),
+ date: date.changeDateFormat(origin: "yyMMdd", result: "yyyy.MM.dd"),
+ isSelected: false
+ )
+ }
+}
diff --git a/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistSubscriptionStatusResponseDTO.swift b/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistSubscriptionStatusResponseDTO.swift
new file mode 100644
index 000000000..176936f18
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Sources/ResponseDTO/ArtistSubscriptionStatusResponseDTO.swift
@@ -0,0 +1,20 @@
+import ArtistDomainInterface
+import Foundation
+
+public struct ArtistSubscriptionStatusResponseDTO: Decodable {
+ let status: String
+ let isSubscription: Bool
+
+ private enum CodingKeys: String, CodingKey {
+ case status
+ case isSubscription = "data"
+ }
+}
+
+public extension ArtistSubscriptionStatusResponseDTO {
+ func toDomain() -> ArtistSubscriptionStatusEntity {
+ return ArtistSubscriptionStatusEntity(
+ isSubscription: status == "success" ? isSubscription : false
+ )
+ }
+}
diff --git a/Projects/Domains/ArtistDomain/Sources/UseCase/FetchArtistDetailUseCaseImpl.swift b/Projects/Domains/ArtistDomain/Sources/UseCase/FetchArtistDetailUseCaseImpl.swift
new file mode 100644
index 000000000..52e0dc79b
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Sources/UseCase/FetchArtistDetailUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import ArtistDomainInterface
+import Foundation
+import RxSwift
+
+public struct FetchArtistDetailUseCaseImpl: FetchArtistDetailUseCase {
+ private let artistRepository: any ArtistRepository
+
+ public init(
+ artistRepository: ArtistRepository
+ ) {
+ self.artistRepository = artistRepository
+ }
+
+ public func execute(id: String) -> Single {
+ artistRepository.fetchArtistDetail(id: id)
+ }
+}
diff --git a/Projects/Domains/ArtistDomain/Sources/UseCase/FetchArtistListUseCaseImpl.swift b/Projects/Domains/ArtistDomain/Sources/UseCase/FetchArtistListUseCaseImpl.swift
new file mode 100644
index 000000000..97ec4579c
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Sources/UseCase/FetchArtistListUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import ArtistDomainInterface
+import Foundation
+import RxSwift
+
+public struct FetchArtistListUseCaseImpl: FetchArtistListUseCase {
+ private let artistRepository: any ArtistRepository
+
+ public init(
+ artistRepository: ArtistRepository
+ ) {
+ self.artistRepository = artistRepository
+ }
+
+ public func execute() -> Single<[ArtistEntity]> {
+ artistRepository.fetchArtistList()
+ }
+}
diff --git a/Projects/Domains/ArtistDomain/Sources/UseCase/FetchArtistSongListUseCaseImpl.swift b/Projects/Domains/ArtistDomain/Sources/UseCase/FetchArtistSongListUseCaseImpl.swift
new file mode 100644
index 000000000..4c5b61552
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Sources/UseCase/FetchArtistSongListUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import ArtistDomainInterface
+import Foundation
+import RxSwift
+
+public struct FetchArtistSongListUseCaseImpl: FetchArtistSongListUseCase {
+ private let artistRepository: any ArtistRepository
+
+ public init(
+ artistRepository: ArtistRepository
+ ) {
+ self.artistRepository = artistRepository
+ }
+
+ public func execute(id: String, sort: ArtistSongSortType, page: Int) -> Single<[ArtistSongListEntity]> {
+ artistRepository.fetchArtistSongList(id: id, sort: sort, page: page)
+ }
+}
diff --git a/Projects/Domains/ArtistDomain/Sources/UseCase/FetchSubscriptionStatusUseCaseImpl.swift b/Projects/Domains/ArtistDomain/Sources/UseCase/FetchSubscriptionStatusUseCaseImpl.swift
new file mode 100644
index 000000000..749091453
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Sources/UseCase/FetchSubscriptionStatusUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import ArtistDomainInterface
+import Foundation
+import RxSwift
+
+public struct FetchSubscriptionStatusUseCaseImpl: FetchArtistSubscriptionStatusUseCase {
+ private let artistRepository: any ArtistRepository
+
+ public init(
+ artistRepository: ArtistRepository
+ ) {
+ self.artistRepository = artistRepository
+ }
+
+ public func execute(id: String) -> Single {
+ artistRepository.fetchArtistSubscriptionStatus(id: id)
+ }
+}
diff --git a/Projects/Domains/ArtistDomain/Sources/UseCase/SubscriptionArtistUseCaseImpl.swift b/Projects/Domains/ArtistDomain/Sources/UseCase/SubscriptionArtistUseCaseImpl.swift
new file mode 100644
index 000000000..cfd36afb5
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Sources/UseCase/SubscriptionArtistUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import ArtistDomainInterface
+import Foundation
+import RxSwift
+
+public struct SubscriptionArtistUseCaseImpl: SubscriptionArtistUseCase {
+ private let artistRepository: any ArtistRepository
+
+ public init(
+ artistRepository: ArtistRepository
+ ) {
+ self.artistRepository = artistRepository
+ }
+
+ public func execute(id: String, on: Bool) -> Completable {
+ artistRepository.subscriptionArtist(id: id, on: on)
+ }
+}
diff --git a/Projects/Domains/ArtistDomain/Testing/UseCase/FetchArtistListUseCaseSpy.swift b/Projects/Domains/ArtistDomain/Testing/UseCase/FetchArtistListUseCaseSpy.swift
new file mode 100644
index 000000000..56f15cd9c
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Testing/UseCase/FetchArtistListUseCaseSpy.swift
@@ -0,0 +1,12 @@
+import ArtistDomainInterface
+import Foundation
+import RxSwift
+
+public final class FetchArtistListUseCaseSpy: FetchArtistListUseCase {
+ public private(set) var callCount = 0
+ public var handler: (() -> Single<[ArtistEntity]>) = { .never() }
+ public func execute() -> Single<[ArtistEntity]> {
+ callCount += 1
+ return handler()
+ }
+}
diff --git a/Projects/Domains/ArtistDomain/Tests/ArtistDomainTest.swift b/Projects/Domains/ArtistDomain/Tests/ArtistDomainTest.swift
new file mode 100644
index 000000000..79630002d
--- /dev/null
+++ b/Projects/Domains/ArtistDomain/Tests/ArtistDomainTest.swift
@@ -0,0 +1,11 @@
+import XCTest
+
+final class ArtistDomainTests: XCTestCase {
+ override func setUpWithError() throws {}
+
+ override func tearDownWithError() throws {}
+
+ func testExample() {
+ XCTAssertEqual(1, 1)
+ }
+}
diff --git a/Projects/Domains/AuthDomain/Interface/DataSource/LocalAuthDataSource.swift b/Projects/Domains/AuthDomain/Interface/DataSource/LocalAuthDataSource.swift
new file mode 100644
index 000000000..524736e50
--- /dev/null
+++ b/Projects/Domains/AuthDomain/Interface/DataSource/LocalAuthDataSource.swift
@@ -0,0 +1,6 @@
+import RxSwift
+
+public protocol LocalAuthDataSource {
+ func logout()
+ func checkIsExistAccessToken() -> Bool
+}
diff --git a/Projects/Domains/AuthDomain/Interface/DataSource/RemoteAuthDataSource.swift b/Projects/Domains/AuthDomain/Interface/DataSource/RemoteAuthDataSource.swift
new file mode 100644
index 000000000..966dbf858
--- /dev/null
+++ b/Projects/Domains/AuthDomain/Interface/DataSource/RemoteAuthDataSource.swift
@@ -0,0 +1,8 @@
+import Foundation
+import RxSwift
+
+public protocol RemoteAuthDataSource {
+ func fetchToken(providerType: ProviderType, token: String) -> Single
+ func reGenerateAccessToken() -> Single
+ func logout() -> Completable
+}
diff --git a/Projects/Domains/AuthDomain/Interface/Entity/AuthLoginEntity.swift b/Projects/Domains/AuthDomain/Interface/Entity/AuthLoginEntity.swift
new file mode 100644
index 000000000..c6c5bf12c
--- /dev/null
+++ b/Projects/Domains/AuthDomain/Interface/Entity/AuthLoginEntity.swift
@@ -0,0 +1,11 @@
+import Foundation
+
+public struct AuthLoginEntity: Equatable {
+ public init(
+ token: String
+ ) {
+ self.token = token
+ }
+
+ public let token: String
+}
diff --git a/Projects/Services/DataMappingModule/Sources/Base/ProviderType.swift b/Projects/Domains/AuthDomain/Interface/Enum/ProviderType.swift
similarity index 90%
rename from Projects/Services/DataMappingModule/Sources/Base/ProviderType.swift
rename to Projects/Domains/AuthDomain/Interface/Enum/ProviderType.swift
index b602c5d0a..8b160b8ca 100644
--- a/Projects/Services/DataMappingModule/Sources/Base/ProviderType.swift
+++ b/Projects/Domains/AuthDomain/Interface/Enum/ProviderType.swift
@@ -8,7 +8,7 @@
import Foundation
-public enum ProviderType: String, Codable {
+public enum ProviderType: String {
case naver
case apple
case google
diff --git a/Projects/Domains/AuthDomain/Interface/Repository/AuthRepository.swift b/Projects/Domains/AuthDomain/Interface/Repository/AuthRepository.swift
new file mode 100644
index 000000000..ffa21aa9b
--- /dev/null
+++ b/Projects/Domains/AuthDomain/Interface/Repository/AuthRepository.swift
@@ -0,0 +1,9 @@
+import Foundation
+import RxSwift
+
+public protocol AuthRepository {
+ func fetchToken(providerType: ProviderType, token: String) -> Single
+ func reGenerateAccessToken() -> Single
+ func logout(localOnly: Bool) -> Completable
+ func checkIsExistAccessToken() -> Single
+}
diff --git a/Projects/Domains/AuthDomain/Interface/UseCase/CheckIsExistAccessTokenUseCase.swift b/Projects/Domains/AuthDomain/Interface/UseCase/CheckIsExistAccessTokenUseCase.swift
new file mode 100644
index 000000000..434275268
--- /dev/null
+++ b/Projects/Domains/AuthDomain/Interface/UseCase/CheckIsExistAccessTokenUseCase.swift
@@ -0,0 +1,5 @@
+import RxSwift
+
+public protocol CheckIsExistAccessTokenUseCase {
+ func execute() -> Single
+}
diff --git a/Projects/Domains/AuthDomain/Interface/UseCase/FetchTokenUseCase.swift b/Projects/Domains/AuthDomain/Interface/UseCase/FetchTokenUseCase.swift
new file mode 100644
index 000000000..4a8b6cfa7
--- /dev/null
+++ b/Projects/Domains/AuthDomain/Interface/UseCase/FetchTokenUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol FetchTokenUseCase {
+ func execute(providerType: ProviderType, token: String) -> Single
+}
diff --git a/Projects/Domains/AuthDomain/Interface/UseCase/LogoutUseCase.swift b/Projects/Domains/AuthDomain/Interface/UseCase/LogoutUseCase.swift
new file mode 100644
index 000000000..8c81f1735
--- /dev/null
+++ b/Projects/Domains/AuthDomain/Interface/UseCase/LogoutUseCase.swift
@@ -0,0 +1,5 @@
+import RxSwift
+
+public protocol LogoutUseCase {
+ func execute(localOnly: Bool) -> Completable
+}
diff --git a/Projects/Domains/AuthDomain/Interface/UseCase/ReGenerateAccessTokenUseCase.swift b/Projects/Domains/AuthDomain/Interface/UseCase/ReGenerateAccessTokenUseCase.swift
new file mode 100644
index 000000000..6daa03e4f
--- /dev/null
+++ b/Projects/Domains/AuthDomain/Interface/UseCase/ReGenerateAccessTokenUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol ReGenerateAccessTokenUseCase {
+ func execute() -> Single
+}
diff --git a/Projects/Domains/AuthDomain/Project.swift b/Projects/Domains/AuthDomain/Project.swift
new file mode 100644
index 000000000..6f577e8ca
--- /dev/null
+++ b/Projects/Domains/AuthDomain/Project.swift
@@ -0,0 +1,30 @@
+import DependencyPlugin
+import ProjectDescription
+import ProjectDescriptionHelpers
+
+let project = Project.module(
+ name: ModulePaths.Domain.AuthDomain.rawValue,
+ targets: [
+ .interface(
+ module: .domain(.AuthDomain),
+ dependencies: [
+ .domain(target: .BaseDomain, type: .interface)
+ ]
+ ),
+ .implements(
+ module: .domain(.AuthDomain),
+ dependencies: [
+ .domain(target: .BaseDomain),
+ .domain(target: .AuthDomain, type: .interface)
+ ]
+ ),
+ .testing(
+ module: .domain(.AuthDomain),
+ dependencies: [.domain(target: .AuthDomain, type: .interface)]
+ ),
+ .tests(
+ module: .domain(.AuthDomain),
+ dependencies: [.domain(target: .AuthDomain)]
+ )
+ ]
+)
diff --git a/Projects/Domains/AuthDomain/Sources/API/AuthAPI.swift b/Projects/Domains/AuthDomain/Sources/API/AuthAPI.swift
new file mode 100644
index 000000000..59b425591
--- /dev/null
+++ b/Projects/Domains/AuthDomain/Sources/API/AuthAPI.swift
@@ -0,0 +1,94 @@
+import AuthDomainInterface
+import BaseDomain
+import ErrorModule
+import Foundation
+import Moya
+
+public enum AuthAPI {
+ case fetchToken(providerType: ProviderType, token: String)
+ case reGenerateAccessToken
+ case logout
+}
+
+private struct FetchTokenRequestParameters: Encodable {
+ var provider: String
+ var token: String
+}
+
+extension AuthAPI: WMAPI {
+ public var baseURL: URL {
+ return URL(string: BASE_URL())!
+ }
+
+ public var domain: WMDomain {
+ return .auth
+ }
+
+ public var urlPath: String {
+ switch self {
+ case .fetchToken:
+ return "/app"
+ case .reGenerateAccessToken:
+ return "/token"
+ case .logout:
+ return "/logout"
+ }
+ }
+
+ public var method: Moya.Method {
+ switch self {
+ case .fetchToken:
+ return .post
+ case .reGenerateAccessToken:
+ return .post
+ case .logout:
+ return .post
+ }
+ }
+
+ public var headers: [String: String]? {
+ return ["Content-Type": "application/json"]
+ }
+
+ public var task: Moya.Task {
+ switch self {
+ case let .fetchToken(providerType: providerType, token: id):
+ return .requestJSONEncodable(
+ FetchTokenRequestParameters(
+ provider: providerType.rawValue,
+ token: id
+ )
+ )
+ case .reGenerateAccessToken:
+ return .requestPlain
+
+ case .logout:
+ return .requestPlain
+ }
+ }
+
+ public var jwtTokenType: JwtTokenType {
+ switch self {
+ case .fetchToken:
+ return .none
+ case .reGenerateAccessToken:
+ return .refreshToken
+
+ case .logout:
+ return .refreshToken
+ }
+ }
+
+ public var errorMap: [Int: WMError] {
+ switch self {
+ default:
+ return [
+ 400: .badRequest,
+ 401: .tokenExpired,
+ 404: .notFound,
+ 429: .tooManyRequest,
+ 500: .internalServerError
+ ]
+ }
+ }
+}
diff --git a/Projects/Domains/AuthDomain/Sources/DataSource/LocalAuthDataSourceImpl.swift b/Projects/Domains/AuthDomain/Sources/DataSource/LocalAuthDataSourceImpl.swift
new file mode 100644
index 000000000..fe305a2d6
--- /dev/null
+++ b/Projects/Domains/AuthDomain/Sources/DataSource/LocalAuthDataSourceImpl.swift
@@ -0,0 +1,24 @@
+import AuthDomainInterface
+import KeychainModule
+import RxSwift
+import Utility
+
+public final class LocalAuthDataSourceImpl: LocalAuthDataSource {
+ private let keychain: any Keychain
+
+ public init(keychain: any Keychain) {
+ self.keychain = keychain
+ }
+
+ public func logout() {
+ keychain.delete(type: .accessToken)
+ keychain.delete(type: .refreshToken)
+ keychain.delete(type: .accessExpiresIn)
+ PreferenceManager.clearUserInfo()
+ }
+
+ public func checkIsExistAccessToken() -> Bool {
+ let isEmptyAccessToken = keychain.load(type: .accessToken).isEmpty
+ return !isEmptyAccessToken
+ }
+}
diff --git a/Projects/Domains/AuthDomain/Sources/DataSource/RemoteAuthDataSourceImpl.swift b/Projects/Domains/AuthDomain/Sources/DataSource/RemoteAuthDataSourceImpl.swift
new file mode 100644
index 000000000..fef5f1631
--- /dev/null
+++ b/Projects/Domains/AuthDomain/Sources/DataSource/RemoteAuthDataSourceImpl.swift
@@ -0,0 +1,24 @@
+import AuthDomainInterface
+import BaseDomain
+import BaseDomainInterface
+import Foundation
+import RxSwift
+
+public final class RemoteAuthDataSourceImpl: BaseRemoteDataSource, RemoteAuthDataSource {
+ public func fetchToken(providerType: ProviderType, token: String) -> Single {
+ request(.fetchToken(providerType: providerType, token: token))
+ .map(AuthLoginResponseDTO.self)
+ .map { $0.toDomain() }
+ }
+
+ public func reGenerateAccessToken() -> Single {
+ request(.reGenerateAccessToken)
+ .map(AuthLoginResponseDTO.self)
+ .map { $0.toDomain() }
+ }
+
+ public func logout() -> Completable {
+ request(.logout)
+ .asCompletable()
+ }
+}
diff --git a/Projects/Domains/AuthDomain/Sources/Repository/AuthRepositoryImpl.swift b/Projects/Domains/AuthDomain/Sources/Repository/AuthRepositoryImpl.swift
new file mode 100644
index 000000000..41899953f
--- /dev/null
+++ b/Projects/Domains/AuthDomain/Sources/Repository/AuthRepositoryImpl.swift
@@ -0,0 +1,53 @@
+//
+// ArtistRepositoryImpl.swift
+// DataModule
+//
+// Created by KTH on 2023/02/08.
+// Copyright © 2023 yongbeomkwak. All rights reserved.
+//
+
+import AuthDomainInterface
+import BaseDomainInterface
+import RxSwift
+
+public final class AuthRepositoryImpl: AuthRepository {
+ private let localAuthDataSource: any LocalAuthDataSource
+ private let remoteAuthDataSource: any RemoteAuthDataSource
+
+ public init(
+ localAuthDataSource: any LocalAuthDataSource,
+ remoteAuthDataSource: any RemoteAuthDataSource
+ ) {
+ self.localAuthDataSource = localAuthDataSource
+ self.remoteAuthDataSource = remoteAuthDataSource
+ }
+
+ public func fetchToken(providerType: ProviderType, token: String) -> Single {
+ remoteAuthDataSource.fetchToken(providerType: providerType, token: token)
+ }
+
+ public func reGenerateAccessToken() -> Single {
+ remoteAuthDataSource.reGenerateAccessToken()
+ }
+
+ public func logout(localOnly: Bool) -> Completable {
+ let localLogoutCompletable = Completable.create { [localAuthDataSource] observer in
+ localAuthDataSource.logout()
+ observer(.completed)
+ return Disposables.create()
+ }
+
+ if localOnly {
+ return localLogoutCompletable
+
+ } else {
+ return remoteAuthDataSource.logout()
+ .andThen(localLogoutCompletable)
+ }
+ }
+
+ public func checkIsExistAccessToken() -> Single {
+ let isExistAccessToken = localAuthDataSource.checkIsExistAccessToken()
+ return .just(isExistAccessToken)
+ }
+}
diff --git a/Projects/Domains/AuthDomain/Sources/ResponseDTO/AuthLoginResponseDTO.swift b/Projects/Domains/AuthDomain/Sources/ResponseDTO/AuthLoginResponseDTO.swift
new file mode 100644
index 000000000..1a80dd48d
--- /dev/null
+++ b/Projects/Domains/AuthDomain/Sources/ResponseDTO/AuthLoginResponseDTO.swift
@@ -0,0 +1,22 @@
+import AuthDomainInterface
+import Foundation
+
+public struct AuthLoginResponseDTO: Decodable, Equatable {
+ public let accessToken: String
+ public let expiresIn: TimeInterval
+ public let refreshToken: String?
+
+ public static func == (lhs: Self, rhs: Self) -> Bool {
+ lhs.accessToken == rhs.accessToken
+ && lhs.expiresIn == rhs.expiresIn
+ && lhs.refreshToken == rhs.refreshToken
+ }
+}
+
+public extension AuthLoginResponseDTO {
+ func toDomain() -> AuthLoginEntity {
+ AuthLoginEntity(
+ token: accessToken
+ )
+ }
+}
diff --git a/Projects/Domains/AuthDomain/Sources/UseCase/CheckIsExistAccessTokenUseCaseImpl.swift b/Projects/Domains/AuthDomain/Sources/UseCase/CheckIsExistAccessTokenUseCaseImpl.swift
new file mode 100644
index 000000000..621af9caf
--- /dev/null
+++ b/Projects/Domains/AuthDomain/Sources/UseCase/CheckIsExistAccessTokenUseCaseImpl.swift
@@ -0,0 +1,14 @@
+import AuthDomainInterface
+import RxSwift
+
+public struct CheckIsExistAccessTokenUseCaseImpl: CheckIsExistAccessTokenUseCase {
+ private let authRepository: any AuthRepository
+
+ public init(authRepository: any AuthRepository) {
+ self.authRepository = authRepository
+ }
+
+ public func execute() -> Single {
+ authRepository.checkIsExistAccessToken()
+ }
+}
diff --git a/Projects/Domains/AuthDomain/Sources/UseCase/FetchTokenUseCaseImpl.swift b/Projects/Domains/AuthDomain/Sources/UseCase/FetchTokenUseCaseImpl.swift
new file mode 100644
index 000000000..d322f4add
--- /dev/null
+++ b/Projects/Domains/AuthDomain/Sources/UseCase/FetchTokenUseCaseImpl.swift
@@ -0,0 +1,16 @@
+import AuthDomainInterface
+import Foundation
+import RxSwift
+import Utility
+
+public struct FetchTokenUseCaseImpl: FetchTokenUseCase {
+ private let authRepository: any AuthRepository
+
+ public init(authRepository: any AuthRepository) {
+ self.authRepository = authRepository
+ }
+
+ public func execute(providerType: ProviderType, token: String) -> Single {
+ authRepository.fetchToken(providerType: providerType, token: token)
+ }
+}
diff --git a/Projects/Domains/AuthDomain/Sources/UseCase/LogoutUseCaseImpl.swift b/Projects/Domains/AuthDomain/Sources/UseCase/LogoutUseCaseImpl.swift
new file mode 100644
index 000000000..3b9cc75c5
--- /dev/null
+++ b/Projects/Domains/AuthDomain/Sources/UseCase/LogoutUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import AuthDomainInterface
+import BaseDomainInterface
+import Foundation
+import RxSwift
+import Utility
+
+public struct LogoutUseCaseImpl: LogoutUseCase {
+ private let authRepository: any AuthRepository
+
+ public init(authRepository: any AuthRepository) {
+ self.authRepository = authRepository
+ }
+
+ public func execute(localOnly: Bool) -> Completable {
+ authRepository.logout(localOnly: localOnly)
+ }
+}
diff --git a/Projects/Domains/AuthDomain/Sources/UseCase/ReGenerateAccessTokenUseCaseImpl.swift b/Projects/Domains/AuthDomain/Sources/UseCase/ReGenerateAccessTokenUseCaseImpl.swift
new file mode 100644
index 000000000..38948410c
--- /dev/null
+++ b/Projects/Domains/AuthDomain/Sources/UseCase/ReGenerateAccessTokenUseCaseImpl.swift
@@ -0,0 +1,15 @@
+import AuthDomainInterface
+import Foundation
+import RxSwift
+
+public struct ReGenerateAccessTokenUseCaseImpl: ReGenerateAccessTokenUseCase {
+ private let authRepository: any AuthRepository
+
+ public init(authRepository: any AuthRepository) {
+ self.authRepository = authRepository
+ }
+
+ public func execute() -> Single {
+ authRepository.reGenerateAccessToken()
+ }
+}
diff --git a/Projects/Domains/AuthDomain/Testing/CheckIsExistAccessTokenUseCaseStub.swift b/Projects/Domains/AuthDomain/Testing/CheckIsExistAccessTokenUseCaseStub.swift
new file mode 100644
index 000000000..80bfb1c72
--- /dev/null
+++ b/Projects/Domains/AuthDomain/Testing/CheckIsExistAccessTokenUseCaseStub.swift
@@ -0,0 +1,8 @@
+import AuthDomainInterface
+import RxSwift
+
+public struct CheckIsExistAccessTokenUseCaseStub: CheckIsExistAccessTokenUseCase {
+ public func execute() -> Single {
+ return .just(false)
+ }
+}
diff --git a/Projects/Domains/AuthDomain/Testing/FetchTokenUseCaseSpy.swift b/Projects/Domains/AuthDomain/Testing/FetchTokenUseCaseSpy.swift
new file mode 100644
index 000000000..eb4b8f8a2
--- /dev/null
+++ b/Projects/Domains/AuthDomain/Testing/FetchTokenUseCaseSpy.swift
@@ -0,0 +1,8 @@
+import AuthDomainInterface
+import RxSwift
+
+public struct FetchTokenUseCaseSpy: FetchTokenUseCase {
+ public func execute(providerType: ProviderType, token: String) -> Single {
+ return .just(AuthLoginEntity(token: ""))
+ }
+}
diff --git a/Projects/Domains/AuthDomain/Testing/LogoutUseCaseSpy.swift b/Projects/Domains/AuthDomain/Testing/LogoutUseCaseSpy.swift
new file mode 100644
index 000000000..65fb1056e
--- /dev/null
+++ b/Projects/Domains/AuthDomain/Testing/LogoutUseCaseSpy.swift
@@ -0,0 +1,11 @@
+import AuthDomainInterface
+import RxSwift
+
+public struct LogoutUseCaseSpy: LogoutUseCase {
+ public func execute(localOnly: Bool) -> Completable {
+ Completable.create { observer in
+ observer(.completed)
+ return Disposables.create()
+ }
+ }
+}
diff --git a/Projects/Domains/AuthDomain/Tests/AuthDomainTest.swift b/Projects/Domains/AuthDomain/Tests/AuthDomainTest.swift
new file mode 100644
index 000000000..2e2cca093
--- /dev/null
+++ b/Projects/Domains/AuthDomain/Tests/AuthDomainTest.swift
@@ -0,0 +1,11 @@
+import XCTest
+
+final class AuthDomainTests: XCTestCase {
+ override func setUpWithError() throws {}
+
+ override func tearDownWithError() throws {}
+
+ func testExample() {
+ XCTAssertEqual(1, 1)
+ }
+}
diff --git a/Projects/Domains/BaseDomain/Interface/Entity/BaseEntity.swift b/Projects/Domains/BaseDomain/Interface/Entity/BaseEntity.swift
new file mode 100644
index 000000000..433489ce4
--- /dev/null
+++ b/Projects/Domains/BaseDomain/Interface/Entity/BaseEntity.swift
@@ -0,0 +1,14 @@
+import Foundation
+
+public struct BaseEntity {
+ public init(
+ status: Int,
+ description: String = ""
+ ) {
+ self.status = status
+ self.description = description
+ }
+
+ public let status: Int
+ public var description: String = ""
+}
diff --git a/Projects/Domains/BaseDomain/Interface/Entity/BaseImageEntity.swift b/Projects/Domains/BaseDomain/Interface/Entity/BaseImageEntity.swift
new file mode 100644
index 000000000..c8276c4c9
--- /dev/null
+++ b/Projects/Domains/BaseDomain/Interface/Entity/BaseImageEntity.swift
@@ -0,0 +1,11 @@
+import Foundation
+
+public struct BaseImageEntity {
+ public init(
+ image: String
+ ) {
+ self.image = image
+ }
+
+ public let image: String
+}
diff --git a/Projects/Domains/BaseDomain/Project.swift b/Projects/Domains/BaseDomain/Project.swift
new file mode 100644
index 000000000..83e969785
--- /dev/null
+++ b/Projects/Domains/BaseDomain/Project.swift
@@ -0,0 +1,32 @@
+import DependencyPlugin
+import ProjectDescription
+import ProjectDescriptionHelpers
+
+let project = Project.module(
+ name: ModulePaths.Domain.BaseDomain.rawValue,
+ targets: [
+ .interface(
+ module: .domain(.BaseDomain),
+ dependencies: [
+ .module(target: .ThirdPartyLib),
+ .module(target: .ErrorModule)
+ ]
+ ),
+ .implements(
+ module: .domain(.BaseDomain),
+ dependencies: [
+ .module(target: .Utility),
+ .module(target: .KeychainModule),
+ .domain(target: .BaseDomain, type: .interface)
+ ]
+ ),
+ .testing(
+ module: .domain(.BaseDomain),
+ dependencies: [.domain(target: .BaseDomain, type: .interface)]
+ ),
+ .tests(
+ module: .domain(.BaseDomain),
+ dependencies: [.domain(target: .BaseDomain)]
+ )
+ ]
+)
diff --git a/Projects/Domains/BaseDomain/Sources/BasePlugin/BaseInfoSendable.swift b/Projects/Domains/BaseDomain/Sources/BasePlugin/BaseInfoSendable.swift
new file mode 100644
index 000000000..2129375a7
--- /dev/null
+++ b/Projects/Domains/BaseDomain/Sources/BasePlugin/BaseInfoSendable.swift
@@ -0,0 +1,23 @@
+public enum BaseInfoType: String {
+ case os
+ case appVersion
+ case deviceID
+ case pushToken
+
+ var apiKey: String {
+ switch self {
+ case .os:
+ return "os"
+ case .appVersion:
+ return "version"
+ case .deviceID:
+ return "uniqueDeviceId"
+ case .pushToken:
+ return "token"
+ }
+ }
+}
+
+public protocol BaseInfoSendable {
+ var baseInfoTypes: [BaseInfoType] { get }
+}
diff --git a/Projects/Domains/BaseDomain/Sources/BasePlugin/BasePlugin.swift b/Projects/Domains/BaseDomain/Sources/BasePlugin/BasePlugin.swift
new file mode 100644
index 000000000..a6da000cd
--- /dev/null
+++ b/Projects/Domains/BaseDomain/Sources/BasePlugin/BasePlugin.swift
@@ -0,0 +1,92 @@
+import FirebaseMessaging
+import Foundation
+import KeychainModule
+import LogManager
+import Moya
+import UIKit
+
+public struct BasePlugin: PluginType {
+ private let keychain: any Keychain
+
+ public init(keychain: any Keychain) {
+ self.keychain = keychain
+ }
+
+ public func prepare(
+ _ request: URLRequest,
+ target: TargetType
+ ) -> URLRequest {
+ guard let baseInfoTypes = (target as? BaseInfoSendable)?.baseInfoTypes,
+ baseInfoTypes.isEmpty == false else {
+ return request
+ }
+ var newRequest = request
+
+ if request.httpMethod == "GET" || request.httpMethod == "DELETE" {
+ guard let url = request.url,
+ var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false) else {
+ return request
+ }
+
+ var queryItems: [URLQueryItem] = urlComponents.queryItems ?? []
+
+ for type in baseInfoTypes {
+ let queryItem = URLQueryItem(name: type.apiKey, value: typeToValue(with: type))
+ queryItems.append(queryItem)
+ }
+
+ urlComponents.queryItems = queryItems
+ newRequest.url = urlComponents.url
+
+ } else {
+ var newJson: [String: Any] = [:]
+ if let bodyData = request.httpBody,
+ let json = try? JSONSerialization.jsonObject(with: bodyData, options: []) as? [String: Any] {
+ newJson = json
+ }
+
+ for type in baseInfoTypes {
+ newJson[type.apiKey] = typeToValue(with: type)
+ }
+
+ guard let newBodyData = try? JSONSerialization.data(withJSONObject: newJson, options: []) else {
+ return request
+ }
+ newRequest.httpBody = newBodyData
+ }
+
+ return newRequest
+ }
+}
+
+private extension BasePlugin {
+ func typeToValue(with type: BaseInfoType) -> String {
+ switch type {
+ case .os:
+ return "ios"
+ case .appVersion:
+ return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String ?? ""
+ case .deviceID:
+ return fetchDeviceID()
+ case .pushToken:
+ return fetchPushToken()
+ }
+ }
+
+ func fetchDeviceID() -> String {
+ let deviceIDFromKeychain: String = keychain.load(type: .deviceID)
+ let uuidString: String = UIDevice.current.identifierForVendor?.uuidString ?? ""
+
+ if deviceIDFromKeychain.isEmpty {
+ keychain.save(type: .deviceID, value: uuidString)
+ return uuidString
+
+ } else {
+ return deviceIDFromKeychain
+ }
+ }
+
+ func fetchPushToken() -> String {
+ return Messaging.messaging().fcmToken ?? ""
+ }
+}
diff --git a/Projects/Domains/BaseDomain/Sources/DataSource/BaseRemoteDataSource.swift b/Projects/Domains/BaseDomain/Sources/DataSource/BaseRemoteDataSource.swift
new file mode 100644
index 000000000..ad03cb542
--- /dev/null
+++ b/Projects/Domains/BaseDomain/Sources/DataSource/BaseRemoteDataSource.swift
@@ -0,0 +1,126 @@
+//
+// BaseRemoteDataSource.swift
+// BaseDomain
+//
+// Created by KTH on 2024/03/04.
+// Copyright © 2024 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+import KeychainModule
+import Moya
+import RxMoya
+import RxSwift
+
+open class BaseRemoteDataSource {
+ private let keychain: any Keychain
+ private let provider: MoyaProvider
+ private var refreshProvider: MoyaProvider?
+ private let decoder = JSONDecoder()
+ private let maxRetryCount = 2
+
+ public init(
+ keychain: any Keychain,
+ provider: MoyaProvider? = nil
+ ) {
+ self.keychain = keychain
+
+ #if DEBUG || QA
+ self.provider = provider ?? MoyaProvider(plugins: [
+ JwtPlugin(keychain: keychain),
+ BasePlugin(keychain: keychain),
+ CustomLoggingPlugin()
+ ])
+ #else
+ self.provider = provider ?? MoyaProvider(plugins: [
+ JwtPlugin(keychain: keychain),
+ BasePlugin(keychain: keychain)
+ ])
+ #endif
+ }
+
+ public func request(_ api: API) -> Single {
+ return Single.create { single in
+ var disposabels = [Disposable]()
+ if self.checkIsApiNeedsAuthorization(api) {
+ disposabels.append(
+ self.authorizedRequest(api).subscribe(
+ onSuccess: { single(.success($0)) },
+ onFailure: { single(.failure($0)) }
+ )
+ )
+ } else {
+ disposabels.append(
+ self.defaultRequest(api).subscribe(
+ onSuccess: { single(.success($0)) },
+ onFailure: { single(.failure($0)) }
+ )
+ )
+ }
+ return Disposables.create(disposabels)
+ }
+ }
+}
+
+private extension BaseRemoteDataSource {
+ func defaultRequest(_ api: API) -> Single {
+ return provider.rx.request(api)
+ .timeout(.seconds(10), scheduler: MainScheduler.asyncInstance)
+ .catch { error in
+ guard let errorCode = (error as? MoyaError)?.response?.statusCode else {
+ if let moyaError = (error as? MoyaError), moyaError.errorCode == 6 {
+ return Single.error(api.errorMap[1009] ?? error)
+ }
+ return Single.error(error)
+ }
+ return Single.error(api.errorMap[errorCode] ?? error)
+ }
+ }
+
+ func authorizedRequest(_ api: API) -> Single {
+ guard checkTokenIsExist() else {
+ return defaultRequest(api)
+ }
+
+ guard checkAccessTokenIsValid() else {
+ return reissueToken()
+ .andThen(defaultRequest(api))
+ .retry(maxRetryCount)
+ }
+
+ return defaultRequest(api)
+ }
+
+ func checkIsApiNeedsAuthorization(_ api: API) -> Bool {
+ api.jwtTokenType == .accessToken
+ }
+
+ func checkAccessTokenIsValid() -> Bool {
+ guard let expired = Double(keychain.load(type: .accessExpiresIn)) else { return false }
+ let today = Date()
+ let expiredDate = (expired / 1000.0).unixTimeToDate
+ return today < expiredDate
+ }
+
+ func checkTokenIsExist() -> Bool {
+ !keychain.load(type: .accessToken).isEmpty || !keychain.load(type: .refreshToken).isEmpty
+ }
+
+ func reissueToken() -> Completable {
+ #if DEBUG || QA
+ let provider = refreshProvider ?? MoyaProvider(plugins: [
+ JwtPlugin(keychain: keychain),
+ CustomLoggingPlugin()
+ ])
+ #else
+ let provider = refreshProvider ?? MoyaProvider(plugins: [JwtPlugin(keychain: keychain)])
+ #endif
+
+ if refreshProvider == nil {
+ refreshProvider = provider
+ }
+
+ return provider.rx.request(.refresh)
+ .asCompletable()
+ }
+}
diff --git a/Projects/Domains/BaseDomain/Sources/DataSource/TokenRefreshAPI.swift b/Projects/Domains/BaseDomain/Sources/DataSource/TokenRefreshAPI.swift
new file mode 100644
index 000000000..2493e3e14
--- /dev/null
+++ b/Projects/Domains/BaseDomain/Sources/DataSource/TokenRefreshAPI.swift
@@ -0,0 +1,28 @@
+import ErrorModule
+import Moya
+
+enum TokenRefreshAPI {
+ case refresh
+}
+
+extension TokenRefreshAPI: WMAPI {
+ var domain: WMDomain { .auth }
+
+ var urlPath: String { "/token" }
+
+ var method: Moya.Method { .post }
+
+ var task: Moya.Task { .requestPlain }
+
+ var jwtTokenType: JwtTokenType { .refreshToken }
+
+ var errorMap: [Int: WMError] {
+ [
+ 400: .badRequest,
+ 401: .tokenExpired,
+ 404: .notFound,
+ 429: .tooManyRequest,
+ 500: .internalServerError
+ ]
+ }
+}
diff --git a/Projects/Domains/BaseDomain/Sources/Jwt/JwtAuthorizable.swift b/Projects/Domains/BaseDomain/Sources/Jwt/JwtAuthorizable.swift
new file mode 100644
index 000000000..db1bc38e7
--- /dev/null
+++ b/Projects/Domains/BaseDomain/Sources/Jwt/JwtAuthorizable.swift
@@ -0,0 +1,28 @@
+//
+// JwtAuthorizable.swift
+// BaseDomain
+//
+// Created by KTH on 2024/03/04.
+// Copyright © 2024 yongbeomkwak. All rights reserved.
+//
+
+import Moya
+
+public enum JwtTokenType: String {
+ case accessToken
+ case refreshToken
+ case none
+
+ var headerKey: String {
+ switch self {
+ case .accessToken, .refreshToken:
+ return "Authorization"
+ default:
+ return ""
+ }
+ }
+}
+
+public protocol JwtAuthorizable {
+ var jwtTokenType: JwtTokenType { get }
+}
diff --git a/Projects/Domains/BaseDomain/Sources/Jwt/JwtPlugin.swift b/Projects/Domains/BaseDomain/Sources/Jwt/JwtPlugin.swift
new file mode 100644
index 000000000..b51adf09b
--- /dev/null
+++ b/Projects/Domains/BaseDomain/Sources/Jwt/JwtPlugin.swift
@@ -0,0 +1,85 @@
+//
+// JwtPlugin.swift
+// BaseDomain
+//
+// Created by KTH on 2024/03/04.
+// Copyright © 2024 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+import KeychainModule
+import Moya
+
+public struct JwtPlugin: PluginType {
+ private let keychain: any Keychain
+
+ public init(keychain: any Keychain) {
+ self.keychain = keychain
+ }
+
+ public func prepare(
+ _ request: URLRequest,
+ target: TargetType
+ ) -> URLRequest {
+ guard let jwtTokenType = (target as? JwtAuthorizable)?.jwtTokenType,
+ jwtTokenType != .none,
+ let keychainType = jwtTokenTypeToKeychainType(jwtTokenType: jwtTokenType),
+ let token = getToken(type: keychainType)
+ else { return request }
+ var req = request
+
+ req.addValue(token, forHTTPHeaderField: jwtTokenType.headerKey)
+ return req
+ }
+
+ public func didReceive(
+ _ result: Result,
+ target: TargetType
+ ) {
+ switch result {
+ case let .success(res):
+ if let new = try? res.map(TokenDTO.self) {
+ saveToken(token: new)
+ }
+ default:
+ break
+ }
+ }
+}
+
+private extension JwtPlugin {
+ func jwtTokenTypeToKeychainType(jwtTokenType: JwtTokenType) -> KeychainType? {
+ switch jwtTokenType {
+ case .accessToken:
+ return .accessToken
+ case .refreshToken:
+ return .refreshToken
+ default:
+ return nil
+ }
+ }
+
+ func getToken(type: KeychainType) -> String? {
+ let token = keychain.load(type: type)
+
+ guard !token.isEmpty else { return nil }
+
+ switch type {
+ case .accessToken:
+ return "bearer \(token)"
+
+ case .refreshToken:
+ return "bearer \(token)"
+ default:
+ return ""
+ }
+ }
+
+ func saveToken(token: TokenDTO) {
+ keychain.save(type: .accessToken, value: token.accessToken)
+ if let refreshToken = token.refreshToken {
+ keychain.save(type: .refreshToken, value: refreshToken)
+ }
+ keychain.save(type: .accessExpiresIn, value: "\(token.expiresIn)")
+ }
+}
diff --git a/Projects/Domains/BaseDomain/Sources/Logging/CustomLoggingPlugin.swift b/Projects/Domains/BaseDomain/Sources/Logging/CustomLoggingPlugin.swift
new file mode 100644
index 000000000..dc06aa1b5
--- /dev/null
+++ b/Projects/Domains/BaseDomain/Sources/Logging/CustomLoggingPlugin.swift
@@ -0,0 +1,102 @@
+import Foundation
+import Moya
+import OSLog
+
+#if DEBUG || QA
+ private enum NetworkLogLevel: String {
+ case short
+ case detail
+ }
+
+ public final class CustomLoggingPlugin: PluginType {
+ let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "", category: "NETWORK")
+ private let logLevel: NetworkLogLevel
+
+ public init() {
+ self.logLevel = CustomLoggingPlugin.getLogLevelFromArguments() ?? .detail
+ }
+
+ public func willSend(_ request: RequestType, target: TargetType) {
+ guard let httpRequest = request.request else {
+ print("--> 유효하지 않은 요청")
+ return
+ }
+ let url = httpRequest.description
+ let method = httpRequest.httpMethod ?? "unknown method"
+ var log = "====================\n\n[\(method)] \(url)\n\n====================\n"
+ log.append("API: \(target)\n")
+ if let headers = httpRequest.allHTTPHeaderFields, !headers.isEmpty {
+ log.append("header: \(headers)\n")
+ }
+ if let body = httpRequest.httpBody, let bodyString = String(bytes: body, encoding: String.Encoding.utf8) {
+ log.append("\(bodyString)\n")
+ }
+ log.append("---------------- END \(method) -----------------------\n")
+
+ switch logLevel {
+ case .short:
+ let log = "[🛜 Request] [\(method)] [\(target)] \(url)"
+ logger.log(level: .debug, "\(log)")
+ case .detail:
+ logger.log(level: .debug, "\(log)")
+ }
+ }
+
+ public func didReceive(_ result: Result, target: TargetType) {
+ switch result {
+ case let .success(response):
+ onSuceed(response, target: target, isFromError: false)
+ case let .failure(error):
+ onFail(error, target: target)
+ }
+ }
+
+ func onSuceed(_ response: Response, target: TargetType, isFromError: Bool) {
+ let request = response.request
+ let url = request?.url?.absoluteString ?? "nil"
+ let statusCode = response.statusCode
+ var log = "------------------- 네트워크 통신 성공 -------------------"
+ log.append("\n[\(statusCode)] \(url)\n----------------------------------------------------\n")
+ log.append("API: \(target)\n")
+ response.response?.allHeaderFields.forEach {
+ log.append("\($0): \($1)\n")
+ }
+ if let reString = String(bytes: response.data, encoding: String.Encoding.utf8) {
+ log.append("\(reString)\n")
+ }
+ log.append("------------------- END HTTP (\(response.data.count)-byte body) -------------------\n")
+
+ switch logLevel {
+ case .short:
+ let log = "[🛜 Response] [\(statusCode)] [\(target)] \(url)"
+ logger.log(level: .debug, "\(log)")
+ case .detail:
+ logger.log(level: .debug, "\(log)")
+ }
+ }
+
+ func onFail(_ error: MoyaError, target: TargetType) {
+ if let response = error.response {
+ onSuceed(response, target: target, isFromError: true)
+ return
+ }
+ var log = "네트워크 오류"
+ log.append("<-- \(error.errorCode) \(target)\n")
+ log.append("\(error.failureReason ?? error.errorDescription ?? "unknown error")\n")
+ log.append("<-- END HTTP\n")
+
+ logger.log("\(log)")
+ }
+ }
+
+ extension CustomLoggingPlugin {
+ /// Environment Variables 에서 로그 레벨을 가져오는 메소드
+ /// Scheme의 Environment Variables 에 key : NETWORK_LOG_LEVEL, value : short 또는 detail
+ private static func getLogLevelFromArguments() -> NetworkLogLevel? {
+ guard let logLevelValue = ProcessInfo.processInfo.environment["NETWORK_LOG_LEVEL"] else { return nil }
+ guard let networkLogLevel = NetworkLogLevel(rawValue: logLevelValue) else { return nil }
+ return networkLogLevel
+ }
+ }
+
+#endif
diff --git a/Projects/Domains/BaseDomain/Sources/ResponseDTO/BaseImageResponseDTO.swift b/Projects/Domains/BaseDomain/Sources/ResponseDTO/BaseImageResponseDTO.swift
new file mode 100644
index 000000000..ba4b00fb8
--- /dev/null
+++ b/Projects/Domains/BaseDomain/Sources/ResponseDTO/BaseImageResponseDTO.swift
@@ -0,0 +1,12 @@
+import BaseDomainInterface
+import Foundation
+
+public struct BaseImageResponseDTO: Decodable {
+ private let imageUrl: String
+}
+
+public extension BaseImageResponseDTO {
+ func toDomain() -> BaseImageEntity {
+ return BaseImageEntity(image: imageUrl)
+ }
+}
diff --git a/Projects/Domains/BaseDomain/Sources/ResponseDTO/BaseResponseDTO.swift b/Projects/Domains/BaseDomain/Sources/ResponseDTO/BaseResponseDTO.swift
new file mode 100644
index 000000000..7f0536e1e
--- /dev/null
+++ b/Projects/Domains/BaseDomain/Sources/ResponseDTO/BaseResponseDTO.swift
@@ -0,0 +1,20 @@
+//
+// BaseResponseDTO.swift
+// BaseDomain
+//
+// Created by KTH on 2024/03/04.
+// Copyright © 2024 yongbeomkwak. All rights reserved.
+//
+
+import BaseDomainInterface
+import Foundation
+
+public struct BaseResponseDTO: Codable {
+ public let status: Int
+}
+
+public extension BaseResponseDTO {
+ func toDomain() -> BaseEntity {
+ return BaseEntity(status: status)
+ }
+}
diff --git a/Projects/Domains/BaseDomain/Sources/ResponseDTO/TokenDTO.swift b/Projects/Domains/BaseDomain/Sources/ResponseDTO/TokenDTO.swift
new file mode 100644
index 000000000..e6d503ef5
--- /dev/null
+++ b/Projects/Domains/BaseDomain/Sources/ResponseDTO/TokenDTO.swift
@@ -0,0 +1,53 @@
+//
+// TokenDTO.swift
+// BaseDomain
+//
+// Created by KTH on 2024/03/04.
+// Copyright © 2024 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+
+struct TokenDTO: Equatable, Decodable {
+ let accessToken: String
+ let refreshToken: String?
+ let expiresIn: Int
+
+ enum DefaultCodingKeys: String, CodingKey {
+ case accessToken
+ case refreshToken
+ case expiresIn
+ }
+
+ enum RefreshableCodingKeys: String, CodingKey {
+ case token
+ }
+
+ init(from decoder: Decoder) throws {
+ let container = try decoder.container(keyedBy: DefaultCodingKeys.self)
+ let refreshableContainer = try decoder.container(keyedBy: RefreshableCodingKeys.self)
+
+ let accessToken: String
+ if let token = try? container.decode(String.self, forKey: .accessToken) {
+ accessToken = token
+ } else if let token = try? refreshableContainer.decode(String.self, forKey: .token) {
+ accessToken = token
+ } else {
+ throw Error.cannotDecodeAccessToken
+ }
+ self.accessToken = accessToken
+ self.refreshToken = try container.decodeIfPresent(String.self, forKey: .refreshToken)
+ self.expiresIn = try container.decode(Int.self, forKey: .expiresIn)
+ }
+
+ enum Error: Swift.Error, LocalizedError {
+ case cannotDecodeAccessToken
+
+ var errorDescription: String? {
+ switch self {
+ case .cannotDecodeAccessToken:
+ return "Cannot decode access token in data"
+ }
+ }
+ }
+}
diff --git a/Projects/Domains/BaseDomain/Sources/WMAPI/SecretURL.swift b/Projects/Domains/BaseDomain/Sources/WMAPI/SecretURL.swift
new file mode 100644
index 000000000..9c1c42c18
--- /dev/null
+++ b/Projects/Domains/BaseDomain/Sources/WMAPI/SecretURL.swift
@@ -0,0 +1,90 @@
+//
+// SecretURL.swift
+// BaseDomain
+//
+// Created by KTH on 2024/03/04.
+// Copyright © 2024 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+
+public func config(key: String) -> String {
+ guard let secrets = Bundle.main.object(forInfoDictionaryKey: "Secrets") as? [String: Any] else {
+ return ""
+ }
+ return secrets[key] as? String ?? "not found key"
+}
+
+// MARK: - BASE_URL
+public func BASE_URL() -> String {
+ #if DEBUG || QA
+ return config(key: "BASE_DEV_URL")
+ #else
+ return config(key: "BASE_PROD_URL")
+ #endif
+}
+
+// MARK: - WMDomain
+public func WMDOMAIN_AUTH() -> String {
+ return config(key: "WMDOMAIN_AUTH")
+}
+
+public func WMDOMAIN_CHARTS() -> String {
+ return config(key: "WMDOMAIN_CHARTS")
+}
+
+public func WMDOMAIN_SONGS() -> String {
+ return config(key: "WMDOMAIN_SONGS")
+}
+
+public func WMDOMAIN_ARTIST() -> String {
+ return config(key: "WMDOMAIN_ARTIST")
+}
+
+public func WMDOMAIN_USER() -> String {
+ return config(key: "WMDOMAIN_USER")
+}
+
+public func WMDOMAIN_PLAYLIST() -> String {
+ return config(key: "WMDOMAIN_PLAYLIST")
+}
+
+public func WMDOMAIN_LIKE() -> String {
+ return config(key: "WMDOMAIN_LIKE")
+}
+
+public func WMDOMAIN_FAQ() -> String {
+ return config(key: "WMDOMAIN_FAQ")
+}
+
+public func WMDOMAIN_NOTICE() -> String {
+ return config(key: "WMDOMAIN_NOTICE")
+}
+
+public func WMDOMAIN_APP() -> String {
+ return config(key: "WMDOMAIN_APP")
+}
+
+public func WMDOMAIN_SEARCH() -> String {
+ return config(key: "WMDOMAIN_SEARCH")
+}
+
+public func WMDOMAIN_IMAGE() -> String {
+ return config(key: "WMDOMAIN_IMAGE")
+}
+
+public func WMDOMAIN_NOTIFICATION() -> String {
+ return config(key: "WMDOMAIN_NOTIFICATION")
+}
+
+public func WMDOMAIN_TEAM() -> String {
+ return config(key: "WMDOMAIN_TEAM")
+}
+
+public func WMDOMAIN_PRICE() -> String {
+ return config(key: "WMDOMAIN_PRICE")
+}
+
+public func WMDOMAIN_CREDIT() -> String {
+ return config(key: "WMDOMAIN_CREDIT")
+}
diff --git a/Projects/Domains/BaseDomain/Sources/WMAPI/WMAPI.swift b/Projects/Domains/BaseDomain/Sources/WMAPI/WMAPI.swift
new file mode 100644
index 000000000..12107c237
--- /dev/null
+++ b/Projects/Domains/BaseDomain/Sources/WMAPI/WMAPI.swift
@@ -0,0 +1,108 @@
+//
+// WMAPI.swift
+// BaseDomain
+//
+// Created by KTH on 2024/03/04.
+// Copyright © 2024 yongbeomkwak. All rights reserved.
+//
+
+import ErrorModule
+import Foundation
+import KeychainModule
+import Moya
+import Utility
+
+public protocol WMAPI: TargetType, JwtAuthorizable, BaseInfoSendable {
+ var domain: WMDomain { get }
+ var urlPath: String { get }
+ var errorMap: [Int: WMError] { get }
+}
+
+public extension WMAPI {
+ var baseURL: URL {
+ URL(string: BASE_URL())!
+ }
+
+ var path: String {
+ domain.asURLString + urlPath
+ }
+
+ var headers: [String: String]? {
+ ["Content-Type": "application/json"]
+ }
+
+ var validationType: ValidationType {
+ return .successCodes
+ }
+
+ var baseInfoTypes: [BaseInfoType] {
+ return []
+ }
+}
+
+public enum WMDomain: String {
+ case auth
+ case charts
+ case songs
+ case artist
+ case user
+ case playlist
+ case like
+ case naver
+ case faq
+ case notice
+ case app
+ case search
+ case image
+ case notification
+ case team
+ case price
+ case credit
+}
+
+extension WMDomain {
+ var asURLString: String {
+ return "/\(self.asDomainString)"
+ }
+}
+
+extension WMDomain {
+ var asDomainString: String {
+ switch self {
+ case .auth:
+ return WMDOMAIN_AUTH()
+ case .charts:
+ return WMDOMAIN_CHARTS()
+ case .songs:
+ return WMDOMAIN_SONGS()
+ case .artist:
+ return WMDOMAIN_ARTIST()
+ case .user:
+ return WMDOMAIN_USER()
+ case .playlist:
+ return WMDOMAIN_PLAYLIST()
+ case .like:
+ return WMDOMAIN_LIKE()
+ case .naver:
+ return "/v1/nid/me"
+ case .faq:
+ return WMDOMAIN_FAQ()
+ case .notice:
+ return WMDOMAIN_NOTICE()
+ case .app:
+ return WMDOMAIN_APP()
+ case .search:
+ return WMDOMAIN_SEARCH()
+ case .image:
+ return WMDOMAIN_IMAGE()
+ case .notification:
+ return WMDOMAIN_NOTIFICATION()
+ case .team:
+ return WMDOMAIN_TEAM()
+ case .price:
+ return WMDOMAIN_PRICE()
+ case .credit:
+ return WMDOMAIN_CREDIT()
+ }
+ }
+}
diff --git a/Projects/Domains/BaseDomain/Testing/testing.swift b/Projects/Domains/BaseDomain/Testing/testing.swift
new file mode 100644
index 000000000..dae5e363f
--- /dev/null
+++ b/Projects/Domains/BaseDomain/Testing/testing.swift
@@ -0,0 +1 @@
+// for tuist
diff --git a/Projects/Domains/BaseDomain/Tests/Test.swift b/Projects/Domains/BaseDomain/Tests/Test.swift
new file mode 100644
index 000000000..1935b174a
--- /dev/null
+++ b/Projects/Domains/BaseDomain/Tests/Test.swift
@@ -0,0 +1,9 @@
+//
+// t.swift
+// BaseDomain
+//
+// Created by KTH on 2024/03/04.
+// Copyright © 2024 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
diff --git a/Projects/Domains/ChartDomain/Interface/DataSource/RemoteChartDataSource.swift b/Projects/Domains/ChartDomain/Interface/DataSource/RemoteChartDataSource.swift
new file mode 100644
index 000000000..521e1feff
--- /dev/null
+++ b/Projects/Domains/ChartDomain/Interface/DataSource/RemoteChartDataSource.swift
@@ -0,0 +1,7 @@
+import Foundation
+import RxSwift
+
+public protocol RemoteChartDataSource {
+ func fetchChartRanking(type: ChartDateType) -> Single
+ func fetchCurrentVideoUseCase() -> Single
+}
diff --git a/Projects/Domains/ChartDomain/Interface/Entity/ChartEntity.swift b/Projects/Domains/ChartDomain/Interface/Entity/ChartEntity.swift
new file mode 100644
index 000000000..2c1fe311c
--- /dev/null
+++ b/Projects/Domains/ChartDomain/Interface/Entity/ChartEntity.swift
@@ -0,0 +1,22 @@
+//
+// ChartEntity.swift
+// ChartDomainInterface
+//
+// Created by KTH on 5/16/24.
+// Copyright © 2024 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+
+public struct ChartEntity {
+ public init(
+ updatedAt: String,
+ songs: [ChartRankingEntity]
+ ) {
+ self.updatedAt = updatedAt
+ self.songs = songs
+ }
+
+ public let updatedAt: String
+ public let songs: [ChartRankingEntity]
+}
diff --git a/Projects/Domains/ChartDomain/Interface/Entity/ChartRankingEntity.swift b/Projects/Domains/ChartDomain/Interface/Entity/ChartRankingEntity.swift
new file mode 100644
index 000000000..2644f2ef4
--- /dev/null
+++ b/Projects/Domains/ChartDomain/Interface/Entity/ChartRankingEntity.swift
@@ -0,0 +1,32 @@
+import Foundation
+
+public struct ChartRankingEntity: Equatable {
+ public init(
+ id: String,
+ title: String,
+ artist: String,
+ views: Int,
+ last: Int,
+ increase: Int,
+ date: String,
+ isSelected: Bool = false
+ ) {
+ self.id = id
+ self.title = title
+ self.artist = artist
+ self.views = views
+ self.last = last
+ self.increase = increase
+ self.date = date
+ self.isSelected = isSelected
+ }
+
+ public let id, title, artist: String
+ public let views, last, increase: Int
+ public let date: String
+ public var isSelected: Bool
+
+ public static func == (lhs: ChartRankingEntity, rhs: ChartRankingEntity) -> Bool {
+ lhs.id == rhs.id
+ }
+}
diff --git a/Projects/Domains/ChartDomain/Interface/Entity/CurrentVideoEntity.swift b/Projects/Domains/ChartDomain/Interface/Entity/CurrentVideoEntity.swift
new file mode 100644
index 000000000..26c35b0e9
--- /dev/null
+++ b/Projects/Domains/ChartDomain/Interface/Entity/CurrentVideoEntity.swift
@@ -0,0 +1,9 @@
+import Foundation
+
+public struct CurrentVideoEntity: Hashable {
+ public let id: String
+
+ public init(id: String) {
+ self.id = id
+ }
+}
diff --git a/Projects/Services/DataMappingModule/Sources/Base/ChartDateType.swift b/Projects/Domains/ChartDomain/Interface/Enum/ChartDateType.swift
similarity index 90%
rename from Projects/Services/DataMappingModule/Sources/Base/ChartDateType.swift
rename to Projects/Domains/ChartDomain/Interface/Enum/ChartDateType.swift
index 0eac60749..3cbadd120 100644
--- a/Projects/Services/DataMappingModule/Sources/Base/ChartDateType.swift
+++ b/Projects/Domains/ChartDomain/Interface/Enum/ChartDateType.swift
@@ -1,22 +1,22 @@
import Foundation
-public enum ChartDateType: String, Codable {
- case monthly
- case weekly
- case daily
+public enum ChartDateType: String {
case hourly
+ case daily
+ case weekly
+ case monthly
case total
public var display: String {
switch self {
- case .monthly:
- return "월간순"
- case .weekly:
- return "주간순"
- case .daily:
- return "일간순"
case .hourly:
return "시간순"
+ case .daily:
+ return "일간순"
+ case .weekly:
+ return "주간순"
+ case .monthly:
+ return "월간순"
case .total:
return "누적순"
}
diff --git a/Projects/Domains/ChartDomain/Interface/Repository/ChartRepository.swift b/Projects/Domains/ChartDomain/Interface/Repository/ChartRepository.swift
new file mode 100644
index 000000000..bef1aa8c6
--- /dev/null
+++ b/Projects/Domains/ChartDomain/Interface/Repository/ChartRepository.swift
@@ -0,0 +1,7 @@
+import Foundation
+import RxSwift
+
+public protocol ChartRepository {
+ func fetchChartRanking(type: ChartDateType) -> Single
+ func fetchCurrentVideoUseCase() -> Single
+}
diff --git a/Projects/Domains/ChartDomain/Interface/UseCase/FetchChartRankingUseCase.swift b/Projects/Domains/ChartDomain/Interface/UseCase/FetchChartRankingUseCase.swift
new file mode 100644
index 000000000..3093ee0d1
--- /dev/null
+++ b/Projects/Domains/ChartDomain/Interface/UseCase/FetchChartRankingUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol FetchChartRankingUseCase {
+ func execute(type: ChartDateType) -> Single
+}
diff --git a/Projects/Domains/ChartDomain/Interface/UseCase/FetchCurrentVideoUseCase.swift b/Projects/Domains/ChartDomain/Interface/UseCase/FetchCurrentVideoUseCase.swift
new file mode 100644
index 000000000..f04360eb6
--- /dev/null
+++ b/Projects/Domains/ChartDomain/Interface/UseCase/FetchCurrentVideoUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol FetchCurrentVideoUseCase {
+ func execute() -> Single
+}
diff --git a/Projects/Domains/ChartDomain/Project.swift b/Projects/Domains/ChartDomain/Project.swift
new file mode 100644
index 000000000..f0bbee73c
--- /dev/null
+++ b/Projects/Domains/ChartDomain/Project.swift
@@ -0,0 +1,26 @@
+import DependencyPlugin
+import ProjectDescription
+import ProjectDescriptionHelpers
+
+let project = Project.module(
+ name: ModulePaths.Domain.ChartDomain.rawValue,
+ targets: [
+ .interface(
+ module: .domain(.ChartDomain),
+ dependencies: [
+ .domain(target: .BaseDomain, type: .interface)
+ ]
+ ),
+ .implements(
+ module: .domain(.ChartDomain),
+ dependencies: [
+ .domain(target: .BaseDomain),
+ .domain(target: .ChartDomain, type: .interface)
+ ]
+ ),
+ .tests(
+ module: .domain(.ChartDomain),
+ dependencies: [.domain(target: .ChartDomain)]
+ )
+ ]
+)
diff --git a/Projects/Domains/ChartDomain/Sources/API/ChartAPI.swift b/Projects/Domains/ChartDomain/Sources/API/ChartAPI.swift
new file mode 100644
index 000000000..20a8e8201
--- /dev/null
+++ b/Projects/Domains/ChartDomain/Sources/API/ChartAPI.swift
@@ -0,0 +1,54 @@
+import BaseDomain
+import ChartDomainInterface
+import ErrorModule
+import Foundation
+import Moya
+
+public enum ChartAPI {
+ case fetchChartRanking(type: ChartDateType)
+ case fetchCurrentVideo
+}
+
+extension ChartAPI: WMAPI {
+ public var domain: WMDomain {
+ .charts
+ }
+
+ public var urlPath: String {
+ switch self {
+ case let .fetchChartRanking(type):
+ return "/\(type.rawValue)"
+
+ case .fetchCurrentVideo:
+ return "/current-video"
+ }
+ }
+
+ public var method: Moya.Method {
+ return .get
+ }
+
+ public var task: Moya.Task {
+ switch self {
+ case .fetchChartRanking, .fetchCurrentVideo:
+ return .requestPlain
+ }
+ }
+
+ public var jwtTokenType: JwtTokenType {
+ return .none
+ }
+
+ public var errorMap: [Int: WMError] {
+ switch self {
+ default:
+ return [
+ 400: .badRequest,
+ 401: .tokenExpired,
+ 404: .notFound,
+ 429: .tooManyRequest,
+ 500: .internalServerError
+ ]
+ }
+ }
+}
diff --git a/Projects/Domains/ChartDomain/Sources/DataSource/RemoteChartDataSourceImpl.swift b/Projects/Domains/ChartDomain/Sources/DataSource/RemoteChartDataSourceImpl.swift
new file mode 100644
index 000000000..e3047990f
--- /dev/null
+++ b/Projects/Domains/ChartDomain/Sources/DataSource/RemoteChartDataSourceImpl.swift
@@ -0,0 +1,18 @@
+import BaseDomain
+import ChartDomainInterface
+import Foundation
+import RxSwift
+
+public final class RemoteChartDataSourceImpl: BaseRemoteDataSource, RemoteChartDataSource {
+ public func fetchChartRanking(type: ChartDateType) -> Single {
+ request(.fetchChartRanking(type: type))
+ .map(SingleChartRankingResponseDTO.self)
+ .map { $0.toDomain(type: type) }
+ }
+
+ public func fetchCurrentVideoUseCase() -> Single {
+ request(.fetchCurrentVideo)
+ .map(CurrentVideoDTO.self)
+ .map { $0.toDomain() }
+ }
+}
diff --git a/Projects/Domains/ChartDomain/Sources/Repository/ChartRepositoryImpl.swift b/Projects/Domains/ChartDomain/Sources/Repository/ChartRepositoryImpl.swift
new file mode 100644
index 000000000..dabb2de3f
--- /dev/null
+++ b/Projects/Domains/ChartDomain/Sources/Repository/ChartRepositoryImpl.swift
@@ -0,0 +1,21 @@
+import ChartDomainInterface
+import Foundation
+import RxSwift
+
+public final class ChartRepositoryImpl: ChartRepository {
+ private let remoteChartDataSource: any RemoteChartDataSource
+
+ public init(
+ remoteChartDataSource: RemoteChartDataSource
+ ) {
+ self.remoteChartDataSource = remoteChartDataSource
+ }
+
+ public func fetchChartRanking(type: ChartDateType) -> Single {
+ remoteChartDataSource.fetchChartRanking(type: type)
+ }
+
+ public func fetchCurrentVideoUseCase() -> Single {
+ remoteChartDataSource.fetchCurrentVideoUseCase()
+ }
+}
diff --git a/Projects/Domains/ChartDomain/Sources/ResponseDTO/CurrentVideoDTO.swift b/Projects/Domains/ChartDomain/Sources/ResponseDTO/CurrentVideoDTO.swift
new file mode 100644
index 000000000..1383932aa
--- /dev/null
+++ b/Projects/Domains/ChartDomain/Sources/ResponseDTO/CurrentVideoDTO.swift
@@ -0,0 +1,12 @@
+import ChartDomainInterface
+import Foundation
+
+struct CurrentVideoDTO: Decodable {
+ let data: String
+}
+
+extension CurrentVideoDTO {
+ func toDomain() -> CurrentVideoEntity {
+ return CurrentVideoEntity(id: data)
+ }
+}
diff --git a/Projects/Domains/ChartDomain/Sources/ResponseDTO/FetchChartRankingResponseDTO.swift b/Projects/Domains/ChartDomain/Sources/ResponseDTO/FetchChartRankingResponseDTO.swift
new file mode 100644
index 000000000..5b8cc3795
--- /dev/null
+++ b/Projects/Domains/ChartDomain/Sources/ResponseDTO/FetchChartRankingResponseDTO.swift
@@ -0,0 +1,47 @@
+import ChartDomainInterface
+import Foundation
+import Utility
+
+public struct SingleChartRankingResponseDTO: Decodable {
+ let updatedAt: Double
+ let songs: [SingleChartRankingResponseDTO.Songs]
+}
+
+public extension SingleChartRankingResponseDTO {
+ struct Songs: Decodable, Equatable {
+ let songID, title: String
+ let artists: [String]
+ let increase, views, date: Int
+ let last: Int?
+
+ public static func == (lhs: Self, rhs: Self) -> Bool {
+ return lhs.songID == rhs.songID
+ }
+
+ enum CodingKeys: String, CodingKey {
+ case songID = "videoId"
+ case title, artists, views, date
+ case last = "previousOrder"
+ case increase = "viewsIncrement"
+ }
+ }
+}
+
+public extension SingleChartRankingResponseDTO {
+ func toDomain(type: ChartDateType) -> ChartEntity {
+ return ChartEntity(
+ updatedAt: Date(timeIntervalSince1970: updatedAt / 1000).changeDateFormatForChart() + " 업데이트",
+ songs: songs.map {
+ return ChartRankingEntity(
+ id: $0.songID,
+ title: $0.title,
+ artist: $0.artists.joined(separator: ", "),
+ views: $0.views,
+ last: $0.last ?? 0,
+ increase: $0.increase,
+ date: $0.date.changeDateFormat(origin: "yyMMdd", result: "yyyy.MM.dd")
+ )
+ }
+ )
+ }
+}
diff --git a/Projects/Domains/ChartDomain/Sources/UseCase/FetchChartRankingUseCaseImpl.swift b/Projects/Domains/ChartDomain/Sources/UseCase/FetchChartRankingUseCaseImpl.swift
new file mode 100644
index 000000000..f3c0be936
--- /dev/null
+++ b/Projects/Domains/ChartDomain/Sources/UseCase/FetchChartRankingUseCaseImpl.swift
@@ -0,0 +1,16 @@
+import ChartDomainInterface
+import RxSwift
+
+public struct FetchChartRankingUseCaseImpl: FetchChartRankingUseCase {
+ private let chartRepository: any ChartRepository
+
+ public init(
+ chartRepository: ChartRepository
+ ) {
+ self.chartRepository = chartRepository
+ }
+
+ public func execute(type: ChartDateType) -> Single {
+ chartRepository.fetchChartRanking(type: type)
+ }
+}
diff --git a/Projects/Domains/ChartDomain/Sources/UseCase/FetchCurrentVideoUseCaseImpl.swift b/Projects/Domains/ChartDomain/Sources/UseCase/FetchCurrentVideoUseCaseImpl.swift
new file mode 100644
index 000000000..97bb72173
--- /dev/null
+++ b/Projects/Domains/ChartDomain/Sources/UseCase/FetchCurrentVideoUseCaseImpl.swift
@@ -0,0 +1,16 @@
+import ChartDomainInterface
+import RxSwift
+
+public struct FetchCurrentVideoUseCaseImpl: FetchCurrentVideoUseCase {
+ private let chartRepository: any ChartRepository
+
+ public init(
+ chartRepository: ChartRepository
+ ) {
+ self.chartRepository = chartRepository
+ }
+
+ public func execute() -> Single {
+ chartRepository.fetchCurrentVideoUseCase()
+ }
+}
diff --git a/Projects/Domains/ChartDomain/Tests/ChartDomainTest.swift b/Projects/Domains/ChartDomain/Tests/ChartDomainTest.swift
new file mode 100644
index 000000000..270bcf1c6
--- /dev/null
+++ b/Projects/Domains/ChartDomain/Tests/ChartDomainTest.swift
@@ -0,0 +1,11 @@
+import XCTest
+
+final class ChartDomainTests: XCTestCase {
+ override func setUpWithError() throws {}
+
+ override func tearDownWithError() throws {}
+
+ func testExample() {
+ XCTAssertEqual(1, 1)
+ }
+}
diff --git a/Projects/Domains/CreditDomain/Interface/CreditSongOrderType.swift b/Projects/Domains/CreditDomain/Interface/CreditSongOrderType.swift
new file mode 100644
index 000000000..7b6cd99e2
--- /dev/null
+++ b/Projects/Domains/CreditDomain/Interface/CreditSongOrderType.swift
@@ -0,0 +1,5 @@
+public enum CreditSongOrderType: String {
+ case latest
+ case popular
+ case oldest
+}
diff --git a/Projects/Domains/CreditDomain/Interface/DataSource/RemoteCreditDataSource.swift b/Projects/Domains/CreditDomain/Interface/DataSource/RemoteCreditDataSource.swift
new file mode 100644
index 000000000..fe8e6f884
--- /dev/null
+++ b/Projects/Domains/CreditDomain/Interface/DataSource/RemoteCreditDataSource.swift
@@ -0,0 +1,14 @@
+import Foundation
+import RxSwift
+import SongsDomainInterface
+
+public protocol RemoteCreditDataSource {
+ func fetchCreditSongList(
+ name: String,
+ order: CreditSongOrderType,
+ page: Int,
+ limit: Int
+ ) -> Single<[SongEntity]>
+
+ func fetchCreditProfile(name: String) -> Single
+}
diff --git a/Projects/Domains/CreditDomain/Interface/Entity/CreditProfileEntity.swift b/Projects/Domains/CreditDomain/Interface/Entity/CreditProfileEntity.swift
new file mode 100644
index 000000000..7bfe31835
--- /dev/null
+++ b/Projects/Domains/CreditDomain/Interface/Entity/CreditProfileEntity.swift
@@ -0,0 +1,11 @@
+import Foundation
+
+public struct CreditProfileEntity {
+ public init(name: String, imageURL: String?) {
+ self.name = name
+ self.imageURL = imageURL
+ }
+
+ public let name: String
+ public let imageURL: String?
+}
diff --git a/Projects/Domains/CreditDomain/Interface/Repository/CreditRepository.swift b/Projects/Domains/CreditDomain/Interface/Repository/CreditRepository.swift
new file mode 100644
index 000000000..ef3035664
--- /dev/null
+++ b/Projects/Domains/CreditDomain/Interface/Repository/CreditRepository.swift
@@ -0,0 +1,14 @@
+import Foundation
+import RxSwift
+import SongsDomainInterface
+
+public protocol CreditRepository {
+ func fetchCreditSongList(
+ name: String,
+ order: CreditSongOrderType,
+ page: Int,
+ limit: Int
+ ) -> Single<[SongEntity]>
+
+ func fetchCreditProfile(name: String) -> Single
+}
diff --git a/Projects/Domains/CreditDomain/Interface/UseCase/FetchCreditProfileUseCase.swift b/Projects/Domains/CreditDomain/Interface/UseCase/FetchCreditProfileUseCase.swift
new file mode 100644
index 000000000..5bec1b3b7
--- /dev/null
+++ b/Projects/Domains/CreditDomain/Interface/UseCase/FetchCreditProfileUseCase.swift
@@ -0,0 +1,5 @@
+import RxSwift
+
+public protocol FetchCreditProfileUseCase {
+ func execute(name: String) -> Single
+}
diff --git a/Projects/Domains/CreditDomain/Interface/UseCase/FetchCreditSongListUseCase.swift b/Projects/Domains/CreditDomain/Interface/UseCase/FetchCreditSongListUseCase.swift
new file mode 100644
index 000000000..3da792edd
--- /dev/null
+++ b/Projects/Domains/CreditDomain/Interface/UseCase/FetchCreditSongListUseCase.swift
@@ -0,0 +1,22 @@
+import Foundation
+import RxSwift
+import SongsDomainInterface
+
+public protocol FetchCreditSongListUseCase {
+ func execute(
+ name: String,
+ order: CreditSongOrderType,
+ page: Int,
+ limit: Int
+ ) -> Single<[SongEntity]>
+}
+
+public extension FetchCreditSongListUseCase {
+ func execute(
+ name: String,
+ order: CreditSongOrderType,
+ page: Int
+ ) -> Single<[SongEntity]> {
+ self.execute(name: name, order: order, page: page, limit: 50)
+ }
+}
diff --git a/Projects/Domains/CreditDomain/Project.swift b/Projects/Domains/CreditDomain/Project.swift
new file mode 100644
index 000000000..392e3042e
--- /dev/null
+++ b/Projects/Domains/CreditDomain/Project.swift
@@ -0,0 +1,23 @@
+import DependencyPlugin
+import ProjectDescription
+import ProjectDescriptionHelpers
+
+let project = Project.module(
+ name: ModulePaths.Domain.CreditDomain.rawValue,
+ targets: [
+ .interface(module: .domain(.CreditDomain), dependencies: [
+ .domain(target: .BaseDomain, type: .interface),
+ .domain(target: .SongsDomain, type: .interface)
+ ]),
+ .implements(module: .domain(.CreditDomain), dependencies: [
+ .domain(target: .BaseDomain),
+ .domain(target: .CreditDomain, type: .interface)
+ ]),
+ .testing(module: .domain(.CreditDomain), dependencies: [
+ .domain(target: .CreditDomain, type: .interface)
+ ]),
+ .tests(module: .domain(.CreditDomain), dependencies: [
+ .domain(target: .CreditDomain)
+ ])
+ ]
+)
diff --git a/Projects/Domains/CreditDomain/Sources/API/CreditAPI.swift b/Projects/Domains/CreditDomain/Sources/API/CreditAPI.swift
new file mode 100644
index 000000000..edecaba2b
--- /dev/null
+++ b/Projects/Domains/CreditDomain/Sources/API/CreditAPI.swift
@@ -0,0 +1,72 @@
+import BaseDomain
+import CreditDomainInterface
+import ErrorModule
+import Foundation
+import KeychainModule
+import Moya
+
+public enum CreditAPI {
+ case fetchCreditSongList(
+ name: String,
+ order: CreditSongOrderType,
+ page: Int,
+ limit: Int
+ )
+ case fetchProfile(name: String)
+}
+
+extension CreditAPI: WMAPI {
+ public var domain: WMDomain {
+ .credit
+ }
+
+ public var urlPath: String {
+ switch self {
+ case let .fetchCreditSongList(name, _, _, _):
+ return "/\(name)/songs"
+ case let .fetchProfile(name):
+ return "/\(name)"
+ }
+ }
+
+ public var method: Moya.Method {
+ switch self {
+ case .fetchCreditSongList, .fetchProfile:
+ return .get
+ }
+ }
+
+ public var task: Moya.Task {
+ switch self {
+ case let .fetchCreditSongList(name, order, page, limit):
+ return .requestParameters(parameters: [
+ "order": order.rawValue,
+ "page": page,
+ "limit": limit
+ ], encoding: URLEncoding.queryString)
+
+ case .fetchProfile:
+ return .requestPlain
+ }
+ }
+
+ public var jwtTokenType: JwtTokenType {
+ switch self {
+ case .fetchCreditSongList, .fetchProfile:
+ return .none
+ }
+ }
+
+ public var errorMap: [Int: WMError] {
+ switch self {
+ default:
+ return [
+ 400: .badRequest,
+ 401: .tokenExpired,
+ 404: .notFound,
+ 429: .tooManyRequest,
+ 500: .internalServerError
+ ]
+ }
+ }
+}
diff --git a/Projects/Domains/CreditDomain/Sources/DataSource/RemoteCreditDataSourceImpl.swift b/Projects/Domains/CreditDomain/Sources/DataSource/RemoteCreditDataSourceImpl.swift
new file mode 100644
index 000000000..dbc298a38
--- /dev/null
+++ b/Projects/Domains/CreditDomain/Sources/DataSource/RemoteCreditDataSourceImpl.swift
@@ -0,0 +1,24 @@
+import BaseDomain
+import CreditDomainInterface
+import Foundation
+import RxSwift
+import SongsDomainInterface
+
+public final class RemoteCreditDataSourceImpl: BaseRemoteDataSource, RemoteCreditDataSource {
+ public func fetchCreditSongList(
+ name: String,
+ order: CreditSongOrderType,
+ page: Int,
+ limit: Int
+ ) -> Single<[SongEntity]> {
+ request(.fetchCreditSongList(name: name, order: order, page: page, limit: limit))
+ .map([FetchCreditSongListResponseDTO].self)
+ .map { $0.toDomain() }
+ }
+
+ public func fetchCreditProfile(name: String) -> Single {
+ request(.fetchProfile(name: name))
+ .map(FetchCreditProfileResponseDTO.self)
+ .map { $0.toDomain() }
+ }
+}
diff --git a/Projects/Domains/CreditDomain/Sources/Repository/CreditRepositoryImpl.swift b/Projects/Domains/CreditDomain/Sources/Repository/CreditRepositoryImpl.swift
new file mode 100644
index 000000000..624c1c7fe
--- /dev/null
+++ b/Projects/Domains/CreditDomain/Sources/Repository/CreditRepositoryImpl.swift
@@ -0,0 +1,27 @@
+import CreditDomainInterface
+import ErrorModule
+import RxSwift
+import SongsDomainInterface
+
+public final class CreditRepositoryImpl: CreditRepository {
+ private let remoteCreditDataSource: any RemoteCreditDataSource
+
+ public init(
+ remoteCreditDataSource: any RemoteCreditDataSource
+ ) {
+ self.remoteCreditDataSource = remoteCreditDataSource
+ }
+
+ public func fetchCreditSongList(
+ name: String,
+ order: CreditSongOrderType,
+ page: Int,
+ limit: Int
+ ) -> Single<[SongEntity]> {
+ remoteCreditDataSource.fetchCreditSongList(name: name, order: order, page: page, limit: limit)
+ }
+
+ public func fetchCreditProfile(name: String) -> Single {
+ remoteCreditDataSource.fetchCreditProfile(name: name)
+ }
+}
diff --git a/Projects/Domains/CreditDomain/Sources/ResponseDTO/FetchCreditProfileResponseDTO.swift b/Projects/Domains/CreditDomain/Sources/ResponseDTO/FetchCreditProfileResponseDTO.swift
new file mode 100644
index 000000000..5831cfbcf
--- /dev/null
+++ b/Projects/Domains/CreditDomain/Sources/ResponseDTO/FetchCreditProfileResponseDTO.swift
@@ -0,0 +1,21 @@
+import CreditDomainInterface
+import Foundation
+
+struct FetchCreditProfileResponseDTO: Decodable {
+ let name: String
+ let imageURL: String?
+
+ enum CodingKeys: String, CodingKey {
+ case name
+ case imageURL = "profileUrl"
+ }
+}
+
+extension FetchCreditProfileResponseDTO {
+ func toDomain() -> CreditProfileEntity {
+ return CreditProfileEntity(
+ name: name,
+ imageURL: imageURL
+ )
+ }
+}
diff --git a/Projects/Domains/CreditDomain/Sources/ResponseDTO/FetchCreditSongListResponseDTO.swift b/Projects/Domains/CreditDomain/Sources/ResponseDTO/FetchCreditSongListResponseDTO.swift
new file mode 100644
index 000000000..5c4304f28
--- /dev/null
+++ b/Projects/Domains/CreditDomain/Sources/ResponseDTO/FetchCreditSongListResponseDTO.swift
@@ -0,0 +1,43 @@
+import Foundation
+import SongsDomainInterface
+import Utility
+
+struct FetchCreditSongListResponseDTO: Decodable {
+ let songID, title: String
+ let artists: [String]
+ let views, likes: Int
+ let date: Int
+ let karaokeNumber: FetchCreditSongListResponseDTO.KaraokeNumber
+
+ enum CodingKeys: String, CodingKey {
+ case title, artists, date, views, likes
+ case songID = "videoId"
+ case karaokeNumber
+ }
+}
+
+extension FetchCreditSongListResponseDTO {
+ struct KaraokeNumber: Decodable {
+ let TJ, KY: Int?
+ }
+}
+
+extension FetchCreditSongListResponseDTO {
+ func toDomain() -> SongEntity {
+ return SongEntity(
+ id: songID,
+ title: title,
+ artist: artists.joined(separator: ", "),
+ views: views,
+ date: date.changeDateFormat(origin: "yyMMdd", result: "yyyy.MM.dd"),
+ likes: likes,
+ karaokeNumber: .init(TJ: karaokeNumber.TJ, KY: karaokeNumber.KY)
+ )
+ }
+}
+
+extension [FetchCreditSongListResponseDTO] {
+ func toDomain() -> [SongEntity] {
+ return self.map { $0.toDomain() }
+ }
+}
diff --git a/Projects/Domains/CreditDomain/Sources/UseCase/FetchCreditProfileUseCaseImpl.swift b/Projects/Domains/CreditDomain/Sources/UseCase/FetchCreditProfileUseCaseImpl.swift
new file mode 100644
index 000000000..7a3450f49
--- /dev/null
+++ b/Projects/Domains/CreditDomain/Sources/UseCase/FetchCreditProfileUseCaseImpl.swift
@@ -0,0 +1,16 @@
+import CreditDomainInterface
+import RxSwift
+
+public final class FetchCreditProfileUseCaseImpl: FetchCreditProfileUseCase {
+ private let creditRepository: any CreditRepository
+
+ public init(
+ creditRepository: any CreditRepository
+ ) {
+ self.creditRepository = creditRepository
+ }
+
+ public func execute(name: String) -> Single {
+ creditRepository.fetchCreditProfile(name: name)
+ }
+}
diff --git a/Projects/Domains/CreditDomain/Sources/UseCase/FetchCreditSongListUseCaseImpl.swift b/Projects/Domains/CreditDomain/Sources/UseCase/FetchCreditSongListUseCaseImpl.swift
new file mode 100644
index 000000000..59ef90002
--- /dev/null
+++ b/Projects/Domains/CreditDomain/Sources/UseCase/FetchCreditSongListUseCaseImpl.swift
@@ -0,0 +1,22 @@
+import CreditDomainInterface
+import RxSwift
+import SongsDomainInterface
+
+public final class FetchCreditSongListUseCaseImpl: FetchCreditSongListUseCase {
+ private let creditRepository: any CreditRepository
+
+ public init(
+ creditRepository: any CreditRepository
+ ) {
+ self.creditRepository = creditRepository
+ }
+
+ public func execute(
+ name: String,
+ order: CreditSongOrderType,
+ page: Int,
+ limit: Int
+ ) -> Single<[SongEntity]> {
+ creditRepository.fetchCreditSongList(name: name, order: order, page: page, limit: limit)
+ }
+}
diff --git a/Projects/Domains/CreditDomain/Testing/UseCase/FetchCreditProfileUseCaseSpy.swift b/Projects/Domains/CreditDomain/Testing/UseCase/FetchCreditProfileUseCaseSpy.swift
new file mode 100644
index 000000000..fd207404c
--- /dev/null
+++ b/Projects/Domains/CreditDomain/Testing/UseCase/FetchCreditProfileUseCaseSpy.swift
@@ -0,0 +1,17 @@
+import CreditDomainInterface
+import RxSwift
+import SongsDomainInterface
+
+public final class FetchCreditProfileUseCaseSpy: FetchCreditProfileUseCase {
+ public var callCount = 0
+ public var handler: (String) -> Single = { _ in fatalError() }
+
+ public init() {}
+
+ public func execute(
+ name: String
+ ) -> Single {
+ callCount += 1
+ return handler(name)
+ }
+}
diff --git a/Projects/Domains/CreditDomain/Testing/UseCase/FetchCreditSongListUseCaseSpy.swift b/Projects/Domains/CreditDomain/Testing/UseCase/FetchCreditSongListUseCaseSpy.swift
new file mode 100644
index 000000000..9dd5d72fe
--- /dev/null
+++ b/Projects/Domains/CreditDomain/Testing/UseCase/FetchCreditSongListUseCaseSpy.swift
@@ -0,0 +1,20 @@
+import CreditDomainInterface
+import RxSwift
+import SongsDomainInterface
+
+public final class FetchCreditSongListUseCaseSpy: FetchCreditSongListUseCase {
+ public var callCount = 0
+ public var handler: (String, CreditSongOrderType, Int, Int) -> Single<[SongEntity]> = { _, _, _, _ in fatalError() }
+
+ public init() {}
+
+ public func execute(
+ name: String,
+ order: CreditSongOrderType,
+ page: Int,
+ limit: Int
+ ) -> Single<[SongEntity]> {
+ callCount += 1
+ return handler(name, order, page, limit)
+ }
+}
diff --git a/Projects/Domains/CreditDomain/Tests/CreditDomainTest.swift b/Projects/Domains/CreditDomain/Tests/CreditDomainTest.swift
new file mode 100644
index 000000000..1204b00fc
--- /dev/null
+++ b/Projects/Domains/CreditDomain/Tests/CreditDomainTest.swift
@@ -0,0 +1,11 @@
+import XCTest
+
+final class CreditDomainTests: XCTestCase {
+ override func setUpWithError() throws {}
+
+ override func tearDownWithError() throws {}
+
+ func testExample() {
+ XCTAssertEqual(1, 1)
+ }
+}
diff --git a/Projects/Domains/FaqDomain/Interface/DataSource/RemoteFaqDataSource.swift b/Projects/Domains/FaqDomain/Interface/DataSource/RemoteFaqDataSource.swift
new file mode 100644
index 000000000..bd5ef8d31
--- /dev/null
+++ b/Projects/Domains/FaqDomain/Interface/DataSource/RemoteFaqDataSource.swift
@@ -0,0 +1,7 @@
+import Foundation
+import RxSwift
+
+public protocol RemoteFaqDataSource {
+ func fetchCategories() -> Single
+ func fetchQna() -> Single<[FaqEntity]>
+}
diff --git a/Projects/Domains/FaqDomain/Interface/Entity/FaqCategoryEntity.swift b/Projects/Domains/FaqDomain/Interface/Entity/FaqCategoryEntity.swift
new file mode 100644
index 000000000..6b310181b
--- /dev/null
+++ b/Projects/Domains/FaqDomain/Interface/Entity/FaqCategoryEntity.swift
@@ -0,0 +1,11 @@
+import Foundation
+
+public struct FaqCategoryEntity: Equatable {
+ public init(
+ categories: [String]
+ ) {
+ self.categories = categories
+ }
+
+ public let categories: [String]
+}
diff --git a/Projects/Domains/FaqDomain/Interface/Entity/FaqEntity.swift b/Projects/Domains/FaqDomain/Interface/Entity/FaqEntity.swift
new file mode 100644
index 000000000..5a0e2a486
--- /dev/null
+++ b/Projects/Domains/FaqDomain/Interface/Entity/FaqEntity.swift
@@ -0,0 +1,18 @@
+import Foundation
+
+public struct FaqEntity: Equatable {
+ public init(
+ category: String,
+ question: String,
+ answer: String,
+ isOpen: Bool
+ ) {
+ self.category = category
+ self.question = question
+ self.answer = answer
+ self.isOpen = isOpen
+ }
+
+ public let category, question, answer: String
+ public var isOpen: Bool
+}
diff --git a/Projects/Domains/FaqDomain/Interface/Repository/FaqRepository.swift b/Projects/Domains/FaqDomain/Interface/Repository/FaqRepository.swift
new file mode 100644
index 000000000..d1d223ac8
--- /dev/null
+++ b/Projects/Domains/FaqDomain/Interface/Repository/FaqRepository.swift
@@ -0,0 +1,15 @@
+//
+// ArtistRepository.swift
+// DomainModule
+//
+// Created by KTH on 2023/02/08.
+// Copyright © 2023 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+import RxSwift
+
+public protocol FaqRepository {
+ func fetchQnaCategories() -> Single
+ func fetchQna() -> Single<[FaqEntity]>
+}
diff --git a/Projects/Domains/FaqDomain/Interface/UseCase/FetchFaqCategoriesUseCase.swift b/Projects/Domains/FaqDomain/Interface/UseCase/FetchFaqCategoriesUseCase.swift
new file mode 100644
index 000000000..56b863ece
--- /dev/null
+++ b/Projects/Domains/FaqDomain/Interface/UseCase/FetchFaqCategoriesUseCase.swift
@@ -0,0 +1,14 @@
+//
+// FetchArtistListUseCase.swift
+// DomainModule
+//
+// Created by KTH on 2023/02/08.
+// Copyright © 2023 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+import RxSwift
+
+public protocol FetchFaqCategoriesUseCase {
+ func execute() -> Single
+}
diff --git a/Projects/Domains/FaqDomain/Interface/UseCase/FetchFaqUseCase.swift b/Projects/Domains/FaqDomain/Interface/UseCase/FetchFaqUseCase.swift
new file mode 100644
index 000000000..34ffb4b27
--- /dev/null
+++ b/Projects/Domains/FaqDomain/Interface/UseCase/FetchFaqUseCase.swift
@@ -0,0 +1,14 @@
+//
+// FetchArtistListUseCase.swift
+// DomainModule
+//
+// Created by KTH on 2023/02/08.
+// Copyright © 2023 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+import RxSwift
+
+public protocol FetchFaqUseCase {
+ func execute() -> Single<[FaqEntity]>
+}
diff --git a/Projects/Domains/FaqDomain/Project.swift b/Projects/Domains/FaqDomain/Project.swift
new file mode 100644
index 000000000..102b5ee1d
--- /dev/null
+++ b/Projects/Domains/FaqDomain/Project.swift
@@ -0,0 +1,30 @@
+import DependencyPlugin
+import ProjectDescription
+import ProjectDescriptionHelpers
+
+let project = Project.module(
+ name: ModulePaths.Domain.FaqDomain.rawValue,
+ targets: [
+ .interface(
+ module: .domain(.FaqDomain),
+ dependencies: [
+ .domain(target: .BaseDomain, type: .interface)
+ ]
+ ),
+ .implements(
+ module: .domain(.FaqDomain),
+ dependencies: [
+ .domain(target: .BaseDomain),
+ .domain(target: .FaqDomain, type: .interface)
+ ]
+ ),
+ .testing(
+ module: .domain(.FaqDomain),
+ dependencies: [.domain(target: .FaqDomain, type: .interface)]
+ ),
+ .tests(
+ module: .domain(.FaqDomain),
+ dependencies: [.domain(target: .FaqDomain)]
+ )
+ ]
+)
diff --git a/Projects/Domains/FaqDomain/Sources/API/FaqAPI.swift b/Projects/Domains/FaqDomain/Sources/API/FaqAPI.swift
new file mode 100644
index 000000000..86c5da43c
--- /dev/null
+++ b/Projects/Domains/FaqDomain/Sources/API/FaqAPI.swift
@@ -0,0 +1,56 @@
+import BaseDomain
+import ErrorModule
+import Foundation
+import KeychainModule
+import Moya
+
+public enum FaqAPI {
+ case fetchFaqCategories
+ case fetchFaq
+}
+
+extension FaqAPI: WMAPI {
+ public var domain: WMDomain {
+ return .faq
+ }
+
+ public var urlPath: String {
+ switch self {
+ case .fetchFaqCategories:
+ return "/categories"
+ case .fetchFaq:
+ return "/list"
+ }
+ }
+
+ public var method: Moya.Method {
+ switch self {
+ case .fetchFaqCategories, .fetchFaq:
+ return .get
+ }
+ }
+
+ public var task: Moya.Task {
+ switch self {
+ case .fetchFaqCategories, .fetchFaq:
+ return .requestPlain
+ }
+ }
+
+ public var jwtTokenType: JwtTokenType {
+ return .none
+ }
+
+ public var errorMap: [Int: WMError] {
+ switch self {
+ default:
+ return [
+ 400: .badRequest,
+ 401: .tokenExpired,
+ 404: .notFound,
+ 429: .tooManyRequest,
+ 500: .internalServerError
+ ]
+ }
+ }
+}
diff --git a/Projects/Domains/FaqDomain/Sources/DataSource/RemoteFaqDataSourceImpl.swift b/Projects/Domains/FaqDomain/Sources/DataSource/RemoteFaqDataSourceImpl.swift
new file mode 100644
index 000000000..8d5b4d40a
--- /dev/null
+++ b/Projects/Domains/FaqDomain/Sources/DataSource/RemoteFaqDataSourceImpl.swift
@@ -0,0 +1,18 @@
+import BaseDomain
+import FaqDomainInterface
+import Foundation
+import RxSwift
+
+public final class RemoteFaqDataSourceImpl: BaseRemoteDataSource, RemoteFaqDataSource {
+ public func fetchCategories() -> Single {
+ return request(.fetchFaqCategories)
+ .map([String].self)
+ .map { FaqCategoryEntity(categories: $0) }
+ }
+
+ public func fetchQna() -> Single<[FaqEntity]> {
+ return request(.fetchFaq)
+ .map([FaqResponseDTO].self)
+ .map { $0.map { $0.toDomain() } }
+ }
+}
diff --git a/Projects/Domains/FaqDomain/Sources/Repository/FaqRepositoryImpl.swift b/Projects/Domains/FaqDomain/Sources/Repository/FaqRepositoryImpl.swift
new file mode 100644
index 000000000..9505b2010
--- /dev/null
+++ b/Projects/Domains/FaqDomain/Sources/Repository/FaqRepositoryImpl.swift
@@ -0,0 +1,28 @@
+//
+// ArtistRepositoryImpl.swift
+// DataModule
+//
+// Created by KTH on 2023/02/08.
+// Copyright © 2023 yongbeomkwak. All rights reserved.
+//
+
+import FaqDomainInterface
+import RxSwift
+
+public final class FaqRepositoryImpl: FaqRepository {
+ private let remoteFaqDataSource: any RemoteFaqDataSource
+
+ public init(
+ remoteFaqDataSource: RemoteFaqDataSource
+ ) {
+ self.remoteFaqDataSource = remoteFaqDataSource
+ }
+
+ public func fetchQnaCategories() -> Single {
+ remoteFaqDataSource.fetchCategories()
+ }
+
+ public func fetchQna() -> Single<[FaqEntity]> {
+ remoteFaqDataSource.fetchQna()
+ }
+}
diff --git a/Projects/Domains/FaqDomain/Sources/ResponseDTO/FaqCategoryResponseDTO.swift b/Projects/Domains/FaqDomain/Sources/ResponseDTO/FaqCategoryResponseDTO.swift
new file mode 100644
index 000000000..bedbe1c69
--- /dev/null
+++ b/Projects/Domains/FaqDomain/Sources/ResponseDTO/FaqCategoryResponseDTO.swift
@@ -0,0 +1,14 @@
+import FaqDomainInterface
+import Foundation
+
+public struct FaqCategoryResponseDTO: Decodable, Equatable {
+ public let categories: [String]
+}
+
+public extension FaqCategoryResponseDTO {
+ func toDomain() -> FaqCategoryEntity {
+ FaqCategoryEntity(
+ categories: categories
+ )
+ }
+}
diff --git a/Projects/Domains/FaqDomain/Sources/ResponseDTO/FaqResponseDTO.swift b/Projects/Domains/FaqDomain/Sources/ResponseDTO/FaqResponseDTO.swift
new file mode 100644
index 000000000..4a081ff64
--- /dev/null
+++ b/Projects/Domains/FaqDomain/Sources/ResponseDTO/FaqResponseDTO.swift
@@ -0,0 +1,30 @@
+//
+// ArtistListResponseDTO.swift
+// DataMappingModule
+//
+// Created by KTH on 2023/02/01.
+// Copyright © 2023 yongbeomkwak. All rights reserved.
+//
+
+import FaqDomainInterface
+import Foundation
+
+public struct FaqResponseDTO: Decodable {
+ public let question, answer: String
+ public let category: String
+
+ private enum CodingKeys: String, CodingKey {
+ case question, answer, category
+ }
+}
+
+public extension FaqResponseDTO {
+ func toDomain() -> FaqEntity {
+ FaqEntity(
+ category: category,
+ question: question,
+ answer: answer,
+ isOpen: false
+ )
+ }
+}
diff --git a/Projects/Domains/FaqDomain/Sources/UseCase/FetchFaqCategoriesUseCaseImpl.swift b/Projects/Domains/FaqDomain/Sources/UseCase/FetchFaqCategoriesUseCaseImpl.swift
new file mode 100644
index 000000000..dffb208a5
--- /dev/null
+++ b/Projects/Domains/FaqDomain/Sources/UseCase/FetchFaqCategoriesUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import FaqDomainInterface
+import Foundation
+import RxSwift
+
+public struct FetchFaqCategoriesUseCaseImpl: FetchFaqCategoriesUseCase {
+ private let faqRepository: any FaqRepository
+
+ public init(
+ faqRepository: FaqRepository
+ ) {
+ self.faqRepository = faqRepository
+ }
+
+ public func execute() -> Single {
+ faqRepository.fetchQnaCategories()
+ }
+}
diff --git a/Projects/Domains/FaqDomain/Sources/UseCase/FetchFaqUseCaseImpl.swift b/Projects/Domains/FaqDomain/Sources/UseCase/FetchFaqUseCaseImpl.swift
new file mode 100644
index 000000000..86e7f2754
--- /dev/null
+++ b/Projects/Domains/FaqDomain/Sources/UseCase/FetchFaqUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import FaqDomainInterface
+import Foundation
+import RxSwift
+
+public struct FetchFaqUseCaseImpl: FetchFaqUseCase {
+ private let faqRepository: any FaqRepository
+
+ public init(
+ faqRepository: FaqRepository
+ ) {
+ self.faqRepository = faqRepository
+ }
+
+ public func execute() -> Single<[FaqEntity]> {
+ faqRepository.fetchQna()
+ }
+}
diff --git a/Projects/Domains/FaqDomain/Testing/FetchFaqCategoriesUseCaseStub.swift b/Projects/Domains/FaqDomain/Testing/FetchFaqCategoriesUseCaseStub.swift
new file mode 100644
index 000000000..c2c4d7aae
--- /dev/null
+++ b/Projects/Domains/FaqDomain/Testing/FetchFaqCategoriesUseCaseStub.swift
@@ -0,0 +1,9 @@
+import FaqDomainInterface
+import Foundation
+import RxSwift
+
+public struct FetchFaqCategoriesUseCaseStub: FetchFaqCategoriesUseCase {
+ public func execute() -> Single {
+ return .just(FaqCategoryEntity(categories: []))
+ }
+}
diff --git a/Projects/Domains/FaqDomain/Testing/FetchFaqUseCaseStub.swift b/Projects/Domains/FaqDomain/Testing/FetchFaqUseCaseStub.swift
new file mode 100644
index 000000000..329d37e71
--- /dev/null
+++ b/Projects/Domains/FaqDomain/Testing/FetchFaqUseCaseStub.swift
@@ -0,0 +1,9 @@
+import FaqDomainInterface
+import Foundation
+import RxSwift
+
+public struct FetchFaqUseCaseStub: FetchFaqUseCase {
+ public func execute() -> Single<[FaqEntity]> {
+ return .just([])
+ }
+}
diff --git a/Projects/Domains/FaqDomain/Tests/FaqDomainTest.swift b/Projects/Domains/FaqDomain/Tests/FaqDomainTest.swift
new file mode 100644
index 000000000..b07d5b5d3
--- /dev/null
+++ b/Projects/Domains/FaqDomain/Tests/FaqDomainTest.swift
@@ -0,0 +1,11 @@
+import XCTest
+
+final class FaqDomainTests: XCTestCase {
+ override func setUpWithError() throws {}
+
+ override func tearDownWithError() throws {}
+
+ func testExample() {
+ XCTAssertEqual(1, 1)
+ }
+}
diff --git a/Projects/Domains/ImageDomain/Interface/DataSource/RemoteImageDataSource.swift b/Projects/Domains/ImageDomain/Interface/DataSource/RemoteImageDataSource.swift
new file mode 100644
index 000000000..ef6eeb0da
--- /dev/null
+++ b/Projects/Domains/ImageDomain/Interface/DataSource/RemoteImageDataSource.swift
@@ -0,0 +1,8 @@
+import Foundation
+import RxSwift
+
+public protocol RemoteImageDataSource {
+ func fetchLyricDecoratingBackground() -> Single<[LyricDecoratingBackgroundEntity]>
+ func fetchProfileList() -> Single<[ProfileListEntity]>
+ func fetchDefaultPlaylistImage() -> Single<[DefaultImageEntity]>
+}
diff --git a/Projects/Domains/ImageDomain/Interface/Entity/DefaultImageEntity.swift b/Projects/Domains/ImageDomain/Interface/Entity/DefaultImageEntity.swift
new file mode 100644
index 000000000..55003262b
--- /dev/null
+++ b/Projects/Domains/ImageDomain/Interface/Entity/DefaultImageEntity.swift
@@ -0,0 +1,11 @@
+import Foundation
+
+public struct DefaultImageEntity: Hashable, Equatable {
+ public let name: String
+ public let url: String
+
+ public init(name: String, url: String) {
+ self.name = name
+ self.url = url
+ }
+}
diff --git a/Projects/Domains/ImageDomain/Interface/Entity/LyricDecoratingBackgroundEntity.swift b/Projects/Domains/ImageDomain/Interface/Entity/LyricDecoratingBackgroundEntity.swift
new file mode 100644
index 000000000..613449a9d
--- /dev/null
+++ b/Projects/Domains/ImageDomain/Interface/Entity/LyricDecoratingBackgroundEntity.swift
@@ -0,0 +1,14 @@
+import Foundation
+
+public struct LyricDecoratingBackgroundEntity {
+ public init(
+ name: String,
+ url: String
+ ) {
+ self.name = name
+ self.url = url
+ }
+
+ public let name, url: String
+ public var isSelected: Bool = false
+}
diff --git a/Projects/Domains/ImageDomain/Interface/Entity/ProfileListEntity.swift b/Projects/Domains/ImageDomain/Interface/Entity/ProfileListEntity.swift
new file mode 100644
index 000000000..5fee6a527
--- /dev/null
+++ b/Projects/Domains/ImageDomain/Interface/Entity/ProfileListEntity.swift
@@ -0,0 +1,15 @@
+import Foundation
+
+public struct ProfileListEntity: Equatable {
+ public init(
+ name: String,
+ url: String
+ ) {
+ self.name = name
+ self.url = url
+ }
+
+ public let name: String
+ public let url: String
+ public var isSelected: Bool = false
+}
diff --git a/Projects/Domains/ImageDomain/Interface/Repository/ImageRepository.swift b/Projects/Domains/ImageDomain/Interface/Repository/ImageRepository.swift
new file mode 100644
index 000000000..ef3c8e41e
--- /dev/null
+++ b/Projects/Domains/ImageDomain/Interface/Repository/ImageRepository.swift
@@ -0,0 +1,8 @@
+import Foundation
+import RxSwift
+
+public protocol ImageRepository {
+ func fetchLyricDecoratingBackground() -> Single<[LyricDecoratingBackgroundEntity]>
+ func fetchProfileList() -> Single<[ProfileListEntity]>
+ func fetchDefaultPlaylistImage() -> Single<[DefaultImageEntity]>
+}
diff --git a/Projects/Domains/ImageDomain/Interface/UseCase/FetchDefaultPlaylistImageUseCase.swift b/Projects/Domains/ImageDomain/Interface/UseCase/FetchDefaultPlaylistImageUseCase.swift
new file mode 100644
index 000000000..dca426e27
--- /dev/null
+++ b/Projects/Domains/ImageDomain/Interface/UseCase/FetchDefaultPlaylistImageUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol FetchDefaultPlaylistImageUseCase {
+ func execute() -> Single<[DefaultImageEntity]>
+}
diff --git a/Projects/Domains/ImageDomain/Interface/UseCase/FetchLyricDecoratingBackgroundUseCase.swift b/Projects/Domains/ImageDomain/Interface/UseCase/FetchLyricDecoratingBackgroundUseCase.swift
new file mode 100644
index 000000000..6ea0fe745
--- /dev/null
+++ b/Projects/Domains/ImageDomain/Interface/UseCase/FetchLyricDecoratingBackgroundUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol FetchLyricDecoratingBackgroundUseCase {
+ func execute() -> Single<[LyricDecoratingBackgroundEntity]>
+}
diff --git a/Projects/Domains/ImageDomain/Interface/UseCase/FetchProfileListUseCase.swift b/Projects/Domains/ImageDomain/Interface/UseCase/FetchProfileListUseCase.swift
new file mode 100644
index 000000000..b16712279
--- /dev/null
+++ b/Projects/Domains/ImageDomain/Interface/UseCase/FetchProfileListUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol FetchProfileListUseCase {
+ func execute() -> Single<[ProfileListEntity]>
+}
diff --git a/Projects/Domains/ImageDomain/Project.swift b/Projects/Domains/ImageDomain/Project.swift
new file mode 100644
index 000000000..ace9d994f
--- /dev/null
+++ b/Projects/Domains/ImageDomain/Project.swift
@@ -0,0 +1,22 @@
+import DependencyPlugin
+import ProjectDescription
+import ProjectDescriptionHelpers
+
+let project = Project.module(
+ name: ModulePaths.Domain.ImageDomain.rawValue,
+ targets: [
+ .interface(
+ module: .domain(.ImageDomain),
+ dependencies: [
+ .domain(target: .BaseDomain, type: .interface)
+ ]
+ ),
+ .implements(
+ module: .domain(.ImageDomain),
+ dependencies: [
+ .domain(target: .BaseDomain),
+ .domain(target: .ImageDomain, type: .interface)
+ ]
+ )
+ ]
+)
diff --git a/Projects/Domains/ImageDomain/Sources/API/ImageAPI.swift b/Projects/Domains/ImageDomain/Sources/API/ImageAPI.swift
new file mode 100644
index 000000000..8b2c61112
--- /dev/null
+++ b/Projects/Domains/ImageDomain/Sources/API/ImageAPI.swift
@@ -0,0 +1,59 @@
+import BaseDomain
+import ErrorModule
+import Foundation
+import ImageDomainInterface
+import Moya
+
+public enum ImageAPI {
+ case fetchLyricDecoratingBackground
+ case fetchProfileList
+ case fetchDefaultPlaylistImage
+}
+
+extension ImageAPI: WMAPI {
+ public var domain: WMDomain {
+ return .image
+ }
+
+ public var urlPath: String {
+ switch self {
+ case .fetchLyricDecoratingBackground:
+ return "/lyrics/backgrounds"
+ case .fetchProfileList:
+ return "/user/profiles"
+ case .fetchDefaultPlaylistImage:
+ return "/playlists"
+ }
+ }
+
+ public var method: Moya.Method {
+ switch self {
+ case .fetchLyricDecoratingBackground, .fetchDefaultPlaylistImage, .fetchProfileList:
+ return .get
+ }
+ }
+
+ public var task: Moya.Task {
+ switch self {
+ case .fetchLyricDecoratingBackground, .fetchProfileList, .fetchDefaultPlaylistImage:
+ return .requestPlain
+ }
+ }
+
+ public var jwtTokenType: JwtTokenType {
+ return .none
+ }
+
+ public var errorMap: [Int: WMError] {
+ switch self {
+ default:
+ return [
+ 400: .badRequest,
+ 401: .tokenExpired,
+ 404: .notFound,
+ 429: .tooManyRequest,
+ 500: .internalServerError
+ ]
+ }
+ }
+}
diff --git a/Projects/Domains/ImageDomain/Sources/DataSource/RemoteImageDataSourceImpl.swift b/Projects/Domains/ImageDomain/Sources/DataSource/RemoteImageDataSourceImpl.swift
new file mode 100644
index 000000000..f3775fc68
--- /dev/null
+++ b/Projects/Domains/ImageDomain/Sources/DataSource/RemoteImageDataSourceImpl.swift
@@ -0,0 +1,24 @@
+import BaseDomain
+import Foundation
+import ImageDomainInterface
+import RxSwift
+
+public final class RemoteImageDataSourceImpl: BaseRemoteDataSource, RemoteImageDataSource {
+ public func fetchLyricDecoratingBackground() -> Single<[LyricDecoratingBackgroundEntity]> {
+ request(.fetchLyricDecoratingBackground)
+ .map([LyricDecoratingBackgroundResponseDTO].self)
+ .map { $0.map { $0.toDomain() } }
+ }
+
+ public func fetchProfileList() -> Single<[ProfileListEntity]> {
+ return request(.fetchProfileList)
+ .map([FetchProfileListResponseDTO].self)
+ .map { $0.map { $0.toDomain() } }
+ }
+
+ public func fetchDefaultPlaylistImage() -> Single<[DefaultImageEntity]> {
+ return request(.fetchDefaultPlaylistImage)
+ .map([FetchDefaultImageResponseDTO].self)
+ .map { $0.map { $0.toDomain() } }
+ }
+}
diff --git a/Projects/Domains/ImageDomain/Sources/Repository/ImageRepositoryImpl.swift b/Projects/Domains/ImageDomain/Sources/Repository/ImageRepositoryImpl.swift
new file mode 100644
index 000000000..e2a429da5
--- /dev/null
+++ b/Projects/Domains/ImageDomain/Sources/Repository/ImageRepositoryImpl.swift
@@ -0,0 +1,25 @@
+import Foundation
+import ImageDomainInterface
+import RxSwift
+
+public final class ImageRepositoryImpl: ImageRepository {
+ private let remoteImageDataSource: any RemoteImageDataSource
+
+ public init(
+ remoteImageDataSource: RemoteImageDataSource
+ ) {
+ self.remoteImageDataSource = remoteImageDataSource
+ }
+
+ public func fetchLyricDecoratingBackground() -> Single<[LyricDecoratingBackgroundEntity]> {
+ remoteImageDataSource.fetchLyricDecoratingBackground()
+ }
+
+ public func fetchProfileList() -> Single<[ProfileListEntity]> {
+ remoteImageDataSource.fetchProfileList()
+ }
+
+ public func fetchDefaultPlaylistImage() -> Single<[DefaultImageEntity]> {
+ remoteImageDataSource.fetchDefaultPlaylistImage()
+ }
+}
diff --git a/Projects/Domains/ImageDomain/Sources/ResponseDTO/FetchDefaultImageResponseDTO.swift b/Projects/Domains/ImageDomain/Sources/ResponseDTO/FetchDefaultImageResponseDTO.swift
new file mode 100644
index 000000000..fb5df685a
--- /dev/null
+++ b/Projects/Domains/ImageDomain/Sources/ResponseDTO/FetchDefaultImageResponseDTO.swift
@@ -0,0 +1,17 @@
+import Foundation
+import ImageDomainInterface
+
+public struct FetchDefaultImageResponseDTO: Decodable, Equatable {
+ public let type: String
+ public let name: String
+ public let url: String
+}
+
+public extension FetchDefaultImageResponseDTO {
+ func toDomain() -> DefaultImageEntity {
+ DefaultImageEntity(
+ name: name,
+ url: url
+ )
+ }
+}
diff --git a/Projects/Domains/ImageDomain/Sources/ResponseDTO/FetchProfileListResponseDTO.swift b/Projects/Domains/ImageDomain/Sources/ResponseDTO/FetchProfileListResponseDTO.swift
new file mode 100644
index 000000000..f18813968
--- /dev/null
+++ b/Projects/Domains/ImageDomain/Sources/ResponseDTO/FetchProfileListResponseDTO.swift
@@ -0,0 +1,17 @@
+import Foundation
+import ImageDomainInterface
+
+public struct FetchProfileListResponseDTO: Decodable, Equatable {
+ public let type: String
+ public let name: String
+ public let url: String
+}
+
+public extension FetchProfileListResponseDTO {
+ func toDomain() -> ProfileListEntity {
+ ProfileListEntity(
+ name: name,
+ url: url
+ )
+ }
+}
diff --git a/Projects/Domains/ImageDomain/Sources/ResponseDTO/LyricDecoratingBackgroundResponseDTO.swift b/Projects/Domains/ImageDomain/Sources/ResponseDTO/LyricDecoratingBackgroundResponseDTO.swift
new file mode 100644
index 000000000..091207643
--- /dev/null
+++ b/Projects/Domains/ImageDomain/Sources/ResponseDTO/LyricDecoratingBackgroundResponseDTO.swift
@@ -0,0 +1,18 @@
+import Foundation
+import ImageDomainInterface
+
+public struct LyricDecoratingBackgroundResponseDTO: Decodable {
+ let name: String
+ let url: String
+
+ private enum CodingKeys: String, CodingKey {
+ case name
+ case url
+ }
+}
+
+public extension LyricDecoratingBackgroundResponseDTO {
+ func toDomain() -> LyricDecoratingBackgroundEntity {
+ return .init(name: name, url: url)
+ }
+}
diff --git a/Projects/Domains/ImageDomain/Sources/UseCase/FetchDefaultPlaylistImageUseCaseImpl.swift b/Projects/Domains/ImageDomain/Sources/UseCase/FetchDefaultPlaylistImageUseCaseImpl.swift
new file mode 100644
index 000000000..c0dd4a064
--- /dev/null
+++ b/Projects/Domains/ImageDomain/Sources/UseCase/FetchDefaultPlaylistImageUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import Foundation
+import ImageDomainInterface
+import RxSwift
+
+public struct FetchDefaultPlaylistImageUseCaseImpl: FetchDefaultPlaylistImageUseCase {
+ private let imageRepository: any ImageRepository
+
+ public init(
+ imageRepository: ImageRepository
+ ) {
+ self.imageRepository = imageRepository
+ }
+
+ public func execute() -> Single<[DefaultImageEntity]> {
+ imageRepository.fetchDefaultPlaylistImage()
+ }
+}
diff --git a/Projects/Domains/ImageDomain/Sources/UseCase/FetchLyricDecoratingBackgroundUseCaseImpl.swift b/Projects/Domains/ImageDomain/Sources/UseCase/FetchLyricDecoratingBackgroundUseCaseImpl.swift
new file mode 100644
index 000000000..71b43ba00
--- /dev/null
+++ b/Projects/Domains/ImageDomain/Sources/UseCase/FetchLyricDecoratingBackgroundUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import Foundation
+import ImageDomainInterface
+import RxSwift
+
+public struct FetchLyricDecoratingBackgroundUseCaseImpl: FetchLyricDecoratingBackgroundUseCase {
+ private let imageRepository: any ImageRepository
+
+ public init(
+ imageRepository: ImageRepository
+ ) {
+ self.imageRepository = imageRepository
+ }
+
+ public func execute() -> Single<[LyricDecoratingBackgroundEntity]> {
+ imageRepository.fetchLyricDecoratingBackground()
+ }
+}
diff --git a/Projects/Domains/ImageDomain/Sources/UseCase/FetchProfileListUseCaseImpl.swift b/Projects/Domains/ImageDomain/Sources/UseCase/FetchProfileListUseCaseImpl.swift
new file mode 100644
index 000000000..ea55fc641
--- /dev/null
+++ b/Projects/Domains/ImageDomain/Sources/UseCase/FetchProfileListUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import Foundation
+import ImageDomainInterface
+import RxSwift
+
+public struct FetchProfileListUseCaseImpl: FetchProfileListUseCase {
+ private let imageRepository: any ImageRepository
+
+ public init(
+ imageRepository: ImageRepository
+ ) {
+ self.imageRepository = imageRepository
+ }
+
+ public func execute() -> Single<[ProfileListEntity]> {
+ imageRepository.fetchProfileList()
+ }
+}
diff --git a/Projects/Domains/LikeDomain/Interface/DataSource/RemoteLikeDataSource.swift b/Projects/Domains/LikeDomain/Interface/DataSource/RemoteLikeDataSource.swift
new file mode 100644
index 000000000..8937ba85d
--- /dev/null
+++ b/Projects/Domains/LikeDomain/Interface/DataSource/RemoteLikeDataSource.swift
@@ -0,0 +1,16 @@
+//
+// ArtistRepository.swift
+// DomainModule
+//
+// Created by KTH on 2023/02/08.
+// Copyright © 2023 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+import RxSwift
+
+public protocol RemoteLikeDataSource {
+ func addLikeSong(id: String) -> Single
+ func cancelLikeSong(id: String) -> Single
+ func checkIsLikedSong(id: String) -> Single
+}
diff --git a/Projects/Services/DomainModule/Sources/Like/Entity/LikeEntity.swift b/Projects/Domains/LikeDomain/Interface/Entity/LikeEntity.swift
similarity index 88%
rename from Projects/Services/DomainModule/Sources/Like/Entity/LikeEntity.swift
rename to Projects/Domains/LikeDomain/Interface/Entity/LikeEntity.swift
index 3a4ceaefd..872f4fdef 100644
--- a/Projects/Services/DomainModule/Sources/Like/Entity/LikeEntity.swift
+++ b/Projects/Domains/LikeDomain/Interface/Entity/LikeEntity.swift
@@ -10,7 +10,7 @@ import Foundation
public struct LikeEntity {
public init(
- status: Int,
+ status: String,
likes: Int,
description: String = ""
) {
@@ -18,8 +18,8 @@ public struct LikeEntity {
self.likes = likes
self.description = description
}
-
- public let status: Int
+
+ public let status: String
public let likes: Int
public var description: String = ""
}
diff --git a/Projects/Domains/LikeDomain/Interface/Repository/LikeRepository.swift b/Projects/Domains/LikeDomain/Interface/Repository/LikeRepository.swift
new file mode 100644
index 000000000..d633eac31
--- /dev/null
+++ b/Projects/Domains/LikeDomain/Interface/Repository/LikeRepository.swift
@@ -0,0 +1,16 @@
+//
+// ArtistRepository.swift
+// DomainModule
+//
+// Created by KTH on 2023/02/08.
+// Copyright © 2023 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+import RxSwift
+
+public protocol LikeRepository {
+ func addLikeSong(id: String) -> Single
+ func cancelLikeSong(id: String) -> Single
+ func checkIsLikedSong(id: String) -> Single
+}
diff --git a/Projects/Domains/LikeDomain/Interface/UseCase/AddLikeSongUseCase.swift b/Projects/Domains/LikeDomain/Interface/UseCase/AddLikeSongUseCase.swift
new file mode 100644
index 000000000..7fabbba89
--- /dev/null
+++ b/Projects/Domains/LikeDomain/Interface/UseCase/AddLikeSongUseCase.swift
@@ -0,0 +1,14 @@
+//
+// FetchArtistListUseCase.swift
+// DomainModule
+//
+// Created by KTH on 2023/02/08.
+// Copyright © 2023 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+import RxSwift
+
+public protocol AddLikeSongUseCase {
+ func execute(id: String) -> Single
+}
diff --git a/Projects/Services/DomainModule/Sources/Like/UseCases/CancelLikeSongUseCase.swift b/Projects/Domains/LikeDomain/Interface/UseCase/CancelLikeSongUseCase.swift
similarity index 75%
rename from Projects/Services/DomainModule/Sources/Like/UseCases/CancelLikeSongUseCase.swift
rename to Projects/Domains/LikeDomain/Interface/UseCase/CancelLikeSongUseCase.swift
index 7a92848a5..974a3e2b3 100644
--- a/Projects/Services/DomainModule/Sources/Like/UseCases/CancelLikeSongUseCase.swift
+++ b/Projects/Domains/LikeDomain/Interface/UseCase/CancelLikeSongUseCase.swift
@@ -8,8 +8,7 @@
import Foundation
import RxSwift
-import DataMappingModule
public protocol CancelLikeSongUseCase {
- func execute(id:String) -> Single
+ func execute(id: String) -> Single
}
diff --git a/Projects/Domains/LikeDomain/Project.swift b/Projects/Domains/LikeDomain/Project.swift
new file mode 100644
index 000000000..b44a955c9
--- /dev/null
+++ b/Projects/Domains/LikeDomain/Project.swift
@@ -0,0 +1,32 @@
+import DependencyPlugin
+import ProjectDescription
+import ProjectDescriptionHelpers
+
+let project = Project.module(
+ name: ModulePaths.Domain.LikeDomain.rawValue,
+ targets: [
+ .interface(
+ module: .domain(.LikeDomain),
+ dependencies: [
+ .domain(target: .BaseDomain, type: .interface)
+ ]
+ ),
+ .implements(
+ module: .domain(.LikeDomain),
+ dependencies: [
+ .domain(target: .BaseDomain),
+ .domain(target: .LikeDomain, type: .interface)
+ ]
+ ),
+ .testing(
+ module: .domain(.LikeDomain),
+ dependencies: [
+ .domain(target: .LikeDomain, type: .interface)
+ ]
+ ),
+ .tests(
+ module: .domain(.LikeDomain),
+ dependencies: [.domain(target: .LikeDomain)]
+ )
+ ]
+)
diff --git a/Projects/Domains/LikeDomain/Sources/API/LikeAPI.swift b/Projects/Domains/LikeDomain/Sources/API/LikeAPI.swift
new file mode 100644
index 000000000..433b329ea
--- /dev/null
+++ b/Projects/Domains/LikeDomain/Sources/API/LikeAPI.swift
@@ -0,0 +1,63 @@
+import BaseDomain
+import ErrorModule
+import Foundation
+import KeychainModule
+import Moya
+
+public enum LikeAPI {
+ case addLikeSong(id: String)
+ case cancelLikeSong(id: String)
+ case checkIsLikedSong(id: String)
+}
+
+extension LikeAPI: WMAPI {
+ public var domain: WMDomain {
+ .like
+ }
+
+ public var urlPath: String {
+ switch self {
+ case let .addLikeSong(id: id):
+ return "/\(id)"
+ case let .cancelLikeSong(id: id):
+ return "/\(id)"
+ case let .checkIsLikedSong(id):
+ return "/\(id)"
+ }
+ }
+
+ public var method: Moya.Method {
+ switch self {
+ case .addLikeSong:
+ return .post
+ case .cancelLikeSong:
+ return .delete
+ case .checkIsLikedSong:
+ return .get
+ }
+ }
+
+ public var task: Moya.Task {
+ return .requestPlain
+ }
+
+ public var jwtTokenType: JwtTokenType {
+ switch self {
+ case .addLikeSong, .cancelLikeSong, .checkIsLikedSong:
+ return .accessToken
+ }
+ }
+
+ public var errorMap: [Int: WMError] {
+ switch self {
+ default:
+ return [
+ 400: .badRequest,
+ 401: .tokenExpired,
+ 404: .notFound,
+ 429: .tooManyRequest,
+ 500: .internalServerError
+ ]
+ }
+ }
+}
diff --git a/Projects/Domains/LikeDomain/Sources/DataSource/Remote/RemoteLikeDataSourceImpl.swift b/Projects/Domains/LikeDomain/Sources/DataSource/Remote/RemoteLikeDataSourceImpl.swift
new file mode 100644
index 000000000..84082cd88
--- /dev/null
+++ b/Projects/Domains/LikeDomain/Sources/DataSource/Remote/RemoteLikeDataSourceImpl.swift
@@ -0,0 +1,24 @@
+import BaseDomain
+import Foundation
+import LikeDomainInterface
+import RxSwift
+
+public final class RemoteLikeDataSourceImpl: BaseRemoteDataSource, RemoteLikeDataSource {
+ public func addLikeSong(id: String) -> Single {
+ request(.addLikeSong(id: id))
+ .map(LikeResponseDTO.self)
+ .map { $0.toDomain() }
+ }
+
+ public func cancelLikeSong(id: String) -> Single {
+ request(.cancelLikeSong(id: id))
+ .map(LikeResponseDTO.self)
+ .map { $0.toDomain() }
+ }
+
+ public func checkIsLikedSong(id: String) -> Single {
+ request(.checkIsLikedSong(id: id))
+ .map(CheckIsLikedResponseDTO.self)
+ .map(\.isLiked)
+ }
+}
diff --git a/Projects/Domains/LikeDomain/Sources/Repository/LikeRepositoryImpl.swift b/Projects/Domains/LikeDomain/Sources/Repository/LikeRepositoryImpl.swift
new file mode 100644
index 000000000..172f02f8d
--- /dev/null
+++ b/Projects/Domains/LikeDomain/Sources/Repository/LikeRepositoryImpl.swift
@@ -0,0 +1,31 @@
+//
+// ArtistRepositoryImpl.swift
+// DataModule
+//
+// Created by KTH on 2023/02/08.
+// Copyright © 2023 yongbeomkwak. All rights reserved.
+//
+
+import ErrorModule
+import LikeDomainInterface
+import RxSwift
+
+public final class LikeRepositoryImpl: LikeRepository {
+ private let remoteLikeDataSource: any RemoteLikeDataSource
+
+ public init(remoteLikeDataSource: any RemoteLikeDataSource) {
+ self.remoteLikeDataSource = remoteLikeDataSource
+ }
+
+ public func addLikeSong(id: String) -> Single {
+ remoteLikeDataSource.addLikeSong(id: id)
+ }
+
+ public func cancelLikeSong(id: String) -> Single {
+ remoteLikeDataSource.cancelLikeSong(id: id)
+ }
+
+ public func checkIsLikedSong(id: String) -> Single {
+ remoteLikeDataSource.checkIsLikedSong(id: id)
+ }
+}
diff --git a/Projects/Domains/LikeDomain/Sources/ResponseDTO/CheckIsLikedResponseDTO.swift b/Projects/Domains/LikeDomain/Sources/ResponseDTO/CheckIsLikedResponseDTO.swift
new file mode 100644
index 000000000..0b6cf3354
--- /dev/null
+++ b/Projects/Domains/LikeDomain/Sources/ResponseDTO/CheckIsLikedResponseDTO.swift
@@ -0,0 +1,5 @@
+import Foundation
+
+struct CheckIsLikedResponseDTO: Decodable {
+ let isLiked: Bool
+}
diff --git a/Projects/Domains/LikeDomain/Sources/ResponseDTO/LikeResponseDTO.swift b/Projects/Domains/LikeDomain/Sources/ResponseDTO/LikeResponseDTO.swift
new file mode 100644
index 000000000..6e56335ca
--- /dev/null
+++ b/Projects/Domains/LikeDomain/Sources/ResponseDTO/LikeResponseDTO.swift
@@ -0,0 +1,29 @@
+//
+// LikeResponseDTO.swift
+// DataMappingModuleTests
+//
+// Created by YoungK on 2023/04/03.
+// Copyright © 2023 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+import LikeDomainInterface
+
+public struct LikeResponseDTO: Decodable {
+ public let status: String
+ public let likes: Int
+
+ private enum CodingKeys: String, CodingKey {
+ case status
+ case likes = "data"
+ }
+}
+
+public extension LikeResponseDTO {
+ func toDomain() -> LikeEntity {
+ LikeEntity(
+ status: status,
+ likes: likes
+ )
+ }
+}
diff --git a/Projects/Services/DataModule/Sources/Like/UseCases/AddLikeSongUseCaseImpl.swift b/Projects/Domains/LikeDomain/Sources/UseCase/AddLikeSongUseCaseImpl.swift
similarity index 86%
rename from Projects/Services/DataModule/Sources/Like/UseCases/AddLikeSongUseCaseImpl.swift
rename to Projects/Domains/LikeDomain/Sources/UseCase/AddLikeSongUseCaseImpl.swift
index 19a6614af..26c09dd3b 100644
--- a/Projects/Services/DataModule/Sources/Like/UseCases/AddLikeSongUseCaseImpl.swift
+++ b/Projects/Domains/LikeDomain/Sources/UseCase/AddLikeSongUseCaseImpl.swift
@@ -7,15 +7,10 @@
//
import Foundation
+import LikeDomainInterface
import RxSwift
-import DataMappingModule
-import DomainModule
-import ErrorModule
public struct AddLikeSongUseCaseImpl: AddLikeSongUseCase {
-
-
-
private let likeRepository: any LikeRepository
public init(
@@ -23,9 +18,8 @@ public struct AddLikeSongUseCaseImpl: AddLikeSongUseCase {
) {
self.likeRepository = likeRepository
}
-
+
public func execute(id: String) -> Single {
likeRepository.addLikeSong(id: id)
}
-
}
diff --git a/Projects/Services/DataModule/Sources/Like/UseCases/CancelLikeSongUseCaseImpl.swift b/Projects/Domains/LikeDomain/Sources/UseCase/CancelLikeSongUseCaseImpl.swift
similarity index 87%
rename from Projects/Services/DataModule/Sources/Like/UseCases/CancelLikeSongUseCaseImpl.swift
rename to Projects/Domains/LikeDomain/Sources/UseCase/CancelLikeSongUseCaseImpl.swift
index 456dd233e..9814beb49 100644
--- a/Projects/Services/DataModule/Sources/Like/UseCases/CancelLikeSongUseCaseImpl.swift
+++ b/Projects/Domains/LikeDomain/Sources/UseCase/CancelLikeSongUseCaseImpl.swift
@@ -7,15 +7,10 @@
//
import Foundation
+import LikeDomainInterface
import RxSwift
-import DataMappingModule
-import DomainModule
-import ErrorModule
public struct CancelLikeSongUseCaseImpl: CancelLikeSongUseCase {
-
-
-
private let likeRepository: any LikeRepository
public init(
@@ -23,9 +18,8 @@ public struct CancelLikeSongUseCaseImpl: CancelLikeSongUseCase {
) {
self.likeRepository = likeRepository
}
-
+
public func execute(id: String) -> Single {
likeRepository.cancelLikeSong(id: id)
}
-
}
diff --git a/Projects/Domains/LikeDomain/Testing/UseCase/AddLikeSongUseCaseSpy.swift b/Projects/Domains/LikeDomain/Testing/UseCase/AddLikeSongUseCaseSpy.swift
new file mode 100644
index 000000000..ff041e1c3
--- /dev/null
+++ b/Projects/Domains/LikeDomain/Testing/UseCase/AddLikeSongUseCaseSpy.swift
@@ -0,0 +1,14 @@
+import LikeDomainInterface
+import RxSwift
+
+public final class AddLikeSongUseCaseSpy: AddLikeSongUseCase {
+ public private(set) var callCount = 0
+ public var handler: (String) -> Single = { _ in fatalError() }
+
+ public init() {}
+
+ public func execute(id: String) -> Single {
+ callCount += 1
+ return handler(id)
+ }
+}
diff --git a/Projects/Domains/LikeDomain/Testing/UseCase/CancelLikeSongUseCaseSpy.swift b/Projects/Domains/LikeDomain/Testing/UseCase/CancelLikeSongUseCaseSpy.swift
new file mode 100644
index 000000000..180422887
--- /dev/null
+++ b/Projects/Domains/LikeDomain/Testing/UseCase/CancelLikeSongUseCaseSpy.swift
@@ -0,0 +1,14 @@
+import LikeDomainInterface
+import RxSwift
+
+public final class CancelLikeSongUseCaseSpy: CancelLikeSongUseCase {
+ public private(set) var callCount = 0
+ public var handler: (String) -> Single = { _ in fatalError() }
+
+ public init() {}
+
+ public func execute(id: String) -> Single {
+ callCount += 1
+ return handler(id)
+ }
+}
diff --git a/Projects/Domains/LikeDomain/Tests/LikeDomainTest.swift b/Projects/Domains/LikeDomain/Tests/LikeDomainTest.swift
new file mode 100644
index 000000000..ada164b0d
--- /dev/null
+++ b/Projects/Domains/LikeDomain/Tests/LikeDomainTest.swift
@@ -0,0 +1,11 @@
+import XCTest
+
+final class LikeDomainTests: XCTestCase {
+ override func setUpWithError() throws {}
+
+ override func tearDownWithError() throws {}
+
+ func testExample() {
+ XCTAssertEqual(1, 1)
+ }
+}
diff --git a/Projects/Domains/NoticeDomain/Interface/DataSource/RemoteNoticeDataSource.swift b/Projects/Domains/NoticeDomain/Interface/DataSource/RemoteNoticeDataSource.swift
new file mode 100644
index 000000000..078a30721
--- /dev/null
+++ b/Projects/Domains/NoticeDomain/Interface/DataSource/RemoteNoticeDataSource.swift
@@ -0,0 +1,17 @@
+//
+// RemoteNoticeDataSource.swift
+// NetworkModule
+//
+// Created by KTH on 2023/04/08.
+// Copyright © 2023 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+import RxSwift
+
+public protocol RemoteNoticeDataSource {
+ func fetchNoticeCategories() -> Single
+ func fetchNoticePopup() -> Single<[FetchNoticeEntity]>
+ func fetchNoticeAll() -> Single<[FetchNoticeEntity]>
+ func fetchNoticeIDList() -> Single
+}
diff --git a/Projects/Domains/NoticeDomain/Interface/Entity/FetchNoticeCategoriesEntity.swift b/Projects/Domains/NoticeDomain/Interface/Entity/FetchNoticeCategoriesEntity.swift
new file mode 100644
index 000000000..7a74e107f
--- /dev/null
+++ b/Projects/Domains/NoticeDomain/Interface/Entity/FetchNoticeCategoriesEntity.swift
@@ -0,0 +1,11 @@
+import Foundation
+
+public struct FetchNoticeCategoriesEntity {
+ public init (
+ categories: [String]
+ ) {
+ self.categories = categories
+ }
+
+ public let categories: [String]
+}
diff --git a/Projects/Domains/NoticeDomain/Interface/Entity/FetchNoticeEntity.swift b/Projects/Domains/NoticeDomain/Interface/Entity/FetchNoticeEntity.swift
new file mode 100644
index 000000000..df7d72fb3
--- /dev/null
+++ b/Projects/Domains/NoticeDomain/Interface/Entity/FetchNoticeEntity.swift
@@ -0,0 +1,44 @@
+import Foundation
+
+public struct FetchNoticeEntity {
+ public init(
+ id: Int,
+ category: String,
+ title: String,
+ content: String,
+ thumbnail: FetchNoticeEntity.Image,
+ origins: [FetchNoticeEntity.Image],
+ createdAt: Double
+ ) {
+ self.id = id
+ self.category = category
+ self.title = title
+ self.content = content
+ self.thumbnail = thumbnail
+ self.origins = origins
+ self.createdAt = createdAt
+ }
+
+ public let id: Int
+ public let category, title: String
+ public let content: String
+ public let thumbnail: FetchNoticeEntity.Image
+ public let origins: [FetchNoticeEntity.Image]
+ public let createdAt: Double
+ public var isRead: Bool = true
+}
+
+public extension FetchNoticeEntity {
+ struct Image {
+ public init (
+ url: String,
+ link: String
+ ) {
+ self.url = url
+ self.link = link
+ }
+
+ public let url: String
+ public let link: String
+ }
+}
diff --git a/Projects/Domains/NoticeDomain/Interface/Entity/FetchNoticeIDListEntity.swift b/Projects/Domains/NoticeDomain/Interface/Entity/FetchNoticeIDListEntity.swift
new file mode 100644
index 000000000..d2206a08f
--- /dev/null
+++ b/Projects/Domains/NoticeDomain/Interface/Entity/FetchNoticeIDListEntity.swift
@@ -0,0 +1,14 @@
+import Foundation
+
+public struct FetchNoticeIDListEntity {
+ public init(
+ status: String,
+ data: [Int]
+ ) {
+ self.status = status
+ self.data = data
+ }
+
+ public let status: String
+ public let data: [Int]
+}
diff --git a/Projects/Domains/NoticeDomain/Interface/Repository/NoticeRepository.swift b/Projects/Domains/NoticeDomain/Interface/Repository/NoticeRepository.swift
new file mode 100644
index 000000000..0755628b7
--- /dev/null
+++ b/Projects/Domains/NoticeDomain/Interface/Repository/NoticeRepository.swift
@@ -0,0 +1,9 @@
+import Foundation
+import RxSwift
+
+public protocol NoticeRepository {
+ func fetchNoticeCategories() -> Single
+ func fetchNoticePopup() -> Single<[FetchNoticeEntity]>
+ func fetchNoticeAll() -> Single<[FetchNoticeEntity]>
+ func fetchNoticeIDList() -> Single
+}
diff --git a/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticeAllUseCase.swift b/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticeAllUseCase.swift
new file mode 100644
index 000000000..740d5eae9
--- /dev/null
+++ b/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticeAllUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol FetchNoticeAllUseCase {
+ func execute() -> Single<[FetchNoticeEntity]>
+}
diff --git a/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticeCategoriesUseCase.swift b/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticeCategoriesUseCase.swift
new file mode 100644
index 000000000..f85908f3d
--- /dev/null
+++ b/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticeCategoriesUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol FetchNoticeCategoriesUseCase {
+ func execute() -> Single
+}
diff --git a/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticeIDListUseCase.swift b/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticeIDListUseCase.swift
new file mode 100644
index 000000000..f89096fd3
--- /dev/null
+++ b/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticeIDListUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol FetchNoticeIDListUseCase {
+ func execute() -> Single
+}
diff --git a/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticePopupUseCase.swift b/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticePopupUseCase.swift
new file mode 100644
index 000000000..4323ef4a3
--- /dev/null
+++ b/Projects/Domains/NoticeDomain/Interface/UseCase/FetchNoticePopupUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol FetchNoticePopupUseCase {
+ func execute() -> Single<[FetchNoticeEntity]>
+}
diff --git a/Projects/Domains/NoticeDomain/Project.swift b/Projects/Domains/NoticeDomain/Project.swift
new file mode 100644
index 000000000..61dc7b08c
--- /dev/null
+++ b/Projects/Domains/NoticeDomain/Project.swift
@@ -0,0 +1,30 @@
+import DependencyPlugin
+import ProjectDescription
+import ProjectDescriptionHelpers
+
+let project = Project.module(
+ name: ModulePaths.Domain.NoticeDomain.rawValue,
+ targets: [
+ .interface(
+ module: .domain(.NoticeDomain),
+ dependencies: [
+ .domain(target: .BaseDomain, type: .interface)
+ ]
+ ),
+ .implements(
+ module: .domain(.NoticeDomain),
+ dependencies: [
+ .domain(target: .BaseDomain),
+ .domain(target: .NoticeDomain, type: .interface)
+ ]
+ ),
+ .testing(
+ module: .domain(.NoticeDomain),
+ dependencies: [.domain(target: .NoticeDomain, type: .interface)]
+ ),
+ .tests(
+ module: .domain(.NoticeDomain),
+ dependencies: [.domain(target: .NoticeDomain)]
+ )
+ ]
+)
diff --git a/Projects/Domains/NoticeDomain/Sources/API/NoticeAPI.swift b/Projects/Domains/NoticeDomain/Sources/API/NoticeAPI.swift
new file mode 100644
index 000000000..0da97e75d
--- /dev/null
+++ b/Projects/Domains/NoticeDomain/Sources/API/NoticeAPI.swift
@@ -0,0 +1,82 @@
+//
+// NoticeAPI.swift
+// APIKit
+//
+// Created by KTH on 2023/04/04.
+// Copyright © 2023 yongbeomkwak. All rights reserved.
+//
+
+import BaseDomain
+import ErrorModule
+import Foundation
+import Moya
+import NoticeDomainInterface
+
+public enum NoticeAPI {
+ case fetchNoticeCategories
+ case fetchNoticePopup
+ case fetchNoticeAll
+ case fetchNoticeIDList
+}
+
+extension NoticeAPI: WMAPI {
+ public var domain: WMDomain {
+ return .notice
+ }
+
+ public var urlPath: String {
+ switch self {
+ case .fetchNoticeCategories:
+ return "/categories"
+ case .fetchNoticePopup:
+ return "/popup"
+ case .fetchNoticeAll:
+ return "/all"
+ case .fetchNoticeIDList:
+ return "/ids"
+ }
+ }
+
+ public var method: Moya.Method {
+ switch self {
+ case .fetchNoticeCategories:
+ return .get
+ case .fetchNoticePopup:
+ return .get
+ case .fetchNoticeAll:
+ return .get
+ case .fetchNoticeIDList:
+ return .get
+ }
+ }
+
+ public var task: Moya.Task {
+ switch self {
+ case .fetchNoticeCategories:
+ return .requestPlain
+ case .fetchNoticePopup:
+ return .requestPlain
+ case .fetchNoticeAll:
+ return .requestPlain
+ case .fetchNoticeIDList:
+ return .requestPlain
+ }
+ }
+
+ public var jwtTokenType: JwtTokenType {
+ return .none
+ }
+
+ public var errorMap: [Int: WMError] {
+ switch self {
+ default:
+ return [
+ 400: .badRequest,
+ 401: .tokenExpired,
+ 404: .notFound,
+ 429: .tooManyRequest,
+ 500: .internalServerError
+ ]
+ }
+ }
+}
diff --git a/Projects/Domains/NoticeDomain/Sources/DataSource/RemoteNoticeDataSourceImpl.swift b/Projects/Domains/NoticeDomain/Sources/DataSource/RemoteNoticeDataSourceImpl.swift
new file mode 100644
index 000000000..d936da175
--- /dev/null
+++ b/Projects/Domains/NoticeDomain/Sources/DataSource/RemoteNoticeDataSourceImpl.swift
@@ -0,0 +1,38 @@
+//
+// RemoteNoticeDataSourceImpl.swift
+// NetworkModule
+//
+// Created by KTH on 2023/04/08.
+// Copyright © 2023 yongbeomkwak. All rights reserved.
+//
+
+import BaseDomain
+import Foundation
+import NoticeDomainInterface
+import RxSwift
+
+public final class RemoteNoticeDataSourceImpl: BaseRemoteDataSource, RemoteNoticeDataSource {
+ public func fetchNoticeCategories() -> Single {
+ request(.fetchNoticeCategories)
+ .map(FetchNoticeCategoriesResponseDTO.self)
+ .map { $0.toDomain() }
+ }
+
+ public func fetchNoticePopup() -> Single<[FetchNoticeEntity]> {
+ request(.fetchNoticePopup)
+ .map([FetchNoticeResponseDTO].self)
+ .map { $0.map { $0.toDomain() } }
+ }
+
+ public func fetchNoticeAll() -> Single<[FetchNoticeEntity]> {
+ request(.fetchNoticeAll)
+ .map([FetchNoticeResponseDTO].self)
+ .map { $0.map { $0.toDomain() } }
+ }
+
+ public func fetchNoticeIDList() -> Single {
+ request(.fetchNoticeIDList)
+ .map(FetchNoticeIDListDTO.self)
+ .map { $0.toDomain() }
+ }
+}
diff --git a/Projects/Domains/NoticeDomain/Sources/Repository/NoticeRepositoryImpl.swift b/Projects/Domains/NoticeDomain/Sources/Repository/NoticeRepositoryImpl.swift
new file mode 100644
index 000000000..09c643f4c
--- /dev/null
+++ b/Projects/Domains/NoticeDomain/Sources/Repository/NoticeRepositoryImpl.swift
@@ -0,0 +1,29 @@
+import Foundation
+import NoticeDomainInterface
+import RxSwift
+
+public final class NoticeRepositoryImpl: NoticeRepository {
+ private let remoteNoticeDataSource: any RemoteNoticeDataSource
+
+ public init(
+ remoteNoticeDataSource: RemoteNoticeDataSource
+ ) {
+ self.remoteNoticeDataSource = remoteNoticeDataSource
+ }
+
+ public func fetchNoticeCategories() -> Single {
+ remoteNoticeDataSource.fetchNoticeCategories()
+ }
+
+ public func fetchNoticePopup() -> Single<[FetchNoticeEntity]> {
+ remoteNoticeDataSource.fetchNoticePopup()
+ }
+
+ public func fetchNoticeAll() -> Single<[FetchNoticeEntity]> {
+ remoteNoticeDataSource.fetchNoticeAll()
+ }
+
+ public func fetchNoticeIDList() -> Single {
+ remoteNoticeDataSource.fetchNoticeIDList()
+ }
+}
diff --git a/Projects/Domains/NoticeDomain/Sources/ResponseDTO/FetchNoticeCategoriesResponseDTO.swift b/Projects/Domains/NoticeDomain/Sources/ResponseDTO/FetchNoticeCategoriesResponseDTO.swift
new file mode 100644
index 000000000..7c2a45c95
--- /dev/null
+++ b/Projects/Domains/NoticeDomain/Sources/ResponseDTO/FetchNoticeCategoriesResponseDTO.swift
@@ -0,0 +1,14 @@
+import Foundation
+import NoticeDomainInterface
+
+public struct FetchNoticeCategoriesResponseDTO: Decodable {
+ public let categories: [String]
+}
+
+public extension FetchNoticeCategoriesResponseDTO {
+ func toDomain() -> FetchNoticeCategoriesEntity {
+ return FetchNoticeCategoriesEntity(
+ categories: categories
+ )
+ }
+}
diff --git a/Projects/Domains/NoticeDomain/Sources/ResponseDTO/FetchNoticeIDListDTO.swift b/Projects/Domains/NoticeDomain/Sources/ResponseDTO/FetchNoticeIDListDTO.swift
new file mode 100644
index 000000000..329c3d6c1
--- /dev/null
+++ b/Projects/Domains/NoticeDomain/Sources/ResponseDTO/FetchNoticeIDListDTO.swift
@@ -0,0 +1,13 @@
+import Foundation
+import NoticeDomainInterface
+
+public struct FetchNoticeIDListDTO: Decodable {
+ let status: String
+ let data: [Int]
+}
+
+public extension FetchNoticeIDListDTO {
+ func toDomain() -> FetchNoticeIDListEntity {
+ return FetchNoticeIDListEntity(status: status, data: data)
+ }
+}
diff --git a/Projects/Domains/NoticeDomain/Sources/ResponseDTO/FetchNoticeResponseDTO.swift b/Projects/Domains/NoticeDomain/Sources/ResponseDTO/FetchNoticeResponseDTO.swift
new file mode 100644
index 000000000..36f2214f4
--- /dev/null
+++ b/Projects/Domains/NoticeDomain/Sources/ResponseDTO/FetchNoticeResponseDTO.swift
@@ -0,0 +1,55 @@
+import Foundation
+import NoticeDomainInterface
+
+public struct FetchNoticeResponseDTO: Decodable, Equatable {
+ public let id: Int
+ public let category: String
+ public let title: String
+ public let content: String?
+ public let thumbnail: FetchNoticeResponseDTO.Image?
+ public let origins: [FetchNoticeResponseDTO.Image]
+ public let createdAt: Double
+
+ public static func == (lhs: Self, rhs: Self) -> Bool {
+ return lhs.id == rhs.id
+ }
+
+ enum CodingKeys: String, CodingKey {
+ case id, category, title
+ case content = "text"
+ case thumbnail
+ case origins = "images"
+ case createdAt
+ }
+}
+
+public extension FetchNoticeResponseDTO {
+ struct Image: Decodable {
+ public let url: String?
+ public let link: String?
+
+ enum CodingKeys: String, CodingKey {
+ case url = "imageUrl"
+ case link = "hyperlinkUrl"
+ }
+ }
+}
+
+public extension FetchNoticeResponseDTO {
+ func toDomain() -> FetchNoticeEntity {
+ return FetchNoticeEntity(
+ id: id,
+ category: category,
+ title: title,
+ content: content ?? "",
+ thumbnail: FetchNoticeEntity.Image(
+ url: thumbnail?.url ?? "",
+ link: thumbnail?.link ?? ""
+ ),
+ origins: origins.map {
+ FetchNoticeEntity.Image(url: $0.url ?? "", link: $0.link ?? "")
+ },
+ createdAt: createdAt
+ )
+ }
+}
diff --git a/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticeAllUseCaseImpl.swift b/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticeAllUseCaseImpl.swift
new file mode 100644
index 000000000..0bf745e4e
--- /dev/null
+++ b/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticeAllUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import Foundation
+import NoticeDomainInterface
+import RxSwift
+
+public struct FetchNoticeAllUseCaseImpl: FetchNoticeAllUseCase {
+ private let noticeRepository: any NoticeRepository
+
+ public init(
+ noticeRepository: NoticeRepository
+ ) {
+ self.noticeRepository = noticeRepository
+ }
+
+ public func execute() -> Single<[FetchNoticeEntity]> {
+ return noticeRepository.fetchNoticeAll()
+ }
+}
diff --git a/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticeCategoriesUseCaseImpl.swift b/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticeCategoriesUseCaseImpl.swift
new file mode 100644
index 000000000..d6b00a858
--- /dev/null
+++ b/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticeCategoriesUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import Foundation
+import NoticeDomainInterface
+import RxSwift
+
+public struct FetchNoticeCategoriesUseCaseImpl: FetchNoticeCategoriesUseCase {
+ private let noticeRepository: any NoticeRepository
+
+ public init(
+ noticeRepository: NoticeRepository
+ ) {
+ self.noticeRepository = noticeRepository
+ }
+
+ public func execute() -> Single {
+ noticeRepository.fetchNoticeCategories()
+ }
+}
diff --git a/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticeIDListUseCaseImpl.swift b/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticeIDListUseCaseImpl.swift
new file mode 100644
index 000000000..2aed5cc38
--- /dev/null
+++ b/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticeIDListUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import Foundation
+import NoticeDomainInterface
+import RxSwift
+
+public struct FetchNoticeIDListUseCaseImpl: FetchNoticeIDListUseCase {
+ private let noticeRepository: any NoticeRepository
+
+ public init(
+ noticeRepository: NoticeRepository
+ ) {
+ self.noticeRepository = noticeRepository
+ }
+
+ public func execute() -> Single {
+ return noticeRepository.fetchNoticeIDList()
+ }
+}
diff --git a/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticePopupUseCaseImpl.swift b/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticePopupUseCaseImpl.swift
new file mode 100644
index 000000000..2aae1fa20
--- /dev/null
+++ b/Projects/Domains/NoticeDomain/Sources/UseCase/FetchNoticePopupUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import Foundation
+import NoticeDomainInterface
+import RxSwift
+
+public struct FetchNoticePopupUseCaseImpl: FetchNoticePopupUseCase {
+ private let noticeRepository: any NoticeRepository
+
+ public init(
+ noticeRepository: NoticeRepository
+ ) {
+ self.noticeRepository = noticeRepository
+ }
+
+ public func execute() -> Single<[FetchNoticeEntity]> {
+ return noticeRepository.fetchNoticePopup()
+ }
+}
diff --git a/Projects/Domains/NoticeDomain/Testing/FetchNoticeAllUseCaseStub.swift b/Projects/Domains/NoticeDomain/Testing/FetchNoticeAllUseCaseStub.swift
new file mode 100644
index 000000000..80389e2f7
--- /dev/null
+++ b/Projects/Domains/NoticeDomain/Testing/FetchNoticeAllUseCaseStub.swift
@@ -0,0 +1,35 @@
+import Foundation
+import NoticeDomainInterface
+import RxSwift
+
+public struct FetchNoticeAllUseCaseStub: FetchNoticeAllUseCase {
+ public func execute() -> Single<[FetchNoticeEntity]> {
+ let title1 = "공지사항 두줄인 경우 공지사항 두줄인 경우 공지사항 두줄인 경우 공지사항 두줄인 경우"
+ let title2 = "왁타버스 뮤직 2.0 업데이트"
+ let content2 =
+ "공지사항 내용이 나옵니다.\n위아래 여백에 맞춰 답변 길이가 유동적으로 바뀝니다.\n\n자주 묻는 질문 답변이 나옵니다.\n위아래 여백에 맞춰 답변 길이가 유동적으로 바뀝니다."
+ let stubs = [
+ FetchNoticeEntity(
+ id: 99992,
+ category: "카테고리1",
+ title: title1,
+ content: "",
+ thumbnail: .init(url: "", link: ""),
+ origins: [],
+ createdAt: 1
+ ),
+ FetchNoticeEntity(
+ id: 99993,
+ category: "카테고리2",
+ title: title2,
+ content: "",
+ thumbnail: .init(url: "", link: ""),
+ origins: [],
+ createdAt: 2
+ )
+ ]
+ return .just(stubs)
+ }
+
+ public init() {}
+}
diff --git a/Projects/Domains/NoticeDomain/Testing/FetchNoticeCategoriesUseCaseStub.swift b/Projects/Domains/NoticeDomain/Testing/FetchNoticeCategoriesUseCaseStub.swift
new file mode 100644
index 000000000..27833b9d0
--- /dev/null
+++ b/Projects/Domains/NoticeDomain/Testing/FetchNoticeCategoriesUseCaseStub.swift
@@ -0,0 +1,9 @@
+import Foundation
+import NoticeDomainInterface
+import RxSwift
+
+public struct FetchNoticeCategoriesUseCaseStub: FetchNoticeCategoriesUseCase {
+ public func execute() -> Single {
+ return .just(FetchNoticeCategoriesEntity(categories: []))
+ }
+}
diff --git a/Projects/Domains/NoticeDomain/Tests/NoticeDomainTest.swift b/Projects/Domains/NoticeDomain/Tests/NoticeDomainTest.swift
new file mode 100644
index 000000000..c048beb6f
--- /dev/null
+++ b/Projects/Domains/NoticeDomain/Tests/NoticeDomainTest.swift
@@ -0,0 +1,11 @@
+import XCTest
+
+final class NoticeDomainTests: XCTestCase {
+ override func setUpWithError() throws {}
+
+ override func tearDownWithError() throws {}
+
+ func testExample() {
+ XCTAssertEqual(1, 1)
+ }
+}
diff --git a/Projects/Domains/NotificationDomain/Interface/DataSource/RemoteNotificationDataSource.swift b/Projects/Domains/NotificationDomain/Interface/DataSource/RemoteNotificationDataSource.swift
new file mode 100644
index 000000000..8b1c6224c
--- /dev/null
+++ b/Projects/Domains/NotificationDomain/Interface/DataSource/RemoteNotificationDataSource.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol RemoteNotificationDataSource {
+ func updateNotificationToken(type: NotificationUpdateType) -> Completable
+}
diff --git a/Projects/Domains/NotificationDomain/Interface/Enum/NotificationUpdateType.swift b/Projects/Domains/NotificationDomain/Interface/Enum/NotificationUpdateType.swift
new file mode 100644
index 000000000..7e2598b95
--- /dev/null
+++ b/Projects/Domains/NotificationDomain/Interface/Enum/NotificationUpdateType.swift
@@ -0,0 +1,6 @@
+import Foundation
+
+public enum NotificationUpdateType: String {
+ case update
+ case delete
+}
diff --git a/Projects/Domains/NotificationDomain/Interface/Repository/NotificationRepository.swift b/Projects/Domains/NotificationDomain/Interface/Repository/NotificationRepository.swift
new file mode 100644
index 000000000..9f697805a
--- /dev/null
+++ b/Projects/Domains/NotificationDomain/Interface/Repository/NotificationRepository.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol NotificationRepository {
+ func updateNotificationToken(type: NotificationUpdateType) -> Completable
+}
diff --git a/Projects/Domains/NotificationDomain/Interface/UpdateNotificationTokenUseCaseSpy.swift b/Projects/Domains/NotificationDomain/Interface/UpdateNotificationTokenUseCaseSpy.swift
new file mode 100644
index 000000000..966df85b0
--- /dev/null
+++ b/Projects/Domains/NotificationDomain/Interface/UpdateNotificationTokenUseCaseSpy.swift
@@ -0,0 +1,13 @@
+import Foundation
+import RxSwift
+
+public struct UpdateNotificationTokenUseCaseSpy: UpdateNotificationTokenUseCase {
+ public func execute(type: NotificationUpdateType) -> Completable {
+ Completable.create { observer in
+ observer(.completed)
+ return Disposables.create()
+ }
+ }
+
+ public init() {}
+}
diff --git a/Projects/Domains/NotificationDomain/Interface/UseCase/UpdateNotificationTokenUseCase.swift b/Projects/Domains/NotificationDomain/Interface/UseCase/UpdateNotificationTokenUseCase.swift
new file mode 100644
index 000000000..fd6e268a8
--- /dev/null
+++ b/Projects/Domains/NotificationDomain/Interface/UseCase/UpdateNotificationTokenUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol UpdateNotificationTokenUseCase {
+ func execute(type: NotificationUpdateType) -> Completable
+}
diff --git a/Projects/Domains/NotificationDomain/Project.swift b/Projects/Domains/NotificationDomain/Project.swift
new file mode 100644
index 000000000..eda88e5a1
--- /dev/null
+++ b/Projects/Domains/NotificationDomain/Project.swift
@@ -0,0 +1,22 @@
+import DependencyPlugin
+import ProjectDescription
+import ProjectDescriptionHelpers
+
+let project = Project.module(
+ name: ModulePaths.Domain.NotificationDomain.rawValue,
+ targets: [
+ .interface(
+ module: .domain(.NotificationDomain),
+ dependencies: [
+ .domain(target: .BaseDomain, type: .interface)
+ ]
+ ),
+ .implements(
+ module: .domain(.NotificationDomain),
+ dependencies: [
+ .domain(target: .BaseDomain),
+ .domain(target: .NotificationDomain, type: .interface)
+ ]
+ )
+ ]
+)
diff --git a/Projects/Domains/NotificationDomain/Sources/API/NotificationAPI.swift b/Projects/Domains/NotificationDomain/Sources/API/NotificationAPI.swift
new file mode 100644
index 000000000..690611f0e
--- /dev/null
+++ b/Projects/Domains/NotificationDomain/Sources/API/NotificationAPI.swift
@@ -0,0 +1,63 @@
+import BaseDomain
+import ErrorModule
+import Foundation
+import Moya
+import NotificationDomainInterface
+
+public enum NotificationAPI {
+ case updateNotificationToken(type: NotificationUpdateType)
+}
+
+extension NotificationAPI: WMAPI {
+ public var domain: WMDomain {
+ return .notification
+ }
+
+ public var urlPath: String {
+ switch self {
+ case .updateNotificationToken:
+ return "/token"
+ }
+ }
+
+ public var method: Moya.Method {
+ switch self {
+ case let .updateNotificationToken(type):
+ return type == .update ? .put : .delete
+ }
+ }
+
+ public var task: Moya.Task {
+ switch self {
+ case let .updateNotificationToken(type):
+ return .requestPlain
+ }
+ }
+
+ public var jwtTokenType: JwtTokenType {
+ switch self {
+ case .updateNotificationToken:
+ return .accessToken
+ }
+ }
+
+ public var baseInfoTypes: [BaseInfoType] {
+ switch self {
+ case let .updateNotificationToken(type):
+ return type == .update ? [.deviceID, .pushToken] : [.deviceID]
+ }
+ }
+
+ public var errorMap: [Int: WMError] {
+ switch self {
+ default:
+ return [
+ 400: .badRequest,
+ 401: .tokenExpired,
+ 404: .notFound,
+ 429: .tooManyRequest,
+ 500: .internalServerError
+ ]
+ }
+ }
+}
diff --git a/Projects/Domains/NotificationDomain/Sources/DataSource/RemoteNotificationDataSourceImpl.swift b/Projects/Domains/NotificationDomain/Sources/DataSource/RemoteNotificationDataSourceImpl.swift
new file mode 100644
index 000000000..0a2451faa
--- /dev/null
+++ b/Projects/Domains/NotificationDomain/Sources/DataSource/RemoteNotificationDataSourceImpl.swift
@@ -0,0 +1,13 @@
+import BaseDomain
+import Foundation
+import NotificationDomainInterface
+import RxSwift
+
+public final class RemoteNotificationDataSourceImpl:
+ BaseRemoteDataSource,
+ RemoteNotificationDataSource {
+ public func updateNotificationToken(type: NotificationUpdateType) -> Completable {
+ request(.updateNotificationToken(type: type))
+ .asCompletable()
+ }
+}
diff --git a/Projects/Domains/NotificationDomain/Sources/Repository/NotificationRepositoryImpl.swift b/Projects/Domains/NotificationDomain/Sources/Repository/NotificationRepositoryImpl.swift
new file mode 100644
index 000000000..ceb0d0669
--- /dev/null
+++ b/Projects/Domains/NotificationDomain/Sources/Repository/NotificationRepositoryImpl.swift
@@ -0,0 +1,16 @@
+import NotificationDomainInterface
+import RxSwift
+
+public final class NotificationRepositoryImpl: NotificationRepository {
+ private let remoteNotificationDataSource: any RemoteNotificationDataSource
+
+ public init(
+ remoteNotificationDataSource: RemoteNotificationDataSource
+ ) {
+ self.remoteNotificationDataSource = remoteNotificationDataSource
+ }
+
+ public func updateNotificationToken(type: NotificationUpdateType) -> Completable {
+ remoteNotificationDataSource.updateNotificationToken(type: type)
+ }
+}
diff --git a/Projects/Domains/NotificationDomain/Sources/UseCase/UpdateNotificationTokenUseCaseImpl.swift b/Projects/Domains/NotificationDomain/Sources/UseCase/UpdateNotificationTokenUseCaseImpl.swift
new file mode 100644
index 000000000..710dabcb8
--- /dev/null
+++ b/Projects/Domains/NotificationDomain/Sources/UseCase/UpdateNotificationTokenUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import Foundation
+import NotificationDomainInterface
+import RxSwift
+
+public struct UpdateNotificationTokenUseCaseImpl: UpdateNotificationTokenUseCase {
+ private let notificationRepository: any NotificationRepository
+
+ public init(
+ notificationRepository: NotificationRepository
+ ) {
+ self.notificationRepository = notificationRepository
+ }
+
+ public func execute(type: NotificationUpdateType) -> Completable {
+ notificationRepository.updateNotificationToken(type: type)
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/DataSource/RemotePlaylistDataSource.swift b/Projects/Domains/PlaylistDomain/Interface/DataSource/RemotePlaylistDataSource.swift
new file mode 100644
index 000000000..b4130c423
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/DataSource/RemotePlaylistDataSource.swift
@@ -0,0 +1,22 @@
+import BaseDomainInterface
+import Foundation
+import RxSwift
+import SongsDomainInterface
+
+public protocol RemotePlaylistDataSource {
+ func fetchRecommendPlaylist() -> Single<[RecommendPlaylistEntity]>
+ func fetchPlaylistDetail(id: String, type: PlaylistType) -> Single
+ func fetchWMPlaylistDetail(id: String) -> Single
+ func updateTitleAndPrivate(key: String, title: String?, isPrivate: Bool?) -> Completable
+ func createPlaylist(title: String) -> Single
+ func fetchPlaylistSongs(key: String) -> Single<[SongEntity]>
+ func updatePlaylist(key: String, songs: [String]) -> Completable
+ func addSongIntoPlaylist(key: String, songs: [String]) -> Single
+ func removeSongs(key: String, songs: [String]) -> Completable
+ func uploadDefaultImage(key: String, model: String) -> Completable
+ func subscribePlaylist(key: String, isSubscribing: Bool) -> Completable
+ func checkSubscription(key: String) -> Single
+ func requestCustomImageURL(key: String, imageSize: Int) -> Single
+ func uploadCustomImage(presignedURL: String, data: Data) -> Completable
+ func requestPlaylistOwnerID(key: String) -> Single
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/Entity/AddSongEntity.swift b/Projects/Domains/PlaylistDomain/Interface/Entity/AddSongEntity.swift
new file mode 100644
index 000000000..c39da12f6
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/Entity/AddSongEntity.swift
@@ -0,0 +1,14 @@
+import Foundation
+
+public struct AddSongEntity: Equatable {
+ public init(
+ addedSongCount: Int,
+ duplicated: Bool
+ ) {
+ self.addedSongCount = addedSongCount
+ self.duplicated = duplicated
+ }
+
+ public let addedSongCount: Int
+ public let duplicated: Bool
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/Entity/CustomImageURLEntity.swift b/Projects/Domains/PlaylistDomain/Interface/Entity/CustomImageURLEntity.swift
new file mode 100644
index 000000000..ab60213df
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/Entity/CustomImageURLEntity.swift
@@ -0,0 +1,8 @@
+public struct CustomImageURLEntity {
+ public let imageURL, presignedURL: String
+
+ public init(imageURL: String, presignedURL: String) {
+ self.imageURL = imageURL
+ self.presignedURL = presignedURL
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/Entity/PlayListDetailEntity.swift b/Projects/Domains/PlaylistDomain/Interface/Entity/PlayListDetailEntity.swift
new file mode 100644
index 000000000..8a589044a
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/Entity/PlayListDetailEntity.swift
@@ -0,0 +1,28 @@
+import Foundation
+import SongsDomainInterface
+
+public struct PlaylistDetailEntity: Equatable {
+ public init(
+ key: String,
+ title: String,
+ songs: [SongEntity],
+ image: String,
+ `private`: Bool,
+ userId: String,
+ userName: String
+
+ ) {
+ self.key = key
+ self.title = title
+ self.songs = songs
+ self.image = image
+ self.private = `private`
+ self.userId = userId
+ self.userName = userName
+ }
+
+ public let key, title: String
+ public var songs: [SongEntity]
+ public let image, userId, userName: String
+ public var `private`: Bool
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/Entity/PlaylistBaseEntity.swift b/Projects/Domains/PlaylistDomain/Interface/Entity/PlaylistBaseEntity.swift
new file mode 100644
index 000000000..dfc1c778e
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/Entity/PlaylistBaseEntity.swift
@@ -0,0 +1,15 @@
+
+
+import Foundation
+
+public struct PlaylistBaseEntity: Equatable {
+ public init(
+ key: String,
+ image: String
+ ) {
+ self.key = key
+ self.image = image
+ }
+
+ public let key, image: String
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/Entity/PlaylistOwnerIDEntity.swift b/Projects/Domains/PlaylistDomain/Interface/Entity/PlaylistOwnerIDEntity.swift
new file mode 100644
index 000000000..bdb18d34c
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/Entity/PlaylistOwnerIDEntity.swift
@@ -0,0 +1,11 @@
+import Foundation
+
+public struct PlaylistOwnerIDEntity {
+ public init(
+ ownerID: String
+ ) {
+ self.ownerID = ownerID
+ }
+
+ public let ownerID: String
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/Entity/RecommendPlaylistEntity.swift b/Projects/Domains/PlaylistDomain/Interface/Entity/RecommendPlaylistEntity.swift
new file mode 100644
index 000000000..7fdcb15c4
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/Entity/RecommendPlaylistEntity.swift
@@ -0,0 +1,30 @@
+import Foundation
+
+public struct RecommendPlaylistEntity: Hashable, Equatable {
+ public init(
+ key: String,
+ title: String,
+ image: String,
+ `private`: Bool,
+ count: Int
+ ) {
+ self.key = key
+ self.title = title
+ self.image = image
+ self.private = `private`
+ self.count = count
+ }
+
+ public let key, title, image: String
+ public let `private`: Bool
+ public let count: Int
+ private let id = UUID()
+
+ public func hash(into hasher: inout Hasher) {
+ hasher.combine(id)
+ }
+
+ public static func == (_ lhs: Self, _ rhs: Self) -> Bool {
+ lhs.id == rhs.id
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/Entity/WMPlaylistDetailEntity.swift b/Projects/Domains/PlaylistDomain/Interface/Entity/WMPlaylistDetailEntity.swift
new file mode 100644
index 000000000..e435b490a
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/Entity/WMPlaylistDetailEntity.swift
@@ -0,0 +1,21 @@
+import Foundation
+import SongsDomainInterface
+
+public struct WMPlaylistDetailEntity: Equatable {
+ public init(
+ key: String,
+ title: String,
+ songs: [SongEntity],
+ image: String,
+ playlistURL: String
+ ) {
+ self.key = key
+ self.title = title
+ self.songs = songs
+ self.image = image
+ self.playlistURL = playlistURL
+ }
+
+ public let key, title, image, playlistURL: String
+ public var songs: [SongEntity]
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/Enum/PlaylistType.swift b/Projects/Domains/PlaylistDomain/Interface/Enum/PlaylistType.swift
new file mode 100644
index 000000000..1589dfb79
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/Enum/PlaylistType.swift
@@ -0,0 +1,7 @@
+import Foundation
+
+public enum PlaylistType {
+ case unknown
+ case wmRecommend
+ case my
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/Repository/PlaylistRepository.swift b/Projects/Domains/PlaylistDomain/Interface/Repository/PlaylistRepository.swift
new file mode 100644
index 000000000..c8d0e9eea
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/Repository/PlaylistRepository.swift
@@ -0,0 +1,22 @@
+import BaseDomainInterface
+import Foundation
+import RxSwift
+import SongsDomainInterface
+
+public protocol PlaylistRepository {
+ func fetchRecommendPlaylist() -> Single<[RecommendPlaylistEntity]>
+ func fetchPlaylistDetail(id: String, type: PlaylistType) -> Single
+ func fetchWMPlaylistDetail(id: String) -> Single
+ func updateTitleAndPrivate(key: String, title: String?, isPrivate: Bool?) -> Completable
+ func createPlaylist(title: String) -> Single
+ func fetchPlaylistSongs(key: String) -> Single<[SongEntity]>
+ func updatePlaylist(key: String, songs: [String]) -> Completable
+ func addSongIntoPlaylist(key: String, songs: [String]) -> Single
+ func removeSongs(key: String, songs: [String]) -> Completable
+ func uploadDefaultImage(key: String, model: String) -> Completable
+ func subscribePlaylist(key: String, isSubscribing: Bool) -> Completable
+ func checkSubscription(key: String) -> Single
+ func requestCustomImageURL(key: String, imageSize: Int) -> Single
+ func uploadCustomImage(presignedURL: String, data: Data) -> Completable
+ func requestPlaylistOwnerID(key: String) -> Single
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/AddSongIntoPlaylistUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/AddSongIntoPlaylistUseCase.swift
new file mode 100644
index 000000000..ef690e71c
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/AddSongIntoPlaylistUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol AddSongIntoPlaylistUseCase {
+ func execute(key: String, songs: [String]) -> Single
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/CheckSubscriptionUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/CheckSubscriptionUseCase.swift
new file mode 100644
index 000000000..8a0c9bc3a
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/CheckSubscriptionUseCase.swift
@@ -0,0 +1,7 @@
+import BaseDomainInterface
+import Foundation
+import RxSwift
+
+public protocol CheckSubscriptionUseCase {
+ func execute(key: String) -> Single
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/CreatePlaylistUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/CreatePlaylistUseCase.swift
new file mode 100644
index 000000000..b7b6f146a
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/CreatePlaylistUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol CreatePlaylistUseCase {
+ func execute(title: String) -> Single
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchPlaylistDetailUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchPlaylistDetailUseCase.swift
new file mode 100644
index 000000000..eb15b13a8
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchPlaylistDetailUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol FetchPlaylistDetailUseCase {
+ func execute(id: String, type: PlaylistType) -> Single
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchPlaylistSongsUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchPlaylistSongsUseCase.swift
new file mode 100644
index 000000000..fc32cc722
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchPlaylistSongsUseCase.swift
@@ -0,0 +1,8 @@
+import BaseDomainInterface
+import Foundation
+import RxSwift
+import SongsDomainInterface
+
+public protocol FetchPlaylistSongsUseCase {
+ func execute(key: String) -> Single<[SongEntity]>
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchRecommendPlaylistUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchRecommendPlaylistUseCase.swift
new file mode 100644
index 000000000..292d15ae9
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchRecommendPlaylistUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol FetchRecommendPlaylistUseCase {
+ func execute() -> Single<[RecommendPlaylistEntity]>
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchWMPlaylistDetailUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchWMPlaylistDetailUseCase.swift
new file mode 100644
index 000000000..4f3a3ad50
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/FetchWMPlaylistDetailUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol FetchWMPlaylistDetailUseCase {
+ func execute(id: String) -> Single
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/RemoveSongsUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/RemoveSongsUseCase.swift
new file mode 100644
index 000000000..43d13f61b
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/RemoveSongsUseCase.swift
@@ -0,0 +1,7 @@
+import BaseDomainInterface
+import Foundation
+import RxSwift
+
+public protocol RemoveSongsUseCase {
+ func execute(key: String, songs: [String]) -> Completable
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/RequestCustomImageURLUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/RequestCustomImageURLUseCase.swift
new file mode 100644
index 000000000..df1db7d84
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/RequestCustomImageURLUseCase.swift
@@ -0,0 +1,7 @@
+import BaseDomainInterface
+import Foundation
+import RxSwift
+
+public protocol RequestCustomImageURLUseCase {
+ func execute(key: String, data: Data) -> Completable
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/RequestPlaylistOwnerIDUsecase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/RequestPlaylistOwnerIDUsecase.swift
new file mode 100644
index 000000000..2226011db
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/RequestPlaylistOwnerIDUsecase.swift
@@ -0,0 +1,7 @@
+import BaseDomainInterface
+import Foundation
+import RxSwift
+
+public protocol RequestPlaylistOwnerIDUsecase {
+ func execute(key: String) -> Single
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/SubscribePlaylistUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/SubscribePlaylistUseCase.swift
new file mode 100644
index 000000000..3e3707c0e
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/SubscribePlaylistUseCase.swift
@@ -0,0 +1,5 @@
+import RxSwift
+
+public protocol SubscribePlaylistUseCase {
+ func execute(key: String, isSubscribing: Bool) -> Completable
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/UpdatePlaylistUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/UpdatePlaylistUseCase.swift
new file mode 100644
index 000000000..043199681
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/UpdatePlaylistUseCase.swift
@@ -0,0 +1,7 @@
+import BaseDomainInterface
+import Foundation
+import RxSwift
+
+public protocol UpdatePlaylistUseCase {
+ func execute(key: String, songs: [String]) -> Completable
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/UpdateTitleAndPrivateUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/UpdateTitleAndPrivateUseCase.swift
new file mode 100644
index 000000000..d86527627
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/UpdateTitleAndPrivateUseCase.swift
@@ -0,0 +1,7 @@
+import BaseDomainInterface
+import Foundation
+import RxSwift
+
+public protocol UpdateTitleAndPrivateUseCase {
+ func execute(key: String, title: String?, isPrivate: Bool?) -> Completable
+}
diff --git a/Projects/Domains/PlaylistDomain/Interface/UseCase/UploadPlaylistImageUseCase.swift b/Projects/Domains/PlaylistDomain/Interface/UseCase/UploadPlaylistImageUseCase.swift
new file mode 100644
index 000000000..afead3e3b
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Interface/UseCase/UploadPlaylistImageUseCase.swift
@@ -0,0 +1,7 @@
+import BaseDomainInterface
+import Foundation
+import RxSwift
+
+public protocol UploadDefaultPlaylistImageUseCase {
+ func execute(key: String, model: String) -> Completable
+}
diff --git a/Projects/Domains/PlaylistDomain/Project.swift b/Projects/Domains/PlaylistDomain/Project.swift
new file mode 100644
index 000000000..bedd03195
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Project.swift
@@ -0,0 +1,31 @@
+import DependencyPlugin
+import ProjectDescription
+import ProjectDescriptionHelpers
+
+let project = Project.module(
+ name: ModulePaths.Domain.PlaylistDomain.rawValue,
+ targets: [
+ .interface(
+ module: .domain(.PlaylistDomain),
+ dependencies: [
+ .domain(target: .BaseDomain, type: .interface),
+ .domain(target: .SongsDomain, type: .interface)
+ ]
+ ),
+ .implements(
+ module: .domain(.PlaylistDomain),
+ dependencies: [
+ .domain(target: .BaseDomain),
+ .domain(target: .SongsDomain),
+ .domain(target: .PlaylistDomain, type: .interface)
+ ]
+ ),
+ .tests(
+ module: .domain(.PlaylistDomain),
+ dependencies: [.domain(target: .PlaylistDomain)]
+ ),
+ .testing(module: .domain(.PlaylistDomain), dependencies: [
+ .domain(target: .PlaylistDomain, type: .interface)
+ ])
+ ]
+)
diff --git a/Projects/Domains/PlaylistDomain/Sources/API/CustomPlaylistImageAPI.swift b/Projects/Domains/PlaylistDomain/Sources/API/CustomPlaylistImageAPI.swift
new file mode 100644
index 000000000..7ce234005
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/API/CustomPlaylistImageAPI.swift
@@ -0,0 +1,43 @@
+import Foundation
+import Moya
+
+enum CustomPlaylistImageAPI {
+ case uploadCustomImage(url: String, data: Data)
+}
+
+extension CustomPlaylistImageAPI: TargetType {
+ var baseURL: URL {
+ switch self {
+ case let .uploadCustomImage(url, _):
+ return URL(string: url)!
+ }
+ }
+
+ var path: String {
+ return ""
+ }
+
+ var method: Moya.Method {
+ return .put
+ }
+
+ // var sampleData: Data { ... }
+
+ var task: Task {
+ switch self {
+ case let .uploadCustomImage(url: _, data):
+ return .requestData(data)
+ }
+ }
+
+ var headers: [String: String]? {
+ switch self {
+ case let .uploadCustomImage(url: _, data):
+ return ["Content-Type": "image/jpeg", " Contnet-Length": "\(data.count)"]
+ }
+ }
+
+ var validationType: ValidationType {
+ return .successCodes
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/API/PlaylistAPI.swift b/Projects/Domains/PlaylistDomain/Sources/API/PlaylistAPI.swift
new file mode 100644
index 000000000..9262992a1
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/API/PlaylistAPI.swift
@@ -0,0 +1,154 @@
+import BaseDomain
+import BaseDomainInterface
+import ErrorModule
+import Foundation
+import KeychainModule
+import Moya
+import PlaylistDomainInterface
+
+public enum PlaylistAPI {
+ case fetchPlaylistDetail(id: String, type: PlaylistType) // 플리 상세 불러오기
+ case fetchWMPlaylistDetail(id: String) // 왁뮤 플리 상세 불러오기
+ case updateTitleAndPrivate(key: String, title: String?, isPrivate: Bool?) // title and private 업데이트
+ case createPlaylist(title: String) // 플리 생성
+ case fetchPlaylistSongs(key: String) // 전체 재생 시 곡 데이터만 가져오기
+ case addSongIntoPlaylist(key: String, songs: [String]) // 곡 추가
+ case updatePlaylist(key: String, songs: [String]) // 최종 저장
+ case removeSongs(key: String, songs: [String]) // 곡 삭제
+ case uploadDefaultImage(key: String, imageName: String) // 플레이리스트 default 이미지 업로드
+ case requestCustomImageURL(key: String, imageSize: Int) // 커스텀 이미지를 저장할 presigned url 받아오기
+ case subscribePlaylist(key: String, isSubscribing: Bool) // 플레이리스트 구독하기 / 구독 취소하기
+ case checkSubscription(key: String)
+ case fetchRecommendPlaylist // 추천 플리 불러오기
+ case requestPlaylistOwnerID(key: String) // playlist ownerId 요청하기
+}
+
+extension PlaylistAPI: WMAPI {
+ public var domain: WMDomain {
+ return .playlist
+ }
+
+ public var urlPath: String {
+ switch self {
+ case .fetchRecommendPlaylist:
+ return "/recommend/list"
+
+ case let .fetchPlaylistDetail(id: id, type: type):
+ return "/\(id)"
+
+ case let .fetchWMPlaylistDetail(id: id):
+ return "/recommend/\(id)"
+
+ case let .updateTitleAndPrivate(key: key, _, _):
+ return "/\(key)"
+
+ case .createPlaylist:
+ return "/create"
+
+ case let .fetchPlaylistSongs(key: key), let .addSongIntoPlaylist(key: key, _), let .updatePlaylist(key: key, _),
+ let .removeSongs(key: key, _):
+ return "/\(key)/songs"
+
+ case let .uploadDefaultImage(key: key, _):
+ return "/\(key)/image"
+
+ case let .requestCustomImageURL(key, _):
+ return "/\(key)/image/upload"
+
+ case let .subscribePlaylist(key, _), let .checkSubscription(key):
+ return "/\(key)/subscription"
+ case let .requestPlaylistOwnerID(key):
+ return "/\(key)/owner"
+ }
+ }
+
+ public var method: Moya.Method {
+ switch self {
+ case .fetchRecommendPlaylist, .fetchPlaylistDetail, .fetchWMPlaylistDetail, .fetchPlaylistSongs,
+ .checkSubscription,
+ .requestPlaylistOwnerID:
+ return .get
+
+ case .createPlaylist, .addSongIntoPlaylist, .requestCustomImageURL:
+ return .post
+
+ case let .subscribePlaylist(_, isSubscribing):
+ return isSubscribing ? .delete : .post
+
+ case .removeSongs:
+ return .delete
+
+ case .updatePlaylist, .updateTitleAndPrivate, .uploadDefaultImage:
+ return .patch
+ }
+ }
+
+ public var task: Moya.Task {
+ switch self {
+ case .fetchRecommendPlaylist, .fetchPlaylistDetail, .fetchWMPlaylistDetail, .fetchPlaylistSongs,
+ .subscribePlaylist, .checkSubscription,
+ .requestPlaylistOwnerID:
+ return .requestPlain
+
+ case let .updateTitleAndPrivate(_, title: title, isPrivate: isPrivate):
+ return .requestJSONEncodable(TitleAndPrivateRequsetDTO(title: title, private: isPrivate))
+
+ case let .createPlaylist(title: title):
+ return .requestJSONEncodable(CreatePlaylistRequsetDTO(title: title))
+
+ case let .addSongIntoPlaylist(_, songs: songs):
+ return .requestJSONEncodable(AddSongRequestDTO(songIds: songs))
+
+ case let .updatePlaylist(_, songs: songs):
+ return .requestJSONEncodable(SongsKeyRequestDTO(songIds: songs))
+
+ case let .removeSongs(_, songs: songs):
+ return .requestParameters(
+ parameters: ["songIds": songs.joined(separator: ",")],
+ encoding: URLEncoding.queryString
+ )
+
+ case let .uploadDefaultImage(_, imageName):
+ return .requestJSONEncodable(DefaultImageRequestDTO(imageName: imageName))
+
+ case let .requestCustomImageURL(key, imageSize):
+ return .requestParameters(
+ parameters: ["key": key, "contentLength": imageSize],
+ encoding: URLEncoding.queryString
+ )
+ }
+ }
+
+ public var headers: [String: String]? {
+ return ["Content-Type": "application/json"]
+ }
+
+ public var jwtTokenType: JwtTokenType {
+ switch self {
+ case .fetchRecommendPlaylist, .fetchWMPlaylistDetail:
+ return .none
+
+ case let .fetchPlaylistDetail(_, type):
+ return type == .my ? .accessToken : .none
+
+ case .createPlaylist, .fetchPlaylistSongs, .updatePlaylist, .addSongIntoPlaylist, .requestCustomImageURL,
+ .removeSongs, .updateTitleAndPrivate, .uploadDefaultImage, .subscribePlaylist,
+ .checkSubscription, .requestPlaylistOwnerID:
+ return .accessToken
+ }
+ }
+
+ public var errorMap: [Int: WMError] {
+ switch self {
+ default:
+ return [
+ 400: .badRequest,
+ 401: .tokenExpired,
+ 404: .notFound,
+ 409: .conflict,
+ 429: .tooManyRequest,
+ 500: .internalServerError
+ ]
+ }
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/DataSource/RemotePlaylistDataSourceImpl.swift b/Projects/Domains/PlaylistDomain/Sources/DataSource/RemotePlaylistDataSourceImpl.swift
new file mode 100644
index 000000000..b53b551a4
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/DataSource/RemotePlaylistDataSourceImpl.swift
@@ -0,0 +1,97 @@
+import BaseDomain
+import BaseDomainInterface
+import Foundation
+import Moya
+import PlaylistDomainInterface
+import RxSwift
+import SongsDomain
+import SongsDomainInterface
+
+public final class RemotePlaylistDataSourceImpl: BaseRemoteDataSource, RemotePlaylistDataSource {
+ private let provider = MoyaProvider()
+
+ public func fetchRecommendPlaylist() -> Single<[RecommendPlaylistEntity]> {
+ request(.fetchRecommendPlaylist)
+ .map([SingleRecommendPlayListResponseDTO].self)
+ .map { $0.map { $0.toDomain() }}
+ }
+
+ public func fetchPlaylistDetail(id: String, type: PlaylistType) -> Single {
+ request(.fetchPlaylistDetail(id: id, type: type))
+ .map(SinglePlayListDetailResponseDTO.self)
+ .map { $0.toDomain() }
+ }
+
+ public func fetchWMPlaylistDetail(id: String) -> Single {
+ request(.fetchWMPlaylistDetail(id: id))
+ .map(WMPlaylistDetailResponseDTO.self)
+ .map { $0.toDomain() }
+ }
+
+ public func updateTitleAndPrivate(key: String, title: String?, isPrivate: Bool?) -> Completable {
+ request(.updateTitleAndPrivate(key: key, title: title, isPrivate: isPrivate))
+ .asCompletable()
+ }
+
+ public func createPlaylist(title: String) -> Single {
+ request(.createPlaylist(title: title))
+ .map(PlayListBaseResponseDTO.self)
+ .map { $0.toDomain() }
+ }
+
+ public func fetchPlaylistSongs(key: String) -> Single<[SongEntity]> {
+ request(.fetchPlaylistSongs(key: key))
+ .map([SingleSongResponseDTO].self)
+ .map { $0.map { $0.toDomain() } }
+ }
+
+ public func updatePlaylist(key: String, songs: [String]) -> Completable {
+ request(.updatePlaylist(key: key, songs: songs))
+ .asCompletable()
+ }
+
+ public func addSongIntoPlaylist(key: String, songs: [String]) -> Single {
+ request(.addSongIntoPlaylist(key: key, songs: songs))
+ .map(AddSongResponseDTO.self)
+ .map { $0.toDomain() }
+ }
+
+ public func removeSongs(key: String, songs: [String]) -> Completable {
+ request(.removeSongs(key: key, songs: songs))
+ .asCompletable()
+ }
+
+ public func uploadDefaultImage(key: String, model: String) -> Completable {
+ request(.uploadDefaultImage(key: key, imageName: model))
+ .asCompletable()
+ }
+
+ public func subscribePlaylist(key: String, isSubscribing: Bool) -> Completable {
+ request(.subscribePlaylist(key: key, isSubscribing: isSubscribing))
+ .asCompletable()
+ }
+
+ public func checkSubscription(key: String) -> Single {
+ request(.checkSubscription(key: key))
+ .map(CheckSubscriptionResponseDTO.self)
+ .map { $0.data }
+ }
+
+ public func requestCustomImageURL(key: String, imageSize: Int) -> Single {
+ request(.requestCustomImageURL(key: key, imageSize: imageSize))
+ .map(CustomImageURLResponseDTO.self)
+ .map { $0.toDomain() }
+ }
+
+ public func uploadCustomImage(presignedURL: String, data: Data) -> Completable {
+ return provider.rx
+ .request(CustomPlaylistImageAPI.uploadCustomImage(url: presignedURL, data: data))
+ .asCompletable()
+ }
+
+ public func requestPlaylistOwnerID(key: String) -> Single {
+ return request(.requestPlaylistOwnerID(key: key))
+ .map(PlaylistOwnerIDResponseDTO.self)
+ .map { $0.toDomain() }
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/Repository/PlaylistRepositoryImpl.swift b/Projects/Domains/PlaylistDomain/Sources/Repository/PlaylistRepositoryImpl.swift
new file mode 100644
index 000000000..fd21dbf66
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/Repository/PlaylistRepositoryImpl.swift
@@ -0,0 +1,75 @@
+import BaseDomainInterface
+import Foundation
+import PlaylistDomainInterface
+import RxSwift
+import SongsDomainInterface
+
+public final class PlaylistRepositoryImpl: PlaylistRepository {
+ private let remotePlaylistDataSource: any RemotePlaylistDataSource
+
+ public init(
+ remotePlaylistDataSource: RemotePlaylistDataSource
+ ) {
+ self.remotePlaylistDataSource = remotePlaylistDataSource
+ }
+
+ public func fetchRecommendPlaylist() -> Single<[RecommendPlaylistEntity]> {
+ remotePlaylistDataSource.fetchRecommendPlaylist()
+ }
+
+ public func fetchPlaylistDetail(id: String, type: PlaylistType) -> Single {
+ remotePlaylistDataSource.fetchPlaylistDetail(id: id, type: type)
+ }
+
+ public func fetchWMPlaylistDetail(id: String) -> Single {
+ remotePlaylistDataSource.fetchWMPlaylistDetail(id: id)
+ }
+
+ public func updateTitleAndPrivate(key: String, title: String?, isPrivate: Bool?) -> Completable {
+ remotePlaylistDataSource.updateTitleAndPrivate(key: key, title: title, isPrivate: isPrivate)
+ }
+
+ public func createPlaylist(title: String) -> Single {
+ remotePlaylistDataSource.createPlaylist(title: title)
+ }
+
+ public func fetchPlaylistSongs(key: String) -> Single<[SongEntity]> {
+ remotePlaylistDataSource.fetchPlaylistSongs(key: key)
+ }
+
+ public func updatePlaylist(key: String, songs: [String]) -> Completable {
+ return remotePlaylistDataSource.updatePlaylist(key: key, songs: songs)
+ }
+
+ public func addSongIntoPlaylist(key: String, songs: [String]) -> Single {
+ remotePlaylistDataSource.addSongIntoPlaylist(key: key, songs: songs)
+ }
+
+ public func removeSongs(key: String, songs: [String]) -> Completable {
+ remotePlaylistDataSource.removeSongs(key: key, songs: songs)
+ }
+
+ public func uploadDefaultImage(key: String, model: String) -> Completable {
+ remotePlaylistDataSource.uploadDefaultImage(key: key, model: model)
+ }
+
+ public func subscribePlaylist(key: String, isSubscribing: Bool) -> Completable {
+ remotePlaylistDataSource.subscribePlaylist(key: key, isSubscribing: isSubscribing)
+ }
+
+ public func checkSubscription(key: String) -> Single {
+ remotePlaylistDataSource.checkSubscription(key: key)
+ }
+
+ public func requestCustomImageURL(key: String, imageSize: Int) -> Single {
+ remotePlaylistDataSource.requestCustomImageURL(key: key, imageSize: imageSize)
+ }
+
+ public func uploadCustomImage(presignedURL: String, data: Data) -> Completable {
+ remotePlaylistDataSource.uploadCustomImage(presignedURL: presignedURL, data: data)
+ }
+
+ public func requestPlaylistOwnerID(key: String) -> Single {
+ remotePlaylistDataSource.requestPlaylistOwnerID(key: key)
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/RequestDTO/AddSongRequestDTO.swift b/Projects/Domains/PlaylistDomain/Sources/RequestDTO/AddSongRequestDTO.swift
new file mode 100644
index 000000000..9e0e9f05b
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/RequestDTO/AddSongRequestDTO.swift
@@ -0,0 +1,5 @@
+import Foundation
+
+public struct AddSongRequestDTO: Encodable {
+ var songIds: [String]
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/RequestDTO/CreatePlaylistRequsetDTO.swift b/Projects/Domains/PlaylistDomain/Sources/RequestDTO/CreatePlaylistRequsetDTO.swift
new file mode 100644
index 000000000..5543dce81
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/RequestDTO/CreatePlaylistRequsetDTO.swift
@@ -0,0 +1,5 @@
+import Foundation
+
+public struct CreatePlaylistRequsetDTO: Encodable {
+ let title: String
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/RequestDTO/DefaultImageRequestDTO.swift b/Projects/Domains/PlaylistDomain/Sources/RequestDTO/DefaultImageRequestDTO.swift
new file mode 100644
index 000000000..026c2b111
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/RequestDTO/DefaultImageRequestDTO.swift
@@ -0,0 +1,5 @@
+import Foundation
+
+struct DefaultImageRequestDTO: Encodable {
+ let imageName: String
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/RequestDTO/SongsKeyRequestDTO.swift b/Projects/Domains/PlaylistDomain/Sources/RequestDTO/SongsKeyRequestDTO.swift
new file mode 100644
index 000000000..e92db1573
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/RequestDTO/SongsKeyRequestDTO.swift
@@ -0,0 +1,5 @@
+import Foundation
+
+public struct SongsKeyRequestDTO: Encodable {
+ var songIds: [String]
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/RequestDTO/TitleAndPrivateRequsetDTO.swift b/Projects/Domains/PlaylistDomain/Sources/RequestDTO/TitleAndPrivateRequsetDTO.swift
new file mode 100644
index 000000000..aa4429b46
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/RequestDTO/TitleAndPrivateRequsetDTO.swift
@@ -0,0 +1,6 @@
+import Foundation
+
+public struct TitleAndPrivateRequsetDTO: Encodable {
+ var title: String?
+ var `private`: Bool?
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/AddSongResponseDTO.swift b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/AddSongResponseDTO.swift
new file mode 100644
index 000000000..588e77d0a
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/AddSongResponseDTO.swift
@@ -0,0 +1,16 @@
+import Foundation
+import PlaylistDomainInterface
+
+public struct AddSongResponseDTO: Decodable {
+ public let addedSongCount: Int
+ public let isDuplicatedSongsExist: Bool
+}
+
+public extension AddSongResponseDTO {
+ func toDomain() -> AddSongEntity {
+ AddSongEntity(
+ addedSongCount: addedSongCount,
+ duplicated: isDuplicatedSongsExist
+ )
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/CheckSubscriptionResponseDTO.swift b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/CheckSubscriptionResponseDTO.swift
new file mode 100644
index 000000000..9f6dc8e38
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/CheckSubscriptionResponseDTO.swift
@@ -0,0 +1,6 @@
+import Foundation
+import PlaylistDomainInterface
+
+public struct CheckSubscriptionResponseDTO: Decodable {
+ public let data: Bool
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/CustomImageURLResponseDTO.swift b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/CustomImageURLResponseDTO.swift
new file mode 100644
index 000000000..291e413b2
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/CustomImageURLResponseDTO.swift
@@ -0,0 +1,17 @@
+import Foundation
+import PlaylistDomainInterface
+
+public struct CustomImageURLResponseDTO: Decodable {
+ public let imageURL, presignedURL: String
+
+ enum CodingKeys: String, CodingKey {
+ case imageURL = "imageUrl"
+ case presignedURL = "presignedUrl"
+ }
+}
+
+public extension CustomImageURLResponseDTO {
+ func toDomain() -> CustomImageURLEntity {
+ CustomImageURLEntity(imageURL: imageURL, presignedURL: presignedURL)
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/PlayListBaseResponseDTO.swift b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/PlayListBaseResponseDTO.swift
new file mode 100644
index 000000000..b5669226c
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/PlayListBaseResponseDTO.swift
@@ -0,0 +1,12 @@
+import Foundation
+import PlaylistDomainInterface
+
+public struct PlayListBaseResponseDTO: Decodable {
+ public let key, imageUrl: String
+}
+
+public extension PlayListBaseResponseDTO {
+ func toDomain() -> PlaylistBaseEntity {
+ PlaylistBaseEntity(key: key, image: imageUrl)
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/PlayListDetailResponseDTO.swift b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/PlayListDetailResponseDTO.swift
new file mode 100644
index 000000000..5d3cc6bbd
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/PlayListDetailResponseDTO.swift
@@ -0,0 +1,35 @@
+import Foundation
+import PlaylistDomainInterface
+import SongsDomain
+import SongsDomainInterface
+import Utility
+
+public struct SinglePlayListDetailResponseDTO: Decodable {
+ public let key: String?
+ public let title: String
+ public let songs: [SingleSongResponseDTO]?
+ public let imageUrl: String
+ public let `private`: Bool
+ public let user: SinglePlayListDetailResponseDTO.UserResponseDTO
+}
+
+public extension SinglePlayListDetailResponseDTO {
+ struct UserResponseDTO: Decodable {
+ public let handle: String
+ public let name: String
+ }
+}
+
+public extension SinglePlayListDetailResponseDTO {
+ func toDomain() -> PlaylistDetailEntity {
+ PlaylistDetailEntity(
+ key: key ?? "",
+ title: title,
+ songs: (songs ?? []).map { $0.toDomain() },
+ image: imageUrl,
+ private: `private`,
+ userId: user.handle,
+ userName: user.name
+ )
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/PlaylistOwnerIdResponseDTO.swift b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/PlaylistOwnerIdResponseDTO.swift
new file mode 100644
index 000000000..3264417bd
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/PlaylistOwnerIdResponseDTO.swift
@@ -0,0 +1,16 @@
+import Foundation
+import PlaylistDomainInterface
+
+public struct PlaylistOwnerIDResponseDTO: Decodable {
+ public let ownerID: String
+
+ enum CodingKeys: String, CodingKey {
+ case ownerID = "handle"
+ }
+}
+
+public extension PlaylistOwnerIDResponseDTO {
+ func toDomain() -> PlaylistOwnerIDEntity {
+ PlaylistOwnerIDEntity(ownerID: ownerID)
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/RecommendPlayListResponseDTO.swift b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/RecommendPlayListResponseDTO.swift
new file mode 100644
index 000000000..fa51ef443
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/RecommendPlayListResponseDTO.swift
@@ -0,0 +1,20 @@
+import Foundation
+import PlaylistDomainInterface
+
+public struct SingleRecommendPlayListResponseDTO: Decodable {
+ public let key, title, imageUrl: String
+ public let `private`: Bool
+ public let songCount: Int
+}
+
+public extension SingleRecommendPlayListResponseDTO {
+ func toDomain() -> RecommendPlaylistEntity {
+ RecommendPlaylistEntity(
+ key: key,
+ title: title,
+ image: imageUrl,
+ private: `private`,
+ count: songCount
+ )
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/WmPlaylistDetailResponseDTO.swift b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/WmPlaylistDetailResponseDTO.swift
new file mode 100644
index 000000000..8a81ac91b
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/ResponseDTO/WmPlaylistDetailResponseDTO.swift
@@ -0,0 +1,32 @@
+import Foundation
+import PlaylistDomainInterface
+import SongsDomain
+import SongsDomainInterface
+
+public struct WMPlaylistDetailResponseDTO: Decodable {
+ public let key: String?
+ public let title: String
+ public let songs: [SingleSongResponseDTO]?
+ public let imageURL: String
+ public let playlistURL: String
+
+ enum CodingKeys: String, CodingKey {
+ case key
+ case title
+ case songs
+ case imageURL = "imageUrl"
+ case playlistURL = "playlistUrl"
+ }
+}
+
+public extension WMPlaylistDetailResponseDTO {
+ func toDomain() -> WMPlaylistDetailEntity {
+ WMPlaylistDetailEntity(
+ key: key ?? "",
+ title: title,
+ songs: (songs ?? []).map { $0.toDomain() },
+ image: imageURL,
+ playlistURL: playlistURL
+ )
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/AddSongIntoPlaylistUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/AddSongIntoPlaylistUseCaseImpl.swift
new file mode 100644
index 000000000..456c25785
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/AddSongIntoPlaylistUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import Foundation
+import PlaylistDomainInterface
+import RxSwift
+
+public struct AddSongIntoPlaylistUseCaseImpl: AddSongIntoPlaylistUseCase {
+ private let playlistRepository: any PlaylistRepository
+
+ public init(
+ playlistRepository: PlaylistRepository
+ ) {
+ self.playlistRepository = playlistRepository
+ }
+
+ public func execute(key: String, songs: [String]) -> Single {
+ playlistRepository.addSongIntoPlaylist(key: key, songs: songs)
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/CheckSubscriptionUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/CheckSubscriptionUseCaseImpl.swift
new file mode 100644
index 000000000..1f4d7ba93
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/CheckSubscriptionUseCaseImpl.swift
@@ -0,0 +1,18 @@
+import BaseDomainInterface
+import Foundation
+import PlaylistDomainInterface
+import RxSwift
+
+public struct CheckSubscriptionUseCaseImpl: CheckSubscriptionUseCase {
+ private let playlistRepository: any PlaylistRepository
+
+ public init(
+ playlistRepository: PlaylistRepository
+ ) {
+ self.playlistRepository = playlistRepository
+ }
+
+ public func execute(key: String) -> Single {
+ playlistRepository.checkSubscription(key: key)
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/CreatePlaylistUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/CreatePlaylistUseCaseImpl.swift
new file mode 100644
index 000000000..efa087843
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/CreatePlaylistUseCaseImpl.swift
@@ -0,0 +1,25 @@
+//
+// FetchArtistListUseCaseImpl.swift
+// DataModule
+//
+// Created by KTH on 2023/02/08.
+// Copyright © 2023 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+import PlaylistDomainInterface
+import RxSwift
+
+public struct CreatePlaylistUseCaseImpl: CreatePlaylistUseCase {
+ private let playlistRepository: any PlaylistRepository
+
+ public init(
+ playlistRepository: PlaylistRepository
+ ) {
+ self.playlistRepository = playlistRepository
+ }
+
+ public func execute(title: String) -> Single {
+ playlistRepository.createPlaylist(title: title)
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchPlaylistDetailUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchPlaylistDetailUseCaseImpl.swift
new file mode 100644
index 000000000..cc84d35e5
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchPlaylistDetailUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import Foundation
+import PlaylistDomainInterface
+import RxSwift
+
+public struct FetchPlaylistDetailUseCaseImpl: FetchPlaylistDetailUseCase {
+ private let playlistRepository: any PlaylistRepository
+
+ public init(
+ playlistRepository: PlaylistRepository
+ ) {
+ self.playlistRepository = playlistRepository
+ }
+
+ public func execute(id: String, type: PlaylistType) -> Single {
+ playlistRepository.fetchPlaylistDetail(id: id, type: type)
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchPlaylistSongsUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchPlaylistSongsUseCaseImpl.swift
new file mode 100644
index 000000000..e451600d3
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchPlaylistSongsUseCaseImpl.swift
@@ -0,0 +1,19 @@
+import BaseDomainInterface
+import Foundation
+import PlaylistDomainInterface
+import RxSwift
+import SongsDomainInterface
+
+public struct FetchPlaylistSongsUseCaseImpl: FetchPlaylistSongsUseCase {
+ private let playlistRepository: any PlaylistRepository
+
+ public init(
+ playlistRepository: PlaylistRepository
+ ) {
+ self.playlistRepository = playlistRepository
+ }
+
+ public func execute(key: String) -> Single<[SongEntity]> {
+ return playlistRepository.fetchPlaylistSongs(key: key)
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchRecommendPlaylistUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchRecommendPlaylistUseCaseImpl.swift
new file mode 100644
index 000000000..f6813e325
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchRecommendPlaylistUseCaseImpl.swift
@@ -0,0 +1,25 @@
+//
+// FetchArtistListUseCaseImpl.swift
+// DataModule
+//
+// Created by KTH on 2023/02/08.
+// Copyright © 2023 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+import PlaylistDomainInterface
+import RxSwift
+
+public struct FetchRecommendPlaylistUseCaseImpl: FetchRecommendPlaylistUseCase {
+ private let playlistRepository: any PlaylistRepository
+
+ public init(
+ playlistRepository: PlaylistRepository
+ ) {
+ self.playlistRepository = playlistRepository
+ }
+
+ public func execute() -> Single<[RecommendPlaylistEntity]> {
+ playlistRepository.fetchRecommendPlaylist()
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchWMPlaylistDetailUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchWMPlaylistDetailUseCaseImpl.swift
new file mode 100644
index 000000000..419decf16
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/FetchWMPlaylistDetailUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import Foundation
+import PlaylistDomainInterface
+import RxSwift
+
+public struct FetchWMPlaylistDetailUseCaseImpl: FetchWMPlaylistDetailUseCase {
+ private let playlistRepository: any PlaylistRepository
+
+ public init(
+ playlistRepository: PlaylistRepository
+ ) {
+ self.playlistRepository = playlistRepository
+ }
+
+ public func execute(id: String) -> Single {
+ playlistRepository.fetchWMPlaylistDetail(id: id)
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/RemoveSongsUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/RemoveSongsUseCaseImpl.swift
new file mode 100644
index 000000000..42c82a755
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/RemoveSongsUseCaseImpl.swift
@@ -0,0 +1,26 @@
+//
+// FetchArtistListUseCaseImpl.swift
+// DataModule
+//
+// Created by KTH on 2023/02/08.
+// Copyright © 2023 yongbeomkwak. All rights reserved.
+//
+
+import BaseDomainInterface
+import Foundation
+import PlaylistDomainInterface
+import RxSwift
+
+public struct RemoveSongsUseCaseImpl: RemoveSongsUseCase {
+ private let playlistRepository: any PlaylistRepository
+
+ public init(
+ playlistRepository: PlaylistRepository
+ ) {
+ self.playlistRepository = playlistRepository
+ }
+
+ public func execute(key: String, songs: [String]) -> Completable {
+ return playlistRepository.removeSongs(key: key, songs: songs)
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/RequestCustomImageURLUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/RequestCustomImageURLUseCaseImpl.swift
new file mode 100644
index 000000000..ee97655bd
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/RequestCustomImageURLUseCaseImpl.swift
@@ -0,0 +1,22 @@
+import BaseDomainInterface
+import Foundation
+import PlaylistDomainInterface
+import RxSwift
+
+public struct RequestCustomImageURLUseCaseImpl: RequestCustomImageURLUseCase {
+ private let playlistRepository: any PlaylistRepository
+
+ public init(
+ playlistRepository: PlaylistRepository
+ ) {
+ self.playlistRepository = playlistRepository
+ }
+
+ public func execute(key: String, data: Data) -> Completable {
+ let imageSize = data.count
+ return playlistRepository.requestCustomImageURL(key: key, imageSize: imageSize)
+ .flatMapCompletable { entity in
+ return playlistRepository.uploadCustomImage(presignedURL: entity.presignedURL, data: data)
+ }
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/RequestPlaylistOwnerIDUsecaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/RequestPlaylistOwnerIDUsecaseImpl.swift
new file mode 100644
index 000000000..c6e77f025
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/RequestPlaylistOwnerIDUsecaseImpl.swift
@@ -0,0 +1,18 @@
+import BaseDomainInterface
+import Foundation
+import PlaylistDomainInterface
+import RxSwift
+
+public struct RequestPlaylistOwnerIDUsecaseImpl: RequestPlaylistOwnerIDUsecase {
+ private let playlistRepository: any PlaylistRepository
+
+ public init(
+ playlistRepository: PlaylistRepository
+ ) {
+ self.playlistRepository = playlistRepository
+ }
+
+ public func execute(key: String) -> Single {
+ playlistRepository.requestPlaylistOwnerID(key: key)
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/SubscribePlaylistUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/SubscribePlaylistUseCaseImpl.swift
new file mode 100644
index 000000000..c30c98c82
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/SubscribePlaylistUseCaseImpl.swift
@@ -0,0 +1,18 @@
+import BaseDomainInterface
+import Foundation
+import PlaylistDomainInterface
+import RxSwift
+
+public struct SubscribePlaylistUseCaseImpl: SubscribePlaylistUseCase {
+ private let playlistRepository: any PlaylistRepository
+
+ public init(
+ playlistRepository: PlaylistRepository
+ ) {
+ self.playlistRepository = playlistRepository
+ }
+
+ public func execute(key: String, isSubscribing: Bool) -> Completable {
+ playlistRepository.subscribePlaylist(key: key, isSubscribing: isSubscribing)
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/UpdatePlaylistUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/UpdatePlaylistUseCaseImpl.swift
new file mode 100644
index 000000000..87bd09b11
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/UpdatePlaylistUseCaseImpl.swift
@@ -0,0 +1,18 @@
+import BaseDomainInterface
+import Foundation
+import PlaylistDomainInterface
+import RxSwift
+
+public struct UpdatePlaylistUseCaseImpl: UpdatePlaylistUseCase {
+ private let playlistRepository: any PlaylistRepository
+
+ public init(
+ playlistRepository: PlaylistRepository
+ ) {
+ self.playlistRepository = playlistRepository
+ }
+
+ public func execute(key: String, songs: [String]) -> Completable {
+ return playlistRepository.updatePlaylist(key: key, songs: songs)
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/UpdatePrivatAndTitleeUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/UpdatePrivatAndTitleeUseCaseImpl.swift
new file mode 100644
index 000000000..3f225377b
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/UpdatePrivatAndTitleeUseCaseImpl.swift
@@ -0,0 +1,18 @@
+import BaseDomainInterface
+import Foundation
+import PlaylistDomainInterface
+import RxSwift
+
+public struct UpdateTitleAndPrivateUseCaseImpl: UpdateTitleAndPrivateUseCase {
+ private let playlistRepository: any PlaylistRepository
+
+ public init(
+ playlistRepository: PlaylistRepository
+ ) {
+ self.playlistRepository = playlistRepository
+ }
+
+ public func execute(key: String, title: String?, isPrivate: Bool?) -> Completable {
+ playlistRepository.updateTitleAndPrivate(key: key, title: title, isPrivate: isPrivate)
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Sources/UseCase/UploadDefaultPlaylistImageUseCaseImpl.swift b/Projects/Domains/PlaylistDomain/Sources/UseCase/UploadDefaultPlaylistImageUseCaseImpl.swift
new file mode 100644
index 000000000..88e9682a2
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Sources/UseCase/UploadDefaultPlaylistImageUseCaseImpl.swift
@@ -0,0 +1,18 @@
+import BaseDomainInterface
+import Foundation
+import PlaylistDomainInterface
+import RxSwift
+
+public struct UploadDefaultPlaylistImageUseCaseImpl: UploadDefaultPlaylistImageUseCase {
+ private let playlistRepository: any PlaylistRepository
+
+ public init(
+ playlistRepository: PlaylistRepository
+ ) {
+ self.playlistRepository = playlistRepository
+ }
+
+ public func execute(key: String, model: String) -> Completable {
+ playlistRepository.uploadDefaultImage(key: key, model: model)
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Testing/FetchPlayListUseCaseStub.swift b/Projects/Domains/PlaylistDomain/Testing/FetchPlayListUseCaseStub.swift
new file mode 100644
index 000000000..f8a0dffa8
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Testing/FetchPlayListUseCaseStub.swift
@@ -0,0 +1,141 @@
+import PlaylistDomainInterface
+import RxSwift
+
+final class FetchPlayListUseCaseStub: FetchRecommendPlaylistUseCase {
+ var fetchData = [
+ RecommendPlaylistEntity(
+ key: "best",
+ title: "베스트",
+ image: "https://cdn.wakmusic.xyz/playlist/best_1.png",
+ private: false,
+ count: 0
+ ),
+ RecommendPlaylistEntity(
+ key: "carol",
+ title: "캐롤",
+ image: "https://cdn.wakmusic.xyz/playlist/carol_1.png",
+ private: false,
+ count: 0
+ ),
+ RecommendPlaylistEntity(
+ key: "competition",
+ title: "경쟁",
+ image: "https://cdn.wakmusic.xyz/playlist/competition_1.png",
+ private: false,
+ count: 0
+ ),
+ RecommendPlaylistEntity(
+ key: "best",
+ title: "베스트",
+ image: "https://cdn.wakmusic.xyz/playlist/best_1.png",
+ private: false,
+ count: 0
+ ),
+ RecommendPlaylistEntity(
+ key: "carol",
+ title: "캐롤",
+ image: "https://cdn.wakmusic.xyz/playlist/carol_1.png",
+ private: false,
+ count: 0
+ ),
+ RecommendPlaylistEntity(
+ key: "competition",
+ title: "경쟁",
+ image: "https://cdn.wakmusic.xyz/playlist/competition_1.png",
+ private: false,
+ count: 0
+ ),
+ RecommendPlaylistEntity(
+ key: "best",
+ title: "베스트",
+ image: "https://cdn.wakmusic.xyz/playlist/best_1.png",
+ private: false,
+ count: 0
+ ),
+ RecommendPlaylistEntity(
+ key: "carol",
+ title: "캐롤",
+ image: "https://cdn.wakmusic.xyz/playlist/carol_1.png",
+ private: false,
+ count: 0
+ ),
+ RecommendPlaylistEntity(
+ key: "competition",
+ title: "경쟁",
+ image: "https://cdn.wakmusic.xyz/playlist/competition_1.png",
+ private: false,
+ count: 0
+ ),
+ RecommendPlaylistEntity(
+ key: "best",
+ title: "베스트",
+ image: "https://cdn.wakmusic.xyz/playlist/best_1.png",
+ private: false,
+ count: 0
+ ),
+ RecommendPlaylistEntity(
+ key: "carol",
+ title: "캐롤",
+ image: "https://cdn.wakmusic.xyz/playlist/carol_1.png",
+ private: false,
+ count: 0
+ ),
+ RecommendPlaylistEntity(
+ key: "competition",
+ title: "경쟁",
+ image: "https://cdn.wakmusic.xyz/playlist/competition_1.png",
+ private: false,
+ count: 0
+ ),
+ RecommendPlaylistEntity(
+ key: "best",
+ title: "베스트",
+ image: "https://cdn.wakmusic.xyz/playlist/best_1.png",
+ private: false,
+ count: 0
+ ),
+ RecommendPlaylistEntity(
+ key: "carol",
+ title: "캐롤",
+ image: "https://cdn.wakmusic.xyz/playlist/carol_1.png",
+ private: false,
+ count: 0
+ ),
+ RecommendPlaylistEntity(
+ key: "competition",
+ title: "경쟁",
+ image: "https://cdn.wakmusic.xyz/playlist/competition_1.png",
+ private: false,
+ count: 0
+ ),
+ RecommendPlaylistEntity(
+ key: "best",
+ title: "베스트",
+ image: "https://cdn.wakmusic.xyz/playlist/best_1.png",
+ private: false,
+ count: 0
+ ),
+ RecommendPlaylistEntity(
+ key: "carol",
+ title: "캐롤",
+ image: "https://cdn.wakmusic.xyz/playlist/carol_1.png",
+ private: false,
+ count: 0
+ ),
+ RecommendPlaylistEntity(
+ key: "competition",
+ title: "경쟁",
+ image: "https://cdn.wakmusic.xyz/playlist/competition_1.png",
+ private: false,
+ count: 0
+ )
+ ]
+
+ func execute() -> Single<[RecommendPlaylistEntity]> {
+ return Single.create { [fetchData] single in
+
+ single(.success(fetchData))
+ return Disposables.create()
+ }
+ }
+}
diff --git a/Projects/Domains/PlaylistDomain/Tests/PlayListDomainTest.swift b/Projects/Domains/PlaylistDomain/Tests/PlayListDomainTest.swift
new file mode 100644
index 000000000..190c52104
--- /dev/null
+++ b/Projects/Domains/PlaylistDomain/Tests/PlayListDomainTest.swift
@@ -0,0 +1,11 @@
+import XCTest
+
+final class PlaylistDomainTests: XCTestCase {
+ override func setUpWithError() throws {}
+
+ override func tearDownWithError() throws {}
+
+ func testExample() {
+ XCTAssertEqual(1, 1)
+ }
+}
diff --git a/Projects/Domains/PriceDomain/Interface/DataSource/RemotePriceDataSource.swift b/Projects/Domains/PriceDomain/Interface/DataSource/RemotePriceDataSource.swift
new file mode 100644
index 000000000..c938b5170
--- /dev/null
+++ b/Projects/Domains/PriceDomain/Interface/DataSource/RemotePriceDataSource.swift
@@ -0,0 +1,7 @@
+import Foundation
+import RxSwift
+
+public protocol RemotePriceDataSource {
+ func fetchPlaylistCreationPrice() -> Single
+ func fetchPlaylistImagePrice() -> Single
+}
diff --git a/Projects/Domains/PriceDomain/Interface/Entity/PriceEntity.swift b/Projects/Domains/PriceDomain/Interface/Entity/PriceEntity.swift
new file mode 100644
index 000000000..e09872399
--- /dev/null
+++ b/Projects/Domains/PriceDomain/Interface/Entity/PriceEntity.swift
@@ -0,0 +1,9 @@
+import Foundation
+
+public struct PriceEntity {
+ public let price: Int
+
+ public init(price: Int) {
+ self.price = price
+ }
+}
diff --git a/Projects/Domains/PriceDomain/Interface/Repository/PriceRepository.swift b/Projects/Domains/PriceDomain/Interface/Repository/PriceRepository.swift
new file mode 100644
index 000000000..455ccaf04
--- /dev/null
+++ b/Projects/Domains/PriceDomain/Interface/Repository/PriceRepository.swift
@@ -0,0 +1,7 @@
+import Foundation
+import RxSwift
+
+public protocol PriceRepository {
+ func fetchPlaylistCreationPrice() -> Single
+ func fetchPlaylistImagePrice() -> Single
+}
diff --git a/Projects/Domains/PriceDomain/Interface/UseCase/FetchPlaylistCreationPriceUseCase.swift b/Projects/Domains/PriceDomain/Interface/UseCase/FetchPlaylistCreationPriceUseCase.swift
new file mode 100644
index 000000000..3a8d94c30
--- /dev/null
+++ b/Projects/Domains/PriceDomain/Interface/UseCase/FetchPlaylistCreationPriceUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol FetchPlaylistCreationPriceUseCase {
+ func execute() -> Single
+}
diff --git a/Projects/Domains/PriceDomain/Interface/UseCase/FetchPlaylistImagePriceUseCase.swift b/Projects/Domains/PriceDomain/Interface/UseCase/FetchPlaylistImagePriceUseCase.swift
new file mode 100644
index 000000000..5fe52649a
--- /dev/null
+++ b/Projects/Domains/PriceDomain/Interface/UseCase/FetchPlaylistImagePriceUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol FetchPlaylistImagePriceUseCase {
+ func execute() -> Single
+}
diff --git a/Projects/Domains/PriceDomain/Project.swift b/Projects/Domains/PriceDomain/Project.swift
new file mode 100644
index 000000000..e4a4ee5c4
--- /dev/null
+++ b/Projects/Domains/PriceDomain/Project.swift
@@ -0,0 +1,16 @@
+import DependencyPlugin
+import ProjectDescription
+import ProjectDescriptionHelpers
+
+let project = Project.module(
+ name: ModulePaths.Domain.PriceDomain.rawValue,
+ targets: [
+ .interface(module: .domain(.PriceDomain), dependencies: [
+ .domain(target: .BaseDomain, type: .interface)
+ ]),
+ .implements(module: .domain(.PriceDomain), dependencies: [
+ .domain(target: .PriceDomain, type: .interface),
+ .domain(target: .BaseDomain)
+ ])
+ ]
+)
diff --git a/Projects/Domains/PriceDomain/Sources/DataSource/RemotePriceDataSourceImpl.swift b/Projects/Domains/PriceDomain/Sources/DataSource/RemotePriceDataSourceImpl.swift
new file mode 100644
index 000000000..e0fdfe640
--- /dev/null
+++ b/Projects/Domains/PriceDomain/Sources/DataSource/RemotePriceDataSourceImpl.swift
@@ -0,0 +1,18 @@
+import BaseDomain
+import Foundation
+import PriceDomainInterface
+import RxSwift
+
+public final class RemotePriceDataSourceImpl: BaseRemoteDataSource, RemotePriceDataSource {
+ public func fetchPlaylistCreationPrice() -> Single {
+ request(.fetchPlaylistCreationPrice)
+ .map(PriceResponseDTO.self)
+ .map { $0.toDomain() }
+ }
+
+ public func fetchPlaylistImagePrice() -> Single {
+ request(.fetchPlaylistImagePrice)
+ .map(PriceResponseDTO.self)
+ .map { $0.toDomain() }
+ }
+}
diff --git a/Projects/Domains/PriceDomain/Sources/PriceAPI.swift b/Projects/Domains/PriceDomain/Sources/PriceAPI.swift
new file mode 100644
index 000000000..62640b661
--- /dev/null
+++ b/Projects/Domains/PriceDomain/Sources/PriceAPI.swift
@@ -0,0 +1,50 @@
+import BaseDomain
+import ErrorModule
+import Foundation
+import Moya
+import TeamDomainInterface
+
+public enum PriceAPI {
+ case fetchPlaylistCreationPrice
+ case fetchPlaylistImagePrice
+}
+
+extension PriceAPI: WMAPI {
+ public var domain: WMDomain {
+ return .price
+ }
+
+ public var urlPath: String {
+ switch self {
+ case .fetchPlaylistCreationPrice:
+ return "/playlist/create"
+ case .fetchPlaylistImagePrice:
+ return "/playlist/custom-image"
+ }
+ }
+
+ public var method: Moya.Method {
+ return .get
+ }
+
+ public var task: Moya.Task {
+ return .requestPlain
+ }
+
+ public var jwtTokenType: JwtTokenType {
+ return .none
+ }
+
+ public var errorMap: [Int: WMError] {
+ switch self {
+ default:
+ return [
+ 400: .badRequest,
+ 401: .tokenExpired,
+ 404: .notFound,
+ 429: .tooManyRequest,
+ 500: .internalServerError
+ ]
+ }
+ }
+}
diff --git a/Projects/Domains/PriceDomain/Sources/Repository/PriceRepositoryImpl.swift b/Projects/Domains/PriceDomain/Sources/Repository/PriceRepositoryImpl.swift
new file mode 100644
index 000000000..14c2268b3
--- /dev/null
+++ b/Projects/Domains/PriceDomain/Sources/Repository/PriceRepositoryImpl.swift
@@ -0,0 +1,21 @@
+import Foundation
+import PriceDomainInterface
+import RxSwift
+
+public final class PriceRepositoryImpl: PriceRepository {
+ private let remotePriceDataSource: any RemotePriceDataSource
+
+ public init(
+ remotePriceDataSource: any RemotePriceDataSource
+ ) {
+ self.remotePriceDataSource = remotePriceDataSource
+ }
+
+ public func fetchPlaylistCreationPrice() -> Single {
+ remotePriceDataSource.fetchPlaylistCreationPrice()
+ }
+
+ public func fetchPlaylistImagePrice() -> Single {
+ remotePriceDataSource.fetchPlaylistImagePrice()
+ }
+}
diff --git a/Projects/Domains/PriceDomain/Sources/ResponseDTO/PriceResponseDTO.swift b/Projects/Domains/PriceDomain/Sources/ResponseDTO/PriceResponseDTO.swift
new file mode 100644
index 000000000..715ff03fa
--- /dev/null
+++ b/Projects/Domains/PriceDomain/Sources/ResponseDTO/PriceResponseDTO.swift
@@ -0,0 +1,20 @@
+import Foundation
+import PriceDomainInterface
+
+struct PriceResponseDTO: Decodable {
+ let price: Int
+
+ public init(price: Int) {
+ self.price = price
+ }
+
+ enum CodingKeys: String, CodingKey {
+ case price = "data"
+ }
+}
+
+extension PriceResponseDTO {
+ func toDomain() -> PriceEntity {
+ return PriceEntity(price: price)
+ }
+}
diff --git a/Projects/Domains/PriceDomain/Sources/UseCase/FetchPlaylistCreationPriceUseCaseImpl.swift b/Projects/Domains/PriceDomain/Sources/UseCase/FetchPlaylistCreationPriceUseCaseImpl.swift
new file mode 100644
index 000000000..ad332d494
--- /dev/null
+++ b/Projects/Domains/PriceDomain/Sources/UseCase/FetchPlaylistCreationPriceUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import Foundation
+import PriceDomainInterface
+import RxSwift
+
+public struct FetchPlaylistCreationPriceUseCaseImpl: FetchPlaylistCreationPriceUseCase {
+ private let priceRepository: any PriceRepository
+
+ public init(
+ priceRepository: PriceRepository
+ ) {
+ self.priceRepository = priceRepository
+ }
+
+ public func execute() -> Single {
+ priceRepository.fetchPlaylistCreationPrice()
+ }
+}
diff --git a/Projects/Domains/PriceDomain/Sources/UseCase/FetchPlaylistImagePriceUseCaseImpl.swift b/Projects/Domains/PriceDomain/Sources/UseCase/FetchPlaylistImagePriceUseCaseImpl.swift
new file mode 100644
index 000000000..155e89857
--- /dev/null
+++ b/Projects/Domains/PriceDomain/Sources/UseCase/FetchPlaylistImagePriceUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import Foundation
+import PriceDomainInterface
+import RxSwift
+
+public struct FetchPlaylistImagePriceUseCaseImpl: FetchPlaylistImagePriceUseCase {
+ private let priceRepository: any PriceRepository
+
+ public init(
+ priceRepository: PriceRepository
+ ) {
+ self.priceRepository = priceRepository
+ }
+
+ public func execute() -> Single {
+ priceRepository.fetchPlaylistImagePrice()
+ }
+}
diff --git a/Projects/Domains/SearchDomain/Interface/DataSource/RemoteSearchDataSource.swift b/Projects/Domains/SearchDomain/Interface/DataSource/RemoteSearchDataSource.swift
new file mode 100644
index 000000000..23b1c6237
--- /dev/null
+++ b/Projects/Domains/SearchDomain/Interface/DataSource/RemoteSearchDataSource.swift
@@ -0,0 +1,10 @@
+import BaseDomainInterface
+import Foundation
+import RxSwift
+import SongsDomainInterface
+
+public protocol RemoteSearchDataSource {
+ func fetchSearchSongs(order: SortType, filter: FilterType, text: String, page: Int, limit: Int)
+ -> Single<[SongEntity]>
+ func fetchSearchPlaylist(order: SortType, text: String, page: Int, limit: Int) -> Single<[SearchPlaylistEntity]>
+}
diff --git a/Projects/Domains/SearchDomain/Interface/Entity/SearchPlaylistEntity.swift b/Projects/Domains/SearchDomain/Interface/Entity/SearchPlaylistEntity.swift
new file mode 100644
index 000000000..978a95464
--- /dev/null
+++ b/Projects/Domains/SearchDomain/Interface/Entity/SearchPlaylistEntity.swift
@@ -0,0 +1,39 @@
+import Foundation
+
+public struct SearchPlaylistEntity: Hashable, Equatable {
+ public init(
+ key: String,
+ title: String,
+ ownerID: String,
+ userName: String,
+ image: String,
+ date: String,
+ count: Int,
+ subscribeCount: Int,
+ isPrivate: Bool
+
+ ) {
+ self.key = key
+ self.title = title
+ self.ownerID = ownerID
+ self.userName = userName
+ self.image = image
+ self.date = date
+ self.count = count
+ self.subscribeCount = subscribeCount
+
+ self.isPrivate = isPrivate
+ }
+
+ public let key, title, ownerID, image, date, userName: String
+ public let count, subscribeCount: Int
+ public let isPrivate: Bool
+
+ public func hash(into hasher: inout Hasher) {
+ hasher.combine(key)
+ }
+
+ public static func == (lhs: Self, rhs: Self) -> Bool {
+ return lhs.key == rhs.key
+ }
+}
diff --git a/Projects/Domains/SearchDomain/Interface/Enum/Option.swift b/Projects/Domains/SearchDomain/Interface/Enum/Option.swift
new file mode 100644
index 000000000..bee7fa6ea
--- /dev/null
+++ b/Projects/Domains/SearchDomain/Interface/Enum/Option.swift
@@ -0,0 +1,43 @@
+public protocol SearchOptionType {
+ var title: String { get }
+}
+
+public enum FilterType: String, Encodable, SearchOptionType {
+ case all
+ case title
+ case artist
+ case credit
+
+ public var title: String {
+ switch self {
+ case .all:
+ "전체"
+ case .title:
+ "제목"
+ case .artist:
+ "아티스트"
+ case .credit:
+ "크레딧"
+ }
+ }
+}
+
+public enum SortType: String, Encodable, SearchOptionType {
+ case latest
+ case oldest
+ case relevance
+ case popular
+
+ public var title: String {
+ switch self {
+ case .latest:
+ "최신순"
+ case .oldest:
+ "과거순"
+ case .relevance:
+ "관련도순"
+ case .popular:
+ "인기순"
+ }
+ }
+}
diff --git a/Projects/Domains/SearchDomain/Interface/Repository/SearchRepository.swift b/Projects/Domains/SearchDomain/Interface/Repository/SearchRepository.swift
new file mode 100644
index 000000000..9f14eef76
--- /dev/null
+++ b/Projects/Domains/SearchDomain/Interface/Repository/SearchRepository.swift
@@ -0,0 +1,10 @@
+import BaseDomainInterface
+import Foundation
+import RxSwift
+import SongsDomainInterface
+
+public protocol SearchRepository {
+ func fetchSearchSongs(order: SortType, filter: FilterType, text: String, page: Int, limit: Int)
+ -> Single<[SongEntity]>
+ func fetchSearchPlaylist(order: SortType, text: String, page: Int, limit: Int) -> Single<[SearchPlaylistEntity]>
+}
diff --git a/Projects/Domains/SearchDomain/Interface/UseCase/FetchSearchPlaylistsUseCase.swift b/Projects/Domains/SearchDomain/Interface/UseCase/FetchSearchPlaylistsUseCase.swift
new file mode 100644
index 000000000..f943f8108
--- /dev/null
+++ b/Projects/Domains/SearchDomain/Interface/UseCase/FetchSearchPlaylistsUseCase.swift
@@ -0,0 +1,7 @@
+import Foundation
+import PlaylistDomainInterface
+import RxSwift
+
+public protocol FetchSearchPlaylistsUseCase {
+ func execute(order: SortType, text: String, page: Int, limit: Int) -> Single<[SearchPlaylistEntity]>
+}
diff --git a/Projects/Domains/SearchDomain/Interface/UseCase/FetchSearchSongsUseCase.swift b/Projects/Domains/SearchDomain/Interface/UseCase/FetchSearchSongsUseCase.swift
new file mode 100644
index 000000000..3fb83c108
--- /dev/null
+++ b/Projects/Domains/SearchDomain/Interface/UseCase/FetchSearchSongsUseCase.swift
@@ -0,0 +1,7 @@
+import Foundation
+import RxSwift
+import SongsDomainInterface
+
+public protocol FetchSearchSongsUseCase {
+ func execute(order: SortType, filter: FilterType, text: String, page: Int, limit: Int) -> Single<[SongEntity]>
+}
diff --git a/Projects/Domains/SearchDomain/Project.swift b/Projects/Domains/SearchDomain/Project.swift
new file mode 100644
index 000000000..389848a1c
--- /dev/null
+++ b/Projects/Domains/SearchDomain/Project.swift
@@ -0,0 +1,18 @@
+import DependencyPlugin
+import ProjectDescription
+import ProjectDescriptionHelpers
+
+let project = Project.module(
+ name: ModulePaths.Domain.SearchDomain.rawValue,
+ targets: [
+ .interface(module: .domain(.SearchDomain), dependencies: [
+ .domain(target: .PlaylistDomain, type: .interface),
+ .domain(target: .BaseDomain, type: .interface)
+ ]),
+ .implements(module: .domain(.SearchDomain), dependencies: [
+ .domain(target: .PlaylistDomain),
+ .domain(target: .SearchDomain, type: .interface),
+ .domain(target: .BaseDomain)
+ ])
+ ]
+)
diff --git a/Projects/Domains/SearchDomain/Sources/API/SearchAPI.swift b/Projects/Domains/SearchDomain/Sources/API/SearchAPI.swift
new file mode 100644
index 000000000..9d94a65af
--- /dev/null
+++ b/Projects/Domains/SearchDomain/Sources/API/SearchAPI.swift
@@ -0,0 +1,85 @@
+import BaseDomain
+import BaseDomainInterface
+import ErrorModule
+import Foundation
+import KeychainModule
+import Moya
+import PlaylistDomainInterface
+import SearchDomainInterface
+import SongsDomainInterface
+
+public enum SearchAPI {
+ case fetchPlaylists(order: SortType, text: String, page: Int, limit: Int)
+ case fetchSongs(order: SortType, filter: FilterType, text: String, page: Int, limit: Int)
+}
+
+extension SearchAPI: WMAPI {
+ public var domain: WMDomain {
+ .search
+ }
+
+ public var urlPath: String {
+ switch self {
+ case .fetchPlaylists:
+ return "/playlists"
+ case .fetchSongs:
+ return "/songs"
+ }
+ }
+
+ public var method: Moya.Method {
+ return .get
+ }
+
+ public var task: Moya.Task {
+ switch self {
+ case let .fetchPlaylists(order: order, text: text, page: page, limit: limit):
+ return .requestParameters(
+ parameters: [
+ "order": order.rawValue,
+ "query": text,
+ "page": page,
+ "limit": limit
+ ],
+ encoding: URLEncoding.queryString
+ )
+
+ case let .fetchSongs(order: order, filter: filter, text: text, page: page, limit: limit):
+ return .requestParameters(
+ parameters: [
+ "order": order.rawValue,
+ "filter": filter.rawValue,
+ "query": text,
+ "page": page,
+ "limit": limit
+ ],
+ encoding: URLEncoding.queryString
+ )
+ }
+ }
+
+ public var headers: [String: String]? {
+ switch self {
+ default:
+ return ["Content-Type": "application/json"]
+ }
+ }
+
+ public var jwtTokenType: JwtTokenType {
+ return .none
+ }
+
+ public var errorMap: [Int: WMError] {
+ switch self {
+ default:
+ return [
+ 400: .badRequest,
+ 401: .tokenExpired,
+ 404: .notFound,
+ 409: .conflict,
+ 429: .tooManyRequest,
+ 500: .internalServerError
+ ]
+ }
+ }
+}
diff --git a/Projects/Domains/SearchDomain/Sources/DTO/SearchPlaylistDTO.swift b/Projects/Domains/SearchDomain/Sources/DTO/SearchPlaylistDTO.swift
new file mode 100644
index 000000000..846611ab1
--- /dev/null
+++ b/Projects/Domains/SearchDomain/Sources/DTO/SearchPlaylistDTO.swift
@@ -0,0 +1,52 @@
+import Foundation
+import SearchDomainInterface
+import Utility
+
+public struct SearchPlaylistDTO: Decodable {
+ public init(
+ key: String,
+ title: String,
+ user: User,
+ imageUrl: String,
+ songCount: Int,
+ subscribeCount: Int,
+ createdAt: Double,
+ `private`: Bool
+ ) {
+ self.key = key
+ self.title = title
+ self.user = user
+ self.imageUrl = imageUrl
+ self.songCount = songCount
+ self.subscribeCount = subscribeCount
+ self.createdAt = createdAt
+ self.private = `private`
+ }
+
+ public struct User: Decodable {
+ let handle: String
+ let name: String
+ }
+
+ public let key, title, imageUrl: String
+ public let user: User
+ public let `private`: Bool
+ public let songCount, subscribeCount: Int
+ public let createdAt: Double
+}
+
+public extension SearchPlaylistDTO {
+ func toDomain() -> SearchPlaylistEntity {
+ SearchPlaylistEntity(
+ key: key,
+ title: title,
+ ownerID: user.handle,
+ userName: user.name,
+ image: imageUrl,
+ date: (createdAt / 1000.0).unixTimeToDate.dateToString(format: "yyyy.MM.dd"),
+ count: songCount,
+ subscribeCount: subscribeCount,
+ isPrivate: self.`private`
+ )
+ }
+}
diff --git a/Projects/Domains/SearchDomain/Sources/DataSource/RemoteSearchDataSourceImpl.swift b/Projects/Domains/SearchDomain/Sources/DataSource/RemoteSearchDataSourceImpl.swift
new file mode 100644
index 000000000..9ae65bea1
--- /dev/null
+++ b/Projects/Domains/SearchDomain/Sources/DataSource/RemoteSearchDataSourceImpl.swift
@@ -0,0 +1,31 @@
+import BaseDomain
+import BaseDomainInterface
+import RxSwift
+import SearchDomainInterface
+import SongsDomain
+import SongsDomainInterface
+
+public final class RemoteSearchDataSourceImpl: BaseRemoteDataSource, RemoteSearchDataSource {
+ public func fetchSearchSongs(
+ order: SortType,
+ filter: FilterType,
+ text: String,
+ page: Int,
+ limit: Int
+ ) -> Single<[SongEntity]> {
+ return request(.fetchSongs(order: order, filter: filter, text: text, page: page, limit: limit))
+ .map([SingleSongResponseDTO].self)
+ .map { $0.map { $0.toDomain() }}
+ }
+
+ public func fetchSearchPlaylist(
+ order: SortType,
+ text: String,
+ page: Int,
+ limit: Int
+ ) -> Single<[SearchPlaylistEntity]> {
+ return request(.fetchPlaylists(order: order, text: text, page: page, limit: limit))
+ .map([SearchPlaylistDTO].self)
+ .map { $0.map { $0.toDomain() }}
+ }
+}
diff --git a/Projects/Domains/SearchDomain/Sources/Repository/SearchRepositoryImpl.swift b/Projects/Domains/SearchDomain/Sources/Repository/SearchRepositoryImpl.swift
new file mode 100644
index 000000000..c953c675b
--- /dev/null
+++ b/Projects/Domains/SearchDomain/Sources/Repository/SearchRepositoryImpl.swift
@@ -0,0 +1,36 @@
+import RxSwift
+import SearchDomainInterface
+import SongsDomainInterface
+
+public final class SearchRepositoryImpl: SearchRepository {
+ private let remoteSearchDataSource: any RemoteSearchDataSource
+
+ public init(remoteSearchDataSource: any RemoteSearchDataSource) {
+ self.remoteSearchDataSource = remoteSearchDataSource
+ }
+
+ public func fetchSearchSongs(
+ order: SortType,
+ filter: FilterType,
+ text: String,
+ page: Int,
+ limit: Int
+ ) -> Single<[SongEntity]> {
+ return remoteSearchDataSource.fetchSearchSongs(
+ order: order,
+ filter: filter,
+ text: text,
+ page: page,
+ limit: limit
+ )
+ }
+
+ public func fetchSearchPlaylist(
+ order: SortType,
+ text: String,
+ page: Int,
+ limit: Int
+ ) -> Single<[SearchPlaylistEntity]> {
+ return remoteSearchDataSource.fetchSearchPlaylist(order: order, text: text, page: page, limit: limit)
+ }
+}
diff --git a/Projects/Domains/SearchDomain/Sources/UseCase/FetchSearchPlaylistsUseCaseImpl.swift b/Projects/Domains/SearchDomain/Sources/UseCase/FetchSearchPlaylistsUseCaseImpl.swift
new file mode 100644
index 000000000..ae4f9e1ac
--- /dev/null
+++ b/Projects/Domains/SearchDomain/Sources/UseCase/FetchSearchPlaylistsUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import RxSwift
+import SearchDomainInterface
+import SongsDomainInterface
+
+public struct FetchSearchPlaylistsUseCaseImpl: FetchSearchPlaylistsUseCase {
+ private let searchRepository: any SearchRepository
+
+ public init(
+ searchRepository: SearchRepository
+ ) {
+ self.searchRepository = searchRepository
+ }
+
+ public func execute(order: SortType, text: String, page: Int, limit: Int) -> Single<[SearchPlaylistEntity]> {
+ return searchRepository.fetchSearchPlaylist(order: order, text: text, page: page, limit: limit)
+ }
+}
diff --git a/Projects/Domains/SearchDomain/Sources/UseCase/FetchSearchSongsUseCaseImpl.swift b/Projects/Domains/SearchDomain/Sources/UseCase/FetchSearchSongsUseCaseImpl.swift
new file mode 100644
index 000000000..b8de6c23a
--- /dev/null
+++ b/Projects/Domains/SearchDomain/Sources/UseCase/FetchSearchSongsUseCaseImpl.swift
@@ -0,0 +1,23 @@
+import RxSwift
+import SearchDomainInterface
+import SongsDomainInterface
+
+public struct FetchSearchSongsUseCaseImpl: FetchSearchSongsUseCase {
+ private let searchRepository: any SearchRepository
+
+ public init(
+ searchRepository: SearchRepository
+ ) {
+ self.searchRepository = searchRepository
+ }
+
+ public func execute(
+ order: SortType,
+ filter: FilterType,
+ text: String,
+ page: Int,
+ limit: Int
+ ) -> Single<[SongEntity]> {
+ return searchRepository.fetchSearchSongs(order: order, filter: filter, text: text, page: page, limit: limit)
+ }
+}
diff --git a/Projects/Domains/SongsDomain/Interface/DataSource/RemoteSongsDataSource.swift b/Projects/Domains/SongsDomain/Interface/DataSource/RemoteSongsDataSource.swift
new file mode 100644
index 000000000..a71466d11
--- /dev/null
+++ b/Projects/Domains/SongsDomain/Interface/DataSource/RemoteSongsDataSource.swift
@@ -0,0 +1,10 @@
+import Foundation
+import RxSwift
+
+public protocol RemoteSongsDataSource {
+ func fetchSong(id: String) -> Single
+ func fetchLyrics(id: String) -> Single
+ func fetchSongCredits(id: String) -> Single<[SongCreditsEntity]>
+ func fetchNewSongs(type: NewSongGroupType, page: Int, limit: Int) -> Single<[NewSongsEntity]>
+ func fetchNewSongsPlaylist(type: NewSongGroupType) -> Single
+}
diff --git a/Projects/Domains/SongsDomain/Interface/Entity/LyricsEntity.swift b/Projects/Domains/SongsDomain/Interface/Entity/LyricsEntity.swift
new file mode 100644
index 000000000..be46c9ac9
--- /dev/null
+++ b/Projects/Domains/SongsDomain/Interface/Entity/LyricsEntity.swift
@@ -0,0 +1,27 @@
+import Foundation
+
+public struct LyricsEntity {
+ public init(
+ provider: String,
+ lyrics: [LyricsEntity.Lyric]
+ ) {
+ self.provider = provider
+ self.lyrics = lyrics
+ }
+
+ public let provider: String
+ public let lyrics: [LyricsEntity.Lyric]
+}
+
+public extension LyricsEntity {
+ struct Lyric {
+ public init(
+ text: String
+ ) {
+ self.text = text
+ }
+
+ public let text: String
+ public var isHighlighting: Bool = false
+ }
+}
diff --git a/Projects/Domains/SongsDomain/Interface/Entity/NewSongsEntity.swift b/Projects/Domains/SongsDomain/Interface/Entity/NewSongsEntity.swift
new file mode 100644
index 000000000..ca4e501c3
--- /dev/null
+++ b/Projects/Domains/SongsDomain/Interface/Entity/NewSongsEntity.swift
@@ -0,0 +1,54 @@
+//
+// NewSongsEntity.swift
+// DomainModule
+//
+// Created by KTH on 2023/11/15.
+// Copyright © 2023 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+
+public struct NewSongsEntity: Equatable {
+ public init(
+ id: String,
+ title: String,
+ artist: String,
+ views: Int,
+ date: String,
+ isSelected: Bool = false,
+ karaokeNumber: NewSongsEntity.KaraokeNumber = .init(TJ: nil, KY: nil)
+ ) {
+ self.id = id
+ self.title = title
+ self.artist = artist
+ self.views = views
+ self.date = date
+ self.isSelected = isSelected
+ self.karaokeNumber = karaokeNumber
+ }
+
+ public let id, title, artist: String
+ public let views: Int
+ public let date: String
+ public var isSelected: Bool
+ public let karaokeNumber: NewSongsEntity.KaraokeNumber
+
+ public func hash(into hasher: inout Hasher) {
+ hasher.combine(id)
+ }
+
+ public static func == (lhs: NewSongsEntity, rhs: NewSongsEntity) -> Bool {
+ lhs.id == rhs.id
+ }
+}
+
+public extension NewSongsEntity {
+ struct KaraokeNumber {
+ public init (TJ: Int?, KY: Int?) {
+ self.TJ = TJ
+ self.KY = KY
+ }
+
+ public let TJ, KY: Int?
+ }
+}
diff --git a/Projects/Domains/SongsDomain/Interface/Entity/NewSongsPlaylistEntity.swift b/Projects/Domains/SongsDomain/Interface/Entity/NewSongsPlaylistEntity.swift
new file mode 100644
index 000000000..bfe6b479d
--- /dev/null
+++ b/Projects/Domains/SongsDomain/Interface/Entity/NewSongsPlaylistEntity.swift
@@ -0,0 +1,9 @@
+import Foundation
+
+public struct NewSongsPlaylistEntity {
+ public init(url: String) {
+ self.url = url
+ }
+
+ public let url: String
+}
diff --git a/Projects/Domains/SongsDomain/Interface/Entity/SearchResultEntity.swift b/Projects/Domains/SongsDomain/Interface/Entity/SearchResultEntity.swift
new file mode 100644
index 000000000..7cb3eecbf
--- /dev/null
+++ b/Projects/Domains/SongsDomain/Interface/Entity/SearchResultEntity.swift
@@ -0,0 +1,19 @@
+//
+// SearchResultEntity.swift
+// DomainModule
+//
+// Created by yongbeomkwak on 12/9/23.
+// Copyright © 2023 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+
+public struct SearchResultEntity: Equatable {
+ public init(song: [SongEntity], artist: [SongEntity], remix: [SongEntity]) {
+ self.song = song
+ self.artist = artist
+ self.remix = remix
+ }
+
+ public let song, artist, remix: [SongEntity]
+}
diff --git a/Projects/Domains/SongsDomain/Interface/Entity/SongCreditsEntity.swift b/Projects/Domains/SongsDomain/Interface/Entity/SongCreditsEntity.swift
new file mode 100644
index 000000000..639316244
--- /dev/null
+++ b/Projects/Domains/SongsDomain/Interface/Entity/SongCreditsEntity.swift
@@ -0,0 +1,44 @@
+//
+// SongCreditsEntity.swift
+// SongsDomain
+//
+// Created by KTH on 5/14/24.
+// Copyright © 2024 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+
+public struct SongCreditsEntity {
+ public init(
+ type: String,
+ names: [Credit]
+ ) {
+ self.type = type
+ self.names = names
+ }
+
+ public init(
+ type: String,
+ names: [String]
+ ) {
+ self.type = type
+ self.names = names.map {
+ Credit(name: $0, isArtist: false, artistID: nil)
+ }
+ }
+
+ public let type: String
+ public let names: [Credit]
+
+ public struct Credit {
+ public let name: String
+ public let isArtist: Bool
+ public let artistID: String?
+
+ public init(name: String, isArtist: Bool, artistID: String?) {
+ self.name = name
+ self.isArtist = isArtist
+ self.artistID = artistID
+ }
+ }
+}
diff --git a/Projects/Domains/SongsDomain/Interface/Entity/SongDetailEntity.swift b/Projects/Domains/SongsDomain/Interface/Entity/SongDetailEntity.swift
new file mode 100644
index 000000000..04d484828
--- /dev/null
+++ b/Projects/Domains/SongsDomain/Interface/Entity/SongDetailEntity.swift
@@ -0,0 +1,39 @@
+import Foundation
+
+public struct SongDetailEntity: Hashable {
+ public init(
+ id: String,
+ title: String,
+ artist: String,
+ views: Int,
+ date: String,
+ likes: Int,
+ isLiked: Bool,
+ karaokeNumber: SongDetailEntity.KaraokeNumber
+ ) {
+ self.id = id
+ self.title = title
+ self.artist = artist
+ self.views = views
+ self.date = date
+ self.likes = likes
+ self.isLiked = isLiked
+ self.karaokeNumber = karaokeNumber
+ }
+
+ public let id, title, artist: String
+ public let views: Int
+ public let date: String
+ public let likes: Int
+ public let isLiked: Bool
+ public let karaokeNumber: SongDetailEntity.KaraokeNumber
+
+ public struct KaraokeNumber: Hashable, Equatable {
+ public init (tj: Int?, ky: Int?) {
+ self.tj = tj
+ self.ky = ky
+ }
+
+ public let tj, ky: Int?
+ }
+}
diff --git a/Projects/Domains/SongsDomain/Interface/Entity/SongEntity.swift b/Projects/Domains/SongsDomain/Interface/Entity/SongEntity.swift
new file mode 100644
index 000000000..b4f20862d
--- /dev/null
+++ b/Projects/Domains/SongsDomain/Interface/Entity/SongEntity.swift
@@ -0,0 +1,45 @@
+import Foundation
+
+public struct SongEntity: Hashable {
+ public init(
+ id: String,
+ title: String,
+ artist: String,
+ views: Int,
+ date: String,
+ likes: Int = 0,
+ isSelected: Bool = false,
+ karaokeNumber: SongEntity.KaraokeNumber = .init(TJ: nil, KY: nil)
+ ) {
+ self.id = id
+ self.title = title
+ self.artist = artist
+ self.views = views
+ self.date = date
+ self.likes = likes
+ self.isSelected = isSelected
+ self.karaokeNumber = karaokeNumber
+ }
+
+ public let id, title, artist: String
+ public let views: Int
+ public let date: String
+ public let likes: Int
+ public var isSelected: Bool
+ public let karaokeNumber: SongEntity.KaraokeNumber
+
+ public func hash(into hasher: inout Hasher) {
+ hasher.combine(id)
+ }
+}
+
+public extension SongEntity {
+ struct KaraokeNumber: Hashable, Equatable {
+ public init (TJ: Int?, KY: Int?) {
+ self.TJ = TJ
+ self.KY = KY
+ }
+
+ public let TJ, KY: Int?
+ }
+}
diff --git a/Projects/Services/DataMappingModule/Sources/Base/NewSongGroupType.swift b/Projects/Domains/SongsDomain/Interface/Enum/NewSongGroupType.swift
similarity index 100%
rename from Projects/Services/DataMappingModule/Sources/Base/NewSongGroupType.swift
rename to Projects/Domains/SongsDomain/Interface/Enum/NewSongGroupType.swift
diff --git a/Projects/Domains/SongsDomain/Interface/Repository/SongsRepository.swift b/Projects/Domains/SongsDomain/Interface/Repository/SongsRepository.swift
new file mode 100644
index 000000000..ffeafca85
--- /dev/null
+++ b/Projects/Domains/SongsDomain/Interface/Repository/SongsRepository.swift
@@ -0,0 +1,10 @@
+import Foundation
+import RxSwift
+
+public protocol SongsRepository {
+ func fetchSong(id: String) -> Single
+ func fetchLyrics(id: String) -> Single
+ func fetchSongCredits(id: String) -> Single<[SongCreditsEntity]>
+ func fetchNewSongs(type: NewSongGroupType, page: Int, limit: Int) -> Single<[NewSongsEntity]>
+ func fetchNewSongsPlaylist(type: NewSongGroupType) -> Single
+}
diff --git a/Projects/Domains/SongsDomain/Interface/UseCase/FetchLyricsUseCase.swift b/Projects/Domains/SongsDomain/Interface/UseCase/FetchLyricsUseCase.swift
new file mode 100644
index 000000000..7cc1b8fe1
--- /dev/null
+++ b/Projects/Domains/SongsDomain/Interface/UseCase/FetchLyricsUseCase.swift
@@ -0,0 +1,14 @@
+//
+// FetchLyricsUseCase.swift
+// DomainModule
+//
+// Created by YoungK on 2023/02/22.
+// Copyright © 2023 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+import RxSwift
+
+public protocol FetchLyricsUseCase {
+ func execute(id: String) -> Single
+}
diff --git a/Projects/Domains/SongsDomain/Interface/UseCase/FetchNewSongsPlaylistUseCase.swift b/Projects/Domains/SongsDomain/Interface/UseCase/FetchNewSongsPlaylistUseCase.swift
new file mode 100644
index 000000000..d32c9ff5c
--- /dev/null
+++ b/Projects/Domains/SongsDomain/Interface/UseCase/FetchNewSongsPlaylistUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol FetchNewSongsPlaylistUseCase {
+ func execute(type: NewSongGroupType) -> Single
+}
diff --git a/Projects/Domains/SongsDomain/Interface/UseCase/FetchNewSongsUseCase.swift b/Projects/Domains/SongsDomain/Interface/UseCase/FetchNewSongsUseCase.swift
new file mode 100644
index 000000000..379030e45
--- /dev/null
+++ b/Projects/Domains/SongsDomain/Interface/UseCase/FetchNewSongsUseCase.swift
@@ -0,0 +1,14 @@
+//
+// fetchNewSongsUseCase.swift
+// DomainModule
+//
+// Created by KTH on 2023/11/15.
+// Copyright © 2023 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+import RxSwift
+
+public protocol FetchNewSongsUseCase {
+ func execute(type: NewSongGroupType, page: Int, limit: Int) -> Single<[NewSongsEntity]>
+}
diff --git a/Projects/Domains/SongsDomain/Interface/UseCase/FetchSongCreditsUseCase.swift b/Projects/Domains/SongsDomain/Interface/UseCase/FetchSongCreditsUseCase.swift
new file mode 100644
index 000000000..716227c6b
--- /dev/null
+++ b/Projects/Domains/SongsDomain/Interface/UseCase/FetchSongCreditsUseCase.swift
@@ -0,0 +1,14 @@
+//
+// FetchSongCreditsUseCase.swift
+// SongsDomain
+//
+// Created by KTH on 5/14/24.
+// Copyright © 2024 yongbeomkwak. All rights reserved.
+//
+
+import Foundation
+import RxSwift
+
+public protocol FetchSongCreditsUseCase {
+ func execute(id: String) -> Single<[SongCreditsEntity]>
+}
diff --git a/Projects/Domains/SongsDomain/Interface/UseCase/FetchSongUseCase.swift b/Projects/Domains/SongsDomain/Interface/UseCase/FetchSongUseCase.swift
new file mode 100644
index 000000000..c4a2c81d2
--- /dev/null
+++ b/Projects/Domains/SongsDomain/Interface/UseCase/FetchSongUseCase.swift
@@ -0,0 +1,6 @@
+import Foundation
+import RxSwift
+
+public protocol FetchSongUseCase {
+ func execute(id: String) -> Single
+}
diff --git a/Projects/Domains/SongsDomain/Project.swift b/Projects/Domains/SongsDomain/Project.swift
new file mode 100644
index 000000000..bf158afd4
--- /dev/null
+++ b/Projects/Domains/SongsDomain/Project.swift
@@ -0,0 +1,34 @@
+import DependencyPlugin
+import ProjectDescription
+import ProjectDescriptionHelpers
+
+let project = Project.module(
+ name: ModulePaths.Domain.SongsDomain.rawValue,
+ targets: [
+ .interface(
+ module: .domain(.SongsDomain),
+ dependencies: [
+ .domain(target: .BaseDomain, type: .interface)
+ ]
+ ),
+ .implements(
+ module: .domain(.SongsDomain),
+ dependencies: [
+ .domain(target: .BaseDomain),
+ .domain(target: .SongsDomain, type: .interface),
+ .domain(target: .AuthDomain, type: .interface),
+ .domain(target: .LikeDomain, type: .interface)
+ ]
+ ),
+ .testing(
+ module: .domain(.SongsDomain),
+ dependencies: [
+ .domain(target: .SongsDomain, type: .interface)
+ ]
+ ),
+ .tests(
+ module: .domain(.SongsDomain),
+ dependencies: [.domain(target: .SongsDomain)]
+ )
+ ]
+)
diff --git a/Projects/Domains/SongsDomain/Sources/API/SongsAPI.swift b/Projects/Domains/SongsDomain/Sources/API/SongsAPI.swift
new file mode 100644
index 000000000..84a17208b
--- /dev/null
+++ b/Projects/Domains/SongsDomain/Sources/API/SongsAPI.swift
@@ -0,0 +1,72 @@
+import BaseDomain
+import ErrorModule
+import Foundation
+import Moya
+import SongsDomainInterface
+
+public enum SongsAPI {
+ case fetchSong(id: String)
+ case fetchLyrics(id: String)
+ case fetchCredits(id: String)
+ case fetchNewSongs(type: NewSongGroupType, page: Int, limit: Int)
+ case fetchNewSongsPlaylist(type: NewSongGroupType)
+}
+
+extension SongsAPI: WMAPI {
+ public var domain: WMDomain {
+ return .songs
+ }
+
+ public var urlPath: String {
+ switch self {
+ case let .fetchSong(id):
+ return "/\(id)"
+ case let .fetchLyrics(id):
+ return "/\(id)/lyrics"
+ case let .fetchCredits(id):
+ return "/\(id)/credits"
+ case let .fetchNewSongs(type, _, _):
+ return "/latest/\(type.apiKey)"
+ case let .fetchNewSongsPlaylist(type):
+ return "/latest/\(type.apiKey)/playlist"
+ }
+ }
+
+ public var method: Moya.Method {
+ return .get
+ }
+
+ public var task: Moya.Task {
+ switch self {
+ case .fetchSong, .fetchLyrics, .fetchCredits,
+ .fetchNewSongsPlaylist:
+ return .requestPlain
+
+ case let .fetchNewSongs(_, page, limit):
+ return .requestParameters(
+ parameters: [
+ "limit": limit,
+ "page": page
+ ],
+ encoding: URLEncoding.queryString
+ )
+ }
+ }
+
+ public var jwtTokenType: JwtTokenType {
+ return .none
+ }
+
+ public var errorMap: [Int: WMError] {
+ switch self {
+ default:
+ return [
+ 400: .badRequest,
+ 401: .tokenExpired,
+ 404: .notFound,
+ 429: .tooManyRequest,
+ 500: .internalServerError
+ ]
+ }
+ }
+}
diff --git a/Projects/Domains/SongsDomain/Sources/DataSource/RemoteSongsDataSourceImpl.swift b/Projects/Domains/SongsDomain/Sources/DataSource/RemoteSongsDataSourceImpl.swift
new file mode 100644
index 000000000..e3bf582ce
--- /dev/null
+++ b/Projects/Domains/SongsDomain/Sources/DataSource/RemoteSongsDataSourceImpl.swift
@@ -0,0 +1,36 @@
+import BaseDomain
+import Foundation
+import RxSwift
+import SongsDomainInterface
+
+public final class RemoteSongsDataSourceImpl: BaseRemoteDataSource, RemoteSongsDataSource {
+ public func fetchSong(id: String) -> Single {
+ request(.fetchSong(id: id))
+ .map(SingleSongResponseDTO.self)
+ .map { $0.toDomain() }
+ }
+
+ public func fetchLyrics(id: String) -> Single