diff --git a/.changeset/light-waves-jog.md b/.changeset/light-waves-jog.md new file mode 100644 index 00000000..6b348787 --- /dev/null +++ b/.changeset/light-waves-jog.md @@ -0,0 +1,6 @@ +--- +"@clack/prompts": patch +"@clack/core": patch +--- + +Switched from wrap-ansi to fast-wrap-ansi diff --git a/packages/core/package.json b/packages/core/package.json index 1c9c04c8..35bab10e 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -58,6 +58,6 @@ }, "devDependencies": { "vitest": "^3.2.4", - "wrap-ansi": "^8.1.0" + "fast-wrap-ansi": "^0.1.3" } } diff --git a/packages/core/src/prompts/prompt.ts b/packages/core/src/prompts/prompt.ts index 1803ebc6..977e5dd5 100644 --- a/packages/core/src/prompts/prompt.ts +++ b/packages/core/src/prompts/prompt.ts @@ -1,8 +1,8 @@ import { stdin, stdout } from 'node:process'; import readline, { type Key, type ReadLine } from 'node:readline'; import type { Readable, Writable } from 'node:stream'; +import { wrapAnsi } from 'fast-wrap-ansi'; import { cursor, erase } from 'sisteransi'; -import wrap from 'wrap-ansi'; import type { ClackEvents, ClackState } from '../types.js'; import type { Action } from '../utils/index.js'; import { CANCEL_SYMBOL, diffLines, isActionKey, setRawMode, settings } from '../utils/index.js'; @@ -253,13 +253,13 @@ export default class Prompt { private restoreCursor() { const lines = - wrap(this._prevFrame, process.stdout.columns, { hard: true, trim: false }).split('\n') + wrapAnsi(this._prevFrame, process.stdout.columns, { hard: true, trim: false }).split('\n') .length - 1; this.output.write(cursor.move(-999, lines * -1)); } private render() { - const frame = wrap(this._render(this) ?? '', process.stdout.columns, { + const frame = wrapAnsi(this._render(this) ?? '', process.stdout.columns, { hard: true, trim: false, }); diff --git a/packages/prompts/package.json b/packages/prompts/package.json index 1cc8e042..eda06e57 100644 --- a/packages/prompts/package.json +++ b/packages/prompts/package.json @@ -62,6 +62,6 @@ "memfs": "^4.17.2", "vitest": "^3.2.4", "vitest-ansi-serializer": "^0.1.2", - "wrap-ansi": "^8.1.0" + "fast-wrap-ansi": "^0.1.3" } } diff --git a/packages/prompts/src/spinner.ts b/packages/prompts/src/spinner.ts index 953cf377..3ff9d70c 100644 --- a/packages/prompts/src/spinner.ts +++ b/packages/prompts/src/spinner.ts @@ -1,7 +1,7 @@ import { block, getColumns, settings } from '@clack/core'; +import { wrapAnsi } from 'fast-wrap-ansi'; import color from 'picocolors'; import { cursor, erase } from 'sisteransi'; -import wrap from 'wrap-ansi'; import { type CommonOptions, isCI as isCIFn, @@ -96,7 +96,7 @@ export const spinner = ({ const clearPrevMessage = () => { if (_prevMessage === undefined) return; if (isCI) output.write('\n'); - const wrapped = wrap(_prevMessage, columns, { + const wrapped = wrapAnsi(_prevMessage, columns, { hard: true, trim: false, }); @@ -144,7 +144,7 @@ export const spinner = ({ outputMessage = `${frame} ${_message}${loadingDots}`; } - const wrapped = wrap(outputMessage, columns, { + const wrapped = wrapAnsi(outputMessage, columns, { hard: true, trim: false, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 34235281..95e45a8b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -67,12 +67,12 @@ importers: specifier: ^1.0.5 version: 1.0.5 devDependencies: + fast-wrap-ansi: + specifier: ^0.1.3 + version: 0.1.3 vitest: specifier: ^3.2.4 version: 3.2.4(@types/node@24.1.0)(jiti@2.5.0) - wrap-ansi: - specifier: ^8.1.0 - version: 8.1.0 packages/prompts: dependencies: @@ -86,6 +86,9 @@ importers: specifier: ^1.0.5 version: 1.0.5 devDependencies: + fast-wrap-ansi: + specifier: ^0.1.3 + version: 0.1.3 is-unicode-supported: specifier: ^1.3.0 version: 1.3.0 @@ -98,9 +101,6 @@ importers: vitest-ansi-serializer: specifier: ^0.1.2 version: 0.1.2(vitest@3.2.4(@types/node@24.1.0)(jiti@2.5.0)) - wrap-ansi: - specifier: ^8.1.0 - version: 8.1.0 packages: @@ -747,14 +747,6 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} - - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -938,15 +930,9 @@ packages: domutils@3.1.0: resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.190: resolution: {integrity: sha512-k4McmnB2091YIsdCgkS0fMVMPOJgxl93ltFzaryXqwip1AaxeDqKCGLxkXODDA5Ab/D+tV5EL5+aTx76RvLRxw==} - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -996,6 +982,15 @@ packages: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} + fast-string-truncated-width@1.2.1: + resolution: {integrity: sha512-Q9acT/+Uu3GwGj+5w/zsGuQjh9O1TyywhIwAxHudtWrgF09nHOPrvTLhQevPbttcxjr/SNN7mJmfOw/B1bXgow==} + + fast-string-width@1.1.0: + resolution: {integrity: sha512-O3fwIVIH5gKB38QNbdg+3760ZmGz0SZMgvwJbA1b2TGXceKE6A2cOlfogh1iw8lr049zPyd7YADHy+B7U4W9bQ==} + + fast-wrap-ansi@0.1.3: + resolution: {integrity: sha512-iLg8mLuZBztzm8jmY6/xjr+ci4WYo6eYgHAioTA1ElxkE1BJ9J4tPuDlnHaLfljkRZ2vYfP0CDIpCHBBag4InA==} + fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} @@ -1620,18 +1615,10 @@ packages: std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -1836,10 +1823,6 @@ packages: engines: {node: '>=8'} hasBin: true - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - zod-validation-error@3.4.0: resolution: {integrity: sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ==} engines: {node: '>=18.0.0'} @@ -2424,10 +2407,6 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} - - ansi-styles@6.2.1: {} - argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -2624,12 +2603,8 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 - eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.190: {} - emoji-regex@9.2.2: {} - enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -2698,6 +2673,16 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 + fast-string-truncated-width@1.2.1: {} + + fast-string-width@1.1.0: + dependencies: + fast-string-truncated-width: 1.2.1 + + fast-wrap-ansi@0.1.3: + dependencies: + fast-string-width: 1.1.0 + fastq@1.17.1: dependencies: reusify: 1.0.4 @@ -3290,20 +3275,10 @@ snapshots: std-env@3.9.0: {} - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.1.0 - strip-bom@3.0.0: {} strip-json-comments@5.0.2: {} @@ -3513,12 +3488,6 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - zod-validation-error@3.4.0(zod@3.22.4): dependencies: zod: 3.22.4