From 3f4f52065f849aca71fcaccc012c1d74c290b953 Mon Sep 17 00:00:00 2001 From: Matteo Depalo Date: Mon, 5 Jan 2026 11:55:55 +0000 Subject: [PATCH 01/10] Update ink to 5.2.1 --- package.json | 1 - packages/app/package.json | 6 +- packages/cli-kit/package.json | 4 +- .../DangerousConfirmationPrompt.tsx | 2 +- .../ui/components/Prompts/PromptLayout.tsx | 2 +- .../private/node/ui/components/TextPrompt.tsx | 2 +- pnpm-lock.yaml | 194 +++++++++--------- 7 files changed, 107 insertions(+), 104 deletions(-) diff --git a/package.json b/package.json index d54d27e4b77..efc31f324cd 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,6 @@ }, "version": "0.0.0", "resolutions": { - "@types/react": "17.0.2", "vite": "6.4.1", "whatwg-url": "14.0.0", "supports-hyperlinks": "3.1.0", diff --git a/packages/app/package.json b/packages/app/package.json index 16b1b7a745a..7f29b0914e1 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -70,7 +70,7 @@ "ignore": "6.0.2", "proper-lockfile": "4.1.2", "react": "^18.2.0", - "react-dom": "18.3.1", + "react-dom": "^18.2.0", "which": "4.0.0", "ws": "8.18.0" }, @@ -79,8 +79,8 @@ "@types/diff": "^5.0.3", "@types/express": "^4.17.17", "@types/proper-lockfile": "4.1.4", - "@types/react": "18.2.0", - "@types/react-dom": "18.2.0", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", "@types/which": "3.0.4", "@types/ws": "^8.5.13", "@vitest/coverage-istanbul": "^3.1.4" diff --git a/packages/cli-kit/package.json b/packages/cli-kit/package.json index 20c4e65071b..bc89c37cbf9 100644 --- a/packages/cli-kit/package.json +++ b/packages/cli-kit/package.json @@ -136,7 +136,7 @@ "graphql": "16.10.0", "graphql-request": "6.1.0", "ignore": "6.0.2", - "ink": "4.4.1", + "ink": "5.2.1", "is-executable": "2.0.1", "is-interactive": "2.0.0", "is-wsl": "3.1.0", @@ -171,7 +171,7 @@ "@types/fs-extra": "9.0.13", "@types/gradient-string": "^1.1.2", "@types/lodash": "4.17.19", - "@types/react": "18.2.0", + "@types/react": "^18.2.0", "@types/semver": "^7.5.2", "@types/which": "3.0.4", "@vitest/coverage-istanbul": "^3.1.4", diff --git a/packages/cli-kit/src/private/node/ui/components/DangerousConfirmationPrompt.tsx b/packages/cli-kit/src/private/node/ui/components/DangerousConfirmationPrompt.tsx index e4980f2593d..e09a1853e9a 100644 --- a/packages/cli-kit/src/private/node/ui/components/DangerousConfirmationPrompt.tsx +++ b/packages/cli-kit/src/private/node/ui/components/DangerousConfirmationPrompt.tsx @@ -146,7 +146,7 @@ interface CompletedPromptProps { const CompletedPrompt: FunctionComponent = ({cancelled}) => ( - + {cancelled ? {figures.cross} : {figures.tick}} diff --git a/packages/cli-kit/src/private/node/ui/components/Prompts/PromptLayout.tsx b/packages/cli-kit/src/private/node/ui/components/Prompts/PromptLayout.tsx index 0ecef1add8f..b9400516afe 100644 --- a/packages/cli-kit/src/private/node/ui/components/Prompts/PromptLayout.tsx +++ b/packages/cli-kit/src/private/node/ui/components/Prompts/PromptLayout.tsx @@ -120,7 +120,7 @@ const PromptLayout = ({ {state === PromptState.Submitted && submittedAnswerLabel ? ( - + {figures.tick} diff --git a/packages/cli-kit/src/private/node/ui/components/TextPrompt.tsx b/packages/cli-kit/src/private/node/ui/components/TextPrompt.tsx index 393e5eab0ef..a3cb482e38b 100644 --- a/packages/cli-kit/src/private/node/ui/components/TextPrompt.tsx +++ b/packages/cli-kit/src/private/node/ui/components/TextPrompt.tsx @@ -97,7 +97,7 @@ const TextPrompt: FunctionComponent = ({ {promptState === PromptState.Submitted ? ( - + {figures.tick} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 12030ad3620..f80916792ce 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,6 @@ settings: excludeLinksFromLockfile: false overrides: - '@types/react': 17.0.2 vite: 6.4.1 whatwg-url: 14.0.0 supports-hyperlinks: 3.1.0 @@ -223,7 +222,7 @@ importers: specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: 18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) which: specifier: 4.0.0 @@ -245,10 +244,10 @@ importers: specifier: 4.1.4 version: 4.1.4 '@types/react': - specifier: 17.0.2 - version: 17.0.2 + specifier: ^18.2.0 + version: 18.3.27 '@types/react-dom': - specifier: 18.2.0 + specifier: ^18.2.0 version: 18.2.0 '@types/which': specifier: 3.0.4 @@ -429,8 +428,8 @@ importers: specifier: 6.0.2 version: 6.0.2 ink: - specifier: 4.4.1 - version: 4.4.1(@types/react@17.0.2)(react@18.3.1) + specifier: 5.2.1 + version: 5.2.1(@types/react@18.3.27)(react@18.3.1) is-executable: specifier: 2.0.1 version: 2.0.1 @@ -529,8 +528,8 @@ importers: specifier: 4.17.19 version: 4.17.19 '@types/react': - specifier: 17.0.2 - version: 17.0.2 + specifier: ^18.2.0 + version: 18.3.27 '@types/semver': specifier: ^7.5.2 version: 7.7.0 @@ -763,11 +762,11 @@ importers: specifier: ^1.0.2 version: 1.0.5 '@types/react': - specifier: 17.0.2 - version: 17.0.2 + specifier: 16.14.0 + version: 16.14.0 '@types/react-dom': specifier: ^16.9.11 - version: 16.9.25(@types/react@17.0.2) + version: 16.9.25(@types/react@16.14.0) '@vitejs/plugin-react-refresh': specifier: ^1.3.6 version: 1.3.6 @@ -814,11 +813,11 @@ importers: specifier: ^3.0.0 version: 3.3.10(react-dom@17.0.2(react@17.0.2))(react@17.0.2) '@types/react': - specifier: 17.0.2 - version: 17.0.2 + specifier: 16.14.0 + version: 16.14.0 '@types/react-dom': specifier: ^16.9.11 - version: 16.9.25(@types/react@17.0.2) + version: 16.9.25(@types/react@16.14.0) react: specifier: ^17.0.2 version: 17.0.2 @@ -3945,7 +3944,7 @@ packages: '@types/react-dom@16.9.25': resolution: {integrity: sha512-ZK//eAPhwft9Ul2/Zj+6O11YR6L4JX0J2sVeBC9Ft7x7HFN7xk7yUV/zDxqV6rjvqgl6r8Dq7oQImxtyf/Mzcw==} peerDependencies: - '@types/react': 17.0.2 + '@types/react': ^16.0.0 '@types/react-dom@18.2.0': resolution: {integrity: sha512-8yQrvS6sMpSwIovhPOwfyNf2Wz6v/B62LFSVYQ85+Rq3tLsBIG7rP5geMxaijTUxSkrO6RzN/IRuIAADYQsleA==} @@ -3953,11 +3952,17 @@ packages: '@types/react-transition-group@4.4.12': resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} peerDependencies: - '@types/react': 17.0.2 + '@types/react': '*' + + '@types/react@16.14.0': + resolution: {integrity: sha512-jJjHo1uOe+NENRIBvF46tJimUvPnmbQ41Ax0pEm7pRvhPg+wuj8VMOHHiMvaGmZRzRrCtm7KnL5OOE/6kHPK8w==} '@types/react@17.0.2': resolution: {integrity: sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA==} + '@types/react@18.3.27': + resolution: {integrity: sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==} + '@types/readdir-glob@1.1.5': resolution: {integrity: sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==} @@ -4358,6 +4363,10 @@ packages: resolution: {integrity: sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==} engines: {node: '>=18'} + ansi-escapes@7.2.0: + resolution: {integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==} + engines: {node: '>=18'} + ansi-regex@4.1.1: resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} engines: {node: '>=6'} @@ -4829,10 +4838,6 @@ packages: resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} engines: {node: '>=8'} - cli-truncate@3.1.0: - resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - cli-truncate@4.0.0: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} engines: {node: '>=18'} @@ -5096,6 +5101,9 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -5446,6 +5454,9 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + es-toolkit@1.43.0: + resolution: {integrity: sha512-SKCT8AsWvYzBBuUqMk4NPwFlSdqLpJwmy6AP322ERn8W2YLIB6JBXnwMI2Qsh2gfphT3q7EKAxKb23cvFHFwKA==} + es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} @@ -6348,11 +6359,11 @@ packages: resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} engines: {node: '>=10'} - ink@4.4.1: - resolution: {integrity: sha512-rXckvqPBB0Krifk5rn/5LvQGmyXwCUpBfmTwbkQNBY9JY8RSl3b8OftBNEYxg4+SWUhEKcPifgope28uL9inlA==} - engines: {node: '>=14.16'} + ink@5.0.1: + resolution: {integrity: sha512-ae4AW/t8jlkj/6Ou21H2av0wxTk8vrGzXv+v2v7j4in+bl1M5XRMVbfNghzhBokV++FjF8RBDJvYo+ttR9YVRg==} + engines: {node: '>=18'} peerDependencies: - '@types/react': 17.0.2 + '@types/react': '>=18.0.0' react: '>=18.0.0' react-devtools-core: ^4.19.1 peerDependenciesMeta: @@ -6361,11 +6372,11 @@ packages: react-devtools-core: optional: true - ink@5.0.1: - resolution: {integrity: sha512-ae4AW/t8jlkj/6Ou21H2av0wxTk8vrGzXv+v2v7j4in+bl1M5XRMVbfNghzhBokV++FjF8RBDJvYo+ttR9YVRg==} + ink@5.2.1: + resolution: {integrity: sha512-BqcUyWrG9zq5HIwW6JcfFHsIYebJkWWb4fczNah1goUO0vv5vneIlfwuS85twyJ5hYR/y18FlAYUxrO9ChIWVg==} engines: {node: '>=18'} peerDependencies: - '@types/react': 17.0.2 + '@types/react': '>=18.0.0' react: '>=18.0.0' react-devtools-core: ^4.19.1 peerDependenciesMeta: @@ -6430,10 +6441,6 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-ci@3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} - hasBin: true - is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} @@ -6500,6 +6507,11 @@ packages: engines: {node: '>=18'} hasBin: true + is-in-ci@1.0.0: + resolution: {integrity: sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==} + engines: {node: '>=18'} + hasBin: true + is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -8349,10 +8361,6 @@ packages: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} - slice-ansi@6.0.0: - resolution: {integrity: sha512-6bn4hRfkTvDfUoEQYkERg0BVF1D0vrX9HEkMl08uDiNWvVvjylLHvZFZWkDo6wjT8tUctbYl1nCOuE66ZTaUtA==} - engines: {node: '>=14.16'} - slice-ansi@7.1.2: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} @@ -8807,10 +8815,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@0.12.0: - resolution: {integrity: sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==} - engines: {node: '>=10'} - type-fest@0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} @@ -9226,10 +9230,6 @@ packages: resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} engines: {node: '>=8'} - widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} - widest-line@5.0.0: resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} engines: {node: '>=18'} @@ -9355,6 +9355,9 @@ packages: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} + yoga-layout@3.2.1: + resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==} + yoga-wasm-web@0.3.3: resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} @@ -12643,10 +12646,10 @@ snapshots: '@oclif/table@0.4.14': dependencies: - '@types/react': 17.0.2 + '@types/react': 18.3.27 change-case: 5.4.4 cli-truncate: 4.0.0 - ink: 5.0.1(@types/react@17.0.2)(react@18.3.1) + ink: 5.0.1(@types/react@18.3.27)(react@18.3.1) natural-orderby: 3.0.2 object-hash: 3.0.0 react: 18.3.1 @@ -13211,7 +13214,7 @@ snapshots: '@shopify/generate-docs@0.15.6': dependencies: - '@types/react': 17.0.2 + '@types/react': 18.3.27 globby: 11.1.0 typescript: 5.8.3 @@ -13250,9 +13253,9 @@ snapshots: dependencies: '@shopify/polaris-icons': 8.11.1(react@18.3.1) '@shopify/polaris-tokens': 8.10.0 - '@types/react': 17.0.2 - '@types/react-dom': 16.9.25(@types/react@17.0.2) - '@types/react-transition-group': 4.4.12(@types/react@17.0.2) + '@types/react': 18.3.27 + '@types/react-dom': 18.2.0 + '@types/react-transition-group': 4.4.12(@types/react@18.3.27) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-fast-compare: 3.2.2 @@ -13833,7 +13836,7 @@ snapshots: '@types/hoist-non-react-statics@3.3.6': dependencies: - '@types/react': 17.0.2 + '@types/react': 18.3.27 hoist-non-react-statics: 3.3.2 '@types/http-cache-semantics@4.0.4': {} @@ -13896,29 +13899,39 @@ snapshots: '@types/qrcode.react@1.0.5': dependencies: - '@types/react': 17.0.2 + '@types/react': 18.3.27 '@types/qs@6.14.0': {} '@types/range-parser@1.2.7': {} - '@types/react-dom@16.9.25(@types/react@17.0.2)': + '@types/react-dom@16.9.25(@types/react@16.14.0)': dependencies: - '@types/react': 17.0.2 + '@types/react': 16.14.0 '@types/react-dom@18.2.0': dependencies: - '@types/react': 17.0.2 + '@types/react': 18.3.27 - '@types/react-transition-group@4.4.12(@types/react@17.0.2)': + '@types/react-transition-group@4.4.12(@types/react@18.3.27)': dependencies: - '@types/react': 17.0.2 + '@types/react': 18.3.27 + + '@types/react@16.14.0': + dependencies: + '@types/prop-types': 15.7.14 + csstype: 3.1.3 '@types/react@17.0.2': dependencies: '@types/prop-types': 15.7.14 csstype: 3.1.3 + '@types/react@18.3.27': + dependencies: + '@types/prop-types': 15.7.14 + csstype: 3.2.3 + '@types/readdir-glob@1.1.5': dependencies: '@types/node': 18.19.70 @@ -14472,6 +14485,10 @@ snapshots: dependencies: environment: 1.1.0 + ansi-escapes@7.2.0: + dependencies: + environment: 1.1.0 + ansi-regex@4.1.1: {} ansi-regex@5.0.1: {} @@ -15062,11 +15079,6 @@ snapshots: string-width: 4.2.3 optional: true - cli-truncate@3.1.0: - dependencies: - slice-ansi: 5.0.0 - string-width: 5.1.2 - cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 @@ -15329,6 +15341,8 @@ snapshots: csstype@3.1.3: {} + csstype@3.2.3: {} + damerau-levenshtein@1.0.8: {} data-uri-to-buffer@2.0.2: {} @@ -15691,6 +15705,8 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + es-toolkit@1.43.0: {} + es6-error@4.1.1: {} esbuild-plugin-copy@2.1.1(esbuild@0.25.12): @@ -16851,44 +16867,43 @@ snapshots: ini@2.0.0: {} - ink@4.4.1(@types/react@17.0.2)(react@18.3.1): + ink@5.0.1(@types/react@18.3.27)(react@18.3.1): dependencies: '@alcalzone/ansi-tokenize': 0.1.3 - ansi-escapes: 6.2.1 + ansi-escapes: 7.1.1 + ansi-styles: 6.2.3 auto-bind: 5.0.1 chalk: 5.4.1 cli-boxes: 3.0.0 cli-cursor: 4.0.0 - cli-truncate: 3.1.0 + cli-truncate: 4.0.0 code-excerpt: 4.0.0 indent-string: 5.0.0 - is-ci: 3.0.1 - is-lower-case: 2.0.2 - is-upper-case: 2.0.2 + is-in-ci: 0.1.0 lodash: 4.17.21 patch-console: 2.0.0 react: 18.3.1 react-reconciler: 0.29.2(react@18.3.1) scheduler: 0.23.2 signal-exit: 3.0.7 - slice-ansi: 6.0.0 + slice-ansi: 7.1.2 stack-utils: 2.0.6 - string-width: 5.1.2 - type-fest: 0.12.0 - widest-line: 4.0.1 - wrap-ansi: 8.1.0 + string-width: 7.2.0 + type-fest: 4.41.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.2 ws: 8.18.0 yoga-wasm-web: 0.3.3 optionalDependencies: - '@types/react': 17.0.2 + '@types/react': 18.3.27 transitivePeerDependencies: - bufferutil - utf-8-validate - ink@5.0.1(@types/react@17.0.2)(react@18.3.1): + ink@5.2.1(@types/react@18.3.27)(react@18.3.1): dependencies: '@alcalzone/ansi-tokenize': 0.1.3 - ansi-escapes: 7.1.1 + ansi-escapes: 7.2.0 ansi-styles: 6.2.3 auto-bind: 5.0.1 chalk: 5.4.1 @@ -16896,9 +16911,9 @@ snapshots: cli-cursor: 4.0.0 cli-truncate: 4.0.0 code-excerpt: 4.0.0 + es-toolkit: 1.43.0 indent-string: 5.0.0 - is-in-ci: 0.1.0 - lodash: 4.17.21 + is-in-ci: 1.0.0 patch-console: 2.0.0 react: 18.3.1 react-reconciler: 0.29.2(react@18.3.1) @@ -16911,9 +16926,9 @@ snapshots: widest-line: 5.0.0 wrap-ansi: 9.0.2 ws: 8.18.0 - yoga-wasm-web: 0.3.3 + yoga-layout: 3.2.1 optionalDependencies: - '@types/react': 17.0.2 + '@types/react': 18.3.27 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -16993,10 +17008,6 @@ snapshots: is-callable@1.2.7: {} - is-ci@3.0.1: - dependencies: - ci-info: 3.9.0 - is-core-module@2.16.1: dependencies: hasown: 2.0.2 @@ -17049,6 +17060,8 @@ snapshots: is-in-ci@0.1.0: {} + is-in-ci@1.0.0: {} + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 @@ -19028,11 +19041,6 @@ snapshots: ansi-styles: 6.2.3 is-fullwidth-code-point: 4.0.0 - slice-ansi@6.0.0: - dependencies: - ansi-styles: 6.2.3 - is-fullwidth-code-point: 4.0.0 - slice-ansi@7.1.2: dependencies: ansi-styles: 6.2.3 @@ -19515,8 +19523,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@0.12.0: {} - type-fest@0.13.1: {} type-fest@0.16.0: {} @@ -20079,10 +20085,6 @@ snapshots: dependencies: string-width: 4.2.3 - widest-line@4.0.1: - dependencies: - string-width: 5.1.2 - widest-line@5.0.0: dependencies: string-width: 7.2.0 @@ -20189,6 +20191,8 @@ snapshots: yoctocolors-cjs@2.1.3: {} + yoga-layout@3.2.1: {} + yoga-wasm-web@0.3.3: {} yup@1.7.0: From 2465390efe8b0cefadb3b98ea0d026040d78e5aa Mon Sep 17 00:00:00 2001 From: Matteo Depalo Date: Mon, 5 Jan 2026 12:58:57 +0000 Subject: [PATCH 02/10] Update React types to 18.3.12 and fix TypeScript compatibility --- package.json | 3 +- .../logs-command/ui/components/Logs.tsx | 42 ++++---- .../app/src/cli/services/app-logs/utils.ts | 4 +- .../app-events/app-event-watcher-handler.ts | 4 +- .../dev/processes/dev-session/dev-session.ts | 5 +- .../cli/utilities/app/http-reverse-proxy.ts | 8 +- .../src/private/node/ui/components/Banner.tsx | 1 + .../ui/components/Prompts/PromptLayout.tsx | 8 +- .../node/ui/components/SelectInput.tsx | 8 +- .../src/public/node/notifications-system.ts | 2 +- .../cli/src/cli/commands/docs/generate.ts | 2 +- .../src/cli/polyfills/promiseWithResolvers.ts | 8 +- .../cli/utilities/theme-environment/proxy.ts | 4 +- .../ui-extensions-test-utils/src/render.tsx | 2 +- .../src/renderHook.tsx | 2 +- pnpm-lock.yaml | 99 +++++++------------ 16 files changed, 97 insertions(+), 105 deletions(-) diff --git a/package.json b/package.json index efc31f324cd..e87fe410f4c 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,6 @@ "octokit-plugin-create-pull-request": "^3.12.2", "pathe": "1.1.1", "pin-github-action": "^3.3.1", - "react": "17.0.2", "rimraf": "^3.0.2", "tmp": "^0.2.5", "ts-node": "^10.9.1", @@ -98,6 +97,7 @@ }, "version": "0.0.0", "resolutions": { + "@types/react": "18.3.12", "vite": "6.4.1", "whatwg-url": "14.0.0", "supports-hyperlinks": "3.1.0", @@ -161,7 +161,6 @@ "@nx/workspace", "graphql-tag", "pin-github-action", - "react", "esbuild" ], "ignore": [ diff --git a/packages/app/src/cli/services/app-logs/logs-command/ui/components/Logs.tsx b/packages/app/src/cli/services/app-logs/logs-command/ui/components/Logs.tsx index c113b2517ab..cfd3be3ada5 100644 --- a/packages/app/src/cli/services/app-logs/logs-command/ui/components/Logs.tsx +++ b/packages/app/src/cli/services/app-logs/logs-command/ui/components/Logs.tsx @@ -77,9 +77,9 @@ const Logs: FunctionComponent = ({ {appLog instanceof FunctionRunLog && ( - <> + {appLog.logs} - {appLog.inputQueryVariablesMetafieldKey && appLog.inputQueryVariablesMetafieldNamespace && ( + {appLog.inputQueryVariablesMetafieldKey && appLog.inputQueryVariablesMetafieldNamespace ? ( Input Query Variables: @@ -98,8 +98,8 @@ const Logs: FunctionComponent = ({ - )} - {appLog.input && ( + ) : null} + {appLog.input ? ( Input ({appLog.inputBytes} bytes): @@ -108,8 +108,8 @@ const Logs: FunctionComponent = ({ {prettyPrintJsonIfPossible(appLog.input)} - )} - {appLog.output && ( + ) : null} + {appLog.output ? ( Output ({appLog.outputBytes} bytes): @@ -118,41 +118,41 @@ const Logs: FunctionComponent = ({ {prettyPrintJsonIfPossible(appLog.output)} - )} - + ) : null} + )} {appLog instanceof NetworkAccessResponseFromCacheLog && ( - <> + Cache write time: {new Date(appLog.cacheEntryEpochMs).toISOString()} Cache TTL: {appLog.cacheTtlMs / 1000} s HTTP request: {prettyPrintJsonIfPossible(appLog.httpRequest)} HTTP response: {prettyPrintJsonIfPossible(appLog.httpResponse)} - + )} {appLog instanceof NetworkAccessRequestExecutionInBackgroundLog && ( - <> + Reason: {getBackgroundExecutionReasonMessage(appLog.reason)} HTTP request: {prettyPrintJsonIfPossible(appLog.httpRequest)} - + )} {appLog instanceof NetworkAccessRequestExecutedLog && ( - <> + Attempt: {appLog.attempt} - {appLog.connectTimeMs && Connect time: {appLog.connectTimeMs} ms} - {appLog.writeReadTimeMs && Write read time: {appLog.writeReadTimeMs} ms} + {appLog.connectTimeMs ? Connect time: {appLog.connectTimeMs} ms : null} + {appLog.writeReadTimeMs ? Write read time: {appLog.writeReadTimeMs} ms : null} HTTP request: {prettyPrintJsonIfPossible(appLog.httpRequest)} - {appLog.httpResponse && ( - <> + {appLog.httpResponse ? ( + HTTP response: {prettyPrintJsonIfPossible(appLog.httpResponse)} - - )} - {appLog.error && Error: {appLog.error}} - + + ) : null} + {appLog.error ? Error: {appLog.error} : null} + )} diff --git a/packages/app/src/cli/services/app-logs/utils.ts b/packages/app/src/cli/services/app-logs/utils.ts index ef82790515e..e80a1f37475 100644 --- a/packages/app/src/cli/services/app-logs/utils.ts +++ b/packages/app/src/cli/services/app-logs/utils.ts @@ -229,7 +229,7 @@ export const subscribeToAppLogs = async ( return jwtToken } -export function prettyPrintJsonIfPossible(json: unknown) { +export function prettyPrintJsonIfPossible(json: unknown): string | undefined { try { if (typeof json === 'string') { const jsonObject = JSON.parse(json) @@ -237,7 +237,7 @@ export function prettyPrintJsonIfPossible(json: unknown) { } else if (typeof json === 'object' && json !== null) { return JSON.stringify(json, null, 2) } else { - return json + return undefined } } catch (error) { throw new Error(`Error parsing JSON: ${error as string}`) diff --git a/packages/app/src/cli/services/dev/app-events/app-event-watcher-handler.ts b/packages/app/src/cli/services/dev/app-events/app-event-watcher-handler.ts index 27f1d2cdb58..6c75aec5d5a 100644 --- a/packages/app/src/cli/services/dev/app-events/app-event-watcher-handler.ts +++ b/packages/app/src/cli/services/dev/app-events/app-event-watcher-handler.ts @@ -135,6 +135,8 @@ async function reload(app: AppLinkedInterface): Promise { return newApp // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (error: any) { - throw new Error(`Error reloading app: ${error.message}`, {cause: 'validation-error'}) + const err = new Error(`Error reloading app: ${error.message}`) + ;(err as Error & {cause: string}).cause = 'validation-error' + throw err } } diff --git a/packages/app/src/cli/services/dev/processes/dev-session/dev-session.ts b/packages/app/src/cli/services/dev/processes/dev-session/dev-session.ts index 10289451fc2..deaee115887 100644 --- a/packages/app/src/cli/services/dev/processes/dev-session/dev-session.ts +++ b/packages/app/src/cli/services/dev/processes/dev-session/dev-session.ts @@ -221,7 +221,10 @@ export class DevSession { await this.logger.debug('❌ Dev preview update aborted (new change detected or error during update)') } else if (result.status === 'remote-error' || result.status === 'unknown-error') { await this.logger.logUserErrors(result.error, event?.app.allExtensions ?? []) - if (result.error instanceof Error && result.error.cause === 'validation-error') { + if ( + result.error instanceof Error && + (result.error as Error & {cause?: string}).cause === 'validation-error' + ) { this.statusManager.setMessage('VALIDATION_ERROR') } else { if (event) this.failedEvents.push(event) diff --git a/packages/app/src/cli/utilities/app/http-reverse-proxy.ts b/packages/app/src/cli/utilities/app/http-reverse-proxy.ts index f7667c9d7bb..866962a46ce 100644 --- a/packages/app/src/cli/utilities/app/http-reverse-proxy.ts +++ b/packages/app/src/cli/utilities/app/http-reverse-proxy.ts @@ -6,6 +6,10 @@ import * as https from 'https' import {Writable} from 'stream' import type Server from 'http-proxy-node16' +function isAggregateError(err: Error): err is Error & {errors: Error[]} { + return 'errors' in err && Array.isArray((err as {errors?: unknown}).errors) +} + export interface LocalhostCert { key: string cert: string @@ -47,7 +51,7 @@ function getProxyServerWebsocketUpgradeListener( if (target) { return proxy.ws(req, socket, head, {target}, (err) => { useConcurrentOutputContext({outputPrefix: 'proxy', stripAnsi: false}, () => { - const error = err instanceof AggregateError && err.errors.length > 0 ? err.errors[err.errors.length - 1] : err + const error = isAggregateError(err) && err.errors.length > 0 ? err.errors[err.errors.length - 1]! : err outputWarn(`Error forwarding websocket request: ${error.message}`, stdout) outputWarn(`└ Unreachable target "${target}" for path: "${req.url}"`, stdout) }) @@ -67,7 +71,7 @@ function getProxyServerRequestListener( if (target) { return proxy.web(req, res, {target}, (err) => { useConcurrentOutputContext({outputPrefix: 'proxy', stripAnsi: false}, () => { - const error = err instanceof AggregateError && err.errors.length > 0 ? err.errors[err.errors.length - 1] : err + const error = isAggregateError(err) && err.errors.length > 0 ? err.errors[err.errors.length - 1]! : err outputWarn(`Error forwarding web request: ${error.message}`, stdout) outputWarn(`└ Unreachable target "${target}" for path: "${req.url}"`, stdout) }) diff --git a/packages/cli-kit/src/private/node/ui/components/Banner.tsx b/packages/cli-kit/src/private/node/ui/components/Banner.tsx index ba001c35e40..c97f00c2ea5 100644 --- a/packages/cli-kit/src/private/node/ui/components/Banner.tsx +++ b/packages/cli-kit/src/private/node/ui/components/Banner.tsx @@ -7,6 +7,7 @@ export type BannerType = 'success' | 'error' | 'warning' | 'info' | 'external_er interface BannerProps { type: BannerType + children?: React.ReactNode } function typeToColor(type: BannerProps['type']) { diff --git a/packages/cli-kit/src/private/node/ui/components/Prompts/PromptLayout.tsx b/packages/cli-kit/src/private/node/ui/components/Prompts/PromptLayout.tsx index b9400516afe..740b4bafa6d 100644 --- a/packages/cli-kit/src/private/node/ui/components/Prompts/PromptLayout.tsx +++ b/packages/cli-kit/src/private/node/ui/components/Prompts/PromptLayout.tsx @@ -6,7 +6,7 @@ import {AbortSignal} from '../../../../../public/node/abort.js' import useAbortSignal from '../../hooks/use-abort-signal.js' import {PromptState} from '../../hooks/use-prompt.js' import React, {ReactElement, cloneElement, useCallback, useLayoutEffect, useState} from 'react' -import {Box, measureElement, Text, useStdout} from 'ink' +import {Box, measureElement, Text, useStdout, DOMElement} from 'ink' import figures from 'figures' export type Message = TokenItem> @@ -40,7 +40,7 @@ const PromptLayout = ({ const [availableLines, setAvailableLines] = useState(currentAvailableLines) const wrapperRef = useCallback( - (node) => { + (node: DOMElement | null) => { if (node !== null) { const {height} = measureElement(node) if (wrapperHeight !== height) { @@ -51,14 +51,14 @@ const PromptLayout = ({ [wrapperHeight], ) - const promptAreaRef = useCallback((node) => { + const promptAreaRef = useCallback((node: DOMElement | null) => { if (node !== null) { const {height} = measureElement(node) setPromptAreaHeight(height) } }, []) - const inputFixedAreaRef = useCallback((node) => { + const inputFixedAreaRef = useCallback((node: DOMElement | null) => { if (node !== null) { const {height} = measureElement(node) // + 3 accounts for the margins inside the input elements and the last empty line of the terminal diff --git a/packages/cli-kit/src/private/node/ui/components/SelectInput.tsx b/packages/cli-kit/src/private/node/ui/components/SelectInput.tsx index 16262ceb0d0..6155d66ab43 100644 --- a/packages/cli-kit/src/private/node/ui/components/SelectInput.tsx +++ b/packages/cli-kit/src/private/node/ui/components/SelectInput.tsx @@ -10,8 +10,8 @@ import sortBy from 'lodash/sortBy.js' declare module 'react' { function forwardRef( - render: (props: P, ref: React.Ref) => JSX.Element | null, - ): (props: P & React.RefAttributes) => JSX.Element | null + render: (props: P, ref: React.Ref) => React.ReactElement | null, + ): (props: P & React.RefAttributes) => React.ReactElement | null } export interface SelectInputProps { items: Item[] @@ -90,7 +90,7 @@ function Item({ items, hasAnyGroup, index, -}: ItemProps): JSX.Element { +}: ItemProps): React.ReactElement { const label = highlightedLabel(item.label, highlightedTerm) let title: string | undefined let labelColor @@ -153,7 +153,7 @@ function SelectInputInner( groupOrder, }: SelectInputProps, ref: React.ForwardedRef, -): JSX.Element | null { +): React.ReactElement | null { let noItems = false if (rawItems.length === 0) { diff --git a/packages/cli-kit/src/public/node/notifications-system.ts b/packages/cli-kit/src/public/node/notifications-system.ts index 7bff8cbd28e..d9eade1f1cb 100644 --- a/packages/cli-kit/src/public/node/notifications-system.ts +++ b/packages/cli-kit/src/public/node/notifications-system.ts @@ -101,7 +101,7 @@ async function renderNotifications(notifications: Notification[]) { notifications.slice(0, 2).forEach((notification) => { const content = { headline: notification.title, - body: notification.message.replaceAll('\\n', '\n'), + body: notification.message.replace(/\\n/g, '\n'), link: notification.cta, } switch (notification.type) { diff --git a/packages/cli/src/cli/commands/docs/generate.ts b/packages/cli/src/cli/commands/docs/generate.ts index 0bfec03febc..2c5e90d8b2b 100644 --- a/packages/cli/src/cli/commands/docs/generate.ts +++ b/packages/cli/src/cli/commands/docs/generate.ts @@ -123,7 +123,7 @@ const data: ReferenceEntityTemplateSchema = { export default data` - const updatedDocString = docString.replaceAll('<%= config.bin %>', 'shopify') + const updatedDocString = docString.replace(/<%= config\.bin %>/g, 'shopify') await writeFile(`${docsPath}/${fileName}.doc.ts`, updatedDocString) outputInfo(`Generated docs for ${commandName}`) diff --git a/packages/theme/src/cli/polyfills/promiseWithResolvers.ts b/packages/theme/src/cli/polyfills/promiseWithResolvers.ts index 35f491107b0..65c607197aa 100644 --- a/packages/theme/src/cli/polyfills/promiseWithResolvers.ts +++ b/packages/theme/src/cli/polyfills/promiseWithResolvers.ts @@ -4,10 +4,16 @@ interface PromiseWithResolvers { reject: (reason?: unknown) => void } +declare global { + interface PromiseConstructor { + withResolvers?(): PromiseWithResolvers + } +} + // Polyfill for Promise.withResolvers // Can remove once our minimum supported Node version is 22 export function promiseWithResolvers(): PromiseWithResolvers { - if (typeof Promise.withResolvers === 'function') { + if (Promise.withResolvers) { return Promise.withResolvers() } diff --git a/packages/theme/src/cli/utilities/theme-environment/proxy.ts b/packages/theme/src/cli/utilities/theme-environment/proxy.ts index 06676a1a16e..2640ea8ad58 100644 --- a/packages/theme/src/cli/utilities/theme-environment/proxy.ts +++ b/packages/theme/src/cli/utilities/theme-environment/proxy.ts @@ -114,7 +114,7 @@ export function canProxyRequest(event: H3Event) { } function getStoreFqdnForRegEx(ctx: DevServerContext) { - return ctx.session.storeFqdn.replaceAll('.', '\\.') + return ctx.session.storeFqdn.replace(/\./g, '\\.') } /** @@ -289,7 +289,7 @@ export function getProxyStorefrontHeaders(event: H3Event) { } export function proxyStorefrontRequest(event: H3Event, ctx: DevServerContext): Promise { - const path = event.path.replaceAll(EXTENSION_CDN_PREFIX, '/') + const path = event.path.replace(new RegExp(EXTENSION_CDN_PREFIX, 'g'), '/') const host = event.path.startsWith(EXTENSION_CDN_PREFIX) ? 'cdn.shopify.com' : ctx.session.storeFqdn const url = new URL(path, `https://${host}`) diff --git a/packages/ui-extensions-test-utils/src/render.tsx b/packages/ui-extensions-test-utils/src/render.tsx index 164edc4be5b..b6bb2a3a249 100644 --- a/packages/ui-extensions-test-utils/src/render.tsx +++ b/packages/ui-extensions-test-utils/src/render.tsx @@ -3,7 +3,7 @@ import {mount} from '@shopify/react-testing' export function render( element: React.ReactElement, - Providers: React.ComponentType = ({children}) => <>{children}, + Providers: React.ComponentType> = ({children}) => <>{children}, options: Omit = {} as TProviderProps, ) { return mount({element}) diff --git a/packages/ui-extensions-test-utils/src/renderHook.tsx b/packages/ui-extensions-test-utils/src/renderHook.tsx index 753ac04ee7a..3ce6b96169a 100644 --- a/packages/ui-extensions-test-utils/src/renderHook.tsx +++ b/packages/ui-extensions-test-utils/src/renderHook.tsx @@ -25,7 +25,7 @@ function MountHook({callback}: {callback(): void}) { export function renderHook( hook: () => T, - Providers: React.ComponentType = ({children}) => <>{children}, + Providers: React.ComponentType> = ({children}) => <>{children}, options: Omit = {} as TP, ) { const hookResult: HookWrapper = {} as any diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f80916792ce..af1072fd95f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,7 @@ settings: excludeLinksFromLockfile: false overrides: + '@types/react': 18.3.12 vite: 6.4.1 whatwg-url: 14.0.0 supports-hyperlinks: 3.1.0 @@ -128,9 +129,6 @@ importers: pin-github-action: specifier: ^3.3.1 version: 3.3.1 - react: - specifier: 17.0.2 - version: 17.0.2 rimraf: specifier: ^3.0.2 version: 3.0.2 @@ -244,8 +242,8 @@ importers: specifier: 4.1.4 version: 4.1.4 '@types/react': - specifier: ^18.2.0 - version: 18.3.27 + specifier: 18.3.12 + version: 18.3.12 '@types/react-dom': specifier: ^18.2.0 version: 18.2.0 @@ -429,7 +427,7 @@ importers: version: 6.0.2 ink: specifier: 5.2.1 - version: 5.2.1(@types/react@18.3.27)(react@18.3.1) + version: 5.2.1(@types/react@18.3.12)(react@18.3.1) is-executable: specifier: 2.0.1 version: 2.0.1 @@ -528,8 +526,8 @@ importers: specifier: 4.17.19 version: 4.17.19 '@types/react': - specifier: ^18.2.0 - version: 18.3.27 + specifier: 18.3.12 + version: 18.3.12 '@types/semver': specifier: ^7.5.2 version: 7.7.0 @@ -762,11 +760,11 @@ importers: specifier: ^1.0.2 version: 1.0.5 '@types/react': - specifier: 16.14.0 - version: 16.14.0 + specifier: 18.3.12 + version: 18.3.12 '@types/react-dom': specifier: ^16.9.11 - version: 16.9.25(@types/react@16.14.0) + version: 16.9.25(@types/react@18.3.12) '@vitejs/plugin-react-refresh': specifier: ^1.3.6 version: 1.3.6 @@ -789,8 +787,8 @@ importers: specifier: 3.26.0 version: link:../ui-extensions-test-utils '@types/react': - specifier: 17.0.2 - version: 17.0.2 + specifier: 18.3.12 + version: 18.3.12 '@vitejs/plugin-react-refresh': specifier: ^1.3.6 version: 1.3.6 @@ -813,11 +811,11 @@ importers: specifier: ^3.0.0 version: 3.3.10(react-dom@17.0.2(react@17.0.2))(react@17.0.2) '@types/react': - specifier: 16.14.0 - version: 16.14.0 + specifier: 18.3.12 + version: 18.3.12 '@types/react-dom': specifier: ^16.9.11 - version: 16.9.25(@types/react@16.14.0) + version: 16.9.25(@types/react@18.3.12) react: specifier: ^17.0.2 version: 17.0.2 @@ -3944,7 +3942,7 @@ packages: '@types/react-dom@16.9.25': resolution: {integrity: sha512-ZK//eAPhwft9Ul2/Zj+6O11YR6L4JX0J2sVeBC9Ft7x7HFN7xk7yUV/zDxqV6rjvqgl6r8Dq7oQImxtyf/Mzcw==} peerDependencies: - '@types/react': ^16.0.0 + '@types/react': 18.3.12 '@types/react-dom@18.2.0': resolution: {integrity: sha512-8yQrvS6sMpSwIovhPOwfyNf2Wz6v/B62LFSVYQ85+Rq3tLsBIG7rP5geMxaijTUxSkrO6RzN/IRuIAADYQsleA==} @@ -3952,16 +3950,10 @@ packages: '@types/react-transition-group@4.4.12': resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} peerDependencies: - '@types/react': '*' - - '@types/react@16.14.0': - resolution: {integrity: sha512-jJjHo1uOe+NENRIBvF46tJimUvPnmbQ41Ax0pEm7pRvhPg+wuj8VMOHHiMvaGmZRzRrCtm7KnL5OOE/6kHPK8w==} + '@types/react': 18.3.12 - '@types/react@17.0.2': - resolution: {integrity: sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA==} - - '@types/react@18.3.27': - resolution: {integrity: sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==} + '@types/react@18.3.12': + resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==} '@types/readdir-glob@1.1.5': resolution: {integrity: sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==} @@ -5098,9 +5090,6 @@ packages: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} engines: {node: '>=8'} - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -6363,7 +6352,7 @@ packages: resolution: {integrity: sha512-ae4AW/t8jlkj/6Ou21H2av0wxTk8vrGzXv+v2v7j4in+bl1M5XRMVbfNghzhBokV++FjF8RBDJvYo+ttR9YVRg==} engines: {node: '>=18'} peerDependencies: - '@types/react': '>=18.0.0' + '@types/react': 18.3.12 react: '>=18.0.0' react-devtools-core: ^4.19.1 peerDependenciesMeta: @@ -6376,7 +6365,7 @@ packages: resolution: {integrity: sha512-BqcUyWrG9zq5HIwW6JcfFHsIYebJkWWb4fczNah1goUO0vv5vneIlfwuS85twyJ5hYR/y18FlAYUxrO9ChIWVg==} engines: {node: '>=18'} peerDependencies: - '@types/react': '>=18.0.0' + '@types/react': 18.3.12 react: '>=18.0.0' react-devtools-core: ^4.19.1 peerDependenciesMeta: @@ -12646,10 +12635,10 @@ snapshots: '@oclif/table@0.4.14': dependencies: - '@types/react': 18.3.27 + '@types/react': 18.3.12 change-case: 5.4.4 cli-truncate: 4.0.0 - ink: 5.0.1(@types/react@18.3.27)(react@18.3.1) + ink: 5.0.1(@types/react@18.3.12)(react@18.3.1) natural-orderby: 3.0.2 object-hash: 3.0.0 react: 18.3.1 @@ -13214,7 +13203,7 @@ snapshots: '@shopify/generate-docs@0.15.6': dependencies: - '@types/react': 18.3.27 + '@types/react': 18.3.12 globby: 11.1.0 typescript: 5.8.3 @@ -13253,9 +13242,9 @@ snapshots: dependencies: '@shopify/polaris-icons': 8.11.1(react@18.3.1) '@shopify/polaris-tokens': 8.10.0 - '@types/react': 18.3.27 + '@types/react': 18.3.12 '@types/react-dom': 18.2.0 - '@types/react-transition-group': 4.4.12(@types/react@18.3.27) + '@types/react-transition-group': 4.4.12(@types/react@18.3.12) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-fast-compare: 3.2.2 @@ -13836,7 +13825,7 @@ snapshots: '@types/hoist-non-react-statics@3.3.6': dependencies: - '@types/react': 18.3.27 + '@types/react': 18.3.12 hoist-non-react-statics: 3.3.2 '@types/http-cache-semantics@4.0.4': {} @@ -13899,35 +13888,25 @@ snapshots: '@types/qrcode.react@1.0.5': dependencies: - '@types/react': 18.3.27 + '@types/react': 18.3.12 '@types/qs@6.14.0': {} '@types/range-parser@1.2.7': {} - '@types/react-dom@16.9.25(@types/react@16.14.0)': + '@types/react-dom@16.9.25(@types/react@18.3.12)': dependencies: - '@types/react': 16.14.0 + '@types/react': 18.3.12 '@types/react-dom@18.2.0': dependencies: - '@types/react': 18.3.27 + '@types/react': 18.3.12 - '@types/react-transition-group@4.4.12(@types/react@18.3.27)': + '@types/react-transition-group@4.4.12(@types/react@18.3.12)': dependencies: - '@types/react': 18.3.27 + '@types/react': 18.3.12 - '@types/react@16.14.0': - dependencies: - '@types/prop-types': 15.7.14 - csstype: 3.1.3 - - '@types/react@17.0.2': - dependencies: - '@types/prop-types': 15.7.14 - csstype: 3.1.3 - - '@types/react@18.3.27': + '@types/react@18.3.12': dependencies: '@types/prop-types': 15.7.14 csstype: 3.2.3 @@ -15339,8 +15318,6 @@ snapshots: dependencies: cssom: 0.3.8 - csstype@3.1.3: {} - csstype@3.2.3: {} damerau-levenshtein@1.0.8: {} @@ -15515,7 +15492,7 @@ snapshots: dom-helpers@5.2.1: dependencies: '@babel/runtime': 7.28.4 - csstype: 3.1.3 + csstype: 3.2.3 domexception@4.0.0: dependencies: @@ -16867,7 +16844,7 @@ snapshots: ini@2.0.0: {} - ink@5.0.1(@types/react@18.3.27)(react@18.3.1): + ink@5.0.1(@types/react@18.3.12)(react@18.3.1): dependencies: '@alcalzone/ansi-tokenize': 0.1.3 ansi-escapes: 7.1.1 @@ -16895,12 +16872,12 @@ snapshots: ws: 8.18.0 yoga-wasm-web: 0.3.3 optionalDependencies: - '@types/react': 18.3.27 + '@types/react': 18.3.12 transitivePeerDependencies: - bufferutil - utf-8-validate - ink@5.2.1(@types/react@18.3.27)(react@18.3.1): + ink@5.2.1(@types/react@18.3.12)(react@18.3.1): dependencies: '@alcalzone/ansi-tokenize': 0.1.3 ansi-escapes: 7.2.0 @@ -16928,7 +16905,7 @@ snapshots: ws: 8.18.0 yoga-layout: 3.2.1 optionalDependencies: - '@types/react': 18.3.27 + '@types/react': 18.3.12 transitivePeerDependencies: - bufferutil - utf-8-validate From fec5c29c848f14a49bde914edc05a05a3dad2f6f Mon Sep 17 00:00:00 2001 From: Matteo Depalo Date: Mon, 5 Jan 2026 13:35:02 +0000 Subject: [PATCH 03/10] Fix linter --- .../dev/processes/dev-session/dev-session-process.test.ts | 2 +- .../cli/services/dev/processes/dev-session/dev-session.ts | 5 +---- packages/app/src/cli/utilities/app/http-reverse-proxy.ts | 6 ++++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/app/src/cli/services/dev/processes/dev-session/dev-session-process.test.ts b/packages/app/src/cli/services/dev/processes/dev-session/dev-session-process.test.ts index 014c23fdb85..b9a89a792b6 100644 --- a/packages/app/src/cli/services/dev/processes/dev-session/dev-session-process.test.ts +++ b/packages/app/src/cli/services/dev/processes/dev-session/dev-session-process.test.ts @@ -360,7 +360,7 @@ describe('pushUpdatesForDevSession', () => { test('sets validation error status message when error cause is validation-error', async () => { // Given const validationError = new Error('Validation failed') - validationError.cause = 'validation-error' + ;(validationError as Error & {cause: string}).cause = 'validation-error' // When await pushUpdatesForDevSession({stderr, stdout, abortSignal: abortController.signal}, options) diff --git a/packages/app/src/cli/services/dev/processes/dev-session/dev-session.ts b/packages/app/src/cli/services/dev/processes/dev-session/dev-session.ts index deaee115887..21cbb873a1a 100644 --- a/packages/app/src/cli/services/dev/processes/dev-session/dev-session.ts +++ b/packages/app/src/cli/services/dev/processes/dev-session/dev-session.ts @@ -221,10 +221,7 @@ export class DevSession { await this.logger.debug('❌ Dev preview update aborted (new change detected or error during update)') } else if (result.status === 'remote-error' || result.status === 'unknown-error') { await this.logger.logUserErrors(result.error, event?.app.allExtensions ?? []) - if ( - result.error instanceof Error && - (result.error as Error & {cause?: string}).cause === 'validation-error' - ) { + if (result.error instanceof Error && (result.error as Error & {cause?: string}).cause === 'validation-error') { this.statusManager.setMessage('VALIDATION_ERROR') } else { if (event) this.failedEvents.push(event) diff --git a/packages/app/src/cli/utilities/app/http-reverse-proxy.ts b/packages/app/src/cli/utilities/app/http-reverse-proxy.ts index 866962a46ce..9304bab8e84 100644 --- a/packages/app/src/cli/utilities/app/http-reverse-proxy.ts +++ b/packages/app/src/cli/utilities/app/http-reverse-proxy.ts @@ -51,7 +51,8 @@ function getProxyServerWebsocketUpgradeListener( if (target) { return proxy.ws(req, socket, head, {target}, (err) => { useConcurrentOutputContext({outputPrefix: 'proxy', stripAnsi: false}, () => { - const error = isAggregateError(err) && err.errors.length > 0 ? err.errors[err.errors.length - 1]! : err + const lastError = isAggregateError(err) ? err.errors[err.errors.length - 1] : undefined + const error = lastError ?? err outputWarn(`Error forwarding websocket request: ${error.message}`, stdout) outputWarn(`└ Unreachable target "${target}" for path: "${req.url}"`, stdout) }) @@ -71,7 +72,8 @@ function getProxyServerRequestListener( if (target) { return proxy.web(req, res, {target}, (err) => { useConcurrentOutputContext({outputPrefix: 'proxy', stripAnsi: false}, () => { - const error = isAggregateError(err) && err.errors.length > 0 ? err.errors[err.errors.length - 1]! : err + const lastError = isAggregateError(err) ? err.errors[err.errors.length - 1] : undefined + const error = lastError ?? err outputWarn(`Error forwarding web request: ${error.message}`, stdout) outputWarn(`└ Unreachable target "${target}" for path: "${req.url}"`, stdout) }) From 043605072bc21d582d85dee091592c12423bbd0d Mon Sep 17 00:00:00 2001 From: Matteo Depalo Date: Mon, 5 Jan 2026 13:52:02 +0000 Subject: [PATCH 04/10] Fix react-dom version to strict format --- packages/app/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app/package.json b/packages/app/package.json index 7f29b0914e1..58cf9c32c2a 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -70,7 +70,7 @@ "ignore": "6.0.2", "proper-lockfile": "4.1.2", "react": "^18.2.0", - "react-dom": "^18.2.0", + "react-dom": "18.3.1", "which": "4.0.0", "ws": "8.18.0" }, From 6362afaa47ec80b3e67d224ed5b12efc48b18de6 Mon Sep 17 00:00:00 2001 From: Matteo Depalo Date: Mon, 5 Jan 2026 15:05:14 +0000 Subject: [PATCH 05/10] Update pnpm-lock.yaml for react-dom version --- pnpm-lock.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index af1072fd95f..9f236364b63 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -220,7 +220,7 @@ importers: specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: ^18.2.0 + specifier: 18.3.1 version: 18.3.1(react@18.3.1) which: specifier: 4.0.0 From 459d103b33e871533ddbcc1a95742223f058065e Mon Sep 17 00:00:00 2001 From: Matteo Depalo Date: Mon, 5 Jan 2026 17:10:31 +0000 Subject: [PATCH 06/10] Add changeset --- .changeset/update-ink.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/update-ink.md diff --git a/.changeset/update-ink.md b/.changeset/update-ink.md new file mode 100644 index 00000000000..d965cb3ab93 --- /dev/null +++ b/.changeset/update-ink.md @@ -0,0 +1,5 @@ +--- +"@shopify/cli-kit": patch +--- + +Update ink from 4.4.1 to 5.2.1 From 6fd3249853900a77390eeca4f9c514d816478182 Mon Sep 17 00:00:00 2001 From: Matteo Depalo Date: Mon, 5 Jan 2026 17:11:27 +0000 Subject: [PATCH 07/10] Remove leading semicolon --- .../cli/services/dev/app-events/app-event-watcher-handler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/app/src/cli/services/dev/app-events/app-event-watcher-handler.ts b/packages/app/src/cli/services/dev/app-events/app-event-watcher-handler.ts index 6c75aec5d5a..e54a27ba937 100644 --- a/packages/app/src/cli/services/dev/app-events/app-event-watcher-handler.ts +++ b/packages/app/src/cli/services/dev/app-events/app-event-watcher-handler.ts @@ -135,8 +135,8 @@ async function reload(app: AppLinkedInterface): Promise { return newApp // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (error: any) { - const err = new Error(`Error reloading app: ${error.message}`) - ;(err as Error & {cause: string}).cause = 'validation-error' + const err = new Error(`Error reloading app: ${error.message}`) as Error & {cause: string} + err.cause = 'validation-error' throw err } } From 2ac54e237825986b1468cc56fe471ab028999e68 Mon Sep 17 00:00:00 2001 From: Matteo Depalo Date: Mon, 5 Jan 2026 17:23:57 +0000 Subject: [PATCH 08/10] Fix regexp and refresh docs --- packages/cli-kit/bin/refresh-code-documentation.ts | 14 +++++++------- .../src/cli/utilities/theme-environment/proxy.ts | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/cli-kit/bin/refresh-code-documentation.ts b/packages/cli-kit/bin/refresh-code-documentation.ts index 21cc8f91ec9..02693e11cc9 100644 --- a/packages/cli-kit/bin/refresh-code-documentation.ts +++ b/packages/cli-kit/bin/refresh-code-documentation.ts @@ -1,7 +1,5 @@ import {examples} from './documentation/examples.js' import {unstyled} from '../src/public/node/output.js' -import {renderFatalError} from '../src/public/node/ui.js' -import {AbortError} from '../src/public/node/error.js' import {FunctionDeclaration, JSDocTag, Project} from 'ts-morph' import difference from 'lodash/difference.js' @@ -17,11 +15,13 @@ async function refreshDocumentation(): Promise { validateMissingDocs(renderFunctions, validationErrors) if (validationErrors.length > 0) { - renderFatalError( - new AbortError('Refreshing the documentation failed', { - list: {items: validationErrors.map((error) => error.message)}, - }), - ) + // eslint-disable-next-line no-console + console.error('Refreshing the documentation failed:') + validationErrors.forEach((error) => { + // eslint-disable-next-line no-console + console.error(` - ${error.message}`) + }) + process.exit(1) } const exampleTags: {[key: string]: JSDocTag[]} = renderFunctions.reduce((acc, func) => { diff --git a/packages/theme/src/cli/utilities/theme-environment/proxy.ts b/packages/theme/src/cli/utilities/theme-environment/proxy.ts index 2640ea8ad58..197ff16d1a7 100644 --- a/packages/theme/src/cli/utilities/theme-environment/proxy.ts +++ b/packages/theme/src/cli/utilities/theme-environment/proxy.ts @@ -114,7 +114,7 @@ export function canProxyRequest(event: H3Event) { } function getStoreFqdnForRegEx(ctx: DevServerContext) { - return ctx.session.storeFqdn.replace(/\./g, '\\.') + return ctx.session.storeFqdn.replace(/\\/g, '\\\\').replace(/\./g, '\\.') } /** From 4812a4e386dbe89b12d8d7bfd5ac0dec292f5777 Mon Sep 17 00:00:00 2001 From: Matteo Depalo Date: Tue, 6 Jan 2026 13:36:03 +0000 Subject: [PATCH 09/10] Update progress bar docs --- packages/cli-kit/bin/documentation/examples.ts | 12 +++++------- packages/cli-kit/src/public/node/ui.tsx | 4 ++-- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/cli-kit/bin/documentation/examples.ts b/packages/cli-kit/bin/documentation/examples.ts index c5fe4d8fcc8..fb997ff2736 100644 --- a/packages/cli-kit/bin/documentation/examples.ts +++ b/packages/cli-kit/bin/documentation/examples.ts @@ -583,7 +583,8 @@ export const examples: {[key in string]: Example} = { () => Boolean(stdout.lastFrame()?.includes('Installing dependencies')), ) - return stdout.lastFrame()! + // Return first frame with the title for deterministic output + return stdout.frames.find((frame) => frame.includes('Installing dependencies'))! }, }, renderSingleTask: { @@ -596,14 +597,11 @@ export const examples: {[key in string]: Example} = { task: async () => { await sleep(1) }, - renderOptions: {stdout: stdout as any, debug: true} + renderOptions: {stdout: stdout as any, debug: true}, }) - // Find the last frame that includes mention of "Loading" - const loadingFrame = stdout.frames.findLast(frame => frame.includes('Loading')) - - // Gives a frame where the loading bar is visible - return loadingFrame ?? stdout.lastFrame()! + // Return first frame with the title for deterministic output + return stdout.frames.find((frame) => frame.includes('Loading'))! }, }, renderTextPrompt: { diff --git a/packages/cli-kit/src/public/node/ui.tsx b/packages/cli-kit/src/public/node/ui.tsx index 6a44d696a18..d5b4a62cfcf 100644 --- a/packages/cli-kit/src/public/node/ui.tsx +++ b/packages/cli-kit/src/public/node/ui.tsx @@ -468,7 +468,7 @@ interface RenderTasksOptions { /** * Runs async tasks and displays their progress to the console. * @example - * ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ + * ▁▁▂▂▃▃▄▄▅▅▆▆▇▇██▇▇▆▆▅▅▄▄▃▃▂▂▁▁▁▁▂▂▃▃▄▄▅▅▆▆▇▇██▇▇▆▆▅▅▄▄▃▃▂▂▁▁ * Installing dependencies ... */ // eslint-disable-next-line max-params @@ -502,7 +502,7 @@ export interface RenderSingleTaskOptions { * @param options.renderOptions - Optional render configuration * @returns The result of the task * @example - * ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ + * ▁▁▂▂▃▃▄▄▅▅▆▆▇▇██▇▇▆▆▅▅▄▄▃▃▂▂▁▁▁▁▂▂▃▃▄▄▅▅▆▆▇▇██▇▇▆▆▅▅▄▄▃▃▂▂▁▁ * Loading app ... */ export async function renderSingleTask({ From 64d4c58a36e2b8af9f124d810a6ca2350560bdc3 Mon Sep 17 00:00:00 2001 From: Matteo Depalo Date: Tue, 6 Jan 2026 13:48:02 +0000 Subject: [PATCH 10/10] Force color when generating example for progress bar --- .../cli-kit/bin/documentation/examples.ts | 81 ++++++++++++------- packages/cli-kit/src/public/node/ui.tsx | 4 +- 2 files changed, 53 insertions(+), 32 deletions(-) diff --git a/packages/cli-kit/bin/documentation/examples.ts b/packages/cli-kit/bin/documentation/examples.ts index fb997ff2736..3c70e51b9ce 100644 --- a/packages/cli-kit/bin/documentation/examples.ts +++ b/packages/cli-kit/bin/documentation/examples.ts @@ -565,43 +565,64 @@ export const examples: {[key in string]: Example} = { renderTasks: { type: 'async', basic: async () => { - const stdout = new Stdout({columns: TERMINAL_WIDTH}) + // Force colors for deterministic output (solid blocks vs animated wave) + const originalForceColor = process.env.FORCE_COLOR + process.env.FORCE_COLOR = '1' + try { + const stdout = new Stdout({columns: TERMINAL_WIDTH}) - const tasks = [ - { - title: 'Installing dependencies', - task: async () => { - await new Promise((resolve) => setTimeout(resolve, 2000)) + const tasks = [ + { + title: 'Installing dependencies', + task: async () => { + await new Promise((resolve) => setTimeout(resolve, 2000)) + }, }, - }, - ] - - renderTasks(tasks, {renderOptions: {stdout: stdout as any, debug: true}}) - - await waitFor( - () => {}, - () => Boolean(stdout.lastFrame()?.includes('Installing dependencies')), - ) - - // Return first frame with the title for deterministic output - return stdout.frames.find((frame) => frame.includes('Installing dependencies'))! + ] + + renderTasks(tasks, {renderOptions: {stdout: stdout as any, debug: true}}) + + await waitFor( + () => {}, + () => Boolean(stdout.lastFrame()?.includes('Installing dependencies')), + ) + + return stdout.lastFrame()! + } finally { + if (originalForceColor === undefined) { + delete process.env.FORCE_COLOR + } else { + process.env.FORCE_COLOR = originalForceColor + } + } }, }, renderSingleTask: { type: 'async', basic: async () => { - const stdout = new Stdout({columns: TERMINAL_WIDTH}) - - await renderSingleTask({ - title: outputContent`Loading app`, - task: async () => { - await sleep(1) - }, - renderOptions: {stdout: stdout as any, debug: true}, - }) - - // Return first frame with the title for deterministic output - return stdout.frames.find((frame) => frame.includes('Loading'))! + // Force colors for deterministic output (solid blocks vs animated wave) + const originalForceColor = process.env.FORCE_COLOR + process.env.FORCE_COLOR = '1' + try { + const stdout = new Stdout({columns: TERMINAL_WIDTH}) + + await renderSingleTask({ + title: outputContent`Loading app`, + task: async () => { + await sleep(1) + }, + renderOptions: {stdout: stdout as any, debug: true}, + }) + + // Return first frame with the title for deterministic output + return stdout.frames.find((frame) => frame.includes('Loading'))! + } finally { + if (originalForceColor === undefined) { + delete process.env.FORCE_COLOR + } else { + process.env.FORCE_COLOR = originalForceColor + } + } }, }, renderTextPrompt: { diff --git a/packages/cli-kit/src/public/node/ui.tsx b/packages/cli-kit/src/public/node/ui.tsx index d5b4a62cfcf..6a44d696a18 100644 --- a/packages/cli-kit/src/public/node/ui.tsx +++ b/packages/cli-kit/src/public/node/ui.tsx @@ -468,7 +468,7 @@ interface RenderTasksOptions { /** * Runs async tasks and displays their progress to the console. * @example - * ▁▁▂▂▃▃▄▄▅▅▆▆▇▇██▇▇▆▆▅▅▄▄▃▃▂▂▁▁▁▁▂▂▃▃▄▄▅▅▆▆▇▇██▇▇▆▆▅▅▄▄▃▃▂▂▁▁ + * ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ * Installing dependencies ... */ // eslint-disable-next-line max-params @@ -502,7 +502,7 @@ export interface RenderSingleTaskOptions { * @param options.renderOptions - Optional render configuration * @returns The result of the task * @example - * ▁▁▂▂▃▃▄▄▅▅▆▆▇▇██▇▇▆▆▅▅▄▄▃▃▂▂▁▁▁▁▂▂▃▃▄▄▅▅▆▆▇▇██▇▇▆▆▅▅▄▄▃▃▂▂▁▁ + * ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ * Loading app ... */ export async function renderSingleTask({