From bb53ebd971563efab5eb02005e4d6d6332eb7bda Mon Sep 17 00:00:00 2001 From: Petro Rovenskyi Date: Fri, 17 Oct 2025 10:18:58 +0300 Subject: [PATCH 01/10] Update CI workflow for Xcode 26 and actions checkout version - Updated DEVELOPER_DIR to Xcode_26.0.1 in all CI workflows - Updated build.sh SDK from iphonesimulator17.4 to iphonesimulator26.0 - Updated simulator device from iPhone SE (3rd generation) to iPhone 17 - Updated actions/checkout from v2 to v4 - Changed runs-on from macos-latest to macos-15 for explicit versioning - Verified all build configurations (framework, carthage, tests, examples) --- .github/workflows/ci-master-only.yml | 8 ++++---- .github/workflows/ci-pull-requests-only.yml | 6 +++--- .github/workflows/ci.yml | 6 +++--- build.sh | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) 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..75081c03a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,7 +5,7 @@ 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] @@ -27,9 +27,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/build.sh b/build.sh index 37e34a523..6966c15cb 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. From 5dd0bb3b6499eff61704c54c59d46d662eaf7464 Mon Sep 17 00:00:00 2001 From: Petro Rovenskyi Date: Sat, 18 Oct 2025 20:22:19 +0300 Subject: [PATCH 02/10] Add Swift Package Manager support with IGListKit integration Add comprehensive SPM support using Swift 6.2 package traits for modular features. Core features: - Package.swift with AsyncDisplayKit and TextureIGListKitExtensions products - Default traits (Video, MapKit, Photos, AssetsLibrary) match CocoaPods defaults - Optional IGListKit trait with pure Swift implementation - TextNode2 (modern TextNode) enabled by default - PINRemoteImage always included IGListKit integration: - Pure Swift implementation (traits don't work with Objective-C #if directives) - ListAdapter.setCollectionNode(_:) replaces Objective-C setASDKCollectionNode: - Uses IGListKit 5.0+ (breaking changes from 4.x in CocoaPods/Carthage) - Runtime protocol conformance for ASCollectionDataSourceInterop Infrastructure: - SPM source layout generation script (scripts/generate_spm_sources_layout.swift) - Symlinks from Source/ to spm/Sources/AsyncDisplayKit/ - Build script modes: spm-texture-basic and spm-texture-iglistkit - CI jobs for both configurations with layout validation Testing: - SPMBasic example: 15 tests for core AsyncDisplayKit + PINRemoteImage - SPMWithIGListKit example: 4 tests for IGListKit integration - All tests passing Documentation: - README with usage examples and CocoaPods migration table - CONTRIBUTING with SPM layout regeneration instructions - Comprehensive TextureIGListKitExtensions guide Reference implementations: Source/IGListAdapter+AsyncDisplayKit.mm, Source/Private/ASIGListAdapterBasedDataSource.mm --- .github/workflows/ci.yml | 8 +- .gitignore | 5 + CONTRIBUTING.md | 14 + Package.swift | 145 ++++++++ README.md | 108 +++++- .../Private/ASIGListAdapterBasedDataSource.h | 4 +- .../IGListAdapter+Texture.swift | 311 +++++++++++++++++ Sources/TextureIGListKitExtensions/README.md | 312 ++++++++++++++++++ build.sh | 65 ++++ examples/SPMBasic/Package.swift | 33 ++ examples/SPMBasic/README.md | 37 +++ examples/SPMBasic/Sources/Example.swift | 32 ++ .../SPMBasic/Tests/DefaultTraitsTests.swift | 166 ++++++++++ examples/SPMWithIGListKit/Package.swift | 40 +++ examples/SPMWithIGListKit/README.md | 89 +++++ .../Sources/IGListKitTraitTest.swift | 39 +++ .../Tests/IGListKitTraitTests.swift | 81 +++++ scripts/generate_spm_sources_layout.swift | 292 ++++++++++++++++ spm/.gitkeep | 0 spm/README.md | 37 +++ .../AsyncDisplayKit/ASAbsoluteLayoutSpec.mm | 1 + .../ASAbstractLayoutController.mm | 1 + .../AsyncDisplayKit/ASAsciiArtBoxCreator.mm | 1 + spm/Sources/AsyncDisplayKit/ASAssert.mm | 1 + .../AsyncDisplayKit/ASBackgroundLayoutSpec.mm | 1 + .../AsyncDisplayKit/ASBasicImageDownloader.mm | 1 + spm/Sources/AsyncDisplayKit/ASBatchContext.mm | 1 + .../AsyncDisplayKit/ASBatchFetching.mm | 1 + .../AsyncDisplayKit/ASButtonNode+Yoga.mm | 1 + spm/Sources/AsyncDisplayKit/ASButtonNode.mm | 1 + spm/Sources/AsyncDisplayKit/ASCellNode.mm | 1 + .../AsyncDisplayKit/ASCenterLayoutSpec.mm | 1 + .../AsyncDisplayKit/ASCollectionElement.mm | 1 + .../ASCollectionFlowLayoutDelegate.mm | 1 + .../ASCollectionGalleryLayoutDelegate.mm | 1 + .../AsyncDisplayKit/ASCollectionLayout.mm | 1 + .../ASCollectionLayoutCache.mm | 1 + .../ASCollectionLayoutContext.mm | 1 + .../ASCollectionLayoutDefines.mm | 1 + .../ASCollectionLayoutState.mm | 1 + .../AsyncDisplayKit/ASCollectionNode.mm | 1 + .../AsyncDisplayKit/ASCollectionView.mm | 1 + .../ASCollectionViewFlowLayoutInspector.mm | 1 + .../ASCollectionViewLayoutController.mm | 1 + .../ASCollectionViewLayoutInspector.mm | 1 + spm/Sources/AsyncDisplayKit/ASCollections.mm | 1 + .../AsyncDisplayKit/ASConfiguration.mm | 1 + .../ASConfigurationInternal.mm | 1 + .../AsyncDisplayKit/ASControlNode+tvOS.mm | 1 + spm/Sources/AsyncDisplayKit/ASControlNode.mm | 1 + .../AsyncDisplayKit/ASControlTargetAction.mm | 1 + .../AsyncDisplayKit/ASCornerLayoutSpec.mm | 1 + .../ASDKNavigationController.mm | 1 + .../AsyncDisplayKit/ASDKViewController.mm | 1 + .../AsyncDisplayKit/ASDataController.mm | 1 + .../AsyncDisplayKit/ASDefaultPlayButton.mm | 1 + .../ASDefaultPlaybackButton.mm | 1 + .../AsyncDisplayKit/ASDelegateProxy.mm | 1 + spm/Sources/AsyncDisplayKit/ASDimension.mm | 1 + .../AsyncDisplayKit/ASDimensionInternal.mm | 1 + spm/Sources/AsyncDisplayKit/ASDispatch.mm | 1 + .../AsyncDisplayKit/ASDisplayNode+Ancestry.mm | 1 + .../ASDisplayNode+AsyncDisplay.mm | 1 + .../ASDisplayNode+Convenience.mm | 1 + .../ASDisplayNode+DebugTiming.mm | 1 + .../AsyncDisplayKit/ASDisplayNode+Layout.mm | 1 + .../ASDisplayNode+LayoutSpec.mm | 1 + .../ASDisplayNode+UIViewBridge.mm | 1 + .../AsyncDisplayKit/ASDisplayNode+Yoga.mm | 1 + spm/Sources/AsyncDisplayKit/ASDisplayNode.mm | 1 + .../ASDisplayNodeCornerLayerDelegate.mm | 1 + .../AsyncDisplayKit/ASDisplayNodeExtras.mm | 1 + .../AsyncDisplayKit/ASDisplayNodeTipState.mm | 1 + .../AsyncDisplayKit/ASEditableTextNode.mm | 1 + spm/Sources/AsyncDisplayKit/ASElementMap.mm | 1 + .../AsyncDisplayKit/ASExperimentalFeatures.mm | 1 + .../AsyncDisplayKit/ASGraphicsContext.mm | 1 + spm/Sources/AsyncDisplayKit/ASHashing.mm | 1 + .../ASHighlightOverlayLayer.mm | 1 + .../ASIGListAdapterBasedDataSource.mm | 1 + .../ASImageContainerProtocolCategories.mm | 1 + .../ASImageNode+AnimatedImage.mm | 1 + .../AsyncDisplayKit/ASImageNode+CGExtras.mm | 1 + .../AsyncDisplayKit/ASImageNode+tvOS.mm | 1 + spm/Sources/AsyncDisplayKit/ASImageNode.mm | 1 + .../AsyncDisplayKit/ASInsetLayoutSpec.mm | 1 + spm/Sources/AsyncDisplayKit/ASIntegerMap.mm | 1 + .../AsyncDisplayKit/ASInternalHelpers.mm | 1 + .../ASLayerBackingTipProvider.mm | 1 + .../AsyncDisplayKit/ASLayout+IGListDiffKit.mm | 1 + spm/Sources/AsyncDisplayKit/ASLayout.mm | 1 + .../AsyncDisplayKit/ASLayoutElement.mm | 1 + .../AsyncDisplayKit/ASLayoutManager.mm | 1 + .../ASLayoutSpec+Subclasses.mm | 1 + spm/Sources/AsyncDisplayKit/ASLayoutSpec.mm | 1 + .../AsyncDisplayKit/ASLayoutTransition.mm | 1 + spm/Sources/AsyncDisplayKit/ASLog.mm | 1 + .../AsyncDisplayKit/ASMainSerialQueue.mm | 1 + .../ASMainThreadDeallocation.mm | 1 + spm/Sources/AsyncDisplayKit/ASMapNode.mm | 1 + .../AsyncDisplayKit/ASMultiplexImageNode.mm | 1 + .../ASMutableAttributedStringBuilder.mm | 1 + .../AsyncDisplayKit/ASMutableElementMap.mm | 1 + .../AsyncDisplayKit/ASNetworkImageLoadInfo.mm | 1 + .../AsyncDisplayKit/ASNetworkImageNode.mm | 1 + .../AsyncDisplayKit/ASNodeController+Beta.mm | 1 + .../ASObjectDescriptionHelpers.mm | 1 + .../AsyncDisplayKit/ASOverlayLayoutSpec.mm | 1 + .../ASPINRemoteImageDownloader.mm | 1 + spm/Sources/AsyncDisplayKit/ASPageTable.mm | 1 + .../AsyncDisplayKit/ASPagerFlowLayout.mm | 1 + spm/Sources/AsyncDisplayKit/ASPagerNode.mm | 1 + .../ASPendingStateController.mm | 1 + .../ASPhotosFrameworkImageRequest.mm | 1 + .../AsyncDisplayKit/ASRangeController.mm | 1 + .../AsyncDisplayKit/ASRatioLayoutSpec.mm | 1 + .../AsyncDisplayKit/ASRecursiveUnfairLock.mm | 1 + .../AsyncDisplayKit/ASRelativeLayoutSpec.mm | 1 + .../ASResponderChainEnumerator.mm | 1 + spm/Sources/AsyncDisplayKit/ASRunLoopQueue.mm | 1 + .../AsyncDisplayKit/ASScrollDirection.mm | 1 + spm/Sources/AsyncDisplayKit/ASScrollNode.mm | 1 + spm/Sources/AsyncDisplayKit/ASSection.mm | 1 + .../AsyncDisplayKit/ASStackLayoutSpec.mm | 1 + .../ASStackPositionedLayout.mm | 1 + .../ASStackUnpositionedLayout.mm | 1 + .../AsyncDisplayKit/ASTabBarController.mm | 1 + .../ASTableLayoutController.mm | 1 + spm/Sources/AsyncDisplayKit/ASTableNode.mm | 1 + spm/Sources/AsyncDisplayKit/ASTableView.mm | 1 + .../AsyncDisplayKit/ASTextAttribute.mm | 1 + .../AsyncDisplayKit/ASTextDebugOption.mm | 1 + spm/Sources/AsyncDisplayKit/ASTextInput.mm | 1 + .../AsyncDisplayKit/ASTextKitAttributes.mm | 1 + .../AsyncDisplayKit/ASTextKitComponents.mm | 1 + .../AsyncDisplayKit/ASTextKitContext.mm | 1 + .../ASTextKitCoreTextAdditions.mm | 1 + .../ASTextKitEntityAttribute.mm | 1 + .../ASTextKitFontSizeAdjuster.mm | 1 + .../ASTextKitRenderer+Positioning.mm | 1 + .../ASTextKitRenderer+TextChecking.mm | 1 + .../AsyncDisplayKit/ASTextKitRenderer.mm | 1 + .../AsyncDisplayKit/ASTextKitShadower.mm | 1 + .../AsyncDisplayKit/ASTextKitTailTruncater.mm | 1 + spm/Sources/AsyncDisplayKit/ASTextLayout.mm | 1 + spm/Sources/AsyncDisplayKit/ASTextLine.mm | 1 + spm/Sources/AsyncDisplayKit/ASTextNode.mm | 1 + spm/Sources/AsyncDisplayKit/ASTextNode2.mm | 1 + .../AsyncDisplayKit/ASTextNodeWordKerner.mm | 1 + .../AsyncDisplayKit/ASTextRunDelegate.mm | 1 + .../AsyncDisplayKit/ASTextUtilities.mm | 1 + spm/Sources/AsyncDisplayKit/ASTip.mm | 1 + spm/Sources/AsyncDisplayKit/ASTipNode.mm | 1 + spm/Sources/AsyncDisplayKit/ASTipProvider.mm | 1 + .../AsyncDisplayKit/ASTipsController.mm | 1 + spm/Sources/AsyncDisplayKit/ASTipsWindow.mm | 1 + .../AsyncDisplayKit/ASTraitCollection.mm | 1 + .../ASTwoDimensionalArrayUtils.mm | 1 + spm/Sources/AsyncDisplayKit/ASVideoNode.mm | 1 + .../AsyncDisplayKit/ASVideoPlayerNode.mm | 1 + .../AsyncDisplayKit/ASVisibilityProtocols.mm | 1 + spm/Sources/AsyncDisplayKit/ASWeakMap.mm | 1 + spm/Sources/AsyncDisplayKit/ASWeakProxy.mm | 1 + spm/Sources/AsyncDisplayKit/ASWeakSet.mm | 1 + .../AsyncDisplayKit/ASYogaUtilities.mm | 1 + .../AsyncDisplayKit/AsyncDisplayKit+Debug.mm | 1 + .../AsyncDisplayKit+IGListKitMethods.mm | 1 + .../AsyncDisplayKit/AsyncDisplayKit+Tips.mm | 1 + .../IGListAdapter+AsyncDisplayKit.mm | 1 + .../AsyncDisplayKit/NSArray+Diffing.mm | 1 + .../NSAttributedString+ASText.mm | 1 + .../AsyncDisplayKit/NSIndexSet+ASHelpers.mm | 1 + ...utableAttributedString+TextKitAdditions.mm | 1 + .../NSParagraphStyle+ASText.mm | 1 + .../UICollectionViewLayout+ASConvenience.mm | 1 + .../AsyncDisplayKit/UIImage+ASConvenience.mm | 1 + .../UIResponder+AsyncDisplayKit.mm | 1 + .../AsyncDisplayKit/_ASAsyncTransaction.mm | 1 + .../_ASAsyncTransactionContainer.mm | 1 + .../_ASAsyncTransactionGroup.mm | 1 + .../_ASCollectionGalleryLayoutInfo.mm | 1 + .../_ASCollectionGalleryLayoutItem.mm | 1 + .../_ASCollectionReusableView.mm | 1 + .../AsyncDisplayKit/_ASCollectionViewCell.mm | 1 + .../AsyncDisplayKit/_ASCoreAnimationExtras.mm | 1 + .../AsyncDisplayKit/_ASDisplayLayer.mm | 1 + spm/Sources/AsyncDisplayKit/_ASDisplayView.mm | 1 + .../_ASDisplayViewAccessiblity.mm | 1 + .../AsyncDisplayKit/_ASHierarchyChangeSet.mm | 1 + .../AsyncDisplayKit/_ASPendingState.mm | 1 + .../AsyncDisplayKit/_ASTransitionContext.mm | 1 + .../AsyncDisplayKit/ASAbsoluteLayoutElement.h | 1 + .../AsyncDisplayKit/ASAbsoluteLayoutSpec.h | 1 + ...bstractLayoutController+FrameworkPrivate.h | 1 + .../ASAbstractLayoutController.h | 1 + .../AsyncDisplayKit/ASAsciiArtBoxCreator.h | 1 + .../include/AsyncDisplayKit/ASAssert.h | 1 + .../include/AsyncDisplayKit/ASAvailability.h | 1 + .../AsyncDisplayKit/ASBackgroundLayoutSpec.h | 1 + .../include/AsyncDisplayKit/ASBaseDefines.h | 1 + .../AsyncDisplayKit/ASBasicImageDownloader.h | 1 + .../ASBasicImageDownloaderInternal.h | 1 + .../include/AsyncDisplayKit/ASBatchContext.h | 1 + .../include/AsyncDisplayKit/ASBatchFetching.h | 1 + .../AsyncDisplayKit/ASBatchFetchingDelegate.h | 1 + .../include/AsyncDisplayKit/ASBlockTypes.h | 1 + .../AsyncDisplayKit/ASButtonNode+Private.h | 1 + .../AsyncDisplayKit/ASButtonNode+Yoga.h | 1 + .../include/AsyncDisplayKit/ASButtonNode.h | 1 + .../AsyncDisplayKit/ASCellNode+Internal.h | 1 + .../include/AsyncDisplayKit/ASCellNode.h | 1 + .../AsyncDisplayKit/ASCenterLayoutSpec.h | 1 + .../AsyncDisplayKit/ASCollectionElement.h | 1 + .../ASCollectionFlowLayoutDelegate.h | 1 + .../ASCollectionGalleryLayoutDelegate.h | 1 + .../AsyncDisplayKit/ASCollectionInternal.h | 1 + .../AsyncDisplayKit/ASCollectionLayout.h | 1 + .../AsyncDisplayKit/ASCollectionLayoutCache.h | 1 + .../ASCollectionLayoutContext+Private.h | 1 + .../ASCollectionLayoutContext.h | 1 + .../ASCollectionLayoutDefines.h | 1 + .../ASCollectionLayoutDelegate.h | 1 + .../ASCollectionLayoutState+Private.h | 1 + .../AsyncDisplayKit/ASCollectionLayoutState.h | 1 + .../AsyncDisplayKit/ASCollectionNode+Beta.h | 1 + .../AsyncDisplayKit/ASCollectionNode.h | 1 + .../ASCollectionView+Undeprecated.h | 1 + .../AsyncDisplayKit/ASCollectionView.h | 1 + .../ASCollectionViewFlowLayoutInspector.h | 1 + .../ASCollectionViewLayoutController.h | 1 + ...SCollectionViewLayoutFacilitatorProtocol.h | 1 + .../ASCollectionViewLayoutInspector.h | 1 + .../ASCollectionViewProtocols.h | 1 + .../include/AsyncDisplayKit/ASCollections.h | 1 + .../include/AsyncDisplayKit/ASConfiguration.h | 1 + .../AsyncDisplayKit/ASConfigurationDelegate.h | 1 + .../AsyncDisplayKit/ASConfigurationInternal.h | 1 + .../AsyncDisplayKit/ASContextTransitioning.h | 1 + .../AsyncDisplayKit/ASControlNode+Private.h | 1 + .../ASControlNode+Subclasses.h | 1 + .../include/AsyncDisplayKit/ASControlNode.h | 1 + .../AsyncDisplayKit/ASControlTargetAction.h | 1 + .../AsyncDisplayKit/ASCornerLayoutSpec.h | 1 + .../ASDKNavigationController.h | 1 + .../AsyncDisplayKit/ASDKViewController.h | 1 + .../AsyncDisplayKit/ASDataController.h | 1 + .../AsyncDisplayKit/ASDefaultPlayButton.h | 1 + .../AsyncDisplayKit/ASDefaultPlaybackButton.h | 1 + .../include/AsyncDisplayKit/ASDelegateProxy.h | 1 + .../include/AsyncDisplayKit/ASDimension.h | 1 + .../AsyncDisplayKit/ASDimensionInternal.h | 1 + .../include/AsyncDisplayKit/ASDispatch.h | 1 + .../AsyncDisplayKit/ASDisplayNode+Ancestry.h | 1 + .../AsyncDisplayKit/ASDisplayNode+Beta.h | 1 + .../ASDisplayNode+Convenience.h | 1 + .../ASDisplayNode+DebugTiming.h | 1 + .../ASDisplayNode+FrameworkPrivate.h | 1 + .../ASDisplayNode+InterfaceState.h | 1 + .../ASDisplayNode+LayoutSpec.h | 1 + .../ASDisplayNode+Subclasses.h | 1 + .../AsyncDisplayKit/ASDisplayNode+Yoga.h | 1 + .../include/AsyncDisplayKit/ASDisplayNode.h | 1 + .../ASDisplayNodeCornerLayerDelegate.h | 1 + .../AsyncDisplayKit/ASDisplayNodeExtras.h | 1 + .../AsyncDisplayKit/ASDisplayNodeInternal.h | 1 + .../AsyncDisplayKit/ASDisplayNodeLayout.h | 1 + .../AsyncDisplayKit/ASDisplayNodeTipState.h | 1 + .../AsyncDisplayKit/ASEditableTextNode.h | 1 + .../include/AsyncDisplayKit/ASElementMap.h | 1 + .../AsyncDisplayKit/ASEqualityHelpers.h | 1 + .../AsyncDisplayKit/ASExperimentalFeatures.h | 1 + .../AsyncDisplayKit/ASGraphicsContext.h | 1 + .../include/AsyncDisplayKit/ASHashing.h | 1 + .../AsyncDisplayKit/ASHighlightOverlayLayer.h | 1 + .../ASIGListAdapterBasedDataSource.h | 1 + .../ASImageContainerProtocolCategories.h | 1 + .../ASImageNode+AnimatedImagePrivate.h | 1 + .../AsyncDisplayKit/ASImageNode+CGExtras.h | 1 + .../AsyncDisplayKit/ASImageNode+Private.h | 1 + .../include/AsyncDisplayKit/ASImageNode.h | 1 + .../AsyncDisplayKit/ASImageProtocols.h | 1 + .../AsyncDisplayKit/ASInsetLayoutSpec.h | 1 + .../include/AsyncDisplayKit/ASIntegerMap.h | 1 + .../AsyncDisplayKit/ASInternalHelpers.h | 1 + .../ASLayerBackingTipProvider.h | 1 + .../AsyncDisplayKit/ASLayout+IGListDiffKit.h | 1 + .../include/AsyncDisplayKit/ASLayout.h | 1 + .../AsyncDisplayKit/ASLayoutController.h | 1 + .../include/AsyncDisplayKit/ASLayoutElement.h | 1 + .../ASLayoutElementExtensibility.h | 1 + .../AsyncDisplayKit/ASLayoutElementPrivate.h | 1 + .../ASLayoutElementStylePrivate.h | 1 + .../include/AsyncDisplayKit/ASLayoutManager.h | 1 + .../AsyncDisplayKit/ASLayoutRangeType.h | 1 + .../AsyncDisplayKit/ASLayoutSpec+Subclasses.h | 1 + .../include/AsyncDisplayKit/ASLayoutSpec.h | 1 + .../AsyncDisplayKit/ASLayoutSpecPrivate.h | 1 + .../AsyncDisplayKit/ASLayoutSpecUtilities.h | 1 + .../AsyncDisplayKit/ASLayoutTransition.h | 1 + .../include/AsyncDisplayKit/ASLocking.h | 1 + .../include/AsyncDisplayKit/ASLog.h | 1 + .../AsyncDisplayKit/ASMainSerialQueue.h | 1 + .../ASMainThreadDeallocation.h | 1 + .../include/AsyncDisplayKit/ASMapNode.h | 1 + .../AsyncDisplayKit/ASMultiplexImageNode.h | 1 + .../ASMutableAttributedStringBuilder.h | 1 + .../AsyncDisplayKit/ASMutableElementMap.h | 1 + .../ASNetworkImageLoadInfo+Private.h | 1 + .../AsyncDisplayKit/ASNetworkImageLoadInfo.h | 1 + .../AsyncDisplayKit/ASNetworkImageNode.h | 1 + .../AsyncDisplayKit/ASNodeController+Beta.h | 1 + .../ASObjectDescriptionHelpers.h | 1 + .../AsyncDisplayKit/ASOverlayLayoutSpec.h | 1 + .../ASPINRemoteImageDownloader.h | 1 + .../include/AsyncDisplayKit/ASPageTable.h | 1 + .../AsyncDisplayKit/ASPagerFlowLayout.h | 1 + .../AsyncDisplayKit/ASPagerNode+Beta.h | 1 + .../include/AsyncDisplayKit/ASPagerNode.h | 1 + .../ASPendingStateController.h | 1 + .../ASPhotosFrameworkImageRequest.h | 1 + .../AsyncDisplayKit/ASRangeController.h | 1 + ...SRangeControllerUpdateRangeProtocol+Beta.h | 1 + .../AsyncDisplayKit/ASRangeManagingNode.h | 1 + .../AsyncDisplayKit/ASRatioLayoutSpec.h | 1 + .../AsyncDisplayKit/ASRecursiveUnfairLock.h | 1 + .../AsyncDisplayKit/ASRelativeLayoutSpec.h | 1 + .../ASResponderChainEnumerator.h | 1 + .../include/AsyncDisplayKit/ASRunLoopQueue.h | 1 + .../AsyncDisplayKit/ASScrollDirection.h | 1 + .../include/AsyncDisplayKit/ASScrollNode.h | 1 + .../include/AsyncDisplayKit/ASSection.h | 1 + .../AsyncDisplayKit/ASSectionContext.h | 1 + .../AsyncDisplayKit/ASSectionController.h | 1 + .../include/AsyncDisplayKit/ASSignpost.h | 1 + .../AsyncDisplayKit/ASStackLayoutDefines.h | 1 + .../AsyncDisplayKit/ASStackLayoutElement.h | 1 + .../AsyncDisplayKit/ASStackLayoutSpec.h | 1 + .../ASStackLayoutSpecUtilities.h | 1 + .../AsyncDisplayKit/ASStackPositionedLayout.h | 1 + .../ASStackUnpositionedLayout.h | 1 + .../ASSupplementaryNodeSource.h | 1 + .../AsyncDisplayKit/ASTabBarController.h | 1 + .../AsyncDisplayKit/ASTableLayoutController.h | 1 + .../AsyncDisplayKit/ASTableNode+Beta.h | 1 + .../include/AsyncDisplayKit/ASTableNode.h | 1 + .../ASTableView+Undeprecated.h | 1 + .../include/AsyncDisplayKit/ASTableView.h | 1 + .../AsyncDisplayKit/ASTableViewInternal.h | 1 + .../AsyncDisplayKit/ASTableViewProtocols.h | 1 + .../include/AsyncDisplayKit/ASTextAttribute.h | 1 + .../AsyncDisplayKit/ASTextDebugOption.h | 1 + .../include/AsyncDisplayKit/ASTextInput.h | 1 + .../AsyncDisplayKit/ASTextKitAttributes.h | 1 + .../AsyncDisplayKit/ASTextKitComponents.h | 1 + .../AsyncDisplayKit/ASTextKitContext.h | 1 + .../ASTextKitCoreTextAdditions.h | 1 + .../ASTextKitEntityAttribute.h | 1 + .../ASTextKitFontSizeAdjuster.h | 1 + .../ASTextKitRenderer+Positioning.h | 1 + .../ASTextKitRenderer+TextChecking.h | 1 + .../AsyncDisplayKit/ASTextKitRenderer.h | 1 + .../AsyncDisplayKit/ASTextKitShadower.h | 1 + .../AsyncDisplayKit/ASTextKitTailTruncater.h | 1 + .../AsyncDisplayKit/ASTextKitTruncating.h | 1 + .../include/AsyncDisplayKit/ASTextLayout.h | 1 + .../include/AsyncDisplayKit/ASTextLine.h | 1 + .../include/AsyncDisplayKit/ASTextNode+Beta.h | 1 + .../include/AsyncDisplayKit/ASTextNode.h | 1 + .../include/AsyncDisplayKit/ASTextNode2.h | 1 + .../AsyncDisplayKit/ASTextNodeCommon.h | 1 + .../include/AsyncDisplayKit/ASTextNodeTypes.h | 1 + .../AsyncDisplayKit/ASTextNodeWordKerner.h | 1 + .../AsyncDisplayKit/ASTextRunDelegate.h | 1 + .../include/AsyncDisplayKit/ASTextUtilities.h | 1 + .../include/AsyncDisplayKit/ASThread.h | 1 + .../include/AsyncDisplayKit/ASTip.h | 1 + .../include/AsyncDisplayKit/ASTipNode.h | 1 + .../include/AsyncDisplayKit/ASTipProvider.h | 1 + .../AsyncDisplayKit/ASTipsController.h | 1 + .../include/AsyncDisplayKit/ASTipsWindow.h | 1 + .../AsyncDisplayKit/ASTraitCollection.h | 1 + .../ASTwoDimensionalArrayUtils.h | 1 + .../include/AsyncDisplayKit/ASVideoNode.h | 1 + .../AsyncDisplayKit/ASVideoPlayerNode.h | 1 + .../AsyncDisplayKit/ASVisibilityProtocols.h | 1 + .../include/AsyncDisplayKit/ASWeakMap.h | 1 + .../include/AsyncDisplayKit/ASWeakProxy.h | 1 + .../include/AsyncDisplayKit/ASWeakSet.h | 1 + .../include/AsyncDisplayKit/ASYogaUtilities.h | 1 + .../AsyncDisplayKit/AsyncDisplayKit+Debug.h | 1 + .../AsyncDisplayKit+IGListKitMethods.h | 1 + .../AsyncDisplayKit/AsyncDisplayKit+Tips.h | 1 + .../include/AsyncDisplayKit/AsyncDisplayKit.h | 1 + .../CoreGraphics+ASConvenience.h | 1 + .../IGListAdapter+AsyncDisplayKit.h | 1 + .../include/AsyncDisplayKit/NSArray+Diffing.h | 1 + .../NSAttributedString+ASText.h | 1 + .../AsyncDisplayKit/NSIndexSet+ASHelpers.h | 1 + ...MutableAttributedString+TextKitAdditions.h | 1 + .../AsyncDisplayKit/NSParagraphStyle+ASText.h | 1 + .../UICollectionViewLayout+ASConvenience.h | 1 + .../AsyncDisplayKit/UIImage+ASConvenience.h | 1 + .../UIResponder+AsyncDisplayKit.h | 1 + .../AsyncDisplayKit/UIView+ASConvenience.h | 1 + .../AsyncDisplayKit/_ASAsyncTransaction.h | 1 + .../_ASAsyncTransactionContainer+Private.h | 1 + .../_ASAsyncTransactionContainer.h | 1 + .../_ASAsyncTransactionGroup.h | 1 + .../_ASCollectionGalleryLayoutInfo.h | 1 + .../_ASCollectionGalleryLayoutItem.h | 1 + .../_ASCollectionReusableView.h | 1 + .../AsyncDisplayKit/_ASCollectionViewCell.h | 1 + .../AsyncDisplayKit/_ASCoreAnimationExtras.h | 1 + .../include/AsyncDisplayKit/_ASDisplayLayer.h | 1 + .../include/AsyncDisplayKit/_ASDisplayView.h | 1 + .../_ASDisplayViewAccessiblity.h | 1 + .../AsyncDisplayKit/_ASHierarchyChangeSet.h | 1 + .../include/AsyncDisplayKit/_ASPendingState.h | 1 + .../include/AsyncDisplayKit/_ASScopeTimer.h | 1 + .../AsyncDisplayKit/_ASTransitionContext.h | 1 + 420 files changed, 2214 insertions(+), 4 deletions(-) create mode 100644 Package.swift create mode 100644 Sources/TextureIGListKitExtensions/IGListAdapter+Texture.swift create mode 100644 Sources/TextureIGListKitExtensions/README.md create mode 100644 examples/SPMBasic/Package.swift create mode 100644 examples/SPMBasic/README.md create mode 100644 examples/SPMBasic/Sources/Example.swift create mode 100644 examples/SPMBasic/Tests/DefaultTraitsTests.swift create mode 100644 examples/SPMWithIGListKit/Package.swift create mode 100644 examples/SPMWithIGListKit/README.md create mode 100644 examples/SPMWithIGListKit/Sources/IGListKitTraitTest.swift create mode 100644 examples/SPMWithIGListKit/Tests/IGListKitTraitTests.swift create mode 100755 scripts/generate_spm_sources_layout.swift create mode 100644 spm/.gitkeep create mode 100644 spm/README.md create mode 120000 spm/Sources/AsyncDisplayKit/ASAbsoluteLayoutSpec.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASAbstractLayoutController.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASAsciiArtBoxCreator.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASAssert.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASBackgroundLayoutSpec.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASBasicImageDownloader.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASBatchContext.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASBatchFetching.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASButtonNode+Yoga.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASButtonNode.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASCellNode.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASCenterLayoutSpec.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASCollectionElement.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASCollectionFlowLayoutDelegate.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASCollectionGalleryLayoutDelegate.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASCollectionLayout.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASCollectionLayoutCache.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASCollectionLayoutContext.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASCollectionLayoutDefines.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASCollectionLayoutState.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASCollectionNode.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASCollectionView.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASCollectionViewFlowLayoutInspector.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASCollectionViewLayoutController.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASCollectionViewLayoutInspector.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASCollections.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASConfiguration.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASConfigurationInternal.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASControlNode+tvOS.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASControlNode.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASControlTargetAction.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASCornerLayoutSpec.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASDKNavigationController.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASDKViewController.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASDataController.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASDefaultPlayButton.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASDefaultPlaybackButton.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASDelegateProxy.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASDimension.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASDimensionInternal.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASDispatch.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASDisplayNode+Ancestry.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASDisplayNode+AsyncDisplay.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASDisplayNode+Convenience.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASDisplayNode+DebugTiming.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASDisplayNode+Layout.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASDisplayNode+LayoutSpec.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASDisplayNode+UIViewBridge.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASDisplayNode+Yoga.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASDisplayNode.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASDisplayNodeCornerLayerDelegate.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASDisplayNodeExtras.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASDisplayNodeTipState.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASEditableTextNode.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASElementMap.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASExperimentalFeatures.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASGraphicsContext.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASHashing.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASHighlightOverlayLayer.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASIGListAdapterBasedDataSource.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASImageContainerProtocolCategories.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASImageNode+AnimatedImage.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASImageNode+CGExtras.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASImageNode+tvOS.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASImageNode.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASInsetLayoutSpec.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASIntegerMap.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASInternalHelpers.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASLayerBackingTipProvider.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASLayout+IGListDiffKit.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASLayout.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASLayoutElement.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASLayoutManager.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASLayoutSpec+Subclasses.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASLayoutSpec.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASLayoutTransition.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASLog.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASMainSerialQueue.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASMainThreadDeallocation.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASMapNode.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASMultiplexImageNode.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASMutableAttributedStringBuilder.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASMutableElementMap.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASNetworkImageLoadInfo.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASNetworkImageNode.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASNodeController+Beta.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASObjectDescriptionHelpers.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASOverlayLayoutSpec.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASPINRemoteImageDownloader.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASPageTable.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASPagerFlowLayout.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASPagerNode.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASPendingStateController.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASPhotosFrameworkImageRequest.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASRangeController.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASRatioLayoutSpec.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASRecursiveUnfairLock.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASRelativeLayoutSpec.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASResponderChainEnumerator.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASRunLoopQueue.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASScrollDirection.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASScrollNode.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASSection.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASStackLayoutSpec.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASStackPositionedLayout.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASStackUnpositionedLayout.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTabBarController.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTableLayoutController.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTableNode.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTableView.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTextAttribute.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTextDebugOption.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTextInput.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTextKitAttributes.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTextKitComponents.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTextKitContext.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTextKitCoreTextAdditions.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTextKitEntityAttribute.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTextKitFontSizeAdjuster.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTextKitRenderer+Positioning.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTextKitRenderer+TextChecking.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTextKitRenderer.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTextKitShadower.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTextKitTailTruncater.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTextLayout.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTextLine.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTextNode.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTextNode2.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTextNodeWordKerner.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTextRunDelegate.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTextUtilities.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTip.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTipNode.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTipProvider.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTipsController.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTipsWindow.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTraitCollection.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASTwoDimensionalArrayUtils.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASVideoNode.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASVideoPlayerNode.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASVisibilityProtocols.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASWeakMap.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASWeakProxy.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASWeakSet.mm create mode 120000 spm/Sources/AsyncDisplayKit/ASYogaUtilities.mm create mode 120000 spm/Sources/AsyncDisplayKit/AsyncDisplayKit+Debug.mm create mode 120000 spm/Sources/AsyncDisplayKit/AsyncDisplayKit+IGListKitMethods.mm create mode 120000 spm/Sources/AsyncDisplayKit/AsyncDisplayKit+Tips.mm create mode 120000 spm/Sources/AsyncDisplayKit/IGListAdapter+AsyncDisplayKit.mm create mode 120000 spm/Sources/AsyncDisplayKit/NSArray+Diffing.mm create mode 120000 spm/Sources/AsyncDisplayKit/NSAttributedString+ASText.mm create mode 120000 spm/Sources/AsyncDisplayKit/NSIndexSet+ASHelpers.mm create mode 120000 spm/Sources/AsyncDisplayKit/NSMutableAttributedString+TextKitAdditions.mm create mode 120000 spm/Sources/AsyncDisplayKit/NSParagraphStyle+ASText.mm create mode 120000 spm/Sources/AsyncDisplayKit/UICollectionViewLayout+ASConvenience.mm create mode 120000 spm/Sources/AsyncDisplayKit/UIImage+ASConvenience.mm create mode 120000 spm/Sources/AsyncDisplayKit/UIResponder+AsyncDisplayKit.mm create mode 120000 spm/Sources/AsyncDisplayKit/_ASAsyncTransaction.mm create mode 120000 spm/Sources/AsyncDisplayKit/_ASAsyncTransactionContainer.mm create mode 120000 spm/Sources/AsyncDisplayKit/_ASAsyncTransactionGroup.mm create mode 120000 spm/Sources/AsyncDisplayKit/_ASCollectionGalleryLayoutInfo.mm create mode 120000 spm/Sources/AsyncDisplayKit/_ASCollectionGalleryLayoutItem.mm create mode 120000 spm/Sources/AsyncDisplayKit/_ASCollectionReusableView.mm create mode 120000 spm/Sources/AsyncDisplayKit/_ASCollectionViewCell.mm create mode 120000 spm/Sources/AsyncDisplayKit/_ASCoreAnimationExtras.mm create mode 120000 spm/Sources/AsyncDisplayKit/_ASDisplayLayer.mm create mode 120000 spm/Sources/AsyncDisplayKit/_ASDisplayView.mm create mode 120000 spm/Sources/AsyncDisplayKit/_ASDisplayViewAccessiblity.mm create mode 120000 spm/Sources/AsyncDisplayKit/_ASHierarchyChangeSet.mm create mode 120000 spm/Sources/AsyncDisplayKit/_ASPendingState.mm create mode 120000 spm/Sources/AsyncDisplayKit/_ASTransitionContext.mm create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAbsoluteLayoutElement.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAbsoluteLayoutSpec.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAbstractLayoutController+FrameworkPrivate.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAbstractLayoutController.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAsciiArtBoxCreator.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAssert.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASAvailability.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBackgroundLayoutSpec.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBaseDefines.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBasicImageDownloader.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBasicImageDownloaderInternal.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBatchContext.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBatchFetching.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBatchFetchingDelegate.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASBlockTypes.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASButtonNode+Private.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASButtonNode+Yoga.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASButtonNode.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCellNode+Internal.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCellNode.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCenterLayoutSpec.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionElement.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionFlowLayoutDelegate.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionGalleryLayoutDelegate.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionInternal.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayout.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutCache.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutContext+Private.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutContext.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutDefines.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutDelegate.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutState+Private.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionLayoutState.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionNode+Beta.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionNode.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionView+Undeprecated.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionView.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionViewFlowLayoutInspector.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionViewLayoutController.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionViewLayoutFacilitatorProtocol.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionViewLayoutInspector.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollectionViewProtocols.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCollections.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASConfiguration.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASConfigurationDelegate.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASConfigurationInternal.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASContextTransitioning.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASControlNode+Private.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASControlNode+Subclasses.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASControlNode.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASControlTargetAction.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASCornerLayoutSpec.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDKNavigationController.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDKViewController.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDataController.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDefaultPlayButton.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDefaultPlaybackButton.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDelegateProxy.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDimension.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDimensionInternal.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDispatch.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+Ancestry.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+Beta.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+Convenience.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+DebugTiming.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+FrameworkPrivate.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+InterfaceState.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+LayoutSpec.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+Subclasses.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode+Yoga.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNode.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNodeCornerLayerDelegate.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNodeExtras.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNodeInternal.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNodeLayout.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDisplayNodeTipState.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASEditableTextNode.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASElementMap.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASEqualityHelpers.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASExperimentalFeatures.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASGraphicsContext.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASHashing.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASHighlightOverlayLayer.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASIGListAdapterBasedDataSource.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageContainerProtocolCategories.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageNode+AnimatedImagePrivate.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageNode+CGExtras.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageNode+Private.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageNode.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASImageProtocols.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASInsetLayoutSpec.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASIntegerMap.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASInternalHelpers.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayerBackingTipProvider.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayout+IGListDiffKit.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayout.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutController.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutElement.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutElementExtensibility.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutElementPrivate.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutElementStylePrivate.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutManager.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutRangeType.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutSpec+Subclasses.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutSpec.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutSpecPrivate.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutSpecUtilities.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLayoutTransition.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLocking.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASLog.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMainSerialQueue.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMainThreadDeallocation.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMapNode.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMultiplexImageNode.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMutableAttributedStringBuilder.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASMutableElementMap.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASNetworkImageLoadInfo+Private.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASNetworkImageLoadInfo.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASNetworkImageNode.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASNodeController+Beta.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASObjectDescriptionHelpers.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASOverlayLayoutSpec.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPINRemoteImageDownloader.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPageTable.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPagerFlowLayout.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPagerNode+Beta.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPagerNode.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPendingStateController.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASPhotosFrameworkImageRequest.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRangeController.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRangeControllerUpdateRangeProtocol+Beta.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRangeManagingNode.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRatioLayoutSpec.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRecursiveUnfairLock.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRelativeLayoutSpec.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASResponderChainEnumerator.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASRunLoopQueue.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASScrollDirection.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASScrollNode.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASSection.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASSectionContext.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASSectionController.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASSignpost.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackLayoutDefines.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackLayoutElement.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackLayoutSpec.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackLayoutSpecUtilities.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackPositionedLayout.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASStackUnpositionedLayout.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASSupplementaryNodeSource.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTabBarController.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableLayoutController.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableNode+Beta.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableNode.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableView+Undeprecated.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableView.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableViewInternal.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTableViewProtocols.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextAttribute.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextDebugOption.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextInput.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitAttributes.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitComponents.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitContext.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitCoreTextAdditions.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitEntityAttribute.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitFontSizeAdjuster.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitRenderer+Positioning.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitRenderer+TextChecking.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitRenderer.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitShadower.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitTailTruncater.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextKitTruncating.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextLayout.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextLine.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNode+Beta.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNode.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNode2.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNodeCommon.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNodeTypes.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextNodeWordKerner.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextRunDelegate.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTextUtilities.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASThread.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTip.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTipNode.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTipProvider.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTipsController.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTipsWindow.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTraitCollection.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASTwoDimensionalArrayUtils.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASVideoNode.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASVideoPlayerNode.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASVisibilityProtocols.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASWeakMap.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASWeakProxy.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASWeakSet.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASYogaUtilities.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/AsyncDisplayKit+Debug.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/AsyncDisplayKit+IGListKitMethods.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/AsyncDisplayKit+Tips.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/AsyncDisplayKit.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/CoreGraphics+ASConvenience.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/IGListAdapter+AsyncDisplayKit.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/NSArray+Diffing.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/NSAttributedString+ASText.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/NSIndexSet+ASHelpers.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/NSMutableAttributedString+TextKitAdditions.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/NSParagraphStyle+ASText.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/UICollectionViewLayout+ASConvenience.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/UIImage+ASConvenience.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/UIResponder+AsyncDisplayKit.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/UIView+ASConvenience.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASAsyncTransaction.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASAsyncTransactionContainer+Private.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASAsyncTransactionContainer.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASAsyncTransactionGroup.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASCollectionGalleryLayoutInfo.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASCollectionGalleryLayoutItem.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASCollectionReusableView.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASCollectionViewCell.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASCoreAnimationExtras.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASDisplayLayer.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASDisplayView.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASDisplayViewAccessiblity.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASHierarchyChangeSet.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASPendingState.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASScopeTimer.h create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/_ASTransitionContext.h diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 75081c03a..03ea2835d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,7 +8,7 @@ jobs: 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, examples-pt1, examples-pt2, examples-pt3, examples-pt4] include: - mode: tests name: Build and run tests @@ -18,6 +18,12 @@ 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 with default traits (AsyncDisplayKit) + - mode: spm-texture-iglistkit + name: Test SPM with IGListKit trait - mode: examples-pt1 name: Build examples (examples-pt1) - mode: examples-pt2 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..147fabe94 --- /dev/null +++ b/Package.swift @@ -0,0 +1,145 @@ +// swift-tools-version: 6.2 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +// AsyncDisplayKit dependencies +let igListKitDep: Target.Dependency = .product( + name: "IGListKit", + package: "IGListKit", + condition: .when(traits: ["IGListKit"]) +) +let igListDiffKitDep: Target.Dependency = .product( + name: "IGListDiffKit", + package: "IGListKit", + condition: .when(traits: ["IGListKit"]) +) + +let package = Package( + name: "Texture", + platforms: [ + .iOS(.v14), + .tvOS(.v14), + .macCatalyst(.v13) + ], + products: [ + .library( + name: "AsyncDisplayKit", + targets: ["AsyncDisplayKit"] + ), + .library( + name: "TextureIGListKitExtensions", + targets: ["TextureIGListKitExtensions"] + ) + ], + traits: [ + // Default traits - enabled by default for backwards compatibility with CocoaPods + .default(enabledTraits: [ + "Video", + "MapKit", + "Photos", + "AssetsLibrary" + ]), + + // Define all traits with descriptions + .init(name: "Video", description: "Video node support with AVFoundation and CoreMedia"), + .init(name: "MapKit", description: "MapKit integration for map nodes"), + .init(name: "Photos", description: "Photos framework support"), + .init(name: "AssetsLibrary", description: "Legacy AssetsLibrary support (iOS only)"), + + // Optional traits - must be explicitly enabled + .init(name: "IGListKit", description: "IGListKit integration for advanced collection view support") + ], + 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", + igListKitDep, + igListDiffKitDep + ], + path: "spm/Sources/AsyncDisplayKit", + publicHeadersPath: "include", + cSettings: [ + // PINRemoteImage is always available + .define("AS_PIN_REMOTE_IMAGE", to: "1"), + + // Disable old TextNode by default for SPM + .define("AS_ENABLE_TEXTNODE", to: "0"), + + // Trait-based conditional defines + .define("AS_USE_VIDEO", to: "1", .when(traits: ["Video"])), + .define("AS_USE_MAPKIT", to: "1", .when(traits: ["MapKit"])), + .define("AS_USE_PHOTOS", to: "1", .when(traits: ["Photos"])), + .define("AS_USE_ASSETS_LIBRARY", to: "1", .when(traits: ["AssetsLibrary"])), + .define("AS_IG_LIST_KIT", to: "1", .when(traits: ["IGListKit"])), + .define("AS_IG_LIST_DIFF_KIT", to: "1", .when(traits: ["IGListKit"])), + + // 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: [ + .linkedFramework("AVFoundation", .when(traits: ["Video"])), + .linkedFramework("CoreMedia", .when(traits: ["Video"])), + .linkedFramework("CoreLocation", .when(traits: ["MapKit"])), + .linkedFramework("MapKit", .when(traits: ["MapKit"])), + .linkedFramework("Photos", .when(traits: ["Photos"])), + .linkedFramework("AssetsLibrary", .when(platforms: [.iOS], traits: ["AssetsLibrary"])), + .linkedLibrary("c++") + ] + ), + .target( + name: "TextureIGListKitExtensions", + dependencies: [ + "AsyncDisplayKit", + igListKitDep + ], + 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..e74be6b9a 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,113 @@ ## 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, ASTextNode, etc.) +- PINRemoteImage integration (ASPINRemoteImageDownloader) +- Video support (AVFoundation, CoreMedia) +- MapKit integration +- Photos framework +- AssetsLibrary (iOS only) + +**No trait configuration needed** - all these features work out of the box! + +#### 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 | Default trait (enabled) | ✅ Same behavior | +| **MapKit** | Included by default | Default trait (enabled) | ✅ Same behavior | +| **Photos** | Included by default | Default trait (enabled) | ✅ Same behavior | +| **AssetsLibrary** | Included by default | Default trait (enabled) | ✅ Same behavior | +| **IGListKit** | `pod 'Texture/IGListKit'` | Trait + product (see above) | ⚠️ 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) +- ⚠️ **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..164b3b1de --- /dev/null +++ b/Sources/TextureIGListKitExtensions/IGListAdapter+Texture.swift @@ -0,0 +1,311 @@ +// +// 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 + +/// 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 + } +} + +/// 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..57528ca93 --- /dev/null +++ b/Sources/TextureIGListKitExtensions/README.md @@ -0,0 +1,312 @@ +# TextureIGListKitExtensions + +Pure Swift implementation of IGListKit integration for Texture (AsyncDisplayKit) for Swift Package Manager. + +## Quick Summary + +- **What it does:** Connects `IGListAdapter` with `ASCollectionNode` in SPM builds +- **Why needed:** SPM traits don't work with Objective-C `#if` directives +- **What you get:** One Swift extension method + re-exported modules (AsyncDisplayKit, IGListKit, IGListDiffKit) +- **API:** `adapter.setCollectionNode(node)` replaces `[adapter setASDKCollectionNode:node]` +- **Version:** Uses IGListKit 5.0+ (breaking changes from 4.x) + +## Overview + +This module provides a single extension method to `IGListAdapter` that enables seamless integration with `ASCollectionNode`. + +**Why this exists:** The original Objective-C implementation (`setASDKCollectionNode:` in `IGListAdapter+AsyncDisplayKit.mm`) doesn't compile in SPM builds because Swift Package Manager traits don't work with conditional compilation (`#if AS_IG_LIST_KIT`) in Objective-C code. This is a pure Swift reimplementation of that Objective-C code. + +**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 Version Differences + +**SPM uses IGListKit 5.0+ (latest major version)** which includes breaking changes compared to versions used by CocoaPods/Carthage. + +- **Not a drop-in replacement** - Migration and testing required +- **API differences** - IGListKit 5.0 has breaking changes from 4.x +- **Different target** - This is specifically for SPM users +- **No Carthage/CocoaPods support planned** - We recommend migrating to SPM + +If you're currently using Texture with IGListKit via CocoaPods or Carthage, please thoroughly test your integration when migrating to SPM. + +## What You Get + +When you `import TextureIGListKitExtensions`, you get: + +1. **One extension method:** + ```swift + extension ListAdapter { + @MainActor + public func setCollectionNode(_ collectionNode: ASCollectionNode) + } + ``` + +2. **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) + +// 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.** + +## 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 + ) + } +} +``` + +## How It Works Internally + +The module consists of two 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`) + +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). + +## Requirements + +- iOS 14.0+ / tvOS 14.0+ / macOS 13.0+ +- Swift 6.2+ +- 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 6966c15cb..a7ea1be0b 100755 --- a/build.sh +++ b/build.sh @@ -267,6 +267,71 @@ 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 (AsyncDisplayKit without IGListKit)." + + # Clean generated SPM directory to test script generation + echo "Cleaning generated SPM directory..." + rm -rf spm/Sources + + # Generate SPM symlinks from scratch + echo "Generating SPM layout..." + swift scripts/generate_spm_sources_layout.swift + + # 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 (AsyncDisplayKitIGListKit product)." + + # Clean generated SPM directory to test script generation + echo "Cleaning generated SPM directory..." + rm -rf spm/Sources + + # Generate SPM symlinks from scratch + echo "Generating SPM layout..." + 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" + ;; + *) echo "Unrecognized mode '$MODE'." ;; 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..3f5398d50 --- /dev/null +++ b/examples/SPMBasic/README.md @@ -0,0 +1,37 @@ +# SPM Basic Example + +This example demonstrates basic Texture usage via Swift Package Manager with default traits. + +## Features + +This example uses Texture with default traits enabled: +- Video support (AVFoundation, CoreMedia) +- MapKit integration +- Photos framework +- AssetsLibrary (iOS only) + +## Building + +From this directory: + +```bash +swift build +``` + +## Running + +```bash +swift run +``` + +Expected output: +``` +✓ Texture (AsyncDisplayKit) imported successfully via SPM! +Creating basic nodes... +✓ ASDisplayNode created +✓ ASImageNode created +✓ ASTextNode created + +✅ All basic Texture features are working with SPM! +Default traits enabled: Video, MapKit, Photos, AssetsLibrary +``` 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..6b9b404be --- /dev/null +++ b/examples/SPMBasic/Tests/DefaultTraitsTests.swift @@ -0,0 +1,166 @@ +import Testing +@testable import SPMBasic +import AsyncDisplayKit + +/// Tests that verify basic Texture functionality works via SPM +/// +/// Note: Default traits (Video, MapKit, Photos, AssetsLibrary) are enabled, +/// but trait-specific Objective-C classes may not be accessible from Swift +/// without additional bridging. These tests focus on core Texture functionality. + +@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..100e4c182 --- /dev/null +++ b/examples/SPMWithIGListKit/Package.swift @@ -0,0 +1,40 @@ +// swift-tools-version: 6.2 +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..cd39f43fd --- /dev/null +++ b/examples/SPMWithIGListKit/README.md @@ -0,0 +1,89 @@ +# SPM With IGListKit Example + +This example demonstrates how to use the IGListKit trait with Texture via Swift Package Manager. + +## What This Example Tests + +This example verifies that when you enable the IGListKit trait in your Package.swift, the IGListKit dependency is resolved and available for use alongside Texture's ASCollectionNode. + +## Package.swift Trait Syntax + +```swift +dependencies: [ + .package( + url: "https://github.com/TextureGroup/Texture.git", + from: "3.3.0", + traits: [ + .init(name: "IGListKit") // Enable IGListKit trait + ] + ) +] +``` + +## What Gets Enabled + +When the IGListKit trait is enabled: + +1. **IGListKit dependency** is resolved and added to your project +2. **IGListDiffKit** (part of IGListKit) is also available +3. You can use both **Texture** (ASCollectionNode, ASDisplayNode, etc.) and **IGListKit** (ListAdapter, ListSectionController, etc.) together + +## Building + +```bash +swift build +``` + +Or with xcodebuild: + +```bash +xcodebuild -scheme SPMWithIGListKit -sdk iphonesimulator -destination 'platform=iOS Simulator,OS=26.0,name=iPhone 17' build +``` + +## Running Tests + +```bash +swift test +``` + +Or with xcodebuild: + +```bash +xcodebuild -scheme SPMWithIGListKit -sdk iphonesimulator -destination 'platform=iOS Simulator,OS=26.0,name=iPhone 17' test +``` + +## Tests + +The test suite verifies: + +- ✓ IGListKit dependency is resolved and classes are available +- ✓ Basic IGListKit objects (ListAdapter, ListAdapterUpdater) can be created +- ✓ ASCollectionNode from Texture is available +- ✓ Both frameworks can be used together + +## Usage in Your App + +```swift +import AsyncDisplayKit +import IGListKit + +// Use Texture's ASCollectionNode +let layout = UICollectionViewFlowLayout() +let collectionNode = ASCollectionNode(collectionViewLayout: layout) + +// Use IGListKit's ListAdapter +let updater = ListAdapterUpdater() +let adapter = ListAdapter(updater: updater, viewController: self) + +// Connect them (requires additional integration code from Texture) +// See Texture source: IGListAdapter+AsyncDisplayKit.h +``` + +## Note + +The Texture+IGListKit integration APIs (`IGListAdapter.setASDKCollectionNode(_:)`, `ASIGListSectionControllerMethods`, etc.) are Objective-C extensions that may require additional bridging to use from Swift. This example focuses on verifying that the trait enables the IGListKit dependency correctly. + +## Learn More + +- **IGListKit**: https://github.com/Instagram/IGListKit +- **Texture Documentation**: http://texturegroup.org 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..d9f9a4582 --- /dev/null +++ b/scripts/generate_spm_sources_layout.swift @@ -0,0 +1,292 @@ +#!/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 = [ + "_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 + cleanup(at: sourcesPath) + try! FileManager.default.createDirectory(atPath: publicHeadersPath, + withIntermediateDirectories: true, + attributes: nil) + // 2. Find all public headers + var publicHeaders: [String] = [] + publicHeadersLayout.forEach { (headerLayout) in + let fPath = projectRoot + "/" + headerLayout.path + // 2.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 + } + // 2.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) + } + } + + // 3. Find private headers and impl files. + let privateSources: [String] = privateHeadersAndImpl(sources: sourceFolder, + publicHeaders: publicHeaders) + + // 4. 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) + + // 5. Create symbolic links for implementation files (.mm, .m) in target root + 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/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/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 From 585596c6b4d753301cdf778b31dca54790b2b7ee Mon Sep 17 00:00:00 2001 From: Petro Rovenskyi Date: Sun, 19 Oct 2025 17:45:56 +0300 Subject: [PATCH 03/10] Add iOS app integration example and improve SPM documentation - Add ASIGListKitSPM example demonstrating local package wrapper approach for iOS apps - Update TextureIGListKitExtensions README with iOS/tvOS app integration guide - Add spm-app-iglistkit build mode to test iOS app integration - Improve SPM test strategy: spm-texture-basic tests committed files, spm-texture-iglistkit tests generation script - Update example READMEs with clear documentation structure --- .github/workflows/ci.yml | 4 +- Sources/TextureIGListKitExtensions/README.md | 110 +- build.sh | 36 +- .../ASIGListKitSPM.xcodeproj/project.pbxproj | 1330 +++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcschemes/ASIGListKitSPM.xcscheme | 92 ++ .../ASIGListKitSPM/AppDelegate.swift | 36 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 98 ++ .../Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 + .../ASIGListKitSPM/Base.lproj/Main.storyboard | 24 + .../Extensions/NSObject+ListDiffable.swift | 18 + .../ASIGListKitSPM/ASIGListKitSPM/Info.plist | 66 + .../MainListViewController.swift | 56 + .../ASIGListKitSPM/Models/Item.swift | 16 + .../ASIGListKitSPM/SceneDelegate.swift | 58 + .../ItemSectionController.swift | 48 + .../ASIGListKitSPM/UICoreKit/.gitignore | 8 + .../ASIGListKitSPM/UICoreKit/Package.swift | 44 + .../Sources/UICoreKit/UICoreKit.swift | 1 + .../Tests/UICoreKitTests/UICoreKitTests.swift | 6 + .../ASIGListKitSPM/ViewController.swift | 18 + examples/ASIGListKitSPM/README.md | 106 ++ examples/SPMWithIGListKit/README.md | 81 +- 26 files changed, 2246 insertions(+), 67 deletions(-) create mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/project.pbxproj create mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/xcshareddata/xcschemes/ASIGListKitSPM.xcscheme create mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM/AppDelegate.swift create mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM/Assets.xcassets/Contents.json create mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM/Base.lproj/LaunchScreen.storyboard create mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM/Base.lproj/Main.storyboard create mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM/Extensions/NSObject+ListDiffable.swift create mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM/Info.plist create mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM/MainListViewController.swift create mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM/Models/Item.swift create mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM/SceneDelegate.swift create mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM/Section Controllers/ItemSectionController.swift create mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/.gitignore create mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Package.swift create mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Sources/UICoreKit/UICoreKit.swift create mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Tests/UICoreKitTests/UICoreKitTests.swift create mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM/ViewController.swift create mode 100644 examples/ASIGListKitSPM/README.md diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 03ea2835d..325a36a32 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,7 +8,7 @@ jobs: DEVELOPER_DIR: /Applications/Xcode_26.0.1.app/Contents/Developer strategy: matrix: - mode: [tests, framework, life-without-cocoapods, carthage, spm, spm-texture-basic, spm-texture-iglistkit, 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 @@ -24,6 +24,8 @@ jobs: name: Test SPM with default traits (AsyncDisplayKit) - mode: spm-texture-iglistkit name: Test SPM with IGListKit trait + - mode: spm-app-iglistkit + name: Test SPM iOS app with IGListKit (local package wrapper) - mode: examples-pt1 name: Build examples (examples-pt1) - mode: examples-pt2 diff --git a/Sources/TextureIGListKitExtensions/README.md b/Sources/TextureIGListKitExtensions/README.md index 57528ca93..78f131886 100644 --- a/Sources/TextureIGListKitExtensions/README.md +++ b/Sources/TextureIGListKitExtensions/README.md @@ -74,6 +74,99 @@ To connect them, you need special bridging code that: **This module provides that bridge in pure Swift.** +## Using in iOS/tvOS App Projects + +### The Problem + +As of Xcode 26.0.1, Xcode does not provide a UI for enabling SPM package traits in iOS/tvOS app targets. Traits can only be enabled in Package.swift files, which app projects do not have. + +Note: If you are using a newer version of Xcode, check whether Apple has added trait configuration support in the Xcode UI. + +### The Solution + +Create an intermediate local Swift package to enable the IGListKit trait. + +**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.2 +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", + traits: [ + .init(name: "IGListKit") // Enable IGListKit trait + ] + ) + ], + 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: @@ -300,9 +393,24 @@ Section controllers must implement methods using `@objc` attribute: 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+ / macOS 13.0+ +- iOS 14.0+ / tvOS 14.0+ / Mac Catalyst 13.0+ - Swift 6.2+ - Texture (AsyncDisplayKit) via SPM with `IGListKit` trait enabled - IGListKit 5.0+ diff --git a/build.sh b/build.sh index a7ea1be0b..3854f6b49 100755 --- a/build.sh +++ b/build.sh @@ -285,15 +285,10 @@ spm|all) ;; spm-texture-basic) - echo "Testing SPMBasic example (AsyncDisplayKit without IGListKit)." + echo "Testing SPMBasic example (verifying committed SPM layout)." - # Clean generated SPM directory to test script generation - echo "Cleaning generated SPM directory..." - rm -rf spm/Sources - - # Generate SPM symlinks from scratch - echo "Generating SPM layout..." - swift scripts/generate_spm_sources_layout.swift + # 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..." @@ -309,14 +304,13 @@ spm-texture-basic) ;; spm-texture-iglistkit) - echo "Testing SPMWithIGListKit example (AsyncDisplayKitIGListKit product)." + echo "Testing SPMWithIGListKit example (testing SPM generation script)." - # Clean generated SPM directory to test script generation + # Clean and regenerate to verify generation script works echo "Cleaning generated SPM directory..." rm -rf spm/Sources - # Generate SPM symlinks from scratch - echo "Generating SPM layout..." + echo "Generating SPM layout from scratch..." swift scripts/generate_spm_sources_layout.swift # Test SPMWithIGListKit example (build and test) @@ -332,6 +326,24 @@ spm-texture-iglistkit) 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..a323a51cf --- /dev/null +++ b/examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/project.pbxproj @@ -0,0 +1,1330 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 70; + objects = { + +/* Begin PBXBuildFile section */ + 0A31690D2EA51D4600F5DB16 /* UICoreKit in Frameworks */ = {isa = PBXBuildFile; productRef = 0A31690C2EA51D4600F5DB16 /* UICoreKit */; }; + 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 PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 0A316B682EA51EBA00F5DB16 /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Package.swift, + Sources/UICoreKit/UICoreKit.swift, + Tests/UICoreKitTests/UICoreKitTests.swift, + ); + target = FB32E77A25768F45000C4F42 /* ASIGListKitSPM */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 0AB6754A2EA439C1003D806F /* UICoreKit */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (0A316B682EA51EBA00F5DB16 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = UICoreKit; sourceTree = ""; }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + FB32E77825768F45000C4F42 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0A31690D2EA51D4600F5DB16 /* UICoreKit 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 = ( + 0AB6754A2EA439C1003D806F /* UICoreKit */, + 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 = ( + ); + fileSystemSynchronizedGroups = ( + 0AB6754A2EA439C1003D806F /* UICoreKit */, + ); + name = ASIGListKitSPM; + packageProductDependencies = ( + 0A31690C2EA51D4600F5DB16 /* UICoreKit */, + ); + 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 = ( + 0A31690B2EA51D4600F5DB16 /* XCLocalSwiftPackageReference "ASIGListKitSPM/UICoreKit" */, + ); + 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 */ + 0A31690B2EA51D4600F5DB16 /* XCLocalSwiftPackageReference "ASIGListKitSPM/UICoreKit" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = ASIGListKitSPM/UICoreKit; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 0A31690C2EA51D4600F5DB16 /* UICoreKit */ = { + isa = XCSwiftPackageProductDependency; + productName = UICoreKit; + }; +/* 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/UICoreKit/.gitignore b/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/.gitignore new file mode 100644 index 000000000..0023a5340 --- /dev/null +++ b/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/.gitignore @@ -0,0 +1,8 @@ +.DS_Store +/.build +/Packages +xcuserdata/ +DerivedData/ +.swiftpm/configuration/registries.json +.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +.netrc diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Package.swift b/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Package.swift new file mode 100644 index 000000000..e476162b5 --- /dev/null +++ b/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Package.swift @@ -0,0 +1,44 @@ +// swift-tools-version: 6.2 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "UICoreKit", + platforms: [ + .iOS(.v14), + .macCatalyst(.v13) + ], + products: [ + .library( + name: "UICoreKit", + targets: ["UICoreKit"] + ) + ], + dependencies: [ + // 1. Added Texture package + .package( + path: "../../../../", + // 2. IMPORTANT!! SET trait `IGListKit` + traits: [ + .init(name: "IGListKit") + ] + ) + ], + targets: [ + .target( + name: "UICoreKit", + dependencies: [ + .product(name: "AsyncDisplayKit", package: "Texture"), + .product(name: "TextureIGListKitExtensions", package: "Texture") + ], + swiftSettings: [ + .enableExperimentalFeature("AccessLevelOnImport") + ] + ), + .testTarget( + name: "UICoreKitTests", + dependencies: ["UICoreKit"] + ) + ] + ) diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Sources/UICoreKit/UICoreKit.swift b/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Sources/UICoreKit/UICoreKit.swift new file mode 100644 index 000000000..d2008e87d --- /dev/null +++ b/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Sources/UICoreKit/UICoreKit.swift @@ -0,0 +1 @@ +public import TextureIGListKitExtensions diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Tests/UICoreKitTests/UICoreKitTests.swift b/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Tests/UICoreKitTests/UICoreKitTests.swift new file mode 100644 index 000000000..ae63f2df6 --- /dev/null +++ b/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Tests/UICoreKitTests/UICoreKitTests.swift @@ -0,0 +1,6 @@ +import Testing +@testable import UICoreKit + +@Test func example() async throws { + // Write your test here and use APIs like `#expect(...)` to check expected conditions. +} 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/SPMWithIGListKit/README.md b/examples/SPMWithIGListKit/README.md index cd39f43fd..e9efdc88e 100644 --- a/examples/SPMWithIGListKit/README.md +++ b/examples/SPMWithIGListKit/README.md @@ -1,12 +1,19 @@ -# SPM With IGListKit Example +# SPMWithIGListKit Example -This example demonstrates how to use the IGListKit trait with Texture via Swift Package Manager. +This example demonstrates how to use Texture with IGListKit in a Swift Package Manager library project. -## What This Example Tests +## What This Example Shows -This example verifies that when you enable the IGListKit trait in your Package.swift, the IGListKit dependency is resolved and available for use alongside Texture's ASCollectionNode. +- Enabling IGListKit trait in a SPM package +- Using Pure Swift API for Texture + IGListKit integration +- Testing that trait activation works correctly -## Package.swift Trait Syntax +## Key Files + +- **Package.swift** - Shows how to enable IGListKit trait +- **Tests/** - Verifies trait enables IGListKit dependency correctly + +## Package.swift Configuration ```swift dependencies: [ @@ -20,70 +27,38 @@ dependencies: [ ] ``` -## What Gets Enabled - -When the IGListKit trait is enabled: - -1. **IGListKit dependency** is resolved and added to your project -2. **IGListDiffKit** (part of IGListKit) is also available -3. You can use both **Texture** (ASCollectionNode, ASDisplayNode, etc.) and **IGListKit** (ListAdapter, ListSectionController, etc.) together +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: - -```bash -xcodebuild -scheme SPMWithIGListKit -sdk iphonesimulator -destination 'platform=iOS Simulator,OS=26.0,name=iPhone 17' 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: - -```bash -xcodebuild -scheme SPMWithIGListKit -sdk iphonesimulator -destination 'platform=iOS Simulator,OS=26.0,name=iPhone 17' test +# Or with xcodebuild +xcodebuild -scheme SPMWithIGListKit -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 17' test ``` -## Tests - -The test suite verifies: - -- ✓ IGListKit dependency is resolved and classes are available -- ✓ Basic IGListKit objects (ListAdapter, ListAdapterUpdater) can be created -- ✓ ASCollectionNode from Texture is available -- ✓ Both frameworks can be used together - -## Usage in Your App - -```swift -import AsyncDisplayKit -import IGListKit - -// Use Texture's ASCollectionNode -let layout = UICollectionViewFlowLayout() -let collectionNode = ASCollectionNode(collectionViewLayout: layout) - -// Use IGListKit's ListAdapter -let updater = ListAdapterUpdater() -let adapter = ListAdapter(updater: updater, viewController: self) - -// Connect them (requires additional integration code from Texture) -// See Texture source: IGListAdapter+AsyncDisplayKit.h -``` +## For iOS/tvOS App Projects -## Note +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. -The Texture+IGListKit integration APIs (`IGListAdapter.setASDKCollectionNode(_:)`, `ASIGListSectionControllerMethods`, etc.) are Objective-C extensions that may require additional bridging to use from Swift. This example focuses on verifying that the trait enables the IGListKit dependency correctly. +## Complete Documentation -## Learn More +For detailed documentation on: +- Pure Swift API usage +- Section controller implementation +- iOS/tvOS app integration +- Migration from CocoaPods -- **IGListKit**: https://github.com/Instagram/IGListKit -- **Texture Documentation**: http://texturegroup.org +See: [TextureIGListKitExtensions README](../../Sources/TextureIGListKitExtensions/README.md) From 68ad15d592c6dc81c7dad06e0ce922601fd95cb2 Mon Sep 17 00:00:00 2001 From: Petro Rovenskyi Date: Sun, 19 Oct 2025 18:04:34 +0300 Subject: [PATCH 04/10] Update Swift tools version to 6.1 and add SPM badge - Change swift-tools-version from 6.2 to 6.1 in all Package.swift files - Package Traits feature was introduced in Swift 6.1 (SE-0450) - Update documentation to reflect Swift 6.1+ requirement - Add Swift Package Manager badge to README --- Package.swift | 2 +- README.md | 1 + Sources/TextureIGListKitExtensions/README.md | 4 ++-- .../ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Package.swift | 2 +- examples/SPMWithIGListKit/Package.swift | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Package.swift b/Package.swift index 147fabe94..11b5fb414 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version: 6.2 +// swift-tools-version: 6.1 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription diff --git a/README.md b/README.md index e74be6b9a..d5970cacd 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ [![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 diff --git a/Sources/TextureIGListKitExtensions/README.md b/Sources/TextureIGListKitExtensions/README.md index 78f131886..b81b944af 100644 --- a/Sources/TextureIGListKitExtensions/README.md +++ b/Sources/TextureIGListKitExtensions/README.md @@ -104,7 +104,7 @@ YourApp/ **Step 2: Configure Package.swift** ```swift -// swift-tools-version: 6.2 +// swift-tools-version: 6.1 import PackageDescription let package = Package( @@ -411,7 +411,7 @@ These examples demonstrate: ## Requirements - iOS 14.0+ / tvOS 14.0+ / Mac Catalyst 13.0+ -- Swift 6.2+ +- Swift 6.1+ - Texture (AsyncDisplayKit) via SPM with `IGListKit` trait enabled - IGListKit 5.0+ diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Package.swift b/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Package.swift index e476162b5..9735b1834 100644 --- a/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Package.swift +++ b/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version: 6.2 +// swift-tools-version: 6.1 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription diff --git a/examples/SPMWithIGListKit/Package.swift b/examples/SPMWithIGListKit/Package.swift index 100e4c182..ea9e6be86 100644 --- a/examples/SPMWithIGListKit/Package.swift +++ b/examples/SPMWithIGListKit/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version: 6.2 +// swift-tools-version: 6.1 import PackageDescription let package = Package( From 136e47fae51aae60760a51a44fefdada9f5e2c74 Mon Sep 17 00:00:00 2001 From: Petro Rovenskyi Date: Tue, 21 Oct 2025 14:47:48 +0300 Subject: [PATCH 05/10] Remove deprecated AssetsLibrary and non-functional Video/MapKit/Photos SPM traits - Remove AssetsLibrary (deprecated iOS 9.0) - Remove Video/MapKit/Photos traits that don't work with Swift via SPM - Update documentation explaining SPM limitations with conditional compilation - Recommend CocoaPods/Carthage for users needing these features Technical details: Objective-C classes wrapped in preprocessor conditionals (#if AS_USE_VIDEO) are not exported in Swift module interface, making these traits non-functional for Swift users even when enabled. Tests: spm-texture-basic and spm-texture-iglistkit pass --- Package.swift | 37 ++++++------------ README.md | 33 ++++++++++------ examples/SPMBasic/README.md | 38 +++++++------------ .../SPMBasic/Tests/DefaultTraitsTests.swift | 7 ++-- 4 files changed, 50 insertions(+), 65 deletions(-) diff --git a/Package.swift b/Package.swift index 11b5fb414..0ea96d566 100644 --- a/Package.swift +++ b/Package.swift @@ -33,21 +33,7 @@ let package = Package( ) ], traits: [ - // Default traits - enabled by default for backwards compatibility with CocoaPods - .default(enabledTraits: [ - "Video", - "MapKit", - "Photos", - "AssetsLibrary" - ]), - - // Define all traits with descriptions - .init(name: "Video", description: "Video node support with AVFoundation and CoreMedia"), - .init(name: "MapKit", description: "MapKit integration for map nodes"), - .init(name: "Photos", description: "Photos framework support"), - .init(name: "AssetsLibrary", description: "Legacy AssetsLibrary support (iOS only)"), - - // Optional traits - must be explicitly enabled + // Optional traits .init(name: "IGListKit", description: "IGListKit integration for advanced collection view support") ], dependencies: [ @@ -65,20 +51,22 @@ let package = Package( path: "spm/Sources/AsyncDisplayKit", publicHeadersPath: "include", cSettings: [ - // PINRemoteImage is always available + // Always available features .define("AS_PIN_REMOTE_IMAGE", to: "1"), // Disable old TextNode by default for SPM .define("AS_ENABLE_TEXTNODE", to: "0"), // Trait-based conditional defines - .define("AS_USE_VIDEO", to: "1", .when(traits: ["Video"])), - .define("AS_USE_MAPKIT", to: "1", .when(traits: ["MapKit"])), - .define("AS_USE_PHOTOS", to: "1", .when(traits: ["Photos"])), - .define("AS_USE_ASSETS_LIBRARY", to: "1", .when(traits: ["AssetsLibrary"])), .define("AS_IG_LIST_KIT", to: "1", .when(traits: ["IGListKit"])), .define("AS_IG_LIST_DIFF_KIT", to: "1", .when(traits: ["IGListKit"])), + // 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"), @@ -115,13 +103,10 @@ let package = Package( .headerSearchPath("tvOS") ], linkerSettings: [ - .linkedFramework("AVFoundation", .when(traits: ["Video"])), - .linkedFramework("CoreMedia", .when(traits: ["Video"])), - .linkedFramework("CoreLocation", .when(traits: ["MapKit"])), - .linkedFramework("MapKit", .when(traits: ["MapKit"])), - .linkedFramework("Photos", .when(traits: ["Photos"])), - .linkedFramework("AssetsLibrary", .when(platforms: [.iOS], traits: ["AssetsLibrary"])), .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( diff --git a/README.md b/README.md index d5970cacd..7035ea87d 100644 --- a/README.md +++ b/README.md @@ -41,14 +41,23 @@ targets: [ ``` **Default Features (included automatically):** -- Core AsyncDisplayKit (ASDisplayNode, ASImageNode, ASTextNode, etc.) +- Core AsyncDisplayKit (ASDisplayNode, ASImageNode, ASTextNode2, ASButtonNode, etc.) - PINRemoteImage integration (ASPINRemoteImageDownloader) -- Video support (AVFoundation, CoreMedia) -- MapKit integration -- Photos framework -- AssetsLibrary (iOS only) +- Collection views (ASCollectionNode, ASTableNode) +- Layout specs (ASStackLayoutSpec, ASInsetLayoutSpec, etc.) +- TextNode2 (modern text rendering, replaces legacy TextNode) -**No trait configuration needed** - all these features work out of the box! +**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 @@ -95,16 +104,18 @@ If you're migrating from CocoaPods, here's how the subspecs map to SPM features: |---------|-----------|-----|-------| | **Core** | `pod 'Texture'` (default) | `.product(name: "AsyncDisplayKit", ...)` | ✅ Always included | | **PINRemoteImage** | Included by default | Always included | ✅ Same behavior | -| **Video** | Included by default | Default trait (enabled) | ✅ Same behavior | -| **MapKit** | Included by default | Default trait (enabled) | ✅ Same behavior | -| **Photos** | Included by default | Default trait (enabled) | ✅ Same behavior | -| **AssetsLibrary** | Included by default | Default trait (enabled) | ✅ Same behavior | -| **IGListKit** | `pod 'Texture/IGListKit'` | Trait + product (see above) | ⚠️ Uses IGListKit 5.0+ | +| **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 diff --git a/examples/SPMBasic/README.md b/examples/SPMBasic/README.md index 3f5398d50..aadd3d8e0 100644 --- a/examples/SPMBasic/README.md +++ b/examples/SPMBasic/README.md @@ -1,37 +1,25 @@ # SPM Basic Example -This example demonstrates basic Texture usage via Swift Package Manager with default traits. +This example demonstrates basic Texture usage via Swift Package Manager. -## Features +## What This Tests -This example uses Texture with default traits enabled: -- Video support (AVFoundation, CoreMedia) -- MapKit integration -- Photos framework -- AssetsLibrary (iOS only) +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) -## Building +## SPM Limitations -From this directory: +**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. -```bash -swift build -``` +## Running Tests -## Running +From the repository root: ```bash -swift run +./build.sh spm-texture-basic ``` -Expected output: -``` -✓ Texture (AsyncDisplayKit) imported successfully via SPM! -Creating basic nodes... -✓ ASDisplayNode created -✓ ASImageNode created -✓ ASTextNode created - -✅ All basic Texture features are working with SPM! -Default traits enabled: Video, MapKit, Photos, AssetsLibrary -``` +This will build and run all tests to verify core Texture functionality works correctly with SPM. diff --git a/examples/SPMBasic/Tests/DefaultTraitsTests.swift b/examples/SPMBasic/Tests/DefaultTraitsTests.swift index 6b9b404be..f300d5c10 100644 --- a/examples/SPMBasic/Tests/DefaultTraitsTests.swift +++ b/examples/SPMBasic/Tests/DefaultTraitsTests.swift @@ -4,9 +4,10 @@ import AsyncDisplayKit /// Tests that verify basic Texture functionality works via SPM /// -/// Note: Default traits (Video, MapKit, Photos, AssetsLibrary) are enabled, -/// but trait-specific Objective-C classes may not be accessible from Swift -/// without additional bridging. These tests focus on core Texture functionality. +/// 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 { From f45c29d3aaed708ffa27b060bbd1d42c2c102f40 Mon Sep 17 00:00:00 2001 From: Petro Rovenskyi Date: Tue, 21 Oct 2025 23:10:13 +0300 Subject: [PATCH 06/10] Add Swift wrapper for IGListKit supplementary views - Add SupplementaryViewSourceMethods enum with viewForSupplementaryElement and sizeForSupplementaryView - Replaces unavailable ASIGListSupplementaryViewSourceMethods for SPM users - Comprehensive documentation with step-by-step examples - Migration guide from Objective-C implementation Fixes issue where ASIGListSupplementaryViewSourceMethods is inaccessible from Swift when using SPM with traits due to #if AS_IG_LIST_KIT wrapping. --- .../IGListAdapter+Texture.swift | 210 ++++++++++++++++++ Sources/TextureIGListKitExtensions/README.md | 186 +++++++++++++++- 2 files changed, 393 insertions(+), 3 deletions(-) diff --git a/Sources/TextureIGListKitExtensions/IGListAdapter+Texture.swift b/Sources/TextureIGListKitExtensions/IGListAdapter+Texture.swift index 164b3b1de..b3cb1c658 100644 --- a/Sources/TextureIGListKitExtensions/IGListAdapter+Texture.swift +++ b/Sources/TextureIGListKitExtensions/IGListAdapter+Texture.swift @@ -269,6 +269,216 @@ public import IGListKit } } +// 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 { diff --git a/Sources/TextureIGListKitExtensions/README.md b/Sources/TextureIGListKitExtensions/README.md index b81b944af..af843d994 100644 --- a/Sources/TextureIGListKitExtensions/README.md +++ b/Sources/TextureIGListKitExtensions/README.md @@ -36,7 +36,7 @@ If you're currently using Texture with IGListKit via CocoaPods or Carthage, plea When you `import TextureIGListKitExtensions`, you get: -1. **One extension method:** +1. **ListAdapter extension method:** ```swift extension ListAdapter { @MainActor @@ -44,7 +44,23 @@ When you `import TextureIGListKitExtensions`, you get: } ``` -2. **Re-exported modules** (via `public import`): +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.) @@ -58,6 +74,17 @@ 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) ``` @@ -343,9 +370,147 @@ class MyCellNode: ASCellNode { } ``` +### 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 two components: +The module consists of three components: ### 1. `IGListAdapterDataSourceBridge` (internal) A bridge class that: @@ -365,6 +530,21 @@ The public API that: - 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 From 6b83e85f5930a2180df106b1ed91f830ff06a9fa Mon Sep 17 00:00:00 2001 From: Petro Rovenskyi Date: Sat, 25 Oct 2025 21:33:35 +0300 Subject: [PATCH 07/10] Update SPM sources layout script and add symlinks for ASDefaultImageDownloader --- scripts/generate_spm_sources_layout.swift | 16 +++++++++------- .../AsyncDisplayKit/ASDefaultImageDownloader.mm | 1 + .../AsyncDisplayKit/ASDefaultImageDownloader.h | 1 + 3 files changed, 11 insertions(+), 7 deletions(-) create mode 120000 spm/Sources/AsyncDisplayKit/ASDefaultImageDownloader.mm create mode 120000 spm/Sources/AsyncDisplayKit/include/AsyncDisplayKit/ASDefaultImageDownloader.h diff --git a/scripts/generate_spm_sources_layout.swift b/scripts/generate_spm_sources_layout.swift index d9f9a4582..07817ec38 100755 --- a/scripts/generate_spm_sources_layout.swift +++ b/scripts/generate_spm_sources_layout.swift @@ -225,16 +225,18 @@ func cleanup(at: String) { } func generateSPM(publicHeadersPath: String, sourcesPath: String) { - // 1. Delete all existing symlinks + // 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) - // 2. Find all public headers + // 3. Find all public headers var publicHeaders: [String] = [] publicHeadersLayout.forEach { (headerLayout) in let fPath = projectRoot + "/" + headerLayout.path - // 2.1. Is it path to a file and not folder? + // 3.1. Is it path to a file and not folder? // Just grab it. guard headerLayout.isDir else { assert(FileManager.default.fileExists(atPath: fPath), @@ -242,7 +244,7 @@ func generateSPM(publicHeadersPath: String, sourcesPath: String) { publicHeaders.append(fPath) return } - // 2.2. It's a folder path, search. + // 3.2. It's a folder path, search. switch headerLayout.searchPattern { case .currentDirOnly: let currentFolder = publicHeadersOnlyFromCurrent(directory: fPath) @@ -253,11 +255,11 @@ func generateSPM(publicHeadersPath: String, sourcesPath: String) { } } - // 3. Find private headers and impl files. + // 4. Find private headers and impl files. let privateSources: [String] = privateHeadersAndImpl(sources: sourceFolder, publicHeaders: publicHeaders) - // 4. For SPM: ALL headers (public + private) must be in publicHeadersPath + // 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 @@ -267,7 +269,7 @@ func generateSPM(publicHeadersPath: String, sourcesPath: String) { } createSymLinks(for: relativeHeadersPath, atPath: publicHeadersPath) - // 5. Create symbolic links for implementation files (.mm, .m) in target root + // 6. Create symbolic links for implementation files (.mm, .m) in target root let implFiles = privateSources.filter { $0.hasSuffix(".mm") || $0.hasSuffix(".m") } let relativeSourcesPath = implFiles.map { (sourcePath) -> String in let relativePath = sourcePath.replacingOccurrences(of: projectRoot, 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/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 From ce0466cde20681e2ae4d6d3c6017cdc1df471133 Mon Sep 17 00:00:00 2001 From: Petro Rovenskyi Date: Sat, 25 Oct 2025 23:26:01 +0300 Subject: [PATCH 08/10] Refactor SPM integration and remove UICoreKit example - Updated Package.swift to enhance SPM source distribution for Texture, including detailed documentation on IGListKit integration and limitations. - Removed deprecated UICoreKit example, including its Package.swift, source files, and tests, to streamline the project. - Added module.modulemap for AsyncDisplayKit to eliminate umbrella header warnings. - Adjusted build settings in project.pbxproj to reflect the removal of UICoreKit and ensure proper integration of TextureIGListKitExtensions. --- Package.swift | 49 ++++++++++--------- .../IGListAdapter+Texture.swift | 1 + .../ASIGListKitSPM.xcodeproj/project.pbxproj | 38 ++++---------- .../ASIGListKitSPM/UICoreKit/.gitignore | 8 --- .../ASIGListKitSPM/UICoreKit/Package.swift | 44 ----------------- .../Sources/UICoreKit/UICoreKit.swift | 1 - .../Tests/UICoreKitTests/UICoreKitTests.swift | 6 --- scripts/generate_spm_sources_layout.swift | 25 +++++++++- .../AsyncDisplayKit/include/module.modulemap | 6 +++ 9 files changed, 67 insertions(+), 111 deletions(-) delete mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/.gitignore delete mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Package.swift delete mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Sources/UICoreKit/UICoreKit.swift delete mode 100644 examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Tests/UICoreKitTests/UICoreKitTests.swift create mode 100644 spm/Sources/AsyncDisplayKit/include/module.modulemap diff --git a/Package.swift b/Package.swift index 0ea96d566..fad3a8d8b 100644 --- a/Package.swift +++ b/Package.swift @@ -3,17 +3,27 @@ import PackageDescription -// AsyncDisplayKit dependencies -let igListKitDep: Target.Dependency = .product( - name: "IGListKit", - package: "IGListKit", - condition: .when(traits: ["IGListKit"]) -) -let igListDiffKitDep: Target.Dependency = .product( - name: "IGListDiffKit", - package: "IGListKit", - condition: .when(traits: ["IGListKit"]) -) +// 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", @@ -32,10 +42,6 @@ let package = Package( targets: ["TextureIGListKitExtensions"] ) ], - traits: [ - // Optional traits - .init(name: "IGListKit", description: "IGListKit integration for advanced collection view support") - ], dependencies: [ .package(url: "https://github.com/pinterest/PINRemoteImage.git", from: "3.0.4"), .package(url: "https://github.com/Instagram/IGListKit", from: "5.0.0") @@ -44,9 +50,7 @@ let package = Package( .target( name: "AsyncDisplayKit", dependencies: [ - "PINRemoteImage", - igListKitDep, - igListDiffKitDep + "PINRemoteImage" ], path: "spm/Sources/AsyncDisplayKit", publicHeadersPath: "include", @@ -57,9 +61,9 @@ let package = Package( // Disable old TextNode by default for SPM .define("AS_ENABLE_TEXTNODE", to: "0"), - // Trait-based conditional defines - .define("AS_IG_LIST_KIT", to: "1", .when(traits: ["IGListKit"])), - .define("AS_IG_LIST_DIFF_KIT", to: "1", .when(traits: ["IGListKit"])), + // 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 @@ -113,7 +117,8 @@ let package = Package( name: "TextureIGListKitExtensions", dependencies: [ "AsyncDisplayKit", - igListKitDep + .product(name: "IGListKit", package: "IGListKit"), + .product(name: "IGListDiffKit", package: "IGListKit") ], path: "Sources/TextureIGListKitExtensions", swiftSettings: [ diff --git a/Sources/TextureIGListKitExtensions/IGListAdapter+Texture.swift b/Sources/TextureIGListKitExtensions/IGListAdapter+Texture.swift index b3cb1c658..dfe5915b8 100644 --- a/Sources/TextureIGListKitExtensions/IGListAdapter+Texture.swift +++ b/Sources/TextureIGListKitExtensions/IGListAdapter+Texture.swift @@ -10,6 +10,7 @@ import Foundation import ObjectiveC public import AsyncDisplayKit public import IGListKit +public import IGListDiffKit /// Pure Swift data source bridge between IGListKit and AsyncDisplayKit /// diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/project.pbxproj b/examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/project.pbxproj index a323a51cf..60c7eee2f 100644 --- a/examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/project.pbxproj +++ b/examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/project.pbxproj @@ -3,11 +3,11 @@ archiveVersion = 1; classes = { }; - objectVersion = 70; + objectVersion = 60; objects = { /* Begin PBXBuildFile section */ - 0A31690D2EA51D4600F5DB16 /* UICoreKit in Frameworks */ = {isa = PBXBuildFile; productRef = 0A31690C2EA51D4600F5DB16 /* UICoreKit */; }; + 0A069C022EAD66A0008ABA37 /* TextureIGListKitExtensions in Frameworks */ = {isa = PBXBuildFile; productRef = 0A069C012EAD66A0008ABA37 /* TextureIGListKitExtensions */; }; 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 */; }; @@ -388,28 +388,12 @@ FB3894B4257705EF0025252E /* Item.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Item.swift; sourceTree = ""; }; /* End PBXFileReference section */ -/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ - 0A316B682EA51EBA00F5DB16 /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = { - isa = PBXFileSystemSynchronizedBuildFileExceptionSet; - membershipExceptions = ( - Package.swift, - Sources/UICoreKit/UICoreKit.swift, - Tests/UICoreKitTests/UICoreKitTests.swift, - ); - target = FB32E77A25768F45000C4F42 /* ASIGListKitSPM */; - }; -/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ - -/* Begin PBXFileSystemSynchronizedRootGroup section */ - 0AB6754A2EA439C1003D806F /* UICoreKit */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (0A316B682EA51EBA00F5DB16 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = UICoreKit; sourceTree = ""; }; -/* End PBXFileSystemSynchronizedRootGroup section */ - /* Begin PBXFrameworksBuildPhase section */ FB32E77825768F45000C4F42 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0A31690D2EA51D4600F5DB16 /* UICoreKit in Frameworks */, + 0A069C022EAD66A0008ABA37 /* TextureIGListKitExtensions in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -582,7 +566,6 @@ FB32E77D25768F45000C4F42 /* ASIGListKitSPM */ = { isa = PBXGroup; children = ( - 0AB6754A2EA439C1003D806F /* UICoreKit */, FB3894AE2577054F0025252E /* Extensions */, FB3894AD2577053C0025252E /* Models */, FB3894A9257704EF0025252E /* Section Controllers */, @@ -644,12 +627,9 @@ ); dependencies = ( ); - fileSystemSynchronizedGroups = ( - 0AB6754A2EA439C1003D806F /* UICoreKit */, - ); name = ASIGListKitSPM; packageProductDependencies = ( - 0A31690C2EA51D4600F5DB16 /* UICoreKit */, + 0A069C012EAD66A0008ABA37 /* TextureIGListKitExtensions */, ); productName = ASIGListKitSPM; productReference = FB32E77B25768F45000C4F42 /* ASIGListKitSPM.app */; @@ -679,7 +659,7 @@ ); mainGroup = FB32E77225768F45000C4F42; packageReferences = ( - 0A31690B2EA51D4600F5DB16 /* XCLocalSwiftPackageReference "ASIGListKitSPM/UICoreKit" */, + 0A069C002EAD66A0008ABA37 /* XCLocalSwiftPackageReference "../../../Texture" */, ); productRefGroup = FB32E77C25768F45000C4F42 /* Products */; projectDirPath = ""; @@ -1313,16 +1293,16 @@ /* End XCConfigurationList section */ /* Begin XCLocalSwiftPackageReference section */ - 0A31690B2EA51D4600F5DB16 /* XCLocalSwiftPackageReference "ASIGListKitSPM/UICoreKit" */ = { + 0A069C002EAD66A0008ABA37 /* XCLocalSwiftPackageReference "../../../Texture" */ = { isa = XCLocalSwiftPackageReference; - relativePath = ASIGListKitSPM/UICoreKit; + relativePath = ../../../Texture; }; /* End XCLocalSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 0A31690C2EA51D4600F5DB16 /* UICoreKit */ = { + 0A069C012EAD66A0008ABA37 /* TextureIGListKitExtensions */ = { isa = XCSwiftPackageProductDependency; - productName = UICoreKit; + productName = TextureIGListKitExtensions; }; /* End XCSwiftPackageProductDependency section */ }; diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/.gitignore b/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/.gitignore deleted file mode 100644 index 0023a5340..000000000 --- a/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -.DS_Store -/.build -/Packages -xcuserdata/ -DerivedData/ -.swiftpm/configuration/registries.json -.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata -.netrc diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Package.swift b/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Package.swift deleted file mode 100644 index 9735b1834..000000000 --- a/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Package.swift +++ /dev/null @@ -1,44 +0,0 @@ -// swift-tools-version: 6.1 -// The swift-tools-version declares the minimum version of Swift required to build this package. - -import PackageDescription - -let package = Package( - name: "UICoreKit", - platforms: [ - .iOS(.v14), - .macCatalyst(.v13) - ], - products: [ - .library( - name: "UICoreKit", - targets: ["UICoreKit"] - ) - ], - dependencies: [ - // 1. Added Texture package - .package( - path: "../../../../", - // 2. IMPORTANT!! SET trait `IGListKit` - traits: [ - .init(name: "IGListKit") - ] - ) - ], - targets: [ - .target( - name: "UICoreKit", - dependencies: [ - .product(name: "AsyncDisplayKit", package: "Texture"), - .product(name: "TextureIGListKitExtensions", package: "Texture") - ], - swiftSettings: [ - .enableExperimentalFeature("AccessLevelOnImport") - ] - ), - .testTarget( - name: "UICoreKitTests", - dependencies: ["UICoreKit"] - ) - ] - ) diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Sources/UICoreKit/UICoreKit.swift b/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Sources/UICoreKit/UICoreKit.swift deleted file mode 100644 index d2008e87d..000000000 --- a/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Sources/UICoreKit/UICoreKit.swift +++ /dev/null @@ -1 +0,0 @@ -public import TextureIGListKitExtensions diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Tests/UICoreKitTests/UICoreKitTests.swift b/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Tests/UICoreKitTests/UICoreKitTests.swift deleted file mode 100644 index ae63f2df6..000000000 --- a/examples/ASIGListKitSPM/ASIGListKitSPM/UICoreKit/Tests/UICoreKitTests/UICoreKitTests.swift +++ /dev/null @@ -1,6 +0,0 @@ -import Testing -@testable import UICoreKit - -@Test func example() async throws { - // Write your test here and use APIs like `#expect(...)` to check expected conditions. -} diff --git a/scripts/generate_spm_sources_layout.swift b/scripts/generate_spm_sources_layout.swift index 07817ec38..027f16f56 100755 --- a/scripts/generate_spm_sources_layout.swift +++ b/scripts/generate_spm_sources_layout.swift @@ -269,7 +269,30 @@ func generateSPM(publicHeadersPath: String, sourcesPath: String) { } createSymLinks(for: relativeHeadersPath, atPath: publicHeadersPath) - // 6. Create symbolic links for implementation files (.mm, .m) in target root + // 6. Create module.modulemap to eliminate umbrella header warnings + // Using umbrella directory instead of umbrella header to include all headers + let modulemapContent = """ +module AsyncDisplayKit { + umbrella "AsyncDisplayKit" + + export * + module * { export * } +} +""" + // publicHeadersPath ends with "/AsyncDisplayKit" + // We need parent directory: remove last path component + let publicHeadersComponents = publicHeadersPath.components(separatedBy: "/") + let includeComponents = publicHeadersComponents.dropLast() + let includePath = includeComponents.joined(separator: "/") + let modulemapPath = includePath + "/module.modulemap" + + do { + try modulemapContent.write(toFile: modulemapPath, atomically: true, encoding: .utf8) + } catch { + fatalError("Failed to write module.modulemap to \(modulemapPath): \(error.localizedDescription)") + } + + // 7. Create symbolic links for implementation files (.mm, .m) in target root let implFiles = privateSources.filter { $0.hasSuffix(".mm") || $0.hasSuffix(".m") } let relativeSourcesPath = implFiles.map { (sourcePath) -> String in let relativePath = sourcePath.replacingOccurrences(of: projectRoot, diff --git a/spm/Sources/AsyncDisplayKit/include/module.modulemap b/spm/Sources/AsyncDisplayKit/include/module.modulemap new file mode 100644 index 000000000..93bd61630 --- /dev/null +++ b/spm/Sources/AsyncDisplayKit/include/module.modulemap @@ -0,0 +1,6 @@ +module AsyncDisplayKit { + umbrella "AsyncDisplayKit" + + export * + module * { export * } +} \ No newline at end of file From 828cfa54e7b2bec0729af2474263101fae0dce3b Mon Sep 17 00:00:00 2001 From: Petro Rovenskyi Date: Mon, 27 Oct 2025 11:22:29 +0200 Subject: [PATCH 09/10] - Improved structure and clarity of the README to facilitate better understanding for developers integrating with iOS/tvOS projects. --- Sources/TextureIGListKitExtensions/README.md | 59 +++++++++++--------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/Sources/TextureIGListKitExtensions/README.md b/Sources/TextureIGListKitExtensions/README.md index af843d994..5f2da3b1a 100644 --- a/Sources/TextureIGListKitExtensions/README.md +++ b/Sources/TextureIGListKitExtensions/README.md @@ -4,33 +4,49 @@ Pure Swift implementation of IGListKit integration for Texture (AsyncDisplayKit) ## Quick Summary -- **What it does:** Connects `IGListAdapter` with `ASCollectionNode` in SPM builds -- **Why needed:** SPM traits don't work with Objective-C `#if` directives -- **What you get:** One Swift extension method + re-exported modules (AsyncDisplayKit, IGListKit, IGListDiffKit) -- **API:** `adapter.setCollectionNode(node)` replaces `[adapter setASDKCollectionNode:node]` -- **Version:** Uses IGListKit 5.0+ (breaking changes from 4.x) +- **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 a single extension method to `IGListAdapter` that enables seamless integration with `ASCollectionNode`. +This module provides Swift extension methods for `IGListAdapter` to enable seamless integration with `ASCollectionNode`. -**Why this exists:** The original Objective-C implementation (`setASDKCollectionNode:` in `IGListAdapter+AsyncDisplayKit.mm`) doesn't compile in SPM builds because Swift Package Manager traits don't work with conditional compilation (`#if AS_IG_LIST_KIT`) in Objective-C code. This is a pure Swift reimplementation of that Objective-C code. +### 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 Version Differences +## ⚠️ Important: IGListKit 5.0+ Updates + +**This package uses IGListKit 5.0+ (latest major version)** with important API changes: + +### Key Changes from IGListKit 4.x -**SPM uses IGListKit 5.0+ (latest major version)** which includes breaking changes compared to versions used by CocoaPods/Carthage. +- `allowsBackgroundDiffing` (NEW) - enables background thread diffing for better performance +- `allowsBackgroundReloading` (REMOVED) - caused animation issues, automatically handled in 5.0+ -- **Not a drop-in replacement** - Migration and testing required -- **API differences** - IGListKit 5.0 has breaking changes from 4.x -- **Different target** - This is specifically for SPM users -- **No Carthage/CocoaPods support planned** - We recommend migrating to SPM +### Updated API Calls -If you're currently using Texture with IGListKit via CocoaPods or Carthage, please thoroughly test your integration when migrating to SPM. +**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 @@ -103,15 +119,7 @@ To connect them, you need special bridging code that: ## Using in iOS/tvOS App Projects -### The Problem - -As of Xcode 26.0.1, Xcode does not provide a UI for enabling SPM package traits in iOS/tvOS app targets. Traits can only be enabled in Package.swift files, which app projects do not have. - -Note: If you are using a newer version of Xcode, check whether Apple has added trait configuration support in the Xcode UI. - -### The Solution - -Create an intermediate local Swift package to enable the IGListKit trait. +Simply add Texture as a dependency and import both modules: **Step 1: Create Package Structure** @@ -150,10 +158,7 @@ let package = Package( dependencies: [ .package( url: "https://github.com/TextureGroup/Texture.git", - from: "3.3.0", - traits: [ - .init(name: "IGListKit") // Enable IGListKit trait - ] + from: "3.3.0" ) ], targets: [ From 5eec9cde54baa5c900690281e6e151ca24fab934 Mon Sep 17 00:00:00 2001 From: Petro Rovenskyi Date: Mon, 27 Oct 2025 12:15:28 +0200 Subject: [PATCH 10/10] Update CI workflow and project configuration for AsyncDisplayKit integration - Removed the custom module.modulemap for AsyncDisplayKit to prevent issues with C++ headers, allowing SPM to generate its own automatically. --- .github/workflows/ci.yml | 6 ++-- .../ASIGListKitSPM.xcodeproj/project.pbxproj | 8 ++++++ scripts/generate_spm_sources_layout.swift | 28 +++---------------- .../AsyncDisplayKit/include/module.modulemap | 6 ---- 4 files changed, 15 insertions(+), 33 deletions(-) delete mode 100644 spm/Sources/AsyncDisplayKit/include/module.modulemap diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 325a36a32..b0d7682cc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,11 +21,11 @@ jobs: - mode: spm name: Verify that Swift Package Manager works - mode: spm-texture-basic - name: Test SPM with default traits (AsyncDisplayKit) + name: Test SPM basic integration (AsyncDisplayKit) - mode: spm-texture-iglistkit - name: Test SPM with IGListKit trait + name: Test SPM with IGListKit extensions - mode: spm-app-iglistkit - name: Test SPM iOS app with IGListKit (local package wrapper) + name: Test SPM iOS app with IGListKit - mode: examples-pt1 name: Build examples (examples-pt1) - mode: examples-pt2 diff --git a/examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/project.pbxproj b/examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/project.pbxproj index 60c7eee2f..72fe8958c 100644 --- a/examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/project.pbxproj +++ b/examples/ASIGListKitSPM/ASIGListKitSPM.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* 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 */; }; @@ -394,6 +395,7 @@ buildActionMask = 2147483647; files = ( 0A069C022EAD66A0008ABA37 /* TextureIGListKitExtensions in Frameworks */, + 0A069C122EAF7997008ABA37 /* AsyncDisplayKit in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -630,6 +632,7 @@ name = ASIGListKitSPM; packageProductDependencies = ( 0A069C012EAD66A0008ABA37 /* TextureIGListKitExtensions */, + 0A069C112EAF7997008ABA37 /* AsyncDisplayKit */, ); productName = ASIGListKitSPM; productReference = FB32E77B25768F45000C4F42 /* ASIGListKitSPM.app */; @@ -1304,6 +1307,11 @@ isa = XCSwiftPackageProductDependency; productName = TextureIGListKitExtensions; }; + 0A069C112EAF7997008ABA37 /* AsyncDisplayKit */ = { + isa = XCSwiftPackageProductDependency; + package = 0A069C002EAD66A0008ABA37 /* XCLocalSwiftPackageReference "../../../Texture" */; + productName = AsyncDisplayKit; + }; /* End XCSwiftPackageProductDependency section */ }; rootObject = FB32E77325768F45000C4F42 /* Project object */; diff --git a/scripts/generate_spm_sources_layout.swift b/scripts/generate_spm_sources_layout.swift index 027f16f56..fae76918c 100755 --- a/scripts/generate_spm_sources_layout.swift +++ b/scripts/generate_spm_sources_layout.swift @@ -46,6 +46,7 @@ let excludeFilePaths: [SearchPath] = [ // 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", @@ -269,30 +270,9 @@ func generateSPM(publicHeadersPath: String, sourcesPath: String) { } createSymLinks(for: relativeHeadersPath, atPath: publicHeadersPath) - // 6. Create module.modulemap to eliminate umbrella header warnings - // Using umbrella directory instead of umbrella header to include all headers - let modulemapContent = """ -module AsyncDisplayKit { - umbrella "AsyncDisplayKit" - - export * - module * { export * } -} -""" - // publicHeadersPath ends with "/AsyncDisplayKit" - // We need parent directory: remove last path component - let publicHeadersComponents = publicHeadersPath.components(separatedBy: "/") - let includeComponents = publicHeadersComponents.dropLast() - let includePath = includeComponents.joined(separator: "/") - let modulemapPath = includePath + "/module.modulemap" - - do { - try modulemapContent.write(toFile: modulemapPath, atomically: true, encoding: .utf8) - } catch { - fatalError("Failed to write module.modulemap to \(modulemapPath): \(error.localizedDescription)") - } - - // 7. Create symbolic links for implementation files (.mm, .m) in target root + // 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, diff --git a/spm/Sources/AsyncDisplayKit/include/module.modulemap b/spm/Sources/AsyncDisplayKit/include/module.modulemap deleted file mode 100644 index 93bd61630..000000000 --- a/spm/Sources/AsyncDisplayKit/include/module.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -module AsyncDisplayKit { - umbrella "AsyncDisplayKit" - - export * - module * { export * } -} \ No newline at end of file