diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 0000000..8fdeaa1 --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,2 @@ +out/ +node_modules/ \ No newline at end of file diff --git a/ios/backend/index.js b/ios/backend/index.js new file mode 100644 index 0000000..b7169f4 --- /dev/null +++ b/ios/backend/index.js @@ -0,0 +1,7 @@ +const fs = require("fs"); + +function main() { + // const files = fs.readdirSync("."); + const files = "ha"; + return files; +} diff --git a/ios/feedless.xcodeproj/project.pbxproj b/ios/feedless.xcodeproj/project.pbxproj new file mode 100644 index 0000000..62f1dc2 --- /dev/null +++ b/ios/feedless.xcodeproj/project.pbxproj @@ -0,0 +1,613 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 900BE2972458AEEC00C77595 /* Index.swift in Sources */ = {isa = PBXBuildFile; fileRef = 900BE2962458AEEC00C77595 /* Index.swift */; }; + 900BE29A2458B05800C77595 /* Login.swift in Sources */ = {isa = PBXBuildFile; fileRef = 900BE2992458B05800C77595 /* Login.swift */; }; + 900BE29E2458BBF600C77595 /* index.js in Resources */ = {isa = PBXBuildFile; fileRef = 900BE29D2458BBF600C77595 /* index.js */; }; + 902D04752458AAA7007CFE56 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 902D04742458AAA7007CFE56 /* AppDelegate.swift */; }; + 902D04772458AAA7007CFE56 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 902D04762458AAA7007CFE56 /* SceneDelegate.swift */; }; + 902D04792458AAA7007CFE56 /* Wall.swift in Sources */ = {isa = PBXBuildFile; fileRef = 902D04782458AAA7007CFE56 /* Wall.swift */; }; + 902D047B2458AAAA007CFE56 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 902D047A2458AAAA007CFE56 /* Assets.xcassets */; }; + 902D047E2458AAAA007CFE56 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 902D047D2458AAAA007CFE56 /* Preview Assets.xcassets */; }; + 902D04812458AAAA007CFE56 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 902D047F2458AAAA007CFE56 /* LaunchScreen.storyboard */; }; + 902D048C2458AAAA007CFE56 /* feedlessTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 902D048B2458AAAA007CFE56 /* feedlessTests.swift */; }; + 902D04972458AAAA007CFE56 /* feedlessUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 902D04962458AAAA007CFE56 /* feedlessUITests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 902D04882458AAAA007CFE56 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 902D04692458AAA7007CFE56 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 902D04702458AAA7007CFE56; + remoteInfo = feedless; + }; + 902D04932458AAAA007CFE56 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 902D04692458AAA7007CFE56 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 902D04702458AAA7007CFE56; + remoteInfo = feedless; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 900BE2962458AEEC00C77595 /* Index.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Index.swift; sourceTree = ""; }; + 900BE2992458B05800C77595 /* Login.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Login.swift; sourceTree = ""; }; + 900BE29D2458BBF600C77595 /* index.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = index.js; path = backend/index.js; sourceTree = SOURCE_ROOT; }; + 902D04712458AAA7007CFE56 /* feedless.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = feedless.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 902D04742458AAA7007CFE56 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 902D04762458AAA7007CFE56 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 902D04782458AAA7007CFE56 /* Wall.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Wall.swift; sourceTree = ""; }; + 902D047A2458AAAA007CFE56 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 902D047D2458AAAA007CFE56 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 902D04802458AAAA007CFE56 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 902D04822458AAAA007CFE56 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 902D04872458AAAA007CFE56 /* feedlessTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = feedlessTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 902D048B2458AAAA007CFE56 /* feedlessTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = feedlessTests.swift; sourceTree = ""; }; + 902D048D2458AAAA007CFE56 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 902D04922458AAAA007CFE56 /* feedlessUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = feedlessUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 902D04962458AAAA007CFE56 /* feedlessUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = feedlessUITests.swift; sourceTree = ""; }; + 902D04982458AAAA007CFE56 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 902D046E2458AAA7007CFE56 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 902D04842458AAAA007CFE56 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 902D048F2458AAAA007CFE56 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 900BE2982458AF0C00C77595 /* screens */ = { + isa = PBXGroup; + children = ( + 900BE2962458AEEC00C77595 /* Index.swift */, + 900BE2992458B05800C77595 /* Login.swift */, + 902D04782458AAA7007CFE56 /* Wall.swift */, + ); + path = screens; + sourceTree = ""; + }; + 902D04682458AAA7007CFE56 = { + isa = PBXGroup; + children = ( + 902D04732458AAA7007CFE56 /* feedless */, + 902D048A2458AAAA007CFE56 /* feedlessTests */, + 902D04952458AAAA007CFE56 /* feedlessUITests */, + 902D04722458AAA7007CFE56 /* Products */, + ); + sourceTree = ""; + }; + 902D04722458AAA7007CFE56 /* Products */ = { + isa = PBXGroup; + children = ( + 902D04712458AAA7007CFE56 /* feedless.app */, + 902D04872458AAAA007CFE56 /* feedlessTests.xctest */, + 902D04922458AAAA007CFE56 /* feedlessUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 902D04732458AAA7007CFE56 /* feedless */ = { + isa = PBXGroup; + children = ( + 900BE29D2458BBF600C77595 /* index.js */, + 900BE2982458AF0C00C77595 /* screens */, + 902D04742458AAA7007CFE56 /* AppDelegate.swift */, + 902D04762458AAA7007CFE56 /* SceneDelegate.swift */, + 902D047A2458AAAA007CFE56 /* Assets.xcassets */, + 902D047F2458AAAA007CFE56 /* LaunchScreen.storyboard */, + 902D04822458AAAA007CFE56 /* Info.plist */, + 902D047C2458AAAA007CFE56 /* Preview Content */, + ); + path = feedless; + sourceTree = ""; + }; + 902D047C2458AAAA007CFE56 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 902D047D2458AAAA007CFE56 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + 902D048A2458AAAA007CFE56 /* feedlessTests */ = { + isa = PBXGroup; + children = ( + 902D048B2458AAAA007CFE56 /* feedlessTests.swift */, + 902D048D2458AAAA007CFE56 /* Info.plist */, + ); + path = feedlessTests; + sourceTree = ""; + }; + 902D04952458AAAA007CFE56 /* feedlessUITests */ = { + isa = PBXGroup; + children = ( + 902D04962458AAAA007CFE56 /* feedlessUITests.swift */, + 902D04982458AAAA007CFE56 /* Info.plist */, + ); + path = feedlessUITests; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 902D04702458AAA7007CFE56 /* feedless */ = { + isa = PBXNativeTarget; + buildConfigurationList = 902D049B2458AAAA007CFE56 /* Build configuration list for PBXNativeTarget "feedless" */; + buildPhases = ( + 902D046D2458AAA7007CFE56 /* Sources */, + 902D046E2458AAA7007CFE56 /* Frameworks */, + 902D046F2458AAA7007CFE56 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = feedless; + productName = feedless; + productReference = 902D04712458AAA7007CFE56 /* feedless.app */; + productType = "com.apple.product-type.application"; + }; + 902D04862458AAAA007CFE56 /* feedlessTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 902D049E2458AAAA007CFE56 /* Build configuration list for PBXNativeTarget "feedlessTests" */; + buildPhases = ( + 902D04832458AAAA007CFE56 /* Sources */, + 902D04842458AAAA007CFE56 /* Frameworks */, + 902D04852458AAAA007CFE56 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 902D04892458AAAA007CFE56 /* PBXTargetDependency */, + ); + name = feedlessTests; + productName = feedlessTests; + productReference = 902D04872458AAAA007CFE56 /* feedlessTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 902D04912458AAAA007CFE56 /* feedlessUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 902D04A12458AAAA007CFE56 /* Build configuration list for PBXNativeTarget "feedlessUITests" */; + buildPhases = ( + 902D048E2458AAAA007CFE56 /* Sources */, + 902D048F2458AAAA007CFE56 /* Frameworks */, + 902D04902458AAAA007CFE56 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 902D04942458AAAA007CFE56 /* PBXTargetDependency */, + ); + name = feedlessUITests; + productName = feedlessUITests; + productReference = 902D04922458AAAA007CFE56 /* feedlessUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 902D04692458AAA7007CFE56 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1130; + LastUpgradeCheck = 1130; + ORGANIZATIONNAME = "Rogerio Chaves"; + TargetAttributes = { + 902D04702458AAA7007CFE56 = { + CreatedOnToolsVersion = 11.3.1; + }; + 902D04862458AAAA007CFE56 = { + CreatedOnToolsVersion = 11.3.1; + TestTargetID = 902D04702458AAA7007CFE56; + }; + 902D04912458AAAA007CFE56 = { + CreatedOnToolsVersion = 11.3.1; + TestTargetID = 902D04702458AAA7007CFE56; + }; + }; + }; + buildConfigurationList = 902D046C2458AAA7007CFE56 /* Build configuration list for PBXProject "feedless" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 902D04682458AAA7007CFE56; + productRefGroup = 902D04722458AAA7007CFE56 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 902D04702458AAA7007CFE56 /* feedless */, + 902D04862458AAAA007CFE56 /* feedlessTests */, + 902D04912458AAAA007CFE56 /* feedlessUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 902D046F2458AAA7007CFE56 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 902D04812458AAAA007CFE56 /* LaunchScreen.storyboard in Resources */, + 902D047E2458AAAA007CFE56 /* Preview Assets.xcassets in Resources */, + 902D047B2458AAAA007CFE56 /* Assets.xcassets in Resources */, + 900BE29E2458BBF600C77595 /* index.js in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 902D04852458AAAA007CFE56 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 902D04902458AAAA007CFE56 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 902D046D2458AAA7007CFE56 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 902D04752458AAA7007CFE56 /* AppDelegate.swift in Sources */, + 900BE29A2458B05800C77595 /* Login.swift in Sources */, + 902D04772458AAA7007CFE56 /* SceneDelegate.swift in Sources */, + 900BE2972458AEEC00C77595 /* Index.swift in Sources */, + 902D04792458AAA7007CFE56 /* Wall.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 902D04832458AAAA007CFE56 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 902D048C2458AAAA007CFE56 /* feedlessTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 902D048E2458AAAA007CFE56 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 902D04972458AAAA007CFE56 /* feedlessUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 902D04892458AAAA007CFE56 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 902D04702458AAA7007CFE56 /* feedless */; + targetProxy = 902D04882458AAAA007CFE56 /* PBXContainerItemProxy */; + }; + 902D04942458AAAA007CFE56 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 902D04702458AAA7007CFE56 /* feedless */; + targetProxy = 902D04932458AAAA007CFE56 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 902D047F2458AAAA007CFE56 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 902D04802458AAAA007CFE56 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 902D04992458AAAA007CFE56 /* 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_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 = 13.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; + }; + 902D049A2458AAAA007CFE56 /* 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_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 = 13.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; + }; + 902D049C2458AAAA007CFE56 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"feedless/Preview Content\""; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = feedless/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.rogeriochaves.feedless; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 902D049D2458AAAA007CFE56 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"feedless/Preview Content\""; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = feedless/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.rogeriochaves.feedless; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 902D049F2458AAAA007CFE56 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = feedlessTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.2; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.rogeriochaves.feedlessTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/feedless.app/feedless"; + }; + name = Debug; + }; + 902D04A02458AAAA007CFE56 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = feedlessTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.2; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.rogeriochaves.feedlessTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/feedless.app/feedless"; + }; + name = Release; + }; + 902D04A22458AAAA007CFE56 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = feedlessUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.rogeriochaves.feedlessUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = feedless; + }; + name = Debug; + }; + 902D04A32458AAAA007CFE56 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = feedlessUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.rogeriochaves.feedlessUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = feedless; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 902D046C2458AAA7007CFE56 /* Build configuration list for PBXProject "feedless" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 902D04992458AAAA007CFE56 /* Debug */, + 902D049A2458AAAA007CFE56 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 902D049B2458AAAA007CFE56 /* Build configuration list for PBXNativeTarget "feedless" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 902D049C2458AAAA007CFE56 /* Debug */, + 902D049D2458AAAA007CFE56 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 902D049E2458AAAA007CFE56 /* Build configuration list for PBXNativeTarget "feedlessTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 902D049F2458AAAA007CFE56 /* Debug */, + 902D04A02458AAAA007CFE56 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 902D04A12458AAAA007CFE56 /* Build configuration list for PBXNativeTarget "feedlessUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 902D04A22458AAAA007CFE56 /* Debug */, + 902D04A32458AAAA007CFE56 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 902D04692458AAA7007CFE56 /* Project object */; +} diff --git a/ios/feedless.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/feedless.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..d724b54 --- /dev/null +++ b/ios/feedless.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/feedless.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/feedless.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/feedless.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/feedless.xcodeproj/project.xcworkspace/xcuserdata/rchaves.xcuserdatad/UserInterfaceState.xcuserstate b/ios/feedless.xcodeproj/project.xcworkspace/xcuserdata/rchaves.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..9ae5522 Binary files /dev/null and b/ios/feedless.xcodeproj/project.xcworkspace/xcuserdata/rchaves.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/ios/feedless.xcodeproj/xcuserdata/rchaves.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/ios/feedless.xcodeproj/xcuserdata/rchaves.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..2a6ad8e --- /dev/null +++ b/ios/feedless.xcodeproj/xcuserdata/rchaves.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,6 @@ + + + diff --git a/ios/feedless.xcodeproj/xcuserdata/rchaves.xcuserdatad/xcschemes/xcschememanagement.plist b/ios/feedless.xcodeproj/xcuserdata/rchaves.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..c17b2fa --- /dev/null +++ b/ios/feedless.xcodeproj/xcuserdata/rchaves.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + feedless.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/ios/feedless/AppDelegate.swift b/ios/feedless/AppDelegate.swift new file mode 100644 index 0000000..8bb0f05 --- /dev/null +++ b/ios/feedless/AppDelegate.swift @@ -0,0 +1,37 @@ +// +// AppDelegate.swift +// feedless +// +// Created by Rogerio Chaves on 28/04/20. +// Copyright © 2020 Rogerio Chaves. All rights reserved. +// + +import UIKit + +@UIApplicationMain +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/ios/feedless/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/feedless/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d8db8d6 --- /dev/null +++ b/ios/feedless/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/feedless/Assets.xcassets/Contents.json b/ios/feedless/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/ios/feedless/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/feedless/Assets.xcassets/first.imageset/Contents.json b/ios/feedless/Assets.xcassets/first.imageset/Contents.json new file mode 100644 index 0000000..33a7451 --- /dev/null +++ b/ios/feedless/Assets.xcassets/first.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "first.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/feedless/Assets.xcassets/first.imageset/first.pdf b/ios/feedless/Assets.xcassets/first.imageset/first.pdf new file mode 100644 index 0000000..47d911d Binary files /dev/null and b/ios/feedless/Assets.xcassets/first.imageset/first.pdf differ diff --git a/ios/feedless/Assets.xcassets/second.imageset/Contents.json b/ios/feedless/Assets.xcassets/second.imageset/Contents.json new file mode 100644 index 0000000..03bd9c9 --- /dev/null +++ b/ios/feedless/Assets.xcassets/second.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "second.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/feedless/Assets.xcassets/second.imageset/second.pdf b/ios/feedless/Assets.xcassets/second.imageset/second.pdf new file mode 100644 index 0000000..401614e Binary files /dev/null and b/ios/feedless/Assets.xcassets/second.imageset/second.pdf differ diff --git a/ios/feedless/Base.lproj/LaunchScreen.storyboard b/ios/feedless/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..edd2800 --- /dev/null +++ b/ios/feedless/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/feedless/Info.plist b/ios/feedless/Info.plist new file mode 100644 index 0000000..49e8f4a --- /dev/null +++ b/ios/feedless/Info.plist @@ -0,0 +1,70 @@ + + + + + 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 + + + + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UIStatusBarTintParameters + + UINavigationBar + + Style + UIBarStyleDefault + Translucent + + + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/ios/feedless/JSService.swift b/ios/feedless/JSService.swift new file mode 100644 index 0000000..b099d7d --- /dev/null +++ b/ios/feedless/JSService.swift @@ -0,0 +1,34 @@ +import JavaScriptCore + +class JSService { + + let context = JSContext() + + let shared = JSService() + + let require: @convention(block) (String) -> (JSValue?) = { path in + let expandedPath = NSString(string: path).expandingTildeInPath + + // Return void or throw an error here. + guard FileManager.default.fileExists(atPath: expandedPath) + else { debugPrint("Require: filename \(expandedPath) does not exist") + return nil } + + guard let fileContent = try? String(contentsOfFile: expandedPath) + else { return nil } + + return JSService.shared.context.evaluateScript(fileContent) + } + + init() { + self.context.exceptionHandler = { context, exception in + print(exception!.toString()) + } + self.context.setObject(self.require, + forKeyedSubscript: "require" as NSString) + } + + func repl(_ string: String) -> String { + return self.context.evaluateScript(string).toString() + } +} diff --git a/ios/feedless/Preview Content/Preview Assets.xcassets/Contents.json b/ios/feedless/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/ios/feedless/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/feedless/SceneDelegate.swift b/ios/feedless/SceneDelegate.swift new file mode 100644 index 0000000..2d4cf53 --- /dev/null +++ b/ios/feedless/SceneDelegate.swift @@ -0,0 +1,101 @@ +// +// SceneDelegate.swift +// feedless +// +// Created by Rogerio Chaves on 28/04/20. +// Copyright © 2020 Rogerio Chaves. All rights reserved. +// + +import UIKit +import SwiftUI + +import JavaScriptCore + +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). + + + let context = JSContext()! + context.exceptionHandler = { context, exception in + print(exception!.toString()) + } + + let require: @convention(block) (String) -> (JSValue?) = { path in + let expandedPath = NSString(string: path).expandingTildeInPath + + // Return void or throw an error here. + guard FileManager.default.fileExists(atPath: expandedPath) + else { debugPrint("Require: filename \(expandedPath) does not exist") + return nil } + + guard let fileContent = try? String(contentsOfFile: expandedPath) + else { return nil } + + return context.evaluateScript(fileContent) + } + + context.setObject(require, forKeyedSubscript: "require" as NSString) + + guard let url = Bundle.main.url(forResource: "index", withExtension: "js") else { + fatalError("missing resource index.js") + } + + do { + context.evaluateScript(try String(contentsOf: url), withSourceURL: url) + } catch _ { + fatalError("could not evaluate index.js") + } + + let main = context.objectForKeyedSubscript("main") + print("aaaaaaaaaaaaaaaaaaaa", main?.call(withArguments: [])) + + // Create the SwiftUI view that provides the window contents. + let contentView = Index() + + // Use a UIHostingController as window root view controller. + if let windowScene = scene as? UIWindowScene { + let window = UIWindow(windowScene: windowScene) + window.rootViewController = UIHostingController(rootView: contentView) + self.window = window + 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 neccessarily 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/ios/feedless/screens/Index.swift b/ios/feedless/screens/Index.swift new file mode 100644 index 0000000..4db0d30 --- /dev/null +++ b/ios/feedless/screens/Index.swift @@ -0,0 +1,27 @@ +// +// ContentView.swift +// feedless +// +// Created by Rogerio Chaves on 28/04/20. +// Copyright © 2020 Rogerio Chaves. All rights reserved. +// + +import SwiftUI + +struct Index: View { + var body: some View { + NavigationView { + NavigationLink(destination: Login()) { + Text("Login") + } + .navigationBarTitle(Text("Index")) + } + } +} + +struct Index_Previews: PreviewProvider { + static var previews: some View { + Index() + } +} + diff --git a/ios/feedless/screens/Login.swift b/ios/feedless/screens/Login.swift new file mode 100644 index 0000000..eaff311 --- /dev/null +++ b/ios/feedless/screens/Login.swift @@ -0,0 +1,25 @@ +// +// ContentView.swift +// feedless +// +// Created by Rogerio Chaves on 28/04/20. +// Copyright © 2020 Rogerio Chaves. All rights reserved. +// + +import SwiftUI + +struct Login: View { + var body: some View { + NavigationView { + Text("Login Page") + .navigationBarTitle(Text("Login")) + } + } +} + +struct Login_Previews: PreviewProvider { + static var previews: some View { + Login() + } +} + diff --git a/ios/feedless/screens/Wall.swift b/ios/feedless/screens/Wall.swift new file mode 100644 index 0000000..b8a0ec6 --- /dev/null +++ b/ios/feedless/screens/Wall.swift @@ -0,0 +1,42 @@ +// +// ContentView.swift +// feedless +// +// Created by Rogerio Chaves on 28/04/20. +// Copyright © 2020 Rogerio Chaves. All rights reserved. +// + +import SwiftUI + +struct ContentView: View { + @State private var selection = 0 + + var body: some View { + TabView(selection: $selection){ + Text("First View") + .font(.title) + .tabItem { + VStack { + Image("first") + Text("First") + } + } + .tag(0) + Text("Second View") + .font(.title) + .tabItem { + VStack { + Image("second") + Text("Second") + } + } + .tag(1) + } + } +} + +struct ContentView_Previews: PreviewProvider { + static var previews: some View { + ContentView() + } +} diff --git a/ios/feedlessTests/Info.plist b/ios/feedlessTests/Info.plist new file mode 100644 index 0000000..64d65ca --- /dev/null +++ b/ios/feedlessTests/Info.plist @@ -0,0 +1,22 @@ + + + + + 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 + + diff --git a/ios/feedlessTests/feedlessTests.swift b/ios/feedlessTests/feedlessTests.swift new file mode 100644 index 0000000..52c745d --- /dev/null +++ b/ios/feedlessTests/feedlessTests.swift @@ -0,0 +1,34 @@ +// +// feedlessTests.swift +// feedlessTests +// +// Created by Rogerio Chaves on 28/04/20. +// Copyright © 2020 Rogerio Chaves. All rights reserved. +// + +import XCTest +@testable import feedless + +class feedlessTests: XCTestCase { + + override func setUp() { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/ios/feedlessUITests/Info.plist b/ios/feedlessUITests/Info.plist new file mode 100644 index 0000000..64d65ca --- /dev/null +++ b/ios/feedlessUITests/Info.plist @@ -0,0 +1,22 @@ + + + + + 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 + + diff --git a/ios/feedlessUITests/feedlessUITests.swift b/ios/feedlessUITests/feedlessUITests.swift new file mode 100644 index 0000000..4d1fae0 --- /dev/null +++ b/ios/feedlessUITests/feedlessUITests.swift @@ -0,0 +1,43 @@ +// +// feedlessUITests.swift +// feedlessUITests +// +// Created by Rogerio Chaves on 28/04/20. +// Copyright © 2020 Rogerio Chaves. All rights reserved. +// + +import XCTest + +class feedlessUITests: XCTestCase { + + override func setUp() { + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() { + // UI tests must launch the application that they test. + let app = XCUIApplication() + app.launch() + + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testLaunchPerformance() { + if #available(macOS 10.15, iOS 13.0, tvOS 13.0, *) { + // This measures how long it takes to launch your application. + measure(metrics: [XCTOSSignpostMetric.applicationLaunch]) { + XCUIApplication().launch() + } + } + } +} diff --git a/ios/package-lock.json b/ios/package-lock.json new file mode 100644 index 0000000..b9e205b --- /dev/null +++ b/ios/package-lock.json @@ -0,0 +1,545 @@ +{ + "name": "feedless-ios", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "dev": true + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "acorn-walk": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", + "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "bindings-noderify-nodejs-mobile": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/bindings-noderify-nodejs-mobile/-/bindings-noderify-nodejs-mobile-10.3.0.tgz", + "integrity": "sha512-ppLwmaDJ0jfHeUvBcdm6QHnmezg2yfHu9nVftxpvMRg4g88iJUIl9D9LR8tuVZlN9lrhb+kfA403aLlTMabrng==" + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "cached-path-relative": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", + "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", + "dev": true + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.3.0.tgz", + "integrity": "sha512-Xs2Hf2nzrvJMFKimOR7YR0QwZ8fc0u98kdtwN1eNAZzNQgH3vK2pXzff6GJtKh7S5hoJ87ECiAiZFS2fb5Ii2w==" + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "requires": { + "clone": "^1.0.2" + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dev": true, + "requires": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + } + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "requires": { + "chalk": "^2.4.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "module-deps": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.1.0.tgz", + "integrity": "sha512-NPs5N511VD1rrVJihSso/LiBShRbJALYBKzDW91uZYy7BpjnO4bGnZL3HjZ9yKcFdZUWwaYjDz9zxbuP7vKMuQ==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "browser-resolve": "^1.7.0", + "cached-path-relative": "^1.0.0", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.0.2", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "noderify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/noderify/-/noderify-4.3.0.tgz", + "integrity": "sha512-382A9HWr6s5FcvnRILE8aG3PAtkZIIiugfgWvc4eQNVUmcWu5wQ5ollKgT0leHndjedZeWrN2G1X4lfBCeFtyA==", + "dev": true, + "requires": { + "minimist": "^1.1.2", + "module-deps": "~6.1.0", + "rc": "^1.1.6", + "resolve": "~1.7.1", + "sort-stream": "^1.0.1", + "through2": "~2.0.3" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "ora": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.4.tgz", + "integrity": "sha512-77iGeVU1cIdRhgFzCK8aw1fbtT1B/iZAvWjS+l/o1x0RShMgxHUZaD2yDpWsNCPwXg9z1ZA78Kbdvr8kBmG/Ww==", + "requires": { + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + }, + "parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", + "dev": true, + "requires": { + "path-platform": "~0.11.15" + } + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "sort-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-stream/-/sort-stream-1.0.1.tgz", + "integrity": "sha1-owaEycKcozMGnBjWoKsPdor2HfI=", + "dev": true, + "requires": { + "through": "~2.3.1" + } + }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "dev": true, + "requires": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "dev": true, + "requires": { + "minimist": "^1.1.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "requires": { + "defaults": "^1.0.3" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } +} diff --git a/ios/package.json b/ios/package.json new file mode 100644 index 0000000..283fa3d --- /dev/null +++ b/ios/package.json @@ -0,0 +1,18 @@ +{ + "name": "feedless-ios", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "build": "./tools/build-backend.js" + }, + "author": "", + "license": "ISC", + "dependencies": { + "ora": "^4.0.4", + "bindings-noderify-nodejs-mobile": "10.3.0" + }, + "devDependencies": { + "noderify": "4.3.0" + } +} diff --git a/ios/tools/backend/noderify-mobile.sh b/ios/tools/backend/noderify-mobile.sh new file mode 100755 index 0000000..755bc2e --- /dev/null +++ b/ios/tools/backend/noderify-mobile.sh @@ -0,0 +1,53 @@ +#!/bin/bash + +# Any copyright is dedicated to the Public Domain. +# http://creativecommons.org/publicdomain/zero/1.0/ + +set -eEu -o pipefail +shopt -s extdebug +IFS=$'\n\t' +trap 'onFailure $?' ERR + +function onFailure() { + echo "Unhandled script error $1 at ${BASH_SOURCE[0]}:${BASH_LINENO[0]}" >&2 + exit 1 +} + +# Why some packages are filter'd or replaced: +# bindings: after noderify, the paths to .node files might be different, so +# we use a special fork of bindings +# chloride: needs special compilation configs for android, and we'd like to +# remove unused packages such as sodium-browserify etc +# leveldown: newer versions of leveldown are intentionally ignoring +# nodejs-mobile support, so we run an older version +# utp-native: we want to compile for nodejs-mobile instead of using prebuilds +# node-extend: can't remember why we need to replace it, build seemed to fail +# non-private-ip: we use a "better" fork of this package +# multiserver net plugin: we're fixing a corner case bug with error recovery +# rn-bridge: this is not an npm package, it's just a nodejs-mobile shortcut +# bl: we didn't use it, and bl@0.8.x has security vulnerabilities +# bufferutil: because we want nodejs-mobile to load its native bindings +# supports-color: optional dependency within package `debug` +# utf-8-validate: because we want nodejs-mobile to load its native bindings +mkdir -p out/ +$(npm bin)/noderify \ + --replace.bindings=bindings-noderify-nodejs-mobile \ + --replace.chloride=sodium-chloride-native-nodejs-mobile \ + --replace.leveldown=leveldown-nodejs-mobile \ + --replace.utp-native=utp-native-nodejs-mobile \ + --replace.node-extend=xtend \ + --replace.non-private-ip=non-private-ip-android \ + --replace.multiserver/plugins/net=staltz-multiserver/plugins/net \ + --filter=rn-bridge \ + --filter=bl \ + --filter=bufferutil \ + --filter=supports-color \ + --filter=utf-8-validate \ + --filter=bip39/src/wordlists/chinese_simplified.json \ + --filter=bip39/src/wordlists/chinese_traditional.json \ + --filter=bip39/src/wordlists/french.json \ + --filter=bip39/src/wordlists/italian.json \ + --filter=bip39/src/wordlists/japanese.json \ + --filter=bip39/src/wordlists/korean.json \ + --filter=bip39/src/wordlists/spanish.json \ + backend/index.js > out/index.js; \ No newline at end of file diff --git a/ios/tools/backend/remove-unused-files.sh b/ios/tools/backend/remove-unused-files.sh new file mode 100755 index 0000000..61afdc8 --- /dev/null +++ b/ios/tools/backend/remove-unused-files.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +# Any copyright is dedicated to the Public Domain. +# http://creativecommons.org/publicdomain/zero/1.0/ + +set -eEu -o pipefail +shopt -s extdebug +IFS=$'\n\t' +trap 'onFailure $?' ERR + +function onFailure() { + echo "Unhandled script error $1 at ${BASH_SOURCE[0]}:${BASH_LINENO[0]}" >&2 + exit 1 +} + +# make a list of things to delete then delete them +# `-exec rm -rf {} \;` confuses find because the recursion can no longer find a step (depth-first traversal (-d) would also work) +# GNU find and modern BSD/macOS find have a `-delete` operator +find ./node_modules \ + -type d \ + \( \ + -name "darwin-x64" \ + -o -name "win32-ia32" \ + -o -name "win32-x64" \ + \) \ + -print0 | xargs -0 rm -rf # delete everything in the list +find ./node_modules \ + -type f \ + \( \ + -name "electron-napi.node" \ + \) \ + -print0 | xargs -0 rm -rf # delete everything in the list diff --git a/ios/tools/build-backend.js b/ios/tools/build-backend.js new file mode 100755 index 0000000..80c721e --- /dev/null +++ b/ios/tools/build-backend.js @@ -0,0 +1,55 @@ +#!/usr/bin/env node +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +const util = require("util"); +const ora = require("ora"); +const exec = util.promisify(require("child_process").exec); + +const loading = ora("...").start(); +const verbose = !!process.argv.includes("--verbose"); + +async function runAndReport(label, task) { + const now = Date.now(); + try { + loading.start(label); + var { stdout, stderr } = await task; + } catch (err) { + loading.fail(); + if (verbose) { + console.error(stderr); + } + console.error(err.stack); + process.exit(err.code); + } + const duration = Date.now() - now; + const durationLabel = + duration < 1000 + ? duration + " milliseconds" + : duration < 60000 + ? (duration * 0.001).toFixed(1) + " seconds" + : ((duration * 0.001) / 60).toFixed(1) + " minutes"; + loading.succeed(`${label} (${durationLabel})`); + if (verbose) { + console.log(stdout); + } +} + +(async function () { + if (process.env.NODE_ENV == "production") { + await runAndReport( + "Install backend node modules", + exec("npm install --no-optional") + ); + + await runAndReport( + "Remove unused files meant for macOS or Windows or Electron", + exec("./tools/backend/remove-unused-files.sh") + ); + } + + await runAndReport( + "Bundle and minify backend JS into one file", + exec("./tools/backend/noderify-mobile.sh") + ); +})();