@shopify/shop-minis-cli 0.0.139 → 0.0.141

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 (48) hide show
  1. package/build/commands/create-mini/utils/template-app.js +1 -1
  2. package/build/commands/create-mini/utils/template-app.js.map +1 -1
  3. package/build/commands/dev/utils/app-screens.d.ts +8 -0
  4. package/build/commands/dev/utils/app-screens.js +150 -0
  5. package/build/commands/dev/utils/app-screens.js.map +1 -0
  6. package/build/commands/dev/utils/deeplink.d.ts +2 -1
  7. package/build/commands/dev/utils/deeplink.js +9 -2
  8. package/build/commands/dev/utils/deeplink.js.map +1 -1
  9. package/build/commands/dev/utils/env-config.d.ts +2 -0
  10. package/build/commands/dev/utils/env-config.js +47 -0
  11. package/build/commands/dev/utils/env-config.js.map +1 -0
  12. package/build/commands/dev/utils/interactive-terminal.d.ts +6 -1
  13. package/build/commands/dev/utils/interactive-terminal.js +72 -51
  14. package/build/commands/dev/utils/interactive-terminal.js.map +1 -1
  15. package/build/commands/setup/create.d.ts +1 -0
  16. package/build/commands/setup/create.js +44 -14
  17. package/build/commands/setup/create.js.map +1 -1
  18. package/build/commands/setup/index.js +9 -4
  19. package/build/commands/setup/index.js.map +1 -1
  20. package/build/index.js +1 -3
  21. package/build/index.js.map +1 -1
  22. package/build/templates-index.js +5 -0
  23. package/build/templates-index.js.map +1 -1
  24. package/build/utils/package-manager.d.ts +2 -2
  25. package/build/utils/package-manager.js +4 -10
  26. package/build/utils/package-manager.js.map +1 -1
  27. package/build/utils/sync-manifest.d.ts +1 -1
  28. package/build/utils/sync-manifest.js +8 -6
  29. package/build/utils/sync-manifest.js.map +1 -1
  30. package/package.json +1 -3
  31. package/templates/__template_getting_started/src/App.tsx +29 -0
  32. package/templates/__template_getting_started/src/index.tsx +9 -0
  33. package/templates/__template_getting_started/src/screens/ExtensionsScreen.tsx +60 -0
  34. package/templates/__template_getting_started/src/screens/HomeScreen.tsx +127 -0
  35. package/templates/__template_getting_started/src/screens/NativeFeaturesScreen.tsx +103 -0
  36. package/templates/__template_getting_started/src/types/screens.ts +5 -0
  37. package/build/commands/dev/utils/default-screen.d.ts +0 -2
  38. package/build/commands/dev/utils/default-screen.js +0 -186
  39. package/build/commands/dev/utils/default-screen.js.map +0 -1
  40. package/build/commands/dev/utils/qr-code.d.ts +0 -1
  41. package/build/commands/dev/utils/qr-code.js +0 -5
  42. package/build/commands/dev/utils/qr-code.js.map +0 -1
  43. package/build/commands/open-default-screen/index.d.ts +0 -14
  44. package/build/commands/open-default-screen/index.js +0 -101
  45. package/build/commands/open-default-screen/index.js.map +0 -1
  46. package/build/commands/open-default-screen/utils/prompt-deeplink-host.d.ts +0 -6
  47. package/build/commands/open-default-screen/utils/prompt-deeplink-host.js +0 -33
  48. package/build/commands/open-default-screen/utils/prompt-deeplink-host.js.map +0 -1
@@ -0,0 +1,103 @@
1
+ import {ScrollView, TouchableOpacity} from 'react-native'
2
+ import {useNavigation} from '@react-navigation/native'
3
+ import {NativeStackNavigationProp} from '@react-navigation/native-stack'
4
+ import ImagePicker from 'react-native-image-crop-picker'
5
+ import Share from 'react-native-share'
6
+ import {
7
+ Box,
8
+ SafeAreaView,
9
+ Text,
10
+ useTheme,
11
+ Button,
12
+ Icon,
13
+ useMinisDimensions,
14
+ } from '@shopify/shop-minis-platform-sdk'
15
+
16
+ import {RootStackParamList} from '../types/screens'
17
+
18
+ export function NativeFeaturesScreen() {
19
+ const theme = useTheme()
20
+ const navigation =
21
+ useNavigation<NativeStackNavigationProp<RootStackParamList>>()
22
+ const {height, width} = useMinisDimensions()
23
+
24
+ return (
25
+ <SafeAreaView
26
+ style={{flex: 1, backgroundColor: theme.colors['backgrounds-regular']}}
27
+ >
28
+ <ScrollView>
29
+ <Box
30
+ flex={1}
31
+ paddingHorizontal="gutter"
32
+ backgroundColor="backgrounds-regular"
33
+ >
34
+ <Box>
35
+ <TouchableOpacity
36
+ onPress={() => navigation.goBack()}
37
+ accessibilityLabel="Navigate back"
38
+ >
39
+ <Box marginTop="xs">
40
+ <Icon name="arrow-left" />
41
+ </Box>
42
+ </TouchableOpacity>
43
+ </Box>
44
+ <Text variant="heroBold" marginBottom="s" marginTop="xs">
45
+ Unlock Native Capabilities
46
+ </Text>
47
+ <Text variant="subtitle" marginBottom="s">
48
+ Let&apos;s explore the native capabilities your Shop Mini can
49
+ access.
50
+ </Text>
51
+ <Box marginBottom="s">
52
+ <Button
53
+ text="Camera access"
54
+ onPress={async () => {
55
+ await ImagePicker.openCamera({}).then(image => {
56
+ console.log(image)
57
+ })
58
+ }}
59
+ />
60
+ <Text variant="bodySmall" marginTop="xs">
61
+ Run this Mini on a real device to access the camera.
62
+ </Text>
63
+ </Box>
64
+ <Box marginBottom="s">
65
+ <Button
66
+ text="Gallery access"
67
+ onPress={async () => {
68
+ await ImagePicker.openPicker({}).then(image => {
69
+ console.log(image)
70
+ })
71
+ }}
72
+ />
73
+ </Box>
74
+ <Box marginBottom="s">
75
+ <Button
76
+ text="Share sheet"
77
+ onPress={async () => {
78
+ await Share.open({
79
+ url: 'https://shop.app/minis',
80
+ title: 'title',
81
+ })
82
+ }}
83
+ />
84
+ </Box>
85
+ <Box marginBottom="s">
86
+ <Text>Screen height: {height}</Text>
87
+ <Text>Screen width: {width}</Text>
88
+ </Box>
89
+ <Text marginBottom="s">
90
+ But how do people find your Mini? Let&apos;s talk about that in the
91
+ next screen.
92
+ </Text>
93
+ <Button
94
+ text="Next"
95
+ onPress={() => {
96
+ navigation.navigate('GettingStarted.Extensions')
97
+ }}
98
+ />
99
+ </Box>
100
+ </ScrollView>
101
+ </SafeAreaView>
102
+ )
103
+ }
@@ -0,0 +1,5 @@
1
+ import {ParamListBase} from '@react-navigation/native'
2
+
3
+ export interface RootStackParamList extends ParamListBase {
4
+ 'GettingStarted.Home': undefined
5
+ }
@@ -1,2 +0,0 @@
1
- export declare function removeEnvConfig(): Promise<void>;
2
- export declare function promptDefaultScreen(resetConfig?: boolean): Promise<string | null>;
@@ -1,186 +0,0 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- import prompts from 'prompts';
4
- function readEnvConfig() {
5
- const envFilePath = path.join(process.cwd(), '.env');
6
- if (!fs.existsSync(envFilePath)) {
7
- return {};
8
- }
9
- try {
10
- const envContent = fs.readFileSync(envFilePath, 'utf-8');
11
- const config = {};
12
- envContent.split('\n').forEach(line => {
13
- const [key, value] = line.split('=');
14
- if (key === 'DEFAULT_EXTENSION_LOCATION') {
15
- config.location = value || undefined;
16
- }
17
- if (key === 'DEFAULT_EXTENSION_ENTITY_ID') {
18
- config.id = value
19
- ? parseInt(value?.split('/').pop() || '', 10)
20
- : undefined;
21
- }
22
- });
23
- return config;
24
- }
25
- catch (error) {
26
- console.error('Failed to read .env file:', error);
27
- return {};
28
- }
29
- }
30
- async function saveEnvConfig(location, id) {
31
- const envFilePath = path.join(process.cwd(), '.env');
32
- if (!fs.existsSync(envFilePath)) {
33
- fs.writeFileSync(envFilePath, '');
34
- }
35
- // Read the current content of the .env file
36
- const envContent = fs.readFileSync(envFilePath, 'utf-8');
37
- // Check if LOCATION and ID already exist
38
- let locationExists = false;
39
- let idExists = false;
40
- const newEnvContent = envContent
41
- .split('\n')
42
- .map(line => {
43
- if (line.startsWith('DEFAULT_EXTENSION_LOCATION=')) {
44
- locationExists = true;
45
- return `DEFAULT_EXTENSION_LOCATION=${location}`;
46
- }
47
- if (line.startsWith('DEFAULT_EXTENSION_ENTITY_ID=')) {
48
- idExists = true;
49
- return `DEFAULT_EXTENSION_ENTITY_ID=${id}`;
50
- }
51
- return line; // keep the unchanged lines
52
- })
53
- .join('\n');
54
- // If LOCATION or ID does not exist, append them to the content
55
- const finalEnvContent = `${newEnvContent}${locationExists ? '' : `\nDEFAULT_EXTENSION_LOCATION=${location}`}${idExists ? '' : `\nDEFAULT_EXTENSION_ENTITY_ID=${id}`}`.trim();
56
- fs.writeFileSync(envFilePath, finalEnvContent);
57
- }
58
- export async function removeEnvConfig() {
59
- const envFilePath = path.join(process.cwd(), '.env');
60
- if (!fs.existsSync(envFilePath)) {
61
- return;
62
- }
63
- // Read the current content of the .env file
64
- const envContent = fs.readFileSync(envFilePath, 'utf-8');
65
- // Remove LOCATION and ID from the .env content
66
- const newEnvContent = envContent
67
- .split('\n')
68
- .filter(line => !line.startsWith('DEFAULT_EXTENSION_LOCATION=') &&
69
- !line.startsWith('DEFAULT_EXTENSION_ENTITY_ID='))
70
- .join('\n');
71
- fs.writeFileSync(envFilePath, newEnvContent);
72
- }
73
- async function promptForPage(devPages) {
74
- const { value: selectedPage } = await prompts({
75
- type: 'autocomplete',
76
- name: 'value',
77
- limit: 11,
78
- message: 'Select the page to open',
79
- choices: devPages.map(devPage => ({
80
- title: devPage,
81
- value: devPage,
82
- })),
83
- suggest: async (input, choices) => {
84
- const regex = new RegExp(input, 'i');
85
- return choices.filter(choice => regex.test(choice.title));
86
- },
87
- });
88
- return selectedPage || null;
89
- }
90
- async function promptForId(page) {
91
- let message;
92
- switch (page) {
93
- case 'PRODUCT_PAGE':
94
- message = 'Enter the GID of the product';
95
- break;
96
- case 'STORE_PAGE':
97
- message = 'Enter the GID of the Shop';
98
- break;
99
- case 'ORDER_MANAGEMENT_PAGE':
100
- message = 'Enter the GID of the order';
101
- break;
102
- default:
103
- message = 'Enter the GID of the resource';
104
- }
105
- const { idInput } = await prompts({
106
- type: 'text',
107
- name: 'idInput',
108
- message,
109
- validate: value => {
110
- const isValidGID = /^gid:\/\/shopify\/(Shop|Order|Product)\/\d+$/.test(value);
111
- return isValidGID
112
- ? true
113
- : 'ID must be in the format gid://shopify/{Type}/{Number}, where {Type} is Shop, Order, or Product and {Number} is a valid number';
114
- },
115
- });
116
- return idInput ? parseInt(idInput.split('/').pop(), 10) : null; // Convert input to a number
117
- }
118
- export async function promptDefaultScreen(resetConfig = false) {
119
- const devPages = ['STORE_PAGE', 'PRODUCT_PAGE', 'ORDER_MANAGEMENT_PAGE'];
120
- // Read existing configuration
121
- const existingConfig = readEnvConfig();
122
- const page = existingConfig?.location || null;
123
- const id = existingConfig?.id || null;
124
- // If resetConfig is false
125
- if (!resetConfig) {
126
- // If there is no existing configuration, return null
127
- if (!page || id === null) {
128
- return null; // Return null if no configuration exists
129
- }
130
- // If there is existing configuration, return the deep link
131
- let deepLink = '';
132
- switch (page) {
133
- case 'STORE_PAGE':
134
- deepLink = `arrive://shopifystore/${id}`;
135
- break;
136
- case 'PRODUCT_PAGE':
137
- deepLink = `arrive://p/${id}`;
138
- break;
139
- case 'ORDER_MANAGEMENT_PAGE':
140
- deepLink = `arrive://u/orders/${id}`;
141
- break;
142
- default:
143
- console.log('Invalid location.');
144
- return null;
145
- }
146
- return deepLink; // Return the existing deep link
147
- }
148
- // If resetConfig is true, remove existing config
149
- await removeEnvConfig();
150
- // Prompt for page and ID
151
- console.log('No existing configuration found. Prompting for page...');
152
- const pageSelection = await promptForPage(devPages);
153
- if (!pageSelection) {
154
- console.log('No page selected. Exiting...');
155
- return null;
156
- }
157
- const idInput = await promptForId(pageSelection);
158
- if (idInput === null) {
159
- console.log('No valid ID entered. Exiting...');
160
- return null;
161
- }
162
- // Save the new configuration
163
- await saveEnvConfig(pageSelection, idInput);
164
- console.log('Default screen configuration saved:', {
165
- location: pageSelection,
166
- id: idInput,
167
- });
168
- // Generate the deep link
169
- let deepLink = '';
170
- switch (pageSelection) {
171
- case 'STORE_PAGE':
172
- deepLink = `arrive://m/${idInput}`;
173
- break;
174
- case 'PRODUCT_PAGE':
175
- deepLink = `arrive://p/${idInput}`;
176
- break;
177
- case 'ORDER_MANAGEMENT_PAGE':
178
- deepLink = `arrive://u/orders/${idInput}`;
179
- break;
180
- default:
181
- console.log('Invalid location.');
182
- return null;
183
- }
184
- return deepLink; // Return the new deep link
185
- }
186
- //# sourceMappingURL=default-screen.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"default-screen.js","sourceRoot":"","sources":["../../../../src/commands/dev/utils/default-screen.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export declare function printQRCode(content: string): Promise<void>;
@@ -1,5 +0,0 @@
1
- import qrcodeTerminal from 'qrcode-terminal';
2
- export async function printQRCode(content) {
3
- qrcodeTerminal.generate(content, { small: true }, (code) => console.log(code));
4
- }
5
- //# sourceMappingURL=qr-code.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"qr-code.js","sourceRoot":"","sources":["../../../../src/commands/dev/utils/qr-code.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,iBAAiB,CAAA;AAE5C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe;IAC/C,cAAc,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAC,KAAK,EAAE,IAAI,EAAC,EAAE,CAAC,IAAY,EAAE,EAAE,CAC/D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAClB,CAAA;AACH,CAAC"}
@@ -1,14 +0,0 @@
1
- import { Command } from 'commander';
2
- import { BuildType } from '../dev/utils/types.js';
3
- export interface OpenDefaultScreenCommandOptions {
4
- verbose?: boolean;
5
- android?: string;
6
- ios?: string;
7
- qr?: boolean;
8
- buildType: BuildType;
9
- snapshotVersion?: string;
10
- }
11
- export declare const command: Command;
12
- export declare function setDefaultScreen(options: OpenDefaultScreenCommandOptions): Promise<void>;
13
- export declare function removeDefaultScreen(): Promise<void>;
14
- export declare function openDefaultScreen(options: OpenDefaultScreenCommandOptions): Promise<void>;
@@ -1,101 +0,0 @@
1
- import { Command, Option } from 'commander';
2
- import { handler as handleError } from '@shopify/cli-kit/node/error';
3
- import { outputDebug } from '@shopify/cli-kit/node/output';
4
- import { promptDefaultScreen, removeEnvConfig, } from '../dev/utils/default-screen.js';
5
- import { maybeLaunchEmulator, promptForAndroidDevices, } from '../dev/utils/android.js';
6
- import { bootSimulator, promptForSimulator } from '../dev/utils/simulator.js';
7
- import { printQRCode } from '../dev/utils/qr-code.js';
8
- import { Platform } from '../dev/utils/platform.js';
9
- import { startApp } from '../dev/utils/start-app/start-app.js';
10
- import { BuildType } from '../dev/utils/types.js';
11
- import { LoadingStateHandlers } from '../../utils/loading-state-handlers.js';
12
- import { promptDeeplinkHost } from './utils/prompt-deeplink-host.js';
13
- export const command = new Command()
14
- .name('open-default-screen')
15
- .description('Open your default screen in the Shop app')
16
- .option('--verbose', 'print debugging messages')
17
- .option('--android', 'Open the deeplink in an Android device. Prompts available devices if no device id is provided')
18
- .option('--qr', 'Print the deeplink as a QR code')
19
- .option('--ios', 'Open the deeplink in an iOS device. Prompts available devices if no device id is provided')
20
- .addOption(new Option('--build-type <buildType>', 'build type')
21
- .choices(Object.values(BuildType))
22
- .default(BuildType.Release))
23
- .addOption(new Option('--snapshot-version <version>', 'specify the snapshot version to use. (example: 2.100.0+544)').implies({ buildType: 'snapshot' }))
24
- .action(openDefaultScreen);
25
- export async function setDefaultScreen(options) {
26
- validateOptions(options);
27
- const deepLink = await promptDefaultScreen(true); // This will reset the configuration
28
- outputDebug(`Selected default screen: ${deepLink}`);
29
- }
30
- export async function removeDefaultScreen() {
31
- await removeEnvConfig();
32
- console.log('Default screen removed');
33
- }
34
- export async function openDefaultScreen(options) {
35
- try {
36
- validateOptions(options);
37
- outputDebug(`Running open-default-screen with options: ${JSON.stringify(options)}`);
38
- const deepLink = await promptDefaultScreen();
39
- if (!deepLink) {
40
- throw new Error('A new default screen must be selected');
41
- }
42
- outputDebug(`Selected default screen: ${deepLink}`);
43
- let deeplinkHost = options;
44
- if (!deeplinkHost.qr && !deeplinkHost.ios && !deeplinkHost.android) {
45
- deeplinkHost = await promptDeeplinkHost();
46
- }
47
- let platform = null;
48
- let deviceId = null;
49
- if (deeplinkHost.ios) {
50
- const simulator = await promptForSimulator();
51
- if (!simulator) {
52
- throw new Error('An iOS device must be selected');
53
- }
54
- outputDebug(`Selected iOS device: ${JSON.stringify(simulator)}`);
55
- await bootSimulator(simulator.udid);
56
- platform = Platform.IOS;
57
- deviceId = simulator.udid;
58
- }
59
- if (deeplinkHost.android) {
60
- const device = await promptForAndroidDevices();
61
- if (!device) {
62
- throw new Error('An android device must be selected');
63
- }
64
- outputDebug(`Selected android device: ${JSON.stringify(device)}`);
65
- platform = Platform.Android;
66
- if (device.type === 'emulator') {
67
- const emulatorId = await maybeLaunchEmulator(device.name);
68
- if (!emulatorId) {
69
- throw new Error(`Emulator ${device.name} could not be launched`);
70
- }
71
- deviceId = emulatorId;
72
- }
73
- else {
74
- deviceId = device.name;
75
- }
76
- }
77
- if (platform && deviceId) {
78
- await startApp({
79
- platform,
80
- deviceId,
81
- deeplink: deepLink,
82
- buildType: options.buildType,
83
- snapshotVersion: options.snapshotVersion,
84
- }, new LoadingStateHandlers());
85
- }
86
- if (deeplinkHost.qr) {
87
- // We want universal links for the QR code, so using the deep link here is fine.
88
- await printQRCode(deepLink);
89
- }
90
- }
91
- catch (err) {
92
- delete err.stack; // delete the stack to avoid verbose logging in case of unhandled errors
93
- await handleError(err);
94
- }
95
- }
96
- function validateOptions({ ios, android }) {
97
- if (ios && android) {
98
- throw new Error('Options --ios and --android cannot be used at the same time');
99
- }
100
- }
101
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/open-default-screen/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,MAAM,EAAC,MAAM,WAAW,CAAA;AACzC,OAAO,EAAC,OAAO,IAAI,WAAW,EAAC,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAC,WAAW,EAAC,MAAM,8BAA8B,CAAA;AAExD,OAAO,EACL,mBAAmB,EACnB,eAAe,GAChB,MAAM,gCAAgC,CAAA;AACvC,OAAO,EACL,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAC,aAAa,EAAE,kBAAkB,EAAC,MAAM,2BAA2B,CAAA;AAC3E,OAAO,EAAC,WAAW,EAAC,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAC,QAAQ,EAAC,MAAM,0BAA0B,CAAA;AACjD,OAAO,EAAC,QAAQ,EAAC,MAAM,qCAAqC,CAAA;AAC5D,OAAO,EAAC,SAAS,EAAC,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EAAC,oBAAoB,EAAC,MAAM,uCAAuC,CAAA;AAE1E,OAAO,EAAe,kBAAkB,EAAC,MAAM,iCAAiC,CAAA;AAWhF,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;KACjC,IAAI,CAAC,qBAAqB,CAAC;KAC3B,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,WAAW,EAAE,0BAA0B,CAAC;KAC/C,MAAM,CACL,WAAW,EACX,+FAA+F,CAChG;KACA,MAAM,CAAC,MAAM,EAAE,iCAAiC,CAAC;KACjD,MAAM,CACL,OAAO,EACP,2FAA2F,CAC5F;KACA,SAAS,CACR,IAAI,MAAM,CAAC,0BAA0B,EAAE,YAAY,CAAC;KACjD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;KACjC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAC9B;KACA,SAAS,CACR,IAAI,MAAM,CACR,8BAA8B,EAC9B,6DAA6D,CAC9D,CAAC,OAAO,CAAC,EAAC,SAAS,EAAE,UAAU,EAAC,CAAC,CACnC;KACA,MAAM,CAAC,iBAAiB,CAAC,CAAA;AAE5B,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAwC;IAExC,eAAe,CAAC,OAAO,CAAC,CAAA;IACxB,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAA,CAAC,oCAAoC;IAErF,WAAW,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAA;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,eAAe,EAAE,CAAA;IACvB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAwC;IAExC,IAAI;QACF,eAAe,CAAC,OAAO,CAAC,CAAA;QACxB,WAAW,CACT,6CAA6C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CACvE,CAAA;QAED,MAAM,QAAQ,GAAG,MAAM,mBAAmB,EAAE,CAAA;QAE5C,IAAI,CAAC,QAAQ,EAAE;YACb,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;SACzD;QACD,WAAW,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAA;QAEnD,IAAI,YAAY,GAAG,OAAuB,CAAA;QAC1C,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;YAClE,YAAY,GAAG,MAAM,kBAAkB,EAAE,CAAA;SAC1C;QAED,IAAI,QAAQ,GAAoB,IAAI,CAAA;QACpC,IAAI,QAAQ,GAAkB,IAAI,CAAA;QAElC,IAAI,YAAY,CAAC,GAAG,EAAE;YACpB,MAAM,SAAS,GAAG,MAAM,kBAAkB,EAAE,CAAA;YAC5C,IAAI,CAAC,SAAS,EAAE;gBACd,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;aAClD;YACD,WAAW,CAAC,wBAAwB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;YAChE,MAAM,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YAEnC,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAA;YACvB,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAA;SAC1B;QAED,IAAI,YAAY,CAAC,OAAO,EAAE;YACxB,MAAM,MAAM,GAAG,MAAM,uBAAuB,EAAE,CAAA;YAC9C,IAAI,CAAC,MAAM,EAAE;gBACX,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;aACtD;YACD,WAAW,CAAC,4BAA4B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACjE,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAA;YAE3B,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE;gBAC9B,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBACzD,IAAI,CAAC,UAAU,EAAE;oBACf,MAAM,IAAI,KAAK,CAAC,YAAY,MAAM,CAAC,IAAI,wBAAwB,CAAC,CAAA;iBACjE;gBACD,QAAQ,GAAG,UAAU,CAAA;aACtB;iBAAM;gBACL,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAA;aACvB;SACF;QAED,IAAI,QAAQ,IAAI,QAAQ,EAAE;YACxB,MAAM,QAAQ,CACZ;gBACE,QAAQ;gBACR,QAAQ;gBACR,QAAQ,EAAE,QAAQ;gBAClB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,eAAe,EAAE,OAAO,CAAC,eAAe;aACzC,EACD,IAAI,oBAAoB,EAAE,CAC3B,CAAA;SACF;QAED,IAAI,YAAY,CAAC,EAAE,EAAE;YACnB,gFAAgF;YAChF,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAA;SAC5B;KACF;IAAC,OAAO,GAAG,EAAE;QACZ,OAAQ,GAAa,CAAC,KAAK,CAAA,CAAC,wEAAwE;QACpG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAA;KACvB;AACH,CAAC;AAED,SAAS,eAAe,CAAC,EAAC,GAAG,EAAE,OAAO,EAAkC;IACtE,IAAI,GAAG,IAAI,OAAO,EAAE;QAClB,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAA;KACF;AACH,CAAC"}
@@ -1,6 +0,0 @@
1
- export interface DeeplinkHost {
2
- qr?: boolean;
3
- ios?: boolean;
4
- android?: boolean;
5
- }
6
- export declare function promptDeeplinkHost(): Promise<DeeplinkHost>;
@@ -1,33 +0,0 @@
1
- import prompts from 'prompts';
2
- const HOSTS = {
3
- IOS: {
4
- title: 'iOS',
5
- value: 'ios',
6
- },
7
- ANDROID: {
8
- title: 'Android',
9
- value: 'android',
10
- },
11
- QR: {
12
- title: 'Print a QR code',
13
- value: 'qr',
14
- },
15
- };
16
- export async function promptDeeplinkHost() {
17
- const { device } = await prompts({
18
- type: 'select',
19
- name: 'device',
20
- message: 'Select a device to open the default screen',
21
- choices: [HOSTS.IOS, HOSTS.ANDROID, HOSTS.QR],
22
- }, {
23
- onCancel: () => {
24
- throw new Error('A device must be selected');
25
- },
26
- });
27
- return {
28
- ios: device === HOSTS.IOS.value,
29
- android: device === HOSTS.ANDROID.value,
30
- qr: device === HOSTS.QR.value,
31
- };
32
- }
33
- //# sourceMappingURL=prompt-deeplink-host.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompt-deeplink-host.js","sourceRoot":"","sources":["../../../../src/commands/open-default-screen/utils/prompt-deeplink-host.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAA;AAE7B,MAAM,KAAK,GAAG;IACZ,GAAG,EAAE;QACH,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,KAAK;KACb;IACD,OAAO,EAAE;QACP,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,SAAS;KACjB;IACD,EAAE,EAAE;QACF,KAAK,EAAE,iBAAiB;QACxB,KAAK,EAAE,IAAI;KACZ;CACF,CAAA;AAQD,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,EAAC,MAAM,EAAC,GAAG,MAAM,OAAO,CAC5B;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,4CAA4C;QACrD,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;KAC9C,EACD;QACE,QAAQ,EAAE,GAAG,EAAE;YACb,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;QAC9C,CAAC;KACF,CACF,CAAA;IACD,OAAO;QACL,GAAG,EAAE,MAAM,KAAK,KAAK,CAAC,GAAG,CAAC,KAAK;QAC/B,OAAO,EAAE,MAAM,KAAK,KAAK,CAAC,OAAO,CAAC,KAAK;QACvC,EAAE,EAAE,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC,KAAK;KAC9B,CAAA;AACH,CAAC"}