@shopify/shop-minis-cli 0.0.35

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 (152) hide show
  1. package/README.md +8 -0
  2. package/build/commands/create-mini/index.d.ts +2 -0
  3. package/build/commands/create-mini/index.js +116 -0
  4. package/build/commands/create-mini/index.js.map +1 -0
  5. package/build/commands/create-mini/utils/template-app.d.ts +1 -0
  6. package/build/commands/create-mini/utils/template-app.js +44 -0
  7. package/build/commands/create-mini/utils/template-app.js.map +1 -0
  8. package/build/commands/dev/index.d.ts +6 -0
  9. package/build/commands/dev/index.js +31 -0
  10. package/build/commands/dev/index.js.map +1 -0
  11. package/build/commands/dev/utils/android.d.ts +16 -0
  12. package/build/commands/dev/utils/android.js +165 -0
  13. package/build/commands/dev/utils/android.js.map +1 -0
  14. package/build/commands/dev/utils/binaries.d.ts +83 -0
  15. package/build/commands/dev/utils/binaries.js +173 -0
  16. package/build/commands/dev/utils/binaries.js.map +1 -0
  17. package/build/commands/dev/utils/binaries.test.d.ts +1 -0
  18. package/build/commands/dev/utils/binaries.test.js +275 -0
  19. package/build/commands/dev/utils/binaries.test.js.map +1 -0
  20. package/build/commands/dev/utils/deeplink.d.ts +3 -0
  21. package/build/commands/dev/utils/deeplink.js +30 -0
  22. package/build/commands/dev/utils/deeplink.js.map +1 -0
  23. package/build/commands/dev/utils/interactive-terminal.d.ts +23 -0
  24. package/build/commands/dev/utils/interactive-terminal.js +252 -0
  25. package/build/commands/dev/utils/interactive-terminal.js.map +1 -0
  26. package/build/commands/dev/utils/metro/metro-config.d.ts +2 -0
  27. package/build/commands/dev/utils/metro/metro-config.js +31 -0
  28. package/build/commands/dev/utils/metro/metro-config.js.map +1 -0
  29. package/build/commands/dev/utils/metro/metro-reporter.d.ts +14 -0
  30. package/build/commands/dev/utils/metro/metro-reporter.js +34 -0
  31. package/build/commands/dev/utils/metro/metro-reporter.js.map +1 -0
  32. package/build/commands/dev/utils/metro/metro-server-middleware.d.ts +6 -0
  33. package/build/commands/dev/utils/metro/metro-server-middleware.js +45 -0
  34. package/build/commands/dev/utils/metro/metro-server-middleware.js.map +1 -0
  35. package/build/commands/dev/utils/metro/metro-server.d.ts +2 -0
  36. package/build/commands/dev/utils/metro/metro-server.js +24 -0
  37. package/build/commands/dev/utils/metro/metro-server.js.map +1 -0
  38. package/build/commands/dev/utils/minis-manifest.d.ts +1 -0
  39. package/build/commands/dev/utils/minis-manifest.js +24 -0
  40. package/build/commands/dev/utils/minis-manifest.js.map +1 -0
  41. package/build/commands/dev/utils/qr-code.d.ts +1 -0
  42. package/build/commands/dev/utils/qr-code.js +12 -0
  43. package/build/commands/dev/utils/qr-code.js.map +1 -0
  44. package/build/commands/dev/utils/simulator.d.ts +19 -0
  45. package/build/commands/dev/utils/simulator.js +89 -0
  46. package/build/commands/dev/utils/simulator.js.map +1 -0
  47. package/build/commands/dev/utils/with-retries.d.ts +4 -0
  48. package/build/commands/dev/utils/with-retries.js +28 -0
  49. package/build/commands/dev/utils/with-retries.js.map +1 -0
  50. package/build/commands/generate-graphql-types/index.d.ts +5 -0
  51. package/build/commands/generate-graphql-types/index.js +90 -0
  52. package/build/commands/generate-graphql-types/index.js.map +1 -0
  53. package/build/commands/utils/exec-async-child-process.d.ts +18 -0
  54. package/build/commands/utils/exec-async-child-process.js +48 -0
  55. package/build/commands/utils/exec-async-child-process.js.map +1 -0
  56. package/build/commands/utils/wrap-with-loading-indicator.d.ts +9 -0
  57. package/build/commands/utils/wrap-with-loading-indicator.js +23 -0
  58. package/build/commands/utils/wrap-with-loading-indicator.js.map +1 -0
  59. package/build/dev-panel/images/bottomsheet.png +0 -0
  60. package/build/dev-panel/images/checkmark.svg +3 -0
  61. package/build/dev-panel/images/chevron.svg +3 -0
  62. package/build/dev-panel/images/copy.svg +4 -0
  63. package/build/dev-panel/images/get-started.svg +3 -0
  64. package/build/dev-panel/images/how-to.svg +3 -0
  65. package/build/dev-panel/images/navigation.png +0 -0
  66. package/build/dev-panel/images/references.svg +3 -0
  67. package/build/dev-panel/images/shop-minis-logo-inverse.svg +5 -0
  68. package/build/dev-panel/images/shop-minis-logo.svg +5 -0
  69. package/build/dev-panel/images/stories.png +0 -0
  70. package/build/dev-panel/images/topics.svg +3 -0
  71. package/build/dev-panel/index.html +302 -0
  72. package/build/dev-panel/middleware.d.ts +4 -0
  73. package/build/dev-panel/middleware.js +11 -0
  74. package/build/dev-panel/middleware.js.map +1 -0
  75. package/build/dev-panel/middleware.ts +6 -0
  76. package/build/dev-panel/styles.css +507 -0
  77. package/build/index.d.ts +2 -0
  78. package/build/index.js +26 -0
  79. package/build/index.js.map +1 -0
  80. package/package.json +83 -0
  81. package/templates/__template_blank/src/custom.d.ts +4 -0
  82. package/templates/__template_blank/src/index.tsx +9 -0
  83. package/templates/__template_blank/src/screens/HomeScreen.tsx +12 -0
  84. package/templates/__template_blank/src/types.ts +5 -0
  85. package/templates/__template_common/.eslintignore +1 -0
  86. package/templates/__template_common/.eslintrc.json +132 -0
  87. package/templates/__template_common/.prettierrc.json +8 -0
  88. package/templates/__template_common/babel.config.js +19 -0
  89. package/templates/__template_common/gitignore +3 -0
  90. package/templates/__template_common/index.tsx +43 -0
  91. package/templates/__template_common/metro.config.js +31 -0
  92. package/templates/__template_common/package.json +68 -0
  93. package/templates/__template_common/patches/react-native+0.68.5.patch +173 -0
  94. package/templates/__template_common/src/manifest.json +29 -0
  95. package/templates/__template_common/tsconfig.json +36 -0
  96. package/templates/__template_hello_world/src/assets/Modal-component-thumbnail.png +0 -0
  97. package/templates/__template_hello_world/src/assets/ProductCard-component-thumbnail.png +0 -0
  98. package/templates/__template_hello_world/src/assets/ProductLink-component-thumbnail.png +0 -0
  99. package/templates/__template_hello_world/src/assets/assets.d.ts +4 -0
  100. package/templates/__template_hello_world/src/assets/figma-logo.svg +14 -0
  101. package/templates/__template_hello_world/src/assets/shop-minis-logo.svg +7 -0
  102. package/templates/__template_hello_world/src/components/ButtonCTA.tsx +31 -0
  103. package/templates/__template_hello_world/src/components/ComponentLink.ts +70 -0
  104. package/templates/__template_hello_world/src/components/ComponentListItem.tsx +38 -0
  105. package/templates/__template_hello_world/src/components/FeaturedComponents.tsx +108 -0
  106. package/templates/__template_hello_world/src/components/Header.tsx +40 -0
  107. package/templates/__template_hello_world/src/data/Test.graphql +33 -0
  108. package/templates/__template_hello_world/src/data/Test.graphql.d.ts +114 -0
  109. package/templates/__template_hello_world/src/data/TestProducts.graphql +34 -0
  110. package/templates/__template_hello_world/src/data/TestProducts.graphql.d.ts +119 -0
  111. package/templates/__template_hello_world/src/index.tsx +9 -0
  112. package/templates/__template_hello_world/src/routes.tsx +107 -0
  113. package/templates/__template_hello_world/src/screens/AvatarScreen.tsx +95 -0
  114. package/templates/__template_hello_world/src/screens/BottomSheetScreen.tsx +711 -0
  115. package/templates/__template_hello_world/src/screens/ButtonsScreen.tsx +90 -0
  116. package/templates/__template_hello_world/src/screens/GridScreen.tsx +74 -0
  117. package/templates/__template_hello_world/src/screens/HomeScreen.tsx +70 -0
  118. package/templates/__template_hello_world/src/screens/IconsScreen.tsx +181 -0
  119. package/templates/__template_hello_world/src/screens/MediaScreen.tsx +130 -0
  120. package/templates/__template_hello_world/src/screens/ModalScreen.tsx +379 -0
  121. package/templates/__template_hello_world/src/screens/ProductCardGridScreen.tsx +68 -0
  122. package/templates/__template_hello_world/src/screens/ProductCardScreen.tsx +62 -0
  123. package/templates/__template_hello_world/src/screens/ProductLinkScreen.tsx +215 -0
  124. package/templates/__template_hello_world/src/screens/ProgressIndicatorScreen.tsx +77 -0
  125. package/templates/__template_hello_world/src/screens/QuantityPickerScreen.tsx +76 -0
  126. package/templates/__template_hello_world/src/screens/SpinnerScreen.tsx +63 -0
  127. package/templates/__template_hello_world/src/screens/TypographyScreen.tsx +274 -0
  128. package/templates/__template_hello_world/src/screens/WebViewScreen.tsx +42 -0
  129. package/templates/__template_hello_world/src/types.ts +25 -0
  130. package/templates/__template_snowboardz/src/assets/assets.d.ts +4 -0
  131. package/templates/__template_snowboardz/src/assets/circle-blue.svg +9 -0
  132. package/templates/__template_snowboardz/src/assets/circle-green.svg +9 -0
  133. package/templates/__template_snowboardz/src/assets/circle-purple.svg +9 -0
  134. package/templates/__template_snowboardz/src/assets/circle-rainbow.svg +34 -0
  135. package/templates/__template_snowboardz/src/assets/circle-red.svg +9 -0
  136. package/templates/__template_snowboardz/src/assets/circle-yellow.svg +9 -0
  137. package/templates/__template_snowboardz/src/assets/skill-level-icon-advanced.svg +3 -0
  138. package/templates/__template_snowboardz/src/assets/skill-level-icon-beginner.svg +3 -0
  139. package/templates/__template_snowboardz/src/assets/skill-level-icon-intermediate.svg +3 -0
  140. package/templates/__template_snowboardz/src/components/ColorButton.tsx +79 -0
  141. package/templates/__template_snowboardz/src/components/ColorPicker.tsx +40 -0
  142. package/templates/__template_snowboardz/src/components/EmptyResult.tsx +52 -0
  143. package/templates/__template_snowboardz/src/components/SkillLevelIcon.tsx +44 -0
  144. package/templates/__template_snowboardz/src/components/SkillLevelPicker.tsx +86 -0
  145. package/templates/__template_snowboardz/src/data/TestProducts.graphql +34 -0
  146. package/templates/__template_snowboardz/src/data/TestProducts.graphql.d.ts +108 -0
  147. package/templates/__template_snowboardz/src/hooks/useSnowboardData.tsx +37 -0
  148. package/templates/__template_snowboardz/src/index.tsx +9 -0
  149. package/templates/__template_snowboardz/src/routes.tsx +17 -0
  150. package/templates/__template_snowboardz/src/screens/HomeScreen.tsx +126 -0
  151. package/templates/__template_snowboardz/src/types.ts +12 -0
  152. package/templates/__template_snowboardz/src/utils.ts +17 -0
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.maybePromptBinaryUpgrade = exports.downloadBinary = exports.getLatestRemoteVersion = exports.getLatestDownloadedVersion = exports.isVersionAvailableLocally = exports.getLatestVersionFromFilesList = exports.binaryFileNameToVersion = exports.versionToBinaryFileName = exports.getBinaryFileExtensionForPlatform = exports.BINARIES_PATH = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const http_1 = __importDefault(require("http"));
9
+ const storage_1 = require("@google-cloud/storage");
10
+ const fs_extra_1 = __importDefault(require("fs-extra"));
11
+ const semver_1 = require("semver");
12
+ const lodash_1 = __importDefault(require("lodash"));
13
+ const prompts_1 = __importDefault(require("prompts"));
14
+ exports.BINARIES_PATH = path_1.default.join(process.cwd(), './.minis-cache');
15
+ // TODO: set up domain and ssl certificate for cdn
16
+ // https://console.cloud.google.com/net-services/cdn/backendBucket/details/minis-binaries-backend-bucket?project=arrive-167720
17
+ // https://console.cloud.google.com/storage/browser/minis_cli_binaries
18
+ const CDN_ADDRESS = 'http://35.244.235.176/';
19
+ try {
20
+ fs_extra_1.default.mkdirSync(exports.BINARIES_PATH);
21
+ }
22
+ catch {
23
+ // directory already exists. do nothing
24
+ }
25
+ const GOOGLE_CLOUD_BUCKET_NAME = 'minis_cli_binaries';
26
+ const bucket = new storage_1.Storage().bucket(GOOGLE_CLOUD_BUCKET_NAME);
27
+ /**
28
+ * Returns the file extension used for each platform.
29
+ * android: .apk
30
+ * ios: .zip (we intentionally compress .app files before uploading them to the cloud storage)
31
+ */
32
+ function getBinaryFileExtensionForPlatform(platform) {
33
+ return platform === 'ios' ? '.zip' : '.apk';
34
+ }
35
+ exports.getBinaryFileExtensionForPlatform = getBinaryFileExtensionForPlatform;
36
+ /**
37
+ * @example
38
+ * platform android
39
+ * version 2.76.0
40
+ * returns "2-76-0.apk"
41
+ *
42
+ * platform ios
43
+ * version 2.55.0+4
44
+ * returns "2-55-0+4.zip"
45
+ */
46
+ function versionToBinaryFileName(version, platform) {
47
+ return (version.replace(/\./g, '-') + getBinaryFileExtensionForPlatform(platform));
48
+ }
49
+ exports.versionToBinaryFileName = versionToBinaryFileName;
50
+ /**
51
+ * @example
52
+ * binaryFileName "2-76-0.apk"
53
+ * returns "2.76.0"
54
+ *
55
+ * binaryFileName "2-16-0+3.zip"
56
+ * returns "2.16.0+3"
57
+ */
58
+ function binaryFileNameToVersion(binaryFileName) {
59
+ return binaryFileName.split('.')[0].replace(/-/g, '.');
60
+ }
61
+ exports.binaryFileNameToVersion = binaryFileNameToVersion;
62
+ /**
63
+ * @example
64
+ * filenames ["2-76-0+3.apk", "2-76-0+3.zip", "2-77-0.apk", "2-77-0.zip", "2-77-0+1.apk", "2-77-0+1.zip"]
65
+ * returns "2.77.0+1"
66
+ */
67
+ function getLatestVersionFromFilesList(filenames) {
68
+ const localVersions = lodash_1.default.uniq(filenames
69
+ .map(binaryFileNameToVersion)
70
+ .filter(version => (0, semver_1.valid)(version)));
71
+ localVersions.sort(semver_1.compareBuild);
72
+ const last = localVersions.slice(-1)[0];
73
+ return last ?? null;
74
+ }
75
+ exports.getLatestVersionFromFilesList = getLatestVersionFromFilesList;
76
+ /**
77
+ * Returns a boolean indicating if the binary for the given version and platform is already downloaded in the system
78
+ */
79
+ async function isVersionAvailableLocally(platform, version) {
80
+ const localBinariesList = await fs_extra_1.default.readdir(exports.BINARIES_PATH);
81
+ const fileName = versionToBinaryFileName(version, platform);
82
+ return localBinariesList.includes(fileName);
83
+ }
84
+ exports.isVersionAvailableLocally = isVersionAvailableLocally;
85
+ /**
86
+ * Gets the biggest version in the downloads folder for the given platform.
87
+ */
88
+ async function getLatestDownloadedVersion(platform) {
89
+ const localBinariesList = await fs_extra_1.default.readdir(exports.BINARIES_PATH);
90
+ const localBinariesForPlatform = localBinariesList.filter(name => name.endsWith(getBinaryFileExtensionForPlatform(platform)));
91
+ return getLatestVersionFromFilesList(localBinariesForPlatform);
92
+ }
93
+ exports.getLatestDownloadedVersion = getLatestDownloadedVersion;
94
+ /**
95
+ * Returns the latest version that's present in the remote storage of binaries
96
+ * TODO: this won't handle a bucket that has more than 50 files.
97
+ */
98
+ async function getLatestRemoteVersion(platform) {
99
+ const filesResponse = await bucket.getFiles();
100
+ const filesMetadata = filesResponse[0];
101
+ const fileNames = filesMetadata
102
+ .map(file => file.name)
103
+ .filter(name => name.endsWith(getBinaryFileExtensionForPlatform(platform)));
104
+ return getLatestVersionFromFilesList(fileNames);
105
+ }
106
+ exports.getLatestRemoteVersion = getLatestRemoteVersion;
107
+ /**
108
+ * Downloads a binary from the remote storage
109
+ * @returns Promise that resolves to the downloaded version
110
+ */
111
+ async function downloadBinary(platform, { onProgress, version, } = {}) {
112
+ const versionToDownload = version || (await getLatestRemoteVersion(platform));
113
+ const isVersionAlreadyDownloaded = await isVersionAvailableLocally(platform, versionToDownload);
114
+ if (isVersionAlreadyDownloaded) {
115
+ onProgress?.(100);
116
+ return versionToDownload;
117
+ }
118
+ const fileName = versionToBinaryFileName(versionToDownload, platform);
119
+ const bucketResponse = await bucket.getFiles({
120
+ prefix: fileName,
121
+ });
122
+ const remoteFile = bucketResponse[0][0];
123
+ const fileSize = parseInt(remoteFile.metadata.size, 10);
124
+ return new Promise((resolve, reject) => {
125
+ const writeStream = fs_extra_1.default.createWriteStream(`${exports.BINARIES_PATH}/${fileName}`);
126
+ const progressInterval = setInterval(() => {
127
+ const progress = Math.round((writeStream.bytesWritten / fileSize) * 100);
128
+ onProgress?.(progress);
129
+ }, 200);
130
+ http_1.default.get(`${CDN_ADDRESS}${fileName}`, cdnResponse => {
131
+ cdnResponse.pipe(writeStream);
132
+ writeStream.on('finish', () => {
133
+ writeStream.close();
134
+ onProgress?.(100);
135
+ resolve(versionToDownload);
136
+ clearInterval(progressInterval);
137
+ });
138
+ writeStream.on('error', err => {
139
+ reject(err);
140
+ clearInterval(progressInterval);
141
+ });
142
+ });
143
+ });
144
+ }
145
+ exports.downloadBinary = downloadBinary;
146
+ /**
147
+ * Compares the current version against the latest available version.
148
+ *
149
+ * Does nothing if the current version is already the latest.
150
+ * Otherwise prompts the user to download the new version.
151
+ */
152
+ async function maybePromptBinaryUpgrade(platform, { currentVersion, onProgress, onDownloadStart, } = {}) {
153
+ const _currentVersion = currentVersion || (await getLatestDownloadedVersion(platform));
154
+ const latestVersion = await getLatestRemoteVersion(platform);
155
+ if (latestVersion === _currentVersion) {
156
+ // returns early if user is already on latest version
157
+ return null;
158
+ }
159
+ const { shouldUpdate } = await (0, prompts_1.default)({
160
+ type: 'confirm',
161
+ initial: true,
162
+ name: 'shouldUpdate',
163
+ message: "There's a new version of Shop available. Do you want to upgrade?",
164
+ });
165
+ if (shouldUpdate) {
166
+ onDownloadStart?.(latestVersion);
167
+ await downloadBinary(platform, { version: latestVersion, onProgress });
168
+ return latestVersion;
169
+ }
170
+ return null;
171
+ }
172
+ exports.maybePromptBinaryUpgrade = maybePromptBinaryUpgrade;
173
+ //# sourceMappingURL=binaries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binaries.js","sourceRoot":"","sources":["../../../../src/commands/dev/utils/binaries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,275 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const http_1 = __importDefault(require("http"));
7
+ // @ts-expect-error
8
+ const storage_1 = require("@google-cloud/storage");
9
+ const fs_extra_1 = require("fs-extra");
10
+ const prompts_1 = __importDefault(require("prompts"));
11
+ const binaries_1 = require("./binaries");
12
+ const mockedGetRemoteFiles = storage_1.getRemoteFiles;
13
+ const mockedReaddir = fs_extra_1.readdir;
14
+ const mockedCreateWriteStream = fs_extra_1.createWriteStream;
15
+ const mockedPrompts = prompts_1.default;
16
+ const mockedHttp = http_1.default;
17
+ jest.mock('@google-cloud/storage', () => {
18
+ const _mockedGetRemoteFiles = jest.fn();
19
+ return {
20
+ getRemoteFiles: _mockedGetRemoteFiles,
21
+ Storage: class MockStorage {
22
+ bucket() {
23
+ return {
24
+ getFiles: _mockedGetRemoteFiles,
25
+ };
26
+ }
27
+ },
28
+ };
29
+ });
30
+ jest.mock('fs-extra', () => ({
31
+ ...jest.requireActual('fs-extra'),
32
+ readdir: jest.fn(),
33
+ createWriteStream: jest.fn(),
34
+ }));
35
+ jest.mock('prompts', () => jest.fn());
36
+ jest.mock('http', () => ({ get: jest.fn() }));
37
+ describe('binaries', () => {
38
+ describe('#getBinaryFileExtensionForPlatform', () => {
39
+ it('returns the file extension for android', () => {
40
+ expect((0, binaries_1.getBinaryFileExtensionForPlatform)('android')).toBe('.apk');
41
+ });
42
+ it('returns the file extension for ios', () => {
43
+ expect((0, binaries_1.getBinaryFileExtensionForPlatform)('ios')).toBe('.zip');
44
+ });
45
+ });
46
+ describe('#versionToBinaryFileName', () => {
47
+ it('converts version to android binary file name', () => {
48
+ expect((0, binaries_1.versionToBinaryFileName)('1.2.3', 'android')).toBe('1-2-3.apk');
49
+ });
50
+ it('converts version to ios binary file name', () => {
51
+ expect((0, binaries_1.versionToBinaryFileName)('3.2.1', 'ios')).toBe('3-2-1.zip');
52
+ });
53
+ it('handles versions with build numbers', () => {
54
+ expect((0, binaries_1.versionToBinaryFileName)('1.1.1+5', 'ios')).toBe('1-1-1+5.zip');
55
+ expect((0, binaries_1.versionToBinaryFileName)('0.0.1+23', 'android')).toBe('0-0-1+23.apk');
56
+ });
57
+ });
58
+ describe('#binaryFileNameToVersion', () => {
59
+ it('converts android binary file name to semver version', () => {
60
+ expect((0, binaries_1.binaryFileNameToVersion)('2-76-0.apk')).toBe('2.76.0');
61
+ });
62
+ it('converts ios binary file name to semver version', () => {
63
+ expect((0, binaries_1.binaryFileNameToVersion)('1-7-1.zip')).toBe('1.7.1');
64
+ });
65
+ it('handles build number in binary file name', () => {
66
+ expect((0, binaries_1.binaryFileNameToVersion)('1-2-3+9.apk')).toBe('1.2.3+9');
67
+ expect((0, binaries_1.binaryFileNameToVersion)('0-6-5+11.zip')).toBe('0.6.5+11');
68
+ });
69
+ });
70
+ describe('#getLatestVersionFromFilesList', () => {
71
+ it('gets the bigger version from a versions list', () => {
72
+ expect((0, binaries_1.getLatestVersionFromFilesList)([
73
+ '2-1-0.apk',
74
+ '2-1-0.zip',
75
+ '1-6-4.zip',
76
+ '2-1-11.apk',
77
+ '1-6-5.zip',
78
+ '0-1-0.apk',
79
+ '2-6-4.zip',
80
+ '0-1-1.apk',
81
+ '2-3-0.apk',
82
+ '0-6-4.zip',
83
+ ])).toBe('2.6.4');
84
+ });
85
+ it('handles versions with build number', () => {
86
+ expect((0, binaries_1.getLatestVersionFromFilesList)([
87
+ '2-1-0.apk',
88
+ '0-6-4.zip',
89
+ '0-6-4.zip',
90
+ '2-1-0.zip',
91
+ '2-1-0+2.zip',
92
+ '2-1-0+4.apk',
93
+ '2-0-0+3.apk',
94
+ '2-0-0+7.zip',
95
+ ])).toBe('2.1.0+4');
96
+ });
97
+ });
98
+ describe('#getLatestRemoteVersion', () => {
99
+ it('returns the biggest version from storage for android', async () => {
100
+ mockedGetRemoteFiles.mockResolvedValue([
101
+ [
102
+ { name: '1-3-3.zip' },
103
+ { name: '1-2-2.apk' },
104
+ { name: '1-2-3.apk' },
105
+ { name: '0-2-3.apk' },
106
+ { name: '1-0-3.zip' },
107
+ { name: '1-0-5.apk' },
108
+ { name: '2-0-5.zip' },
109
+ ],
110
+ ]);
111
+ expect(await (0, binaries_1.getLatestRemoteVersion)('android')).toBe('1.2.3');
112
+ });
113
+ it('returns the biggest version from storage for ios', async () => {
114
+ mockedGetRemoteFiles.mockResolvedValue([
115
+ [
116
+ { name: '1-3-3.zip' },
117
+ { name: '1-2-2.apk' },
118
+ { name: '1-2-3.apk' },
119
+ { name: '0-2-3.apk' },
120
+ { name: '2-0-5.zip' },
121
+ { name: '1-0-3.zip' },
122
+ { name: '1-0-5.apk' },
123
+ ],
124
+ ]);
125
+ expect(await (0, binaries_1.getLatestRemoteVersion)('ios')).toBe('2.0.5');
126
+ });
127
+ it('handles versions with build number', async () => {
128
+ mockedGetRemoteFiles.mockResolvedValue([
129
+ [
130
+ { name: '1-3-3+11.zip' },
131
+ { name: '1-2-2+4.apk' },
132
+ { name: '1-2-2+3.apk' },
133
+ { name: '0-2-3.apk' },
134
+ { name: '2-0-5+5.zip' },
135
+ { name: '2-0-5+2.zip' },
136
+ { name: '2-0-4+2.zip' },
137
+ { name: '1-0-3.zip' },
138
+ { name: '1-0-5.apk' },
139
+ ],
140
+ ]);
141
+ expect(await (0, binaries_1.getLatestRemoteVersion)('ios')).toBe('2.0.5+5');
142
+ expect(await (0, binaries_1.getLatestRemoteVersion)('android')).toBe('1.2.2+4');
143
+ });
144
+ });
145
+ describe('#isVersionAvailableLocally', () => {
146
+ it('returns true when a version is available in the file system', async () => {
147
+ mockedReaddir.mockResolvedValue([
148
+ '1-2-3.apk',
149
+ '1-2-3.zip',
150
+ '2-3-4+5.zip',
151
+ '2-5-4.apk',
152
+ '2-2-4+1.apk',
153
+ ]);
154
+ expect(await (0, binaries_1.isVersionAvailableLocally)('android', '1.2.3')).toBe(true);
155
+ expect(await (0, binaries_1.isVersionAvailableLocally)('ios', '1.2.3')).toBe(true);
156
+ expect(await (0, binaries_1.isVersionAvailableLocally)('ios', '2.3.4+5')).toBe(true);
157
+ expect(await (0, binaries_1.isVersionAvailableLocally)('android', '2.2.4+1')).toBe(true);
158
+ });
159
+ it('returns false when a version is not available in the file system', async () => {
160
+ mockedReaddir.mockResolvedValue([
161
+ '1-2-3.apk',
162
+ '1-2-3.zip',
163
+ '2-3-4+5.zip',
164
+ '2-5-4.apk',
165
+ '2-2-4+1.apk',
166
+ ]);
167
+ expect(await (0, binaries_1.isVersionAvailableLocally)('android', '1.2.1')).toBe(false);
168
+ expect(await (0, binaries_1.isVersionAvailableLocally)('ios', '1.5.3')).toBe(false);
169
+ expect(await (0, binaries_1.isVersionAvailableLocally)('ios', '2.3.4+15')).toBe(false);
170
+ expect(await (0, binaries_1.isVersionAvailableLocally)('android', '2.2.4+2')).toBe(false);
171
+ });
172
+ });
173
+ describe('#maybePromptBinaryUpgrade', () => {
174
+ it('returns early if specified version is already the latest', async () => {
175
+ const onDownloadStart = jest.fn();
176
+ // mock remote files to set the latest available versions
177
+ mockedGetRemoteFiles.mockResolvedValue([
178
+ [{ name: '1-2-3.apk' }, { name: '1-2-3+1.apk' }, { name: '1-4-5.zip' }],
179
+ ]);
180
+ expect(await (0, binaries_1.maybePromptBinaryUpgrade)('android', {
181
+ onDownloadStart,
182
+ currentVersion: '1.2.3+1',
183
+ })).toBeNull();
184
+ expect(mockedPrompts).not.toHaveBeenCalled();
185
+ expect(onDownloadStart).not.toHaveBeenCalled();
186
+ });
187
+ it('returns early if downloaded versions already include the latest', async () => {
188
+ const onDownloadStart = jest.fn();
189
+ // mock remote files to set the latest available versions
190
+ mockedGetRemoteFiles.mockResolvedValue([
191
+ [{ name: '1-2-3.apk' }, { name: '1-2-3+1.apk' }, { name: '1-4-5.zip' }],
192
+ ]);
193
+ // mock the content of the downloads folder
194
+ mockedReaddir.mockResolvedValue(['1-2-3+1.apk']);
195
+ expect(await (0, binaries_1.maybePromptBinaryUpgrade)('android', {
196
+ onDownloadStart,
197
+ })).toBeNull();
198
+ expect(mockedPrompts).not.toHaveBeenCalled();
199
+ expect(onDownloadStart).not.toHaveBeenCalled();
200
+ });
201
+ it('does not trigger download if user deny the upgrade prompt', async () => {
202
+ const onDownloadStart = jest.fn();
203
+ // user denies the upgrade prompt
204
+ mockedPrompts.mockReturnValue({ shouldUpdate: false });
205
+ // mock remote files to set the latest available versions
206
+ mockedGetRemoteFiles.mockResolvedValue([
207
+ [{ name: '1-2-3.apk' }, { name: '1-2-3+1.apk' }, { name: '1-4-5.zip' }],
208
+ ]);
209
+ expect(
210
+ // 1.2.3+1 is available. should trigger the upgrade prompt if current version is 1.2.3
211
+ await (0, binaries_1.maybePromptBinaryUpgrade)('android', {
212
+ onDownloadStart,
213
+ currentVersion: '1.2.3',
214
+ })).toBeNull();
215
+ expect(mockedPrompts).toHaveBeenCalled();
216
+ expect(onDownloadStart).not.toHaveBeenCalled();
217
+ });
218
+ it('triggers download if user accepts the upgrade prompt', async () => {
219
+ const onDownloadStart = jest.fn();
220
+ // user accepts the upgrade prompt
221
+ mockedPrompts.mockReturnValue({ shouldUpdate: true });
222
+ // mock remote files to set the latest available versions
223
+ mockedGetRemoteFiles.mockResolvedValue([
224
+ [{ name: '1-2-3.apk' }, { name: '1-2-3+1.apk' }, { name: '1-4-5.zip' }],
225
+ ]);
226
+ expect(
227
+ // 1.2.3+1 is available. should trigger the upgrade prompt if current version is 1.2.3
228
+ await (0, binaries_1.maybePromptBinaryUpgrade)('android', {
229
+ onDownloadStart,
230
+ currentVersion: '1.2.3',
231
+ })).toBe('1.2.3+1');
232
+ expect(mockedPrompts).toHaveBeenCalled();
233
+ expect(onDownloadStart).toHaveBeenCalledWith('1.2.3+1');
234
+ });
235
+ });
236
+ describe('#downloadBinary', () => {
237
+ // expect get files to be called
238
+ // expect fetch latest if no version provided
239
+ // expect create read stream called to start download
240
+ it('does not download from remote storage if version is already downloaded', async () => {
241
+ mockedReaddir.mockResolvedValue(['1-2-3.zip']);
242
+ expect(await (0, binaries_1.downloadBinary)('ios', { version: '1.2.3' })).toBe('1.2.3');
243
+ expect(mockedGetRemoteFiles).not.toHaveBeenCalled();
244
+ });
245
+ it('triggers download if version is not available locally', async () => {
246
+ mockedReaddir.mockResolvedValue([]);
247
+ mockedGetRemoteFiles.mockResolvedValue([
248
+ [
249
+ {
250
+ name: '1-2-3.zip',
251
+ metadata: { size: 1000 },
252
+ },
253
+ ],
254
+ ]);
255
+ const mockedGet = (_url, cb) => {
256
+ setTimeout(() => cb({ pipe: () => { } }));
257
+ };
258
+ mockedHttp.get.mockImplementation(mockedGet);
259
+ const closeStream = jest.fn();
260
+ mockedCreateWriteStream.mockImplementation(() => ({
261
+ on: (ev, cb) => {
262
+ if (ev === 'finish') {
263
+ cb();
264
+ }
265
+ },
266
+ close: closeStream,
267
+ }));
268
+ await (0, binaries_1.downloadBinary)('ios', { version: '1.2.3' });
269
+ expect(mockedGetRemoteFiles).toHaveBeenCalledWith({ prefix: '1-2-3.zip' });
270
+ expect(http_1.default.get).toHaveBeenCalled();
271
+ expect(closeStream).toHaveBeenCalled();
272
+ });
273
+ });
274
+ });
275
+ //# sourceMappingURL=binaries.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binaries.test.js","sourceRoot":"","sources":["../../../../src/commands/dev/utils/binaries.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { DevCommandOptions } from '..';
2
+ export declare function getBundleUrl({ host }: DevCommandOptions): Promise<string>;
3
+ export declare function getDeeplink(miniHandle: string, options: DevCommandOptions, universalLink?: boolean): Promise<string>;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDeeplink = exports.getBundleUrl = void 0;
4
+ async function getBundleUrl({ host }) {
5
+ return `http://${host}:8082/index.bundle`;
6
+ }
7
+ exports.getBundleUrl = getBundleUrl;
8
+ async function getDeeplinkParams(miniHandle, options) {
9
+ const bundleUrl = await getBundleUrl(options);
10
+ const params = {
11
+ handle: miniHandle,
12
+ bundleUrl: encodeURIComponent(bundleUrl),
13
+ rnVersion: process.env.npm_package_dependencies_react_native,
14
+ manifest: {},
15
+ entryPointsParams: null,
16
+ };
17
+ const stringifiedParams = JSON.stringify(params);
18
+ return Buffer.from(stringifiedParams).toString('base64');
19
+ }
20
+ async function getDeeplink(miniHandle, options, universalLink = false) {
21
+ const deeplinkParams = await getDeeplinkParams(miniHandle, options);
22
+ if (universalLink) {
23
+ return `https://shop.app/mini/remote/${deeplinkParams}`;
24
+ }
25
+ else {
26
+ return `arrive://mini/remote/${deeplinkParams}`;
27
+ }
28
+ }
29
+ exports.getDeeplink = getDeeplink;
30
+ //# sourceMappingURL=deeplink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deeplink.js","sourceRoot":"","sources":["../../../../src/commands/dev/utils/deeplink.ts"],"names":[],"mappings":";;;AAEO,KAAK,UAAU,YAAY,CAAC,EAAC,IAAI,EAAoB;IAC1D,OAAO,UAAU,IAAI,oBAAoB,CAAA;AAC3C,CAAC;AAFD,oCAEC;AAED,KAAK,UAAU,iBAAiB,CAC9B,UAAkB,EAClB,OAA0B;IAE1B,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAA;IAE7C,MAAM,MAAM,GAAG;QACb,MAAM,EAAE,UAAU;QAClB,SAAS,EAAE,kBAAkB,CAAC,SAAS,CAAC;QACxC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,qCAAqC;QAC5D,QAAQ,EAAE,EAAE;QACZ,iBAAiB,EAAE,IAAI;KACxB,CAAA;IAED,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IAEhD,OAAO,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AAC1D,CAAC;AAEM,KAAK,UAAU,WAAW,CAC/B,UAAkB,EAClB,OAA0B,EAC1B,aAAa,GAAG,KAAK;IAErB,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IAEnE,IAAI,aAAa,EAAE;QACjB,OAAO,gCAAgC,cAAc,EAAE,CAAA;KACxD;SAAM;QACL,OAAO,wBAAwB,cAAc,EAAE,CAAA;KAChD;AACH,CAAC;AAZD,kCAYC"}
@@ -0,0 +1,23 @@
1
+ import { Ora } from 'ora';
2
+ import type { DevCommandOptions } from '..';
3
+ export declare class InteractiveTerminal {
4
+ miniHandle: string;
5
+ options: DevCommandOptions;
6
+ _loading?: Ora;
7
+ constructor(options: DevCommandOptions);
8
+ startWaitingForCommand: () => void;
9
+ stopWaitingForCommand: () => void;
10
+ waitForAnyKeyAndPrintInstructions: () => Promise<void>;
11
+ logInstructions(): void;
12
+ start(): void;
13
+ handleKeyPressWrapped: (key: string) => Promise<void>;
14
+ loadingStart(logMessage: string, options?: {
15
+ endPreviousLoadingWithStatus?: 'succeed' | 'fail' | 'warn' | 'info';
16
+ endPreviousLoadingWithMessage?: string;
17
+ }): void;
18
+ loadingEnd(endState?: 'succeed' | 'fail' | 'warn' | 'info', logMessage?: string): void;
19
+ handleKeyPress: (key: string) => Promise<void>;
20
+ showSetupAndroidHomeInstructions(): Promise<void>;
21
+ startAndroidApp(deviceId: string): Promise<void>;
22
+ printDeeplinkQRCode(): Promise<void>;
23
+ }