From 66e2543c385e606a2d83024bd22ce7ab87ca8564 Mon Sep 17 00:00:00 2001 From: Rogerio Chaves Date: Wed, 29 Apr 2020 07:14:38 +0200 Subject: [PATCH] Init iOS project --- ios/.gitignore | 2 + ios/backend/index.js | 7 + ios/feedless.xcodeproj/project.pbxproj | 613 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 35260 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 6 + .../xcschemes/xcschememanagement.plist | 14 + ios/feedless/AppDelegate.swift | 37 ++ .../AppIcon.appiconset/Contents.json | 98 +++ ios/feedless/Assets.xcassets/Contents.json | 6 + .../first.imageset/Contents.json | 12 + .../Assets.xcassets/first.imageset/first.pdf | Bin 0 -> 2465 bytes .../second.imageset/Contents.json | 12 + .../second.imageset/second.pdf | Bin 0 -> 2423 bytes .../Base.lproj/LaunchScreen.storyboard | 26 + ios/feedless/Info.plist | 70 ++ ios/feedless/JSService.swift | 34 + .../Preview Assets.xcassets/Contents.json | 6 + ios/feedless/SceneDelegate.swift | 101 +++ ios/feedless/screens/Index.swift | 27 + ios/feedless/screens/Login.swift | 25 + ios/feedless/screens/Wall.swift | 42 ++ ios/feedlessTests/Info.plist | 22 + ios/feedlessTests/feedlessTests.swift | 34 + ios/feedlessUITests/Info.plist | 22 + ios/feedlessUITests/feedlessUITests.swift | 43 ++ ios/package-lock.json | 545 ++++++++++++++++ ios/package.json | 18 + ios/tools/backend/noderify-mobile.sh | 53 ++ ios/tools/backend/remove-unused-files.sh | 32 + ios/tools/build-backend.js | 55 ++ 32 files changed, 1977 insertions(+) create mode 100644 ios/.gitignore create mode 100644 ios/backend/index.js create mode 100644 ios/feedless.xcodeproj/project.pbxproj create mode 100644 ios/feedless.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ios/feedless.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/feedless.xcodeproj/project.xcworkspace/xcuserdata/rchaves.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ios/feedless.xcodeproj/xcuserdata/rchaves.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 ios/feedless.xcodeproj/xcuserdata/rchaves.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ios/feedless/AppDelegate.swift create mode 100644 ios/feedless/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ios/feedless/Assets.xcassets/Contents.json create mode 100644 ios/feedless/Assets.xcassets/first.imageset/Contents.json create mode 100644 ios/feedless/Assets.xcassets/first.imageset/first.pdf create mode 100644 ios/feedless/Assets.xcassets/second.imageset/Contents.json create mode 100644 ios/feedless/Assets.xcassets/second.imageset/second.pdf create mode 100644 ios/feedless/Base.lproj/LaunchScreen.storyboard create mode 100644 ios/feedless/Info.plist create mode 100644 ios/feedless/JSService.swift create mode 100644 ios/feedless/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 ios/feedless/SceneDelegate.swift create mode 100644 ios/feedless/screens/Index.swift create mode 100644 ios/feedless/screens/Login.swift create mode 100644 ios/feedless/screens/Wall.swift create mode 100644 ios/feedlessTests/Info.plist create mode 100644 ios/feedlessTests/feedlessTests.swift create mode 100644 ios/feedlessUITests/Info.plist create mode 100644 ios/feedlessUITests/feedlessUITests.swift create mode 100644 ios/package-lock.json create mode 100644 ios/package.json create mode 100755 ios/tools/backend/noderify-mobile.sh create mode 100755 ios/tools/backend/remove-unused-files.sh create mode 100755 ios/tools/build-backend.js 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 0000000000000000000000000000000000000000..9ae5522c29c0e9e482556f21cdb22d2446672a4d GIT binary patch literal 35260 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 z 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 I{~Zqf4RIR6QUCw| literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..47d911dea647d55983671ead4d08b6f6b3600715 GIT binary patch literal 2465 zcmai03se(l7FLvisY+L#f-EBsK`11Xkc1=%MIujmB|xQ!>5vQ%APFP`Mlf5nSPOKE z2-^C>7DZkM!J;Da5{kfrC?Kvp3J41-3shFXvhuJqKo*oer*r0H{{P-P_x0cTzLzjD!bE z0qT;#Q7l4Gy%fMoXJaKT`@{5#R(MOqJPwQifv8iK6A%Ot9L14h2`38T!2s4PM=1!< zmL06}VYAA|ay#jZRs>HpA%X+eQW4rufWU%d1w5GTy!X#LeZsF_+~ccZmn3Fi)v^Z; zIG;?uU*yLLEYs61tjD>gXOFvSWsh{48xJvPNqKrIJtMdCz2cA2aC7TF?b@K`V!Lw- zE;zpH&ApqhoRjAHt}gK}>(qAc8dvrkD31*`<5<%C(&4_LqhQ3-GOf8~n^leG?+-@@^pjPa$J2gW@O)!b9hdTJ zTauyIJ&~rqeEZC1p9dWgx7{_WRc2=drMO=wcT7B{Zd58z`d)r_36r4V<6PGkCjpGfbnVMtm@;b}F!T?)Qav$_y7H5T;Mf!T}M zWxP9TNqrV?e5;b|pWd3^u2KAatk&3aDB@0 zZBaQNdCZ2#fblzYZnRCCjQ-GQWb-s8bX&<)?SxnUGdDYVFVk`xIf7@g3~$DX`H71_;r5OSZz1p`$_8y_9 z{;MJJ+n=>7Ewg;GnGHoz)&ID0z@F2!e$F7cWQ?d6s(!VY)_Gw})xCyMvsD={5i&H* zAIr_ACo8;Se6<*!-mm9Am79Iz^RVlc?%S5sg|E*SyIV{dd9{Mpf#d3cih5WKt=%ps zBEo)bt8EjmeCFYJRYU|b7d`p+-V|X2wOCYtyLP6t=!WH-kgdf0A};ytPfZiCwVPx{ z`g;zpe{8a4RQxQUwVU02<4X3w|9h;}XjhGWquqn{vVqq8g{*}BQF9=ybe_TM*!M=rFs1pN)yzctIXAoicsCe6>fit>wgZ#vp^hZOY0`J`rx zwdSK?GwR_xm9;5XjH|vf{O+Yg-)z;s*xt>;-vU`D-_SK<=~4eEVQkV~57{vyH6ebu>DqwE~Mx_A31Lg~$ zy`i52ew?GEluE%AN>ju*5z~dx2QQLP-G+E>o|En2+s&<^4*d zWD+<8PXs_Jp7_5Dpi(Gg3J?M;%Rn0{dcxQRh!ip+iHJ_e`!bM1MGxwI8Iedr+x>wI zq@&04fsADHfBccq^gpm8Q_u-~Uj|Z$YwSR(^_mzUb!}Xb2Cj`uqphg}v_Y%?Fs=;= zWq3s{hy)Tu!ji@RJsd$C+G{F6V2j1*Xk+7xo|LO7M2yb)(wc=%x-AclP9pLsbTF7m tf?*P!2EjJu5MD57P32Q4pdJ3tO_shCDT2=K;$ebx8ymcd$v!V9{2$sQiO>K5 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..401614e288b4b160471c2776bed6f09762af3e1c GIT binary patch literal 2423 zcmai02~-nz8dqq7rWU#)x2z)&iMWtV?gK$2a)?|BP!TbkV}J-Gl1wmy+3G9S0=uOY zwCjai6uBOPMMdNiN`VDYKwLQr2#W^`R93*Ua=0^)EGYY4=grIf|KIohziYnv{elnR zdN_hk6db<(+3RPcxs!iut8c(j0TLh=9mY931H^rhEE0|aXo!dh5Iv+ZFr+}9F+v#P zLSnfD0$f~hN>~92V{z)WJA&2)5rW!|I?;o?oI*%zejJiuY>hFLQwKlAa9O+PnPh#% zJp~JAfs-De6u@;{cREMs}D-sGib_4>50m8_|Uj-zC0m@Qx zJV+^5Da4Qxpf3sBtKZs<_aI$Cb1T+h<->yL^rfiGNelYkqgC3#SqVP_iy*_RPcbjH)xYf zvYdC-)D_t8c{=5%;$VJQxs_#61J*kuXMC?|&PbPo-7uSxoNr~&J94|gKk+03JGXXM zx4w~=^VUzWqQveu_ilRgPdgNNdnLZCH`=;w91}cP5ihdm*B_jI+rk=Pz2Lk!)XUu| zkls3P5&YHJ!t0kF+MUVBHOAx)a zy|JxHNd37z*~b5#%*0w_F|#4?erNP;pG`Fevoq2%?9Y>%Cmzv1(ks;aPIGaiy1mhU zr{7lB^Mem&`QK{b{uiDC zLD8muY(FNk{YdV|zO#o_VB%);8|~Bh(Z4p?GM}g-HN2;q7~YNl-lD~HZ$taYw$Fzbn6c?c5eo=@`i>()el#qwB)hI-gp0 ztsw@dh-I5NJkk)RCoBC`L8ffKfY)=oG=#4LA9TO6eA}9~@a6dupB+=S{%s&NY}^0GY`hAqod)uxXHitrN%bWOJohV>t?!&Z#d4y^7J@=Oh`HV zee**4j>xRUd)|D0^I-B#<`m1-5PO{)!v(q?ecFYqr_8Q{+z7#n0uFbq%_?hZ-Ck(6NRn=vDS7Nb1Xxx_)9`!i- zGR>av*PJ+P_AGO*a_$FbtCCISg5PK44p&W#t$)+HVcxpR9LAL%_Pv$p`0tO*sYZD0 zCG3-ipr4WoVbjpw%Nf^r^rnWcDcjumgBPEjO;NM6QtZ8wU#0rjHx5zs%CahF4$W*U zxu!q8kYP+>v!BNPVIRJUGIWU@7qVvx2VZDw4gV8%z%bjpF#aF(W|PmliwlakuRq>= zhaCRc^R!7T)#Twb0{!Tns=CxGcGX|leErg`f3|v0eBXxHU&6Sj-_>zOL!!d+j5Xt* zPS;rWd^zEF{5d5%)nNK=)zFJ8Uc=aQKD%UK)_TNes1Gh{SD*Mb_@O` z7*zs9Uq~Vq?v|^8FcM-yLGMKzR3YFB0z@CFM2X-dio%Gu6&MJj=I?uS7sA3AdE^p8 zE49$PjJzPIJwfn;jso7X2#jynr3dO@p5QAK1O9wqKLC=PkQjj~p#n|-5O`ihbTzzu zL{}2QEe28pJYfVZRW56FL`LvO&|C^1Th{0}hQMW$Ng$QPpnzlwnMnf=kVy8(y==L% zLMa>r0gELdT + + + + + + + + + + + + + + + + + + + + + + + + + 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") + ); +})();