@shopify/cli-kit 3.76.2 → 3.77.1

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 (75) hide show
  1. package/dist/private/node/api.d.ts +27 -4
  2. package/dist/private/node/api.js +64 -8
  3. package/dist/private/node/api.js.map +1 -1
  4. package/dist/private/node/constants.d.ts +2 -0
  5. package/dist/private/node/constants.js +2 -0
  6. package/dist/private/node/constants.js.map +1 -1
  7. package/dist/private/node/session/device-authorization.js +3 -3
  8. package/dist/private/node/session/device-authorization.js.map +1 -1
  9. package/dist/private/node/session/schema.d.ts +40 -40
  10. package/dist/private/node/sleep-with-backoff.d.ts +16 -0
  11. package/dist/private/node/sleep-with-backoff.js +64 -0
  12. package/dist/private/node/sleep-with-backoff.js.map +1 -0
  13. package/dist/public/common/version.d.ts +1 -1
  14. package/dist/public/common/version.js +1 -1
  15. package/dist/public/common/version.js.map +1 -1
  16. package/dist/public/node/api/admin.js +2 -2
  17. package/dist/public/node/api/admin.js.map +1 -1
  18. package/dist/public/node/api/graphql.js +6 -1
  19. package/dist/public/node/api/graphql.js.map +1 -1
  20. package/dist/public/node/context/fqdn.js +1 -1
  21. package/dist/public/node/context/fqdn.js.map +1 -1
  22. package/dist/public/node/environment.d.ts +20 -0
  23. package/dist/public/node/environment.js +29 -0
  24. package/dist/public/node/environment.js.map +1 -1
  25. package/dist/public/node/github.d.ts +1 -0
  26. package/dist/public/node/github.js +31 -2
  27. package/dist/public/node/github.js.map +1 -1
  28. package/dist/public/node/http.d.ts +48 -3
  29. package/dist/public/node/http.js +134 -24
  30. package/dist/public/node/http.js.map +1 -1
  31. package/dist/public/node/monorail.js +1 -1
  32. package/dist/public/node/monorail.js.map +1 -1
  33. package/dist/public/node/notifications-system.d.ts +22 -22
  34. package/dist/public/node/notifications-system.js +6 -2
  35. package/dist/public/node/notifications-system.js.map +1 -1
  36. package/dist/public/node/system.d.ts +6 -0
  37. package/dist/public/node/system.js +8 -0
  38. package/dist/public/node/system.js.map +1 -1
  39. package/dist/public/node/testing/test-with-temp-dir.d.ts +9 -0
  40. package/dist/public/node/testing/test-with-temp-dir.js +14 -0
  41. package/dist/public/node/testing/test-with-temp-dir.js.map +1 -0
  42. package/dist/public/node/themes/types.d.ts +3 -2
  43. package/dist/public/node/themes/types.js.map +1 -1
  44. package/dist/public/node/vendor/dev_server/dev-server-2016.d.ts +9 -0
  45. package/dist/public/node/vendor/dev_server/dev-server-2016.js +38 -0
  46. package/dist/public/node/vendor/dev_server/dev-server-2016.js.map +1 -0
  47. package/dist/public/node/vendor/dev_server/dev-server-2024.d.ts +9 -0
  48. package/dist/public/node/vendor/dev_server/dev-server-2024.js +68 -0
  49. package/dist/public/node/vendor/dev_server/dev-server-2024.js.map +1 -0
  50. package/dist/public/node/vendor/dev_server/dev-server-spin.d.ts +5 -0
  51. package/dist/public/node/vendor/dev_server/dev-server-spin.js +28 -0
  52. package/dist/public/node/vendor/dev_server/dev-server-spin.js.map +1 -0
  53. package/dist/public/node/vendor/dev_server/dev-server.d.ts +15 -0
  54. package/dist/public/node/vendor/dev_server/dev-server.js +59 -0
  55. package/dist/public/node/vendor/dev_server/dev-server.js.map +1 -0
  56. package/dist/public/node/vendor/dev_server/env.d.ts +2 -0
  57. package/dist/public/node/vendor/dev_server/env.js +7 -0
  58. package/dist/public/node/vendor/dev_server/env.js.map +1 -0
  59. package/dist/public/node/vendor/dev_server/index.d.ts +2 -0
  60. package/dist/public/node/vendor/dev_server/index.js +3 -0
  61. package/dist/public/node/vendor/dev_server/index.js.map +1 -0
  62. package/dist/public/node/vendor/dev_server/network/host.d.ts +2 -0
  63. package/dist/public/node/vendor/dev_server/network/host.js +45 -0
  64. package/dist/public/node/vendor/dev_server/network/host.js.map +1 -0
  65. package/dist/public/node/vendor/dev_server/network/index.d.ts +9 -0
  66. package/dist/public/node/vendor/dev_server/network/index.js +36 -0
  67. package/dist/public/node/vendor/dev_server/network/index.js.map +1 -0
  68. package/dist/public/node/vendor/dev_server/types.d.ts +11 -0
  69. package/dist/public/node/vendor/dev_server/types.js +2 -0
  70. package/dist/public/node/vendor/dev_server/types.js.map +1 -0
  71. package/dist/tsconfig.tsbuildinfo +1 -1
  72. package/package.json +3 -1
  73. package/dist/public/node/vendor/dev_server/DevServer.d.ts +0 -19
  74. package/dist/public/node/vendor/dev_server/DevServer.js +0 -170
  75. package/dist/public/node/vendor/dev_server/DevServer.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shopify/cli-kit",
3
- "version": "3.76.2",
3
+ "version": "3.77.1",
4
4
  "packageManager": "pnpm@8.15.7",
5
5
  "private": false,
6
6
  "description": "A set of utilities, interfaces, and models that are common across all the platform features",
@@ -124,6 +124,7 @@
124
124
  "graphql-request": "6.1.0",
125
125
  "ignore": "6.0.2",
126
126
  "ink": "4.4.1",
127
+ "is-executable": "2.0.1",
127
128
  "is-interactive": "2.0.0",
128
129
  "jose": "5.9.6",
129
130
  "latest-version": "7.0.0",
@@ -159,6 +160,7 @@
159
160
  "@types/semver": "^7.5.2",
160
161
  "@types/which": "3.0.4",
161
162
  "@vitest/coverage-istanbul": "^1.6.0",
163
+ "msw": "^2.7.1",
162
164
  "node-stream-zip": "^1.15.0",
163
165
  "ts-morph": "^17.0.1",
164
166
  "typedoc": "^0.27.6"
@@ -1,19 +0,0 @@
1
- export declare class DevServer {
2
- protected name: string;
3
- constructor(name: string);
4
- url({ nonstandardHostPrefix, }?: {
5
- nonstandardHostPrefix?: string;
6
- }): string;
7
- host({ nonstandardHostPrefix, }?: {
8
- nonstandardHostPrefix?: string;
9
- }): string;
10
- protected assertRunningLocally2024(): void;
11
- protected assertRunningLocally2016(): void;
12
- }
13
- export declare class DevServerCore {
14
- private readonly name;
15
- url(prefix: string): string;
16
- host(prefix: string): string;
17
- private assertRunningLocally2024;
18
- private assertRunningLocally2016;
19
- }
@@ -1,170 +0,0 @@
1
- import fs from 'fs';
2
- import * as os from 'os';
3
- import * as ni from 'network-interfaces';
4
- import { execSync } from 'child_process';
5
- class DevServerUtils {
6
- static assertConnectable(name, addr, port) {
7
- try {
8
- execSync(`nc -z -v -w 1 ${addr} ${port}`, {
9
- timeout: DevServerUtils.CONNECT_TIMEOUT,
10
- stdio: 'ignore',
11
- });
12
- }
13
- catch (err) {
14
- throw new Error(`NET FAILED DevServer for '${name}' is not running on ${port} / ${addr}: \`dev up ${name}\` to start it.`);
15
- }
16
- }
17
- static inferenceModeAndProjectIsEdition2016(name) {
18
- try {
19
- fs.accessSync(DevServerUtils.INFERENCE_MODE_SENTINEL);
20
- try {
21
- fs.accessSync(`/opt/nginx/etc/manifest/${name}/current/edition-2024`);
22
- return false;
23
- }
24
- catch {
25
- return true;
26
- }
27
- }
28
- catch {
29
- return false;
30
- }
31
- }
32
- static getIpFromHosts(hostname) {
33
- try {
34
- const hostsContent = fs.readFileSync(DevServerUtils.HOSTS_FILE, 'utf8');
35
- const lines = hostsContent.split(/\r?\n/);
36
- for (const line of lines) {
37
- const matches = /^\s*?([^#]+?)\s+([^#]+?)$/.exec(line);
38
- if (matches && matches.length === 3 && matches[2] === hostname) {
39
- return matches[1]; // Return the IP address
40
- }
41
- }
42
- }
43
- catch (error) {
44
- console.error('Error reading hosts file:', error);
45
- }
46
- throw new Error(`No IP found for hostname: ${hostname}`);
47
- }
48
- static getAddrPort2024(name) {
49
- try {
50
- const backendIp = DevServerUtils.resolveBackendHost(name);
51
- const interfaceName = ni.fromIp(backendIp, {
52
- internal: true,
53
- ipVersion: 4,
54
- });
55
- return [backendIp, DevServerUtils.BACKEND_PORT];
56
- }
57
- catch (error) {
58
- throw new Error(`DevServer for '${name}' is not running: \`dev up ${name}\` to start it.`);
59
- }
60
- }
61
- static getAddrPort2016(name) {
62
- try {
63
- const portContent = fs.readFileSync(`${os.homedir()}/.local/run/services/${name}/server/port`, 'utf-8');
64
- return ['localhost', parseInt(portContent, 10)];
65
- }
66
- catch (error) {
67
- throw new Error(`DevServer for '${name}' is not running: \`dev up ${name}\` to start it.`);
68
- }
69
- }
70
- static resolveBackendHost(name) {
71
- let host;
72
- try {
73
- host = fs.readlinkSync(`/opt/nginx/etc/manifest/${name}/current`);
74
- }
75
- catch (error) {
76
- host = `${name}.root.shopify.dev.internal`;
77
- }
78
- try {
79
- return DevServerUtils.getIpFromHosts(host);
80
- }
81
- catch {
82
- return host;
83
- }
84
- }
85
- }
86
- DevServerUtils.INFERENCE_MODE_SENTINEL = '/opt/dev/misc/dev-server-inference-mode';
87
- DevServerUtils.BACKEND_PORT = 8080;
88
- DevServerUtils.CONNECT_TIMEOUT = 100; // 100ms
89
- DevServerUtils.HOSTS_FILE = '/etc/hosts';
90
- export class DevServer {
91
- constructor(name) {
92
- if (!process.env.SPIN && !process.env.USING_DEV) {
93
- throw new Error('DevServer is not supported in this environment');
94
- }
95
- if (name === 'shopify') {
96
- throw new Error('Use DevServer.core for the \'shopify\' project');
97
- }
98
- this.name = name;
99
- }
100
- url({ nonstandardHostPrefix, } = {}) {
101
- return `https://${this.host({ nonstandardHostPrefix })}`;
102
- }
103
- host({ nonstandardHostPrefix, } = {}) {
104
- const prefix = nonstandardHostPrefix || this.name;
105
- if (process.env.SPIN === '1') {
106
- const services = fs.readdirSync('/run/ports2')
107
- .filter(file => file.endsWith(`--${this.name}`));
108
- if (services.length === 0) {
109
- throw new Error(`DevServer for '${this.name}' not present in this spin environment`);
110
- }
111
- const match = new RegExp(`^(.+)${this.name}$`).exec(services[0]);
112
- const organization = match ? match[1] : '';
113
- const spinPrefix = organization !== 'shopify--' ? `${organization}` : '';
114
- return `${spinPrefix}${this.name}.${process.env.SPIN_FQDN}`;
115
- }
116
- else if (DevServerUtils.inferenceModeAndProjectIsEdition2016(this.name)) {
117
- this.assertRunningLocally2016();
118
- return `${prefix}.myshopify.io`;
119
- }
120
- else {
121
- this.assertRunningLocally2024();
122
- return `${prefix}.shop.dev`;
123
- }
124
- }
125
- assertRunningLocally2024() {
126
- const [addr, port] = DevServerUtils.getAddrPort2024(this.name);
127
- DevServerUtils.assertConnectable(this.name, addr, port);
128
- }
129
- assertRunningLocally2016() {
130
- const [addr, port] = DevServerUtils.getAddrPort2016(this.name);
131
- DevServerUtils.assertConnectable(this.name, addr, port);
132
- }
133
- }
134
- export class DevServerCore {
135
- constructor() {
136
- this.name = 'shopify';
137
- }
138
- url(prefix) {
139
- return `https://${this.host(prefix)}`;
140
- }
141
- host(prefix) {
142
- if (process.env.SPIN === '1') {
143
- const projectPortRoot = fs
144
- .readdirSync('/run/ports2')
145
- .find((file) => file.endsWith(`--${this.name}`));
146
- if (!projectPortRoot) {
147
- throw new Error(`DevServer for '${this.name}' not present in this spin environment`);
148
- }
149
- // Spin mostly doesn't do alternative hostname prefixing.
150
- return `${prefix}.${this.name}.${process.env.SPIN_FQDN}`;
151
- }
152
- else if (DevServerUtils.inferenceModeAndProjectIsEdition2016('shopify')) {
153
- this.assertRunningLocally2016();
154
- return `${prefix}.myshopify.io`;
155
- }
156
- else {
157
- this.assertRunningLocally2024();
158
- return `${prefix}.my.shop.dev`;
159
- }
160
- }
161
- assertRunningLocally2024() {
162
- const [addr, port] = DevServerUtils.getAddrPort2024('shopify');
163
- DevServerUtils.assertConnectable('shopify', addr, port);
164
- }
165
- assertRunningLocally2016() {
166
- const [addr, port] = DevServerUtils.getAddrPort2016('shopify');
167
- DevServerUtils.assertConnectable('shopify', addr, port);
168
- }
169
- }
170
- //# sourceMappingURL=DevServer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DevServer.js","sourceRoot":"","sources":["../../../../../src/public/node/vendor/dev_server/DevServer.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport * as os from 'os';\nimport * as ni from 'network-interfaces';\nimport { execSync } from 'child_process';\n\nclass DevServerUtils {\n static readonly INFERENCE_MODE_SENTINEL =\n '/opt/dev/misc/dev-server-inference-mode';\n static readonly BACKEND_PORT = 8080;\n static readonly CONNECT_TIMEOUT = 100; // 100ms\n static readonly HOSTS_FILE = '/etc/hosts';\n\n static assertConnectable(name: string, addr: string, port: number): void {\n try {\n execSync(`nc -z -v -w 1 ${addr} ${port}`, {\n timeout: DevServerUtils.CONNECT_TIMEOUT,\n stdio: 'ignore',\n });\n } catch (err) {\n throw new Error(\n `NET FAILED DevServer for '${name}' is not running on ${port} / ${addr}: \\`dev up ${name}\\` to start it.`\n );\n }\n }\n\n static inferenceModeAndProjectIsEdition2016(name: string): boolean {\n try {\n fs.accessSync(DevServerUtils.INFERENCE_MODE_SENTINEL);\n try {\n fs.accessSync(`/opt/nginx/etc/manifest/${name}/current/edition-2024`);\n return false;\n } catch {\n return true;\n }\n } catch {\n return false;\n }\n }\n\n static getIpFromHosts(hostname: string): string {\n try {\n const hostsContent = fs.readFileSync(DevServerUtils.HOSTS_FILE, 'utf8');\n const lines = hostsContent.split(/\\r?\\n/);\n for (const line of lines) {\n const matches = /^\\s*?([^#]+?)\\s+([^#]+?)$/.exec(line);\n if (matches && matches.length === 3 && matches[2] === hostname) {\n return matches[1]!; // Return the IP address\n }\n }\n } catch (error) {\n console.error('Error reading hosts file:', error);\n }\n\n throw new Error(`No IP found for hostname: ${hostname}`);\n }\n\n static getAddrPort2024(name: string): [string, number] {\n try {\n const backendIp = DevServerUtils.resolveBackendHost(name);\n const interfaceName = ni.fromIp(backendIp, {\n internal: true,\n ipVersion: 4,\n });\n return [backendIp, DevServerUtils.BACKEND_PORT];\n } catch (error) {\n throw new Error(\n `DevServer for '${name}' is not running: \\`dev up ${name}\\` to start it.`\n );\n }\n }\n\n static getAddrPort2016(name: string): [string, number] {\n try {\n const portContent = fs.readFileSync(\n `${os.homedir()}/.local/run/services/${name}/server/port`,\n 'utf-8'\n );\n return ['localhost', parseInt(portContent, 10)];\n } catch (error) {\n throw new Error(\n `DevServer for '${name}' is not running: \\`dev up ${name}\\` to start it.`\n );\n }\n }\n\n static resolveBackendHost(name: string): string {\n let host: string;\n try {\n host = fs.readlinkSync(`/opt/nginx/etc/manifest/${name}/current`);\n } catch (error) {\n host = `${name}.root.shopify.dev.internal`;\n }\n\n try {\n return DevServerUtils.getIpFromHosts(host);\n } catch {\n return host;\n }\n }\n}\n\nexport class DevServer {\n protected name: string;\n\n constructor(name: string) {\n if (!process.env.SPIN && !process.env.USING_DEV) {\n throw new Error('DevServer is not supported in this environment');\n }\n\n if (name === 'shopify') {\n throw new Error('Use DevServer.core for the \\'shopify\\' project');\n }\n this.name = name;\n }\n\n url({\n nonstandardHostPrefix,\n }: { nonstandardHostPrefix?: string } = {}): string {\n return `https://${this.host({nonstandardHostPrefix})}`;\n }\n\n host({\n nonstandardHostPrefix,\n }: { nonstandardHostPrefix?: string } = {}): string {\n const prefix = nonstandardHostPrefix || this.name;\n\n if (process.env.SPIN === '1') {\n const services = fs.readdirSync('/run/ports2')\n .filter(file => file.endsWith(`--${this.name}`));\n\n if (services.length === 0) {\n throw new Error(\n `DevServer for '${this.name}' not present in this spin environment`\n );\n }\n\n const match = new RegExp(`^(.+)${this.name}$`).exec(services[0]!);\n const organization = match ? match[1] : '';\n const spinPrefix = organization !== 'shopify--' ? `${organization}` : '';\n\n return `${spinPrefix}${this.name}.${process.env.SPIN_FQDN}`;\n } else if (DevServerUtils.inferenceModeAndProjectIsEdition2016(this.name)) {\n this.assertRunningLocally2016();\n return `${prefix}.myshopify.io`;\n } else {\n this.assertRunningLocally2024();\n return `${prefix}.shop.dev`;\n }\n }\n\n protected assertRunningLocally2024(): void {\n const [addr, port] = DevServerUtils.getAddrPort2024(this.name);\n DevServerUtils.assertConnectable(this.name, addr, port);\n }\n\n protected assertRunningLocally2016(): void {\n const [addr, port] = DevServerUtils.getAddrPort2016(this.name);\n DevServerUtils.assertConnectable(this.name, addr, port);\n }\n}\n\nexport class DevServerCore {\n private readonly name = 'shopify';\n\n url(prefix: string): string {\n return `https://${this.host(prefix)}`;\n }\n\n host(prefix: string): string {\n if (process.env.SPIN === '1') {\n const projectPortRoot = fs\n .readdirSync('/run/ports2')\n .find((file) => file.endsWith(`--${this.name}`));\n if (!projectPortRoot) {\n throw new Error(\n `DevServer for '${this.name}' not present in this spin environment`\n );\n }\n // Spin mostly doesn't do alternative hostname prefixing.\n return `${prefix}.${this.name}.${process.env.SPIN_FQDN}`;\n } else if (DevServerUtils.inferenceModeAndProjectIsEdition2016('shopify')) {\n this.assertRunningLocally2016();\n return `${prefix}.myshopify.io`;\n } else {\n this.assertRunningLocally2024();\n return `${prefix}.my.shop.dev`;\n }\n }\n\n private assertRunningLocally2024(): void {\n const [addr, port] = DevServerUtils.getAddrPort2024('shopify');\n DevServerUtils.assertConnectable('shopify', addr, port);\n }\n\n private assertRunningLocally2016(): void {\n const [addr, port] = DevServerUtils.getAddrPort2016('shopify');\n DevServerUtils.assertConnectable('shopify', addr, port);\n }\n}"]}