diff --git a/.github/workflows/ci-master-only.yml b/.github/workflows/ci-master-only.yml index b2df79192..8767d79b3 100644 --- a/.github/workflows/ci-master-only.yml +++ b/.github/workflows/ci-master-only.yml @@ -7,12 +7,12 @@ on: jobs: cocoapods-lint: - env: - DEVELOPER_DIR: /Applications/Xcode_16.4.0.app/Contents/Developer + env: + DEVELOPER_DIR: /Applications/Xcode_26.0.1.app/Contents/Developer name: Verify that podspec lints - runs-on: macos-latest + runs-on: macos-15 steps: - name: Checkout the Git repository - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Run build.sh with cocoapods-lint mode run: ./build.sh cocoapods-lint diff --git a/.github/workflows/ci-pull-requests-only.yml b/.github/workflows/ci-pull-requests-only.yml index 791c638cf..e3041caa4 100644 --- a/.github/workflows/ci-pull-requests-only.yml +++ b/.github/workflows/ci-pull-requests-only.yml @@ -8,7 +8,7 @@ on: jobs: buildsh: env: - DEVELOPER_DIR: /Applications/Xcode_16.4.0.app/Contents/Developer + DEVELOPER_DIR: /Applications/Xcode_26.0.1.app/Contents/Developer strategy: matrix: mode: [cocoapods-lint-default-subspecs, cocoapods-lint-other-subspecs] @@ -18,9 +18,9 @@ jobs: - mode: cocoapods-lint-other-subspecs name: Verify that other subspecs lint name: ${{ matrix.name }} - runs-on: macos-latest + runs-on: macos-15 steps: - name: Checkout the Git repository - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Run build script run: ./build.sh ${{ matrix.mode }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0c8164a93..b0d7682cc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,10 +5,10 @@ on: [push, pull_request] jobs: buildsh: env: - DEVELOPER_DIR: /Applications/Xcode_16.4.0.app/Contents/Developer + DEVELOPER_DIR: /Applications/Xcode_26.0.1.app/Contents/Developer strategy: matrix: - mode: [tests, framework, life-without-cocoapods, carthage, examples-pt1, examples-pt2, examples-pt3, examples-pt4] + mode: [tests, framework, life-without-cocoapods, carthage, spm, spm-texture-basic, spm-texture-iglistkit, spm-app-iglistkit, examples-pt1, examples-pt2, examples-pt3, examples-pt4] include: - mode: tests name: Build and run tests @@ -18,6 +18,14 @@ jobs: name: Build Texture as a static library - mode: carthage name: Verify that Carthage works + - mode: spm + name: Verify that Swift Package Manager works + - mode: spm-texture-basic + name: Test SPM basic integration (AsyncDisplayKit) + - mode: spm-texture-iglistkit + name: Test SPM with IGListKit extensions + - mode: spm-app-iglistkit + name: Test SPM iOS app with IGListKit - mode: examples-pt1 name: Build examples (examples-pt1) - mode: examples-pt2 @@ -27,9 +35,9 @@ jobs: - mode: examples-pt4 name: Build examples (examples-pt4) name: ${{ matrix.name }} - runs-on: macos-latest + runs-on: macos-15 steps: - name: Checkout the Git repository - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Run build script run: ./build.sh ${{ matrix.mode }} diff --git a/.gitignore b/.gitignore index b678ebdd4..3b8b36f09 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,8 @@ playground.xcworkspace # Carthage Carthage/Checkouts Carthage/Build + +# Swift Package Manager +.build/ +.swiftpm/ +Package.resolved diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d4becbdcc..83d527cd6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -80,6 +80,20 @@ Before submitting a pull request, please make sure the following is done… 5. Ensure tests pass CI on GitHub for your Pull Request. 6. If you haven't already, sign the CLA. +## Swift Package Manager (SPM) Contributions + +If your changes add, remove, or move source files in the `Source/` directory, you **must** regenerate the SPM symlink structure: + +```bash +# Regenerate SPM layout +swift scripts/generate_spm_sources_layout.swift + +# Commit the generated changes +git add spm/Sources +``` + +**Important:** Always include the generated `spm/Sources` directory changes in your pull request. The CI will fail if the SPM layout is out of sync with the source files. Our build script automatically verifies this by cleaning and regenerating the layout during testing. + **Copyright Notice for files** Copy and paste this to the top of your new file(s): ```objc diff --git a/Package.swift b/Package.swift new file mode 100644 index 000000000..fad3a8d8b --- /dev/null +++ b/Package.swift @@ -0,0 +1,135 @@ +// swift-tools-version: 6.1 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +// MARK: - SPM Source Distribution +// +// This package provides source distribution for Texture with Swift Package Manager. +// +// Features: +// - Core AsyncDisplayKit (all nodes, layout specs, TextNode2) +// - PINRemoteImage integration +// - IGListKit Swift wrapper (TextureIGListKitExtensions) +// +// IGListKit Integration: +// The native Objective-C IGListKit API (IGListAdapter+AsyncDisplayKit, etc.) is disabled +// because it requires conditional compilation flags (AS_IG_LIST_KIT=1) which create +// Objective-C headers that cannot be bridged to Swift. Instead, use the Swift wrapper: +// +// - Import: TextureIGListKitExtensions +// - API: adapter.setCollectionNode(node) instead of adapter.setASDKCollectionNode(node) +// - See Sources/TextureIGListKitExtensions/README.md for complete API mapping +// +// Other Limitations: +// - Video/MapKit/Photos features not accessible (require framework linking) +// - Old TextNode disabled (use modern TextNode2) + +let package = Package( + name: "Texture", + platforms: [ + .iOS(.v14), + .tvOS(.v14), + .macCatalyst(.v13) + ], + products: [ + .library( + name: "AsyncDisplayKit", + targets: ["AsyncDisplayKit"] + ), + .library( + name: "TextureIGListKitExtensions", + targets: ["TextureIGListKitExtensions"] + ) + ], + dependencies: [ + .package(url: "https://github.com/pinterest/PINRemoteImage.git", from: "3.0.4"), + .package(url: "https://github.com/Instagram/IGListKit", from: "5.0.0") + ], + targets: [ + .target( + name: "AsyncDisplayKit", + dependencies: [ + "PINRemoteImage" + ], + path: "spm/Sources/AsyncDisplayKit", + publicHeadersPath: "include", + cSettings: [ + // Always available features + .define("AS_PIN_REMOTE_IMAGE", to: "1"), + + // Disable old TextNode by default for SPM + .define("AS_ENABLE_TEXTNODE", to: "0"), + + // IGListKit: Disabled for SPM (use TextureIGListKitExtensions instead) + .define("AS_IG_LIST_KIT", to: "0"), + .define("AS_IG_LIST_DIFF_KIT", to: "0"), + + // Disabled features + .define("AS_USE_VIDEO", to: "0"), // Not accessible from Swift via SPM + .define("AS_USE_MAPKIT", to: "0"), // Not accessible from Swift via SPM + .define("AS_USE_PHOTOS", to: "0"), // Partially accessible from Swift via SPM + .define("AS_USE_ASSETS_LIBRARY", to: "0"), // Deprecated iOS 9.0, use Photos framework + + // Always disabled for SPM + .define("IG_LIST_COLLECTION_VIEW", to: "0"), + + // Header search paths + .headerSearchPath("."), + .headerSearchPath("include/AsyncDisplayKit"), // For quoted-style imports + .headerSearchPath("Base"), + .headerSearchPath("Debug"), + .headerSearchPath("Details"), + .headerSearchPath("Details/Transactions"), + .headerSearchPath("Layout"), + .headerSearchPath("Private"), + .headerSearchPath("Private/Layout"), + .headerSearchPath("TextExperiment/Component"), + .headerSearchPath("TextExperiment/String"), + .headerSearchPath("TextExperiment/Utility"), + .headerSearchPath("TextKit"), + .headerSearchPath("tvOS") + ], + cxxSettings: [ + .headerSearchPath("."), + .headerSearchPath("include/AsyncDisplayKit"), // For quoted-style imports + .headerSearchPath("Base"), + .headerSearchPath("Debug"), + .headerSearchPath("Details"), + .headerSearchPath("Details/Transactions"), + .headerSearchPath("Layout"), + .headerSearchPath("Private"), + .headerSearchPath("Private/Layout"), + .headerSearchPath("TextExperiment/Component"), + .headerSearchPath("TextExperiment/String"), + .headerSearchPath("TextExperiment/Utility"), + .headerSearchPath("TextKit"), + .headerSearchPath("tvOS") + ], + linkerSettings: [ + .linkedLibrary("c++") + // Note: Video/MapKit/Photos frameworks not linked by default + // These features are not accessible from Swift via SPM due to conditional compilation + // Use CocoaPods or Carthage if you need these features, or use Objective-C code + ] + ), + .target( + name: "TextureIGListKitExtensions", + dependencies: [ + "AsyncDisplayKit", + .product(name: "IGListKit", package: "IGListKit"), + .product(name: "IGListDiffKit", package: "IGListKit") + ], + path: "Sources/TextureIGListKitExtensions", + swiftSettings: [ + .enableExperimentalFeature("AccessLevelOnImport"), + // Use Swift 5 mode because this is a wrapper around Objective-C code + // that lacks Swift Concurrency annotations. When AsyncDisplayKit adds + // proper @MainActor annotations, we can migrate to Swift 6 mode. + .swiftLanguageMode(.v5) + ] + ) + ], + cLanguageStandard: .c11, + cxxLanguageStandard: .cxx20 +) diff --git a/README.md b/README.md index 28feb6eb4..7035ea87d 100644 --- a/README.md +++ b/README.md @@ -10,11 +10,129 @@ [![Version](https://img.shields.io/cocoapods/v/Texture.svg)](http://cocoapods.org/pods/Texture) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-59C939.svg?style=flat)](https://github.com/Carthage/Carthage) +[![Swift Package Manager](https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg)](https://swift.org/package-manager/) [![License](https://img.shields.io/cocoapods/l/Texture.svg)](https://github.com/texturegroup/texture/blob/master/LICENSE) ## Installation -Texture is available via CocoaPods or Carthage. See our [Installation](http://texturegroup.org/docs/installation.html) guide for instructions. +Texture is available via CocoaPods, Carthage, or Swift Package Manager. See our [Installation](http://texturegroup.org/docs/installation.html) guide for instructions. + +### Swift Package Manager + +Texture supports Swift Package Manager with Package Traits for modular feature integration. + +#### Basic Usage (AsyncDisplayKit only) + +Most users just need the core AsyncDisplayKit functionality: + +```swift +// In your Package.swift +dependencies: [ + .package(url: "https://github.com/TextureGroup/Texture.git", from: "3.3.0") +], +targets: [ + .target( + name: "YourApp", + dependencies: [ + .product(name: "AsyncDisplayKit", package: "Texture") + ] + ) +] +``` + +**Default Features (included automatically):** +- Core AsyncDisplayKit (ASDisplayNode, ASImageNode, ASTextNode2, ASButtonNode, etc.) +- PINRemoteImage integration (ASPINRemoteImageDownloader) +- Collection views (ASCollectionNode, ASTableNode) +- Layout specs (ASStackLayoutSpec, ASInsetLayoutSpec, etc.) +- TextNode2 (modern text rendering, replaces legacy TextNode) + +**Optional Features (enable via traits):** +- IGListKit integration (advanced collection views with modern Swift API) + +**⚠️ SPM Limitations:** +Video (ASVideoNode), MapKit (ASMapNode), and Photos features are **not available** via Swift Package Manager due to technical limitations. These Objective-C classes are wrapped in conditional compilation directives (`#if AS_USE_VIDEO`) which prevents them from being exported in the Swift module interface. + +**If you need Video/MapKit/Photos features:** +- Use **CocoaPods** or **Carthage** (full feature support) +- Or use these features from **Objective-C code** (.m files) + +**Future directions:** We're exploring solutions like Swift wrapper modules (TextureVideoExtensions, TextureMapKitExtensions) to provide Swift API for these features via SPM. + +#### Advanced Usage: IGListKit Integration + +For advanced collection view support with IGListKit, you need **both steps**: + +1. **Enable the IGListKit trait** on the package dependency +2. **Add the TextureIGListKitExtensions product** to your target + +```swift +// In your Package.swift +dependencies: [ + .package( + url: "https://github.com/TextureGroup/Texture.git", + from: "3.3.0", + traits: [.init(name: "IGListKit")] // Step 1: Enable trait + ) +], +targets: [ + .target( + name: "YourApp", + dependencies: [ + .product(name: "AsyncDisplayKit", package: "Texture"), + .product(name: "TextureIGListKitExtensions", package: "Texture") // Step 2: Add product + ] + ) +] +``` + +**Why both steps?** Due to Swift Package Manager limitations, traits apply to the entire package, not individual products. This means you must explicitly enable the IGListKit trait AND add the product dependency. See [Issue #8350](https://github.com/swiftlang/swift-package-manager/issues/8350) for details. + +**⚠️ Important Notes:** +- **SPM uses IGListKit 5.0+** (breaking changes from 4.x used in CocoaPods/Carthage) +- **Not a drop-in replacement** - migration and testing required +- **No Carthage/CocoaPods support planned** - we recommend migrating to SPM +- Provides Swift API: `ListAdapter.setCollectionNode(_:)` (replaces Objective-C `setASDKCollectionNode:`) + +📖 **[Read the full IGListKit migration guide →](Sources/TextureIGListKitExtensions/README.md)** + +#### Migrating from CocoaPods to SPM + +If you're migrating from CocoaPods, here's how the subspecs map to SPM features: + +| Feature | CocoaPods | SPM | Notes | +|---------|-----------|-----|-------| +| **Core** | `pod 'Texture'` (default) | `.product(name: "AsyncDisplayKit", ...)` | ✅ Always included | +| **PINRemoteImage** | Included by default | Always included | ✅ Same behavior | +| **Video** | Included by default | **Not available** | ❌ SPM limitation (see above) | +| **MapKit** | Included by default | **Not available** | ❌ SPM limitation (see above) | +| **Photos** | Included by default | **Not available** | ❌ SPM limitation (see above) | +| **AssetsLibrary** | Included by default | **Removed** | ❌ Deprecated iOS 9.0, use Photos | +| **IGListKit** | `pod 'Texture/IGListKit'` | Optional trait + product | ⚠️ Uses IGListKit 5.0+ | +| **TextNode2** | `pod 'Texture/TextNode2'` | Enabled by default | ✅ Modern TextNode used | +| **Yoga** | `pod 'Texture/Yoga'` | Not supported | Add as separate dependency | + +**Key differences:** +- **TextNode2 is default**: SPM uses the modern TextNode implementation automatically (no legacy TextNode) +- ❌ **Video/MapKit/Photos not available**: Due to Swift Package Manager limitations with conditionally compiled Objective-C classes +- ❌ **AssetsLibrary removed**: Deprecated in iOS 9.0, use Photos framework instead +- ⚠️ **IGListKit version**: SPM uses IGListKit 5.0+ instead of 4.x (breaking changes) +- ℹ️ **Yoga**: Not integrated in SPM - add Yoga as a separate dependency if needed + +#### Note for Contributors + +When adding or removing source files in the `Source/` directory, you must regenerate the SPM symlink structure: + +```bash +# Regenerate SPM layout +swift scripts/generate_spm_sources_layout.swift + +# Commit the generated changes +git add spm/Sources +git commit -m "Update SPM layout for new/removed files" +``` + +**Important:** Always commit the generated `spm/Sources` directory changes along with your source file changes. This ensures SPM users can build the project correctly. ## Performance Gains diff --git a/Source/Private/ASIGListAdapterBasedDataSource.h b/Source/Private/ASIGListAdapterBasedDataSource.h index 5be2185f2..ab9133846 100644 --- a/Source/Private/ASIGListAdapterBasedDataSource.h +++ b/Source/Private/ASIGListAdapterBasedDataSource.h @@ -24,6 +24,6 @@ AS_SUBCLASSING_RESTRICTED @end -#endif - NS_ASSUME_NONNULL_END + +#endif diff --git a/Sources/TextureIGListKitExtensions/IGListAdapter+Texture.swift b/Sources/TextureIGListKitExtensions/IGListAdapter+Texture.swift new file mode 100644 index 000000000..dfe5915b8 --- /dev/null +++ b/Sources/TextureIGListKitExtensions/IGListAdapter+Texture.swift @@ -0,0 +1,522 @@ +// +// IGListAdapter+Texture.swift +// Texture +// +// Copyright (c) Pinterest, Inc. All rights reserved. +// Licensed under Apache 2.0: http://www.apache.org/licenses/LICENSE-2.0 +// + +import Foundation +import ObjectiveC +public import AsyncDisplayKit +public import IGListKit +public import IGListDiffKit + +/// Pure Swift data source bridge between IGListKit and AsyncDisplayKit +/// +/// ## Thread Safety (based on AsyncDisplayKit documentation) +/// +/// According to ASCollectionNode.h documentation: +/// - Most `ASCollectionDataSource` methods are called on the **main thread** +/// - `collectionNode:nodeBlockForItemAtIndexPath:` is documented as "Must be thread-safe +/// (can be called on the main thread or a background queue)" +/// - See ASCollectionNode.h lines 601 and 746-758 for official documentation +/// +/// ## Why Swift 5 mode? +/// +/// This module uses Swift 5 language mode because it wraps Objective-C protocols +/// (`ASCollectionDataSource`, `ASCollectionDelegate`) that lack Swift Concurrency annotations. +/// Using Swift 6 mode would require unsafe workarounds (`nonisolated(unsafe)`, +/// `MainActor.assumeIsolated`) that could lead to runtime crashes if assumptions change. +/// +/// When AsyncDisplayKit adds proper `@MainActor` annotations to its protocols, +/// this module can safely migrate to Swift 6 mode. +/// +/// Consumers using Swift 6 can import this module with: +/// ```swift +/// @preconcurrency import TextureIGListKitExtensions +/// ``` +// Bridge class that manually declares conformance to Interop protocols via runtime +@objc internal class IGListAdapterDataSourceBridge: NSObject, ASCollectionDataSource, ASCollectionDelegate, ASCollectionDelegateFlowLayout { + + // Override to manually declare protocol conformance at runtime (instance method) + override func conforms(to aProtocol: Protocol) -> Bool { + // Declare conformance to ASCollectionDataSourceInterop and ASCollectionDelegateInterop + if let interopDataSource = NSProtocolFromString("ASCollectionDataSourceInterop"), + protocol_isEqual(aProtocol, interopDataSource) { + return true + } + if let interopDelegate = NSProtocolFromString("ASCollectionDelegateInterop"), + protocol_isEqual(aProtocol, interopDelegate) { + return true + } + return super.conforms(to: aProtocol) + } + weak var listAdapter: ListAdapter? + weak var collectionDelegate: ASCollectionDelegate? + private var dataSource: UICollectionViewDataSource? { + return listAdapter as? UICollectionViewDataSource + } + private var delegate: UICollectionViewDelegateFlowLayout? { + return listAdapter as? UICollectionViewDelegateFlowLayout + } + + init(listAdapter: ListAdapter, collectionDelegate: ASCollectionDelegate?) { + self.listAdapter = listAdapter + self.collectionDelegate = collectionDelegate + super.init() + + // Configure updater for optimal AsyncDisplayKit compatibility and performance. + // + // Historical context (IGListKit < 5.0): + // The Objective-C implementation set `allowsBackgroundReloading = NO` to prevent + // IGListKit from falling back to `-reloadData`, which is incompatible with + // AsyncDisplayKit's asynchronous rendering. This flag was critical to avoid: + // - Cell flashing during async display + // - Broken background rendering + // - UI glitches when collection view goes off-screen + // + // IGListKit 5.0+ changes: + // The `allowsBackgroundReloading` property was removed in commit 032e1b0 because + // it caused more problems than it solved (performance issues, animation artifacts, + // broken snapshots). IGListKit 5.0+ now automatically uses batch updates correctly, + // making the old workaround unnecessary. + // See: https://github.com/Instagram/IGListKit/commit/032e1b0b8367e68ef3015f0dc7dfe2f3ff2bae0c + // + // New optimization (IGListKit 5.0+): + // We enable `allowsBackgroundDiffing` (introduced in commit 9a11f6b) to perform + // diffing on a background thread, which improves scroll performance. This is a + // different concern than the old flag and is safe to enable with AsyncDisplayKit. + // See: https://github.com/Instagram/IGListKit/commit/9a11f6b55f02a8a89494035fb17203655e454404 + if let updater = listAdapter.updater as? ListAdapterUpdater { + updater.allowsBackgroundDiffing = true + } + } + + // MARK: - Helper Methods + + private func sectionController(forSection section: Int) -> ListSectionController? { + guard let listAdapter = listAdapter, + let object = listAdapter.object(atSection: section) else { + return nil + } + return listAdapter.sectionController(for: object) + } + + // MARK: - ASCollectionDataSource + + func collectionNode(_ collectionNode: ASCollectionNode, numberOfItemsInSection section: Int) -> Int { + guard let dataSource = dataSource else { return 0 } + let collectionView = collectionNode.view as! UICollectionView + return dataSource.collectionView(collectionView, numberOfItemsInSection: section) + } + + func numberOfSections(in collectionNode: ASCollectionNode) -> Int { + guard let dataSource = dataSource else { return 0 } + let collectionView = collectionNode.view as! UICollectionView + return dataSource.numberOfSections?(in: collectionView) ?? 1 + } + + // This method must be thread-safe per AsyncDisplayKit documentation: + // "Must be thread-safe (can be called on the main thread or a background queue)" + func collectionNode(_ collectionNode: ASCollectionNode, nodeBlockForItemAt indexPath: IndexPath) -> ASCellNodeBlock { + // Capture section controller on calling thread (could be main or background) + guard let sectionController = sectionController(forSection: indexPath.section) else { + return { + let node = ASCellNode() + node.style.preferredSize = CGSize(width: 50, height: 50) + return node + } + } + + // Check if section controller conforms to ASSectionController protocol + // ASSectionController is defined in AsyncDisplayKit's IGListKit integration headers + guard let asSectionController = sectionController as? NSObject, + asSectionController.responds(to: NSSelectorFromString("nodeBlockForItemAtIndex:")) else { + return { + let node = ASCellNode() + node.style.preferredSize = CGSize(width: 50, height: 50) + return node + } + } + + // Call nodeBlockForItemAtIndex: on the section controller + // This returns an ASCellNodeBlock that we can return + let selector = NSSelectorFromString("nodeBlockForItemAtIndex:") + let method = asSectionController.method(for: selector) + typealias NodeBlockFunction = @convention(c) (NSObject, Selector, Int) -> ASCellNodeBlock + let nodeBlockFunc = unsafeBitCast(method, to: NodeBlockFunction.self) + return nodeBlockFunc(asSectionController, selector, indexPath.item) + } + + func collectionNode(_ collectionNode: ASCollectionNode, nodeForItemAt indexPath: IndexPath) -> ASCellNode { + guard let sectionController = sectionController(forSection: indexPath.section) else { + let node = ASCellNode() + node.style.preferredSize = CGSize(width: 50, height: 50) + return node + } + + // Check if section controller responds to nodeForItemAtIndex: + guard let asSectionController = sectionController as? NSObject, + asSectionController.responds(to: NSSelectorFromString("nodeForItemAtIndex:")) else { + let node = ASCellNode() + node.style.preferredSize = CGSize(width: 50, height: 50) + return node + } + + let selector = NSSelectorFromString("nodeForItemAtIndex:") + let method = asSectionController.method(for: selector) + typealias NodeFunction = @convention(c) (NSObject, Selector, Int) -> ASCellNode + let nodeFunc = unsafeBitCast(method, to: NodeFunction.self) + return nodeFunc(asSectionController, selector, indexPath.item) + } + + func collectionNode(_ collectionNode: ASCollectionNode, constrainedSizeForItemAt indexPath: IndexPath) -> ASSizeRange { + guard let sectionController = sectionController(forSection: indexPath.section) else { + return ASSizeRangeUnconstrained + } + + // Check if section controller responds to sizeRangeForItemAtIndex: + guard let asSectionController = sectionController as? NSObject, + asSectionController.responds(to: NSSelectorFromString("sizeRangeForItemAtIndex:")) else { + return ASSizeRangeUnconstrained + } + + let selector = NSSelectorFromString("sizeRangeForItemAtIndex:") + let method = asSectionController.method(for: selector) + typealias SizeRangeFunction = @convention(c) (NSObject, Selector, Int) -> ASSizeRange + let sizeRangeFunc = unsafeBitCast(method, to: SizeRangeFunction.self) + return sizeRangeFunc(asSectionController, selector, indexPath.item) + } + + // MARK: - ASCollectionDelegate + + func collectionNode(_ collectionNode: ASCollectionNode, didSelectItemAt indexPath: IndexPath) { + guard let delegate = delegate else { return } + let collectionView = collectionNode.view as! UICollectionView + delegate.collectionView?(collectionView, didSelectItemAt: indexPath) + } + + func collectionNode(_ collectionNode: ASCollectionNode, didDeselectItemAt indexPath: IndexPath) { + guard let delegate = delegate else { return } + let collectionView = collectionNode.view as! UICollectionView + delegate.collectionView?(collectionView, didDeselectItemAt: indexPath) + } + + func collectionNode(_ collectionNode: ASCollectionNode, didHighlightItemAt indexPath: IndexPath) { + guard let delegate = delegate else { return } + let collectionView = collectionNode.view as! UICollectionView + delegate.collectionView?(collectionView, didHighlightItemAt: indexPath) + } + + func collectionNode(_ collectionNode: ASCollectionNode, didUnhighlightItemAt indexPath: IndexPath) { + guard let delegate = delegate else { return } + let collectionView = collectionNode.view as! UICollectionView + delegate.collectionView?(collectionView, didUnhighlightItemAt: indexPath) + } + + func scrollViewDidScroll(_ scrollView: UIScrollView) { + delegate?.scrollViewDidScroll?(scrollView) + } + + func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { + delegate?.scrollViewWillBeginDragging?(scrollView) + } + + func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer) { + delegate?.scrollViewWillEndDragging?(scrollView, withVelocity: velocity, targetContentOffset: targetContentOffset) + } + + func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { + delegate?.scrollViewDidEndDragging?(scrollView, willDecelerate: decelerate) + } + + func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { + delegate?.scrollViewDidEndDecelerating?(scrollView) + } + + func collectionNode(_ collectionNode: ASCollectionNode, willDisplayItemWith node: ASCellNode) { + guard let delegate = delegate, + let indexPath = collectionNode.view.indexPath(for: node), + let contentView = node.view.superview, + let cell = contentView.superview as? UICollectionViewCell else { + return + } + delegate.collectionView?(collectionNode.view as! UICollectionView, willDisplay: cell, forItemAt: indexPath) + } + + func collectionNode(_ collectionNode: ASCollectionNode, didEndDisplayingItemWith node: ASCellNode) { + guard let delegate = delegate, + let indexPath = collectionNode.view.indexPath(for: node), + let contentView = node.view.superview, + let cell = contentView.superview as? UICollectionViewCell else { + return + } + delegate.collectionView?(collectionNode.view as! UICollectionView, didEndDisplaying: cell, forItemAt: indexPath) + } + + // MARK: - ASCollectionDelegateFlowLayout + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { + return delegate?.collectionView?(collectionView, layout: collectionViewLayout, insetForSectionAt: section) ?? .zero + } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { + return delegate?.collectionView?(collectionView, layout: collectionViewLayout, minimumLineSpacingForSectionAt: section) ?? 0 + } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { + return delegate?.collectionView?(collectionView, layout: collectionViewLayout, minimumInteritemSpacingForSectionAt: section) ?? 0 + } +} + +// MARK: - Supplementary View Source Methods + +/// Pure Swift implementation of ASIGListSupplementaryViewSourceMethods for SPM builds. +/// +/// ## Purpose +/// +/// This enum provides static helper methods for IGListKit section controllers that need to +/// display supplementary views (headers/footers) when using AsyncDisplayKit with SPM. +/// +/// ## Why This Exists +/// +/// The original Objective-C class `ASIGListSupplementaryViewSourceMethods` is wrapped in +/// `#if AS_IG_LIST_KIT` directives, which prevents it from being accessible in Swift when +/// using SPM (even with traits enabled). This is a Swift reimplementation of that functionality. +/// +/// ## Reference Implementation +/// +/// Based on the Objective-C implementation in: +/// - `Source/AsyncDisplayKit+IGListKitMethods.mm` (lines 36-51) +/// - Used in examples like `examples/ASDKgram/Sample/PhotoFeedSectionController.m` (lines 134-142) +/// +/// ## Usage +/// +/// Your section controller should: +/// 1. Conform to both `ListSupplementaryViewSource` (IGListKit) and `ASSupplementaryNodeSource` (AsyncDisplayKit) +/// 2. Use these methods in the required `IGListSupplementaryViewSource` protocol methods +/// 3. Implement the `ASSupplementaryNodeSource` protocol methods to provide nodes +/// +/// ### Example +/// +/// ```swift +/// class MySectionController: ListSectionController, ListSupplementaryViewSource { +/// +/// // MARK: - ListSupplementaryViewSource (IGListKit protocol) +/// +/// func supportedElementKinds() -> [String] { +/// return [UICollectionView.elementKindSectionHeader] +/// } +/// +/// func viewForSupplementaryElement( +/// ofKind elementKind: String, +/// at index: Int +/// ) -> UICollectionReusableView { +/// // Delegate to helper method +/// return SupplementaryViewSourceMethods.viewForSupplementaryElement( +/// ofKind: elementKind, +/// at: index, +/// sectionController: self +/// ) +/// } +/// +/// func sizeForSupplementaryView( +/// ofKind elementKind: String, +/// at index: Int +/// ) -> CGSize { +/// // Delegate to helper method +/// return SupplementaryViewSourceMethods.sizeForSupplementaryView( +/// ofKind: elementKind, +/// at: index +/// ) +/// } +/// } +/// +/// // MARK: - ASSupplementaryNodeSource (AsyncDisplayKit protocol) +/// +/// extension MySectionController: ASSupplementaryNodeSource { +/// +/// func nodeBlockForSupplementaryElement( +/// ofKind elementKind: String, +/// at index: Int +/// ) -> ASCellNodeBlock { +/// return { +/// let node = HeaderNode() +/// // Configure node... +/// return node +/// } +/// } +/// +/// func sizeRangeForSupplementaryElement( +/// ofKind elementKind: String, +/// at index: Int +/// ) -> ASSizeRange { +/// return ASSizeRange( +/// min: CGSize(width: 0, height: 44), +/// max: CGSize(width: CGFloat.infinity, height: 44) +/// ) +/// } +/// } +/// ``` +/// +/// ## Thread Safety +/// +/// These methods are safe to call from any thread, as they delegate to IGListKit's +/// thread-safe `ListCollectionContext` methods. +/// +/// ## See Also +/// +/// - `ASSupplementaryNodeSource` protocol for the AsyncDisplayKit side of supplementary views +/// - `ListSupplementaryViewSource` protocol for the IGListKit side +/// - Original Objective-C: `ASIGListSupplementaryViewSourceMethods` in `AsyncDisplayKit+IGListKitMethods.h` +public enum SupplementaryViewSourceMethods { + + /// Dequeues a reusable supplementary view for AsyncDisplayKit. + /// + /// This method should be called from your section controller's + /// `viewForSupplementaryElement(ofKind:at:)` method. + /// + /// ## How It Works + /// + /// This method asks IGListKit's collection context to dequeue a special + /// `_ASCollectionReusableView` that wraps an `ASCellNode`. AsyncDisplayKit + /// handles the node → view wrapping internally. + /// + /// ## Implementation Note + /// + /// Equivalent to calling: + /// ```objc + /// [sectionController.collectionContext + /// dequeueReusableSupplementaryViewOfKind:elementKind + /// forSectionController:sectionController + /// class:[_ASCollectionReusableView class] + /// atIndex:index]; + /// ``` + /// + /// - Parameters: + /// - elementKind: The kind of supplementary element (e.g., `UICollectionView.elementKindSectionHeader`) + /// - index: The index of the supplementary element + /// - sectionController: The section controller requesting the view + /// + /// - Returns: A dequeued `UICollectionReusableView` that wraps an `ASCellNode` + /// + /// - Warning: Your section controller MUST conform to `ASSupplementaryNodeSource` + /// and implement `nodeBlockForSupplementaryElement(ofKind:at:)` or + /// `nodeForSupplementaryElement(ofKind:at:)` for this to work. + @MainActor + public static func viewForSupplementaryElement( + ofKind elementKind: String, + at index: Int, + sectionController: ListSectionController + ) -> UICollectionReusableView { + guard let collectionContext = sectionController.collectionContext else { + assertionFailure("Collection context is nil. Has the section controller been added to an adapter?") + return UICollectionReusableView() + } + + // Get the _ASCollectionReusableView class dynamically + // This class is internal to AsyncDisplayKit and wraps ASCellNode in a UICollectionReusableView + guard let reusableViewClass = NSClassFromString("_ASCollectionReusableView") else { + assertionFailure("Could not find _ASCollectionReusableView class. Is AsyncDisplayKit properly linked?") + return UICollectionReusableView() + } + + // Dequeue using IGListKit's context + // The context knows to call our ASSupplementaryNodeSource methods + let view = collectionContext.dequeueReusableSupplementaryView( + ofKind: elementKind, + for: sectionController, + class: reusableViewClass as! UICollectionReusableView.Type, + at: index + ) + + return view + } + + /// Returns a size for supplementary views (always returns `.zero`). + /// + /// This method should be called from your section controller's + /// `sizeForSupplementaryView(ofKind:at:)` method. + /// + /// ## Why This Returns Zero + /// + /// AsyncDisplayKit uses its own sizing system based on `ASSizeRange` (via the + /// `sizeRangeForSupplementaryElement(ofKind:at:)` method in `ASSupplementaryNodeSource`). + /// The UIKit-based size returned here is ignored by AsyncDisplayKit's layout engine. + /// + /// Returning `.zero` here is intentional and matches the Objective-C implementation, + /// which triggers an assertion in debug builds if this method is unexpectedly called. + /// + /// ## Implementation Note + /// + /// Equivalent to: + /// ```objc + /// + (CGSize)sizeForSupplementaryViewOfKind:(NSString *)elementKind atIndex:(NSInteger)index { + /// ASDisplayNodeFailAssert(@"Did not expect %@ to be called.", NSStringFromSelector(_cmd)); + /// return CGSizeZero; + /// } + /// ``` + /// + /// - Parameters: + /// - elementKind: The kind of supplementary element (unused) + /// - index: The index of the supplementary element (unused) + /// + /// - Returns: Always returns `CGSize.zero` + /// + /// - Note: Your section controller should implement + /// `sizeRangeForSupplementaryElement(ofKind:at:)` from + /// `ASSupplementaryNodeSource` to control supplementary view sizing. + public static func sizeForSupplementaryView( + ofKind elementKind: String, + at index: Int + ) -> CGSize { + // This matches the Objective-C implementation which triggers ASDisplayNodeFailAssert + // We don't assert here because Swift doesn't have the same ASDisplayNodeFailAssert macro + // but we document that this should not be called and return zero + return .zero + } +} + +// MARK: - List Adapter Extension + +/// Swift extensions for IGListKit integration with Texture +extension ListAdapter { + + // Static key for associated object storage (analogous to _cmd in Objective-C) + private static var dataSourceKey: UInt8 = 0 + + /// Sets an ASCollectionNode as the collection view for this adapter. + /// + /// This method connects an ASCollectionNode to the IGListKit adapter by setting up + /// the appropriate data source bridging. This is a pure Swift implementation that + /// provides the same functionality as the Objective-C `setASDKCollectionNode:` method. + /// + /// - Parameter collectionNode: The ASCollectionNode to use with this adapter + /// + /// - Note: This method can only be called once per adapter and must be called on the main thread. + @MainActor + public func setCollectionNode(_ collectionNode: ASCollectionNode) { + // Use associated objects to store data source + let key = UnsafeRawPointer(&ListAdapter.dataSourceKey) + + if objc_getAssociatedObject(self, key) != nil { + assertionFailure("Attempt to call setCollectionNode multiple times on the same list adapter. Not currently allowed!") + return + } + + let dataSource = IGListAdapterDataSourceBridge(listAdapter: self, collectionDelegate: collectionNode.delegate) + objc_setAssociatedObject(self, key, dataSource, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + + collectionNode.dataSource = dataSource + collectionNode.delegate = dataSource + + if collectionNode.isNodeLoaded { + self.collectionView = collectionNode.view as? UICollectionView + } else { + collectionNode.onDidLoad { [weak self] node in + self?.collectionView = node.view as? UICollectionView + } + } + } +} diff --git a/Sources/TextureIGListKitExtensions/README.md b/Sources/TextureIGListKitExtensions/README.md new file mode 100644 index 000000000..5f2da3b1a --- /dev/null +++ b/Sources/TextureIGListKitExtensions/README.md @@ -0,0 +1,605 @@ +# TextureIGListKitExtensions + +Pure Swift implementation of IGListKit integration for Texture (AsyncDisplayKit) for Swift Package Manager. + +## Quick Summary + +- **What it does:** Connects `IGListAdapter` with `ASCollectionNode` via Swift API +- **Why needed:** SPM cannot export Objective-C categories on classes from other modules +- **What you get:** Swift extension methods + re-exported modules (AsyncDisplayKit, IGListKit, IGListDiffKit) +- **API:** `adapter.setCollectionNode(node)` (Swift-friendly wrapper) +- **Version:** Compatible with IGListKit 5.0+ + +## Overview + +This module provides Swift extension methods for `IGListAdapter` to enable seamless integration with `ASCollectionNode`. + +### Why This Exists + +**The Problem:** Swift Package Manager cannot export Objective-C categories on classes from other modules. The original Objective-C API `setASDKCollectionNode:` (defined in `IGListAdapter+AsyncDisplayKit.mm`) extends `IGListAdapter` class from the `IGListKit` module, which SPM cannot handle in source builds. + +**The Solution:** This is a pure Swift reimplementation that works around SPM's limitation. + +**Reference implementation:** This Swift code is based on the existing Objective-C implementation in: +- `Source/IGListAdapter+AsyncDisplayKit.mm` +- `Source/Private/ASIGListAdapterBasedDataSource.mm` +- `Source/Private/ASIGListAdapterBasedDataSource.h` + +## ⚠️ Important: IGListKit 5.0+ Updates + +**This package uses IGListKit 5.0+ (latest major version)** with important API changes: + +### Key Changes from IGListKit 4.x + +- `allowsBackgroundDiffing` (NEW) - enables background thread diffing for better performance +- `allowsBackgroundReloading` (REMOVED) - caused animation issues, automatically handled in 5.0+ + +### Updated API Calls + +**Old (IGListKit 4.x):** +```swift +updater.allowsBackgroundReloading = false // Removed in 5.0 +``` + +**New (IGListKit 5.0+):** +```swift +updater.allowsBackgroundDiffing = true // Use this instead +``` + +The Swift implementation (`IGListAdapterDataSourceBridge`) has been updated to use the new API. + +## What You Get + +When you `import TextureIGListKitExtensions`, you get: + +1. **ListAdapter extension method:** + ```swift + extension ListAdapter { + @MainActor + public func setCollectionNode(_ collectionNode: ASCollectionNode) + } + ``` + +2. **Supplementary view helper methods:** + ```swift + enum SupplementaryViewSourceMethods { + static func viewForSupplementaryElement( + ofKind elementKind: String, + at index: Int, + sectionController: ListSectionController + ) -> UICollectionReusableView + + static func sizeForSupplementaryView( + ofKind elementKind: String, + at index: Int + ) -> CGSize + } + ``` + +3. **Re-exported modules** (via `public import`): + - `AsyncDisplayKit` - All AsyncDisplayKit APIs (ASCollectionNode, ASCellNode, etc.) + - `IGListKit` - All IGListKit APIs (ListAdapter, ListSectionController, etc.) + - `IGListDiffKit` - Available through `IGListKit` transitive dependency (ListDiff, ListDiffable, etc.) + +This means **one import gives you everything**: +```swift +import TextureIGListKitExtensions + +// ListAdapter, ASCollectionNode, ListDiff, and setCollectionNode(_:) are all available! +let adapter = ListAdapter(...) +let node = ASCollectionNode(...) +adapter.setCollectionNode(node) + +// Supplementary view methods also available +class MySectionController: ListSectionController, ListSupplementaryViewSource { + func viewForSupplementaryElement(ofKind elementKind: String, at index: Int) -> UICollectionReusableView { + return SupplementaryViewSourceMethods.viewForSupplementaryElement( + ofKind: elementKind, + at: index, + sectionController: self + ) + } +} + +// IGListDiffKit also available +let result = ListDiff(oldArray: old, newArray: new, option: .equality) +``` + +## The Problem It Solves + +**IGListKit** works with `UICollectionView`. +**Texture (AsyncDisplayKit)** works with `ASCollectionNode` (which wraps UICollectionView + async rendering). + +To connect them, you need special bridging code that: +- Implements `ASCollectionDataSource` and `ASCollectionDelegate` +- Declares runtime conformance to `ASCollectionDataSourceInterop` (so ASCollectionView allows dataSource changes) +- Translates calls between IGListKit's `UICollectionView`-based API and AsyncDisplayKit's node-based API + +**This module provides that bridge in pure Swift.** + +## Using in iOS/tvOS App Projects + +Simply add Texture as a dependency and import both modules: + +**Step 1: Create Package Structure** + +Add a local package to your app project: + +``` +YourApp/ +├── YourApp.xcodeproj +├── YourApp/ # Your app source code +└── TextureWrapper/ # Local package wrapper + ├── Package.swift + └── Sources/ + └── TextureWrapper/ + └── TextureWrapper.swift (can be empty) +``` + +**Step 2: Configure Package.swift** + +```swift +// swift-tools-version: 6.1 +import PackageDescription + +let package = Package( + name: "TextureWrapper", + platforms: [ + .iOS(.v14), + .tvOS(.v14), + .macCatalyst(.v13) + ], + products: [ + .library( + name: "TextureWrapper", + targets: ["TextureWrapper"] + ) + ], + dependencies: [ + .package( + url: "https://github.com/TextureGroup/Texture.git", + from: "3.3.0" + ) + ], + targets: [ + .target( + name: "TextureWrapper", + dependencies: [ + .product(name: "AsyncDisplayKit", package: "Texture"), + .product(name: "TextureIGListKitExtensions", package: "Texture") + ] + ) + ] +) +``` + +**Step 3: Add to Xcode Project** + +1. Open your Xcode project +2. File → Add Package Dependencies → Add Local +3. Select the `TextureWrapper` folder +4. Add the `TextureWrapper` library to your app target + +**Important:** Do not add the intermediate package's Package.swift file to your Xcode project as a source file. The local package should only be referenced through Xcode's package dependencies system. If you accidentally add Package.swift to your project's source files, you will see compilation errors like "No such module 'PackageDescription'". If this happens, select Package.swift in Xcode's Project Navigator and delete it, choosing "Remove Reference" to keep the file on disk. + +**Step 4: Use in Your App** + +```swift +import AsyncDisplayKit +import IGListKit +import TextureIGListKitExtensions + +class MyViewController: UIViewController { + let collectionNode = ASCollectionNode(collectionViewLayout: UICollectionViewFlowLayout()) + lazy var adapter: ListAdapter = { + let adapter = ListAdapter(updater: ListAdapterUpdater(), viewController: self) + adapter.setCollectionNode(collectionNode) + return adapter + }() +} +``` + +## Migrating from CocoaPods + +If you're migrating from CocoaPods to SPM, here's what changes: + +### Before (CocoaPods) + +```swift +import AsyncDisplayKit +import IGListKit + +class MyViewController: UIViewController { + let collectionNode: ASCollectionNode + let adapter: ListAdapter + + override func viewDidLoad() { + super.viewDidLoad() + + adapter.dataSource = self + + // Objective-C method (no import needed, works automatically) + adapter.setASDKCollectionNode(collectionNode) + } +} +``` + +### After (SPM) + +```swift +import TextureIGListKitExtensions // New import (also brings AsyncDisplayKit & IGListKit) + +class MyViewController: UIViewController { + let collectionNode: ASCollectionNode + let adapter: ListAdapter + + override func viewDidLoad() { + super.viewDidLoad() + + adapter.dataSource = self + + // Swift method (note the name change: setASDKCollectionNode → setCollectionNode) + adapter.setCollectionNode(collectionNode) + } +} +``` + +### Migration Checklist + +1. ✅ Add `TextureIGListKitExtensions` import +2. ✅ Change `setASDKCollectionNode(_:)` to `setCollectionNode(_:)` +3. ✅ Remove separate `import AsyncDisplayKit` and `import IGListKit` (optional, as they're re-exported) + +**That's it!** Everything else remains the same. + +## Usage + +### Basic Setup + +```swift +import TextureIGListKitExtensions + +class MyViewController: ASViewController { + let collectionNode: ASCollectionNode + let adapter: ListAdapter + + init() { + let layout = UICollectionViewFlowLayout() + self.collectionNode = ASCollectionNode(collectionViewLayout: layout) + + let updater = ListAdapterUpdater() + self.adapter = ListAdapter(updater: updater, viewController: nil) + + super.init(node: ASDisplayNode()) + } + + override func viewDidLoad() { + super.viewDidLoad() + + adapter.dataSource = self + + // Connect ASCollectionNode to IGListAdapter + adapter.setCollectionNode(collectionNode) + + node.addSubnode(collectionNode) + node.layoutSpecBlock = { [weak self] _, _ in + guard let self = self else { return ASLayoutSpec() } + return ASInsetLayoutSpec( + insets: .zero, + child: self.collectionNode + ) + } + } +} + +extension MyViewController: ListAdapterDataSource { + func objects(for listAdapter: ListAdapter) -> [ListDiffable] { + return [] // Your data objects + } + + func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController { + return MySectionController() + } + + func emptyView(for listAdapter: ListAdapter) -> UIView? { + return nil + } +} +``` + +### Creating Section Controllers with ASCellNodes + +Section controllers can provide `ASCellNode` instances by implementing these Objective-C methods: + +```swift +import IGListKit +import AsyncDisplayKit + +class MySectionController: ListSectionController { + var item: MyItem? + + override func numberOfItems() -> Int { + return 1 + } + + override func didUpdate(to object: Any) { + self.item = object as? MyItem + } +} + +// Add AsyncDisplayKit support via Objective-C runtime methods +extension MySectionController { + // Called on background queue - must be thread-safe! + @objc func nodeBlockForItem(at index: Int) -> ASCellNodeBlock { + let item = self.item // Capture on calling thread + return { + return MyCellNode(item: item) + } + } + + // Provide size constraints for the node + @objc func sizeRangeForItem(at index: Int) -> ASSizeRange { + let width = self.collectionContext!.containerSize.width + return ASSizeRangeMake( + CGSize(width: width, height: 0), + CGSize(width: width, height: CGFloat.greatestFiniteMagnitude) + ) + } +} +``` + +### Example Cell Node + +```swift +import AsyncDisplayKit + +class MyCellNode: ASCellNode { + let textNode = ASTextNode() + + init(item: MyItem?) { + super.init() + automaticallyManagesSubnodes = true + + textNode.attributedText = NSAttributedString( + string: item?.title ?? "", + attributes: [.font: UIFont.systemFont(ofSize: 16)] + ) + } + + override func layoutSpecThatFits(_ constrainedSize: ASSizeRange) -> ASLayoutSpec { + return ASInsetLayoutSpec( + insets: UIEdgeInsets(top: 8, left: 16, bottom: 8, right: 16), + child: textNode + ) + } +} +``` + +### Supplementary Views (Headers/Footers) + +Section controllers can provide supplementary views (headers, footers) by conforming to both `ListSupplementaryViewSource` (IGListKit) and implementing AsyncDisplayKit node methods. + +**Step 1:** Make your section controller conform to `ListSupplementaryViewSource`: + +```swift +import TextureIGListKitExtensions + +class MySectionController: ListSectionController, ListSupplementaryViewSource { + + // MARK: - ListSupplementaryViewSource (IGListKit protocol) + + func supportedElementKinds() -> [String] { + return [UICollectionView.elementKindSectionHeader] + } + + func viewForSupplementaryElement( + ofKind elementKind: String, + at index: Int + ) -> UICollectionReusableView { + // Use helper method - this dequeues the view and wraps your ASCellNode + return SupplementaryViewSourceMethods.viewForSupplementaryElement( + ofKind: elementKind, + at: index, + sectionController: self + ) + } + + func sizeForSupplementaryView( + ofKind elementKind: String, + at index: Int + ) -> CGSize { + // Use helper method - returns .zero (AsyncDisplayKit handles sizing) + return SupplementaryViewSourceMethods.sizeForSupplementaryView( + ofKind: elementKind, + at: index + ) + } + + override func didUpdate(to object: Any) { + // Set yourself as supplementary view source + self.supplementaryViewSource = self + } +} +``` + +**Step 2:** Implement AsyncDisplayKit node methods using Objective-C runtime: + +```swift +// Add AsyncDisplayKit supplementary view support +extension MySectionController { + + // Provide node block for supplementary view + @objc func nodeBlockForSupplementaryElement( + ofKind elementKind: String, + at index: Int + ) -> ASCellNodeBlock { + return { + return HeaderNode() // Your custom ASCellNode + } + } + + // Provide size constraints for supplementary view + @objc func sizeRangeForSupplementaryElement( + ofKind elementKind: String, + at index: Int + ) -> ASSizeRange { + let width = self.collectionContext!.containerSize.width + return ASSizeRangeMake( + CGSize(width: width, height: 44), + CGSize(width: width, height: 44) + ) + } +} +``` + +**Step 3:** Create your supplementary node: + +```swift +import AsyncDisplayKit + +class HeaderNode: ASCellNode { + let titleNode = ASTextNode() + + override init() { + super.init() + automaticallyManagesSubnodes = true + + titleNode.attributedText = NSAttributedString( + string: "Section Header", + attributes: [ + .font: UIFont.boldSystemFont(ofSize: 18), + .foregroundColor: UIColor.label + ] + ) + } + + override func layoutSpecThatFits(_ constrainedSize: ASSizeRange) -> ASLayoutSpec { + return ASInsetLayoutSpec( + insets: UIEdgeInsets(top: 12, left: 16, bottom: 12, right: 16), + child: titleNode + ) + } +} +``` + +#### Migration from Objective-C + +If you're migrating from Objective-C code that used `ASIGListSupplementaryViewSourceMethods`: + +**Before (Objective-C, CocoaPods/Carthage):** +```objc +#import + +- (UICollectionReusableView *)viewForSupplementaryElementOfKind:(NSString *)elementKind atIndex:(NSInteger)index { + return [ASIGListSupplementaryViewSourceMethods + viewForSupplementaryElementOfKind:elementKind + atIndex:index + sectionController:self]; +} +``` + +**After (Swift, SPM):** +```swift +import TextureIGListKitExtensions + +func viewForSupplementaryElement(ofKind elementKind: String, at index: Int) -> UICollectionReusableView { + return SupplementaryViewSourceMethods.viewForSupplementaryElement( + ofKind: elementKind, + at: index, + sectionController: self + ) +} +``` + +The functionality is identical - the Swift version replaces the unavailable Objective-C class. + +## How It Works Internally + +The module consists of three components: + +### 1. `IGListAdapterDataSourceBridge` (internal) +A bridge class that: +- Conforms to `ASCollectionDataSource`, `ASCollectionDelegate`, `ASCollectionDelegateFlowLayout` +- **Overrides `conforms(to:)`** to declare runtime conformance to: + - `ASCollectionDataSourceInterop` - allows changing dataSource after ASCollectionView init + - `ASCollectionDelegateInterop` - allows changing delegate after ASCollectionView init +- Forwards calls between IGListKit's adapter and AsyncDisplayKit's collection node +- Uses Objective-C runtime (`unsafeBitCast`) to call section controller methods like `nodeBlockForItemAtIndex:` + +This mirrors the behavior of `ASIGListAdapterBasedDataSource` from the Objective-C implementation. + +### 2. `ListAdapter.setCollectionNode(_:)` (public) +The public API that: +- Creates and retains the bridge instance (via associated objects with static key) +- Sets `collectionNode.dataSource` and `collectionNode.delegate` to the bridge +- Sets `adapter.collectionView` when the node loads (handles both loaded and unloaded states) +- Can only be called **once** per adapter (enforced with `assertionFailure`) + +### 3. `SupplementaryViewSourceMethods` (public) +Helper methods for supplementary views (headers/footers): + +**`viewForSupplementaryElement(ofKind:at:sectionController:)`** +- Dequeues `_ASCollectionReusableView` (AsyncDisplayKit's internal wrapper class) via IGListKit's collection context +- Returns a `UICollectionReusableView` that wraps an `ASCellNode` +- Equivalent to `ASIGListSupplementaryViewSourceMethods.viewForSupplementaryElementOfKind:atIndex:sectionController:` from Objective-C + +**`sizeForSupplementaryView(ofKind:at:)`** +- Always returns `CGSize.zero` (AsyncDisplayKit handles sizing via `ASSizeRange`) +- Equivalent to `ASIGListSupplementaryViewSourceMethods.sizeForSupplementaryViewOfKind:atIndex:` from Objective-C +- The Objective-C version triggers an assertion if called; we document it should not be called + +These methods provide Swift access to functionality that is unavailable from Objective-C classes wrapped in `#if AS_IG_LIST_KIT` directives when using SPM + +This replicates the behavior of `-[IGListAdapter setASDKCollectionNode:]` from the Objective-C implementation. + +## Important Notes + +### Thread Safety +According to AsyncDisplayKit documentation: +- Most `ASCollectionDataSource` methods are called on the **main thread** +- `collectionNode:nodeBlockForItemAtIndexPath:` can be called on **background queue** + +This implementation correctly handles both cases, following the same patterns as the Objective-C version. + +### Swift 6 Compatibility +This module uses **Swift 5 language mode** because it wraps Objective-C protocols (`ASCollectionDataSource`, `ASCollectionDelegate`) that lack Swift Concurrency annotations. + +If you're using Swift 6, import with `@preconcurrency`: +```swift +@preconcurrency import TextureIGListKitExtensions +``` + +When AsyncDisplayKit adds proper `@MainActor` annotations, this module can migrate to Swift 6 mode. + +### Objective-C Interop +Section controllers must implement methods using `@objc` attribute: +- `@objc func nodeBlockForItem(at:) -> ASCellNodeBlock` +- `@objc func sizeRangeForItem(at:) -> ASSizeRange` + +These are called via Objective-C runtime because Swift can't directly express these method signatures in protocol form (they return blocks and use Objective-C types). + +## Examples + +See working examples in the repository: + +- **SPMWithIGListKit** (`examples/SPMWithIGListKit`) - SPM library package with IGListKit trait enabled. Demonstrates how to create reusable Swift packages that use Texture with IGListKit. + +- **ASIGListKitSPM** (`examples/ASIGListKitSPM`) - Complete iOS app project demonstrating the local package wrapper approach. Shows real-world integration with section controllers using Pure Swift API. + +These examples demonstrate: +- How to enable IGListKit trait in different project types +- Pure Swift API usage with `setCollectionNode(_:)` +- Section controllers implementing `ASSectionController` protocol +- Runtime selector methods with `@objc` attributes +- Complete working integration with tests + +## Requirements + +- iOS 14.0+ / tvOS 14.0+ / Mac Catalyst 13.0+ +- Swift 6.1+ +- Texture (AsyncDisplayKit) via SPM with `IGListKit` trait enabled +- IGListKit 5.0+ + +## License + +Licensed under Apache 2.0. Copyright (c) Pinterest, Inc. diff --git a/build.sh b/build.sh index 37e34a523..3854f6b49 100755 --- a/build.sh +++ b/build.sh @@ -9,8 +9,8 @@ # echo ************* diagnostics end # run this on a 2x device until we've updated snapshot images to 3x -PLATFORM="${TEXTURE_BUILD_PLATFORM:-platform=iOS Simulator,OS=18.5,name=iPhone SE (3rd generation)}" -SDK="${TEXTURE_BUILD_SDK:-iphonesimulator18.5}" +PLATFORM="${TEXTURE_BUILD_PLATFORM:-platform=iOS Simulator,OS=26.0,name=iPhone 17}" +SDK="${TEXTURE_BUILD_SDK:-iphonesimulator26.0}" DERIVED_DATA_PATH="~/ASDKDerivedData" # It is pitch black. @@ -267,6 +267,83 @@ carthage|all) success="1" ;; +spm|all) + echo "Verifying Swift Package Manager works." + + # Generate SPM symlinks + echo "Generating SPM layout..." + swift scripts/generate_spm_sources_layout.swift + + # Build with default traits + echo "Building with default traits..." + set -o pipefail && xcodebuild \ + -scheme AsyncDisplayKit \ + -sdk "$SDK" \ + -destination "$PLATFORM" \ + clean build + success="1" + ;; + +spm-texture-basic) + echo "Testing SPMBasic example (verifying committed SPM layout)." + + # DO NOT regenerate - test that committed spm/Sources is valid + echo "Using committed SPM layout (no regeneration)..." + + # Test SPMBasic example (build and test) + echo "Building and testing SPMBasic example..." + cd examples/SPMBasic + set -o pipefail && xcodebuild \ + -scheme SPMBasic \ + -sdk "$SDK" \ + -destination "$PLATFORM" \ + clean build test + cd ../.. + + success="1" + ;; + +spm-texture-iglistkit) + echo "Testing SPMWithIGListKit example (testing SPM generation script)." + + # Clean and regenerate to verify generation script works + echo "Cleaning generated SPM directory..." + rm -rf spm/Sources + + echo "Generating SPM layout from scratch..." + swift scripts/generate_spm_sources_layout.swift + + # Test SPMWithIGListKit example (build and test) + echo "Building and testing SPMWithIGListKit example..." + cd examples/SPMWithIGListKit + set -o pipefail && xcodebuild \ + -scheme SPMWithIGListKit \ + -sdk "$SDK" \ + -destination "$PLATFORM" \ + clean build test + cd ../.. + + success="1" + ;; + +spm-app-iglistkit) + echo "Testing ASIGListKitSPM iOS app example (local package wrapper approach)." + + # DO NOT regenerate - reuse SPM layout from previous tests + + # Test ASIGListKitSPM iOS app example (build only) + echo "Building ASIGListKitSPM iOS app example..." + cd examples/ASIGListKitSPM + set -o pipefail && xcodebuild \ + -scheme ASIGListKitSPM \ + -sdk "$SDK" \ + -destination "$PLATFORM" \ + clean build + cd ../.. + + success="1" + ;; + *) echo "Unrecognized mode '$MODE'." ;; diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/project.pbxproj b/examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/project.pbxproj new file mode 100644 index 000000000..72fe8958c --- /dev/null +++ b/examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/project.pbxproj @@ -0,0 +1,1318 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 60; + objects = { + +/* Begin PBXBuildFile section */ + 0A069C022EAD66A0008ABA37 /* TextureIGListKitExtensions in Frameworks */ = {isa = PBXBuildFile; productRef = 0A069C012EAD66A0008ABA37 /* TextureIGListKitExtensions */; }; + 0A069C122EAF7997008ABA37 /* AsyncDisplayKit in Frameworks */ = {isa = PBXBuildFile; productRef = 0A069C112EAF7997008ABA37 /* AsyncDisplayKit */; }; + FB32E77F25768F45000C4F42 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB32E77E25768F45000C4F42 /* AppDelegate.swift */; }; + FB32E78125768F45000C4F42 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB32E78025768F45000C4F42 /* SceneDelegate.swift */; }; + FB32E78325768F45000C4F42 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB32E78225768F45000C4F42 /* ViewController.swift */; }; + FB32E78625768F45000C4F42 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FB32E78425768F45000C4F42 /* Main.storyboard */; }; + FB32E78825768F48000C4F42 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FB32E78725768F48000C4F42 /* Assets.xcassets */; }; + FB32E78B25768F48000C4F42 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FB32E78925768F48000C4F42 /* LaunchScreen.storyboard */; }; + FB32E79B2576A451000C4F42 /* MainListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB32E79A2576A451000C4F42 /* MainListViewController.swift */; }; + FB3894AB257705190025252E /* ItemSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB3894AA257705190025252E /* ItemSectionController.swift */; }; + FB3894B2257705A80025252E /* NSObject+ListDiffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB3894B1257705A80025252E /* NSObject+ListDiffable.swift */; }; + FB3894B5257705EF0025252E /* Item.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB3894B4257705EF0025252E /* Item.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 0AB678312EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB677E92EA4F7AC003D806F /* PINOperation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = CC01052D1E27110D00890935; + remoteInfo = PINOperation; + }; + 0AB678332EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB677E92EA4F7AC003D806F /* PINOperation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = CC0105561E27116600890935; + remoteInfo = PINOperationTests; + }; + 0AB678352EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB677E92EA4F7AC003D806F /* PINOperation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = CC01053D1E27113700890935; + remoteInfo = "PINOperation-tvOS"; + }; + 0AB678372EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB677E92EA4F7AC003D806F /* PINOperation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = CC0105651E27117300890935; + remoteInfo = "PINOperation-tvOSTests"; + }; + 0AB678392EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB677E92EA4F7AC003D806F /* PINOperation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = CC01054A1E27114300890935; + remoteInfo = "PINOperation-macOS"; + }; + 0AB6783B2EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB677E92EA4F7AC003D806F /* PINOperation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = CC0105741E27117F00890935; + remoteInfo = "PINOperation-macOSTests"; + }; + 0AB6783D2EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB677E92EA4F7AC003D806F /* PINOperation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3201178C24444859004FD783; + remoteInfo = "PINOperation-watchOS"; + }; + 0AB6783F2EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB677E92EA4F7AC003D806F /* PINOperation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 686ECEDE2BE474F300634D9F; + remoteInfo = "PINOperation-watchOSTests"; + }; + 0AB678412EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB677E92EA4F7AC003D806F /* PINOperation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 6817A6522BE46E48007710C1; + remoteInfo = "PINOperation-visionOS"; + }; + 0AB678432EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB677E92EA4F7AC003D806F /* PINOperation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 6850F2EE2BE471CB00A38144; + remoteInfo = "PINOperation-visionOSTests"; + }; + 0AB678462EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB677C22EA4F7AC003D806F /* PINOperationExample.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 1387274B245D5BB500C1F56D; + remoteInfo = PINOperationExample; + }; + 0AB67CCF2EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB679A72EA4F7AC003D806F /* IGListKit.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 887D0B361D870D7E009E01F7; + remoteInfo = IGListKit; + }; + 0AB67CD12EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB679A72EA4F7AC003D806F /* IGListKit.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 887D0B3F1D870D7F009E01F7; + remoteInfo = IGListKitTests; + }; + 0AB67CD32EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB679A72EA4F7AC003D806F /* IGListKit.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 885FE1D41DC51A0D009CE2B4; + remoteInfo = "IGListKit-tvOS"; + }; + 0AB67CD52EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB679A72EA4F7AC003D806F /* IGListKit.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 885FE1DC1DC51A0D009CE2B4; + remoteInfo = "IGListKit-tvOSTests"; + }; + 0AB67CD72EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB679A72EA4F7AC003D806F /* IGListKit.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = DD3152AC1DE227FA00AC9D2C; + remoteInfo = "IGListKit-macOS"; + }; + 0AB67CD92EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB679A72EA4F7AC003D806F /* IGListKit.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 88DF897C1E010E6A00B1B9B4; + remoteInfo = "IGListKit-macOSTests"; + }; + 0AB67CDB2EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB679A72EA4F7AC003D806F /* IGListKit.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 7A02D01D2361520200B49FAE; + remoteInfo = IGListDiffKit; + }; + 0AB67CDD2EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB679A72EA4F7AC003D806F /* IGListKit.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 7A02D02B2361525800B49FAE; + remoteInfo = "IGListDiffKit-tvOS"; + }; + 0AB67CDF2EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB679A72EA4F7AC003D806F /* IGListKit.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 7A02D0382361526600B49FAE; + remoteInfo = "IGListDiffKit-macOS"; + }; + 0AB67CE12EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB679A72EA4F7AC003D806F /* IGListKit.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 7A92EA9723A8A42000E5A13D; + remoteInfo = IGListSwiftKit; + }; + 0AB67CE32EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB679A72EA4F7AC003D806F /* IGListKit.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 7A92EAA823A8A50100E5A13D; + remoteInfo = "IGListSwiftKit-tvOS"; + }; + 0AB67CE62EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB678E72EA4F7AC003D806F /* IGListKitExamples.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 888609051DEF38A00019A4A5; + remoteInfo = IGListKitExamples; + }; + 0AB67CE92EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB678FE2EA4F7AC003D806F /* IGListKitExamples.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 98ED5C171DC52AD400EA56B2; + remoteInfo = IGListKitExamples; + }; + 0AB67CEF2EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB678D12EA4F7AC003D806F /* IGListKitExamples.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2961B38A1D68B031001C9451; + remoteInfo = IGListKitExamples; + }; + 0AB67CF12EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB678D12EA4F7AC003D806F /* IGListKitExamples.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 986FB7111DBBA60900A65C18; + remoteInfo = IGListKitMessageExample; + }; + 0AB67CF32EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB678D12EA4F7AC003D806F /* IGListKitExamples.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 986FB72F1DBBAD8600A65C18; + remoteInfo = IGListKitTodayExample; + }; + 0AB67CF52EA4F7AC003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB678D12EA4F7AC003D806F /* IGListKitExamples.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 95F7F9111DE5006B00A64FEE; + remoteInfo = "IGListKitExamples-UITests"; + }; + 0AB67F9C2EA4F7C5003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB67DDC2EA4F7C4003D806F /* Example-Mac.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 9DC09DB31C39AB0D00C6451E; + remoteInfo = "Example-Mac"; + }; + 0AB67F9F2EA4F7C5003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB67DF12EA4F7C4003D806F /* Example-tvOS.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 78699F441C668C8E0044C9E9; + remoteInfo = "Example-tvOS"; + }; + 0AB67FA22EA4F7C5003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB67E002EA4F7C4003D806F /* Example-Xcode-SPM.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = FB3894C92577F22F0025252E; + remoteInfo = "Example-Xcode-SPM"; + }; + 0AB67FA52EA4F7C5003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB67DB32EA4F7C4003D806F /* Example.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 6003F58A195388D20070C39A; + remoteInfo = Example; + }; + 0AB67FA82EA4F7C5003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB67D2A2EA4F7C4003D806F /* PINCache-SPM-Integration.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = E03DEABE25671BA900ACCAFC; + remoteInfo = "PINCache-SPM-Integration"; + }; + 0AB67FB42EA4F7C5003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB67D5A2EA4F7C4003D806F /* PINCache.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = CC0105B11E271A1600890935; + remoteInfo = PINCache; + }; + 0AB67FB62EA4F7C5003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB67D5A2EA4F7C4003D806F /* PINCache.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = CC0105DA1E271A5C00890935; + remoteInfo = PINCacheTests; + }; + 0AB67FB82EA4F7C5003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB67D5A2EA4F7C4003D806F /* PINCache.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = CC0105C11E271A4000890935; + remoteInfo = "PINCache-tvOS"; + }; + 0AB67FBA2EA4F7C5003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB67D5A2EA4F7C4003D806F /* PINCache.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = CC0105E91E271A6400890935; + remoteInfo = "PINCache-tvOSTests"; + }; + 0AB67FBC2EA4F7C5003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB67D5A2EA4F7C4003D806F /* PINCache.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = CC0105CE1E271A4900890935; + remoteInfo = "PINCache-macOS"; + }; + 0AB67FBE2EA4F7C5003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB67D5A2EA4F7C4003D806F /* PINCache.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = CC0105F81E271A7300890935; + remoteInfo = "PINCache-macOSTests"; + }; + 0AB67FC02EA4F7C5003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB67D5A2EA4F7C4003D806F /* PINCache.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 68F2102B2BE55BDE00CFE762; + remoteInfo = "PINCache-visionOS"; + }; + 0AB67FC22EA4F7C5003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB67D5A2EA4F7C4003D806F /* PINCache.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 68F2103C2BE55C6C00CFE762; + remoteInfo = "PINCache-visionOSTests"; + }; + 0AB67FC42EA4F7C5003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB67D5A2EA4F7C4003D806F /* PINCache.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 320117A124444DF7004FD783; + remoteInfo = "PINCache-watchOS"; + }; + 0AB67FC62EA4F7C5003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB67D5A2EA4F7C4003D806F /* PINCache.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 683188E32BE56C5C00031329; + remoteInfo = "PINCache-watchOSTests"; + }; + 0AB67FCC2EA4F7C5003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB67E8E2EA4F7C4003D806F /* PINRemoteImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = F1B918D11BCF239200710963; + remoteInfo = PINRemoteImage; + }; + 0AB67FCE2EA4F7C5003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB67E8E2EA4F7C4003D806F /* PINRemoteImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 68A0FC191E523434000B552D; + remoteInfo = PINRemoteImageTests; + }; + 0AB67FD02EA4F7C5003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB67E8E2EA4F7C4003D806F /* PINRemoteImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 139D3A5A1F67284400F82935; + remoteInfo = "PINRemoteImage-tvOS"; + }; + 0AB67FD22EA4F7C5003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB67E8E2EA4F7C4003D806F /* PINRemoteImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 139D3A621F67284400F82935; + remoteInfo = "PINRemoteImage-tvOSTests"; + }; + 0AB67FD52EA4F7C5003D806F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0AB67E142EA4F7C4003D806F /* Swift-Example.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 8E5005461C4F62EB0095AD0F; + remoteInfo = "Swift-Example"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 0AB677C22EA4F7AC003D806F /* PINOperationExample.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = PINOperationExample.xcodeproj; sourceTree = ""; }; + 0AB677E92EA4F7AC003D806F /* PINOperation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = PINOperation.xcodeproj; sourceTree = ""; }; + 0AB678D12EA4F7AC003D806F /* IGListKitExamples.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = IGListKitExamples.xcodeproj; sourceTree = ""; }; + 0AB678E72EA4F7AC003D806F /* IGListKitExamples.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = IGListKitExamples.xcodeproj; sourceTree = ""; }; + 0AB678FE2EA4F7AC003D806F /* IGListKitExamples.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = IGListKitExamples.xcodeproj; sourceTree = ""; }; + 0AB679A72EA4F7AC003D806F /* IGListKit.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = IGListKit.xcodeproj; sourceTree = ""; }; + 0AB67D2A2EA4F7C4003D806F /* PINCache-SPM-Integration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = "PINCache-SPM-Integration.xcodeproj"; sourceTree = ""; }; + 0AB67D5A2EA4F7C4003D806F /* PINCache.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = PINCache.xcodeproj; sourceTree = ""; }; + 0AB67DB32EA4F7C4003D806F /* Example.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = Example.xcodeproj; sourceTree = ""; }; + 0AB67DDC2EA4F7C4003D806F /* Example-Mac.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = "Example-Mac.xcodeproj"; sourceTree = ""; }; + 0AB67DF12EA4F7C4003D806F /* Example-tvOS.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = "Example-tvOS.xcodeproj"; sourceTree = ""; }; + 0AB67E002EA4F7C4003D806F /* Example-Xcode-SPM.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = "Example-Xcode-SPM.xcodeproj"; sourceTree = ""; }; + 0AB67E142EA4F7C4003D806F /* Swift-Example.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = "Swift-Example.xcodeproj"; sourceTree = ""; }; + 0AB67E8E2EA4F7C4003D806F /* PINRemoteImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = PINRemoteImage.xcodeproj; sourceTree = ""; }; + FB32E77B25768F45000C4F42 /* ASIGListKitSPM.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ASIGListKitSPM.app; sourceTree = BUILT_PRODUCTS_DIR; }; + FB32E77E25768F45000C4F42 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + FB32E78025768F45000C4F42 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + FB32E78225768F45000C4F42 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + FB32E78525768F45000C4F42 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + FB32E78725768F48000C4F42 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + FB32E78A25768F48000C4F42 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + FB32E78C25768F48000C4F42 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + FB32E79A2576A451000C4F42 /* MainListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainListViewController.swift; sourceTree = ""; }; + FB3894AA257705190025252E /* ItemSectionController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemSectionController.swift; sourceTree = ""; }; + FB3894B1257705A80025252E /* NSObject+ListDiffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSObject+ListDiffable.swift"; sourceTree = ""; }; + FB3894B4257705EF0025252E /* Item.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Item.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + FB32E77825768F45000C4F42 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0A069C022EAD66A0008ABA37 /* TextureIGListKitExtensions in Frameworks */, + 0A069C122EAF7997008ABA37 /* AsyncDisplayKit in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0AB677ED2EA4F7AC003D806F /* Products */ = { + isa = PBXGroup; + children = ( + 0AB678322EA4F7AC003D806F /* PINOperation.framework */, + 0AB678342EA4F7AC003D806F /* PINOperationTests.xctest */, + 0AB678362EA4F7AC003D806F /* PINOperation.framework */, + 0AB678382EA4F7AC003D806F /* PINOperation-tvOSTests.xctest */, + 0AB6783A2EA4F7AC003D806F /* PINOperation.framework */, + 0AB6783C2EA4F7AC003D806F /* PINOperation-macOSTests.xctest */, + 0AB6783E2EA4F7AC003D806F /* PINOperation.framework */, + 0AB678402EA4F7AC003D806F /* PINOperation-watchOSTests.xctest */, + 0AB678422EA4F7AC003D806F /* PINOperation.framework */, + 0AB678442EA4F7AC003D806F /* PINOperation-visionOSTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 0AB677EF2EA4F7AC003D806F /* Products */ = { + isa = PBXGroup; + children = ( + 0AB678472EA4F7AC003D806F /* PINOperationExample.app */, + ); + name = Products; + sourceTree = ""; + }; + 0AB679AF2EA4F7AC003D806F /* Products */ = { + isa = PBXGroup; + children = ( + 0AB67CD02EA4F7AC003D806F /* IGListKit.framework */, + 0AB67CD22EA4F7AC003D806F /* IGListKitTests.xctest */, + 0AB67CD42EA4F7AC003D806F /* IGListKit.framework */, + 0AB67CD62EA4F7AC003D806F /* IGListKit-tvOSTests.xctest */, + 0AB67CD82EA4F7AC003D806F /* IGListKit.framework */, + 0AB67CDA2EA4F7AC003D806F /* IGListKit-macOSTests.xctest */, + 0AB67CDC2EA4F7AC003D806F /* IGListDiffKit.framework */, + 0AB67CDE2EA4F7AC003D806F /* IGListDiffKit.framework */, + 0AB67CE02EA4F7AC003D806F /* IGListDiffKit.framework */, + 0AB67CE22EA4F7AC003D806F /* IGListSwiftKit.framework */, + 0AB67CE42EA4F7AC003D806F /* IGListSwiftKit.framework */, + ); + name = Products; + sourceTree = ""; + }; + 0AB679B12EA4F7AC003D806F /* Products */ = { + isa = PBXGroup; + children = ( + 0AB67CE72EA4F7AC003D806F /* IGListKitExamples.app */, + ); + name = Products; + sourceTree = ""; + }; + 0AB679B32EA4F7AC003D806F /* Products */ = { + isa = PBXGroup; + children = ( + 0AB67CEA2EA4F7AC003D806F /* IGListKitExamples.app */, + ); + name = Products; + sourceTree = ""; + }; + 0AB679B52EA4F7AC003D806F /* Products */ = { + isa = PBXGroup; + children = ( + 0AB67CF02EA4F7AC003D806F /* IGListKitExamples.app */, + 0AB67CF22EA4F7AC003D806F /* IGListKitMessageExample.appex */, + 0AB67CF42EA4F7AC003D806F /* IGListKitTodayExample.appex */, + 0AB67CF62EA4F7AC003D806F /* IGListKitExamples-UITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 0AB67D5F2EA4F7C4003D806F /* Products */ = { + isa = PBXGroup; + children = ( + 0AB67FA92EA4F7C5003D806F /* PINCache-SPM-Integration.app */, + ); + name = Products; + sourceTree = ""; + }; + 0AB67D612EA4F7C4003D806F /* Products */ = { + isa = PBXGroup; + children = ( + 0AB67FB52EA4F7C5003D806F /* PINCache.framework */, + 0AB67FB72EA4F7C5003D806F /* PINCacheTests.xctest */, + 0AB67FB92EA4F7C5003D806F /* PINCache.framework */, + 0AB67FBB2EA4F7C5003D806F /* PINCache-tvOSTests.xctest */, + 0AB67FBD2EA4F7C5003D806F /* PINCache.framework */, + 0AB67FBF2EA4F7C5003D806F /* PINCache-macOSTests.xctest */, + 0AB67FC12EA4F7C5003D806F /* PINCache.framework */, + 0AB67FC32EA4F7C5003D806F /* PINCache-visionOSTests.xctest */, + 0AB67FC52EA4F7C5003D806F /* PINCache.framework */, + 0AB67FC72EA4F7C5003D806F /* PINCache-watchOSTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 0AB67E942EA4F7C4003D806F /* Products */ = { + isa = PBXGroup; + children = ( + 0AB67FD62EA4F7C5003D806F /* Swift-Example.app */, + ); + name = Products; + sourceTree = ""; + }; + 0AB67E962EA4F7C4003D806F /* Products */ = { + isa = PBXGroup; + children = ( + 0AB67FA02EA4F7C5003D806F /* Example-tvOS.app */, + ); + name = Products; + sourceTree = ""; + }; + 0AB67E982EA4F7C4003D806F /* Products */ = { + isa = PBXGroup; + children = ( + 0AB67FA62EA4F7C5003D806F /* Example.app */, + ); + name = Products; + sourceTree = ""; + }; + 0AB67E9A2EA4F7C4003D806F /* Products */ = { + isa = PBXGroup; + children = ( + 0AB67F9D2EA4F7C5003D806F /* Example-Mac.app */, + ); + name = Products; + sourceTree = ""; + }; + 0AB67E9C2EA4F7C4003D806F /* Products */ = { + isa = PBXGroup; + children = ( + 0AB67FA32EA4F7C5003D806F /* Example-Xcode-SPM.app */, + ); + name = Products; + sourceTree = ""; + }; + 0AB67E9E2EA4F7C4003D806F /* Products */ = { + isa = PBXGroup; + children = ( + 0AB67FCD2EA4F7C5003D806F /* PINRemoteImage.framework */, + 0AB67FCF2EA4F7C5003D806F /* PINRemoteImageTests.xctest */, + 0AB67FD12EA4F7C5003D806F /* PINRemoteImage.framework */, + 0AB67FD32EA4F7C5003D806F /* PINRemoteImage-tvOSTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + FB32E77225768F45000C4F42 = { + isa = PBXGroup; + children = ( + FB32E77D25768F45000C4F42 /* ASIGListKitSPM */, + FB32E77C25768F45000C4F42 /* Products */, + FB38949F2576FB670025252E /* Frameworks */, + ); + sourceTree = ""; + }; + FB32E77C25768F45000C4F42 /* Products */ = { + isa = PBXGroup; + children = ( + FB32E77B25768F45000C4F42 /* ASIGListKitSPM.app */, + ); + name = Products; + sourceTree = ""; + }; + FB32E77D25768F45000C4F42 /* ASIGListKitSPM */ = { + isa = PBXGroup; + children = ( + FB3894AE2577054F0025252E /* Extensions */, + FB3894AD2577053C0025252E /* Models */, + FB3894A9257704EF0025252E /* Section Controllers */, + FB32E77E25768F45000C4F42 /* AppDelegate.swift */, + FB32E78025768F45000C4F42 /* SceneDelegate.swift */, + FB32E78225768F45000C4F42 /* ViewController.swift */, + FB32E78425768F45000C4F42 /* Main.storyboard */, + FB32E78725768F48000C4F42 /* Assets.xcassets */, + FB32E78925768F48000C4F42 /* LaunchScreen.storyboard */, + FB32E78C25768F48000C4F42 /* Info.plist */, + FB32E79A2576A451000C4F42 /* MainListViewController.swift */, + ); + path = ASIGListKitSPM; + sourceTree = ""; + }; + FB38949F2576FB670025252E /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; + FB3894A9257704EF0025252E /* Section Controllers */ = { + isa = PBXGroup; + children = ( + FB3894AA257705190025252E /* ItemSectionController.swift */, + ); + path = "Section Controllers"; + sourceTree = ""; + }; + FB3894AD2577053C0025252E /* Models */ = { + isa = PBXGroup; + children = ( + FB3894B4257705EF0025252E /* Item.swift */, + ); + path = Models; + sourceTree = ""; + }; + FB3894AE2577054F0025252E /* Extensions */ = { + isa = PBXGroup; + children = ( + FB3894B1257705A80025252E /* NSObject+ListDiffable.swift */, + ); + path = Extensions; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + FB32E77A25768F45000C4F42 /* ASIGListKitSPM */ = { + isa = PBXNativeTarget; + buildConfigurationList = FB32E78F25768F48000C4F42 /* Build configuration list for PBXNativeTarget "ASIGListKitSPM" */; + buildPhases = ( + FB32E77725768F45000C4F42 /* Sources */, + FB32E77825768F45000C4F42 /* Frameworks */, + FB32E77925768F45000C4F42 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ASIGListKitSPM; + packageProductDependencies = ( + 0A069C012EAD66A0008ABA37 /* TextureIGListKitExtensions */, + 0A069C112EAF7997008ABA37 /* AsyncDisplayKit */, + ); + productName = ASIGListKitSPM; + productReference = FB32E77B25768F45000C4F42 /* ASIGListKitSPM.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + FB32E77325768F45000C4F42 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1220; + LastUpgradeCheck = 1220; + TargetAttributes = { + FB32E77A25768F45000C4F42 = { + CreatedOnToolsVersion = 12.2; + }; + }; + }; + buildConfigurationList = FB32E77625768F45000C4F42 /* Build configuration list for PBXProject "ASIGListKitSPM" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = FB32E77225768F45000C4F42; + packageReferences = ( + 0A069C002EAD66A0008ABA37 /* XCLocalSwiftPackageReference "../../../Texture" */, + ); + productRefGroup = FB32E77C25768F45000C4F42 /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 0AB67E9A2EA4F7C4003D806F /* Products */; + ProjectRef = 0AB67DDC2EA4F7C4003D806F /* Example-Mac.xcodeproj */; + }, + { + ProductGroup = 0AB67E962EA4F7C4003D806F /* Products */; + ProjectRef = 0AB67DF12EA4F7C4003D806F /* Example-tvOS.xcodeproj */; + }, + { + ProductGroup = 0AB67E9C2EA4F7C4003D806F /* Products */; + ProjectRef = 0AB67E002EA4F7C4003D806F /* Example-Xcode-SPM.xcodeproj */; + }, + { + ProductGroup = 0AB67E982EA4F7C4003D806F /* Products */; + ProjectRef = 0AB67DB32EA4F7C4003D806F /* Example.xcodeproj */; + }, + { + ProductGroup = 0AB679AF2EA4F7AC003D806F /* Products */; + ProjectRef = 0AB679A72EA4F7AC003D806F /* IGListKit.xcodeproj */; + }, + { + ProductGroup = 0AB679B12EA4F7AC003D806F /* Products */; + ProjectRef = 0AB678E72EA4F7AC003D806F /* IGListKitExamples.xcodeproj */; + }, + { + ProductGroup = 0AB679B52EA4F7AC003D806F /* Products */; + ProjectRef = 0AB678D12EA4F7AC003D806F /* IGListKitExamples.xcodeproj */; + }, + { + ProductGroup = 0AB679B32EA4F7AC003D806F /* Products */; + ProjectRef = 0AB678FE2EA4F7AC003D806F /* IGListKitExamples.xcodeproj */; + }, + { + ProductGroup = 0AB67D5F2EA4F7C4003D806F /* Products */; + ProjectRef = 0AB67D2A2EA4F7C4003D806F /* PINCache-SPM-Integration.xcodeproj */; + }, + { + ProductGroup = 0AB67D612EA4F7C4003D806F /* Products */; + ProjectRef = 0AB67D5A2EA4F7C4003D806F /* PINCache.xcodeproj */; + }, + { + ProductGroup = 0AB677ED2EA4F7AC003D806F /* Products */; + ProjectRef = 0AB677E92EA4F7AC003D806F /* PINOperation.xcodeproj */; + }, + { + ProductGroup = 0AB677EF2EA4F7AC003D806F /* Products */; + ProjectRef = 0AB677C22EA4F7AC003D806F /* PINOperationExample.xcodeproj */; + }, + { + ProductGroup = 0AB67E9E2EA4F7C4003D806F /* Products */; + ProjectRef = 0AB67E8E2EA4F7C4003D806F /* PINRemoteImage.xcodeproj */; + }, + { + ProductGroup = 0AB67E942EA4F7C4003D806F /* Products */; + ProjectRef = 0AB67E142EA4F7C4003D806F /* Swift-Example.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + FB32E77A25768F45000C4F42 /* ASIGListKitSPM */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 0AB678322EA4F7AC003D806F /* PINOperation.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = PINOperation.framework; + remoteRef = 0AB678312EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB678342EA4F7AC003D806F /* PINOperationTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = PINOperationTests.xctest; + remoteRef = 0AB678332EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB678362EA4F7AC003D806F /* PINOperation.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = PINOperation.framework; + remoteRef = 0AB678352EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB678382EA4F7AC003D806F /* PINOperation-tvOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "PINOperation-tvOSTests.xctest"; + remoteRef = 0AB678372EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB6783A2EA4F7AC003D806F /* PINOperation.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = PINOperation.framework; + remoteRef = 0AB678392EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB6783C2EA4F7AC003D806F /* PINOperation-macOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "PINOperation-macOSTests.xctest"; + remoteRef = 0AB6783B2EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB6783E2EA4F7AC003D806F /* PINOperation.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = PINOperation.framework; + remoteRef = 0AB6783D2EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB678402EA4F7AC003D806F /* PINOperation-watchOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "PINOperation-watchOSTests.xctest"; + remoteRef = 0AB6783F2EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB678422EA4F7AC003D806F /* PINOperation.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = PINOperation.framework; + remoteRef = 0AB678412EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB678442EA4F7AC003D806F /* PINOperation-visionOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "PINOperation-visionOSTests.xctest"; + remoteRef = 0AB678432EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB678472EA4F7AC003D806F /* PINOperationExample.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = PINOperationExample.app; + remoteRef = 0AB678462EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67CD02EA4F7AC003D806F /* IGListKit.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = IGListKit.framework; + remoteRef = 0AB67CCF2EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67CD22EA4F7AC003D806F /* IGListKitTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = IGListKitTests.xctest; + remoteRef = 0AB67CD12EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67CD42EA4F7AC003D806F /* IGListKit.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = IGListKit.framework; + remoteRef = 0AB67CD32EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67CD62EA4F7AC003D806F /* IGListKit-tvOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "IGListKit-tvOSTests.xctest"; + remoteRef = 0AB67CD52EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67CD82EA4F7AC003D806F /* IGListKit.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = IGListKit.framework; + remoteRef = 0AB67CD72EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67CDA2EA4F7AC003D806F /* IGListKit-macOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "IGListKit-macOSTests.xctest"; + remoteRef = 0AB67CD92EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67CDC2EA4F7AC003D806F /* IGListDiffKit.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = IGListDiffKit.framework; + remoteRef = 0AB67CDB2EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67CDE2EA4F7AC003D806F /* IGListDiffKit.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = IGListDiffKit.framework; + remoteRef = 0AB67CDD2EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67CE02EA4F7AC003D806F /* IGListDiffKit.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = IGListDiffKit.framework; + remoteRef = 0AB67CDF2EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67CE22EA4F7AC003D806F /* IGListSwiftKit.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = IGListSwiftKit.framework; + remoteRef = 0AB67CE12EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67CE42EA4F7AC003D806F /* IGListSwiftKit.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = IGListSwiftKit.framework; + remoteRef = 0AB67CE32EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67CE72EA4F7AC003D806F /* IGListKitExamples.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = IGListKitExamples.app; + remoteRef = 0AB67CE62EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67CEA2EA4F7AC003D806F /* IGListKitExamples.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = IGListKitExamples.app; + remoteRef = 0AB67CE92EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67CF02EA4F7AC003D806F /* IGListKitExamples.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = IGListKitExamples.app; + remoteRef = 0AB67CEF2EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67CF22EA4F7AC003D806F /* IGListKitMessageExample.appex */ = { + isa = PBXReferenceProxy; + fileType = "wrapper.app-extension"; + path = IGListKitMessageExample.appex; + remoteRef = 0AB67CF12EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67CF42EA4F7AC003D806F /* IGListKitTodayExample.appex */ = { + isa = PBXReferenceProxy; + fileType = "wrapper.app-extension"; + path = IGListKitTodayExample.appex; + remoteRef = 0AB67CF32EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67CF62EA4F7AC003D806F /* IGListKitExamples-UITests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "IGListKitExamples-UITests.xctest"; + remoteRef = 0AB67CF52EA4F7AC003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67F9D2EA4F7C5003D806F /* Example-Mac.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = "Example-Mac.app"; + remoteRef = 0AB67F9C2EA4F7C5003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67FA02EA4F7C5003D806F /* Example-tvOS.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = "Example-tvOS.app"; + remoteRef = 0AB67F9F2EA4F7C5003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67FA32EA4F7C5003D806F /* Example-Xcode-SPM.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = "Example-Xcode-SPM.app"; + remoteRef = 0AB67FA22EA4F7C5003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67FA62EA4F7C5003D806F /* Example.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = Example.app; + remoteRef = 0AB67FA52EA4F7C5003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67FA92EA4F7C5003D806F /* PINCache-SPM-Integration.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = "PINCache-SPM-Integration.app"; + remoteRef = 0AB67FA82EA4F7C5003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67FB52EA4F7C5003D806F /* PINCache.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = PINCache.framework; + remoteRef = 0AB67FB42EA4F7C5003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67FB72EA4F7C5003D806F /* PINCacheTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = PINCacheTests.xctest; + remoteRef = 0AB67FB62EA4F7C5003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67FB92EA4F7C5003D806F /* PINCache.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = PINCache.framework; + remoteRef = 0AB67FB82EA4F7C5003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67FBB2EA4F7C5003D806F /* PINCache-tvOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "PINCache-tvOSTests.xctest"; + remoteRef = 0AB67FBA2EA4F7C5003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67FBD2EA4F7C5003D806F /* PINCache.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = PINCache.framework; + remoteRef = 0AB67FBC2EA4F7C5003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67FBF2EA4F7C5003D806F /* PINCache-macOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "PINCache-macOSTests.xctest"; + remoteRef = 0AB67FBE2EA4F7C5003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67FC12EA4F7C5003D806F /* PINCache.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = PINCache.framework; + remoteRef = 0AB67FC02EA4F7C5003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67FC32EA4F7C5003D806F /* PINCache-visionOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "PINCache-visionOSTests.xctest"; + remoteRef = 0AB67FC22EA4F7C5003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67FC52EA4F7C5003D806F /* PINCache.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = PINCache.framework; + remoteRef = 0AB67FC42EA4F7C5003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67FC72EA4F7C5003D806F /* PINCache-watchOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "PINCache-watchOSTests.xctest"; + remoteRef = 0AB67FC62EA4F7C5003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67FCD2EA4F7C5003D806F /* PINRemoteImage.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = PINRemoteImage.framework; + remoteRef = 0AB67FCC2EA4F7C5003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67FCF2EA4F7C5003D806F /* PINRemoteImageTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = PINRemoteImageTests.xctest; + remoteRef = 0AB67FCE2EA4F7C5003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67FD12EA4F7C5003D806F /* PINRemoteImage.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = PINRemoteImage.framework; + remoteRef = 0AB67FD02EA4F7C5003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67FD32EA4F7C5003D806F /* PINRemoteImage-tvOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "PINRemoteImage-tvOSTests.xctest"; + remoteRef = 0AB67FD22EA4F7C5003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 0AB67FD62EA4F7C5003D806F /* Swift-Example.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = "Swift-Example.app"; + remoteRef = 0AB67FD52EA4F7C5003D806F /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + FB32E77925768F45000C4F42 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FB32E78B25768F48000C4F42 /* LaunchScreen.storyboard in Resources */, + FB32E78825768F48000C4F42 /* Assets.xcassets in Resources */, + FB32E78625768F45000C4F42 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + FB32E77725768F45000C4F42 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FB32E78325768F45000C4F42 /* ViewController.swift in Sources */, + FB32E77F25768F45000C4F42 /* AppDelegate.swift in Sources */, + FB3894B2257705A80025252E /* NSObject+ListDiffable.swift in Sources */, + FB3894AB257705190025252E /* ItemSectionController.swift in Sources */, + FB3894B5257705EF0025252E /* Item.swift in Sources */, + FB32E78125768F45000C4F42 /* SceneDelegate.swift in Sources */, + FB32E79B2576A451000C4F42 /* MainListViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + FB32E78425768F45000C4F42 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + FB32E78525768F45000C4F42 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + FB32E78925768F48000C4F42 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + FB32E78A25768F48000C4F42 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + FB32E78D25768F48000C4F42 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 14.2; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + FB32E78E25768F48000C4F42 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 14.2; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + FB32E79025768F48000C4F42 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = ASIGListKitSPM/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = texture.ASIGListKitSPM; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + FB32E79125768F48000C4F42 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = ASIGListKitSPM/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = texture.ASIGListKitSPM; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + FB32E77625768F45000C4F42 /* Build configuration list for PBXProject "ASIGListKitSPM" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FB32E78D25768F48000C4F42 /* Debug */, + FB32E78E25768F48000C4F42 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + FB32E78F25768F48000C4F42 /* Build configuration list for PBXNativeTarget "ASIGListKitSPM" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FB32E79025768F48000C4F42 /* Debug */, + FB32E79125768F48000C4F42 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCLocalSwiftPackageReference section */ + 0A069C002EAD66A0008ABA37 /* XCLocalSwiftPackageReference "../../../Texture" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = ../../../Texture; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 0A069C012EAD66A0008ABA37 /* TextureIGListKitExtensions */ = { + isa = XCSwiftPackageProductDependency; + productName = TextureIGListKitExtensions; + }; + 0A069C112EAF7997008ABA37 /* AsyncDisplayKit */ = { + isa = XCSwiftPackageProductDependency; + package = 0A069C002EAD66A0008ABA37 /* XCLocalSwiftPackageReference "../../../Texture" */; + productName = AsyncDisplayKit; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = FB32E77325768F45000C4F42 /* Project object */; +} diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..919434a62 --- /dev/null +++ b/examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/xcshareddata/xcschemes/ASIGListKitSPM.xcscheme b/examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/xcshareddata/xcschemes/ASIGListKitSPM.xcscheme new file mode 100644 index 000000000..b4adb2757 --- /dev/null +++ b/examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/xcshareddata/xcschemes/ASIGListKitSPM.xcscheme @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM/AppDelegate.swift b/examples/ASIGListKitSPM/ASIGListKitSPM/AppDelegate.swift new file mode 100644 index 000000000..da1d961b0 --- /dev/null +++ b/examples/ASIGListKitSPM/ASIGListKitSPM/AppDelegate.swift @@ -0,0 +1,36 @@ +// +// AppDelegate.swift +// ASIGListKitSPM +// +// Created by Petro Rovenskyy on 01.12.2020. +// + +import UIKit + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + // MARK: UISceneSession Lifecycle + + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { + // Called when a new scene session is being created. + // Use this method to select a configuration to create the new scene with. + return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) + } + + func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { + // Called when the user discards a scene session. + // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. + // Use this method to release any resources that were specific to the discarded scenes, as they will not return. + } + + +} + diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM/Assets.xcassets/AccentColor.colorset/Contents.json b/examples/ASIGListKitSPM/ASIGListKitSPM/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 000000000..eb8789700 --- /dev/null +++ b/examples/ASIGListKitSPM/ASIGListKitSPM/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/ASIGListKitSPM/ASIGListKitSPM/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..9221b9bb1 --- /dev/null +++ b/examples/ASIGListKitSPM/ASIGListKitSPM/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "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/examples/ASIGListKitSPM/ASIGListKitSPM/Assets.xcassets/Contents.json b/examples/ASIGListKitSPM/ASIGListKitSPM/Assets.xcassets/Contents.json new file mode 100644 index 000000000..73c00596a --- /dev/null +++ b/examples/ASIGListKitSPM/ASIGListKitSPM/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM/Base.lproj/LaunchScreen.storyboard b/examples/ASIGListKitSPM/ASIGListKitSPM/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 000000000..865e9329f --- /dev/null +++ b/examples/ASIGListKitSPM/ASIGListKitSPM/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM/Base.lproj/Main.storyboard b/examples/ASIGListKitSPM/ASIGListKitSPM/Base.lproj/Main.storyboard new file mode 100644 index 000000000..25a763858 --- /dev/null +++ b/examples/ASIGListKitSPM/ASIGListKitSPM/Base.lproj/Main.storyboard @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM/Extensions/NSObject+ListDiffable.swift b/examples/ASIGListKitSPM/ASIGListKitSPM/Extensions/NSObject+ListDiffable.swift new file mode 100644 index 000000000..71e676838 --- /dev/null +++ b/examples/ASIGListKitSPM/ASIGListKitSPM/Extensions/NSObject+ListDiffable.swift @@ -0,0 +1,18 @@ +// +// NSObject+ListDiffable.swift +// ASIGListKitSPM +// +// Created by Petro Rovenskyy on 02.12.2020. +// + +import Foundation +import IGListDiffKit + +extension NSObject: @retroactive ListDiffable { + open func diffIdentifier() -> NSObjectProtocol { + return self + } + open func isEqual(toDiffableObject object: ListDiffable?) -> Bool { + return isEqual(object) + } +} diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM/Info.plist b/examples/ASIGListKitSPM/ASIGListKitSPM/Info.plist new file mode 100644 index 000000000..5b531f7b2 --- /dev/null +++ b/examples/ASIGListKitSPM/ASIGListKitSPM/Info.plist @@ -0,0 +1,66 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + + UIApplicationSupportsIndirectInputEvents + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM/MainListViewController.swift b/examples/ASIGListKitSPM/ASIGListKitSPM/MainListViewController.swift new file mode 100644 index 000000000..da5bc80c6 --- /dev/null +++ b/examples/ASIGListKitSPM/ASIGListKitSPM/MainListViewController.swift @@ -0,0 +1,56 @@ +// +// MainListViewController.swift +// ASIGListKitSPM +// +// Created by Petro Rovenskyy on 01.12.2020. +// + +import UIKit +import AsyncDisplayKit +import IGListKit +import TextureIGListKitExtensions + +// MARK: ListAdapterDataSource + +extension MainListViewController: ListAdapterDataSource { + func objects(for listAdapter: ListAdapter) -> [ListDiffable] { + self.items + } + + func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController { + return ItemSectionController() + } + + func emptyView(for listAdapter: ListAdapter) -> UIView? { + return nil + } +} + +final class MainListViewController: ASDKViewController { + let items: [Item] = [Item(name: "I'm item in the list usinng IGListKit"), + Item(name: "With node wirtten with AsynDispayKit"), + Item(name: "!!!Texture swift package!!!")] + let collectionNode: ASCollectionNode + lazy var adapter: ListAdapter = { + return ListAdapter(updater: ListAdapterUpdater(), + viewController: self, + workingRangeSize: 1) + }() + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + required init(flowLayout: UICollectionViewLayout) { + self.collectionNode = ASCollectionNode(collectionViewLayout: flowLayout) + self.collectionNode.backgroundColor = .systemBackground + self.collectionNode.style.flexGrow = 1.0 + super.init(node: self.collectionNode) + adapter.setCollectionNode(self.collectionNode) + adapter.dataSource = self + collectionNode.alwaysBounceVertical = true + } + override func viewDidLoad() { + super.viewDidLoad() + self.title = "AS+IG+SPM=💘" + // Do any additional setup after loading the view. + } +} diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM/Models/Item.swift b/examples/ASIGListKitSPM/ASIGListKitSPM/Models/Item.swift new file mode 100644 index 000000000..bec30c22b --- /dev/null +++ b/examples/ASIGListKitSPM/ASIGListKitSPM/Models/Item.swift @@ -0,0 +1,16 @@ +// +// Item.swift +// ASIGListKitSPM +// +// Created by Petro Rovenskyy on 02.12.2020. +// + +import Foundation + +final class Item: NSObject { + let name: String + init(name: String) { + self.name = name + super.init() + } +} diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM/SceneDelegate.swift b/examples/ASIGListKitSPM/ASIGListKitSPM/SceneDelegate.swift new file mode 100644 index 000000000..88eb94d9e --- /dev/null +++ b/examples/ASIGListKitSPM/ASIGListKitSPM/SceneDelegate.swift @@ -0,0 +1,58 @@ +// +// SceneDelegate.swift +// ASIGListKitSPM +// +// Created by Petro Rovenskyy on 01.12.2020. +// + +import UIKit + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + + var window: UIWindow? + + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. + // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. + // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). + guard let windowScene = (scene as? UIWindowScene) else { return } + self.window = UIWindow(windowScene: windowScene) + + let rootVC = MainListViewController(flowLayout: UICollectionViewFlowLayout()) + let rootNC = UINavigationController(rootViewController: rootVC) + self.window?.rootViewController = rootNC + self.window?.makeKeyAndVisible() + } + + func sceneDidDisconnect(_ scene: UIScene) { + // Called as the scene is being released by the system. + // This occurs shortly after the scene enters the background, or when its session is discarded. + // Release any resources associated with this scene that can be re-created the next time the scene connects. + // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). + } + + func sceneDidBecomeActive(_ scene: UIScene) { + // Called when the scene has moved from an inactive state to an active state. + // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. + } + + func sceneWillResignActive(_ scene: UIScene) { + // Called when the scene will move from an active state to an inactive state. + // This may occur due to temporary interruptions (ex. an incoming phone call). + } + + func sceneWillEnterForeground(_ scene: UIScene) { + // Called as the scene transitions from the background to the foreground. + // Use this method to undo the changes made on entering the background. + } + + func sceneDidEnterBackground(_ scene: UIScene) { + // Called as the scene transitions from the foreground to the background. + // Use this method to save data, release shared resources, and store enough scene-specific state information + // to restore the scene back to its current state. + } + + +} + diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM/Section Controllers/ItemSectionController.swift b/examples/ASIGListKitSPM/ASIGListKitSPM/Section Controllers/ItemSectionController.swift new file mode 100644 index 000000000..7e7d930f0 --- /dev/null +++ b/examples/ASIGListKitSPM/ASIGListKitSPM/Section Controllers/ItemSectionController.swift @@ -0,0 +1,48 @@ +// +// ItemSectionController.swift +// ASIGListKitSPM +// +// Created by Petro Rovenskyy on 02.12.2020. +// + +import AsyncDisplayKit +import IGListKit +import TextureIGListKitExtensions +import UIKit + +// MARK: ASSectionController +extension ItemSectionController: ASSectionController { + @objc public func sizeRangeForItem(at index: Int) -> ASSizeRange { + // Try to get container size + if let containerSize = self.collectionContext?.containerSize, + containerSize.width > 0 { + let minSize = CGSize(width: containerSize.width, height: 40) + let maxSize = CGSize(width: containerSize.width, height: 50) + return ASSizeRange(min: minSize, max: maxSize) + } else if let size = self.viewController?.view.bounds.size, + size.width > 0 { + let minSize = CGSize(width: size.width, height: 40) + let maxSize = CGSize(width: size.width, height: 50) + return ASSizeRange(min: minSize, max: maxSize) + } + // Default otherwise + let size = CGSize(width: 320, height: 50) + return ASSizeRangeMake(size) + } + public func nodeBlockForItem(at index: Int) -> ASCellNodeBlock { + return { + let node = ASTextCellNode() + node.backgroundColor = .systemBackground + node.text = self.object?.name ?? "failed to load item" + return node + } + } +} + +final class ItemSectionController: ListSectionController { + var object: Item? + override func didUpdate(to object: Any) { + guard let object = object as? Item else {return} + self.object = object + } +} diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM/ViewController.swift b/examples/ASIGListKitSPM/ASIGListKitSPM/ViewController.swift new file mode 100644 index 000000000..e73bfd3a6 --- /dev/null +++ b/examples/ASIGListKitSPM/ASIGListKitSPM/ViewController.swift @@ -0,0 +1,18 @@ +// +// ViewController.swift +// ASIGListKitSPM +// +// Created by Petro Rovenskyy on 01.12.2020. +// + +import UIKit + +class ViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view. + } + +} + diff --git a/examples/ASIGListKitSPM/README.md b/examples/ASIGListKitSPM/README.md new file mode 100644 index 000000000..7970de50e --- /dev/null +++ b/examples/ASIGListKitSPM/README.md @@ -0,0 +1,106 @@ +# ASIGListKitSPM Example + +This example demonstrates how to integrate Texture with IGListKit in an iOS app project using a local package wrapper. + +## What This Example Shows + +- Local package wrapper approach for iOS app projects +- Complete working iOS app with IGListKit integration +- Section controllers using Pure Swift API +- Runtime selector methods with `@objc` attributes + +## Project Structure + +``` +ASIGListKitSPM/ +├── ASIGListKitSPM.xcodeproj # iOS app project +├── ASIGListKitSPM/ # App source code +│ ├── AppDelegate.swift +│ ├── MainListViewController.swift +│ ├── Section Controllers/ +│ │ └── ItemSectionController.swift +│ └── Models/ +│ └── Item.swift +└── UICoreKit/ # Local package wrapper + ├── Package.swift # Enables IGListKit trait + └── Sources/ + └── UICoreKit/ + └── (wrapper code) +``` + +## Why Local Package Wrapper? + +As of Xcode 26.0.1, Xcode does not provide UI for enabling SPM traits in app targets. The local package wrapper (`UICoreKit`) enables the IGListKit trait, which the app then imports. + +## Key Implementation Details + +### UICoreKit/Package.swift + +Shows how to enable IGListKit trait for use in an app: + +```swift +dependencies: [ + .package( + url: "https://github.com/TextureGroup/Texture.git", + from: "3.3.0", + traits: [ + .init(name: "IGListKit") // Enable trait here + ] + ) +] +``` + +Note: This example uses `path: "../../.."` for local testing within the Texture repository. In your projects, use the `url` and `from` shown above. + +### ItemSectionController.swift + +Demonstrates Pure Swift API: + +```swift +extension ItemSectionController: ASSectionController { + @objc public func sizeRangeForItemAtIndex(_ index: Int) -> ASSizeRange { + // Size calculation + } + + @objc public func nodeBlockForItemAtIndex(_ index: Int) -> ASCellNodeBlock { + return { + let node = ASTextCellNode() + node.text = self.object?.name + return node + } + } +} +``` + +Note: Methods are called automatically via runtime selectors. Do not manually override `sizeForItem(at:)` or `cellForItem(at:)` from IGListKit. + +## Building and Running + +1. Open `ASIGListKitSPM.xcodeproj` in Xcode +2. Build and run on iOS Simulator or device + +The project is pre-configured with the local package wrapper. + +## Important Notes + +### Do Not Add Package.swift as Source File + +The `UICoreKit/Package.swift` file must only be referenced through Xcode's package dependencies system. If you see errors like "No such module 'PackageDescription'", you accidentally added Package.swift to the project's source files. Remove the reference (keep the file on disk). + +### Method Naming + +The `@objc` methods must have exact names: +- `sizeRangeForItemAtIndex(_:)` not `sizeRangeForItem(at:)` +- `nodeBlockForItemAtIndex(_:)` not `nodeBlockForItem(at:)` + +These are called via Objective-C runtime selectors by `TextureIGListKitExtensions`. + +## Complete Documentation + +For detailed documentation on: +- Step-by-step setup guide +- Pure Swift API details +- Section controller implementation +- Migration from CocoaPods + +See: [TextureIGListKitExtensions README](../../Sources/TextureIGListKitExtensions/README.md) diff --git a/examples/SPMBasic/Package.swift b/examples/SPMBasic/Package.swift new file mode 100644 index 000000000..437eeb3a0 --- /dev/null +++ b/examples/SPMBasic/Package.swift @@ -0,0 +1,33 @@ +// swift-tools-version: 5.9 +import PackageDescription + +let package = Package( + name: "SPMBasic", + platforms: [ + .iOS(.v14), + .macCatalyst(.v13) + ], + products: [ + .library( + name: "SPMBasic", + targets: ["SPMBasic"] + ) + ], + dependencies: [ + .package(path: "../..") + ], + targets: [ + .target( + name: "SPMBasic", + dependencies: [ + .product(name: "AsyncDisplayKit", package: "Texture") + ], + path: "Sources" + ), + .testTarget( + name: "SPMBasicTests", + dependencies: ["SPMBasic"], + path: "Tests" + ) + ] +) diff --git a/examples/SPMBasic/README.md b/examples/SPMBasic/README.md new file mode 100644 index 000000000..aadd3d8e0 --- /dev/null +++ b/examples/SPMBasic/README.md @@ -0,0 +1,25 @@ +# SPM Basic Example + +This example demonstrates basic Texture usage via Swift Package Manager. + +## What This Tests + +This example verifies that core Texture functionality works via SPM: +- Basic nodes (ASDisplayNode, ASImageNode, ASTextNode, ASButtonNode) +- Collection views (ASCollectionNode, ASTableNode) +- Layout specs (ASStackLayoutSpec, ASInsetLayoutSpec, ASCenterLayoutSpec, ASBackgroundLayoutSpec) +- PINRemoteImage integration (ASPINRemoteImageDownloader, ASNetworkImageNode) + +## SPM Limitations + +**Note:** Video (ASVideoNode), MapKit (ASMapNode), and Photos features are **not available** via SPM due to Swift Package Manager limitations with conditionally compiled Objective-C classes. These features remain available via CocoaPods and Carthage. + +## Running Tests + +From the repository root: + +```bash +./build.sh spm-texture-basic +``` + +This will build and run all tests to verify core Texture functionality works correctly with SPM. diff --git a/examples/SPMBasic/Sources/Example.swift b/examples/SPMBasic/Sources/Example.swift new file mode 100644 index 000000000..4a0aea143 --- /dev/null +++ b/examples/SPMBasic/Sources/Example.swift @@ -0,0 +1,32 @@ +import Foundation +import AsyncDisplayKit + +/// Example demonstrating basic Texture usage via Swift Package Manager +/// +/// This function creates basic Texture nodes to verify that the SPM integration works correctly. +/// Default traits are enabled: Video, MapKit, Photos, AssetsLibrary +public func runBasicExample() { + print("✓ Texture (AsyncDisplayKit) imported successfully via SPM!") + print("Creating basic nodes...") + + // Create a simple display node + let node = ASDisplayNode() + node.backgroundColor = .white + print("✓ ASDisplayNode created") + + // Create an image node + let imageNode = ASImageNode() + imageNode.contentMode = .scaleAspectFit + print("✓ ASImageNode created") + + // Create a text node + let textNode = ASTextNode() + textNode.attributedText = NSAttributedString( + string: "Hello from Texture + SPM!", + attributes: [.foregroundColor: UIColor.black] + ) + print("✓ ASTextNode created") + + print("\n✅ All basic Texture features are working with SPM!") + print("Default traits enabled: Video, MapKit, Photos, AssetsLibrary") +} diff --git a/examples/SPMBasic/Tests/DefaultTraitsTests.swift b/examples/SPMBasic/Tests/DefaultTraitsTests.swift new file mode 100644 index 000000000..f300d5c10 --- /dev/null +++ b/examples/SPMBasic/Tests/DefaultTraitsTests.swift @@ -0,0 +1,167 @@ +import Testing +@testable import SPMBasic +import AsyncDisplayKit + +/// Tests that verify basic Texture functionality works via SPM +/// +/// Note: Video/MapKit/Photos features are not available via SPM due to Swift Package Manager +/// limitations with conditionally compiled Objective-C classes (#if guards). +/// These features remain available via CocoaPods and Carthage. +/// These tests focus on core Texture functionality that works with SPM. + +@Suite("Basic Texture Nodes") +struct BasicTextureNodesTests { + + @Test("ASDisplayNode is available and works") + func asDisplayNodeAvailable() { + let node = ASDisplayNode() + #expect(node.isKind(of: ASDisplayNode.self)) + } + + @Test("ASImageNode is available and works") + func asImageNodeAvailable() { + let node = ASImageNode() + #expect(node.isKind(of: ASImageNode.self)) + } + + @Test("ASTextNode is available and works") + func asTextNodeAvailable() { + let node = ASTextNode() + #expect(node.isKind(of: ASTextNode.self)) + } + + @Test("ASButtonNode is available and works") + func asButtonNodeAvailable() { + let node = ASButtonNode() + #expect(node.isKind(of: ASButtonNode.self)) + } + + @Test("ASNetworkImageNode is available and works") + func asNetworkImageNodeAvailable() { + let node = ASNetworkImageNode() + #expect(node.isKind(of: ASNetworkImageNode.self)) + } +} + +@Suite("Collection Views") +struct CollectionViewTests { + + @Test("ASCollectionNode is available and works") + @MainActor + func asCollectionNodeAvailable() { + let layout = UICollectionViewFlowLayout() + let node = ASCollectionNode(collectionViewLayout: layout) + #expect(node.view is UICollectionView) + } + + @Test("ASTableNode is available and works") + @MainActor + func asTableNodeAvailable() { + let node = ASTableNode() + #expect(node.view is UITableView) + } + + @Test("ASCellNode is available and works") + func asCellNodeAvailable() { + let node = ASCellNode() + #expect(node.isKind(of: ASCellNode.self)) + } +} + +@Suite("Layout Specs") +struct LayoutSpecTests { + + @Test("ASStackLayoutSpec is available and works") + func asStackLayoutSpecAvailable() { + let child1 = ASDisplayNode() + let child2 = ASDisplayNode() + + let stack = ASStackLayoutSpec( + direction: .vertical, + spacing: 10, + justifyContent: .start, + alignItems: .start, + children: [child1, child2] + ) + #expect(stack.direction == .vertical) + } + + @Test("ASInsetLayoutSpec is available and works") + func asInsetLayoutSpecAvailable() { + let child = ASDisplayNode() + let inset = ASInsetLayoutSpec( + insets: UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10), + child: child + ) + #expect(inset.insets == UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)) + } + + @Test("ASCenterLayoutSpec is available and works") + func asCenterLayoutSpecAvailable() { + let child = ASDisplayNode() + let center = ASCenterLayoutSpec( + centeringOptions: .XY, + sizingOptions: [], + child: child + ) + #expect(center.centeringOptions == .XY) + } + + @Test("ASBackgroundLayoutSpec is available and works") + func asBackgroundLayoutSpecAvailable() { + let foreground = ASDisplayNode() + let background = ASDisplayNode() + let spec = ASBackgroundLayoutSpec(child: foreground, background: background) + #expect(spec.child === foreground) + } +} + +@Suite("PINRemoteImage Integration") +struct PINRemoteImageTests { + + @Test("ASPINRemoteImageDownloader is available") + func asPINRemoteImageDownloaderAvailable() { + let downloader = ASPINRemoteImageDownloader.shared() + #expect(downloader.isKind(of: ASPINRemoteImageDownloader.self)) + } + + @Test("ASNetworkImageNode can be created with PINRemoteImage downloader") + func networkImageNodeWithPINRemoteImage() { + let downloader = ASPINRemoteImageDownloader.shared() + let node = ASNetworkImageNode(cache: downloader, downloader: downloader) + #expect(node.isKind(of: ASNetworkImageNode.self)) + } +} + +@Suite("Integration Tests") +struct IntegrationTests { + + @Test("Basic Texture workflow works end-to-end") + func basicTextureWorkflow() { + // Create a display node + let displayNode = ASDisplayNode() + displayNode.backgroundColor = .blue + + // Create an image node + let imageNode = ASImageNode() + imageNode.image = UIImage() + + // Create a text node + let textNode = ASTextNode() + textNode.attributedText = NSAttributedString(string: "Test") + + // Create a layout + let stack = ASStackLayoutSpec( + direction: .vertical, + spacing: 10, + justifyContent: .start, + alignItems: .start, + children: [imageNode, textNode] + ) + + #expect(displayNode.backgroundColor == .blue) + #expect(imageNode.image != nil) + #expect(textNode.attributedText?.string == "Test") + #expect(stack.direction == .vertical) + } +} diff --git a/examples/SPMWithIGListKit/Package.swift b/examples/SPMWithIGListKit/Package.swift new file mode 100644 index 000000000..ea9e6be86 --- /dev/null +++ b/examples/SPMWithIGListKit/Package.swift @@ -0,0 +1,40 @@ +// swift-tools-version: 6.1 +import PackageDescription + +let package = Package( + name: "SPMWithIGListKit", + platforms: [ + .iOS(.v14), + .macCatalyst(.v13) + ], + products: [ + .library( + name: "SPMWithIGListKit", + targets: ["SPMWithIGListKit"] + ) + ], + dependencies: [ + .package( + path: "../..", + traits: [ + // Enable IGListKit trait for advanced collection view support + .init(name: "IGListKit") + ] + ) + ], + targets: [ + .target( + name: "SPMWithIGListKit", + dependencies: [ + .product(name: "AsyncDisplayKit", package: "Texture"), + .product(name: "TextureIGListKitExtensions", package: "Texture") + ], + path: "Sources" + ), + .testTarget( + name: "SPMWithIGListKitTests", + dependencies: ["SPMWithIGListKit"], + path: "Tests" + ) + ] +) diff --git a/examples/SPMWithIGListKit/README.md b/examples/SPMWithIGListKit/README.md new file mode 100644 index 000000000..e9efdc88e --- /dev/null +++ b/examples/SPMWithIGListKit/README.md @@ -0,0 +1,64 @@ +# SPMWithIGListKit Example + +This example demonstrates how to use Texture with IGListKit in a Swift Package Manager library project. + +## What This Example Shows + +- Enabling IGListKit trait in a SPM package +- Using Pure Swift API for Texture + IGListKit integration +- Testing that trait activation works correctly + +## Key Files + +- **Package.swift** - Shows how to enable IGListKit trait +- **Tests/** - Verifies trait enables IGListKit dependency correctly + +## Package.swift Configuration + +```swift +dependencies: [ + .package( + url: "https://github.com/TextureGroup/Texture.git", + from: "3.3.0", + traits: [ + .init(name: "IGListKit") // Enable IGListKit trait + ] + ) +] +``` + +Note: This example uses `path: "../.."` for local testing within the Texture repository. In your projects, use the `url` and `from` shown above. + +## Building + +```bash +# Build the package +swift build + +# Or with xcodebuild +xcodebuild -scheme SPMWithIGListKit -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 17' build +``` + +## Running Tests + +```bash +# Run tests with Swift +swift test + +# Or with xcodebuild +xcodebuild -scheme SPMWithIGListKit -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 17' test +``` + +## For iOS/tvOS App Projects + +If you need to integrate Texture with IGListKit in an iOS or tvOS app (not a library), see the **ASIGListKitSPM** example instead. App projects require a different approach using a local package wrapper. + +## Complete Documentation + +For detailed documentation on: +- Pure Swift API usage +- Section controller implementation +- iOS/tvOS app integration +- Migration from CocoaPods + +See: [TextureIGListKitExtensions README](../../Sources/TextureIGListKitExtensions/README.md) diff --git a/examples/SPMWithIGListKit/Sources/IGListKitTraitTest.swift b/examples/SPMWithIGListKit/Sources/IGListKitTraitTest.swift new file mode 100644 index 000000000..08de5d510 --- /dev/null +++ b/examples/SPMWithIGListKit/Sources/IGListKitTraitTest.swift @@ -0,0 +1,39 @@ +import Foundation +import UIKit +import AsyncDisplayKit +import IGListKit +import TextureIGListKitExtensions + +/// Test to verify TextureIGListKitExtensions provides Swift-friendly IGListKit integration +/// +/// This verifies that: +/// 1. IGListKit and AsyncDisplayKit are re-exported through public imports +/// 2. Swift extensions for IGListAdapter are available +/// 3. We can use ASCollectionNode with IGListAdapter through Swift API +public struct IGListKitTraitTest { + + /// Test that IGListKit classes are available through re-exports + @MainActor + public static func testIGListKitAvailable() -> Bool { + // These classes should be available through public import + let updater = ListAdapterUpdater() + let adapter = ListAdapter(updater: updater, viewController: nil) + + return adapter.collectionView == nil // Initially nil until set + } + + /// Test that we can create an ASCollectionNode and use it with IGListAdapter + @MainActor + public static func testASCollectionNodeWithAdapter() -> Bool { + let layout = UICollectionViewFlowLayout() + let collectionNode = ASCollectionNode(collectionViewLayout: layout) + + let updater = ListAdapterUpdater() + let adapter = ListAdapter(updater: updater, viewController: nil) + + // Test the Swift extension method + adapter.setCollectionNode(collectionNode) + + return adapter.collectionView != nil + } +} diff --git a/examples/SPMWithIGListKit/Tests/IGListKitTraitTests.swift b/examples/SPMWithIGListKit/Tests/IGListKitTraitTests.swift new file mode 100644 index 000000000..87a0b82eb --- /dev/null +++ b/examples/SPMWithIGListKit/Tests/IGListKitTraitTests.swift @@ -0,0 +1,81 @@ +import Testing +import UIKit +@testable import SPMWithIGListKit +import AsyncDisplayKit +import IGListKit +import TextureIGListKitExtensions + +@Suite("IGListKit Trait Tests") +struct IGListKitTraitTests { + + @Test("IGListKit dependency is resolved when trait is enabled") + @MainActor + func igListKitDependencyResolved() { + // IGListKit types available through public import + let updater = ListAdapterUpdater() + #expect(updater.isKind(of: ListAdapterUpdater.self)) + + let adapter = ListAdapter(updater: updater, viewController: nil) + #expect(adapter.isKind(of: ListAdapter.self)) + } + + @Test("ASCollectionNode from Texture is available") + @MainActor + func asCollectionNodeAvailable() { + // AsyncDisplayKit types available through public import + let layout = UICollectionViewFlowLayout() + let node = ASCollectionNode(collectionViewLayout: layout) + #expect(node.view is UICollectionView) + } + + @Test("Swift extension method setCollectionNode is available") + @MainActor + func swiftExtensionMethodAvailable() { + let adapter = ListAdapter(updater: ListAdapterUpdater(), viewController: nil) + let layout = UICollectionViewFlowLayout() + let collectionNode = ASCollectionNode(collectionViewLayout: layout) + + // Force the node to load by accessing its view + // This is necessary because onDidLoad only fires when node loads + _ = collectionNode.view + + // Use the Swift-friendly extension method + adapter.setCollectionNode(collectionNode) + + #expect(adapter.collectionView != nil) + } + + @Test("IGListDiffKit types are accessible through TextureIGListKitExtensions") + func igListDiffKitAvailable() { + // IGListDiffKit should be accessible through IGListKit + // Test that diff algorithm types and functions are available + + // Simple test objects that conform to ListDiffable + class TestObject: NSObject, ListDiffable { + let identifier: Int + + init(identifier: Int) { + self.identifier = identifier + } + + func diffIdentifier() -> NSObjectProtocol { + return identifier as NSNumber + } + + func isEqual(toDiffableObject object: ListDiffable?) -> Bool { + guard let other = object as? TestObject else { return false } + return identifier == other.identifier + } + } + + let oldArray: [ListDiffable] = [TestObject(identifier: 1), TestObject(identifier: 2), TestObject(identifier: 3)] + let newArray: [ListDiffable] = [TestObject(identifier: 2), TestObject(identifier: 3), TestObject(identifier: 4)] + + // ListDiff should be available (core diffing algorithm from IGListDiffKit) + let result = ListDiff(oldArray: oldArray, newArray: newArray, option: .equality) + + #expect(result.hasChanges) + #expect(result.deletes.contains(0)) + #expect(result.inserts.contains(2)) + } +} diff --git a/scripts/generate_spm_sources_layout.swift b/scripts/generate_spm_sources_layout.swift new file mode 100755 index 000000000..fae76918c --- /dev/null +++ b/scripts/generate_spm_sources_layout.swift @@ -0,0 +1,297 @@ +#!/usr/bin/swift + +// +// generate_spm_sources_layout.swift +// +// Created by Petro Rovenskyy on 09.03.2021. +// +// Swift Package Manager requires specific source file layout. +// This script generates SPM-compatible structure using symbolic links, +// allowing us to maintain the original Xcode project structure unchanged. +// +// Generated structure: +// - spm/Sources/AsyncDisplayKit/ - Implementation files (.mm, .m) +// - spm/Sources/AsyncDisplayKit/include/ - All headers (public + private) +// +// Usage: +// 1. From project root run: swift scripts/generate_spm_sources_layout.swift +// 2. Commit generated changes in spm/Sources/ +// 3. Run this script whenever you add, remove, or move files in Source/ + +import Foundation + +// MARK: Defines + +struct SearchPath { + enum SearchCfg: UInt8 { + case currentDirOnly + case includeSubirectories + } + let path: String + let isDir: Bool + let searchPattern: SearchCfg + init(path: String, + isDir: Bool, + searchPattern: SearchCfg = .includeSubirectories) { + self.path = path + self.isDir = isDir + self.searchPattern = searchPattern + } +} + +let excludeFilePaths: [SearchPath] = [ + .init(path: "Source/Classes/include", isDir: true), + .init(path: "spm/Sources", isDir: true) +] + +// Headers marked as Private in Xcode project - these should NOT be public in SPM +let privateHeaders: Set = [ + "ASAbstractLayoutController+FrameworkPrivate.h", // Contains C++ includes + "_ASAsyncTransactionContainer+Private.h", + "_ASCollectionGalleryLayoutInfo.h", + "_ASCollectionGalleryLayoutItem.h", + "_ASCollectionReusableView.h", + "_ASCollectionViewCell.h", + "_ASCoreAnimationExtras.h", + "_ASDisplayViewAccessiblity.h", + "_ASHierarchyChangeSet.h", + "_ASPendingState.h", + "_ASScopeTimer.h", + "ASBasicImageDownloaderInternal.h", + "ASBatchFetching.h", + "ASCellNode+Internal.h", + "ASCollectionLayout.h", + "ASCollectionLayoutCache.h", + "ASCollectionLayoutContext+Private.h", + "ASCollectionLayoutDefines.h", + "ASCollectionLayoutState+Private.h", + "ASCollectionViewFlowLayoutInspector.h", + "ASControlTargetAction.h", + "ASDefaultPlaybackButton.h", + "ASDefaultPlayButton.h", + "ASDelegateProxy.h", + "ASDispatch.h", + "ASDisplayNode+DebugTiming.h", + "ASDisplayNode+FrameworkPrivate.h", + "ASDisplayNodeCornerLayerDelegate.h", + "ASDisplayNodeInternal.h", + "ASDisplayNodeLayout.h", + "ASImageNode+AnimatedImagePrivate.h", + "ASImageNode+CGExtras.h", + "ASLayoutElementStylePrivate.h", + "ASLayoutManager.h", + "ASLayoutSpecPrivate.h", + "ASLayoutSpecUtilities.h", + "ASLayoutTransition.h", + "ASMainSerialQueue.h", + "ASNetworkImageLoadInfo+Private.h", + "ASPendingStateController.h", + "ASSection.h", + "ASStackLayoutSpecUtilities.h", + "ASStackPositionedLayout.h", + "ASStackUnpositionedLayout.h", + "ASTableLayoutController.h", + "ASTableView+Undeprecated.h", + "ASTableViewInternal.h", + "ASTextKitAttributes.h", + "ASTextKitContext.h", + "ASTextKitCoreTextAdditions.h", + "ASTextKitEntityAttribute.h", + "ASTextKitFontSizeAdjuster.h", + "ASTextKitRenderer.h", + "ASTextKitRenderer+Positioning.h", + "ASTextKitRenderer+TextChecking.h", + "ASTextKitShadower.h", + "ASTextKitTailTruncater.h", + "ASTextKitTruncating.h", + "ASTextNodeWordKerner.h", + "ASTwoDimensionalArrayUtils.h", + "ASWeakMap.h", + "NSIndexSet+ASHelpers.h" +] + +let publicHeadersLayout: [SearchPath] = [ + .init(path: "Source", isDir: true, searchPattern: .currentDirOnly), + .init(path: "Source/Details", isDir: true), + .init(path: "Source/Layout", isDir: true), + .init(path: "Source/Base", isDir: true), + .init(path: "Source/Debug", isDir: true), + .init(path: "Source/TextKit/ASTextNodeTypes.h", isDir: false), + .init(path: "Source/TextKit/ASTextKitComponents.h", isDir: false), + .init(path: "Source/TextExperiment/Component", isDir: true, searchPattern: .currentDirOnly), + .init(path: "Source/TextExperiment/String/ASTextAttribute.h", isDir: false), + // Public headers from Private folder (marked as Public in Xcode) + .init(path: "Source/Private/ASCollectionView+Undeprecated.h", isDir: false), +] + +// MARK: Helpers + +func publicHeadersOnlyFromCurrent(directory path: String) -> [String] { + let fm: FileManager = FileManager.default + let items: [String] = try! fm.contentsOfDirectory(atPath: path) + .filter({$0.hasSuffix(".h")}) + .filter({ !privateHeaders.contains($0) }) // Skip private headers + .compactMap({ (item) -> String in + return path + "/" + item + }) + return items +} + +func publicHeadersIncludingSubdirectoriesFrom(directory path: String) -> [String] { + let dirItems: FileManager.DirectoryEnumerator? = FileManager.default.enumerator(atPath: path) + let sourceFilePaths: [String] = dirItems?.allObjects as! [String] + var publicHeaders: [String] = [] + sourceFilePaths + .filter({$0.hasSuffix(".h")}) + .forEach { (sourceItemPath) in + let temp = path + "/" + sourceItemPath + let fileName = URL(fileURLWithPath: temp).lastPathComponent + + // Skip files if needed + guard excludeFilePaths.allSatisfy({!temp.contains($0.path)}) else { + return + } + + // Skip private headers + guard !privateHeaders.contains(fileName) else { + return + } + + // Validate that path make sence and file exists + guard FileManager.default.fileExists(atPath: temp) else { + fatalError("Could not find source file at path:\n \(path)") + } + publicHeaders.append(temp) + } + return publicHeaders +} + +func privateHeadersAndImpl(sources: String, publicHeaders: [String]) -> [String] { + var privateHeadersAndSources: [String] = [] + let dirItems: FileManager.DirectoryEnumerator? = FileManager.default.enumerator(atPath: sources) + let sourceFilePaths: [String] = dirItems?.allObjects as! [String] + sourceFilePaths.forEach { (path) in + let fullPath = sources + "/" + path + var isDir: ObjCBool = false + guard FileManager.default.fileExists(atPath: fullPath, + isDirectory: &isDir) else { + fatalError("Source file does not exist : \(fullPath)") + } + // filter folders + if isDir.boolValue { return } + // filter public headers + if publicHeaders.contains(fullPath) { + return + } + + // collect sources + if fullPath.hasSuffix(".h") || + fullPath.hasSuffix(".m") || + fullPath.hasSuffix(".mm") { + // Collect path + privateHeadersAndSources.append(fullPath) + } + } + return privateHeadersAndSources +} + +func createSymLinks(for sources: [String], atPath: String) { + sources.forEach { (sourcePath) in + let name = URL(string: sourcePath)!.lastPathComponent + let symLinkPath = atPath + "/" + name + do { + try FileManager.default.createSymbolicLink(atPath: symLinkPath, withDestinationPath: sourcePath) + } catch { + fatalError(error.localizedDescription) + } + } +} + +func cleanup(at: String) { + let fm = FileManager.default + // Create directory if it doesn't exist + if !fm.fileExists(atPath: at) { + try! fm.createDirectory(atPath: at, withIntermediateDirectories: true, attributes: nil) + return + } + // Remove all contents if directory exists + do { + let paths: [String] = try fm.contentsOfDirectory(atPath: at) + for path in paths { + try fm.removeItem(atPath: "\(at)/\(path)") + } + } catch { + fatalError(error.localizedDescription) + } +} + +func generateSPM(publicHeadersPath: String, sourcesPath: String) { + // 1. Delete all existing symlinks (both sources and headers) + cleanup(at: sourcesPath) + cleanup(at: publicHeadersPath) + // 2. Recreate directories + try! FileManager.default.createDirectory(atPath: publicHeadersPath, + withIntermediateDirectories: true, + attributes: nil) + // 3. Find all public headers + var publicHeaders: [String] = [] + publicHeadersLayout.forEach { (headerLayout) in + let fPath = projectRoot + "/" + headerLayout.path + // 3.1. Is it path to a file and not folder? + // Just grab it. + guard headerLayout.isDir else { + assert(FileManager.default.fileExists(atPath: fPath), + "Could not find source file at path:\n \(fPath)") + publicHeaders.append(fPath) + return + } + // 3.2. It's a folder path, search. + switch headerLayout.searchPattern { + case .currentDirOnly: + let currentFolder = publicHeadersOnlyFromCurrent(directory: fPath) + publicHeaders.append(contentsOf: currentFolder) + case .includeSubirectories: + let subfolders = publicHeadersIncludingSubdirectoriesFrom(directory: fPath) + publicHeaders.append(contentsOf: subfolders) + } + } + + // 4. Find private headers and impl files. + let privateSources: [String] = privateHeadersAndImpl(sources: sourceFolder, + publicHeaders: publicHeaders) + + // 5. For SPM: ALL headers (public + private) must be in publicHeadersPath + // because framework-style imports look there + let allHeaders = publicHeaders + privateSources.filter { $0.hasSuffix(".h") } + let relativeHeadersPath = allHeaders.map { (headerPath) -> String in + let relativePath = headerPath.replacingOccurrences(of: projectRoot, + with: "../../../../..") + return relativePath + } + createSymLinks(for: relativeHeadersPath, atPath: publicHeadersPath) + + // 6. Create symbolic links for implementation files (.mm, .m) in target root + // Note: We don't create custom module.modulemap because it causes issues with C++ headers + // SPM generates its own module map automatically. Umbrella header warnings are harmless. + let implFiles = privateSources.filter { $0.hasSuffix(".mm") || $0.hasSuffix(".m") } + let relativeSourcesPath = implFiles.map { (sourcePath) -> String in + let relativePath = sourcePath.replacingOccurrences(of: projectRoot, + with: "../../..") + return relativePath + } + createSymLinks(for: relativeSourcesPath, atPath: sourcesPath) +} + +// MARK: Script start + +let projectRoot: String = FileManager.default.currentDirectoryPath +let sourceFolder: String = projectRoot + "/Source" + +// MARK: Generate AsyncDisplayKit SPM layout +let asdkPublicHeadersPath = projectRoot + "/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit" +let asdkSourcesPath = projectRoot + "/spm/Sources/AsyncDisplayKit" + +generateSPM(publicHeadersPath: asdkPublicHeadersPath, + sourcesPath: asdkSourcesPath) + +// MARK: Script end diff --git a/spm/.gitkeep b/spm/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/spm/README.md b/spm/README.md new file mode 100644 index 000000000..2aa16b7c2 --- /dev/null +++ b/spm/README.md @@ -0,0 +1,37 @@ +# SPM Support + +This directory contains the Swift Package Manager integration for Texture. + +## Generating SPM Layout + +Before building with SPM, you need to generate the symlink structure: + +```bash +# From project root +swift scripts/generate_spm_sources_layout.swift +``` + +This will create `spm/Sources/AsyncDisplayKit/` with symlinks to the actual source files. + +The symlinks are gitignored because they are generated files. In the future, this will be +replaced with a Swift Package Manager build tool plugin. + +## Building with SPM + +```bash +# Build with default traits (Video, MapKit, Photos, AssetsLibrary) +swift build + +# Build with specific traits +swift build --traits IGListKit +swift build --traits Yoga +``` + +## Package Traits + +- **Video** (default): Video node support with AVFoundation and CoreMedia +- **MapKit** (default): MapKit integration for map nodes +- **Photos** (default): Photos framework support +- **AssetsLibrary** (default): Legacy AssetsLibrary support (iOS only) +- **IGListKit** (optional): IGListKit integration for advanced collection view support +- **Yoga** (optional): Yoga layout engine support as an alternative layout system diff --git a/spm/Sources/AsyncDisplayKit/ASAbsoluteLayoutSpec.mm b/spm/Sources/AsyncDisplayKit/ASAbsoluteLayoutSpec.mm new file mode 120000 index 000000000..4bb2cadf6 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASAbsoluteLayoutSpec.mm @@ -0,0 +1 @@ +../../../Source/Layout/ASAbsoluteLayoutSpec.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASAbstractLayoutController.mm b/spm/Sources/AsyncDisplayKit/ASAbstractLayoutController.mm new file mode 120000 index 000000000..ec049b2a2 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASAbstractLayoutController.mm @@ -0,0 +1 @@ +../../../Source/Details/ASAbstractLayoutController.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASAsciiArtBoxCreator.mm b/spm/Sources/AsyncDisplayKit/ASAsciiArtBoxCreator.mm new file mode 120000 index 000000000..63bc18b5c --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASAsciiArtBoxCreator.mm @@ -0,0 +1 @@ +../../../Source/Layout/ASAsciiArtBoxCreator.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASAssert.mm b/spm/Sources/AsyncDisplayKit/ASAssert.mm new file mode 120000 index 000000000..a1bcb8ea9 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASAssert.mm @@ -0,0 +1 @@ +../../../Source/Base/ASAssert.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASBackgroundLayoutSpec.mm b/spm/Sources/AsyncDisplayKit/ASBackgroundLayoutSpec.mm new file mode 120000 index 000000000..93e9c6fa6 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASBackgroundLayoutSpec.mm @@ -0,0 +1 @@ +../../../Source/Layout/ASBackgroundLayoutSpec.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASBasicImageDownloader.mm b/spm/Sources/AsyncDisplayKit/ASBasicImageDownloader.mm new file mode 120000 index 000000000..5a0d22bc6 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASBasicImageDownloader.mm @@ -0,0 +1 @@ +../../../Source/Details/ASBasicImageDownloader.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASBatchContext.mm b/spm/Sources/AsyncDisplayKit/ASBatchContext.mm new file mode 120000 index 000000000..6522d433b --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASBatchContext.mm @@ -0,0 +1 @@ +../../../Source/Details/ASBatchContext.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASBatchFetching.mm b/spm/Sources/AsyncDisplayKit/ASBatchFetching.mm new file mode 120000 index 000000000..121c35345 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASBatchFetching.mm @@ -0,0 +1 @@ +../../../Source/Private/ASBatchFetching.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASButtonNode+Yoga.mm b/spm/Sources/AsyncDisplayKit/ASButtonNode+Yoga.mm new file mode 120000 index 000000000..0256d5e16 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASButtonNode+Yoga.mm @@ -0,0 +1 @@ +../../../Source/ASButtonNode+Yoga.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASButtonNode.mm b/spm/Sources/AsyncDisplayKit/ASButtonNode.mm new file mode 120000 index 000000000..36eca95f4 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASButtonNode.mm @@ -0,0 +1 @@ +../../../Source/ASButtonNode.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASCellNode.mm b/spm/Sources/AsyncDisplayKit/ASCellNode.mm new file mode 120000 index 000000000..3fd325da2 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASCellNode.mm @@ -0,0 +1 @@ +../../../Source/ASCellNode.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASCenterLayoutSpec.mm b/spm/Sources/AsyncDisplayKit/ASCenterLayoutSpec.mm new file mode 120000 index 000000000..29e5b8892 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASCenterLayoutSpec.mm @@ -0,0 +1 @@ +../../../Source/Layout/ASCenterLayoutSpec.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASCollectionElement.mm b/spm/Sources/AsyncDisplayKit/ASCollectionElement.mm new file mode 120000 index 000000000..6188b6af1 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASCollectionElement.mm @@ -0,0 +1 @@ +../../../Source/Details/ASCollectionElement.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASCollectionFlowLayoutDelegate.mm b/spm/Sources/AsyncDisplayKit/ASCollectionFlowLayoutDelegate.mm new file mode 120000 index 000000000..e94835a3f --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASCollectionFlowLayoutDelegate.mm @@ -0,0 +1 @@ +../../../Source/Details/ASCollectionFlowLayoutDelegate.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASCollectionGalleryLayoutDelegate.mm b/spm/Sources/AsyncDisplayKit/ASCollectionGalleryLayoutDelegate.mm new file mode 120000 index 000000000..7c0baabee --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASCollectionGalleryLayoutDelegate.mm @@ -0,0 +1 @@ +../../../Source/Details/ASCollectionGalleryLayoutDelegate.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASCollectionLayout.mm b/spm/Sources/AsyncDisplayKit/ASCollectionLayout.mm new file mode 120000 index 000000000..c38d78eab --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASCollectionLayout.mm @@ -0,0 +1 @@ +../../../Source/Private/ASCollectionLayout.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASCollectionLayoutCache.mm b/spm/Sources/AsyncDisplayKit/ASCollectionLayoutCache.mm new file mode 120000 index 000000000..d2cf14b5a --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASCollectionLayoutCache.mm @@ -0,0 +1 @@ +../../../Source/Private/ASCollectionLayoutCache.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASCollectionLayoutContext.mm b/spm/Sources/AsyncDisplayKit/ASCollectionLayoutContext.mm new file mode 120000 index 000000000..e34f76102 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASCollectionLayoutContext.mm @@ -0,0 +1 @@ +../../../Source/Details/ASCollectionLayoutContext.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASCollectionLayoutDefines.mm b/spm/Sources/AsyncDisplayKit/ASCollectionLayoutDefines.mm new file mode 120000 index 000000000..b21e61025 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASCollectionLayoutDefines.mm @@ -0,0 +1 @@ +../../../Source/Private/ASCollectionLayoutDefines.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASCollectionLayoutState.mm b/spm/Sources/AsyncDisplayKit/ASCollectionLayoutState.mm new file mode 120000 index 000000000..87570c24a --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASCollectionLayoutState.mm @@ -0,0 +1 @@ +../../../Source/Details/ASCollectionLayoutState.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASCollectionNode.mm b/spm/Sources/AsyncDisplayKit/ASCollectionNode.mm new file mode 120000 index 000000000..a0d20835b --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASCollectionNode.mm @@ -0,0 +1 @@ +../../../Source/ASCollectionNode.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASCollectionView.mm b/spm/Sources/AsyncDisplayKit/ASCollectionView.mm new file mode 120000 index 000000000..bc4ad4159 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASCollectionView.mm @@ -0,0 +1 @@ +../../../Source/ASCollectionView.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASCollectionViewFlowLayoutInspector.mm b/spm/Sources/AsyncDisplayKit/ASCollectionViewFlowLayoutInspector.mm new file mode 120000 index 000000000..3abeeab91 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASCollectionViewFlowLayoutInspector.mm @@ -0,0 +1 @@ +../../../Source/Private/ASCollectionViewFlowLayoutInspector.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASCollectionViewLayoutController.mm b/spm/Sources/AsyncDisplayKit/ASCollectionViewLayoutController.mm new file mode 120000 index 000000000..17b8dac46 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASCollectionViewLayoutController.mm @@ -0,0 +1 @@ +../../../Source/Details/ASCollectionViewLayoutController.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASCollectionViewLayoutInspector.mm b/spm/Sources/AsyncDisplayKit/ASCollectionViewLayoutInspector.mm new file mode 120000 index 000000000..dc62226e0 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASCollectionViewLayoutInspector.mm @@ -0,0 +1 @@ +../../../Source/Details/ASCollectionViewLayoutInspector.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASCollections.mm b/spm/Sources/AsyncDisplayKit/ASCollections.mm new file mode 120000 index 000000000..9ed747582 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASCollections.mm @@ -0,0 +1 @@ +../../../Source/ASCollections.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASConfiguration.mm b/spm/Sources/AsyncDisplayKit/ASConfiguration.mm new file mode 120000 index 000000000..dfa3b47c4 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASConfiguration.mm @@ -0,0 +1 @@ +../../../Source/ASConfiguration.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASConfigurationInternal.mm b/spm/Sources/AsyncDisplayKit/ASConfigurationInternal.mm new file mode 120000 index 000000000..a2e816bae --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASConfigurationInternal.mm @@ -0,0 +1 @@ +../../../Source/ASConfigurationInternal.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASControlNode+tvOS.mm b/spm/Sources/AsyncDisplayKit/ASControlNode+tvOS.mm new file mode 120000 index 000000000..7ba10631c --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASControlNode+tvOS.mm @@ -0,0 +1 @@ +../../../Source/tvOS/ASControlNode+tvOS.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASControlNode.mm b/spm/Sources/AsyncDisplayKit/ASControlNode.mm new file mode 120000 index 000000000..b74324679 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASControlNode.mm @@ -0,0 +1 @@ +../../../Source/ASControlNode.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASControlTargetAction.mm b/spm/Sources/AsyncDisplayKit/ASControlTargetAction.mm new file mode 120000 index 000000000..09f3a3fa1 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASControlTargetAction.mm @@ -0,0 +1 @@ +../../../Source/Private/ASControlTargetAction.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASCornerLayoutSpec.mm b/spm/Sources/AsyncDisplayKit/ASCornerLayoutSpec.mm new file mode 120000 index 000000000..b135a93d4 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASCornerLayoutSpec.mm @@ -0,0 +1 @@ +../../../Source/Layout/ASCornerLayoutSpec.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASDKNavigationController.mm b/spm/Sources/AsyncDisplayKit/ASDKNavigationController.mm new file mode 120000 index 000000000..484035cff --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASDKNavigationController.mm @@ -0,0 +1 @@ +../../../Source/ASDKNavigationController.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASDKViewController.mm b/spm/Sources/AsyncDisplayKit/ASDKViewController.mm new file mode 120000 index 000000000..a11b40c98 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASDKViewController.mm @@ -0,0 +1 @@ +../../../Source/ASDKViewController.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASDataController.mm b/spm/Sources/AsyncDisplayKit/ASDataController.mm new file mode 120000 index 000000000..729bd7c93 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASDataController.mm @@ -0,0 +1 @@ +../../../Source/Details/ASDataController.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASDefaultImageDownloader.mm b/spm/Sources/AsyncDisplayKit/ASDefaultImageDownloader.mm new file mode 120000 index 000000000..2ceec4c12 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASDefaultImageDownloader.mm @@ -0,0 +1 @@ +../../../Source/ASDefaultImageDownloader.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASDefaultPlayButton.mm b/spm/Sources/AsyncDisplayKit/ASDefaultPlayButton.mm new file mode 120000 index 000000000..3d6a75dbe --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASDefaultPlayButton.mm @@ -0,0 +1 @@ +../../../Source/Private/ASDefaultPlayButton.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASDefaultPlaybackButton.mm b/spm/Sources/AsyncDisplayKit/ASDefaultPlaybackButton.mm new file mode 120000 index 000000000..053c0203a --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASDefaultPlaybackButton.mm @@ -0,0 +1 @@ +../../../Source/Private/ASDefaultPlaybackButton.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASDelegateProxy.mm b/spm/Sources/AsyncDisplayKit/ASDelegateProxy.mm new file mode 120000 index 000000000..c44c1e968 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASDelegateProxy.mm @@ -0,0 +1 @@ +../../../Source/Details/ASDelegateProxy.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASDimension.mm b/spm/Sources/AsyncDisplayKit/ASDimension.mm new file mode 120000 index 000000000..5ef118863 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASDimension.mm @@ -0,0 +1 @@ +../../../Source/Layout/ASDimension.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASDimensionInternal.mm b/spm/Sources/AsyncDisplayKit/ASDimensionInternal.mm new file mode 120000 index 000000000..34f2b337e --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASDimensionInternal.mm @@ -0,0 +1 @@ +../../../Source/Layout/ASDimensionInternal.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASDispatch.mm b/spm/Sources/AsyncDisplayKit/ASDispatch.mm new file mode 120000 index 000000000..da101d977 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASDispatch.mm @@ -0,0 +1 @@ +../../../Source/Private/ASDispatch.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASDisplayNode+Ancestry.mm b/spm/Sources/AsyncDisplayKit/ASDisplayNode+Ancestry.mm new file mode 120000 index 000000000..86eb634d8 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASDisplayNode+Ancestry.mm @@ -0,0 +1 @@ +../../../Source/Base/ASDisplayNode+Ancestry.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASDisplayNode+AsyncDisplay.mm b/spm/Sources/AsyncDisplayKit/ASDisplayNode+AsyncDisplay.mm new file mode 120000 index 000000000..288081506 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASDisplayNode+AsyncDisplay.mm @@ -0,0 +1 @@ +../../../Source/Private/ASDisplayNode+AsyncDisplay.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASDisplayNode+Convenience.mm b/spm/Sources/AsyncDisplayKit/ASDisplayNode+Convenience.mm new file mode 120000 index 000000000..ebd3f56f5 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASDisplayNode+Convenience.mm @@ -0,0 +1 @@ +../../../Source/ASDisplayNode+Convenience.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASDisplayNode+DebugTiming.mm b/spm/Sources/AsyncDisplayKit/ASDisplayNode+DebugTiming.mm new file mode 120000 index 000000000..b6fc3b506 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASDisplayNode+DebugTiming.mm @@ -0,0 +1 @@ +../../../Source/Private/ASDisplayNode+DebugTiming.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASDisplayNode+Layout.mm b/spm/Sources/AsyncDisplayKit/ASDisplayNode+Layout.mm new file mode 120000 index 000000000..1878c10fe --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASDisplayNode+Layout.mm @@ -0,0 +1 @@ +../../../Source/ASDisplayNode+Layout.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASDisplayNode+LayoutSpec.mm b/spm/Sources/AsyncDisplayKit/ASDisplayNode+LayoutSpec.mm new file mode 120000 index 000000000..b1676da48 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASDisplayNode+LayoutSpec.mm @@ -0,0 +1 @@ +../../../Source/ASDisplayNode+LayoutSpec.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASDisplayNode+UIViewBridge.mm b/spm/Sources/AsyncDisplayKit/ASDisplayNode+UIViewBridge.mm new file mode 120000 index 000000000..7ee216fa1 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASDisplayNode+UIViewBridge.mm @@ -0,0 +1 @@ +../../../Source/Private/ASDisplayNode+UIViewBridge.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASDisplayNode+Yoga.mm b/spm/Sources/AsyncDisplayKit/ASDisplayNode+Yoga.mm new file mode 120000 index 000000000..3862292f4 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASDisplayNode+Yoga.mm @@ -0,0 +1 @@ +../../../Source/ASDisplayNode+Yoga.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASDisplayNode.mm b/spm/Sources/AsyncDisplayKit/ASDisplayNode.mm new file mode 120000 index 000000000..876fe2bf7 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASDisplayNode.mm @@ -0,0 +1 @@ +../../../Source/ASDisplayNode.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASDisplayNodeCornerLayerDelegate.mm b/spm/Sources/AsyncDisplayKit/ASDisplayNodeCornerLayerDelegate.mm new file mode 120000 index 000000000..5b6ea2755 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASDisplayNodeCornerLayerDelegate.mm @@ -0,0 +1 @@ +../../../Source/Private/ASDisplayNodeCornerLayerDelegate.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASDisplayNodeExtras.mm b/spm/Sources/AsyncDisplayKit/ASDisplayNodeExtras.mm new file mode 120000 index 000000000..c5037b30f --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASDisplayNodeExtras.mm @@ -0,0 +1 @@ +../../../Source/ASDisplayNodeExtras.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASDisplayNodeTipState.mm b/spm/Sources/AsyncDisplayKit/ASDisplayNodeTipState.mm new file mode 120000 index 000000000..a4867b62b --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASDisplayNodeTipState.mm @@ -0,0 +1 @@ +../../../Source/Private/ASDisplayNodeTipState.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASEditableTextNode.mm b/spm/Sources/AsyncDisplayKit/ASEditableTextNode.mm new file mode 120000 index 000000000..4e67895ac --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASEditableTextNode.mm @@ -0,0 +1 @@ +../../../Source/ASEditableTextNode.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASElementMap.mm b/spm/Sources/AsyncDisplayKit/ASElementMap.mm new file mode 120000 index 000000000..957e4862f --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASElementMap.mm @@ -0,0 +1 @@ +../../../Source/Details/ASElementMap.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASExperimentalFeatures.mm b/spm/Sources/AsyncDisplayKit/ASExperimentalFeatures.mm new file mode 120000 index 000000000..df3dcfb86 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASExperimentalFeatures.mm @@ -0,0 +1 @@ +../../../Source/ASExperimentalFeatures.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASGraphicsContext.mm b/spm/Sources/AsyncDisplayKit/ASGraphicsContext.mm new file mode 120000 index 000000000..c3041d702 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASGraphicsContext.mm @@ -0,0 +1 @@ +../../../Source/Details/ASGraphicsContext.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASHashing.mm b/spm/Sources/AsyncDisplayKit/ASHashing.mm new file mode 120000 index 000000000..0482c0229 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASHashing.mm @@ -0,0 +1 @@ +../../../Source/Details/ASHashing.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASHighlightOverlayLayer.mm b/spm/Sources/AsyncDisplayKit/ASHighlightOverlayLayer.mm new file mode 120000 index 000000000..0bfb06577 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASHighlightOverlayLayer.mm @@ -0,0 +1 @@ +../../../Source/Details/ASHighlightOverlayLayer.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASIGListAdapterBasedDataSource.mm b/spm/Sources/AsyncDisplayKit/ASIGListAdapterBasedDataSource.mm new file mode 120000 index 000000000..c11c43af6 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASIGListAdapterBasedDataSource.mm @@ -0,0 +1 @@ +../../../Source/Private/ASIGListAdapterBasedDataSource.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASImageContainerProtocolCategories.mm b/spm/Sources/AsyncDisplayKit/ASImageContainerProtocolCategories.mm new file mode 120000 index 000000000..b20f099f5 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASImageContainerProtocolCategories.mm @@ -0,0 +1 @@ +../../../Source/Details/ASImageContainerProtocolCategories.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASImageNode+AnimatedImage.mm b/spm/Sources/AsyncDisplayKit/ASImageNode+AnimatedImage.mm new file mode 120000 index 000000000..379b93779 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASImageNode+AnimatedImage.mm @@ -0,0 +1 @@ +../../../Source/ASImageNode+AnimatedImage.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASImageNode+CGExtras.mm b/spm/Sources/AsyncDisplayKit/ASImageNode+CGExtras.mm new file mode 120000 index 000000000..e7c2a743a --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASImageNode+CGExtras.mm @@ -0,0 +1 @@ +../../../Source/Private/ASImageNode+CGExtras.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASImageNode+tvOS.mm b/spm/Sources/AsyncDisplayKit/ASImageNode+tvOS.mm new file mode 120000 index 000000000..27c55a757 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASImageNode+tvOS.mm @@ -0,0 +1 @@ +../../../Source/tvOS/ASImageNode+tvOS.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASImageNode.mm b/spm/Sources/AsyncDisplayKit/ASImageNode.mm new file mode 120000 index 000000000..cbec2bdbc --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASImageNode.mm @@ -0,0 +1 @@ +../../../Source/ASImageNode.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASInsetLayoutSpec.mm b/spm/Sources/AsyncDisplayKit/ASInsetLayoutSpec.mm new file mode 120000 index 000000000..0f708f223 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASInsetLayoutSpec.mm @@ -0,0 +1 @@ +../../../Source/Layout/ASInsetLayoutSpec.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASIntegerMap.mm b/spm/Sources/AsyncDisplayKit/ASIntegerMap.mm new file mode 120000 index 000000000..c45236b7e --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASIntegerMap.mm @@ -0,0 +1 @@ +../../../Source/Details/ASIntegerMap.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASInternalHelpers.mm b/spm/Sources/AsyncDisplayKit/ASInternalHelpers.mm new file mode 120000 index 000000000..17a0b49fd --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASInternalHelpers.mm @@ -0,0 +1 @@ +../../../Source/ASInternalHelpers.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASLayerBackingTipProvider.mm b/spm/Sources/AsyncDisplayKit/ASLayerBackingTipProvider.mm new file mode 120000 index 000000000..d66fa4a70 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASLayerBackingTipProvider.mm @@ -0,0 +1 @@ +../../../Source/Private/ASLayerBackingTipProvider.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASLayout+IGListDiffKit.mm b/spm/Sources/AsyncDisplayKit/ASLayout+IGListDiffKit.mm new file mode 120000 index 000000000..9b226dca1 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASLayout+IGListDiffKit.mm @@ -0,0 +1 @@ +../../../Source/Layout/ASLayout+IGListDiffKit.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASLayout.mm b/spm/Sources/AsyncDisplayKit/ASLayout.mm new file mode 120000 index 000000000..6eb3642d1 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASLayout.mm @@ -0,0 +1 @@ +../../../Source/Layout/ASLayout.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASLayoutElement.mm b/spm/Sources/AsyncDisplayKit/ASLayoutElement.mm new file mode 120000 index 000000000..d9c8e5948 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASLayoutElement.mm @@ -0,0 +1 @@ +../../../Source/Layout/ASLayoutElement.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASLayoutManager.mm b/spm/Sources/AsyncDisplayKit/ASLayoutManager.mm new file mode 120000 index 000000000..20988164d --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASLayoutManager.mm @@ -0,0 +1 @@ +../../../Source/TextKit/ASLayoutManager.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASLayoutSpec+Subclasses.mm b/spm/Sources/AsyncDisplayKit/ASLayoutSpec+Subclasses.mm new file mode 120000 index 000000000..46260a0e1 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASLayoutSpec+Subclasses.mm @@ -0,0 +1 @@ +../../../Source/Layout/ASLayoutSpec+Subclasses.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASLayoutSpec.mm b/spm/Sources/AsyncDisplayKit/ASLayoutSpec.mm new file mode 120000 index 000000000..d820f8af1 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASLayoutSpec.mm @@ -0,0 +1 @@ +../../../Source/Layout/ASLayoutSpec.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASLayoutTransition.mm b/spm/Sources/AsyncDisplayKit/ASLayoutTransition.mm new file mode 120000 index 000000000..6aa0e01cd --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASLayoutTransition.mm @@ -0,0 +1 @@ +../../../Source/Private/ASLayoutTransition.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASLog.mm b/spm/Sources/AsyncDisplayKit/ASLog.mm new file mode 120000 index 000000000..742002f37 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASLog.mm @@ -0,0 +1 @@ +../../../Source/Base/ASLog.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASMainSerialQueue.mm b/spm/Sources/AsyncDisplayKit/ASMainSerialQueue.mm new file mode 120000 index 000000000..0c13a3f0b --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASMainSerialQueue.mm @@ -0,0 +1 @@ +../../../Source/Details/ASMainSerialQueue.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASMainThreadDeallocation.mm b/spm/Sources/AsyncDisplayKit/ASMainThreadDeallocation.mm new file mode 120000 index 000000000..cfc68aa39 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASMainThreadDeallocation.mm @@ -0,0 +1 @@ +../../../Source/ASMainThreadDeallocation.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASMapNode.mm b/spm/Sources/AsyncDisplayKit/ASMapNode.mm new file mode 120000 index 000000000..929c591aa --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASMapNode.mm @@ -0,0 +1 @@ +../../../Source/ASMapNode.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASMultiplexImageNode.mm b/spm/Sources/AsyncDisplayKit/ASMultiplexImageNode.mm new file mode 120000 index 000000000..d2ade9bad --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASMultiplexImageNode.mm @@ -0,0 +1 @@ +../../../Source/ASMultiplexImageNode.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASMutableAttributedStringBuilder.mm b/spm/Sources/AsyncDisplayKit/ASMutableAttributedStringBuilder.mm new file mode 120000 index 000000000..c30b3a311 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASMutableAttributedStringBuilder.mm @@ -0,0 +1 @@ +../../../Source/Details/ASMutableAttributedStringBuilder.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASMutableElementMap.mm b/spm/Sources/AsyncDisplayKit/ASMutableElementMap.mm new file mode 120000 index 000000000..d34d89969 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASMutableElementMap.mm @@ -0,0 +1 @@ +../../../Source/Private/ASMutableElementMap.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASNetworkImageLoadInfo.mm b/spm/Sources/AsyncDisplayKit/ASNetworkImageLoadInfo.mm new file mode 120000 index 000000000..810d17d8a --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASNetworkImageLoadInfo.mm @@ -0,0 +1 @@ +../../../Source/ASNetworkImageLoadInfo.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASNetworkImageNode.mm b/spm/Sources/AsyncDisplayKit/ASNetworkImageNode.mm new file mode 120000 index 000000000..e587a90f0 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASNetworkImageNode.mm @@ -0,0 +1 @@ +../../../Source/ASNetworkImageNode.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASNodeController+Beta.mm b/spm/Sources/AsyncDisplayKit/ASNodeController+Beta.mm new file mode 120000 index 000000000..e3d156200 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASNodeController+Beta.mm @@ -0,0 +1 @@ +../../../Source/ASNodeController+Beta.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASObjectDescriptionHelpers.mm b/spm/Sources/AsyncDisplayKit/ASObjectDescriptionHelpers.mm new file mode 120000 index 000000000..4bd20ba47 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASObjectDescriptionHelpers.mm @@ -0,0 +1 @@ +../../../Source/Details/ASObjectDescriptionHelpers.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASOverlayLayoutSpec.mm b/spm/Sources/AsyncDisplayKit/ASOverlayLayoutSpec.mm new file mode 120000 index 000000000..494b2b2ac --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASOverlayLayoutSpec.mm @@ -0,0 +1 @@ +../../../Source/Layout/ASOverlayLayoutSpec.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASPINRemoteImageDownloader.mm b/spm/Sources/AsyncDisplayKit/ASPINRemoteImageDownloader.mm new file mode 120000 index 000000000..3b2db9034 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASPINRemoteImageDownloader.mm @@ -0,0 +1 @@ +../../../Source/Details/ASPINRemoteImageDownloader.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASPageTable.mm b/spm/Sources/AsyncDisplayKit/ASPageTable.mm new file mode 120000 index 000000000..592e22c5f --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASPageTable.mm @@ -0,0 +1 @@ +../../../Source/Details/ASPageTable.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASPagerFlowLayout.mm b/spm/Sources/AsyncDisplayKit/ASPagerFlowLayout.mm new file mode 120000 index 000000000..a3cee749d --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASPagerFlowLayout.mm @@ -0,0 +1 @@ +../../../Source/ASPagerFlowLayout.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASPagerNode.mm b/spm/Sources/AsyncDisplayKit/ASPagerNode.mm new file mode 120000 index 000000000..bec82f03b --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASPagerNode.mm @@ -0,0 +1 @@ +../../../Source/ASPagerNode.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASPendingStateController.mm b/spm/Sources/AsyncDisplayKit/ASPendingStateController.mm new file mode 120000 index 000000000..8b7511730 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASPendingStateController.mm @@ -0,0 +1 @@ +../../../Source/Private/ASPendingStateController.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASPhotosFrameworkImageRequest.mm b/spm/Sources/AsyncDisplayKit/ASPhotosFrameworkImageRequest.mm new file mode 120000 index 000000000..1e2c2a22f --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASPhotosFrameworkImageRequest.mm @@ -0,0 +1 @@ +../../../Source/Details/ASPhotosFrameworkImageRequest.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASRangeController.mm b/spm/Sources/AsyncDisplayKit/ASRangeController.mm new file mode 120000 index 000000000..57c91b855 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASRangeController.mm @@ -0,0 +1 @@ +../../../Source/Details/ASRangeController.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASRatioLayoutSpec.mm b/spm/Sources/AsyncDisplayKit/ASRatioLayoutSpec.mm new file mode 120000 index 000000000..604f1f958 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASRatioLayoutSpec.mm @@ -0,0 +1 @@ +../../../Source/Layout/ASRatioLayoutSpec.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASRecursiveUnfairLock.mm b/spm/Sources/AsyncDisplayKit/ASRecursiveUnfairLock.mm new file mode 120000 index 000000000..e5036aba8 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASRecursiveUnfairLock.mm @@ -0,0 +1 @@ +../../../Source/Details/ASRecursiveUnfairLock.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASRelativeLayoutSpec.mm b/spm/Sources/AsyncDisplayKit/ASRelativeLayoutSpec.mm new file mode 120000 index 000000000..f4d5932af --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASRelativeLayoutSpec.mm @@ -0,0 +1 @@ +../../../Source/Layout/ASRelativeLayoutSpec.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASResponderChainEnumerator.mm b/spm/Sources/AsyncDisplayKit/ASResponderChainEnumerator.mm new file mode 120000 index 000000000..798221b08 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASResponderChainEnumerator.mm @@ -0,0 +1 @@ +../../../Source/Private/ASResponderChainEnumerator.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASRunLoopQueue.mm b/spm/Sources/AsyncDisplayKit/ASRunLoopQueue.mm new file mode 120000 index 000000000..dada41631 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASRunLoopQueue.mm @@ -0,0 +1 @@ +../../../Source/ASRunLoopQueue.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASScrollDirection.mm b/spm/Sources/AsyncDisplayKit/ASScrollDirection.mm new file mode 120000 index 000000000..7a1097af8 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASScrollDirection.mm @@ -0,0 +1 @@ +../../../Source/Details/ASScrollDirection.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASScrollNode.mm b/spm/Sources/AsyncDisplayKit/ASScrollNode.mm new file mode 120000 index 000000000..523d2e89f --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASScrollNode.mm @@ -0,0 +1 @@ +../../../Source/ASScrollNode.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASSection.mm b/spm/Sources/AsyncDisplayKit/ASSection.mm new file mode 120000 index 000000000..f88f34809 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASSection.mm @@ -0,0 +1 @@ +../../../Source/Private/ASSection.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASStackLayoutSpec.mm b/spm/Sources/AsyncDisplayKit/ASStackLayoutSpec.mm new file mode 120000 index 000000000..8638c07c3 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASStackLayoutSpec.mm @@ -0,0 +1 @@ +../../../Source/Layout/ASStackLayoutSpec.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASStackPositionedLayout.mm b/spm/Sources/AsyncDisplayKit/ASStackPositionedLayout.mm new file mode 120000 index 000000000..b22016aa5 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASStackPositionedLayout.mm @@ -0,0 +1 @@ +../../../Source/Private/Layout/ASStackPositionedLayout.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASStackUnpositionedLayout.mm b/spm/Sources/AsyncDisplayKit/ASStackUnpositionedLayout.mm new file mode 120000 index 000000000..9eb5a396d --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASStackUnpositionedLayout.mm @@ -0,0 +1 @@ +../../../Source/Private/Layout/ASStackUnpositionedLayout.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTabBarController.mm b/spm/Sources/AsyncDisplayKit/ASTabBarController.mm new file mode 120000 index 000000000..dd9d7b6e8 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTabBarController.mm @@ -0,0 +1 @@ +../../../Source/ASTabBarController.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTableLayoutController.mm b/spm/Sources/AsyncDisplayKit/ASTableLayoutController.mm new file mode 120000 index 000000000..f6d4a7568 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTableLayoutController.mm @@ -0,0 +1 @@ +../../../Source/Details/ASTableLayoutController.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTableNode.mm b/spm/Sources/AsyncDisplayKit/ASTableNode.mm new file mode 120000 index 000000000..438ba3e95 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTableNode.mm @@ -0,0 +1 @@ +../../../Source/ASTableNode.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTableView.mm b/spm/Sources/AsyncDisplayKit/ASTableView.mm new file mode 120000 index 000000000..40a3e17f7 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTableView.mm @@ -0,0 +1 @@ +../../../Source/ASTableView.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTextAttribute.mm b/spm/Sources/AsyncDisplayKit/ASTextAttribute.mm new file mode 120000 index 000000000..41a02747f --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTextAttribute.mm @@ -0,0 +1 @@ +../../../Source/TextExperiment/String/ASTextAttribute.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTextDebugOption.mm b/spm/Sources/AsyncDisplayKit/ASTextDebugOption.mm new file mode 120000 index 000000000..9d62c3e9e --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTextDebugOption.mm @@ -0,0 +1 @@ +../../../Source/TextExperiment/Component/ASTextDebugOption.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTextInput.mm b/spm/Sources/AsyncDisplayKit/ASTextInput.mm new file mode 120000 index 000000000..52aa961ae --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTextInput.mm @@ -0,0 +1 @@ +../../../Source/TextExperiment/Component/ASTextInput.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTextKitAttributes.mm b/spm/Sources/AsyncDisplayKit/ASTextKitAttributes.mm new file mode 120000 index 000000000..4edf9ef52 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTextKitAttributes.mm @@ -0,0 +1 @@ +../../../Source/TextKit/ASTextKitAttributes.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTextKitComponents.mm b/spm/Sources/AsyncDisplayKit/ASTextKitComponents.mm new file mode 120000 index 000000000..38446c492 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTextKitComponents.mm @@ -0,0 +1 @@ +../../../Source/TextKit/ASTextKitComponents.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTextKitContext.mm b/spm/Sources/AsyncDisplayKit/ASTextKitContext.mm new file mode 120000 index 000000000..749e8e9ca --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTextKitContext.mm @@ -0,0 +1 @@ +../../../Source/TextKit/ASTextKitContext.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTextKitCoreTextAdditions.mm b/spm/Sources/AsyncDisplayKit/ASTextKitCoreTextAdditions.mm new file mode 120000 index 000000000..53790c1d2 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTextKitCoreTextAdditions.mm @@ -0,0 +1 @@ +../../../Source/TextKit/ASTextKitCoreTextAdditions.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTextKitEntityAttribute.mm b/spm/Sources/AsyncDisplayKit/ASTextKitEntityAttribute.mm new file mode 120000 index 000000000..c2b4b6da3 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTextKitEntityAttribute.mm @@ -0,0 +1 @@ +../../../Source/TextKit/ASTextKitEntityAttribute.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTextKitFontSizeAdjuster.mm b/spm/Sources/AsyncDisplayKit/ASTextKitFontSizeAdjuster.mm new file mode 120000 index 000000000..45fd0c43d --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTextKitFontSizeAdjuster.mm @@ -0,0 +1 @@ +../../../Source/TextKit/ASTextKitFontSizeAdjuster.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTextKitRenderer+Positioning.mm b/spm/Sources/AsyncDisplayKit/ASTextKitRenderer+Positioning.mm new file mode 120000 index 000000000..9af85dcb2 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTextKitRenderer+Positioning.mm @@ -0,0 +1 @@ +../../../Source/TextKit/ASTextKitRenderer+Positioning.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTextKitRenderer+TextChecking.mm b/spm/Sources/AsyncDisplayKit/ASTextKitRenderer+TextChecking.mm new file mode 120000 index 000000000..d0a092231 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTextKitRenderer+TextChecking.mm @@ -0,0 +1 @@ +../../../Source/TextKit/ASTextKitRenderer+TextChecking.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTextKitRenderer.mm b/spm/Sources/AsyncDisplayKit/ASTextKitRenderer.mm new file mode 120000 index 000000000..aca54b173 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTextKitRenderer.mm @@ -0,0 +1 @@ +../../../Source/TextKit/ASTextKitRenderer.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTextKitShadower.mm b/spm/Sources/AsyncDisplayKit/ASTextKitShadower.mm new file mode 120000 index 000000000..dd6a96eed --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTextKitShadower.mm @@ -0,0 +1 @@ +../../../Source/TextKit/ASTextKitShadower.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTextKitTailTruncater.mm b/spm/Sources/AsyncDisplayKit/ASTextKitTailTruncater.mm new file mode 120000 index 000000000..1636b99f6 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTextKitTailTruncater.mm @@ -0,0 +1 @@ +../../../Source/TextKit/ASTextKitTailTruncater.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTextLayout.mm b/spm/Sources/AsyncDisplayKit/ASTextLayout.mm new file mode 120000 index 000000000..c6263694f --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTextLayout.mm @@ -0,0 +1 @@ +../../../Source/TextExperiment/Component/ASTextLayout.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTextLine.mm b/spm/Sources/AsyncDisplayKit/ASTextLine.mm new file mode 120000 index 000000000..35c555b5d --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTextLine.mm @@ -0,0 +1 @@ +../../../Source/TextExperiment/Component/ASTextLine.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTextNode.mm b/spm/Sources/AsyncDisplayKit/ASTextNode.mm new file mode 120000 index 000000000..886e95ef0 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTextNode.mm @@ -0,0 +1 @@ +../../../Source/ASTextNode.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTextNode2.mm b/spm/Sources/AsyncDisplayKit/ASTextNode2.mm new file mode 120000 index 000000000..1579c2315 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTextNode2.mm @@ -0,0 +1 @@ +../../../Source/ASTextNode2.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTextNodeWordKerner.mm b/spm/Sources/AsyncDisplayKit/ASTextNodeWordKerner.mm new file mode 120000 index 000000000..638aaa0d1 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTextNodeWordKerner.mm @@ -0,0 +1 @@ +../../../Source/TextKit/ASTextNodeWordKerner.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTextRunDelegate.mm b/spm/Sources/AsyncDisplayKit/ASTextRunDelegate.mm new file mode 120000 index 000000000..54f48206f --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTextRunDelegate.mm @@ -0,0 +1 @@ +../../../Source/TextExperiment/String/ASTextRunDelegate.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTextUtilities.mm b/spm/Sources/AsyncDisplayKit/ASTextUtilities.mm new file mode 120000 index 000000000..df952f02c --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTextUtilities.mm @@ -0,0 +1 @@ +../../../Source/TextExperiment/Utility/ASTextUtilities.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTip.mm b/spm/Sources/AsyncDisplayKit/ASTip.mm new file mode 120000 index 000000000..78b16abec --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTip.mm @@ -0,0 +1 @@ +../../../Source/Private/ASTip.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTipNode.mm b/spm/Sources/AsyncDisplayKit/ASTipNode.mm new file mode 120000 index 000000000..353b93977 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTipNode.mm @@ -0,0 +1 @@ +../../../Source/Private/ASTipNode.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTipProvider.mm b/spm/Sources/AsyncDisplayKit/ASTipProvider.mm new file mode 120000 index 000000000..058f8d1a9 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTipProvider.mm @@ -0,0 +1 @@ +../../../Source/Private/ASTipProvider.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTipsController.mm b/spm/Sources/AsyncDisplayKit/ASTipsController.mm new file mode 120000 index 000000000..41326e7b5 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTipsController.mm @@ -0,0 +1 @@ +../../../Source/Private/ASTipsController.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTipsWindow.mm b/spm/Sources/AsyncDisplayKit/ASTipsWindow.mm new file mode 120000 index 000000000..524684e98 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTipsWindow.mm @@ -0,0 +1 @@ +../../../Source/Private/ASTipsWindow.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTraitCollection.mm b/spm/Sources/AsyncDisplayKit/ASTraitCollection.mm new file mode 120000 index 000000000..a7e9dc2da --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTraitCollection.mm @@ -0,0 +1 @@ +../../../Source/Details/ASTraitCollection.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASTwoDimensionalArrayUtils.mm b/spm/Sources/AsyncDisplayKit/ASTwoDimensionalArrayUtils.mm new file mode 120000 index 000000000..b70a2a760 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASTwoDimensionalArrayUtils.mm @@ -0,0 +1 @@ +../../../Source/Private/ASTwoDimensionalArrayUtils.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASVideoNode.mm b/spm/Sources/AsyncDisplayKit/ASVideoNode.mm new file mode 120000 index 000000000..a98f1158f --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASVideoNode.mm @@ -0,0 +1 @@ +../../../Source/ASVideoNode.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASVideoPlayerNode.mm b/spm/Sources/AsyncDisplayKit/ASVideoPlayerNode.mm new file mode 120000 index 000000000..a1b1fdfb6 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASVideoPlayerNode.mm @@ -0,0 +1 @@ +../../../Source/ASVideoPlayerNode.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASVisibilityProtocols.mm b/spm/Sources/AsyncDisplayKit/ASVisibilityProtocols.mm new file mode 120000 index 000000000..83140f691 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASVisibilityProtocols.mm @@ -0,0 +1 @@ +../../../Source/ASVisibilityProtocols.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASWeakMap.mm b/spm/Sources/AsyncDisplayKit/ASWeakMap.mm new file mode 120000 index 000000000..d839b274e --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASWeakMap.mm @@ -0,0 +1 @@ +../../../Source/Private/ASWeakMap.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASWeakProxy.mm b/spm/Sources/AsyncDisplayKit/ASWeakProxy.mm new file mode 120000 index 000000000..101bc283e --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASWeakProxy.mm @@ -0,0 +1 @@ +../../../Source/Details/ASWeakProxy.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASWeakSet.mm b/spm/Sources/AsyncDisplayKit/ASWeakSet.mm new file mode 120000 index 000000000..51d37c3d7 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASWeakSet.mm @@ -0,0 +1 @@ +../../../Source/Details/ASWeakSet.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/ASYogaUtilities.mm b/spm/Sources/AsyncDisplayKit/ASYogaUtilities.mm new file mode 120000 index 000000000..3e335a5cc --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/ASYogaUtilities.mm @@ -0,0 +1 @@ +../../../Source/Layout/ASYogaUtilities.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/AsyncDisplayKit+Debug.mm b/spm/Sources/AsyncDisplayKit/AsyncDisplayKit+Debug.mm new file mode 120000 index 000000000..cc7f798d8 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/AsyncDisplayKit+Debug.mm @@ -0,0 +1 @@ +../../../Source/Debug/AsyncDisplayKit+Debug.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/AsyncDisplayKit+IGListKitMethods.mm b/spm/Sources/AsyncDisplayKit/AsyncDisplayKit+IGListKitMethods.mm new file mode 120000 index 000000000..e5ab5e16e --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/AsyncDisplayKit+IGListKitMethods.mm @@ -0,0 +1 @@ +../../../Source/AsyncDisplayKit+IGListKitMethods.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/AsyncDisplayKit+Tips.mm b/spm/Sources/AsyncDisplayKit/AsyncDisplayKit+Tips.mm new file mode 120000 index 000000000..0706004c3 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/AsyncDisplayKit+Tips.mm @@ -0,0 +1 @@ +../../../Source/Debug/AsyncDisplayKit+Tips.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/IGListAdapter+AsyncDisplayKit.mm b/spm/Sources/AsyncDisplayKit/IGListAdapter+AsyncDisplayKit.mm new file mode 120000 index 000000000..362f69d88 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/IGListAdapter+AsyncDisplayKit.mm @@ -0,0 +1 @@ +../../../Source/IGListAdapter+AsyncDisplayKit.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/NSArray+Diffing.mm b/spm/Sources/AsyncDisplayKit/NSArray+Diffing.mm new file mode 120000 index 000000000..d13e5db4d --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/NSArray+Diffing.mm @@ -0,0 +1 @@ +../../../Source/Details/NSArray+Diffing.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/NSAttributedString+ASText.mm b/spm/Sources/AsyncDisplayKit/NSAttributedString+ASText.mm new file mode 120000 index 000000000..49ac3031e --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/NSAttributedString+ASText.mm @@ -0,0 +1 @@ +../../../Source/TextExperiment/Utility/NSAttributedString+ASText.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/NSIndexSet+ASHelpers.mm b/spm/Sources/AsyncDisplayKit/NSIndexSet+ASHelpers.mm new file mode 120000 index 000000000..7484cd84b --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/NSIndexSet+ASHelpers.mm @@ -0,0 +1 @@ +../../../Source/Details/NSIndexSet+ASHelpers.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/NSMutableAttributedString+TextKitAdditions.mm b/spm/Sources/AsyncDisplayKit/NSMutableAttributedString+TextKitAdditions.mm new file mode 120000 index 000000000..fc9a195c0 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/NSMutableAttributedString+TextKitAdditions.mm @@ -0,0 +1 @@ +../../../Source/Details/NSMutableAttributedString+TextKitAdditions.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/NSParagraphStyle+ASText.mm b/spm/Sources/AsyncDisplayKit/NSParagraphStyle+ASText.mm new file mode 120000 index 000000000..58f98a8e3 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/NSParagraphStyle+ASText.mm @@ -0,0 +1 @@ +../../../Source/TextExperiment/Utility/NSParagraphStyle+ASText.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/UICollectionViewLayout+ASConvenience.mm b/spm/Sources/AsyncDisplayKit/UICollectionViewLayout+ASConvenience.mm new file mode 120000 index 000000000..dd1e82d3d --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/UICollectionViewLayout+ASConvenience.mm @@ -0,0 +1 @@ +../../../Source/Details/UICollectionViewLayout+ASConvenience.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/UIImage+ASConvenience.mm b/spm/Sources/AsyncDisplayKit/UIImage+ASConvenience.mm new file mode 120000 index 000000000..33324127b --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/UIImage+ASConvenience.mm @@ -0,0 +1 @@ +../../../Source/UIImage+ASConvenience.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/UIResponder+AsyncDisplayKit.mm b/spm/Sources/AsyncDisplayKit/UIResponder+AsyncDisplayKit.mm new file mode 120000 index 000000000..9217dbf18 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/UIResponder+AsyncDisplayKit.mm @@ -0,0 +1 @@ +../../../Source/UIResponder+AsyncDisplayKit.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/_ASAsyncTransaction.mm b/spm/Sources/AsyncDisplayKit/_ASAsyncTransaction.mm new file mode 120000 index 000000000..d04b9a10e --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/_ASAsyncTransaction.mm @@ -0,0 +1 @@ +../../../Source/Details/Transactions/_ASAsyncTransaction.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/_ASAsyncTransactionContainer.mm b/spm/Sources/AsyncDisplayKit/_ASAsyncTransactionContainer.mm new file mode 120000 index 000000000..af0a3c58e --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/_ASAsyncTransactionContainer.mm @@ -0,0 +1 @@ +../../../Source/Details/Transactions/_ASAsyncTransactionContainer.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/_ASAsyncTransactionGroup.mm b/spm/Sources/AsyncDisplayKit/_ASAsyncTransactionGroup.mm new file mode 120000 index 000000000..dd4088b48 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/_ASAsyncTransactionGroup.mm @@ -0,0 +1 @@ +../../../Source/Details/Transactions/_ASAsyncTransactionGroup.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/_ASCollectionGalleryLayoutInfo.mm b/spm/Sources/AsyncDisplayKit/_ASCollectionGalleryLayoutInfo.mm new file mode 120000 index 000000000..dcf63bc5e --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/_ASCollectionGalleryLayoutInfo.mm @@ -0,0 +1 @@ +../../../Source/Private/_ASCollectionGalleryLayoutInfo.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/_ASCollectionGalleryLayoutItem.mm b/spm/Sources/AsyncDisplayKit/_ASCollectionGalleryLayoutItem.mm new file mode 120000 index 000000000..bdfcaea0e --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/_ASCollectionGalleryLayoutItem.mm @@ -0,0 +1 @@ +../../../Source/Private/_ASCollectionGalleryLayoutItem.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/_ASCollectionReusableView.mm b/spm/Sources/AsyncDisplayKit/_ASCollectionReusableView.mm new file mode 120000 index 000000000..2f8d8ac85 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/_ASCollectionReusableView.mm @@ -0,0 +1 @@ +../../../Source/Details/_ASCollectionReusableView.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/_ASCollectionViewCell.mm b/spm/Sources/AsyncDisplayKit/_ASCollectionViewCell.mm new file mode 120000 index 000000000..676dec169 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/_ASCollectionViewCell.mm @@ -0,0 +1 @@ +../../../Source/Details/_ASCollectionViewCell.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/_ASCoreAnimationExtras.mm b/spm/Sources/AsyncDisplayKit/_ASCoreAnimationExtras.mm new file mode 120000 index 000000000..ce484f99e --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/_ASCoreAnimationExtras.mm @@ -0,0 +1 @@ +../../../Source/Private/_ASCoreAnimationExtras.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/_ASDisplayLayer.mm b/spm/Sources/AsyncDisplayKit/_ASDisplayLayer.mm new file mode 120000 index 000000000..c7dff788f --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/_ASDisplayLayer.mm @@ -0,0 +1 @@ +../../../Source/Details/_ASDisplayLayer.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/_ASDisplayView.mm b/spm/Sources/AsyncDisplayKit/_ASDisplayView.mm new file mode 120000 index 000000000..06606f850 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/_ASDisplayView.mm @@ -0,0 +1 @@ +../../../Source/Details/_ASDisplayView.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/_ASDisplayViewAccessiblity.mm b/spm/Sources/AsyncDisplayKit/_ASDisplayViewAccessiblity.mm new file mode 120000 index 000000000..93f3ef258 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/_ASDisplayViewAccessiblity.mm @@ -0,0 +1 @@ +../../../Source/Details/_ASDisplayViewAccessiblity.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/_ASHierarchyChangeSet.mm b/spm/Sources/AsyncDisplayKit/_ASHierarchyChangeSet.mm new file mode 120000 index 000000000..951c0c8a3 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/_ASHierarchyChangeSet.mm @@ -0,0 +1 @@ +../../../Source/Private/_ASHierarchyChangeSet.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/_ASPendingState.mm b/spm/Sources/AsyncDisplayKit/_ASPendingState.mm new file mode 120000 index 000000000..87ab76276 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/_ASPendingState.mm @@ -0,0 +1 @@ +../../../Source/Private/_ASPendingState.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/_ASTransitionContext.mm b/spm/Sources/AsyncDisplayKit/_ASTransitionContext.mm new file mode 120000 index 000000000..32593621d --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/_ASTransitionContext.mm @@ -0,0 +1 @@ +../../../Source/_ASTransitionContext.mm \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAbsoluteLayoutElement.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAbsoluteLayoutElement.h new file mode 120000 index 000000000..b7407f693 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAbsoluteLayoutElement.h @@ -0,0 +1 @@ +../../../../../Source/Layout/ASAbsoluteLayoutElement.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAbsoluteLayoutSpec.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAbsoluteLayoutSpec.h new file mode 120000 index 000000000..ffd95cb90 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAbsoluteLayoutSpec.h @@ -0,0 +1 @@ +../../../../../Source/Layout/ASAbsoluteLayoutSpec.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAbstractLayoutController+FrameworkPrivate.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAbstractLayoutController+FrameworkPrivate.h new file mode 120000 index 000000000..fe1637f23 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAbstractLayoutController+FrameworkPrivate.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASAbstractLayoutController+FrameworkPrivate.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAbstractLayoutController.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAbstractLayoutController.h new file mode 120000 index 000000000..85c9e639f --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAbstractLayoutController.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASAbstractLayoutController.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAsciiArtBoxCreator.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAsciiArtBoxCreator.h new file mode 120000 index 000000000..2ade711b5 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAsciiArtBoxCreator.h @@ -0,0 +1 @@ +../../../../../Source/Layout/ASAsciiArtBoxCreator.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAssert.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAssert.h new file mode 120000 index 000000000..065307e28 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAssert.h @@ -0,0 +1 @@ +../../../../../Source/Base/ASAssert.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAvailability.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAvailability.h new file mode 120000 index 000000000..584afec93 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAvailability.h @@ -0,0 +1 @@ +../../../../../Source/Base/ASAvailability.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBackgroundLayoutSpec.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBackgroundLayoutSpec.h new file mode 120000 index 000000000..d9b8f27e3 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBackgroundLayoutSpec.h @@ -0,0 +1 @@ +../../../../../Source/Layout/ASBackgroundLayoutSpec.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBaseDefines.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBaseDefines.h new file mode 120000 index 000000000..95b06bcaf --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBaseDefines.h @@ -0,0 +1 @@ +../../../../../Source/Base/ASBaseDefines.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBasicImageDownloader.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBasicImageDownloader.h new file mode 120000 index 000000000..68ba9fba0 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBasicImageDownloader.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASBasicImageDownloader.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBasicImageDownloaderInternal.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBasicImageDownloaderInternal.h new file mode 120000 index 000000000..c3a4885f9 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBasicImageDownloaderInternal.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASBasicImageDownloaderInternal.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBatchContext.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBatchContext.h new file mode 120000 index 000000000..35694fce3 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBatchContext.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASBatchContext.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBatchFetching.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBatchFetching.h new file mode 120000 index 000000000..675e9f374 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBatchFetching.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASBatchFetching.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBatchFetchingDelegate.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBatchFetchingDelegate.h new file mode 120000 index 000000000..fc37cb868 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBatchFetchingDelegate.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASBatchFetchingDelegate.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBlockTypes.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBlockTypes.h new file mode 120000 index 000000000..83aabbeae --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBlockTypes.h @@ -0,0 +1 @@ +../../../../../Source/ASBlockTypes.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASButtonNode+Private.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASButtonNode+Private.h new file mode 120000 index 000000000..fab9d0d9d --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASButtonNode+Private.h @@ -0,0 +1 @@ +../../../../../Source/ASButtonNode+Private.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASButtonNode+Yoga.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASButtonNode+Yoga.h new file mode 120000 index 000000000..58573b4a3 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASButtonNode+Yoga.h @@ -0,0 +1 @@ +../../../../../Source/ASButtonNode+Yoga.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASButtonNode.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASButtonNode.h new file mode 120000 index 000000000..c7f89fdb2 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASButtonNode.h @@ -0,0 +1 @@ +../../../../../Source/ASButtonNode.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCellNode+Internal.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCellNode+Internal.h new file mode 120000 index 000000000..312d2256b --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCellNode+Internal.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASCellNode+Internal.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCellNode.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCellNode.h new file mode 120000 index 000000000..4cc155b8a --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCellNode.h @@ -0,0 +1 @@ +../../../../../Source/ASCellNode.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCenterLayoutSpec.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCenterLayoutSpec.h new file mode 120000 index 000000000..4b4c20390 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCenterLayoutSpec.h @@ -0,0 +1 @@ +../../../../../Source/Layout/ASCenterLayoutSpec.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionElement.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionElement.h new file mode 120000 index 000000000..3dcdc3eae --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionElement.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASCollectionElement.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionFlowLayoutDelegate.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionFlowLayoutDelegate.h new file mode 120000 index 000000000..c891857b5 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionFlowLayoutDelegate.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASCollectionFlowLayoutDelegate.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionGalleryLayoutDelegate.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionGalleryLayoutDelegate.h new file mode 120000 index 000000000..c96979da8 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionGalleryLayoutDelegate.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASCollectionGalleryLayoutDelegate.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionInternal.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionInternal.h new file mode 120000 index 000000000..1ba63a7a2 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionInternal.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASCollectionInternal.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayout.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayout.h new file mode 120000 index 000000000..3f9e4965a --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayout.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASCollectionLayout.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutCache.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutCache.h new file mode 120000 index 000000000..b094efe9a --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutCache.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASCollectionLayoutCache.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutContext+Private.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutContext+Private.h new file mode 120000 index 000000000..1eddc0e6e --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutContext+Private.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASCollectionLayoutContext+Private.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutContext.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutContext.h new file mode 120000 index 000000000..8faf4faf6 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutContext.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASCollectionLayoutContext.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutDefines.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutDefines.h new file mode 120000 index 000000000..9dff0b4c9 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutDefines.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASCollectionLayoutDefines.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutDelegate.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutDelegate.h new file mode 120000 index 000000000..68ae6ed83 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutDelegate.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASCollectionLayoutDelegate.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutState+Private.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutState+Private.h new file mode 120000 index 000000000..bebc7bd14 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutState+Private.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASCollectionLayoutState+Private.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutState.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutState.h new file mode 120000 index 000000000..d6f425c03 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutState.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASCollectionLayoutState.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionNode+Beta.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionNode+Beta.h new file mode 120000 index 000000000..48302a69a --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionNode+Beta.h @@ -0,0 +1 @@ +../../../../../Source/ASCollectionNode+Beta.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionNode.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionNode.h new file mode 120000 index 000000000..815334196 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionNode.h @@ -0,0 +1 @@ +../../../../../Source/ASCollectionNode.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionView+Undeprecated.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionView+Undeprecated.h new file mode 120000 index 000000000..40cfd9b0e --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionView+Undeprecated.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASCollectionView+Undeprecated.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionView.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionView.h new file mode 120000 index 000000000..78de16f16 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionView.h @@ -0,0 +1 @@ +../../../../../Source/ASCollectionView.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionViewFlowLayoutInspector.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionViewFlowLayoutInspector.h new file mode 120000 index 000000000..721a714a9 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionViewFlowLayoutInspector.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASCollectionViewFlowLayoutInspector.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionViewLayoutController.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionViewLayoutController.h new file mode 120000 index 000000000..190345672 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionViewLayoutController.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASCollectionViewLayoutController.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionViewLayoutFacilitatorProtocol.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionViewLayoutFacilitatorProtocol.h new file mode 120000 index 000000000..19a77223c --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionViewLayoutFacilitatorProtocol.h @@ -0,0 +1 @@ +../../../../../Source/ASCollectionViewLayoutFacilitatorProtocol.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionViewLayoutInspector.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionViewLayoutInspector.h new file mode 120000 index 000000000..70dc77be3 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionViewLayoutInspector.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASCollectionViewLayoutInspector.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionViewProtocols.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionViewProtocols.h new file mode 120000 index 000000000..949938673 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionViewProtocols.h @@ -0,0 +1 @@ +../../../../../Source/ASCollectionViewProtocols.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollections.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollections.h new file mode 120000 index 000000000..4e70838bc --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollections.h @@ -0,0 +1 @@ +../../../../../Source/ASCollections.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASConfiguration.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASConfiguration.h new file mode 120000 index 000000000..e09945b39 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASConfiguration.h @@ -0,0 +1 @@ +../../../../../Source/ASConfiguration.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASConfigurationDelegate.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASConfigurationDelegate.h new file mode 120000 index 000000000..e838b1c91 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASConfigurationDelegate.h @@ -0,0 +1 @@ +../../../../../Source/ASConfigurationDelegate.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASConfigurationInternal.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASConfigurationInternal.h new file mode 120000 index 000000000..be21e8ff3 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASConfigurationInternal.h @@ -0,0 +1 @@ +../../../../../Source/ASConfigurationInternal.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASContextTransitioning.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASContextTransitioning.h new file mode 120000 index 000000000..317aa299d --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASContextTransitioning.h @@ -0,0 +1 @@ +../../../../../Source/ASContextTransitioning.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASControlNode+Private.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASControlNode+Private.h new file mode 120000 index 000000000..86156b271 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASControlNode+Private.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASControlNode+Private.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASControlNode+Subclasses.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASControlNode+Subclasses.h new file mode 120000 index 000000000..a44a1763e --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASControlNode+Subclasses.h @@ -0,0 +1 @@ +../../../../../Source/ASControlNode+Subclasses.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASControlNode.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASControlNode.h new file mode 120000 index 000000000..5292e48ab --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASControlNode.h @@ -0,0 +1 @@ +../../../../../Source/ASControlNode.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASControlTargetAction.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASControlTargetAction.h new file mode 120000 index 000000000..30d4a3dd5 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASControlTargetAction.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASControlTargetAction.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCornerLayoutSpec.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCornerLayoutSpec.h new file mode 120000 index 000000000..4ea4df437 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCornerLayoutSpec.h @@ -0,0 +1 @@ +../../../../../Source/Layout/ASCornerLayoutSpec.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDKNavigationController.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDKNavigationController.h new file mode 120000 index 000000000..2c360efa1 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDKNavigationController.h @@ -0,0 +1 @@ +../../../../../Source/ASDKNavigationController.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDKViewController.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDKViewController.h new file mode 120000 index 000000000..d21a05c28 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDKViewController.h @@ -0,0 +1 @@ +../../../../../Source/ASDKViewController.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDataController.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDataController.h new file mode 120000 index 000000000..376f8e53a --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDataController.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASDataController.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDefaultImageDownloader.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDefaultImageDownloader.h new file mode 120000 index 000000000..daf73f4c2 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDefaultImageDownloader.h @@ -0,0 +1 @@ +../../../../../Source/ASDefaultImageDownloader.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDefaultPlayButton.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDefaultPlayButton.h new file mode 120000 index 000000000..b0feba881 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDefaultPlayButton.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASDefaultPlayButton.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDefaultPlaybackButton.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDefaultPlaybackButton.h new file mode 120000 index 000000000..7f1395650 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDefaultPlaybackButton.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASDefaultPlaybackButton.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDelegateProxy.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDelegateProxy.h new file mode 120000 index 000000000..0a6568cd9 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDelegateProxy.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASDelegateProxy.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDimension.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDimension.h new file mode 120000 index 000000000..220e2da9c --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDimension.h @@ -0,0 +1 @@ +../../../../../Source/Layout/ASDimension.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDimensionInternal.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDimensionInternal.h new file mode 120000 index 000000000..21cf216cf --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDimensionInternal.h @@ -0,0 +1 @@ +../../../../../Source/Layout/ASDimensionInternal.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDispatch.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDispatch.h new file mode 120000 index 000000000..fdb80e1ef --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDispatch.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASDispatch.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+Ancestry.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+Ancestry.h new file mode 120000 index 000000000..09a8a34d7 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+Ancestry.h @@ -0,0 +1 @@ +../../../../../Source/Base/ASDisplayNode+Ancestry.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+Beta.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+Beta.h new file mode 120000 index 000000000..98bb467f9 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+Beta.h @@ -0,0 +1 @@ +../../../../../Source/ASDisplayNode+Beta.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+Convenience.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+Convenience.h new file mode 120000 index 000000000..c7872f988 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+Convenience.h @@ -0,0 +1 @@ +../../../../../Source/ASDisplayNode+Convenience.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+DebugTiming.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+DebugTiming.h new file mode 120000 index 000000000..c8e33b61c --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+DebugTiming.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASDisplayNode+DebugTiming.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+FrameworkPrivate.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+FrameworkPrivate.h new file mode 120000 index 000000000..0019f5bc1 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+FrameworkPrivate.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASDisplayNode+FrameworkPrivate.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+InterfaceState.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+InterfaceState.h new file mode 120000 index 000000000..9a676a0e8 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+InterfaceState.h @@ -0,0 +1 @@ +../../../../../Source/ASDisplayNode+InterfaceState.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+LayoutSpec.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+LayoutSpec.h new file mode 120000 index 000000000..136d145c7 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+LayoutSpec.h @@ -0,0 +1 @@ +../../../../../Source/ASDisplayNode+LayoutSpec.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+Subclasses.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+Subclasses.h new file mode 120000 index 000000000..240d1158a --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+Subclasses.h @@ -0,0 +1 @@ +../../../../../Source/ASDisplayNode+Subclasses.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+Yoga.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+Yoga.h new file mode 120000 index 000000000..eed74fc43 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+Yoga.h @@ -0,0 +1 @@ +../../../../../Source/ASDisplayNode+Yoga.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode.h new file mode 120000 index 000000000..2679f7f90 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode.h @@ -0,0 +1 @@ +../../../../../Source/ASDisplayNode.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNodeCornerLayerDelegate.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNodeCornerLayerDelegate.h new file mode 120000 index 000000000..1d780faec --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNodeCornerLayerDelegate.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASDisplayNodeCornerLayerDelegate.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNodeExtras.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNodeExtras.h new file mode 120000 index 000000000..fda3b24f1 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNodeExtras.h @@ -0,0 +1 @@ +../../../../../Source/ASDisplayNodeExtras.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNodeInternal.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNodeInternal.h new file mode 120000 index 000000000..68a2d4fd5 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNodeInternal.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASDisplayNodeInternal.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNodeLayout.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNodeLayout.h new file mode 120000 index 000000000..5226d8d59 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNodeLayout.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASDisplayNodeLayout.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNodeTipState.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNodeTipState.h new file mode 120000 index 000000000..d85026c5a --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNodeTipState.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASDisplayNodeTipState.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASEditableTextNode.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASEditableTextNode.h new file mode 120000 index 000000000..33649cda0 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASEditableTextNode.h @@ -0,0 +1 @@ +../../../../../Source/ASEditableTextNode.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASElementMap.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASElementMap.h new file mode 120000 index 000000000..f075718a8 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASElementMap.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASElementMap.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASEqualityHelpers.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASEqualityHelpers.h new file mode 120000 index 000000000..f9c4af48d --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASEqualityHelpers.h @@ -0,0 +1 @@ +../../../../../Source/Base/ASEqualityHelpers.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASExperimentalFeatures.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASExperimentalFeatures.h new file mode 120000 index 000000000..977e81a2f --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASExperimentalFeatures.h @@ -0,0 +1 @@ +../../../../../Source/ASExperimentalFeatures.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASGraphicsContext.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASGraphicsContext.h new file mode 120000 index 000000000..4a44accda --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASGraphicsContext.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASGraphicsContext.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASHashing.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASHashing.h new file mode 120000 index 000000000..ce51ff699 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASHashing.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASHashing.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASHighlightOverlayLayer.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASHighlightOverlayLayer.h new file mode 120000 index 000000000..b149957a6 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASHighlightOverlayLayer.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASHighlightOverlayLayer.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASIGListAdapterBasedDataSource.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASIGListAdapterBasedDataSource.h new file mode 120000 index 000000000..debfcb02d --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASIGListAdapterBasedDataSource.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASIGListAdapterBasedDataSource.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageContainerProtocolCategories.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageContainerProtocolCategories.h new file mode 120000 index 000000000..3b6759dcb --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageContainerProtocolCategories.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASImageContainerProtocolCategories.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageNode+AnimatedImagePrivate.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageNode+AnimatedImagePrivate.h new file mode 120000 index 000000000..c94cf43b7 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageNode+AnimatedImagePrivate.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASImageNode+AnimatedImagePrivate.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageNode+CGExtras.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageNode+CGExtras.h new file mode 120000 index 000000000..96a8f6cf1 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageNode+CGExtras.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASImageNode+CGExtras.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageNode+Private.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageNode+Private.h new file mode 120000 index 000000000..bd8939210 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageNode+Private.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASImageNode+Private.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageNode.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageNode.h new file mode 120000 index 000000000..3115fa4a9 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageNode.h @@ -0,0 +1 @@ +../../../../../Source/ASImageNode.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageProtocols.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageProtocols.h new file mode 120000 index 000000000..d1210adcd --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageProtocols.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASImageProtocols.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASInsetLayoutSpec.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASInsetLayoutSpec.h new file mode 120000 index 000000000..f012e81a5 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASInsetLayoutSpec.h @@ -0,0 +1 @@ +../../../../../Source/Layout/ASInsetLayoutSpec.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASIntegerMap.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASIntegerMap.h new file mode 120000 index 000000000..f52f6393d --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASIntegerMap.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASIntegerMap.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASInternalHelpers.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASInternalHelpers.h new file mode 120000 index 000000000..19ddd50f1 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASInternalHelpers.h @@ -0,0 +1 @@ +../../../../../Source/ASInternalHelpers.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayerBackingTipProvider.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayerBackingTipProvider.h new file mode 120000 index 000000000..e84388e82 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayerBackingTipProvider.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASLayerBackingTipProvider.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayout+IGListDiffKit.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayout+IGListDiffKit.h new file mode 120000 index 000000000..7e540d08b --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayout+IGListDiffKit.h @@ -0,0 +1 @@ +../../../../../Source/Layout/ASLayout+IGListDiffKit.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayout.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayout.h new file mode 120000 index 000000000..43c9faa50 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayout.h @@ -0,0 +1 @@ +../../../../../Source/Layout/ASLayout.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutController.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutController.h new file mode 120000 index 000000000..23ec619a6 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutController.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASLayoutController.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutElement.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutElement.h new file mode 120000 index 000000000..2e767f3f9 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutElement.h @@ -0,0 +1 @@ +../../../../../Source/Layout/ASLayoutElement.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutElementExtensibility.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutElementExtensibility.h new file mode 120000 index 000000000..e91992eef --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutElementExtensibility.h @@ -0,0 +1 @@ +../../../../../Source/Layout/ASLayoutElementExtensibility.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutElementPrivate.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutElementPrivate.h new file mode 120000 index 000000000..cfefb044e --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutElementPrivate.h @@ -0,0 +1 @@ +../../../../../Source/Layout/ASLayoutElementPrivate.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutElementStylePrivate.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutElementStylePrivate.h new file mode 120000 index 000000000..00b2ea3e5 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutElementStylePrivate.h @@ -0,0 +1 @@ +../../../../../Source/Private/Layout/ASLayoutElementStylePrivate.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutManager.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutManager.h new file mode 120000 index 000000000..0998e333b --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutManager.h @@ -0,0 +1 @@ +../../../../../Source/TextKit/ASLayoutManager.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutRangeType.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutRangeType.h new file mode 120000 index 000000000..c390f12c4 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutRangeType.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASLayoutRangeType.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutSpec+Subclasses.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutSpec+Subclasses.h new file mode 120000 index 000000000..d25b14f52 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutSpec+Subclasses.h @@ -0,0 +1 @@ +../../../../../Source/Layout/ASLayoutSpec+Subclasses.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutSpec.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutSpec.h new file mode 120000 index 000000000..ffecbf9a6 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutSpec.h @@ -0,0 +1 @@ +../../../../../Source/Layout/ASLayoutSpec.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutSpecPrivate.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutSpecPrivate.h new file mode 120000 index 000000000..1bb06a639 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutSpecPrivate.h @@ -0,0 +1 @@ +../../../../../Source/Private/Layout/ASLayoutSpecPrivate.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutSpecUtilities.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutSpecUtilities.h new file mode 120000 index 000000000..fe2819110 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutSpecUtilities.h @@ -0,0 +1 @@ +../../../../../Source/Private/Layout/ASLayoutSpecUtilities.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutTransition.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutTransition.h new file mode 120000 index 000000000..94dc6d71c --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutTransition.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASLayoutTransition.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLocking.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLocking.h new file mode 120000 index 000000000..d759a9c39 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLocking.h @@ -0,0 +1 @@ +../../../../../Source/ASLocking.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLog.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLog.h new file mode 120000 index 000000000..1a0a2ddc9 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLog.h @@ -0,0 +1 @@ +../../../../../Source/Base/ASLog.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMainSerialQueue.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMainSerialQueue.h new file mode 120000 index 000000000..6f3643fa5 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMainSerialQueue.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASMainSerialQueue.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMainThreadDeallocation.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMainThreadDeallocation.h new file mode 120000 index 000000000..e721c8808 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMainThreadDeallocation.h @@ -0,0 +1 @@ +../../../../../Source/ASMainThreadDeallocation.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMapNode.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMapNode.h new file mode 120000 index 000000000..7d54a6e7a --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMapNode.h @@ -0,0 +1 @@ +../../../../../Source/ASMapNode.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMultiplexImageNode.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMultiplexImageNode.h new file mode 120000 index 000000000..54c19c2d5 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMultiplexImageNode.h @@ -0,0 +1 @@ +../../../../../Source/ASMultiplexImageNode.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMutableAttributedStringBuilder.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMutableAttributedStringBuilder.h new file mode 120000 index 000000000..7685c8d16 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMutableAttributedStringBuilder.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASMutableAttributedStringBuilder.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMutableElementMap.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMutableElementMap.h new file mode 120000 index 000000000..d2d159c80 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMutableElementMap.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASMutableElementMap.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASNetworkImageLoadInfo+Private.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASNetworkImageLoadInfo+Private.h new file mode 120000 index 000000000..c52248204 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASNetworkImageLoadInfo+Private.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASNetworkImageLoadInfo+Private.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASNetworkImageLoadInfo.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASNetworkImageLoadInfo.h new file mode 120000 index 000000000..b04b0a3cd --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASNetworkImageLoadInfo.h @@ -0,0 +1 @@ +../../../../../Source/ASNetworkImageLoadInfo.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASNetworkImageNode.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASNetworkImageNode.h new file mode 120000 index 000000000..d723f0fde --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASNetworkImageNode.h @@ -0,0 +1 @@ +../../../../../Source/ASNetworkImageNode.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASNodeController+Beta.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASNodeController+Beta.h new file mode 120000 index 000000000..e070ff267 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASNodeController+Beta.h @@ -0,0 +1 @@ +../../../../../Source/ASNodeController+Beta.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASObjectDescriptionHelpers.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASObjectDescriptionHelpers.h new file mode 120000 index 000000000..e21e5e923 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASObjectDescriptionHelpers.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASObjectDescriptionHelpers.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASOverlayLayoutSpec.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASOverlayLayoutSpec.h new file mode 120000 index 000000000..389be8dcb --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASOverlayLayoutSpec.h @@ -0,0 +1 @@ +../../../../../Source/Layout/ASOverlayLayoutSpec.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPINRemoteImageDownloader.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPINRemoteImageDownloader.h new file mode 120000 index 000000000..97d1e66ee --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPINRemoteImageDownloader.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASPINRemoteImageDownloader.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPageTable.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPageTable.h new file mode 120000 index 000000000..0847f4f26 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPageTable.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASPageTable.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPagerFlowLayout.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPagerFlowLayout.h new file mode 120000 index 000000000..6fff0a9de --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPagerFlowLayout.h @@ -0,0 +1 @@ +../../../../../Source/ASPagerFlowLayout.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPagerNode+Beta.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPagerNode+Beta.h new file mode 120000 index 000000000..2edd80ea1 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPagerNode+Beta.h @@ -0,0 +1 @@ +../../../../../Source/ASPagerNode+Beta.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPagerNode.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPagerNode.h new file mode 120000 index 000000000..77970027c --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPagerNode.h @@ -0,0 +1 @@ +../../../../../Source/ASPagerNode.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPendingStateController.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPendingStateController.h new file mode 120000 index 000000000..e2f06f1ff --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPendingStateController.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASPendingStateController.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPhotosFrameworkImageRequest.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPhotosFrameworkImageRequest.h new file mode 120000 index 000000000..7eaf66734 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPhotosFrameworkImageRequest.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASPhotosFrameworkImageRequest.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRangeController.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRangeController.h new file mode 120000 index 000000000..427ad66a0 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRangeController.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASRangeController.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRangeControllerUpdateRangeProtocol+Beta.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRangeControllerUpdateRangeProtocol+Beta.h new file mode 120000 index 000000000..26645e10e --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRangeControllerUpdateRangeProtocol+Beta.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASRangeControllerUpdateRangeProtocol+Beta.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRangeManagingNode.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRangeManagingNode.h new file mode 120000 index 000000000..2d376bed2 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRangeManagingNode.h @@ -0,0 +1 @@ +../../../../../Source/ASRangeManagingNode.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRatioLayoutSpec.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRatioLayoutSpec.h new file mode 120000 index 000000000..3ccd5b3ac --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRatioLayoutSpec.h @@ -0,0 +1 @@ +../../../../../Source/Layout/ASRatioLayoutSpec.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRecursiveUnfairLock.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRecursiveUnfairLock.h new file mode 120000 index 000000000..dc1b70b55 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRecursiveUnfairLock.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASRecursiveUnfairLock.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRelativeLayoutSpec.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRelativeLayoutSpec.h new file mode 120000 index 000000000..9b26908a7 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRelativeLayoutSpec.h @@ -0,0 +1 @@ +../../../../../Source/Layout/ASRelativeLayoutSpec.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASResponderChainEnumerator.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASResponderChainEnumerator.h new file mode 120000 index 000000000..05c9d01a3 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASResponderChainEnumerator.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASResponderChainEnumerator.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRunLoopQueue.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRunLoopQueue.h new file mode 120000 index 000000000..012f8e8ba --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRunLoopQueue.h @@ -0,0 +1 @@ +../../../../../Source/ASRunLoopQueue.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASScrollDirection.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASScrollDirection.h new file mode 120000 index 000000000..71d6bbffa --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASScrollDirection.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASScrollDirection.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASScrollNode.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASScrollNode.h new file mode 120000 index 000000000..69a30b2ed --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASScrollNode.h @@ -0,0 +1 @@ +../../../../../Source/ASScrollNode.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASSection.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASSection.h new file mode 120000 index 000000000..3a77e41a5 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASSection.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASSection.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASSectionContext.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASSectionContext.h new file mode 120000 index 000000000..c6efb5a88 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASSectionContext.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASSectionContext.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASSectionController.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASSectionController.h new file mode 120000 index 000000000..0c8da2119 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASSectionController.h @@ -0,0 +1 @@ +../../../../../Source/ASSectionController.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASSignpost.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASSignpost.h new file mode 120000 index 000000000..98cb754ea --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASSignpost.h @@ -0,0 +1 @@ +../../../../../Source/Base/ASSignpost.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackLayoutDefines.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackLayoutDefines.h new file mode 120000 index 000000000..6ba0d22e4 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackLayoutDefines.h @@ -0,0 +1 @@ +../../../../../Source/Layout/ASStackLayoutDefines.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackLayoutElement.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackLayoutElement.h new file mode 120000 index 000000000..a1df09649 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackLayoutElement.h @@ -0,0 +1 @@ +../../../../../Source/Layout/ASStackLayoutElement.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackLayoutSpec.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackLayoutSpec.h new file mode 120000 index 000000000..ed511f814 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackLayoutSpec.h @@ -0,0 +1 @@ +../../../../../Source/Layout/ASStackLayoutSpec.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackLayoutSpecUtilities.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackLayoutSpecUtilities.h new file mode 120000 index 000000000..e095998f9 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackLayoutSpecUtilities.h @@ -0,0 +1 @@ +../../../../../Source/Private/Layout/ASStackLayoutSpecUtilities.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackPositionedLayout.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackPositionedLayout.h new file mode 120000 index 000000000..7e0b7b108 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackPositionedLayout.h @@ -0,0 +1 @@ +../../../../../Source/Private/Layout/ASStackPositionedLayout.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackUnpositionedLayout.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackUnpositionedLayout.h new file mode 120000 index 000000000..f35a04752 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackUnpositionedLayout.h @@ -0,0 +1 @@ +../../../../../Source/Private/Layout/ASStackUnpositionedLayout.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASSupplementaryNodeSource.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASSupplementaryNodeSource.h new file mode 120000 index 000000000..8c7b81f1f --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASSupplementaryNodeSource.h @@ -0,0 +1 @@ +../../../../../Source/ASSupplementaryNodeSource.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTabBarController.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTabBarController.h new file mode 120000 index 000000000..00bdbdd08 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTabBarController.h @@ -0,0 +1 @@ +../../../../../Source/ASTabBarController.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableLayoutController.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableLayoutController.h new file mode 120000 index 000000000..24504eea5 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableLayoutController.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASTableLayoutController.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableNode+Beta.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableNode+Beta.h new file mode 120000 index 000000000..5a4a8906b --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableNode+Beta.h @@ -0,0 +1 @@ +../../../../../Source/ASTableNode+Beta.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableNode.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableNode.h new file mode 120000 index 000000000..71e455bdd --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableNode.h @@ -0,0 +1 @@ +../../../../../Source/ASTableNode.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableView+Undeprecated.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableView+Undeprecated.h new file mode 120000 index 000000000..69be1885c --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableView+Undeprecated.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASTableView+Undeprecated.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableView.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableView.h new file mode 120000 index 000000000..8d580a6cb --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableView.h @@ -0,0 +1 @@ +../../../../../Source/ASTableView.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableViewInternal.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableViewInternal.h new file mode 120000 index 000000000..4f37966de --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableViewInternal.h @@ -0,0 +1 @@ +../../../../../Source/ASTableViewInternal.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableViewProtocols.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableViewProtocols.h new file mode 120000 index 000000000..822221a8d --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableViewProtocols.h @@ -0,0 +1 @@ +../../../../../Source/ASTableViewProtocols.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextAttribute.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextAttribute.h new file mode 120000 index 000000000..9b2479b03 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextAttribute.h @@ -0,0 +1 @@ +../../../../../Source/TextExperiment/String/ASTextAttribute.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextDebugOption.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextDebugOption.h new file mode 120000 index 000000000..6aab2e786 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextDebugOption.h @@ -0,0 +1 @@ +../../../../../Source/TextExperiment/Component/ASTextDebugOption.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextInput.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextInput.h new file mode 120000 index 000000000..2b034177d --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextInput.h @@ -0,0 +1 @@ +../../../../../Source/TextExperiment/Component/ASTextInput.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitAttributes.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitAttributes.h new file mode 120000 index 000000000..10af33c98 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitAttributes.h @@ -0,0 +1 @@ +../../../../../Source/TextKit/ASTextKitAttributes.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitComponents.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitComponents.h new file mode 120000 index 000000000..21ed68960 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitComponents.h @@ -0,0 +1 @@ +../../../../../Source/TextKit/ASTextKitComponents.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitContext.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitContext.h new file mode 120000 index 000000000..fa7356bd0 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitContext.h @@ -0,0 +1 @@ +../../../../../Source/TextKit/ASTextKitContext.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitCoreTextAdditions.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitCoreTextAdditions.h new file mode 120000 index 000000000..9e6ab70a1 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitCoreTextAdditions.h @@ -0,0 +1 @@ +../../../../../Source/TextKit/ASTextKitCoreTextAdditions.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitEntityAttribute.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitEntityAttribute.h new file mode 120000 index 000000000..9d3758f78 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitEntityAttribute.h @@ -0,0 +1 @@ +../../../../../Source/TextKit/ASTextKitEntityAttribute.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitFontSizeAdjuster.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitFontSizeAdjuster.h new file mode 120000 index 000000000..b81ce911c --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitFontSizeAdjuster.h @@ -0,0 +1 @@ +../../../../../Source/TextKit/ASTextKitFontSizeAdjuster.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitRenderer+Positioning.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitRenderer+Positioning.h new file mode 120000 index 000000000..268b6f53c --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitRenderer+Positioning.h @@ -0,0 +1 @@ +../../../../../Source/TextKit/ASTextKitRenderer+Positioning.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitRenderer+TextChecking.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitRenderer+TextChecking.h new file mode 120000 index 000000000..beaf40dfc --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitRenderer+TextChecking.h @@ -0,0 +1 @@ +../../../../../Source/TextKit/ASTextKitRenderer+TextChecking.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitRenderer.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitRenderer.h new file mode 120000 index 000000000..1882302c1 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitRenderer.h @@ -0,0 +1 @@ +../../../../../Source/TextKit/ASTextKitRenderer.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitShadower.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitShadower.h new file mode 120000 index 000000000..eee4bcfdd --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitShadower.h @@ -0,0 +1 @@ +../../../../../Source/TextKit/ASTextKitShadower.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitTailTruncater.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitTailTruncater.h new file mode 120000 index 000000000..1bfd693e1 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitTailTruncater.h @@ -0,0 +1 @@ +../../../../../Source/TextKit/ASTextKitTailTruncater.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitTruncating.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitTruncating.h new file mode 120000 index 000000000..68291cad1 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitTruncating.h @@ -0,0 +1 @@ +../../../../../Source/TextKit/ASTextKitTruncating.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextLayout.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextLayout.h new file mode 120000 index 000000000..ad28af7e8 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextLayout.h @@ -0,0 +1 @@ +../../../../../Source/TextExperiment/Component/ASTextLayout.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextLine.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextLine.h new file mode 120000 index 000000000..7ce434963 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextLine.h @@ -0,0 +1 @@ +../../../../../Source/TextExperiment/Component/ASTextLine.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNode+Beta.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNode+Beta.h new file mode 120000 index 000000000..8330164c5 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNode+Beta.h @@ -0,0 +1 @@ +../../../../../Source/ASTextNode+Beta.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNode.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNode.h new file mode 120000 index 000000000..568f3f1f6 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNode.h @@ -0,0 +1 @@ +../../../../../Source/ASTextNode.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNode2.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNode2.h new file mode 120000 index 000000000..d166fc203 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNode2.h @@ -0,0 +1 @@ +../../../../../Source/ASTextNode2.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNodeCommon.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNodeCommon.h new file mode 120000 index 000000000..38eac1553 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNodeCommon.h @@ -0,0 +1 @@ +../../../../../Source/ASTextNodeCommon.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNodeTypes.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNodeTypes.h new file mode 120000 index 000000000..b0b6d3817 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNodeTypes.h @@ -0,0 +1 @@ +../../../../../Source/TextKit/ASTextNodeTypes.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNodeWordKerner.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNodeWordKerner.h new file mode 120000 index 000000000..498d10dbe --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNodeWordKerner.h @@ -0,0 +1 @@ +../../../../../Source/TextKit/ASTextNodeWordKerner.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextRunDelegate.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextRunDelegate.h new file mode 120000 index 000000000..0087e9319 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextRunDelegate.h @@ -0,0 +1 @@ +../../../../../Source/TextExperiment/String/ASTextRunDelegate.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextUtilities.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextUtilities.h new file mode 120000 index 000000000..3e04900cd --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextUtilities.h @@ -0,0 +1 @@ +../../../../../Source/TextExperiment/Utility/ASTextUtilities.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASThread.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASThread.h new file mode 120000 index 000000000..8a4eaad79 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASThread.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASThread.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTip.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTip.h new file mode 120000 index 000000000..15fbbefc4 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTip.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASTip.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTipNode.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTipNode.h new file mode 120000 index 000000000..c0cca5845 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTipNode.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASTipNode.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTipProvider.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTipProvider.h new file mode 120000 index 000000000..1681b4e74 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTipProvider.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASTipProvider.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTipsController.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTipsController.h new file mode 120000 index 000000000..fb18a3615 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTipsController.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASTipsController.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTipsWindow.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTipsWindow.h new file mode 120000 index 000000000..9cfa3cd87 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTipsWindow.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASTipsWindow.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTraitCollection.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTraitCollection.h new file mode 120000 index 000000000..acf9dfa04 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTraitCollection.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASTraitCollection.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTwoDimensionalArrayUtils.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTwoDimensionalArrayUtils.h new file mode 120000 index 000000000..80c9b099a --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTwoDimensionalArrayUtils.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASTwoDimensionalArrayUtils.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASVideoNode.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASVideoNode.h new file mode 120000 index 000000000..7f4d9e9bf --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASVideoNode.h @@ -0,0 +1 @@ +../../../../../Source/ASVideoNode.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASVideoPlayerNode.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASVideoPlayerNode.h new file mode 120000 index 000000000..4d152ac72 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASVideoPlayerNode.h @@ -0,0 +1 @@ +../../../../../Source/ASVideoPlayerNode.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASVisibilityProtocols.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASVisibilityProtocols.h new file mode 120000 index 000000000..dc073e316 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASVisibilityProtocols.h @@ -0,0 +1 @@ +../../../../../Source/ASVisibilityProtocols.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASWeakMap.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASWeakMap.h new file mode 120000 index 000000000..15d03e0eb --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASWeakMap.h @@ -0,0 +1 @@ +../../../../../Source/Private/ASWeakMap.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASWeakProxy.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASWeakProxy.h new file mode 120000 index 000000000..694598e60 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASWeakProxy.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASWeakProxy.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASWeakSet.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASWeakSet.h new file mode 120000 index 000000000..916f6d84a --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASWeakSet.h @@ -0,0 +1 @@ +../../../../../Source/Details/ASWeakSet.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASYogaUtilities.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASYogaUtilities.h new file mode 120000 index 000000000..b31989768 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASYogaUtilities.h @@ -0,0 +1 @@ +../../../../../Source/Layout/ASYogaUtilities.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/AsyncDisplayKit+Debug.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/AsyncDisplayKit+Debug.h new file mode 120000 index 000000000..409637fbf --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/AsyncDisplayKit+Debug.h @@ -0,0 +1 @@ +../../../../../Source/Debug/AsyncDisplayKit+Debug.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/AsyncDisplayKit+IGListKitMethods.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/AsyncDisplayKit+IGListKitMethods.h new file mode 120000 index 000000000..41a0d14cf --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/AsyncDisplayKit+IGListKitMethods.h @@ -0,0 +1 @@ +../../../../../Source/AsyncDisplayKit+IGListKitMethods.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/AsyncDisplayKit+Tips.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/AsyncDisplayKit+Tips.h new file mode 120000 index 000000000..c284c60fe --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/AsyncDisplayKit+Tips.h @@ -0,0 +1 @@ +../../../../../Source/Debug/AsyncDisplayKit+Tips.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/AsyncDisplayKit.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/AsyncDisplayKit.h new file mode 120000 index 000000000..75dc41cef --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/AsyncDisplayKit.h @@ -0,0 +1 @@ +../../../../../Source/AsyncDisplayKit.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/CoreGraphics+ASConvenience.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/CoreGraphics+ASConvenience.h new file mode 120000 index 000000000..68aae2c54 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/CoreGraphics+ASConvenience.h @@ -0,0 +1 @@ +../../../../../Source/Details/CoreGraphics+ASConvenience.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/IGListAdapter+AsyncDisplayKit.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/IGListAdapter+AsyncDisplayKit.h new file mode 120000 index 000000000..6399fd3f9 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/IGListAdapter+AsyncDisplayKit.h @@ -0,0 +1 @@ +../../../../../Source/IGListAdapter+AsyncDisplayKit.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/NSArray+Diffing.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/NSArray+Diffing.h new file mode 120000 index 000000000..39b68cfaa --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/NSArray+Diffing.h @@ -0,0 +1 @@ +../../../../../Source/Details/NSArray+Diffing.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/NSAttributedString+ASText.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/NSAttributedString+ASText.h new file mode 120000 index 000000000..d73c8d839 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/NSAttributedString+ASText.h @@ -0,0 +1 @@ +../../../../../Source/TextExperiment/Utility/NSAttributedString+ASText.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/NSIndexSet+ASHelpers.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/NSIndexSet+ASHelpers.h new file mode 120000 index 000000000..bf15c690c --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/NSIndexSet+ASHelpers.h @@ -0,0 +1 @@ +../../../../../Source/Details/NSIndexSet+ASHelpers.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/NSMutableAttributedString+TextKitAdditions.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/NSMutableAttributedString+TextKitAdditions.h new file mode 120000 index 000000000..94de515be --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/NSMutableAttributedString+TextKitAdditions.h @@ -0,0 +1 @@ +../../../../../Source/Details/NSMutableAttributedString+TextKitAdditions.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/NSParagraphStyle+ASText.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/NSParagraphStyle+ASText.h new file mode 120000 index 000000000..f92f1942f --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/NSParagraphStyle+ASText.h @@ -0,0 +1 @@ +../../../../../Source/TextExperiment/Utility/NSParagraphStyle+ASText.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/UICollectionViewLayout+ASConvenience.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/UICollectionViewLayout+ASConvenience.h new file mode 120000 index 000000000..a78d10246 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/UICollectionViewLayout+ASConvenience.h @@ -0,0 +1 @@ +../../../../../Source/Details/UICollectionViewLayout+ASConvenience.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/UIImage+ASConvenience.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/UIImage+ASConvenience.h new file mode 120000 index 000000000..d7902b08a --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/UIImage+ASConvenience.h @@ -0,0 +1 @@ +../../../../../Source/UIImage+ASConvenience.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/UIResponder+AsyncDisplayKit.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/UIResponder+AsyncDisplayKit.h new file mode 120000 index 000000000..80739f77d --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/UIResponder+AsyncDisplayKit.h @@ -0,0 +1 @@ +../../../../../Source/UIResponder+AsyncDisplayKit.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/UIView+ASConvenience.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/UIView+ASConvenience.h new file mode 120000 index 000000000..248d4f7f9 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/UIView+ASConvenience.h @@ -0,0 +1 @@ +../../../../../Source/Details/UIView+ASConvenience.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASAsyncTransaction.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASAsyncTransaction.h new file mode 120000 index 000000000..b40edefff --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASAsyncTransaction.h @@ -0,0 +1 @@ +../../../../../Source/Details/Transactions/_ASAsyncTransaction.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASAsyncTransactionContainer+Private.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASAsyncTransactionContainer+Private.h new file mode 120000 index 000000000..da63597e9 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASAsyncTransactionContainer+Private.h @@ -0,0 +1 @@ +../../../../../Source/Details/Transactions/_ASAsyncTransactionContainer+Private.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASAsyncTransactionContainer.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASAsyncTransactionContainer.h new file mode 120000 index 000000000..6ea4fdbf8 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASAsyncTransactionContainer.h @@ -0,0 +1 @@ +../../../../../Source/Details/Transactions/_ASAsyncTransactionContainer.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASAsyncTransactionGroup.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASAsyncTransactionGroup.h new file mode 120000 index 000000000..4bc056f7c --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASAsyncTransactionGroup.h @@ -0,0 +1 @@ +../../../../../Source/Details/Transactions/_ASAsyncTransactionGroup.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASCollectionGalleryLayoutInfo.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASCollectionGalleryLayoutInfo.h new file mode 120000 index 000000000..cc2419acc --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASCollectionGalleryLayoutInfo.h @@ -0,0 +1 @@ +../../../../../Source/Private/_ASCollectionGalleryLayoutInfo.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASCollectionGalleryLayoutItem.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASCollectionGalleryLayoutItem.h new file mode 120000 index 000000000..8fe6459c1 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASCollectionGalleryLayoutItem.h @@ -0,0 +1 @@ +../../../../../Source/Private/_ASCollectionGalleryLayoutItem.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASCollectionReusableView.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASCollectionReusableView.h new file mode 120000 index 000000000..19d8885c5 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASCollectionReusableView.h @@ -0,0 +1 @@ +../../../../../Source/Details/_ASCollectionReusableView.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASCollectionViewCell.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASCollectionViewCell.h new file mode 120000 index 000000000..ed8189940 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASCollectionViewCell.h @@ -0,0 +1 @@ +../../../../../Source/Details/_ASCollectionViewCell.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASCoreAnimationExtras.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASCoreAnimationExtras.h new file mode 120000 index 000000000..df50507a0 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASCoreAnimationExtras.h @@ -0,0 +1 @@ +../../../../../Source/Private/_ASCoreAnimationExtras.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASDisplayLayer.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASDisplayLayer.h new file mode 120000 index 000000000..c254302b3 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASDisplayLayer.h @@ -0,0 +1 @@ +../../../../../Source/Details/_ASDisplayLayer.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASDisplayView.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASDisplayView.h new file mode 120000 index 000000000..882beb5c0 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASDisplayView.h @@ -0,0 +1 @@ +../../../../../Source/Details/_ASDisplayView.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASDisplayViewAccessiblity.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASDisplayViewAccessiblity.h new file mode 120000 index 000000000..29bef1b2c --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASDisplayViewAccessiblity.h @@ -0,0 +1 @@ +../../../../../Source/Details/_ASDisplayViewAccessiblity.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASHierarchyChangeSet.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASHierarchyChangeSet.h new file mode 120000 index 000000000..4bfb4608e --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASHierarchyChangeSet.h @@ -0,0 +1 @@ +../../../../../Source/Private/_ASHierarchyChangeSet.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASPendingState.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASPendingState.h new file mode 120000 index 000000000..95e12668f --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASPendingState.h @@ -0,0 +1 @@ +../../../../../Source/Private/_ASPendingState.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASScopeTimer.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASScopeTimer.h new file mode 120000 index 000000000..9c9c9f311 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASScopeTimer.h @@ -0,0 +1 @@ +../../../../../Source/Private/_ASScopeTimer.h \ No newline at end of file diff --git a/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASTransitionContext.h b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASTransitionContext.h new file mode 120000 index 000000000..09953818b --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASTransitionContext.h @@ -0,0 +1 @@ +../../../../../Source/_ASTransitionContext.h \ No newline at end of file