ruby_everywhere 0.1.15 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/bridge/README.md +57 -2
  3. data/bridge/everywhere/bridge.js +803 -9
  4. data/bridge/package.json +1 -1
  5. data/lib/everywhere/builders/ios.rb +364 -0
  6. data/lib/everywhere/cli.rb +2 -0
  7. data/lib/everywhere/commands/build.rb +17 -1
  8. data/lib/everywhere/commands/clean.rb +19 -10
  9. data/lib/everywhere/commands/dev.rb +182 -19
  10. data/lib/everywhere/commands/doctor.rb +45 -3
  11. data/lib/everywhere/commands/icon.rb +14 -0
  12. data/lib/everywhere/commands/install.rb +37 -6
  13. data/lib/everywhere/commands/logs.rb +56 -0
  14. data/lib/everywhere/commands/platform/build.rb +3 -3
  15. data/lib/everywhere/commands/platform/runner.rb +1 -1
  16. data/lib/everywhere/commands/release.rb +1 -1
  17. data/lib/everywhere/commands/shell_dir.rb +11 -4
  18. data/lib/everywhere/config.rb +366 -1
  19. data/lib/everywhere/engine.rb +33 -1
  20. data/lib/everywhere/icon.rb +50 -0
  21. data/lib/everywhere/log_filter.rb +28 -2
  22. data/lib/everywhere/mobile_config_endpoint.rb +75 -0
  23. data/lib/everywhere/mobile_configs_controller.rb +46 -0
  24. data/lib/everywhere/native_helper.rb +156 -0
  25. data/lib/everywhere/paths.rb +41 -0
  26. data/lib/everywhere/raster.rb +17 -0
  27. data/lib/everywhere/shellout.rb +3 -1
  28. data/lib/everywhere/simulator.rb +74 -0
  29. data/lib/everywhere/ui.rb +18 -0
  30. data/lib/everywhere/version.rb +1 -1
  31. data/support/mobile/ios/App/App.xcconfig +6 -0
  32. data/support/mobile/ios/App/AppDelegate.swift +163 -0
  33. data/support/mobile/ios/App/Assets.xcassets/AccentColor.colorset/Contents.json +20 -0
  34. data/support/mobile/ios/App/Assets.xcassets/AppIcon.appiconset/AppIcon.png +0 -0
  35. data/support/mobile/ios/App/Assets.xcassets/AppIcon.appiconset/Contents.json +14 -0
  36. data/support/mobile/ios/App/Assets.xcassets/Contents.json +6 -0
  37. data/support/mobile/ios/App/Assets.xcassets/LaunchBackground.colorset/Contents.json +38 -0
  38. data/support/mobile/ios/App/Base.lproj/LaunchScreen.storyboard +32 -0
  39. data/support/mobile/ios/App/Bridge/BiometricsComponent.swift +276 -0
  40. data/support/mobile/ios/App/Bridge/HapticsComponent.swift +47 -0
  41. data/support/mobile/ios/App/Bridge/NotificationComponent.swift +56 -0
  42. data/support/mobile/ios/App/Bridge/PermissionsComponent.swift +142 -0
  43. data/support/mobile/ios/App/Bridge/StorageComponent.swift +63 -0
  44. data/support/mobile/ios/App/ErrorViewController.swift +64 -0
  45. data/support/mobile/ios/App/EverywhereConfig.swift +268 -0
  46. data/support/mobile/ios/App/EverywhereHost.swift +34 -0
  47. data/support/mobile/ios/App/Extensions/EverywhereExtensions.swift +32 -0
  48. data/support/mobile/ios/App/Info.plist +28 -0
  49. data/support/mobile/ios/App/Resources/everywhere.json +8 -0
  50. data/support/mobile/ios/App/Resources/path-configuration.json +19 -0
  51. data/support/mobile/ios/App/SceneDelegate.swift +443 -0
  52. data/support/mobile/ios/App.xcodeproj/project.pbxproj +454 -0
  53. data/support/mobile/ios/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  54. data/support/mobile/ios/App.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +14 -0
  55. data/support/mobile/ios/App.xcodeproj/xcshareddata/xcschemes/App.xcscheme +77 -0
  56. data/support/mobile/ios/NativeExtensions/Package.swift +26 -0
  57. data/support/mobile/ios/NativeExtensions/Sources/NativeExtensions/Exports.swift +5 -0
  58. data/support/mobile/ios/README.md +66 -0
  59. metadata +35 -1
@@ -0,0 +1,454 @@
1
+ // !$*UTF8*$!
2
+ {
3
+ archiveVersion = 1;
4
+ classes = {
5
+ };
6
+ objectVersion = 70;
7
+ objects = {
8
+
9
+ /* Begin PBXBuildFile section */
10
+ EBE000000000000000000031 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBE000000000000000000013 /* AppDelegate.swift */; };
11
+ EBE000000000000000000032 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBE000000000000000000014 /* SceneDelegate.swift */; };
12
+ EBE000000000000000000033 /* EverywhereConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBE000000000000000000015 /* EverywhereConfig.swift */; };
13
+ EBE000000000000000000034 /* ErrorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBE000000000000000000016 /* ErrorViewController.swift */; };
14
+ EBE000000000000000000035 /* NotificationComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBE000000000000000000017 /* NotificationComponent.swift */; };
15
+ EBE000000000000000000044 /* HapticsComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBE000000000000000000043 /* HapticsComponent.swift */; };
16
+ EBE000000000000000000046 /* PermissionsComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBE000000000000000000045 /* PermissionsComponent.swift */; };
17
+ EBE000000000000000000058 /* BiometricsComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBE000000000000000000057 /* BiometricsComponent.swift */; };
18
+ EBE000000000000000000060 /* StorageComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBE000000000000000000059 /* StorageComponent.swift */; };
19
+ EBE000000000000000000063 /* EverywhereHost.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBE000000000000000000062 /* EverywhereHost.swift */; };
20
+ EBE000000000000000000036 /* everywhere.json in Resources */ = {isa = PBXBuildFile; fileRef = EBE000000000000000000018 /* everywhere.json */; };
21
+ EBE000000000000000000037 /* path-configuration.json in Resources */ = {isa = PBXBuildFile; fileRef = EBE000000000000000000019 /* path-configuration.json */; };
22
+ EBE000000000000000000038 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EBE000000000000000000020 /* Assets.xcassets */; };
23
+ EBE000000000000000000039 /* Base in Resources */ = {isa = PBXBuildFile; fileRef = EBE000000000000000000021 /* Base */; };
24
+ EBE000000000000000000040 /* HotwireNative in Frameworks */ = {isa = PBXBuildFile; productRef = EBE000000000000000000042 /* HotwireNative */; };
25
+ EBE000000000000000000066 /* NativeExtensions in Frameworks */ = {isa = PBXBuildFile; productRef = EBE000000000000000000065 /* NativeExtensions */; };
26
+ /* End PBXBuildFile section */
27
+
28
+ /* Begin PBXFileReference section */
29
+ EBE000000000000000000006 /* App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App.app; sourceTree = BUILT_PRODUCTS_DIR; };
30
+ EBE000000000000000000011 /* App.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = App.xcconfig; sourceTree = "<group>"; };
31
+ EBE000000000000000000012 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
32
+ EBE000000000000000000013 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
33
+ EBE000000000000000000014 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
34
+ EBE000000000000000000015 /* EverywhereConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EverywhereConfig.swift; sourceTree = "<group>"; };
35
+ EBE000000000000000000016 /* ErrorViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorViewController.swift; sourceTree = "<group>"; };
36
+ EBE000000000000000000017 /* NotificationComponent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationComponent.swift; sourceTree = "<group>"; };
37
+ EBE000000000000000000043 /* HapticsComponent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HapticsComponent.swift; sourceTree = "<group>"; };
38
+ EBE000000000000000000045 /* PermissionsComponent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PermissionsComponent.swift; sourceTree = "<group>"; };
39
+ EBE000000000000000000057 /* BiometricsComponent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BiometricsComponent.swift; sourceTree = "<group>"; };
40
+ EBE000000000000000000059 /* StorageComponent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorageComponent.swift; sourceTree = "<group>"; };
41
+ EBE000000000000000000018 /* everywhere.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = everywhere.json; sourceTree = "<group>"; };
42
+ EBE000000000000000000019 /* path-configuration.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "path-configuration.json"; sourceTree = "<group>"; };
43
+ EBE000000000000000000020 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
44
+ EBE000000000000000000021 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
45
+ EBE000000000000000000062 /* EverywhereHost.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EverywhereHost.swift; sourceTree = "<group>"; };
46
+ /* End PBXFileReference section */
47
+
48
+ /* Begin PBXFileSystemSynchronizedRootGroup section */
49
+ EBE000000000000000000061 /* Extensions */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = Extensions; sourceTree = "<group>"; };
50
+ /* End PBXFileSystemSynchronizedRootGroup section */
51
+
52
+ /* Begin PBXFrameworksBuildPhase section */
53
+ EBE000000000000000000009 /* Frameworks */ = {
54
+ isa = PBXFrameworksBuildPhase;
55
+ buildActionMask = 2147483647;
56
+ files = (
57
+ EBE000000000000000000040 /* HotwireNative in Frameworks */,
58
+ EBE000000000000000000066 /* NativeExtensions in Frameworks */,
59
+ );
60
+ runOnlyForDeploymentPostprocessing = 0;
61
+ };
62
+ /* End PBXFrameworksBuildPhase section */
63
+
64
+ /* Begin PBXGroup section */
65
+ EBE000000000000000000002 = {
66
+ isa = PBXGroup;
67
+ children = (
68
+ EBE000000000000000000004 /* App */,
69
+ EBE000000000000000000003 /* Products */,
70
+ );
71
+ sourceTree = "<group>";
72
+ };
73
+ EBE000000000000000000003 /* Products */ = {
74
+ isa = PBXGroup;
75
+ children = (
76
+ EBE000000000000000000006 /* App.app */,
77
+ );
78
+ name = Products;
79
+ sourceTree = "<group>";
80
+ };
81
+ EBE000000000000000000004 /* App */ = {
82
+ isa = PBXGroup;
83
+ children = (
84
+ EBE000000000000000000011 /* App.xcconfig */,
85
+ EBE000000000000000000013 /* AppDelegate.swift */,
86
+ EBE000000000000000000014 /* SceneDelegate.swift */,
87
+ EBE000000000000000000015 /* EverywhereConfig.swift */,
88
+ EBE000000000000000000016 /* ErrorViewController.swift */,
89
+ EBE000000000000000000062 /* EverywhereHost.swift */,
90
+ EBE000000000000000000005 /* Bridge */,
91
+ EBE000000000000000000061 /* Extensions */,
92
+ EBE000000000000000000023 /* Resources */,
93
+ EBE000000000000000000012 /* Info.plist */,
94
+ EBE000000000000000000020 /* Assets.xcassets */,
95
+ EBE000000000000000000022 /* LaunchScreen.storyboard */,
96
+ );
97
+ path = App;
98
+ sourceTree = "<group>";
99
+ };
100
+ EBE000000000000000000005 /* Bridge */ = {
101
+ isa = PBXGroup;
102
+ children = (
103
+ EBE000000000000000000017 /* NotificationComponent.swift */,
104
+ EBE000000000000000000043 /* HapticsComponent.swift */,
105
+ EBE000000000000000000045 /* PermissionsComponent.swift */,
106
+ EBE000000000000000000057 /* BiometricsComponent.swift */,
107
+ EBE000000000000000000059 /* StorageComponent.swift */,
108
+ );
109
+ path = Bridge;
110
+ sourceTree = "<group>";
111
+ };
112
+ EBE000000000000000000023 /* Resources */ = {
113
+ isa = PBXGroup;
114
+ children = (
115
+ EBE000000000000000000018 /* everywhere.json */,
116
+ EBE000000000000000000019 /* path-configuration.json */,
117
+ );
118
+ path = Resources;
119
+ sourceTree = "<group>";
120
+ };
121
+ /* End PBXGroup section */
122
+
123
+ /* Begin PBXNativeTarget section */
124
+ EBE000000000000000000007 /* App */ = {
125
+ isa = PBXNativeTarget;
126
+ buildConfigurationList = EBE000000000000000000056 /* Build configuration list for PBXNativeTarget "App" */;
127
+ buildPhases = (
128
+ EBE000000000000000000008 /* Sources */,
129
+ EBE000000000000000000009 /* Frameworks */,
130
+ EBE000000000000000000010 /* Resources */,
131
+ );
132
+ buildRules = (
133
+ );
134
+ dependencies = (
135
+ );
136
+ fileSystemSynchronizedGroups = (
137
+ EBE000000000000000000061 /* Extensions */,
138
+ );
139
+ name = App;
140
+ packageProductDependencies = (
141
+ EBE000000000000000000042 /* HotwireNative */,
142
+ EBE000000000000000000065 /* NativeExtensions */,
143
+ );
144
+ productName = App;
145
+ productReference = EBE000000000000000000006 /* App.app */;
146
+ productType = "com.apple.product-type.application";
147
+ };
148
+ /* End PBXNativeTarget section */
149
+
150
+ /* Begin PBXProject section */
151
+ EBE000000000000000000001 /* Project object */ = {
152
+ isa = PBXProject;
153
+ attributes = {
154
+ BuildIndependentTargetsInParallel = 1;
155
+ LastSwiftUpdateCheck = 1530;
156
+ LastUpgradeCheck = 1530;
157
+ TargetAttributes = {
158
+ EBE000000000000000000007 = {
159
+ CreatedOnToolsVersion = 15.3;
160
+ };
161
+ };
162
+ };
163
+ buildConfigurationList = EBE000000000000000000055 /* Build configuration list for PBXProject "App" */;
164
+ compatibilityVersion = "Xcode 14.0";
165
+ developmentRegion = en;
166
+ hasScannedForEncodings = 0;
167
+ knownRegions = (
168
+ en,
169
+ Base,
170
+ );
171
+ mainGroup = EBE000000000000000000002;
172
+ packageReferences = (
173
+ EBE000000000000000000041 /* XCRemoteSwiftPackageReference "hotwire-native-ios" */,
174
+ EBE000000000000000000064 /* XCLocalSwiftPackageReference "NativeExtensions" */,
175
+ );
176
+ productRefGroup = EBE000000000000000000003 /* Products */;
177
+ projectDirPath = "";
178
+ projectRoot = "";
179
+ targets = (
180
+ EBE000000000000000000007 /* App */,
181
+ );
182
+ };
183
+ /* End PBXProject section */
184
+
185
+ /* Begin PBXResourcesBuildPhase section */
186
+ EBE000000000000000000010 /* Resources */ = {
187
+ isa = PBXResourcesBuildPhase;
188
+ buildActionMask = 2147483647;
189
+ files = (
190
+ EBE000000000000000000036 /* everywhere.json in Resources */,
191
+ EBE000000000000000000037 /* path-configuration.json in Resources */,
192
+ EBE000000000000000000038 /* Assets.xcassets in Resources */,
193
+ EBE000000000000000000039 /* Base in Resources */,
194
+ );
195
+ runOnlyForDeploymentPostprocessing = 0;
196
+ };
197
+ /* End PBXResourcesBuildPhase section */
198
+
199
+ /* Begin PBXSourcesBuildPhase section */
200
+ EBE000000000000000000008 /* Sources */ = {
201
+ isa = PBXSourcesBuildPhase;
202
+ buildActionMask = 2147483647;
203
+ files = (
204
+ EBE000000000000000000031 /* AppDelegate.swift in Sources */,
205
+ EBE000000000000000000032 /* SceneDelegate.swift in Sources */,
206
+ EBE000000000000000000033 /* EverywhereConfig.swift in Sources */,
207
+ EBE000000000000000000034 /* ErrorViewController.swift in Sources */,
208
+ EBE000000000000000000035 /* NotificationComponent.swift in Sources */,
209
+ EBE000000000000000000044 /* HapticsComponent.swift in Sources */,
210
+ EBE000000000000000000046 /* PermissionsComponent.swift in Sources */,
211
+ EBE000000000000000000058 /* BiometricsComponent.swift in Sources */,
212
+ EBE000000000000000000060 /* StorageComponent.swift in Sources */,
213
+ EBE000000000000000000063 /* EverywhereHost.swift in Sources */,
214
+ );
215
+ runOnlyForDeploymentPostprocessing = 0;
216
+ };
217
+ /* End PBXSourcesBuildPhase section */
218
+
219
+ /* Begin PBXVariantGroup section */
220
+ EBE000000000000000000022 /* LaunchScreen.storyboard */ = {
221
+ isa = PBXVariantGroup;
222
+ children = (
223
+ EBE000000000000000000021 /* Base */,
224
+ );
225
+ name = LaunchScreen.storyboard;
226
+ sourceTree = "<group>";
227
+ };
228
+ /* End PBXVariantGroup section */
229
+
230
+ /* Begin XCBuildConfiguration section */
231
+ EBE000000000000000000051 /* Debug */ = {
232
+ isa = XCBuildConfiguration;
233
+ buildSettings = {
234
+ ALWAYS_SEARCH_USER_PATHS = NO;
235
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
236
+ CLANG_ANALYZER_NONNULL = YES;
237
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
238
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
239
+ CLANG_ENABLE_MODULES = YES;
240
+ CLANG_ENABLE_OBJC_ARC = YES;
241
+ CLANG_ENABLE_OBJC_WEAK = YES;
242
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
243
+ CLANG_WARN_BOOL_CONVERSION = YES;
244
+ CLANG_WARN_COMMA = YES;
245
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
246
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
247
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
248
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
249
+ CLANG_WARN_EMPTY_BODY = YES;
250
+ CLANG_WARN_ENUM_CONVERSION = YES;
251
+ CLANG_WARN_INFINITE_RECURSION = YES;
252
+ CLANG_WARN_INT_CONVERSION = YES;
253
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
254
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
255
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
256
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
257
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
258
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
259
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
260
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
261
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
262
+ CLANG_WARN_UNREACHABLE_CODE = YES;
263
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
264
+ COPY_PHASE_STRIP = NO;
265
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
266
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
267
+ GCC_C_LANGUAGE_STANDARD = gnu17;
268
+ GCC_NO_COMMON_BLOCKS = YES;
269
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
270
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
271
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
272
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
273
+ GCC_WARN_UNUSED_FUNCTION = YES;
274
+ GCC_WARN_UNUSED_VARIABLE = YES;
275
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
276
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
277
+ MTL_FAST_MATH = YES;
278
+ SDKROOT = iphoneos;
279
+ DEBUG_INFORMATION_FORMAT = dwarf;
280
+ ENABLE_TESTABILITY = YES;
281
+ GCC_DYNAMIC_NO_PIC = NO;
282
+ GCC_OPTIMIZATION_LEVEL = 0;
283
+ GCC_PREPROCESSOR_DEFINITIONS = (
284
+ "DEBUG=1",
285
+ "$(inherited)",
286
+ );
287
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
288
+ ONLY_ACTIVE_ARCH = YES;
289
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
290
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
291
+ };
292
+ name = Debug;
293
+ };
294
+ EBE000000000000000000052 /* Release */ = {
295
+ isa = XCBuildConfiguration;
296
+ buildSettings = {
297
+ ALWAYS_SEARCH_USER_PATHS = NO;
298
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
299
+ CLANG_ANALYZER_NONNULL = YES;
300
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
301
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
302
+ CLANG_ENABLE_MODULES = YES;
303
+ CLANG_ENABLE_OBJC_ARC = YES;
304
+ CLANG_ENABLE_OBJC_WEAK = YES;
305
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
306
+ CLANG_WARN_BOOL_CONVERSION = YES;
307
+ CLANG_WARN_COMMA = YES;
308
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
309
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
310
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
311
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
312
+ CLANG_WARN_EMPTY_BODY = YES;
313
+ CLANG_WARN_ENUM_CONVERSION = YES;
314
+ CLANG_WARN_INFINITE_RECURSION = YES;
315
+ CLANG_WARN_INT_CONVERSION = YES;
316
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
317
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
318
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
319
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
320
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
321
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
322
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
323
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
324
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
325
+ CLANG_WARN_UNREACHABLE_CODE = YES;
326
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
327
+ COPY_PHASE_STRIP = NO;
328
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
329
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
330
+ GCC_C_LANGUAGE_STANDARD = gnu17;
331
+ GCC_NO_COMMON_BLOCKS = YES;
332
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
333
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
334
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
335
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
336
+ GCC_WARN_UNUSED_FUNCTION = YES;
337
+ GCC_WARN_UNUSED_VARIABLE = YES;
338
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
339
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
340
+ MTL_FAST_MATH = YES;
341
+ SDKROOT = iphoneos;
342
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
343
+ ENABLE_NS_ASSERTIONS = NO;
344
+ MTL_ENABLE_DEBUG_INFO = NO;
345
+ SWIFT_COMPILATION_MODE = wholemodule;
346
+ VALIDATE_PRODUCT = YES;
347
+ };
348
+ name = Release;
349
+ };
350
+ EBE000000000000000000053 /* Debug */ = {
351
+ isa = XCBuildConfiguration;
352
+ baseConfigurationReference = EBE000000000000000000011 /* App.xcconfig */;
353
+ buildSettings = {
354
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
355
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
356
+ CODE_SIGN_STYLE = Automatic;
357
+ GENERATE_INFOPLIST_FILE = YES;
358
+ INFOPLIST_FILE = App/Info.plist;
359
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
360
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
361
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
362
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = UIInterfaceOrientationPortrait;
363
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
364
+ LD_RUNPATH_SEARCH_PATHS = (
365
+ "$(inherited)",
366
+ "@executable_path/Frameworks",
367
+ );
368
+ PRODUCT_NAME = App;
369
+ SWIFT_EMIT_LOC_STRINGS = YES;
370
+ SWIFT_VERSION = 5.0;
371
+ TARGETED_DEVICE_FAMILY = "1,2";
372
+ };
373
+ name = Debug;
374
+ };
375
+ EBE000000000000000000054 /* Release */ = {
376
+ isa = XCBuildConfiguration;
377
+ baseConfigurationReference = EBE000000000000000000011 /* App.xcconfig */;
378
+ buildSettings = {
379
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
380
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
381
+ CODE_SIGN_STYLE = Automatic;
382
+ GENERATE_INFOPLIST_FILE = YES;
383
+ INFOPLIST_FILE = App/Info.plist;
384
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
385
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
386
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
387
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = UIInterfaceOrientationPortrait;
388
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
389
+ LD_RUNPATH_SEARCH_PATHS = (
390
+ "$(inherited)",
391
+ "@executable_path/Frameworks",
392
+ );
393
+ PRODUCT_NAME = App;
394
+ SWIFT_EMIT_LOC_STRINGS = YES;
395
+ SWIFT_VERSION = 5.0;
396
+ TARGETED_DEVICE_FAMILY = "1,2";
397
+ };
398
+ name = Release;
399
+ };
400
+ /* End XCBuildConfiguration section */
401
+
402
+ /* Begin XCConfigurationList section */
403
+ EBE000000000000000000055 /* Build configuration list for PBXProject "App" */ = {
404
+ isa = XCConfigurationList;
405
+ buildConfigurations = (
406
+ EBE000000000000000000051 /* Debug */,
407
+ EBE000000000000000000052 /* Release */,
408
+ );
409
+ defaultConfigurationIsVisible = 0;
410
+ defaultConfigurationName = Release;
411
+ };
412
+ EBE000000000000000000056 /* Build configuration list for PBXNativeTarget "App" */ = {
413
+ isa = XCConfigurationList;
414
+ buildConfigurations = (
415
+ EBE000000000000000000053 /* Debug */,
416
+ EBE000000000000000000054 /* Release */,
417
+ );
418
+ defaultConfigurationIsVisible = 0;
419
+ defaultConfigurationName = Release;
420
+ };
421
+ /* End XCConfigurationList section */
422
+
423
+ /* Begin XCLocalSwiftPackageReference section */
424
+ EBE000000000000000000064 /* XCLocalSwiftPackageReference "NativeExtensions" */ = {
425
+ isa = XCLocalSwiftPackageReference;
426
+ relativePath = NativeExtensions;
427
+ };
428
+ /* End XCLocalSwiftPackageReference section */
429
+
430
+ /* Begin XCRemoteSwiftPackageReference section */
431
+ EBE000000000000000000041 /* XCRemoteSwiftPackageReference "hotwire-native-ios" */ = {
432
+ isa = XCRemoteSwiftPackageReference;
433
+ repositoryURL = "https://github.com/afomera/hotwire-native-ios";
434
+ requirement = {
435
+ branch = "fix/more-menu-navigator";
436
+ kind = branch;
437
+ };
438
+ };
439
+ /* End XCRemoteSwiftPackageReference section */
440
+
441
+ /* Begin XCSwiftPackageProductDependency section */
442
+ EBE000000000000000000042 /* HotwireNative */ = {
443
+ isa = XCSwiftPackageProductDependency;
444
+ package = EBE000000000000000000041 /* XCRemoteSwiftPackageReference "hotwire-native-ios" */;
445
+ productName = HotwireNative;
446
+ };
447
+ EBE000000000000000000065 /* NativeExtensions */ = {
448
+ isa = XCSwiftPackageProductDependency;
449
+ productName = NativeExtensions;
450
+ };
451
+ /* End XCSwiftPackageProductDependency section */
452
+ };
453
+ rootObject = EBE000000000000000000001 /* Project object */;
454
+ }
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <Workspace
3
+ version = "1.0">
4
+ <FileRef
5
+ location = "self:">
6
+ </FileRef>
7
+ </Workspace>
@@ -0,0 +1,14 @@
1
+ {
2
+ "pins" : [
3
+ {
4
+ "identity" : "hotwire-native-ios",
5
+ "kind" : "remoteSourceControl",
6
+ "location" : "https://github.com/afomera/hotwire-native-ios",
7
+ "state" : {
8
+ "branch" : "fix/more-menu-navigator",
9
+ "revision" : "915194a338d0a4c686ee43ace7450b3aa0e885c3"
10
+ }
11
+ }
12
+ ],
13
+ "version" : 3
14
+ }
@@ -0,0 +1,77 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <Scheme
3
+ LastUpgradeVersion = "1530"
4
+ version = "1.7">
5
+ <BuildAction
6
+ parallelizeBuildables = "YES"
7
+ buildImplicitDependencies = "YES">
8
+ <BuildActionEntries>
9
+ <BuildActionEntry
10
+ buildForTesting = "YES"
11
+ buildForRunning = "YES"
12
+ buildForProfiling = "YES"
13
+ buildForArchiving = "YES"
14
+ buildForAnalyzing = "YES">
15
+ <BuildableReference
16
+ BuildableIdentifier = "primary"
17
+ BlueprintIdentifier = "EBE000000000000000000007"
18
+ BuildableName = "App.app"
19
+ BlueprintName = "App"
20
+ ReferencedContainer = "container:App.xcodeproj">
21
+ </BuildableReference>
22
+ </BuildActionEntry>
23
+ </BuildActionEntries>
24
+ </BuildAction>
25
+ <TestAction
26
+ buildConfiguration = "Debug"
27
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
28
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
29
+ shouldUseLaunchSchemeArgsEnv = "YES"
30
+ shouldAutocreateTestPlan = "YES">
31
+ </TestAction>
32
+ <LaunchAction
33
+ buildConfiguration = "Debug"
34
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
35
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
36
+ launchStyle = "0"
37
+ useCustomWorkingDirectory = "NO"
38
+ ignoresPersistentStateOnLaunch = "NO"
39
+ debugDocumentVersioning = "YES"
40
+ debugServiceExtension = "internal"
41
+ allowLocationSimulation = "YES">
42
+ <BuildableProductRunnable
43
+ runnableDebuggingMode = "0">
44
+ <BuildableReference
45
+ BuildableIdentifier = "primary"
46
+ BlueprintIdentifier = "EBE000000000000000000007"
47
+ BuildableName = "App.app"
48
+ BlueprintName = "App"
49
+ ReferencedContainer = "container:App.xcodeproj">
50
+ </BuildableReference>
51
+ </BuildableProductRunnable>
52
+ </LaunchAction>
53
+ <ProfileAction
54
+ buildConfiguration = "Release"
55
+ shouldUseLaunchSchemeArgsEnv = "YES"
56
+ savedToolIdentifier = ""
57
+ useCustomWorkingDirectory = "NO"
58
+ debugDocumentVersioning = "YES">
59
+ <BuildableProductRunnable
60
+ runnableDebuggingMode = "0">
61
+ <BuildableReference
62
+ BuildableIdentifier = "primary"
63
+ BlueprintIdentifier = "EBE000000000000000000007"
64
+ BuildableName = "App.app"
65
+ BlueprintName = "App"
66
+ ReferencedContainer = "container:App.xcodeproj">
67
+ </BuildableReference>
68
+ </BuildableProductRunnable>
69
+ </ProfileAction>
70
+ <AnalyzeAction
71
+ buildConfiguration = "Debug">
72
+ </AnalyzeAction>
73
+ <ArchiveAction
74
+ buildConfiguration = "Release"
75
+ revealArchiveInOrganizer = "YES">
76
+ </ArchiveAction>
77
+ </Scheme>
@@ -0,0 +1,26 @@
1
+ // swift-tools-version:5.9
2
+ // The app's native Swift Package dependencies. This checked-in copy is the
3
+ // empty default so the raw template builds unchanged; `every build` overwrites
4
+ // it from config/everywhere.yml (native.ios.packages) — and rewrites
5
+ // Sources/NativeExtensions/Exports.swift to re-export each product, so the app
6
+ // target's native/ios code can reach them via `import NativeExtensions`.
7
+ //
8
+ // native:
9
+ // ios:
10
+ // packages:
11
+ // - url: https://github.com/simibac/ConfettiSwiftUI
12
+ // from: "1.1.0" # or exact: / branch: / revision:
13
+ // products: [ConfettiSwiftUI] # optional; defaults to the repo name
14
+ import PackageDescription
15
+
16
+ let package = Package(
17
+ name: "NativeExtensions",
18
+ platforms: [.iOS(.v15)],
19
+ products: [
20
+ .library(name: "NativeExtensions", targets: ["NativeExtensions"])
21
+ ],
22
+ dependencies: [],
23
+ targets: [
24
+ .target(name: "NativeExtensions")
25
+ ]
26
+ )
@@ -0,0 +1,5 @@
1
+ // Re-exports the packages pinned under native.ios.packages so the app target's
2
+ // native/ios code can use them with a single `import NativeExtensions`. This
3
+ // checked-in copy is the empty default; `every build` rewrites it with one
4
+ // `@_exported import <Product>` line per pinned product. Do not edit — declare
5
+ // packages under native.ios.packages in config/everywhere.yml instead.
@@ -0,0 +1,66 @@
1
+ # RubyEverywhere iOS Shell Template
2
+
3
+ A canonical Hotwire Native iOS shell that wraps a deployed Ruby web app (remote
4
+ URL). The RubyEverywhere CLI stamps a copy of this directory per app — the
5
+ template itself is **never edited per-app**.
6
+
7
+ ## Freeze rules
8
+
9
+ `App.xcodeproj/project.pbxproj` is written once and frozen. Its object UUIDs
10
+ (`EBE0…NN`) never change. When `every build --target ios-*` stamps a copy of
11
+ this template, it overwrites **exactly** these files and nothing else:
12
+
13
+ 1. `App/App.xcconfig` — bundle id, versions, display name, team
14
+ 2. `App/Resources/everywhere.json` — runtime config (remote URL, entry path, colors)
15
+ 3. `App/Resources/path-configuration.json` — baked rules + `settings.tabs`
16
+ (`Config#path_configuration_json("ios")`); the same document is served live
17
+ at `/everywhere/ios_v1.json` by the gem's `MobileConfigEndpoint`, which the
18
+ shell loads as its second path-configuration source
19
+ 4. `App/Assets.xcassets/AppIcon.appiconset/AppIcon.png` — the app icon (1024×1024 opaque PNG)
20
+ 5. *(optionally)* `App/Assets.xcassets/AccentColor.colorset/Contents.json` and
21
+ `App/Assets.xcassets/LaunchBackground.colorset/Contents.json` — brand colors
22
+
23
+ Everything the CLI needs to vary per app flows through those files. The product
24
+ is always `App.app` (`PRODUCT_NAME = App` is hardcoded); identity comes from the
25
+ xcconfig (`PRODUCT_BUNDLE_IDENTIFIER`, `MARKETING_VERSION`,
26
+ `CURRENT_PROJECT_VERSION`, `INFOPLIST_KEY_CFBundleDisplayName`,
27
+ `DEVELOPMENT_TEAM`).
28
+
29
+ **Structural changes** (new source files, build settings, resources, package
30
+ bumps) mean deliberately editing `project.pbxproj` here in the template and
31
+ recommitting — never in a stamped copy.
32
+
33
+ ## SPM pin policy
34
+
35
+ The project depends on one package:
36
+ `https://github.com/hotwired/hotwire-native-ios`, `upToNextMajorVersion` from
37
+ `1.3.0`. The committed
38
+ `App.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved` pins
39
+ the exact 1.3.x version used for builds; regenerating it (a deliberate act) is
40
+ how the pin moves.
41
+
42
+ ## Building standalone
43
+
44
+ The raw template builds green with placeholder values, Simulator-only, no
45
+ signing:
46
+
47
+ ```
48
+ xcodebuild build -project App.xcodeproj -scheme App -destination 'generic/platform=iOS Simulator' CODE_SIGNING_ALLOWED=NO
49
+ ```
50
+
51
+ The shared `App` scheme is required for headless `xcodebuild` — do not delete it.
52
+
53
+ ## Dev loop
54
+
55
+ The shell is remote-mode only (`remote_url` in everywhere.json). For local
56
+ development against `http://127.0.0.1:<port>`, launch with an override — the
57
+ Info.plist already allows local networking (`NSAllowsLocalNetworking`, not
58
+ `NSAllowsArbitraryLoads`):
59
+
60
+ ```
61
+ xcrun simctl launch --terminate-running-process booted com.rubyeverywhere.app \
62
+ SIMCTL_CHILD_EVERYWHERE_DEV_URL=http://127.0.0.1:3000
63
+ ```
64
+
65
+ (`simctl` forwards `SIMCTL_CHILD_*` variables to the app process, where
66
+ `EverywhereConfig.rootURL` reads `EVERYWHERE_DEV_URL`.)