@shopify/shop-minis-cli 0.0.43 → 0.0.45
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/build/commands/config.d.ts +4 -0
- package/build/commands/config.js +19 -0
- package/build/commands/config.js.map +1 -1
- package/build/commands/dev/index.d.ts +2 -0
- package/build/commands/dev/index.js +8 -2
- package/build/commands/dev/index.js.map +1 -1
- package/build/commands/dev/utils/android.d.ts +6 -4
- package/build/commands/dev/utils/android.js +29 -29
- package/build/commands/dev/utils/android.js.map +1 -1
- package/build/commands/dev/utils/binaries.d.ts +2 -59
- package/build/commands/dev/utils/binaries.js +7 -84
- package/build/commands/dev/utils/binaries.js.map +1 -1
- package/build/commands/dev/utils/build-type.d.ts +2 -0
- package/build/commands/dev/utils/build-type.js +14 -0
- package/build/commands/dev/utils/build-type.js.map +1 -0
- package/build/commands/dev/utils/deeplink.d.ts +2 -2
- package/build/commands/dev/utils/deeplink.js +5 -5
- package/build/commands/dev/utils/deeplink.js.map +1 -1
- package/build/commands/dev/utils/interactive-terminal.d.ts +3 -1
- package/build/commands/dev/utils/interactive-terminal.js +37 -78
- package/build/commands/dev/utils/interactive-terminal.js.map +1 -1
- package/build/commands/dev/utils/metro/metro-server.d.ts +1 -1
- package/build/commands/dev/utils/metro/metro-server.js +1 -1
- package/build/commands/dev/utils/metro/metro-server.js.map +1 -1
- package/build/commands/dev/utils/network.d.ts +8 -8
- package/build/commands/dev/utils/network.js +69 -23
- package/build/commands/dev/utils/network.js.map +1 -1
- package/build/commands/dev/utils/patch-package.d.ts +4 -0
- package/build/commands/dev/utils/patch-package.js +72 -0
- package/build/commands/dev/utils/patch-package.js.map +1 -0
- package/build/commands/dev/utils/platform.d.ts +18 -0
- package/build/commands/dev/utils/platform.js +41 -0
- package/build/commands/dev/utils/platform.js.map +1 -0
- package/build/commands/dev/utils/simulator.d.ts +5 -2
- package/build/commands/dev/utils/simulator.js +27 -13
- package/build/commands/dev/utils/simulator.js.map +1 -1
- package/build/commands/dev/utils/start-app.d.ts +23 -0
- package/build/commands/dev/utils/start-app.js +85 -0
- package/build/commands/dev/utils/start-app.js.map +1 -0
- package/build/commands/dev/utils/types.d.ts +24 -1
- package/build/commands/dev/utils/types.js +6 -1
- package/build/commands/dev/utils/types.js.map +1 -1
- package/build/commands/dev/utils/version.d.ts +64 -0
- package/build/commands/dev/utils/version.js +101 -0
- package/build/commands/dev/utils/version.js.map +1 -0
- package/build/commands/types/autogenerated/shop-minis-admin-api/graphql.d.ts +266 -30
- package/build/commands/types/autogenerated/shop-minis-admin-api/graphql.js +68 -10
- package/build/commands/types/autogenerated/shop-minis-admin-api/graphql.js.map +1 -1
- package/build/index.js +2 -1
- package/build/index.js.map +1 -1
- package/jest.config.ts +2 -2
- package/package.json +3 -1
- package/templates/__template_common/.eslintrc.js +29 -0
- package/templates/__template_common/index.tsx +0 -2
- package/templates/__template_common/package.json +5 -36
- package/templates/__template_common/src/manifest.json +1 -27
- package/templates/__template_common/.eslintrc.json +0 -15
- package/templates/__template_common/patches/react-native+0.68.5.patch +0 -173
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import ora from 'ora';
|
|
2
1
|
import chalk from 'chalk';
|
|
3
2
|
import open from 'open';
|
|
4
|
-
import
|
|
3
|
+
import ora from 'ora';
|
|
5
4
|
import { DEV_PANEL_BASE_URL } from '../../../dev-panel/middleware.js';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
5
|
+
import { getMiniManifest } from '../../utils/minis-manifest.js';
|
|
6
|
+
import { androidHomeExists } from '../../config.js';
|
|
7
|
+
import { maybeLaunchEmulator, promptForAndroidDevices } from './android.js';
|
|
9
8
|
import { getBundleUrl, getDeeplink } from './deeplink.js';
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
9
|
+
import { printQRCode } from './qr-code.js';
|
|
10
|
+
import { bootSimulator, promptForSimulator } from './simulator.js';
|
|
11
|
+
import { startApp } from './start-app.js';
|
|
12
|
+
import { Platform } from './platform.js';
|
|
12
13
|
const { stdin } = process;
|
|
13
14
|
function clearTerminal() {
|
|
14
15
|
process.stdout.write('\x1B[2J\x1B[3J\x1B[H');
|
|
@@ -115,10 +116,10 @@ export class InteractiveTerminal {
|
|
|
115
116
|
this.loadingEnd('fail', `Couldn't launch emulator ${device.name}`);
|
|
116
117
|
break;
|
|
117
118
|
}
|
|
118
|
-
await this.
|
|
119
|
+
await this.startApp(Platform.Android, emulatorId);
|
|
119
120
|
}
|
|
120
121
|
else {
|
|
121
|
-
await this.
|
|
122
|
+
await this.startApp(Platform.Android, device.name);
|
|
122
123
|
}
|
|
123
124
|
}
|
|
124
125
|
else {
|
|
@@ -135,37 +136,7 @@ export class InteractiveTerminal {
|
|
|
135
136
|
if (simulator) {
|
|
136
137
|
this.loadingStart('Launching simulator');
|
|
137
138
|
await bootSimulator(simulator.udid);
|
|
138
|
-
|
|
139
|
-
if (installedShopVersion) {
|
|
140
|
-
this.loadingEnd();
|
|
141
|
-
// We assume that the version being used in the simulator matches the biggest version in the downloads folder
|
|
142
|
-
// because version returned by the simulator does not include build numbers.
|
|
143
|
-
const upgradedVersion = await maybePromptBinaryUpgrade('ios', {
|
|
144
|
-
onDownloadStart: () => {
|
|
145
|
-
this.loadingStart('Downloading Shop (0%)');
|
|
146
|
-
},
|
|
147
|
-
onProgress: progress => {
|
|
148
|
-
this._loading.text = `Downloading Shop (${progress}%)`;
|
|
149
|
-
},
|
|
150
|
-
});
|
|
151
|
-
if (upgradedVersion) {
|
|
152
|
-
this.loadingStart('Installing Shop');
|
|
153
|
-
await installShopInSimulator(simulator.udid, upgradedVersion);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
else {
|
|
157
|
-
this.loadingStart('Downloading Shop (0%)');
|
|
158
|
-
const downloadedVersion = await downloadBinary('ios', {
|
|
159
|
-
onProgress: progress => {
|
|
160
|
-
this._loading.text = `Downloading Shop (${progress}%)`;
|
|
161
|
-
},
|
|
162
|
-
});
|
|
163
|
-
this.loadingStart('Installing Shop\n ↪ You can skip onboarding, or log in with your existing Shop account (optional).');
|
|
164
|
-
await installShopInSimulator(simulator.udid, downloadedVersion);
|
|
165
|
-
}
|
|
166
|
-
this.loadingStart('Opening Shop');
|
|
167
|
-
await deeplinkToSimulator(simulator.udid, await getDeeplink(this.miniHandle, this.options));
|
|
168
|
-
this.loadingEnd();
|
|
139
|
+
await this.startApp(Platform.IOS, simulator.udid);
|
|
169
140
|
}
|
|
170
141
|
else {
|
|
171
142
|
console.log('\nNo simulator was selected\n');
|
|
@@ -178,10 +149,10 @@ export class InteractiveTerminal {
|
|
|
178
149
|
}
|
|
179
150
|
case 'd': {
|
|
180
151
|
// TODO: Should we send these as params? or should the dev panel website already know how to fetch them without the need of query params?
|
|
181
|
-
//
|
|
152
|
+
// Advantage would be that people could just type the base url in the browser whenever they want to open the dev panel. That's impossible with the query params being required
|
|
182
153
|
const paramsObj = {
|
|
183
|
-
bundleUrl:
|
|
184
|
-
deepLink:
|
|
154
|
+
bundleUrl: getBundleUrl(this.options),
|
|
155
|
+
deepLink: getDeeplink(this.miniHandle, this.options, true),
|
|
185
156
|
};
|
|
186
157
|
const searchParams = `?${new URLSearchParams(paramsObj).toString()}`;
|
|
187
158
|
open(`${DEV_PANEL_BASE_URL}${searchParams}`);
|
|
@@ -203,44 +174,32 @@ export class InteractiveTerminal {
|
|
|
203
174
|
console.log(`See ${chalk.blue.underline.bold('https://developer.android.com/studio/command-line/variables')}`);
|
|
204
175
|
await this.waitForAnyKeyAndPrintInstructions();
|
|
205
176
|
}
|
|
206
|
-
async startAndroidApp(deviceId) {
|
|
207
|
-
const installedShopVersion = await getInstalledShopVersionAndroid(deviceId);
|
|
208
|
-
if (installedShopVersion) {
|
|
209
|
-
this.loadingEnd();
|
|
210
|
-
// We assume that the version being used in the emulator matches the biggest version in the downloads folder
|
|
211
|
-
// because version returned by the emulator does not include build numbers.
|
|
212
|
-
const upgradedVersion = await maybePromptBinaryUpgrade('android', {
|
|
213
|
-
onDownloadStart: () => {
|
|
214
|
-
this.loadingStart('Downloading Shop (0%)');
|
|
215
|
-
},
|
|
216
|
-
onProgress: progress => {
|
|
217
|
-
this._loading.text = `Downloading Shop (${progress}%)`;
|
|
218
|
-
},
|
|
219
|
-
});
|
|
220
|
-
if (upgradedVersion) {
|
|
221
|
-
this.loadingStart('Installing Shop');
|
|
222
|
-
await installShopInEmulator(deviceId, upgradedVersion);
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
else {
|
|
226
|
-
this.loadingStart('Downloading Shop (0%)');
|
|
227
|
-
const downloadedVersion = await downloadBinary('android', {
|
|
228
|
-
onProgress: progress => {
|
|
229
|
-
this._loading.text = `Downloading Shop (${progress}%)`;
|
|
230
|
-
},
|
|
231
|
-
});
|
|
232
|
-
this.loadingStart('Installing Shop\n ↪ You can skip onboarding, or log in with your existing Shop account (optional).');
|
|
233
|
-
await installShopInEmulator(deviceId, downloadedVersion);
|
|
234
|
-
}
|
|
235
|
-
this.loadingStart('Opening Shop');
|
|
236
|
-
await connectDevelopmentServer(deviceId);
|
|
237
|
-
await deeplinkToEmulator(deviceId, await getDeeplink(this.miniHandle, this.options));
|
|
238
|
-
this.loadingEnd();
|
|
239
|
-
}
|
|
240
177
|
async printDeeplinkQRCode() {
|
|
241
178
|
console.log('\n');
|
|
242
|
-
await printQRCode(
|
|
179
|
+
await printQRCode(getDeeplink(this.miniHandle, this.options, true));
|
|
243
180
|
console.log('Scan the QR code to open Shop Mini on your device (requires the Shop app to be installed)\n');
|
|
244
181
|
}
|
|
182
|
+
async startApp(platform, deviceId) {
|
|
183
|
+
await startApp({
|
|
184
|
+
platform,
|
|
185
|
+
deviceId,
|
|
186
|
+
deeplink: this.deeplink,
|
|
187
|
+
type: this.options.buildType,
|
|
188
|
+
}, this.loadingHandlers);
|
|
189
|
+
}
|
|
190
|
+
get deeplink() {
|
|
191
|
+
return getDeeplink(this.miniHandle, this.options);
|
|
192
|
+
}
|
|
193
|
+
get loadingHandlers() {
|
|
194
|
+
return {
|
|
195
|
+
onLoadingStart: this.loadingStart.bind(this),
|
|
196
|
+
onLoadingEnd: this.loadingEnd.bind(this),
|
|
197
|
+
onLoadingUpdate: (text) => {
|
|
198
|
+
if (this._loading) {
|
|
199
|
+
this._loading.text = text;
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
}
|
|
245
204
|
}
|
|
246
205
|
//# sourceMappingURL=interactive-terminal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-terminal.js","sourceRoot":"","sources":["../../../../src/commands/dev/utils/interactive-terminal.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"interactive-terminal.js","sourceRoot":"","sources":["../../../../src/commands/dev/utils/interactive-terminal.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import type { DevCommandOptions } from '../../index.js';
|
|
2
|
-
export declare function runMetro(options?: DevCommandOptions): Promise<void>;
|
|
2
|
+
export declare function runMetro(options?: Pick<DevCommandOptions, 'host' | 'resetCache'>): Promise<void>;
|
|
@@ -7,7 +7,7 @@ export async function runMetro(options = DEFAULT_OPTIONS) {
|
|
|
7
7
|
const { host, ...metroOptions } = options;
|
|
8
8
|
const metroServerConfig = {
|
|
9
9
|
...(await getMetroConfig()),
|
|
10
|
-
metroOptions,
|
|
10
|
+
...metroOptions,
|
|
11
11
|
};
|
|
12
12
|
await Metro.runServer(metroServerConfig, { host });
|
|
13
13
|
if (host !== 'localhost') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metro-server.js","sourceRoot":"","sources":["../../../../../src/commands/dev/utils/metro/metro-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"metro-server.js","sourceRoot":"","sources":["../../../../../src/commands/dev/utils/metro/metro-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,OAAO,EAAC,cAAc,EAAC,MAAM,mBAAmB,CAAA;AAEhD,MAAM,eAAe,GAAG;IACtB,UAAU,EAAE,KAAK;CACT,CAAA;AAEV,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,UAA0D,eAAe;IAEzE,MAAM,EAAC,IAAI,EAAE,GAAG,YAAY,EAAC,GAAG,OAAO,CAAA;IACvC,MAAM,iBAAiB,GAAY;QACjC,GAAG,CAAC,MAAM,cAAc,EAAE,CAAC;QAC3B,GAAG,YAAY;KAChB,CAAA;IAED,MAAM,KAAK,CAAC,SAAS,CAAC,iBAAiB,EAAE,EAAC,IAAI,EAAC,CAAC,CAAA;IAEhD,IAAI,IAAI,KAAK,WAAW,EAAE;QACxB,MAAM,KAAK,CAAC,SAAS,CAAC,iBAAiB,EAAE,EAAC,IAAI,EAAE,WAAW,EAAC,CAAC,CAAA;KAC9D;AACH,CAAC"}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { Platform } from './
|
|
1
|
+
import { Platform } from './platform.js';
|
|
2
|
+
import { BinaryMetadata, BuildType } from './types.js';
|
|
3
|
+
export declare const CDN_ADDRESS = "http://34.160.57.53/";
|
|
4
|
+
export declare const GOOGLE_CLOUD_BUCKET_NAME = "minis_cli_app_builds";
|
|
5
|
+
export declare const metadataToBucketPath: (metadata: BinaryMetadata) => string;
|
|
2
6
|
/**
|
|
3
7
|
* Downloads a binary from the remote storage
|
|
4
8
|
* @returns Promise that resolves to the downloaded version
|
|
5
9
|
*/
|
|
6
|
-
export declare function downloadBinary(
|
|
10
|
+
export declare function downloadBinary(versionToDownload: BinaryMetadata, { onProgress, }?: {
|
|
7
11
|
/**
|
|
8
12
|
* Download progress callback
|
|
9
13
|
*/
|
|
10
14
|
onProgress?: (progress: number) => void;
|
|
11
|
-
|
|
12
|
-
* Version to download. Defaults to latest version available
|
|
13
|
-
*/
|
|
14
|
-
version?: string;
|
|
15
|
-
}): Promise<string>;
|
|
15
|
+
}): Promise<BinaryMetadata>;
|
|
16
16
|
/**
|
|
17
17
|
* Returns the latest version that's present in the remote storage of binaries
|
|
18
18
|
* TODO: this won't handle a bucket that has more than 50 files.
|
|
19
19
|
*/
|
|
20
|
-
export declare function getLatestRemoteVersion(platform: Platform): Promise<
|
|
20
|
+
export declare function getLatestRemoteVersion(platform: Platform, type: BuildType): Promise<BinaryMetadata | null>;
|
|
@@ -1,38 +1,39 @@
|
|
|
1
1
|
import http from 'http';
|
|
2
|
+
import { basename } from 'node:path';
|
|
2
3
|
import { Storage } from '@google-cloud/storage';
|
|
3
4
|
import fs from 'fs-extra';
|
|
5
|
+
import { compare, parse } from 'semver';
|
|
4
6
|
import { PATHS } from '../../config.js';
|
|
5
|
-
import {
|
|
7
|
+
import { isVersionAvailableLocally } from './binaries.js';
|
|
8
|
+
import { getLatestVersionFromFilesList, metadataToBinaryFileName, } from './version.js';
|
|
6
9
|
// TODO: set up domain and ssl certificate for cdn
|
|
7
|
-
// https://console.cloud.google.com/net-services/cdn/backendBucket/details/minis-
|
|
8
|
-
// https://console.cloud.google.com/storage/browser/
|
|
9
|
-
const CDN_ADDRESS = 'http://
|
|
10
|
-
const GOOGLE_CLOUD_BUCKET_NAME = '
|
|
10
|
+
// https://console.cloud.google.com/net-services/cdn/backendBucket/details/minis-app-builds-backend-bucket?project=arrive-167720
|
|
11
|
+
// https://console.cloud.google.com/storage/browser/minis_cli_app_builds
|
|
12
|
+
export const CDN_ADDRESS = 'http://34.160.57.53/';
|
|
13
|
+
export const GOOGLE_CLOUD_BUCKET_NAME = 'minis_cli_app_builds';
|
|
11
14
|
const bucket = new Storage().bucket(GOOGLE_CLOUD_BUCKET_NAME);
|
|
15
|
+
export const metadataToBucketPath = (metadata) => `${metadata.version}/${metadataToBinaryFileName(metadata)}`;
|
|
12
16
|
/**
|
|
13
17
|
* Downloads a binary from the remote storage
|
|
14
18
|
* @returns Promise that resolves to the downloaded version
|
|
15
19
|
*/
|
|
16
|
-
export async function downloadBinary(
|
|
17
|
-
const
|
|
18
|
-
const isVersionAlreadyDownloaded = await isVersionAvailableLocally(platform, versionToDownload);
|
|
20
|
+
export async function downloadBinary(versionToDownload, { onProgress, } = {}) {
|
|
21
|
+
const isVersionAlreadyDownloaded = await isVersionAvailableLocally(versionToDownload);
|
|
19
22
|
if (isVersionAlreadyDownloaded) {
|
|
20
23
|
onProgress?.(100);
|
|
21
24
|
return versionToDownload;
|
|
22
25
|
}
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const remoteFile = bucketResponse[0][0];
|
|
28
|
-
const fileSize = parseInt(remoteFile.metadata.size, 10);
|
|
26
|
+
const localFileName = metadataToBinaryFileName(versionToDownload);
|
|
27
|
+
const remoteBucketPath = metadataToBucketPath(versionToDownload);
|
|
28
|
+
const [metadata] = await bucket.file(remoteBucketPath).getMetadata();
|
|
29
|
+
const fileSize = parseInt(metadata.size, 10);
|
|
29
30
|
return new Promise((resolve, reject) => {
|
|
30
|
-
const writeStream = fs.createWriteStream(`${PATHS.CACHE_DIR}/${
|
|
31
|
+
const writeStream = fs.createWriteStream(`${PATHS.CACHE_DIR}/${localFileName}`);
|
|
31
32
|
const progressInterval = setInterval(() => {
|
|
32
33
|
const progress = Math.round((writeStream.bytesWritten / fileSize) * 100);
|
|
33
34
|
onProgress?.(progress);
|
|
34
35
|
}, 200);
|
|
35
|
-
http.get(`${CDN_ADDRESS}${
|
|
36
|
+
http.get(`${CDN_ADDRESS}${remoteBucketPath}`, cdnResponse => {
|
|
36
37
|
cdnResponse.pipe(writeStream);
|
|
37
38
|
writeStream.on('finish', () => {
|
|
38
39
|
writeStream.close();
|
|
@@ -51,12 +52,57 @@ export async function downloadBinary(platform, { onProgress, version, } = {}) {
|
|
|
51
52
|
* Returns the latest version that's present in the remote storage of binaries
|
|
52
53
|
* TODO: this won't handle a bucket that has more than 50 files.
|
|
53
54
|
*/
|
|
54
|
-
export async function getLatestRemoteVersion(platform) {
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
55
|
+
export async function getLatestRemoteVersion(platform, type) {
|
|
56
|
+
const versions = await getRemoteVersions();
|
|
57
|
+
// newest first
|
|
58
|
+
const sortedVersions = versions.sort(compare).reverse();
|
|
59
|
+
// iterate over versions, in case newest version(s) don't contain builds for the given platform/type
|
|
60
|
+
for (const version of sortedVersions) {
|
|
61
|
+
const prefix = `${version}/`;
|
|
62
|
+
const [filesMetadata] = await bucket.getFiles({
|
|
63
|
+
prefix,
|
|
64
|
+
});
|
|
65
|
+
const fileNames = filesMetadata
|
|
66
|
+
.map(file => file.name)
|
|
67
|
+
// extract filename from GCS bucket path
|
|
68
|
+
.map(path => basename(path));
|
|
69
|
+
const latestVersion = getLatestVersionFromFilesList(fileNames, platform, type);
|
|
70
|
+
if (latestVersion != null) {
|
|
71
|
+
return latestVersion;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Returns a list of all the versions that are present in the remote bucket,
|
|
78
|
+
* regardless of platform or build type
|
|
79
|
+
*/
|
|
80
|
+
async function getRemoteVersions() {
|
|
81
|
+
// GCS doesn't have a concept of 'folders', so we just list prefixes (which are the version numbers)
|
|
82
|
+
// and remove the trailing delimiter ('/')
|
|
83
|
+
let query = {
|
|
84
|
+
delimiter: '/',
|
|
85
|
+
// intentionally set to false to keep `apiResponse`
|
|
86
|
+
// see: https://github.com/googleapis/google-cloud-node/issues/2594
|
|
87
|
+
autoPaginate: false,
|
|
88
|
+
};
|
|
89
|
+
const prefixes = [];
|
|
90
|
+
// loop to handle pagination
|
|
91
|
+
do {
|
|
92
|
+
const [_files, nextQuery, apiResponse] = await bucket.getFiles(query);
|
|
93
|
+
const newPrefixes = apiResponse.prefixes ?? [];
|
|
94
|
+
prefixes.push(...newPrefixes);
|
|
95
|
+
query = nextQuery;
|
|
96
|
+
} while (query != null);
|
|
97
|
+
return (prefixes
|
|
98
|
+
// remove trailing delimiter
|
|
99
|
+
.map(prefix => prefix.replace(/\/$/, ''))
|
|
100
|
+
// validate that we only have 'x.y.z', not 'x.y.z-rc.1' or 'x.y.z+123'
|
|
101
|
+
.filter(prefix => {
|
|
102
|
+
const parsed = parse(prefix);
|
|
103
|
+
return (parsed != null &&
|
|
104
|
+
parsed.build.length === 0 &&
|
|
105
|
+
parsed.prerelease.length === 0);
|
|
106
|
+
}));
|
|
61
107
|
}
|
|
62
108
|
//# sourceMappingURL=network.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../../../src/commands/dev/utils/network.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../../../src/commands/dev/utils/network.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { outputDebug } from '@shopify/cli-kit/node/output';
|
|
4
|
+
import fs from 'fs-extra';
|
|
5
|
+
const { applyPatch: patchPackageApplyPatch } = createRequire(import.meta.url)('patch-package/dist/applyPatches');
|
|
6
|
+
const { getPackageDetailsFromPatchFilename } = createRequire(import.meta.url)('patch-package/dist/PackageDetails');
|
|
7
|
+
// We use an empty file to know if a patch was already applied or not. i.e.
|
|
8
|
+
// if node_modules/react-native/.patched-by-minis-cli exists, we assume that a patch was already applied
|
|
9
|
+
// if node_modules/react-native/.patched-by-minis-cli does not exist, we assume that a patch is not applied yet
|
|
10
|
+
const PATCHED_MARK_FILE = '.patched-by-minis-cli';
|
|
11
|
+
const nodeModulesPath = path.join(process.cwd(), 'node_modules');
|
|
12
|
+
const patchesDirectoryPath = path.join(nodeModulesPath, '@shopify', 'shop-minis-runtime', 'patches');
|
|
13
|
+
function getPatchFiles() {
|
|
14
|
+
try {
|
|
15
|
+
return fs.readdirSync(patchesDirectoryPath);
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
// older versions of shop-minis-runtime (< 0.0.5) do not have the patches folder.
|
|
19
|
+
outputDebug('Patches folder does not exist. Please update @shopify/shop-minis-runtime to ^0.0.5');
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Applies patches to Minis dependencies (only if they have not been applied yet)
|
|
25
|
+
*/
|
|
26
|
+
export function maybeApplyPatches() {
|
|
27
|
+
outputDebug('Applying dependency patches...');
|
|
28
|
+
const patches = getPatchFiles();
|
|
29
|
+
for (const patch of patches) {
|
|
30
|
+
if (isPatchApplied(patch)) {
|
|
31
|
+
outputDebug(`${patch} is already applied`);
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
outputDebug(`Applying patch ${patch}`);
|
|
35
|
+
const applied = applyPatch(patch);
|
|
36
|
+
if (applied) {
|
|
37
|
+
markPatchAsApplied(patch);
|
|
38
|
+
outputDebug(`Patch ${patch} applied`);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
outputDebug(`Failed to apply patch ${patch}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function isPatchApplied(patch) {
|
|
46
|
+
const dependencyName = getDependencyNameForPatch(patch);
|
|
47
|
+
return fs.existsSync(path.join(nodeModulesPath, dependencyName, PATCHED_MARK_FILE));
|
|
48
|
+
}
|
|
49
|
+
function applyPatch(patch) {
|
|
50
|
+
const patchFilePath = path.join(patchesDirectoryPath, patch);
|
|
51
|
+
return patchPackageApplyPatch({
|
|
52
|
+
patchFilePath,
|
|
53
|
+
reverse: false,
|
|
54
|
+
patchDir: patchesDirectoryPath,
|
|
55
|
+
packageDetails: getPackageDetailsFromPatchFilename(patch),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
function markPatchAsApplied(patch) {
|
|
59
|
+
const dependencyName = getDependencyNameForPatch(patch);
|
|
60
|
+
fs.createFileSync(path.join(nodeModulesPath, dependencyName, PATCHED_MARK_FILE));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Given a patch file name, returns the name of the actual dependency that's being patched.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* getDependencyNameForPatch('react-native+0.68.5.patch')
|
|
67
|
+
* // returns 'react-native'
|
|
68
|
+
*/
|
|
69
|
+
function getDependencyNameForPatch(patch) {
|
|
70
|
+
return patch.split('+')[0];
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=patch-package.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patch-package.js","sourceRoot":"","sources":["../../../../src/commands/dev/utils/patch-package.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,aAAa,CAAA;AACzC,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAC,WAAW,EAAC,MAAM,8BAA8B,CAAA;AACxD,OAAO,EAAE,MAAM,UAAU,CAAA;AAEzB,MAAM,EAAC,UAAU,EAAE,sBAAsB,EAAC,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CACzE,iCAAiC,CAClC,CAAA;AACD,MAAM,EAAC,kCAAkC,EAAC,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CACzE,mCAAmC,CACpC,CAAA;AAED,2EAA2E;AAC3E,wGAAwG;AACxG,+GAA+G;AAC/G,MAAM,iBAAiB,GAAG,uBAAuB,CAAA;AAEjD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAA;AAChE,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CACpC,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,SAAS,CACV,CAAA;AAED,SAAS,aAAa;IACpB,IAAI;QACF,OAAO,EAAE,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAA;KAC5C;IAAC,OAAO,GAAG,EAAE;QACZ,iFAAiF;QACjF,WAAW,CACT,oFAAoF,CACrF,CAAA;QACD,OAAO,EAAE,CAAA;KACV;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,WAAW,CAAC,gCAAgC,CAAC,CAAA;IAE7C,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;IAC/B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;QAC3B,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE;YACzB,WAAW,CAAC,GAAG,KAAK,qBAAqB,CAAC,CAAA;YAC1C,SAAQ;SACT;QAED,WAAW,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAA;QACtC,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;QAEjC,IAAI,OAAO,EAAE;YACX,kBAAkB,CAAC,KAAK,CAAC,CAAA;YACzB,WAAW,CAAC,SAAS,KAAK,UAAU,CAAC,CAAA;SACtC;aAAM;YACL,WAAW,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAA;SAC9C;KACF;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,MAAM,cAAc,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAA;IACvD,OAAO,EAAE,CAAC,UAAU,CAClB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAC9D,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAA;IAC5D,OAAO,sBAAsB,CAAC;QAC5B,aAAa;QACb,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,oBAAoB;QAC9B,cAAc,EAAE,kCAAkC,CAAC,KAAK,CAAC;KAC1D,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,MAAM,cAAc,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAA;IACvD,EAAE,CAAC,cAAc,CACf,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAC9D,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,yBAAyB,CAAC,KAAa;IAC9C,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;AAC5B,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare enum Platform {
|
|
2
|
+
IOS = "ios",
|
|
3
|
+
Android = "android"
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Returns the platform for a given file extension.
|
|
7
|
+
*/
|
|
8
|
+
export declare function getPlatformForBinaryFileExtension(extension: string): Platform;
|
|
9
|
+
/**
|
|
10
|
+
* Returns the platform config for a given platform.
|
|
11
|
+
*/
|
|
12
|
+
export declare function getPlatformConfig(platform: Platform | PlatformConfig): Readonly<PlatformConfig>;
|
|
13
|
+
interface PlatformConfig {
|
|
14
|
+
platform: Platform;
|
|
15
|
+
name: string;
|
|
16
|
+
extension: string;
|
|
17
|
+
}
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export var Platform;
|
|
2
|
+
(function (Platform) {
|
|
3
|
+
Platform["IOS"] = "ios";
|
|
4
|
+
Platform["Android"] = "android";
|
|
5
|
+
})(Platform || (Platform = {}));
|
|
6
|
+
/**
|
|
7
|
+
* Returns the platform for a given file extension.
|
|
8
|
+
*/
|
|
9
|
+
export function getPlatformForBinaryFileExtension(extension) {
|
|
10
|
+
const platform = Object.values(Platform).find(aPlatform => platformConfigs[aPlatform].extension === extension);
|
|
11
|
+
if (platform == null) {
|
|
12
|
+
throw new Error(`Invalid extension: ${extension}`);
|
|
13
|
+
}
|
|
14
|
+
return platform;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Returns the platform config for a given platform.
|
|
18
|
+
*/
|
|
19
|
+
export function getPlatformConfig(platform) {
|
|
20
|
+
if (typeof platform === 'object') {
|
|
21
|
+
return platform;
|
|
22
|
+
}
|
|
23
|
+
const config = platformConfigs[platform];
|
|
24
|
+
if (config == null) {
|
|
25
|
+
throw new Error(`Invalid platform: ${platform}`);
|
|
26
|
+
}
|
|
27
|
+
return Object.freeze(config);
|
|
28
|
+
}
|
|
29
|
+
const platformConfigs = {
|
|
30
|
+
ios: {
|
|
31
|
+
platform: Platform.IOS,
|
|
32
|
+
name: 'iOS',
|
|
33
|
+
extension: 'app.zip',
|
|
34
|
+
},
|
|
35
|
+
android: {
|
|
36
|
+
platform: Platform.Android,
|
|
37
|
+
name: 'Android',
|
|
38
|
+
extension: 'apk',
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../../../src/commands/dev/utils/platform.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,QAGX;AAHD,WAAY,QAAQ;IAClB,uBAAW,CAAA;IACX,+BAAmB,CAAA;AACrB,CAAC,EAHW,QAAQ,KAAR,QAAQ,QAGnB;AAED;;GAEG;AACH,MAAM,UAAU,iCAAiC,CAAC,SAAiB;IACjE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAC3C,SAAS,CAAC,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,SAAS,KAAK,SAAS,CAChE,CAAA;IAED,IAAI,QAAQ,IAAI,IAAI,EAAE;QACpB,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAA;KACnD;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAmC;IACnE,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;QAChC,OAAO,QAAQ,CAAA;KAChB;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;IAExC,IAAI,MAAM,IAAI,IAAI,EAAE;QAClB,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAA;KACjD;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;AAC9B,CAAC;AAQD,MAAM,eAAe,GAAqC;IACxD,GAAG,EAAE;QACH,QAAQ,EAAE,QAAQ,CAAC,GAAG;QACtB,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,SAAS;KACrB;IACD,OAAO,EAAE;QACP,QAAQ,EAAE,QAAQ,CAAC,OAAO;QAC1B,IAAI,EAAE,SAAS;QACf,SAAS,EAAE,KAAK;KACjB;CACF,CAAA"}
|
|
@@ -12,8 +12,11 @@ interface EnhancedSimCtlListDevice extends SimCtlListDevice {
|
|
|
12
12
|
osVersion: string;
|
|
13
13
|
}
|
|
14
14
|
export declare function promptForSimulator(): Promise<EnhancedSimCtlListDevice | null | undefined>;
|
|
15
|
-
export declare function getInstalledShopVersion(udid: string): Promise<
|
|
15
|
+
export declare function getInstalledShopVersion(udid: string): Promise<{
|
|
16
|
+
version: string;
|
|
17
|
+
build: string;
|
|
18
|
+
} | null>;
|
|
16
19
|
export declare function bootSimulator(udid: string): Promise<void>;
|
|
17
|
-
export declare function installShopInSimulator(udid: string,
|
|
20
|
+
export declare function installShopInSimulator(udid: string, fileName: string): Promise<void>;
|
|
18
21
|
export declare function deeplinkToSimulator(udid: string, deeplink: string): Promise<void>;
|
|
19
22
|
export {};
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { rm, stat } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
2
3
|
import chalk from 'chalk';
|
|
4
|
+
import _ from 'lodash';
|
|
3
5
|
import prompts from 'prompts';
|
|
4
|
-
import { execAsync } from '../../utils/exec-async-child-process.js';
|
|
5
6
|
import { PATHS } from '../../config.js';
|
|
6
|
-
import {
|
|
7
|
+
import { execAsync } from '../../utils/exec-async-child-process.js';
|
|
7
8
|
async function getSelectableSimulators() {
|
|
8
9
|
const { stdout } = await execAsync('xcrun simctl list devices --json');
|
|
9
10
|
const simctlOutput = JSON.parse(stdout.join(''));
|
|
@@ -46,9 +47,15 @@ export async function promptForSimulator() {
|
|
|
46
47
|
}
|
|
47
48
|
export async function getInstalledShopVersion(udid) {
|
|
48
49
|
try {
|
|
49
|
-
const { stdout } = await execAsync(`defaults read $(xcrun simctl get_app_container ${udid} com.shopifyinternal.arrive)/Info CFBundleShortVersionString`);
|
|
50
|
-
const
|
|
51
|
-
|
|
50
|
+
const { stdout: CFBundleShortVersionString } = await execAsync(`defaults read $(xcrun simctl get_app_container ${udid} com.shopifyinternal.arrive)/Info CFBundleShortVersionString`);
|
|
51
|
+
const { stdout: CFBundleVersion } = await execAsync(`defaults read $(xcrun simctl get_app_container ${udid} com.shopifyinternal.arrive)/Info CFBundleVersion`);
|
|
52
|
+
const installedVersion = CFBundleShortVersionString[0]; // 2.86.0-snapshot+1674205229
|
|
53
|
+
const build = CFBundleVersion[0]; // 1674205229
|
|
54
|
+
const version = installedVersion.split('-')[0];
|
|
55
|
+
return {
|
|
56
|
+
version,
|
|
57
|
+
build,
|
|
58
|
+
};
|
|
52
59
|
}
|
|
53
60
|
catch {
|
|
54
61
|
return null;
|
|
@@ -65,15 +72,22 @@ export async function bootSimulator(udid) {
|
|
|
65
72
|
}
|
|
66
73
|
await execAsync(`open -a Simulator.app --args -CurrentDeviceUDID ${udid}`);
|
|
67
74
|
}
|
|
68
|
-
export async function installShopInSimulator(udid,
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
75
|
+
export async function installShopInSimulator(udid, fileName) {
|
|
76
|
+
const inputPath = join(PATHS.CACHE_DIR, fileName);
|
|
77
|
+
const outputPath = join(PATHS.CACHE_DIR, 'Shop.app');
|
|
78
|
+
// remove any existing Shop.app
|
|
79
|
+
try {
|
|
80
|
+
await stat(outputPath);
|
|
81
|
+
await rm(outputPath, { recursive: true });
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// file doesn't exist, so we can move on
|
|
85
|
+
}
|
|
86
|
+
await execAsync(`unzip -o '${inputPath}' -d '${outputPath}' -x '__MACOSX/*'`);
|
|
87
|
+
await execAsync(`xcrun simctl install ${udid} ${outputPath}`);
|
|
74
88
|
}
|
|
75
89
|
export async function deeplinkToSimulator(udid, deeplink) {
|
|
76
90
|
// TODO: deeplink doesn't seem to be working in iphone SE
|
|
77
|
-
await execAsync(`xcrun simctl openurl ${udid} ${deeplink}`);
|
|
91
|
+
await execAsync(`xcrun simctl openurl ${udid} "${deeplink}"`);
|
|
78
92
|
}
|
|
79
93
|
//# sourceMappingURL=simulator.js.map
|