@bitmagic/cli 0.1.55-dev.0 → 0.1.55-dev.2
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.
- package/README.md +45 -3
- package/dist/cli.d.ts +23 -1
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/cover.d.ts +13 -2
- package/dist/commands/cover.js +21 -7
- package/dist/commands/cover.js.map +1 -1
- package/dist/commands/forge.d.ts +14 -0
- package/dist/commands/forge.js +41 -3
- package/dist/commands/forge.js.map +1 -1
- package/dist/commands/generate.d.ts +12 -0
- package/dist/commands/generate.js +77 -24
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/init.js +4 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/ios.d.ts +2 -0
- package/dist/commands/ios.js +333 -0
- package/dist/commands/ios.js.map +1 -0
- package/dist/commands/reference.d.ts +41 -0
- package/dist/commands/reference.js +398 -0
- package/dist/commands/reference.js.map +1 -0
- package/dist/generate/stream.d.ts +6 -0
- package/dist/generate/stream.js +2 -1
- package/dist/generate/stream.js.map +1 -1
- package/dist/ios/app-config.d.ts +54 -0
- package/dist/ios/app-config.js +109 -0
- package/dist/ios/app-config.js.map +1 -0
- package/dist/ios/collect-urls.d.ts +73 -0
- package/dist/ios/collect-urls.js +230 -0
- package/dist/ios/collect-urls.js.map +1 -0
- package/dist/ios/icon.d.ts +12 -0
- package/dist/ios/icon.js +70 -0
- package/dist/ios/icon.js.map +1 -0
- package/dist/ios/local-server.d.ts +11 -0
- package/dist/ios/local-server.js +88 -0
- package/dist/ios/local-server.js.map +1 -0
- package/dist/ios/paths.d.ts +21 -0
- package/dist/ios/paths.js +23 -0
- package/dist/ios/paths.js.map +1 -0
- package/dist/ios/record-validate.d.ts +25 -0
- package/dist/ios/record-validate.js +98 -0
- package/dist/ios/record-validate.js.map +1 -0
- package/dist/ios/transform.d.ts +47 -0
- package/dist/ios/transform.js +67 -0
- package/dist/ios/transform.js.map +1 -0
- package/dist/ios/vendor.d.ts +29 -0
- package/dist/ios/vendor.js +113 -0
- package/dist/ios/vendor.js.map +1 -0
- package/dist/ios/xcode-template.d.ts +11 -0
- package/dist/ios/xcode-template.js +615 -0
- package/dist/ios/xcode-template.js.map +1 -0
- package/dist/ios/xcodebuild.d.ts +71 -0
- package/dist/ios/xcodebuild.js +216 -0
- package/dist/ios/xcodebuild.js.map +1 -0
- package/dist/project/jobs.d.ts +1 -1
- package/dist/project/reference-file.d.ts +44 -0
- package/dist/project/reference-file.js +94 -0
- package/dist/project/reference-file.js.map +1 -0
- package/dist/project/reference.d.ts +78 -0
- package/dist/project/reference.js +175 -0
- package/dist/project/reference.js.map +1 -0
- package/dist/scaffold/project-files.js +19 -16
- package/dist/scaffold/project-files.js.map +1 -1
- package/dist/scaffold/reference-guidance.d.ts +20 -0
- package/dist/scaffold/reference-guidance.js +79 -0
- package/dist/scaffold/reference-guidance.js.map +1 -0
- package/dist/update/self-install.d.ts +15 -6
- package/dist/update/self-install.js +56 -15
- package/dist/update/self-install.js.map +1 -1
- package/dist/verify/browser.d.ts +8 -0
- package/dist/verify/browser.js +2 -0
- package/dist/verify/browser.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,615 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The generated Xcode project (§6/§7 of docs/ios-export-design.md): a minimal WKWebView shell
|
|
3
|
+
* with zero dependencies, emitted fresh on every build under `.bitmagic/ios/App/`.
|
|
4
|
+
*
|
|
5
|
+
* Templates are TypeScript string literals because the CLI ships nothing but `dist/`. Escaping
|
|
6
|
+
* rules that matter here: a Swift `\(interpolation)` would need a doubled backslash to survive
|
|
7
|
+
* a JS template literal, so the Swift below avoids interpolation entirely; nothing emitted may
|
|
8
|
+
* contain a backtick.
|
|
9
|
+
*
|
|
10
|
+
* The pbxproj is static — fixed UUIDs, identity injected as build settings — and the payload
|
|
11
|
+
* enters as a FOLDER REFERENCE, so the project file never has to enumerate assets.
|
|
12
|
+
*/
|
|
13
|
+
import * as fs from 'fs';
|
|
14
|
+
import * as path from 'path';
|
|
15
|
+
import { FALLBACK_MIME, MIME_TYPES } from './local-server.js';
|
|
16
|
+
export const TARGET_NAME = 'Game';
|
|
17
|
+
export const PAYLOAD_DIR_NAME = 'GamePayload';
|
|
18
|
+
export const URL_SCHEME = 'bmapp';
|
|
19
|
+
/** Fixed 24-hex-char pbxproj object ids. */
|
|
20
|
+
function uid(n) {
|
|
21
|
+
return `BA5EBA11000000000000${n.toString(16).toUpperCase().padStart(4, '0')}`;
|
|
22
|
+
}
|
|
23
|
+
const ID = {
|
|
24
|
+
project: uid(1),
|
|
25
|
+
target: uid(2),
|
|
26
|
+
projectConfigList: uid(3),
|
|
27
|
+
targetConfigList: uid(4),
|
|
28
|
+
projectDebug: uid(5),
|
|
29
|
+
projectRelease: uid(6),
|
|
30
|
+
targetDebug: uid(7),
|
|
31
|
+
targetRelease: uid(8),
|
|
32
|
+
sourcesPhase: uid(9),
|
|
33
|
+
resourcesPhase: uid(10),
|
|
34
|
+
frameworksPhase: uid(11),
|
|
35
|
+
mainGroup: uid(12),
|
|
36
|
+
sourcesGroup: uid(13),
|
|
37
|
+
productsGroup: uid(14),
|
|
38
|
+
productRef: uid(15),
|
|
39
|
+
refAppDelegate: uid(16),
|
|
40
|
+
refViewController: uid(17),
|
|
41
|
+
refSchemeHandler: uid(18),
|
|
42
|
+
refInfoPlist: uid(19),
|
|
43
|
+
refAssets: uid(20),
|
|
44
|
+
refPayload: uid(21),
|
|
45
|
+
buildAppDelegate: uid(22),
|
|
46
|
+
buildViewController: uid(23),
|
|
47
|
+
buildSchemeHandler: uid(24),
|
|
48
|
+
buildAssets: uid(25),
|
|
49
|
+
buildPayload: uid(26),
|
|
50
|
+
};
|
|
51
|
+
function pbxproj(config) {
|
|
52
|
+
const team = config.teamId !== undefined ? `\n\t\t\t\tDEVELOPMENT_TEAM = "${config.teamId}";` : '';
|
|
53
|
+
const targetSettings = `\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
54
|
+
\t\t\t\tCODE_SIGN_STYLE = Automatic;
|
|
55
|
+
\t\t\t\tCURRENT_PROJECT_VERSION = ${config.buildNumber};${team}
|
|
56
|
+
\t\t\t\tGENERATE_INFOPLIST_FILE = NO;
|
|
57
|
+
\t\t\t\tINFOPLIST_FILE = Info.plist;
|
|
58
|
+
\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
|
59
|
+
\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (
|
|
60
|
+
\t\t\t\t\t"$(inherited)",
|
|
61
|
+
\t\t\t\t\t"@executable_path/Frameworks",
|
|
62
|
+
\t\t\t\t);
|
|
63
|
+
\t\t\t\tMARKETING_VERSION = ${config.version};
|
|
64
|
+
\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = "${config.bundleId}";
|
|
65
|
+
\t\t\t\tPRODUCT_NAME = "${config.productName}";
|
|
66
|
+
\t\t\t\tSDKROOT = iphoneos;
|
|
67
|
+
\t\t\t\tSWIFT_VERSION = 5.0;
|
|
68
|
+
\t\t\t\tTARGETED_DEVICE_FAMILY = "1,2";`;
|
|
69
|
+
return `// !$*UTF8*$!
|
|
70
|
+
{
|
|
71
|
+
\tarchiveVersion = 1;
|
|
72
|
+
\tclasses = {
|
|
73
|
+
\t};
|
|
74
|
+
\tobjectVersion = 56;
|
|
75
|
+
\tobjects = {
|
|
76
|
+
|
|
77
|
+
/* Begin PBXBuildFile section */
|
|
78
|
+
\t\t${ID.buildAppDelegate} /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = ${ID.refAppDelegate}; };
|
|
79
|
+
\t\t${ID.buildViewController} /* GameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ${ID.refViewController}; };
|
|
80
|
+
\t\t${ID.buildSchemeHandler} /* PayloadSchemeHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = ${ID.refSchemeHandler}; };
|
|
81
|
+
\t\t${ID.buildAssets} /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = ${ID.refAssets}; };
|
|
82
|
+
\t\t${ID.buildPayload} /* ${PAYLOAD_DIR_NAME} in Resources */ = {isa = PBXBuildFile; fileRef = ${ID.refPayload}; };
|
|
83
|
+
/* End PBXBuildFile section */
|
|
84
|
+
|
|
85
|
+
/* Begin PBXFileReference section */
|
|
86
|
+
\t\t${ID.productRef} /* app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "${config.productName}.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
87
|
+
\t\t${ID.refAppDelegate} /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
|
88
|
+
\t\t${ID.refViewController} /* GameViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameViewController.swift; sourceTree = "<group>"; };
|
|
89
|
+
\t\t${ID.refSchemeHandler} /* PayloadSchemeHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PayloadSchemeHandler.swift; sourceTree = "<group>"; };
|
|
90
|
+
\t\t${ID.refInfoPlist} /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
|
91
|
+
\t\t${ID.refAssets} /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
|
92
|
+
\t\t${ID.refPayload} /* ${PAYLOAD_DIR_NAME} */ = {isa = PBXFileReference; lastKnownFileType = folder; path = ${PAYLOAD_DIR_NAME}; sourceTree = "<group>"; };
|
|
93
|
+
/* End PBXFileReference section */
|
|
94
|
+
|
|
95
|
+
/* Begin PBXFrameworksBuildPhase section */
|
|
96
|
+
\t\t${ID.frameworksPhase} /* Frameworks */ = {
|
|
97
|
+
\t\t\tisa = PBXFrameworksBuildPhase;
|
|
98
|
+
\t\t\tbuildActionMask = 2147483647;
|
|
99
|
+
\t\t\tfiles = (
|
|
100
|
+
\t\t\t);
|
|
101
|
+
\t\t\trunOnlyForDeploymentPostprocessing = 0;
|
|
102
|
+
\t\t};
|
|
103
|
+
/* End PBXFrameworksBuildPhase section */
|
|
104
|
+
|
|
105
|
+
/* Begin PBXGroup section */
|
|
106
|
+
\t\t${ID.mainGroup} = {
|
|
107
|
+
\t\t\tisa = PBXGroup;
|
|
108
|
+
\t\t\tchildren = (
|
|
109
|
+
\t\t\t\t${ID.sourcesGroup} /* Sources */,
|
|
110
|
+
\t\t\t\t${ID.refInfoPlist} /* Info.plist */,
|
|
111
|
+
\t\t\t\t${ID.refAssets} /* Assets.xcassets */,
|
|
112
|
+
\t\t\t\t${ID.refPayload} /* ${PAYLOAD_DIR_NAME} */,
|
|
113
|
+
\t\t\t\t${ID.productsGroup} /* Products */,
|
|
114
|
+
\t\t\t);
|
|
115
|
+
\t\t\tsourceTree = "<group>";
|
|
116
|
+
\t\t};
|
|
117
|
+
\t\t${ID.sourcesGroup} /* Sources */ = {
|
|
118
|
+
\t\t\tisa = PBXGroup;
|
|
119
|
+
\t\t\tchildren = (
|
|
120
|
+
\t\t\t\t${ID.refAppDelegate} /* AppDelegate.swift */,
|
|
121
|
+
\t\t\t\t${ID.refViewController} /* GameViewController.swift */,
|
|
122
|
+
\t\t\t\t${ID.refSchemeHandler} /* PayloadSchemeHandler.swift */,
|
|
123
|
+
\t\t\t);
|
|
124
|
+
\t\t\tpath = Sources;
|
|
125
|
+
\t\t\tsourceTree = "<group>";
|
|
126
|
+
\t\t};
|
|
127
|
+
\t\t${ID.productsGroup} /* Products */ = {
|
|
128
|
+
\t\t\tisa = PBXGroup;
|
|
129
|
+
\t\t\tchildren = (
|
|
130
|
+
\t\t\t\t${ID.productRef} /* app */,
|
|
131
|
+
\t\t\t);
|
|
132
|
+
\t\t\tname = Products;
|
|
133
|
+
\t\t\tsourceTree = "<group>";
|
|
134
|
+
\t\t};
|
|
135
|
+
/* End PBXGroup section */
|
|
136
|
+
|
|
137
|
+
/* Begin PBXNativeTarget section */
|
|
138
|
+
\t\t${ID.target} /* ${TARGET_NAME} */ = {
|
|
139
|
+
\t\t\tisa = PBXNativeTarget;
|
|
140
|
+
\t\t\tbuildConfigurationList = ${ID.targetConfigList};
|
|
141
|
+
\t\t\tbuildPhases = (
|
|
142
|
+
\t\t\t\t${ID.sourcesPhase} /* Sources */,
|
|
143
|
+
\t\t\t\t${ID.frameworksPhase} /* Frameworks */,
|
|
144
|
+
\t\t\t\t${ID.resourcesPhase} /* Resources */,
|
|
145
|
+
\t\t\t);
|
|
146
|
+
\t\t\tbuildRules = (
|
|
147
|
+
\t\t\t);
|
|
148
|
+
\t\t\tdependencies = (
|
|
149
|
+
\t\t\t);
|
|
150
|
+
\t\t\tname = ${TARGET_NAME};
|
|
151
|
+
\t\t\tproductName = ${TARGET_NAME};
|
|
152
|
+
\t\t\tproductReference = ${ID.productRef};
|
|
153
|
+
\t\t\tproductType = "com.apple.product-type.application";
|
|
154
|
+
\t\t};
|
|
155
|
+
/* End PBXNativeTarget section */
|
|
156
|
+
|
|
157
|
+
/* Begin PBXProject section */
|
|
158
|
+
\t\t${ID.project} /* Project object */ = {
|
|
159
|
+
\t\t\tisa = PBXProject;
|
|
160
|
+
\t\t\tattributes = {
|
|
161
|
+
\t\t\t\tBuildIndependentTargetsInParallel = 1;
|
|
162
|
+
\t\t\t\tLastUpgradeCheck = 1500;
|
|
163
|
+
\t\t\t};
|
|
164
|
+
\t\t\tbuildConfigurationList = ${ID.projectConfigList};
|
|
165
|
+
\t\t\tcompatibilityVersion = "Xcode 14.0";
|
|
166
|
+
\t\t\tdevelopmentRegion = en;
|
|
167
|
+
\t\t\thasScannedForEncodings = 0;
|
|
168
|
+
\t\t\tknownRegions = (
|
|
169
|
+
\t\t\t\ten,
|
|
170
|
+
\t\t\t\tBase,
|
|
171
|
+
\t\t\t);
|
|
172
|
+
\t\t\tmainGroup = ${ID.mainGroup};
|
|
173
|
+
\t\t\tproductRefGroup = ${ID.productsGroup};
|
|
174
|
+
\t\t\tprojectDirPath = "";
|
|
175
|
+
\t\t\tprojectRoot = "";
|
|
176
|
+
\t\t\ttargets = (
|
|
177
|
+
\t\t\t\t${ID.target} /* ${TARGET_NAME} */,
|
|
178
|
+
\t\t\t);
|
|
179
|
+
\t\t};
|
|
180
|
+
/* End PBXProject section */
|
|
181
|
+
|
|
182
|
+
/* Begin PBXResourcesBuildPhase section */
|
|
183
|
+
\t\t${ID.resourcesPhase} /* Resources */ = {
|
|
184
|
+
\t\t\tisa = PBXResourcesBuildPhase;
|
|
185
|
+
\t\t\tbuildActionMask = 2147483647;
|
|
186
|
+
\t\t\tfiles = (
|
|
187
|
+
\t\t\t\t${ID.buildAssets} /* Assets.xcassets in Resources */,
|
|
188
|
+
\t\t\t\t${ID.buildPayload} /* ${PAYLOAD_DIR_NAME} in Resources */,
|
|
189
|
+
\t\t\t);
|
|
190
|
+
\t\t\trunOnlyForDeploymentPostprocessing = 0;
|
|
191
|
+
\t\t};
|
|
192
|
+
/* End PBXResourcesBuildPhase section */
|
|
193
|
+
|
|
194
|
+
/* Begin PBXSourcesBuildPhase section */
|
|
195
|
+
\t\t${ID.sourcesPhase} /* Sources */ = {
|
|
196
|
+
\t\t\tisa = PBXSourcesBuildPhase;
|
|
197
|
+
\t\t\tbuildActionMask = 2147483647;
|
|
198
|
+
\t\t\tfiles = (
|
|
199
|
+
\t\t\t\t${ID.buildAppDelegate} /* AppDelegate.swift in Sources */,
|
|
200
|
+
\t\t\t\t${ID.buildViewController} /* GameViewController.swift in Sources */,
|
|
201
|
+
\t\t\t\t${ID.buildSchemeHandler} /* PayloadSchemeHandler.swift in Sources */,
|
|
202
|
+
\t\t\t);
|
|
203
|
+
\t\t\trunOnlyForDeploymentPostprocessing = 0;
|
|
204
|
+
\t\t};
|
|
205
|
+
/* End PBXSourcesBuildPhase section */
|
|
206
|
+
|
|
207
|
+
/* Begin XCBuildConfiguration section */
|
|
208
|
+
\t\t${ID.projectDebug} /* Debug */ = {
|
|
209
|
+
\t\t\tisa = XCBuildConfiguration;
|
|
210
|
+
\t\t\tbuildSettings = {
|
|
211
|
+
\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;
|
|
212
|
+
\t\t\t\tCLANG_ENABLE_MODULES = YES;
|
|
213
|
+
\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;
|
|
214
|
+
\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;
|
|
215
|
+
\t\t\t\tENABLE_TESTABILITY = YES;
|
|
216
|
+
\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;
|
|
217
|
+
\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;
|
|
218
|
+
\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
|
219
|
+
\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
|
220
|
+
\t\t\t\tONLY_ACTIVE_ARCH = YES;
|
|
221
|
+
\t\t\t\tSDKROOT = iphoneos;
|
|
222
|
+
\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
|
|
223
|
+
\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
|
224
|
+
\t\t\t};
|
|
225
|
+
\t\t\tname = Debug;
|
|
226
|
+
\t\t};
|
|
227
|
+
\t\t${ID.projectRelease} /* Release */ = {
|
|
228
|
+
\t\t\tisa = XCBuildConfiguration;
|
|
229
|
+
\t\t\tbuildSettings = {
|
|
230
|
+
\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;
|
|
231
|
+
\t\t\t\tCLANG_ENABLE_MODULES = YES;
|
|
232
|
+
\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;
|
|
233
|
+
\t\t\t\tDEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
|
234
|
+
\t\t\t\tENABLE_NS_ASSERTIONS = NO;
|
|
235
|
+
\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;
|
|
236
|
+
\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
|
237
|
+
\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;
|
|
238
|
+
\t\t\t\tSDKROOT = iphoneos;
|
|
239
|
+
\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;
|
|
240
|
+
\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = "-O";
|
|
241
|
+
\t\t\t\tVALIDATE_PRODUCT = YES;
|
|
242
|
+
\t\t\t};
|
|
243
|
+
\t\t\tname = Release;
|
|
244
|
+
\t\t};
|
|
245
|
+
\t\t${ID.targetDebug} /* Debug */ = {
|
|
246
|
+
\t\t\tisa = XCBuildConfiguration;
|
|
247
|
+
\t\t\tbuildSettings = {
|
|
248
|
+
${targetSettings}
|
|
249
|
+
\t\t\t};
|
|
250
|
+
\t\t\tname = Debug;
|
|
251
|
+
\t\t};
|
|
252
|
+
\t\t${ID.targetRelease} /* Release */ = {
|
|
253
|
+
\t\t\tisa = XCBuildConfiguration;
|
|
254
|
+
\t\t\tbuildSettings = {
|
|
255
|
+
${targetSettings}
|
|
256
|
+
\t\t\t};
|
|
257
|
+
\t\t\tname = Release;
|
|
258
|
+
\t\t};
|
|
259
|
+
/* End XCBuildConfiguration section */
|
|
260
|
+
|
|
261
|
+
/* Begin XCConfigurationList section */
|
|
262
|
+
\t\t${ID.projectConfigList} /* Build configuration list for PBXProject */ = {
|
|
263
|
+
\t\t\tisa = XCConfigurationList;
|
|
264
|
+
\t\t\tbuildConfigurations = (
|
|
265
|
+
\t\t\t\t${ID.projectDebug} /* Debug */,
|
|
266
|
+
\t\t\t\t${ID.projectRelease} /* Release */,
|
|
267
|
+
\t\t\t);
|
|
268
|
+
\t\t\tdefaultConfigurationIsVisible = 0;
|
|
269
|
+
\t\t\tdefaultConfigurationName = Release;
|
|
270
|
+
\t\t};
|
|
271
|
+
\t\t${ID.targetConfigList} /* Build configuration list for PBXNativeTarget */ = {
|
|
272
|
+
\t\t\tisa = XCConfigurationList;
|
|
273
|
+
\t\t\tbuildConfigurations = (
|
|
274
|
+
\t\t\t\t${ID.targetDebug} /* Debug */,
|
|
275
|
+
\t\t\t\t${ID.targetRelease} /* Release */,
|
|
276
|
+
\t\t\t);
|
|
277
|
+
\t\t\tdefaultConfigurationIsVisible = 0;
|
|
278
|
+
\t\t\tdefaultConfigurationName = Release;
|
|
279
|
+
\t\t};
|
|
280
|
+
/* End XCConfigurationList section */
|
|
281
|
+
\t};
|
|
282
|
+
\trootObject = ${ID.project} /* Project object */;
|
|
283
|
+
}
|
|
284
|
+
`;
|
|
285
|
+
}
|
|
286
|
+
function xcscheme(config) {
|
|
287
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
288
|
+
<Scheme LastUpgradeVersion="1500" version="1.7">
|
|
289
|
+
<BuildAction parallelizeBuildables="YES" buildImplicitDependencies="YES">
|
|
290
|
+
<BuildActionEntries>
|
|
291
|
+
<BuildActionEntry buildForTesting="YES" buildForRunning="YES" buildForProfiling="YES" buildForArchiving="YES" buildForAnalyzing="YES">
|
|
292
|
+
<BuildableReference
|
|
293
|
+
BuildableIdentifier="primary"
|
|
294
|
+
BlueprintIdentifier="${ID.target}"
|
|
295
|
+
BuildableName="${config.productName}.app"
|
|
296
|
+
BlueprintName="${TARGET_NAME}"
|
|
297
|
+
ReferencedContainer="container:App.xcodeproj">
|
|
298
|
+
</BuildableReference>
|
|
299
|
+
</BuildActionEntry>
|
|
300
|
+
</BuildActionEntries>
|
|
301
|
+
</BuildAction>
|
|
302
|
+
<LaunchAction buildConfiguration="Release" selectedDebuggerIdentifier="Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier="Xcode.DebuggerFoundation.Launcher.LLDB" launchStyle="0" useCustomWorkingDirectory="NO" ignoresPersistentStateOnLaunch="NO" debugDocumentVersioning="YES" debugServiceExtension="internal" allowLocationSimulation="YES">
|
|
303
|
+
<BuildableProductRunnable runnableDebuggingMode="0">
|
|
304
|
+
<BuildableReference
|
|
305
|
+
BuildableIdentifier="primary"
|
|
306
|
+
BlueprintIdentifier="${ID.target}"
|
|
307
|
+
BuildableName="${config.productName}.app"
|
|
308
|
+
BlueprintName="${TARGET_NAME}"
|
|
309
|
+
ReferencedContainer="container:App.xcodeproj">
|
|
310
|
+
</BuildableReference>
|
|
311
|
+
</BuildableProductRunnable>
|
|
312
|
+
</LaunchAction>
|
|
313
|
+
<ArchiveAction buildConfiguration="Release" revealArchiveInOrganizer="YES">
|
|
314
|
+
</ArchiveAction>
|
|
315
|
+
</Scheme>
|
|
316
|
+
`;
|
|
317
|
+
}
|
|
318
|
+
/** The Info.plist orientation array for the project's declaration (§6). */
|
|
319
|
+
export function orientationValues(orientation) {
|
|
320
|
+
if (orientation === 'portrait')
|
|
321
|
+
return ['UIInterfaceOrientationPortrait'];
|
|
322
|
+
if (orientation === 'landscape') {
|
|
323
|
+
return ['UIInterfaceOrientationLandscapeLeft', 'UIInterfaceOrientationLandscapeRight'];
|
|
324
|
+
}
|
|
325
|
+
return [
|
|
326
|
+
'UIInterfaceOrientationPortrait',
|
|
327
|
+
'UIInterfaceOrientationLandscapeLeft',
|
|
328
|
+
'UIInterfaceOrientationLandscapeRight',
|
|
329
|
+
];
|
|
330
|
+
}
|
|
331
|
+
function escapeXml(value) {
|
|
332
|
+
return value
|
|
333
|
+
.replace(/&/g, '&')
|
|
334
|
+
.replace(/</g, '<')
|
|
335
|
+
.replace(/>/g, '>')
|
|
336
|
+
.replace(/"/g, '"');
|
|
337
|
+
}
|
|
338
|
+
function infoPlist(config) {
|
|
339
|
+
const orientations = orientationValues(config.orientation)
|
|
340
|
+
.map((value) => `\t\t<string>${value}</string>`)
|
|
341
|
+
.join('\n');
|
|
342
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
343
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
344
|
+
<plist version="1.0">
|
|
345
|
+
<dict>
|
|
346
|
+
\t<key>CFBundleDevelopmentRegion</key>
|
|
347
|
+
\t<string>en</string>
|
|
348
|
+
\t<key>CFBundleDisplayName</key>
|
|
349
|
+
\t<string>${escapeXml(config.displayName)}</string>
|
|
350
|
+
\t<key>CFBundleExecutable</key>
|
|
351
|
+
\t<string>$(EXECUTABLE_NAME)</string>
|
|
352
|
+
\t<key>CFBundleIdentifier</key>
|
|
353
|
+
\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
|
354
|
+
\t<key>CFBundleInfoDictionaryVersion</key>
|
|
355
|
+
\t<string>6.0</string>
|
|
356
|
+
\t<key>CFBundleName</key>
|
|
357
|
+
\t<string>$(PRODUCT_NAME)</string>
|
|
358
|
+
\t<key>CFBundlePackageType</key>
|
|
359
|
+
\t<string>APPL</string>
|
|
360
|
+
\t<key>CFBundleShortVersionString</key>
|
|
361
|
+
\t<string>$(MARKETING_VERSION)</string>
|
|
362
|
+
\t<key>CFBundleVersion</key>
|
|
363
|
+
\t<string>$(CURRENT_PROJECT_VERSION)</string>
|
|
364
|
+
\t<key>ITSAppUsesNonExemptEncryption</key>
|
|
365
|
+
\t<false/>
|
|
366
|
+
\t<key>LSRequiresIPhoneOS</key>
|
|
367
|
+
\t<true/>
|
|
368
|
+
\t<key>UILaunchScreen</key>
|
|
369
|
+
\t<dict>
|
|
370
|
+
\t\t<key>UIColorName</key>
|
|
371
|
+
\t\t<string>LaunchBackground</string>
|
|
372
|
+
\t</dict>
|
|
373
|
+
\t<key>UIRequiresFullScreen</key>
|
|
374
|
+
\t<true/>
|
|
375
|
+
\t<key>UIStatusBarHidden</key>
|
|
376
|
+
\t<true/>
|
|
377
|
+
\t<key>UISupportedInterfaceOrientations</key>
|
|
378
|
+
\t<array>
|
|
379
|
+
${orientations}
|
|
380
|
+
\t</array>
|
|
381
|
+
\t<key>UISupportedInterfaceOrientations~ipad</key>
|
|
382
|
+
\t<array>
|
|
383
|
+
${orientations}
|
|
384
|
+
\t</array>
|
|
385
|
+
\t<key>UIViewControllerBasedStatusBarAppearance</key>
|
|
386
|
+
\t<true/>
|
|
387
|
+
</dict>
|
|
388
|
+
</plist>
|
|
389
|
+
`;
|
|
390
|
+
}
|
|
391
|
+
const APP_DELEGATE_SWIFT = `import UIKit
|
|
392
|
+
|
|
393
|
+
@main
|
|
394
|
+
class AppDelegate: UIResponder, UIApplicationDelegate {
|
|
395
|
+
var window: UIWindow?
|
|
396
|
+
|
|
397
|
+
func application(
|
|
398
|
+
_ application: UIApplication,
|
|
399
|
+
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
|
|
400
|
+
) -> Bool {
|
|
401
|
+
let window = UIWindow(frame: UIScreen.main.bounds)
|
|
402
|
+
window.backgroundColor = .black
|
|
403
|
+
window.rootViewController = GameViewController()
|
|
404
|
+
window.makeKeyAndVisible()
|
|
405
|
+
self.window = window
|
|
406
|
+
// A game renders continuously; never dim or lock mid-session.
|
|
407
|
+
application.isIdleTimerDisabled = true
|
|
408
|
+
return true
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
`;
|
|
412
|
+
const GAME_VIEW_CONTROLLER_SWIFT = `import UIKit
|
|
413
|
+
import WebKit
|
|
414
|
+
|
|
415
|
+
/// Full-bleed WKWebView hosting the packaged game. The page is served through
|
|
416
|
+
/// PayloadSchemeHandler so fetch(), module scripts and relative asset paths behave like a real
|
|
417
|
+
/// origin, which file:// would not give them.
|
|
418
|
+
class GameViewController: UIViewController, WKNavigationDelegate {
|
|
419
|
+
private var webView: WKWebView?
|
|
420
|
+
|
|
421
|
+
override func viewDidLoad() {
|
|
422
|
+
super.viewDidLoad()
|
|
423
|
+
view.backgroundColor = .black
|
|
424
|
+
|
|
425
|
+
let configuration = WKWebViewConfiguration()
|
|
426
|
+
configuration.setURLSchemeHandler(PayloadSchemeHandler(), forURLScheme: PayloadSchemeHandler.scheme)
|
|
427
|
+
configuration.allowsInlineMediaPlayback = true
|
|
428
|
+
configuration.mediaTypesRequiringUserActionForPlayback = []
|
|
429
|
+
|
|
430
|
+
let webView = WKWebView(frame: view.bounds, configuration: configuration)
|
|
431
|
+
webView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
|
|
432
|
+
webView.navigationDelegate = self
|
|
433
|
+
webView.isOpaque = false
|
|
434
|
+
webView.backgroundColor = .black
|
|
435
|
+
webView.scrollView.isScrollEnabled = false
|
|
436
|
+
webView.scrollView.bounces = false
|
|
437
|
+
webView.scrollView.contentInsetAdjustmentBehavior = .never
|
|
438
|
+
#if DEBUG
|
|
439
|
+
if #available(iOS 16.4, *) {
|
|
440
|
+
webView.isInspectable = true
|
|
441
|
+
}
|
|
442
|
+
#endif
|
|
443
|
+
view.addSubview(webView)
|
|
444
|
+
self.webView = webView
|
|
445
|
+
|
|
446
|
+
// ?platform=mobile is the engine's own boot override: it wins over every device probe,
|
|
447
|
+
// so even a desktop-primary game boots with touch controls and mobile budgets.
|
|
448
|
+
let boot = PayloadSchemeHandler.scheme + "://game/index.html?platform=mobile&renderer=webgl"
|
|
449
|
+
if let url = URL(string: boot) {
|
|
450
|
+
webView.load(URLRequest(url: url))
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
override var prefersStatusBarHidden: Bool { true }
|
|
455
|
+
override var prefersHomeIndicatorAutoHidden: Bool { true }
|
|
456
|
+
override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge { .all }
|
|
457
|
+
|
|
458
|
+
func webView(
|
|
459
|
+
_ webView: WKWebView,
|
|
460
|
+
decidePolicyFor navigationAction: WKNavigationAction,
|
|
461
|
+
decisionHandler: @escaping (WKNavigationActionPolicy) -> Void
|
|
462
|
+
) {
|
|
463
|
+
guard let url = navigationAction.request.url else {
|
|
464
|
+
decisionHandler(.allow)
|
|
465
|
+
return
|
|
466
|
+
}
|
|
467
|
+
if url.scheme == PayloadSchemeHandler.scheme {
|
|
468
|
+
decisionHandler(.allow)
|
|
469
|
+
return
|
|
470
|
+
}
|
|
471
|
+
// A top-level navigation away from the game (a credits link, say) opens in the system
|
|
472
|
+
// browser; the game itself never leaves this view. Subresource and WebSocket traffic
|
|
473
|
+
// does not pass through here, so online features are unaffected.
|
|
474
|
+
if navigationAction.targetFrame == nil || navigationAction.navigationType == .linkActivated {
|
|
475
|
+
UIApplication.shared.open(url)
|
|
476
|
+
decisionHandler(.cancel)
|
|
477
|
+
return
|
|
478
|
+
}
|
|
479
|
+
decisionHandler(.allow)
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
`;
|
|
483
|
+
/** The Swift MIME dictionary, generated from the SAME table the validation server uses. */
|
|
484
|
+
function swiftMimeEntries() {
|
|
485
|
+
return MIME_TYPES
|
|
486
|
+
.map(([ext, mime]) => ` "${ext}": "${mime}",`)
|
|
487
|
+
.join('\n');
|
|
488
|
+
}
|
|
489
|
+
function payloadSchemeHandlerSwift() {
|
|
490
|
+
return `import Foundation
|
|
491
|
+
import WebKit
|
|
492
|
+
|
|
493
|
+
/// Serves the bundled GamePayload directory on the app's custom scheme, answering every local
|
|
494
|
+
/// request with the same content types the CLI's validation server used — the offline proof
|
|
495
|
+
/// only holds if the shipped handler answers identically.
|
|
496
|
+
final class PayloadSchemeHandler: NSObject, WKURLSchemeHandler {
|
|
497
|
+
static let scheme = "${URL_SCHEME}"
|
|
498
|
+
|
|
499
|
+
private static let mimeTypes: [String: String] = [
|
|
500
|
+
${swiftMimeEntries()}
|
|
501
|
+
]
|
|
502
|
+
|
|
503
|
+
func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) {
|
|
504
|
+
guard let url = urlSchemeTask.request.url else {
|
|
505
|
+
urlSchemeTask.didFailWithError(URLError(.badURL))
|
|
506
|
+
return
|
|
507
|
+
}
|
|
508
|
+
var relativePath = url.path
|
|
509
|
+
if relativePath.isEmpty || relativePath == "/" {
|
|
510
|
+
relativePath = "/index.html"
|
|
511
|
+
}
|
|
512
|
+
// Never serve outside the payload directory.
|
|
513
|
+
if relativePath.contains("..") {
|
|
514
|
+
urlSchemeTask.didFailWithError(URLError(.fileDoesNotExist))
|
|
515
|
+
return
|
|
516
|
+
}
|
|
517
|
+
guard let payloadRoot = Bundle.main.url(forResource: "${PAYLOAD_DIR_NAME}", withExtension: nil) else {
|
|
518
|
+
urlSchemeTask.didFailWithError(URLError(.fileDoesNotExist))
|
|
519
|
+
return
|
|
520
|
+
}
|
|
521
|
+
let fileUrl = payloadRoot.appendingPathComponent(String(relativePath.dropFirst()))
|
|
522
|
+
guard let data = try? Data(contentsOf: fileUrl) else {
|
|
523
|
+
respond(urlSchemeTask, url: url, status: 404, mime: "text/plain", data: Data("not found".utf8))
|
|
524
|
+
return
|
|
525
|
+
}
|
|
526
|
+
let ext = fileUrl.pathExtension.lowercased()
|
|
527
|
+
let mime = Self.mimeTypes[ext] ?? "${FALLBACK_MIME}"
|
|
528
|
+
respond(urlSchemeTask, url: url, status: 200, mime: mime, data: data)
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) {
|
|
532
|
+
// Responses are delivered synchronously in start; there is nothing in flight to stop.
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
private func respond(_ task: WKURLSchemeTask, url: URL, status: Int, mime: String, data: Data) {
|
|
536
|
+
let headers = [
|
|
537
|
+
"Content-Type": mime,
|
|
538
|
+
"Content-Length": String(data.count),
|
|
539
|
+
"Cache-Control": "no-cache",
|
|
540
|
+
]
|
|
541
|
+
guard let response = HTTPURLResponse(url: url, statusCode: status, httpVersion: "HTTP/1.1", headerFields: headers) else {
|
|
542
|
+
task.didFailWithError(URLError(.badServerResponse))
|
|
543
|
+
return
|
|
544
|
+
}
|
|
545
|
+
task.didReceive(response)
|
|
546
|
+
task.didReceive(data)
|
|
547
|
+
task.didFinish()
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
`;
|
|
551
|
+
}
|
|
552
|
+
const XCASSETS_ROOT_CONTENTS = `{
|
|
553
|
+
"info" : {
|
|
554
|
+
"author" : "xcode",
|
|
555
|
+
"version" : 1
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
`;
|
|
559
|
+
const APPICON_CONTENTS = `{
|
|
560
|
+
"images" : [
|
|
561
|
+
{
|
|
562
|
+
"filename" : "icon-1024.png",
|
|
563
|
+
"idiom" : "universal",
|
|
564
|
+
"platform" : "ios",
|
|
565
|
+
"size" : "1024x1024"
|
|
566
|
+
}
|
|
567
|
+
],
|
|
568
|
+
"info" : {
|
|
569
|
+
"author" : "xcode",
|
|
570
|
+
"version" : 1
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
`;
|
|
574
|
+
const LAUNCH_BACKGROUND_CONTENTS = `{
|
|
575
|
+
"colors" : [
|
|
576
|
+
{
|
|
577
|
+
"color" : {
|
|
578
|
+
"color-space" : "srgb",
|
|
579
|
+
"components" : {
|
|
580
|
+
"alpha" : "1.000",
|
|
581
|
+
"blue" : "0.000",
|
|
582
|
+
"green" : "0.000",
|
|
583
|
+
"red" : "0.000"
|
|
584
|
+
}
|
|
585
|
+
},
|
|
586
|
+
"idiom" : "universal"
|
|
587
|
+
}
|
|
588
|
+
],
|
|
589
|
+
"info" : {
|
|
590
|
+
"author" : "xcode",
|
|
591
|
+
"version" : 1
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
`;
|
|
595
|
+
/**
|
|
596
|
+
* Write the whole project (everything except the payload contents and the icon PNG, which have
|
|
597
|
+
* their own producers). Existing files are overwritten — the project is CLI-owned.
|
|
598
|
+
*/
|
|
599
|
+
export function stampXcodeProject(projectDir, config) {
|
|
600
|
+
const write = (relPath, content) => {
|
|
601
|
+
const target = path.join(projectDir, ...relPath.split('/'));
|
|
602
|
+
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
603
|
+
fs.writeFileSync(target, content);
|
|
604
|
+
};
|
|
605
|
+
write('App.xcodeproj/project.pbxproj', pbxproj(config));
|
|
606
|
+
write(`App.xcodeproj/xcshareddata/xcschemes/${TARGET_NAME}.xcscheme`, xcscheme(config));
|
|
607
|
+
write('Info.plist', infoPlist(config));
|
|
608
|
+
write('Sources/AppDelegate.swift', APP_DELEGATE_SWIFT);
|
|
609
|
+
write('Sources/GameViewController.swift', GAME_VIEW_CONTROLLER_SWIFT);
|
|
610
|
+
write('Sources/PayloadSchemeHandler.swift', payloadSchemeHandlerSwift());
|
|
611
|
+
write('Assets.xcassets/Contents.json', XCASSETS_ROOT_CONTENTS);
|
|
612
|
+
write('Assets.xcassets/AppIcon.appiconset/Contents.json', APPICON_CONTENTS);
|
|
613
|
+
write('Assets.xcassets/LaunchBackground.colorset/Contents.json', LAUNCH_BACKGROUND_CONTENTS);
|
|
614
|
+
}
|
|
615
|
+
//# sourceMappingURL=xcode-template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xcode-template.js","sourceRoot":"","sources":["../../src/ios/xcode-template.ts"],"names":[],"mappings":"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"}
|