@shopify/cli-kit 4.9.5 → 5.0.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 (127) hide show
  1. package/dist/cli/api/graphql/admin/generated/metafield_definitions_by_owner_type.d.ts +5 -0
  2. package/dist/cli/api/graphql/admin/generated/metafield_definitions_by_owner_type.js +22 -0
  3. package/dist/cli/api/graphql/admin/generated/metafield_definitions_by_owner_type.js.map +1 -1
  4. package/dist/private/node/api/graphql.d.ts +2 -1
  5. package/dist/private/node/api/graphql.js +12 -1
  6. package/dist/private/node/api/graphql.js.map +1 -1
  7. package/dist/private/node/api.d.ts +2 -0
  8. package/dist/private/node/api.js +49 -22
  9. package/dist/private/node/api.js.map +1 -1
  10. package/dist/private/node/command-json-schema.js +1 -0
  11. package/dist/private/node/command-json-schema.js.map +1 -1
  12. package/dist/private/node/constants.d.ts +1 -0
  13. package/dist/private/node/constants.js +1 -0
  14. package/dist/private/node/constants.js.map +1 -1
  15. package/dist/private/node/dev-instance-output.d.ts +47 -0
  16. package/dist/private/node/dev-instance-output.js +143 -0
  17. package/dist/private/node/dev-instance-output.js.map +1 -0
  18. package/dist/private/node/json-error.d.ts +1 -15
  19. package/dist/private/node/json-error.js +4 -98
  20. package/dist/private/node/json-error.js.map +1 -1
  21. package/dist/private/node/output-context.d.ts +8 -0
  22. package/dist/private/node/output-context.js +10 -0
  23. package/dist/private/node/output-context.js.map +1 -0
  24. package/dist/private/node/output.test.js +4 -4
  25. package/dist/private/node/output.test.js.map +1 -1
  26. package/dist/private/node/session/automation-token.d.ts +50 -0
  27. package/dist/private/node/session/automation-token.js +77 -0
  28. package/dist/private/node/session/automation-token.js.map +1 -0
  29. package/dist/private/node/session/exchange.d.ts +5 -1
  30. package/dist/private/node/session/exchange.js +97 -7
  31. package/dist/private/node/session/exchange.js.map +1 -1
  32. package/dist/private/node/session/permanent-store-domain.d.ts +21 -0
  33. package/dist/private/node/session/permanent-store-domain.js +72 -0
  34. package/dist/private/node/session/permanent-store-domain.js.map +1 -0
  35. package/dist/private/node/session.d.ts +3 -2
  36. package/dist/private/node/session.js +12 -3
  37. package/dist/private/node/session.js.map +1 -1
  38. package/dist/private/node/themes/trust-challenge.d.ts +31 -0
  39. package/dist/private/node/themes/trust-challenge.js +143 -0
  40. package/dist/private/node/themes/trust-challenge.js.map +1 -0
  41. package/dist/private/node/ui/alert.js +1 -1
  42. package/dist/private/node/ui/alert.js.map +1 -1
  43. package/dist/private/node/ui/components/ConcurrentOutput.d.ts +2 -7
  44. package/dist/private/node/ui/components/ConcurrentOutput.js +4 -8
  45. package/dist/private/node/ui/components/ConcurrentOutput.js.map +1 -1
  46. package/dist/private/node/ui/components/LoadingBar.js +9 -15
  47. package/dist/private/node/ui/components/LoadingBar.js.map +1 -1
  48. package/dist/private/node/ui/components/LoadingBar.test.js +45 -107
  49. package/dist/private/node/ui/components/LoadingBar.test.js.map +1 -1
  50. package/dist/private/node/ui/components/LoadingIndicator.d.ts +7 -0
  51. package/dist/private/node/ui/components/LoadingIndicator.js +22 -0
  52. package/dist/private/node/ui/components/LoadingIndicator.js.map +1 -0
  53. package/dist/private/node/ui/components/Table/Table.d.ts +8 -0
  54. package/dist/private/node/ui/components/Table/Table.js +18 -2
  55. package/dist/private/node/ui/components/Table/Table.js.map +1 -1
  56. package/dist/public/common/version.d.ts +1 -1
  57. package/dist/public/common/version.js +1 -1
  58. package/dist/public/common/version.js.map +1 -1
  59. package/dist/public/node/api/admin.js +13 -0
  60. package/dist/public/node/api/admin.js.map +1 -1
  61. package/dist/public/node/api/graphql.js +38 -7
  62. package/dist/public/node/api/graphql.js.map +1 -1
  63. package/dist/public/node/archiver.js +13 -6
  64. package/dist/public/node/archiver.js.map +1 -1
  65. package/dist/public/node/base-command.d.ts +6 -0
  66. package/dist/public/node/base-command.js +97 -16
  67. package/dist/public/node/base-command.js.map +1 -1
  68. package/dist/public/node/dev-instance.d.ts +138 -0
  69. package/dist/public/node/dev-instance.js +365 -0
  70. package/dist/public/node/dev-instance.js.map +1 -0
  71. package/dist/public/node/environment.d.ts +6 -3
  72. package/dist/public/node/environment.js +11 -4
  73. package/dist/public/node/environment.js.map +1 -1
  74. package/dist/public/node/error/index.js +2 -1
  75. package/dist/public/node/error/index.js.map +1 -1
  76. package/dist/public/node/error/schema.d.ts +24 -24
  77. package/dist/public/node/error/serialization.d.ts +8 -0
  78. package/dist/public/node/error/serialization.js +103 -0
  79. package/dist/public/node/error/serialization.js.map +1 -0
  80. package/dist/public/node/graphiql/server.js +18 -2
  81. package/dist/public/node/graphiql/server.js.map +1 -1
  82. package/dist/public/node/is-global.js +2 -1
  83. package/dist/public/node/is-global.js.map +1 -1
  84. package/dist/public/node/notifications-system.d.ts +6 -6
  85. package/dist/public/node/path.d.ts +19 -3
  86. package/dist/public/node/path.js +21 -3
  87. package/dist/public/node/path.js.map +1 -1
  88. package/dist/public/node/session.d.ts +38 -3
  89. package/dist/public/node/session.js +56 -9
  90. package/dist/public/node/session.js.map +1 -1
  91. package/dist/public/node/system.d.ts +4 -0
  92. package/dist/public/node/system.js +39 -9
  93. package/dist/public/node/system.js.map +1 -1
  94. package/dist/public/node/themes/api.d.ts +9 -0
  95. package/dist/public/node/themes/api.js +50 -22
  96. package/dist/public/node/themes/api.js.map +1 -1
  97. package/dist/public/node/themes/theme-manager.d.ts +8 -1
  98. package/dist/public/node/themes/theme-manager.js +1 -1
  99. package/dist/public/node/themes/theme-manager.js.map +1 -1
  100. package/dist/public/node/tree-kill.js +12 -2
  101. package/dist/public/node/tree-kill.js.map +1 -1
  102. package/dist/public/node/ui/components.d.ts +1 -0
  103. package/dist/public/node/ui/components.js +1 -0
  104. package/dist/public/node/ui/components.js.map +1 -1
  105. package/dist/public/node/ui.d.ts +24 -4
  106. package/dist/public/node/ui.js +54 -21
  107. package/dist/public/node/ui.js.map +1 -1
  108. package/dist/public/node/upgrade/output.d.ts +17 -0
  109. package/dist/public/node/upgrade/output.js +51 -0
  110. package/dist/public/node/upgrade/output.js.map +1 -0
  111. package/dist/public/node/upgrade/result.d.ts +8 -0
  112. package/dist/public/node/upgrade/result.js +21 -0
  113. package/dist/public/node/upgrade/result.js.map +1 -0
  114. package/dist/public/node/upgrade/types.d.ts +61 -0
  115. package/dist/public/node/upgrade/types.js +46 -0
  116. package/dist/public/node/upgrade/types.js.map +1 -0
  117. package/dist/public/node/upgrade.d.ts +8 -0
  118. package/dist/public/node/upgrade.js +57 -22
  119. package/dist/public/node/upgrade.js.map +1 -1
  120. package/dist/tsconfig.tsbuildinfo +1 -1
  121. package/package.json +3 -3
  122. package/dist/private/node/ui/components/TextAnimation.d.ts +0 -10
  123. package/dist/private/node/ui/components/TextAnimation.js +0 -56
  124. package/dist/private/node/ui/components/TextAnimation.js.map +0 -1
  125. package/dist/private/node/ui/components/TextAnimation.test.d.ts +0 -1
  126. package/dist/private/node/ui/components/TextAnimation.test.js +0 -73
  127. package/dist/private/node/ui/components/TextAnimation.test.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shopify/cli-kit",
3
- "version": "4.9.5",
3
+ "version": "5.0.1",
4
4
  "private": false,
5
5
  "description": "A set of utilities, interfaces, and models that are common across all the platform features",
6
6
  "keywords": [
@@ -119,7 +119,6 @@
119
119
  "find-up": "6.3.0",
120
120
  "form-data": "4.0.6",
121
121
  "fs-extra": "11.1.0",
122
- "gradient-string": "2.0.2",
123
122
  "graphql": "16.14.2",
124
123
  "graphql-request": "6.1.0",
125
124
  "h3": "1.15.11",
@@ -134,6 +133,7 @@
134
133
  "node-fetch": "3.3.2",
135
134
  "open": "8.4.2",
136
135
  "pathe": "1.1.2",
136
+ "proper-lockfile": "4.1.2",
137
137
  "react": "19.2.4",
138
138
  "semver": "7.8.4",
139
139
  "react-dom": "19.2.4",
@@ -148,8 +148,8 @@
148
148
  "@types/archiver": "5.3.2",
149
149
  "@types/diff": "^5.2.3",
150
150
  "@types/fs-extra": "9.0.13",
151
- "@types/gradient-string": "^1.1.2",
152
151
  "@types/lodash": "4.17.24",
152
+ "@types/proper-lockfile": "4.1.4",
153
153
  "@types/react": "^19.0.0",
154
154
  "@types/react-dom": "^19.0.0",
155
155
  "@types/semver": "^7.5.2",
@@ -1,10 +0,0 @@
1
- import React from 'react';
2
- interface TextAnimationProps {
3
- text: string;
4
- maxWidth?: number;
5
- }
6
- /**
7
- * `TextAnimation` applies a rainbow animation to text.
8
- */
9
- declare const TextAnimation: React.MemoExoticComponent<({ text, maxWidth }: TextAnimationProps) => JSX.Element>;
10
- export { TextAnimation };
@@ -1,56 +0,0 @@
1
- /* eslint-disable id-length */
2
- import { Text, useStdout } from 'ink';
3
- import React, { memo, useCallback, useLayoutEffect, useRef, useState } from 'react';
4
- import gradient from 'gradient-string';
5
- function rainbow(text, frame) {
6
- const hue = 5 * frame;
7
- const leftColor = { h: hue % 360, s: 0.8, v: 1 };
8
- const rightColor = { h: (hue + 1) % 360, s: 0.8, v: 1 };
9
- return gradient(leftColor, rightColor)(text, { interpolation: 'hsv', hsvSpin: 'long' });
10
- }
11
- function rotated(text, steps) {
12
- const normalizedSteps = steps % text.length;
13
- const start = text.slice(-normalizedSteps);
14
- const end = text.slice(0, -normalizedSteps);
15
- return start + end;
16
- }
17
- function truncated(text, maxWidth) {
18
- return maxWidth ? text.slice(0, maxWidth) : text;
19
- }
20
- /**
21
- * `TextAnimation` applies a rainbow animation to text.
22
- */
23
- const TextAnimation = memo(({ text, maxWidth }) => {
24
- const frame = useRef(0);
25
- const [renderedFrame, setRenderedFrame] = useState(text);
26
- const timeout = useRef();
27
- const { stdout } = useStdout();
28
- const [width, setWidth] = useState(maxWidth ?? Math.floor(stdout.columns * 0.66));
29
- useLayoutEffect(() => {
30
- const handleResize = () => {
31
- setWidth(Math.floor(stdout.columns * 0.66));
32
- };
33
- stdout.on('resize', handleResize);
34
- return () => {
35
- stdout.off('resize', handleResize);
36
- };
37
- }, [stdout]);
38
- const renderAnimation = useCallback(() => {
39
- const newFrame = frame.current + 1;
40
- frame.current = newFrame;
41
- setRenderedFrame(rainbow(truncated(rotated(text, frame.current), width), frame.current));
42
- timeout.current = setTimeout(() => {
43
- renderAnimation();
44
- }, 35);
45
- }, [text, width]);
46
- useLayoutEffect(() => {
47
- renderAnimation();
48
- return () => {
49
- clearTimeout(timeout.current);
50
- };
51
- }, [renderAnimation]);
52
- return React.createElement(Text, null, renderedFrame);
53
- });
54
- TextAnimation.displayName = 'TextAnimation';
55
- export { TextAnimation };
56
- //# sourceMappingURL=TextAnimation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TextAnimation.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/TextAnimation.tsx"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable id-length */\nimport {Text, useStdout} from 'ink'\nimport React, {memo, useCallback, useLayoutEffect, useRef, useState} from 'react'\nimport gradient from 'gradient-string'\n\ninterface TextAnimationProps {\n text: string\n maxWidth?: number\n}\n\nfunction rainbow(text: string, frame: number) {\n const hue = 5 * frame\n const leftColor = {h: hue % 360, s: 0.8, v: 1}\n const rightColor = {h: (hue + 1) % 360, s: 0.8, v: 1}\n return gradient(leftColor, rightColor)(text, {interpolation: 'hsv', hsvSpin: 'long'})\n}\n\nfunction rotated(text: string, steps: number) {\n const normalizedSteps = steps % text.length\n const start = text.slice(-normalizedSteps)\n const end = text.slice(0, -normalizedSteps)\n return start + end\n}\n\nfunction truncated(text: string, maxWidth: number | undefined): string {\n return maxWidth ? text.slice(0, maxWidth) : text\n}\n\n/**\n * `TextAnimation` applies a rainbow animation to text.\n */\nconst TextAnimation = memo(({text, maxWidth}: TextAnimationProps): JSX.Element => {\n const frame = useRef(0)\n const [renderedFrame, setRenderedFrame] = useState(text)\n const timeout = useRef<NodeJS.Timeout>()\n const {stdout} = useStdout()\n const [width, setWidth] = useState(maxWidth ?? Math.floor(stdout.columns * 0.66))\n\n useLayoutEffect(() => {\n const handleResize = () => {\n setWidth(Math.floor(stdout.columns * 0.66))\n }\n\n stdout.on('resize', handleResize)\n\n return () => {\n stdout.off('resize', handleResize)\n }\n }, [stdout])\n\n const renderAnimation = useCallback(() => {\n const newFrame = frame.current + 1\n frame.current = newFrame\n\n setRenderedFrame(rainbow(truncated(rotated(text, frame.current), width), frame.current))\n\n timeout.current = setTimeout(() => {\n renderAnimation()\n }, 35)\n }, [text, width])\n\n useLayoutEffect(() => {\n renderAnimation()\n\n return () => {\n clearTimeout(timeout.current)\n }\n }, [renderAnimation])\n\n return <Text>{renderedFrame}</Text>\n})\n\nTextAnimation.displayName = 'TextAnimation'\n\nexport {TextAnimation}\n"]}
@@ -1,73 +0,0 @@
1
- import { TextAnimation } from './TextAnimation.js';
2
- import { Stdout } from '../../ui.js';
3
- import { render } from '../../testing/ui.js';
4
- import React from 'react';
5
- import { beforeEach, describe, expect, test, vi } from 'vitest';
6
- import { useStdout } from 'ink';
7
- vi.mock('ink', async () => {
8
- const original = await vi.importActual('ink');
9
- return {
10
- ...original,
11
- useStdout: vi.fn(),
12
- };
13
- });
14
- describe('TextAnimation', () => {
15
- let stdout;
16
- let onSpy;
17
- let offSpy;
18
- beforeEach(() => {
19
- stdout = new Stdout({
20
- columns: 80,
21
- rows: 80,
22
- });
23
- onSpy = vi.spyOn(stdout, 'on');
24
- offSpy = vi.spyOn(stdout, 'off');
25
- vi.mocked(useStdout).mockReturnValue({
26
- stdout: stdout,
27
- write: () => { },
28
- });
29
- });
30
- test('removes resize listener on unmount', async () => {
31
- const renderInstance = render(React.createElement(TextAnimation, { text: "Loading..." }));
32
- expect(onSpy).toHaveBeenCalledWith('resize', expect.any(Function));
33
- expect(onSpy).toHaveBeenCalledTimes(1);
34
- const resizeHandler = onSpy.mock.calls[0][1];
35
- renderInstance.unmount();
36
- expect(offSpy).toHaveBeenCalledWith('resize', resizeHandler);
37
- expect(offSpy).toHaveBeenCalledTimes(1);
38
- });
39
- test('renders animated text', async () => {
40
- const renderInstance = render(React.createElement(TextAnimation, { text: "Loading..." }));
41
- expect(renderInstance.lastFrame()).toBeDefined();
42
- // The text is rendered with ANSI color codes, so we need to check for the content
43
- // without the color codes. The actual output contains the text but with color formatting.
44
- const frame = renderInstance.lastFrame() ?? '';
45
- expect(frame).toBeTruthy();
46
- expect(frame.length).toBeGreaterThan(0);
47
- renderInstance.unmount();
48
- });
49
- test('updates width when stdout resizes', async () => {
50
- const renderInstance = render(React.createElement(TextAnimation, { text: "Loading..." }));
51
- expect(onSpy).toHaveBeenCalledWith('resize', expect.any(Function));
52
- const resizeHandler = onSpy.mock.calls[0][1];
53
- stdout.columns = 120;
54
- resizeHandler();
55
- await new Promise((resolve) => setTimeout(resolve, 10));
56
- renderInstance.unmount();
57
- });
58
- test('respects maxWidth prop when provided', async () => {
59
- const renderInstance = render(React.createElement(TextAnimation, { text: "Loading...", maxWidth: 20 }));
60
- expect(renderInstance.lastFrame()).toBeDefined();
61
- renderInstance.unmount();
62
- });
63
- test('cleans up animation timeout on unmount', async () => {
64
- vi.useFakeTimers();
65
- const clearTimeoutSpy = vi.spyOn(global, 'clearTimeout');
66
- const renderInstance = render(React.createElement(TextAnimation, { text: "Loading..." }));
67
- vi.advanceTimersByTime(50);
68
- renderInstance.unmount();
69
- expect(clearTimeoutSpy).toHaveBeenCalled();
70
- vi.useRealTimers();
71
- });
72
- });
73
- //# sourceMappingURL=TextAnimation.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TextAnimation.test.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/TextAnimation.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import {TextAnimation} from './TextAnimation.js'\nimport {Stdout} from '../../ui.js'\nimport {render} from '../../testing/ui.js'\nimport React from 'react'\nimport {beforeEach, describe, expect, test, vi} from 'vitest'\nimport {useStdout} from 'ink'\n\nvi.mock('ink', async () => {\n const original: any = await vi.importActual('ink')\n return {\n ...original,\n useStdout: vi.fn(),\n }\n})\n\ndescribe('TextAnimation', () => {\n let stdout: Stdout\n let onSpy: any\n let offSpy: any\n\n beforeEach(() => {\n stdout = new Stdout({\n columns: 80,\n rows: 80,\n })\n\n onSpy = vi.spyOn(stdout, 'on')\n offSpy = vi.spyOn(stdout, 'off')\n\n vi.mocked(useStdout).mockReturnValue({\n stdout: stdout as any,\n write: () => {},\n })\n })\n\n test('removes resize listener on unmount', async () => {\n const renderInstance = render(<TextAnimation text=\"Loading...\" />)\n\n expect(onSpy).toHaveBeenCalledWith('resize', expect.any(Function))\n expect(onSpy).toHaveBeenCalledTimes(1)\n\n const resizeHandler = onSpy.mock.calls[0]![1]\n\n renderInstance.unmount()\n\n expect(offSpy).toHaveBeenCalledWith('resize', resizeHandler)\n expect(offSpy).toHaveBeenCalledTimes(1)\n })\n\n test('renders animated text', async () => {\n const renderInstance = render(<TextAnimation text=\"Loading...\" />)\n\n expect(renderInstance.lastFrame()).toBeDefined()\n // The text is rendered with ANSI color codes, so we need to check for the content\n // without the color codes. The actual output contains the text but with color formatting.\n const frame = renderInstance.lastFrame() ?? ''\n expect(frame).toBeTruthy()\n expect(frame.length).toBeGreaterThan(0)\n\n renderInstance.unmount()\n })\n\n test('updates width when stdout resizes', async () => {\n const renderInstance = render(<TextAnimation text=\"Loading...\" />)\n\n expect(onSpy).toHaveBeenCalledWith('resize', expect.any(Function))\n const resizeHandler = onSpy.mock.calls[0]![1] as () => void\n\n stdout.columns = 120\n resizeHandler()\n\n await new Promise((resolve) => setTimeout(resolve, 10))\n\n renderInstance.unmount()\n })\n\n test('respects maxWidth prop when provided', async () => {\n const renderInstance = render(<TextAnimation text=\"Loading...\" maxWidth={20} />)\n\n expect(renderInstance.lastFrame()).toBeDefined()\n\n renderInstance.unmount()\n })\n\n test('cleans up animation timeout on unmount', async () => {\n vi.useFakeTimers()\n const clearTimeoutSpy = vi.spyOn(global, 'clearTimeout')\n\n const renderInstance = render(<TextAnimation text=\"Loading...\" />)\n\n vi.advanceTimersByTime(50)\n\n renderInstance.unmount()\n\n expect(clearTimeoutSpy).toHaveBeenCalled()\n\n vi.useRealTimers()\n })\n})\n"]}