@shopify/shop-minis-cli 0.0.38 → 0.0.40

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 (170) hide show
  1. package/.eslintrc.cjs +84 -0
  2. package/.vscode/extensions.json +3 -0
  3. package/.vscode/settings.json +8 -0
  4. package/.vscode/shop-minis-cli.code-workspace +8 -0
  5. package/build/commands/cancel-submission/index.d.ts +2 -0
  6. package/build/commands/cancel-submission/index.js +22 -0
  7. package/build/commands/cancel-submission/index.js.map +1 -0
  8. package/build/commands/cancel-submission/types.d.ts +3 -0
  9. package/build/commands/cancel-submission/types.js +2 -0
  10. package/build/commands/cancel-submission/types.js.map +1 -0
  11. package/build/commands/check-submission/index.d.ts +2 -0
  12. package/build/commands/check-submission/index.js +22 -0
  13. package/build/commands/check-submission/index.js.map +1 -0
  14. package/build/commands/check-submission/types.d.ts +3 -0
  15. package/build/commands/check-submission/types.js +2 -0
  16. package/build/commands/check-submission/types.js.map +1 -0
  17. package/build/commands/config.d.ts +10 -0
  18. package/build/commands/config.js +34 -0
  19. package/build/commands/config.js.map +1 -0
  20. package/build/commands/create-mini/index.js +74 -67
  21. package/build/commands/create-mini/index.js.map +1 -1
  22. package/build/commands/create-mini/utils/template-app.js +20 -25
  23. package/build/commands/create-mini/utils/template-app.js.map +1 -1
  24. package/build/commands/dev/index.js +13 -20
  25. package/build/commands/dev/index.js.map +1 -1
  26. package/build/commands/dev/utils/android.js +34 -48
  27. package/build/commands/dev/utils/android.js.map +1 -1
  28. package/build/commands/dev/utils/binaries.d.ts +1 -22
  29. package/build/commands/dev/utils/binaries.js +19 -98
  30. package/build/commands/dev/utils/binaries.js.map +1 -1
  31. package/build/commands/dev/utils/deeplink.d.ts +1 -1
  32. package/build/commands/dev/utils/deeplink.js +37 -9
  33. package/build/commands/dev/utils/deeplink.js.map +1 -1
  34. package/build/commands/dev/utils/interactive-terminal.d.ts +1 -1
  35. package/build/commands/dev/utils/interactive-terminal.js +46 -52
  36. package/build/commands/dev/utils/interactive-terminal.js.map +1 -1
  37. package/build/commands/dev/utils/metro/metro-config.js +19 -20
  38. package/build/commands/dev/utils/metro/metro-config.js.map +1 -1
  39. package/build/commands/dev/utils/metro/metro-reporter.d.ts +2 -3
  40. package/build/commands/dev/utils/metro/metro-reporter.js +7 -12
  41. package/build/commands/dev/utils/metro/metro-reporter.js.map +1 -1
  42. package/build/commands/dev/utils/metro/metro-server-middleware.js +5 -12
  43. package/build/commands/dev/utils/metro/metro-server-middleware.js.map +1 -1
  44. package/build/commands/dev/utils/metro/metro-server.d.ts +1 -1
  45. package/build/commands/dev/utils/metro/metro-server.js +6 -13
  46. package/build/commands/dev/utils/metro/metro-server.js.map +1 -1
  47. package/build/commands/dev/utils/network.d.ts +20 -0
  48. package/build/commands/dev/utils/network.js +62 -0
  49. package/build/commands/dev/utils/network.js.map +1 -0
  50. package/build/commands/dev/utils/qr-code.js +3 -10
  51. package/build/commands/dev/utils/qr-code.js.map +1 -1
  52. package/build/commands/dev/utils/simulator.js +25 -35
  53. package/build/commands/dev/utils/simulator.js.map +1 -1
  54. package/build/commands/dev/utils/types.d.ts +1 -0
  55. package/build/commands/dev/utils/types.js +2 -0
  56. package/build/commands/dev/utils/types.js.map +1 -0
  57. package/build/commands/dev/utils/with-retries.js +1 -5
  58. package/build/commands/dev/utils/with-retries.js.map +1 -1
  59. package/build/commands/generate-graphql-types/index.js +25 -26
  60. package/build/commands/generate-graphql-types/index.js.map +1 -1
  61. package/build/commands/schemas/contextual-image.schema.d.ts +22 -0
  62. package/build/commands/schemas/contextual-image.schema.js +23 -0
  63. package/build/commands/schemas/contextual-image.schema.js.map +1 -0
  64. package/build/commands/schemas/contextual-object.schema.d.ts +18 -0
  65. package/build/commands/schemas/contextual-object.schema.js +19 -0
  66. package/build/commands/schemas/contextual-object.schema.js.map +1 -0
  67. package/build/commands/schemas/manifest.schema.d.ts +181 -0
  68. package/build/commands/schemas/manifest.schema.js +230 -0
  69. package/build/commands/schemas/manifest.schema.js.map +1 -0
  70. package/build/commands/schemas/visibility.schema.d.ts +18 -0
  71. package/build/commands/schemas/visibility.schema.js +19 -0
  72. package/build/commands/schemas/visibility.schema.js.map +1 -0
  73. package/build/commands/submit/config.d.ts +9 -0
  74. package/build/commands/submit/config.js +18 -0
  75. package/build/commands/submit/config.js.map +1 -0
  76. package/build/commands/submit/errors.d.ts +19 -0
  77. package/build/commands/submit/errors.js +87 -0
  78. package/build/commands/submit/errors.js.map +1 -0
  79. package/build/commands/submit/gcs.d.ts +6 -0
  80. package/build/commands/submit/gcs.js +10 -0
  81. package/build/commands/submit/gcs.js.map +1 -0
  82. package/build/commands/submit/graphql.d.ts +73 -0
  83. package/build/commands/submit/graphql.js +100 -0
  84. package/build/commands/submit/graphql.js.map +1 -0
  85. package/build/commands/submit/index.d.ts +2 -0
  86. package/build/commands/submit/index.js +21 -0
  87. package/build/commands/submit/index.js.map +1 -0
  88. package/build/commands/submit/submit.d.ts +4 -0
  89. package/build/commands/submit/submit.js +171 -0
  90. package/build/commands/submit/submit.js.map +1 -0
  91. package/build/commands/submit/tasks.d.ts +39 -0
  92. package/build/commands/submit/tasks.js +167 -0
  93. package/build/commands/submit/tasks.js.map +1 -0
  94. package/build/commands/submit/types.d.ts +14 -0
  95. package/build/commands/submit/types.js +2 -0
  96. package/build/commands/submit/types.js.map +1 -0
  97. package/build/commands/submit/validation.d.ts +2 -0
  98. package/build/commands/submit/validation.js +14 -0
  99. package/build/commands/submit/validation.js.map +1 -0
  100. package/build/commands/types/autogenerated/shop-minis-admin-api/fragment-masking.d.ts +13 -0
  101. package/build/commands/types/autogenerated/shop-minis-admin-api/fragment-masking.js +7 -0
  102. package/build/commands/types/autogenerated/shop-minis-admin-api/fragment-masking.js.map +1 -0
  103. package/build/commands/types/autogenerated/shop-minis-admin-api/gql.d.ts +54 -0
  104. package/build/commands/types/autogenerated/shop-minis-admin-api/gql.js +21 -0
  105. package/build/commands/types/autogenerated/shop-minis-admin-api/gql.js.map +1 -0
  106. package/build/commands/types/autogenerated/shop-minis-admin-api/graphql.d.ts +704 -0
  107. package/build/commands/types/autogenerated/shop-minis-admin-api/graphql.js +449 -0
  108. package/build/commands/types/autogenerated/shop-minis-admin-api/graphql.js.map +1 -0
  109. package/build/commands/types/autogenerated/shop-minis-admin-api/index.d.ts +2 -0
  110. package/build/commands/types/autogenerated/shop-minis-admin-api/index.js +3 -0
  111. package/build/commands/types/autogenerated/shop-minis-admin-api/index.js.map +1 -0
  112. package/build/commands/types/helpers.d.ts +1 -0
  113. package/build/commands/types/helpers.js +2 -0
  114. package/build/commands/types/helpers.js.map +1 -0
  115. package/build/commands/utils/archive.d.ts +30 -0
  116. package/build/commands/utils/archive.js +38 -0
  117. package/build/commands/utils/archive.js.map +1 -0
  118. package/build/commands/utils/exec-async-child-process.d.ts +1 -1
  119. package/build/commands/utils/exec-async-child-process.js +6 -13
  120. package/build/commands/utils/exec-async-child-process.js.map +1 -1
  121. package/build/commands/utils/file.d.ts +1 -0
  122. package/build/commands/utils/file.js +7 -0
  123. package/build/commands/utils/file.js.map +1 -0
  124. package/build/commands/{check/utils/manifest.d.ts → utils/minis-manifest.d.ts} +1 -0
  125. package/build/commands/utils/minis-manifest.js +42 -0
  126. package/build/commands/utils/minis-manifest.js.map +1 -0
  127. package/build/commands/utils/wrap-with-loading-indicator.js +3 -10
  128. package/build/commands/utils/wrap-with-loading-indicator.js.map +1 -1
  129. package/build/dev-panel/middleware.js +5 -10
  130. package/build/dev-panel/middleware.js.map +1 -1
  131. package/build/index.js +15 -13
  132. package/build/index.js.map +1 -1
  133. package/jest.config.ts +11 -0
  134. package/package.json +5 -8
  135. package/scripts/graphql-codegen.ts +23 -0
  136. package/scripts/test-template.ts +63 -0
  137. package/templates/__template_blank/src/index.tsx +5 -4
  138. package/templates/__template_common/.eslintrc.json +2 -119
  139. package/templates/__template_common/gitignore +2 -0
  140. package/templates/__template_common/index.tsx +2 -3
  141. package/templates/__template_common/metro.config.js +0 -4
  142. package/templates/__template_common/package.json +12 -8
  143. package/templates/__template_common/src/manifest.json +1 -0
  144. package/templates/__template_hello_world/src/components/FeaturedComponents.tsx +2 -2
  145. package/templates/__template_hello_world/src/components/quiz/types.ts +2 -2
  146. package/templates/__template_hello_world/src/index.tsx +5 -4
  147. package/templates/__template_hello_world/src/screens/BottomSheetScreen.tsx +6 -5
  148. package/templates/__template_hello_world/src/screens/QuizScreen.tsx +2 -2
  149. package/templates/__template_hello_world/src/screens/QuizSlideScreen.tsx +2 -2
  150. package/templates/__template_snowboardz/src/index.tsx +5 -4
  151. package/build/commands/check/index.d.ts +0 -6
  152. package/build/commands/check/index.js +0 -87
  153. package/build/commands/check/index.js.map +0 -1
  154. package/build/commands/check/utils/manifest.js +0 -26
  155. package/build/commands/check/utils/manifest.js.map +0 -1
  156. package/build/commands/check/utils/schemas/contextual-image.schema.json +0 -21
  157. package/build/commands/check/utils/schemas/contextual-object.schema.json +0 -17
  158. package/build/commands/check/utils/schemas/manifest.schema.json +0 -226
  159. package/build/commands/check/utils/schemas/visibility.schema.json +0 -17
  160. package/build/commands/check/utils/versions.d.ts +0 -1
  161. package/build/commands/check/utils/versions.js +0 -14
  162. package/build/commands/check/utils/versions.js.map +0 -1
  163. package/build/commands/dev/utils/binaries.test.d.ts +0 -1
  164. package/build/commands/dev/utils/binaries.test.js +0 -275
  165. package/build/commands/dev/utils/binaries.test.js.map +0 -1
  166. package/build/commands/dev/utils/minis-manifest.d.ts +0 -1
  167. package/build/commands/dev/utils/minis-manifest.js +0 -24
  168. package/build/commands/dev/utils/minis-manifest.js.map +0 -1
  169. package/templates/__template_hello_world/src/utils/getFlagEmoji.spec.tsx +0 -19
  170. /package/templates/{__template_blank/src/custom.d.ts → __template_common/assets.d.ts} +0 -0
@@ -0,0 +1,4 @@
1
+ import type { SubmitCommandArgs, SubmitConfig } from './types.js';
2
+ export declare const preSubmitChecks: () => Promise<void>;
3
+ export declare const completeConfig: (args: SubmitCommandArgs) => Promise<SubmitConfig>;
4
+ export declare const doSubmit: (config: SubmitConfig) => Promise<void>;
@@ -0,0 +1,171 @@
1
+ import path from 'node:path';
2
+ import { renderSuccess, renderTasks, renderTextPrompt, } from '@shopify/cli-kit/node/ui';
3
+ import { AbortError, handler as handleError } from '@shopify/cli-kit/node/error';
4
+ import { formatPackageManagerCommand, outputDebug, } from '@shopify/cli-kit/node/output';
5
+ import { getPackageManager } from '../config.js';
6
+ import { isValid, validateDescription } from './validation.js';
7
+ import { assertNetworkAndAuth, assertDependenciesUpToDate, assertManifestValid, assertNoPendingSubmissions, createStagedUpload, createSubmission, packageShopMini, uploadSubmission, } from './tasks.js';
8
+ import { generateSubmissionArchiveFilename, getSubmissionArchivePath, } from './config.js';
9
+ const SRC_DIR = path.resolve(process.cwd(), 'src');
10
+ export const preSubmitChecks = async () => {
11
+ const tasks = [
12
+ // We run this task first to ensure auth and network are working.
13
+ // This makes sense because the dependency check needs a network
14
+ {
15
+ title: `Authenticating using Shop Minis Admin API key`,
16
+ task: async () => {
17
+ await assertNetworkAndAuth();
18
+ },
19
+ },
20
+ {
21
+ title: `Checking if dependencies are up to date`,
22
+ task: async () => {
23
+ await assertDependenciesUpToDate();
24
+ },
25
+ },
26
+ {
27
+ title: `Checking if there are other submissions`,
28
+ task: async () => {
29
+ await assertNoPendingSubmissions();
30
+ },
31
+ },
32
+ {
33
+ title: `Verifying your manifest file`,
34
+ task: async () => {
35
+ await assertManifestValid();
36
+ },
37
+ },
38
+ ];
39
+ try {
40
+ await renderTasks(tasks);
41
+ }
42
+ catch (error) {
43
+ // Always output the error first
44
+ handleError(error);
45
+ // If the error doesn't have next steps follow-up with some generic ones
46
+ if (!error || !error?.nextSteps) {
47
+ handleError(new AbortError(`Pre-submission checks failed`, 'Try again and if the issue continues, contact us.', ['Try to run `submit` again', "Contact Shop if you're having issues"]));
48
+ }
49
+ process.exit(1);
50
+ }
51
+ };
52
+ export const completeConfig = async (args) => {
53
+ let { description } = args;
54
+ if (!description || !isValid(validateDescription, description)) {
55
+ description = await renderTextPrompt({
56
+ defaultValue: description,
57
+ message: 'Describe the change',
58
+ validate: validateDescription,
59
+ });
60
+ }
61
+ return {
62
+ description,
63
+ };
64
+ };
65
+ export const doSubmit = async (config) => {
66
+ outputDebug(`Submit config ${JSON.stringify(config)}`);
67
+ const submitTasksData = {
68
+ outputArchiveFilename: null,
69
+ outputArchivePath: null,
70
+ stagedUpload: null,
71
+ submission: null,
72
+ };
73
+ const tasks = [
74
+ {
75
+ title: `Packaging Shop Mini for submission`,
76
+ task: async () => {
77
+ const inputDirectory = SRC_DIR;
78
+ const matchFilePattern = `**/*`;
79
+ submitTasksData.outputArchiveFilename =
80
+ generateSubmissionArchiveFilename();
81
+ submitTasksData.outputArchivePath = getSubmissionArchivePath(submitTasksData.outputArchiveFilename);
82
+ await packageShopMini({
83
+ inputDirectory,
84
+ outputArchivePath: submitTasksData.outputArchivePath,
85
+ matchFilePattern,
86
+ ignore: ['**/*.(spec|test).*', '**/__tests__/**/*'],
87
+ });
88
+ },
89
+ },
90
+ {
91
+ title: 'Preparing to upload submission',
92
+ task: async () => {
93
+ if (!submitTasksData.outputArchivePath ||
94
+ !submitTasksData.outputArchiveFilename) {
95
+ throw new Error('Expected data for upload submission not found');
96
+ }
97
+ // eslint-disable-next-line require-atomic-updates
98
+ submitTasksData.stagedUpload = await createStagedUpload({
99
+ outputArchiveFilename: submitTasksData.outputArchiveFilename,
100
+ outputArchivePath: submitTasksData.outputArchivePath,
101
+ });
102
+ },
103
+ },
104
+ {
105
+ title: 'Uploading submission',
106
+ task: async () => {
107
+ if (!submitTasksData.outputArchivePath ||
108
+ !submitTasksData.stagedUpload) {
109
+ throw new Error('Expected data for submission not found');
110
+ }
111
+ await uploadSubmission({
112
+ url: submitTasksData.stagedUpload.url,
113
+ headers: JSON.parse(submitTasksData.stagedUpload.headers),
114
+ outputArchivePath: submitTasksData.outputArchivePath,
115
+ });
116
+ },
117
+ },
118
+ {
119
+ title: 'Finalizing submission',
120
+ task: async () => {
121
+ if (!submitTasksData.stagedUpload) {
122
+ throw new Error('Expected data for finalizing submission not found');
123
+ }
124
+ // eslint-disable-next-line require-atomic-updates
125
+ submitTasksData.submission = await createSubmission({
126
+ description: config.description,
127
+ stagedUploadId: submitTasksData.stagedUpload.id,
128
+ });
129
+ },
130
+ },
131
+ ];
132
+ try {
133
+ await renderTasks(tasks);
134
+ renderSuccess({
135
+ headline: 'Shop Mini submitted',
136
+ body: [
137
+ 'Thank you for your submission. Your Shop Mini has been added to the review queue. Your submission reference is:',
138
+ {
139
+ bold: submitTasksData.submission?.reference ?? 'unknown',
140
+ },
141
+ ],
142
+ nextSteps: [
143
+ [
144
+ 'Keep your eyes on your email for communication regarding your submission',
145
+ ],
146
+ [
147
+ 'To check the status of your submission at any point, run',
148
+ {
149
+ command: formatPackageManagerCommand(await getPackageManager(), 'check-submission'),
150
+ },
151
+ ],
152
+ [
153
+ 'To cancel your submission at any point, run',
154
+ {
155
+ command: formatPackageManagerCommand(await getPackageManager(), 'cancel-submission'),
156
+ },
157
+ ],
158
+ ],
159
+ });
160
+ }
161
+ catch (error) {
162
+ // Always output the error first
163
+ handleError(error);
164
+ // If the error doesn't have next steps follow-up with some generic ones
165
+ if (!error || !error?.nextSteps) {
166
+ handleError(new AbortError(`Submission failed`, 'Try again and if the issue continues, contact us.', ['Try to run `submit` again', "Contact Shop if you're having issues"]));
167
+ }
168
+ process.exit(1);
169
+ }
170
+ };
171
+ //# sourceMappingURL=submit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submit.js","sourceRoot":"","sources":["../../../src/commands/submit/submit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export declare function assertDependenciesUpToDate(): Promise<void>;
2
+ export declare function assertNetworkAndAuth(): Promise<void>;
3
+ export declare function assertNoPendingSubmissions(): Promise<void>;
4
+ export declare function assertManifestValid(): void;
5
+ interface PackageShopMiniParams {
6
+ inputDirectory: string;
7
+ outputArchivePath: string;
8
+ matchFilePattern: string;
9
+ ignore: string[];
10
+ }
11
+ export declare const packageShopMini: ({ inputDirectory, outputArchivePath, matchFilePattern, ignore, }: PackageShopMiniParams) => Promise<void>;
12
+ interface CreateStagedUploadParams {
13
+ outputArchiveFilename: string;
14
+ outputArchivePath: string;
15
+ }
16
+ export declare const createStagedUpload: ({ outputArchiveFilename, outputArchivePath, }: CreateStagedUploadParams) => Promise<{
17
+ __typename?: "StagedUpload" | undefined;
18
+ url: any;
19
+ headers: string;
20
+ id: string;
21
+ } | null | undefined>;
22
+ interface UploadSubmissionParams {
23
+ url: string;
24
+ headers: Record<string, string>;
25
+ outputArchivePath: string;
26
+ }
27
+ export declare const uploadSubmission: ({ url, headers, outputArchivePath, }: UploadSubmissionParams) => Promise<void>;
28
+ interface CreateSubmissionParams {
29
+ description: string;
30
+ stagedUploadId: string;
31
+ }
32
+ export declare const createSubmission: ({ description, stagedUploadId, }: CreateSubmissionParams) => Promise<{
33
+ __typename?: "Submission" | undefined;
34
+ reference: string;
35
+ description: string;
36
+ status: import("../types/autogenerated/shop-minis-admin-api/graphql.js").SubmissionStatus;
37
+ submittedAt: any;
38
+ } | null | undefined>;
39
+ export {};
@@ -0,0 +1,167 @@
1
+ import { mkdirSync } from 'node:fs';
2
+ import semver from 'semver';
3
+ import { AbortError } from '@shopify/cli-kit/node/error';
4
+ import { fileSize } from '@shopify/cli-kit/node/fs';
5
+ import { outputContent, outputDebug, outputToken, } from '@shopify/cli-kit/node/output';
6
+ import { ClientError } from 'graphql-request';
7
+ import { zip } from '../utils/archive.js';
8
+ import { CLI_VERSION, getPackageManager, SHOP_MINIS_ADMIN_API_KEY, } from '../config.js';
9
+ import { getFileChecksum } from '../utils/file.js';
10
+ import { execAsync } from '../utils/exec-async-child-process.js';
11
+ import { validateManifest } from '../utils/minis-manifest.js';
12
+ import { createSubmission as graphqlCreateSubmission, createUpload as graphqlCreateUpload, getPendingSubmission as graphqlGetPendingSubmission, getSubmissions as graphqlGetSubmissions, } from './graphql.js';
13
+ import { uploadFile } from './gcs.js';
14
+ import { wrapError, handleCreateUploadErrors, handleUploadFileErrors, handleCreateSubmissionErrors, generateExistingPendingSubmissionError, } from './errors.js';
15
+ import { SUBMISSION_PATHS, SUBMISSION_VALIDATION } from './config.js';
16
+ const APPLY_FOR_EARLY_ACCESS_URL = 'https://shop.app/minis/apply';
17
+ export async function assertDependenciesUpToDate() {
18
+ const packageManager = await getPackageManager();
19
+ const getLatestVersionCommand = packageManager === 'yarn'
20
+ ? 'yarn info @shopify/shop-minis-cli version --silent'
21
+ : 'npm show @shopify/shop-minis-cli version';
22
+ const updateToLatestVersionCommand = packageManager === 'yarn'
23
+ ? 'yarn upgrade @shopify/shop-minis-cli --latest'
24
+ : 'npm install @shopify/shop-minis-cli@latest --save-dev';
25
+ outputDebug(`Executing \`${getLatestVersionCommand}\` to get the latest version`);
26
+ const { stdout: latestCliVersionStdout } = await execAsync({
27
+ cmd: getLatestVersionCommand,
28
+ });
29
+ const latestCliVersion = latestCliVersionStdout[0];
30
+ outputDebug(`Latest version is ${latestCliVersion ?? 'not found'}`);
31
+ const installedCliVersion = CLI_VERSION;
32
+ outputDebug(`Installed version is ${installedCliVersion ?? 'not found'}`);
33
+ let isUpToDate = false;
34
+ try {
35
+ isUpToDate = semver.eq(installedCliVersion ?? '0.0.0', latestCliVersion);
36
+ }
37
+ catch (error) {
38
+ throw wrapError(error, 'Unable to detect and compare the current and latest versions of @shopify/shop-minis-cli.\n\n' +
39
+ `Installed version is ${installedCliVersion ?? 'not found'}\n` +
40
+ `Latest version is ${latestCliVersion ?? 'not found'}\n\n`, { separator: '' });
41
+ }
42
+ if (!isUpToDate) {
43
+ throw new AbortError('Shop Minis CLI has to be updated', `Installed version: ${installedCliVersion} (latest: ${latestCliVersion})`, [['Use', { command: updateToLatestVersionCommand }, 'to update']]);
44
+ }
45
+ }
46
+ export async function assertNetworkAndAuth() {
47
+ const apiKey = SHOP_MINIS_ADMIN_API_KEY;
48
+ if (!apiKey) {
49
+ throw new AbortError('Shop Minis API key is not set.', undefined, [
50
+ [
51
+ 'To continue, set the environment variable in .env',
52
+ { bold: 'SHOP_MINIS_API_KEY=<your-shop-minis-api-key>' },
53
+ ],
54
+ ]);
55
+ }
56
+ try {
57
+ // Use this query as a simple way to check network and auth at the same time
58
+ await graphqlGetSubmissions();
59
+ }
60
+ catch (error) {
61
+ if (error instanceof ClientError && error.response.status === 401) {
62
+ throw new AbortError('Unable to authenticate your account', 'Your Shop Minis Admin API key is invalid.\n' +
63
+ 'Request a new API key and insert it into .env to continue.', [
64
+ [
65
+ 'If you',
66
+ { bold: 'have' },
67
+ 'early access, request a new Shop Minis Admin API key from the Shop Minis team.',
68
+ ],
69
+ [
70
+ 'If you',
71
+ { bold: "don't have" },
72
+ 'early access, apply for early access:',
73
+ {
74
+ link: {
75
+ url: APPLY_FOR_EARLY_ACCESS_URL,
76
+ label: 'Shop Minis website',
77
+ },
78
+ },
79
+ ],
80
+ ]);
81
+ }
82
+ if (error instanceof Object &&
83
+ 'code' in error &&
84
+ error?.code === 'ENOTFOUND') {
85
+ throw new AbortError(`Network error`, 'Try again and if the issue continues, contact us.', ['Try to run `submit` again', "Contact Shop if you're having issues"]);
86
+ }
87
+ throw error;
88
+ }
89
+ }
90
+ export async function assertNoPendingSubmissions() {
91
+ const pendingSubmission = await graphqlGetPendingSubmission();
92
+ if (pendingSubmission) {
93
+ throw await generateExistingPendingSubmissionError(pendingSubmission);
94
+ }
95
+ }
96
+ export function assertManifestValid() {
97
+ const { valid, errors } = validateManifest();
98
+ if (!valid) {
99
+ throw new AbortError('Manifest invalid. Errors:', errors.map(error => ` • ${error}`).join('\n'), [
100
+ ['Fix the above issues in your', { bold: 'manifest.json' }],
101
+ 'Try again and if the issue continues, contact us.',
102
+ ]);
103
+ }
104
+ }
105
+ export const packageShopMini = async ({ inputDirectory, outputArchivePath, matchFilePattern, ignore, }) => {
106
+ try {
107
+ // Ensure the submissions cache dir exists
108
+ try {
109
+ mkdirSync(SUBMISSION_PATHS.SUBMISSION_CACHE_DIR);
110
+ }
111
+ catch {
112
+ // directory already exists. do nothing
113
+ }
114
+ await zip({
115
+ inputDirectory,
116
+ outputArchivePath,
117
+ matchFilePattern,
118
+ ignore,
119
+ });
120
+ }
121
+ catch (error) {
122
+ throw wrapError(error, 'Unable to package Shop Mini');
123
+ }
124
+ const packageSizeBytes = await fileSize(outputArchivePath);
125
+ if (packageSizeBytes > SUBMISSION_VALIDATION.SUBMISSION_FILE_SIZE_MAX_BYTES) {
126
+ outputDebug(outputContent `Filesize of ${outputToken.path(outputArchivePath)} is ${String(packageSizeBytes)} bytes`);
127
+ throw new AbortError('File size too large', `A Shop Mini can't be larger than ${Math.round(SUBMISSION_VALIDATION.SUBMISSION_FILE_SIZE_MAX_BYTES / 1000 / 1000)}mb.`, [
128
+ 'Reduce file size of assets and files',
129
+ "Contact us if you're having issues reducing file size",
130
+ ]);
131
+ }
132
+ };
133
+ export const createStagedUpload = async ({ outputArchiveFilename, outputArchivePath, }) => {
134
+ const packageSizeBytes = await fileSize(outputArchivePath);
135
+ const packageChecksum = getFileChecksum(outputArchivePath);
136
+ const params = {
137
+ filename: outputArchiveFilename,
138
+ checksum: packageChecksum,
139
+ fileSize: packageSizeBytes,
140
+ mimeType: 'application/gzip',
141
+ };
142
+ const { upload, userErrors } = await graphqlCreateUpload(params);
143
+ handleCreateUploadErrors(params, userErrors);
144
+ return upload;
145
+ };
146
+ export const uploadSubmission = async ({ url, headers, outputArchivePath, }) => {
147
+ const params = {
148
+ filepath: outputArchivePath,
149
+ headers,
150
+ url,
151
+ };
152
+ try {
153
+ await uploadFile(params);
154
+ }
155
+ catch (error) {
156
+ handleUploadFileErrors(error);
157
+ }
158
+ };
159
+ export const createSubmission = async ({ description, stagedUploadId, }) => {
160
+ const { submission, userErrors } = await graphqlCreateSubmission({
161
+ description,
162
+ uploadId: stagedUploadId,
163
+ });
164
+ await handleCreateSubmissionErrors(userErrors);
165
+ return submission;
166
+ };
167
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../src/commands/submit/tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { CreateSubmissionMutation, CreateUploadMutation } from '../types/autogenerated/shop-minis-admin-api/graphql.js';
2
+ export interface SubmitCommandArgs {
3
+ description?: string;
4
+ verbose?: boolean;
5
+ }
6
+ export interface SubmitConfig {
7
+ description: string;
8
+ }
9
+ export interface SubmitTasksData {
10
+ outputArchiveFilename: string | null;
11
+ outputArchivePath: string | null;
12
+ stagedUpload: CreateUploadMutation['submissionUploadCreate']['upload'] | null;
13
+ submission: CreateSubmissionMutation['submissionCreate']['submission'] | null;
14
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/commands/submit/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare const validateDescription: (value: string) => string | undefined;
2
+ export declare function isValid<Fn extends (state: any, ...args: any[]) => any>(validator: Fn, ...args: Parameters<Fn>): boolean;
@@ -0,0 +1,14 @@
1
+ import { SUBMISSION_VALIDATION } from './config.js';
2
+ export const validateDescription = (value) => {
3
+ if (!value || value.length === 0) {
4
+ return "Description can't be empty";
5
+ }
6
+ if (value.length > SUBMISSION_VALIDATION.SUBMISSION_DESCRIPTION_MAX_LENGTH) {
7
+ return `Enter a shorter description (${SUBMISSION_VALIDATION.SUBMISSION_DESCRIPTION_MAX_LENGTH} character max.)`;
8
+ }
9
+ };
10
+ export function isValid(validator, ...args) {
11
+ // eslint-disable-next-line prefer-spread
12
+ return validator.apply(null, args) === undefined;
13
+ }
14
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/commands/submit/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,qBAAqB,EAAC,MAAM,aAAa,CAAA;AAEjD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAa,EAAE,EAAE;IACnD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;QAChC,OAAO,4BAA4B,CAAA;KACpC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,qBAAqB,CAAC,iCAAiC,EAAE;QAC1E,OAAO,gCAAgC,qBAAqB,CAAC,iCAAiC,kBAAkB,CAAA;KACjH;AACH,CAAC,CAAA;AAED,MAAM,UAAU,OAAO,CACrB,SAAa,EACb,GAAG,IAAoB;IAEvB,yCAAyC;IACzC,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,SAAS,CAAA;AAClD,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { ResultOf, TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
2
+ export type FragmentType<TDocumentType extends DocumentNode<any, any>> = TDocumentType extends DocumentNode<infer TType, any> ? TType extends {
3
+ ' $fragmentName'?: infer TKey;
4
+ } ? TKey extends string ? {
5
+ ' $fragmentRefs'?: {
6
+ [key in TKey]: TType;
7
+ };
8
+ } : never : never : never;
9
+ export declare function useFragment<TType>(_documentNode: DocumentNode<TType, any>, fragmentType: FragmentType<DocumentNode<TType, any>>): TType;
10
+ export declare function useFragment<TType>(_documentNode: DocumentNode<TType, any>, fragmentType: FragmentType<DocumentNode<TType, any>> | null | undefined): TType | null | undefined;
11
+ export declare function useFragment<TType>(_documentNode: DocumentNode<TType, any>, fragmentType: ReadonlyArray<FragmentType<DocumentNode<TType, any>>>): ReadonlyArray<TType>;
12
+ export declare function useFragment<TType>(_documentNode: DocumentNode<TType, any>, fragmentType: ReadonlyArray<FragmentType<DocumentNode<TType, any>>> | null | undefined): ReadonlyArray<TType> | null | undefined;
13
+ export declare function makeFragmentData<F extends DocumentNode, FT extends ResultOf<F>>(data: FT, _fragment: F): FragmentType<F>;
@@ -0,0 +1,7 @@
1
+ export function useFragment(_documentNode, fragmentType) {
2
+ return fragmentType;
3
+ }
4
+ export function makeFragmentData(data, _fragment) {
5
+ return data;
6
+ }
7
+ //# sourceMappingURL=fragment-masking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fragment-masking.js","sourceRoot":"","sources":["../../../../../src/commands/types/autogenerated/shop-minis-admin-api/fragment-masking.ts"],"names":[],"mappings":"AAqCA,MAAM,UAAU,WAAW,CACzB,aAAuC,EACvC,YAIa;IAEb,OAAO,YAAmB,CAAA;AAC5B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAG9B,IAAQ,EAAE,SAAY;IACtB,OAAO,IAAuB,CAAA;AAChC,CAAC"}
@@ -0,0 +1,54 @@
1
+ import * as types from './graphql.js';
2
+ import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
3
+ /**
4
+ * Map of all GraphQL operations in the project.
5
+ *
6
+ * This map has several performance disadvantages:
7
+ * 1. It is not tree-shakeable, so it will include all operations in the project.
8
+ * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.
9
+ * 3. It does not support dead code elimination, so it will add unused operations.
10
+ *
11
+ * Therefore it is highly recommended to use the babel or swc plugin for production.
12
+ */
13
+ declare const documents: {
14
+ '\n mutation CreateUpload(\n $filename: String!\n $fileSize: Int!\n $checksum: String!\n $mimeType: String!\n ) {\n submissionUploadCreate(\n input: {\n filename: $filename\n fileSize: $fileSize\n checksum: $checksum\n mimeType: $mimeType\n }\n ) {\n upload {\n url\n headers\n id\n }\n userErrors {\n code\n message\n field\n }\n }\n }\n': DocumentNode<types.CreateUploadMutation, types.Exact<{
15
+ filename: string;
16
+ fileSize: number;
17
+ checksum: string;
18
+ mimeType: string;
19
+ }>>;
20
+ '\n mutation CreateSubmission($description: String!, $uploadId: ID!) {\n submissionCreate(description: $description, uploadId: $uploadId) {\n submission {\n reference\n description\n status\n submittedAt\n }\n userErrors {\n code\n message\n field\n }\n }\n }\n': DocumentNode<types.CreateSubmissionMutation, types.Exact<{
21
+ description: string;
22
+ uploadId: string;
23
+ }>>;
24
+ '\n query Submissions($first: Int) {\n submissions(first: $first) {\n nodes {\n reference\n description\n status\n submittedAt\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n': DocumentNode<types.SubmissionsQuery, types.Exact<{
25
+ first?: types.InputMaybe<number> | undefined;
26
+ }>>;
27
+ };
28
+ /**
29
+ * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
30
+ *
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);
35
+ * ```
36
+ *
37
+ * The query argument is unknown!
38
+ * Please regenerate the types.
39
+ */
40
+ export declare function graphql(source: string): unknown;
41
+ /**
42
+ * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
43
+ */
44
+ export declare function graphql(source: '\n mutation CreateUpload(\n $filename: String!\n $fileSize: Int!\n $checksum: String!\n $mimeType: String!\n ) {\n submissionUploadCreate(\n input: {\n filename: $filename\n fileSize: $fileSize\n checksum: $checksum\n mimeType: $mimeType\n }\n ) {\n upload {\n url\n headers\n id\n }\n userErrors {\n code\n message\n field\n }\n }\n }\n'): (typeof documents)['\n mutation CreateUpload(\n $filename: String!\n $fileSize: Int!\n $checksum: String!\n $mimeType: String!\n ) {\n submissionUploadCreate(\n input: {\n filename: $filename\n fileSize: $fileSize\n checksum: $checksum\n mimeType: $mimeType\n }\n ) {\n upload {\n url\n headers\n id\n }\n userErrors {\n code\n message\n field\n }\n }\n }\n'];
45
+ /**
46
+ * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
47
+ */
48
+ export declare function graphql(source: '\n mutation CreateSubmission($description: String!, $uploadId: ID!) {\n submissionCreate(description: $description, uploadId: $uploadId) {\n submission {\n reference\n description\n status\n submittedAt\n }\n userErrors {\n code\n message\n field\n }\n }\n }\n'): (typeof documents)['\n mutation CreateSubmission($description: String!, $uploadId: ID!) {\n submissionCreate(description: $description, uploadId: $uploadId) {\n submission {\n reference\n description\n status\n submittedAt\n }\n userErrors {\n code\n message\n field\n }\n }\n }\n'];
49
+ /**
50
+ * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
51
+ */
52
+ export declare function graphql(source: '\n query Submissions($first: Int) {\n submissions(first: $first) {\n nodes {\n reference\n description\n status\n submittedAt\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n'): (typeof documents)['\n query Submissions($first: Int) {\n submissions(first: $first) {\n nodes {\n reference\n description\n status\n submittedAt\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n'];
53
+ export type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<infer TType, any> ? TType : never;
54
+ export {};
@@ -0,0 +1,21 @@
1
+ /* eslint-disable */
2
+ import * as types from './graphql.js';
3
+ /**
4
+ * Map of all GraphQL operations in the project.
5
+ *
6
+ * This map has several performance disadvantages:
7
+ * 1. It is not tree-shakeable, so it will include all operations in the project.
8
+ * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.
9
+ * 3. It does not support dead code elimination, so it will add unused operations.
10
+ *
11
+ * Therefore it is highly recommended to use the babel or swc plugin for production.
12
+ */
13
+ const documents = {
14
+ '\n mutation CreateUpload(\n $filename: String!\n $fileSize: Int!\n $checksum: String!\n $mimeType: String!\n ) {\n submissionUploadCreate(\n input: {\n filename: $filename\n fileSize: $fileSize\n checksum: $checksum\n mimeType: $mimeType\n }\n ) {\n upload {\n url\n headers\n id\n }\n userErrors {\n code\n message\n field\n }\n }\n }\n': types.CreateUploadDocument,
15
+ '\n mutation CreateSubmission($description: String!, $uploadId: ID!) {\n submissionCreate(description: $description, uploadId: $uploadId) {\n submission {\n reference\n description\n status\n submittedAt\n }\n userErrors {\n code\n message\n field\n }\n }\n }\n': types.CreateSubmissionDocument,
16
+ '\n query Submissions($first: Int) {\n submissions(first: $first) {\n nodes {\n reference\n description\n status\n submittedAt\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n': types.SubmissionsDocument,
17
+ };
18
+ export function graphql(source) {
19
+ return documents[source] ?? {};
20
+ }
21
+ //# sourceMappingURL=gql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gql.js","sourceRoot":"","sources":["../../../../../src/commands/types/autogenerated/shop-minis-admin-api/gql.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAGrC;;;;;;;;;GASG;AACH,MAAM,SAAS,GAAG;IAChB,+cAA+c,EAC7c,KAAK,CAAC,oBAAoB;IAC5B,mVAAmV,EACjV,KAAK,CAAC,wBAAwB;IAChC,4SAA4S,EAC1S,KAAK,CAAC,mBAAmB;CAC5B,CAAA;AAmCD,MAAM,UAAU,OAAO,CAAC,MAAc;IACpC,OAAQ,SAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;AACzC,CAAC"}