@shopify/cli-kit 4.6.1 → 4.7.0
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.
- package/dist/private/node/analytics/bounded-collections.js +1 -4
- package/dist/private/node/analytics/bounded-collections.js.map +1 -1
- package/dist/private/node/analytics/graphql-error-codes.d.ts +2 -2
- package/dist/private/node/analytics/graphql-error-codes.js +2 -2
- package/dist/private/node/analytics/graphql-error-codes.js.map +1 -1
- package/dist/private/node/analytics.js +12 -7
- package/dist/private/node/analytics.js.map +1 -1
- package/dist/private/node/api/headers.js +3 -0
- package/dist/private/node/api/headers.js.map +1 -1
- package/dist/private/node/api.js +8 -8
- package/dist/private/node/api.js.map +1 -1
- package/dist/private/node/conf-store.js +1 -1
- package/dist/private/node/conf-store.js.map +1 -1
- package/dist/private/node/content-tokens.js +27 -2
- package/dist/private/node/content-tokens.js.map +1 -1
- package/dist/private/node/otel-metrics.d.ts +1 -1
- package/dist/private/node/otel-metrics.js +5 -2
- package/dist/private/node/otel-metrics.js.map +1 -1
- package/dist/private/node/plugin-hints.d.ts +16 -0
- package/dist/private/node/plugin-hints.js +29 -0
- package/dist/private/node/plugin-hints.js.map +1 -0
- package/dist/private/node/request-ids.js +2 -3
- package/dist/private/node/request-ids.js.map +1 -1
- package/dist/private/node/session/device-authorization.js +4 -7
- package/dist/private/node/session/device-authorization.js.map +1 -1
- package/dist/private/node/session/exchange.d.ts +4 -4
- package/dist/private/node/session/exchange.js +21 -5
- package/dist/private/node/session/exchange.js.map +1 -1
- package/dist/private/node/testing/ui.js +18 -19
- package/dist/private/node/testing/ui.js.map +1 -1
- package/dist/private/node/ui/components/Alert.d.ts +1 -1
- package/dist/private/node/ui/components/Alert.js.map +1 -1
- package/dist/private/node/ui/components/ConcurrentOutput.test.js +2 -0
- package/dist/private/node/ui/components/ConcurrentOutput.test.js.map +1 -1
- package/dist/private/node/ui/components/DangerousConfirmationPrompt.d.ts +1 -1
- package/dist/private/node/ui/components/DangerousConfirmationPrompt.js.map +1 -1
- package/dist/private/node/ui/components/List.d.ts +1 -1
- package/dist/private/node/ui/components/List.js.map +1 -1
- package/dist/private/node/ui/components/Prompts/InfoMessage.d.ts +1 -1
- package/dist/private/node/ui/components/Prompts/InfoMessage.js.map +1 -1
- package/dist/private/node/ui/components/Prompts/InfoTable.d.ts +1 -1
- package/dist/private/node/ui/components/Prompts/InfoTable.js.map +1 -1
- package/dist/private/node/ui/components/Prompts/PromptLayout.d.ts +1 -1
- package/dist/private/node/ui/components/Prompts/PromptLayout.js.map +1 -1
- package/dist/private/node/ui/components/SingleTask.test.js +1 -0
- package/dist/private/node/ui/components/SingleTask.test.js.map +1 -1
- package/dist/private/node/ui/components/TabularData.d.ts +1 -1
- package/dist/private/node/ui/components/TabularData.js +2 -1
- package/dist/private/node/ui/components/TabularData.js.map +1 -1
- package/dist/private/node/ui/components/TextPrompt.d.ts +1 -1
- package/dist/private/node/ui/components/TextPrompt.js.map +1 -1
- package/dist/private/node/ui/components/TokenizedText.d.ts +1 -38
- package/dist/private/node/ui/components/TokenizedText.js +0 -54
- package/dist/private/node/ui/components/TokenizedText.js.map +1 -1
- package/dist/private/node/ui/components/TokenizedText.test.js +2 -1
- package/dist/private/node/ui/components/TokenizedText.test.js.map +1 -1
- package/dist/private/node/ui/components/token-item.d.ts +38 -0
- package/dist/private/node/ui/components/token-item.js +63 -0
- package/dist/private/node/ui/components/token-item.js.map +1 -0
- package/dist/private/node/ui/hooks/use-abort-signal.js +5 -4
- package/dist/private/node/ui/hooks/use-abort-signal.js.map +1 -1
- package/dist/private/node/ui/hooks/use-select-state.js +2 -1
- package/dist/private/node/ui/hooks/use-select-state.js.map +1 -1
- package/dist/private/node/ui/utilities.d.ts +6 -6
- package/dist/private/node/ui/utilities.js +1 -1
- package/dist/private/node/ui/utilities.js.map +1 -1
- package/dist/private/node/ui.js +18 -15
- package/dist/private/node/ui.js.map +1 -1
- package/dist/public/common/string.d.ts +1 -1
- package/dist/public/common/string.js.map +1 -1
- package/dist/public/common/version.d.ts +1 -1
- package/dist/public/common/version.js +1 -1
- package/dist/public/common/version.js.map +1 -1
- package/dist/public/node/abort.d.ts +14 -6
- package/dist/public/node/abort.js +7 -6
- package/dist/public/node/abort.js.map +1 -1
- package/dist/public/node/analytics.d.ts +1 -0
- package/dist/public/node/analytics.js +79 -32
- package/dist/public/node/analytics.js.map +1 -1
- package/dist/public/node/api/admin.js +1 -1
- package/dist/public/node/api/admin.js.map +1 -1
- package/dist/public/node/base-command.d.ts +10 -0
- package/dist/public/node/base-command.js +31 -8
- package/dist/public/node/base-command.js.map +1 -1
- package/dist/public/node/cli.d.ts +13 -0
- package/dist/public/node/cli.js +18 -2
- package/dist/public/node/cli.js.map +1 -1
- package/dist/public/node/context/local.d.ts +3 -1
- package/dist/public/node/context/local.js +14 -7
- package/dist/public/node/context/local.js.map +1 -1
- package/dist/public/node/custom-oclif-loader.js +19 -16
- package/dist/public/node/custom-oclif-loader.js.map +1 -1
- package/dist/public/node/doctor/framework.js +4 -5
- package/dist/public/node/doctor/framework.js.map +1 -1
- package/dist/public/node/environment.js +8 -11
- package/dist/public/node/environment.js.map +1 -1
- package/dist/public/node/error.d.ts +1 -4
- package/dist/public/node/error.js +20 -7
- package/dist/public/node/error.js.map +1 -1
- package/dist/public/node/git.js +7 -5
- package/dist/public/node/git.js.map +1 -1
- package/dist/public/node/global-context.js +1 -1
- package/dist/public/node/global-context.js.map +1 -1
- package/dist/public/node/hidden-folder.js +2 -4
- package/dist/public/node/hidden-folder.js.map +1 -1
- package/dist/public/node/hooks/postrun.js +1 -1
- package/dist/public/node/hooks/postrun.js.map +1 -1
- package/dist/public/node/hooks/prerun.js +5 -1
- package/dist/public/node/hooks/prerun.js.map +1 -1
- package/dist/public/node/local-storage.js +1 -0
- package/dist/public/node/local-storage.js.map +1 -1
- package/dist/public/node/metadata.d.ts +3 -0
- package/dist/public/node/metadata.js.map +1 -1
- package/dist/public/node/mimes.js +1 -3
- package/dist/public/node/mimes.js.map +1 -1
- package/dist/public/node/node-package-manager.js +31 -73
- package/dist/public/node/node-package-manager.js.map +1 -1
- package/dist/public/node/notifications-system.js +19 -3
- package/dist/public/node/notifications-system.js.map +1 -1
- package/dist/public/node/os.js +5 -10
- package/dist/public/node/os.js.map +1 -1
- package/dist/public/node/output.js +11 -20
- package/dist/public/node/output.js.map +1 -1
- package/dist/public/node/plugins/tunnel.d.ts +1 -2
- package/dist/public/node/plugins/tunnel.js +2 -2
- package/dist/public/node/plugins/tunnel.js.map +1 -1
- package/dist/public/node/result.js +4 -2
- package/dist/public/node/result.js.map +1 -1
- package/dist/public/node/serial-batch-processor.js +4 -3
- package/dist/public/node/serial-batch-processor.js.map +1 -1
- package/dist/public/node/store-auth-session.js +1 -1
- package/dist/public/node/store-auth-session.js.map +1 -1
- package/dist/public/node/system.d.ts +15 -1
- package/dist/public/node/system.js +42 -6
- package/dist/public/node/system.js.map +1 -1
- package/dist/public/node/themes/conf.js +2 -2
- package/dist/public/node/themes/conf.js.map +1 -1
- package/dist/public/node/themes/factories.js +2 -2
- package/dist/public/node/themes/factories.js.map +1 -1
- package/dist/public/node/themes/theme-manager.js +2 -0
- package/dist/public/node/themes/theme-manager.js.map +1 -1
- package/dist/public/node/themes/urls.js +7 -7
- package/dist/public/node/themes/urls.js.map +1 -1
- package/dist/public/node/toml/toml-file.js +12 -13
- package/dist/public/node/toml/toml-file.js.map +1 -1
- package/dist/public/node/ui.d.ts +1 -1
- package/dist/public/node/ui.js +1 -1
- package/dist/public/node/ui.js.map +1 -1
- package/dist/public/node/vendor/dev_server/dev-server-2024.js +14 -2
- package/dist/public/node/vendor/dev_server/dev-server-2024.js.map +1 -1
- package/dist/public/node/vendor/dev_server/dev-server.js +3 -0
- package/dist/public/node/vendor/dev_server/dev-server.js.map +1 -1
- package/dist/public/node/vendor/dev_server/network/index.js +1 -1
- package/dist/public/node/vendor/dev_server/network/index.js.map +1 -1
- package/dist/public/node/vendor/otel-js/export/InstantaneousMetricReader.js +1 -0
- package/dist/public/node/vendor/otel-js/export/InstantaneousMetricReader.js.map +1 -1
- package/dist/public/node/vendor/otel-js/service/BaseOtelService/BaseOtelService.js +5 -2
- package/dist/public/node/vendor/otel-js/service/BaseOtelService/BaseOtelService.js.map +1 -1
- package/dist/public/node/vendor/otel-js/service/types.d.ts +2 -2
- package/dist/public/node/vendor/otel-js/service/types.js.map +1 -1
- package/dist/public/node/vscode.js +12 -11
- package/dist/public/node/vscode.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConcurrentOutput.test.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/ConcurrentOutput.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import {ConcurrentOutput, useConcurrentOutputContext} from './ConcurrentOutput.js'\nimport {render, waitForContent} from '../../testing/ui.js'\nimport {AbortController, AbortSignal} from '../../../../public/node/abort.js'\nimport {unstyled} from '../../../../public/node/output.js'\n\nimport React from 'react'\nimport {describe, expect, test} from 'vitest'\n\nimport {Writable} from 'stream'\n\n/**\n * ConcurrentOutput tests are unreliable unless we await a promise that resolves after the process has written to stdout.\n */\nclass Synchronizer {\n resolve: () => void\n promise: Promise<void>\n\n constructor() {\n this.resolve = () => {}\n this.promise = new Promise<void>((resolve, _reject) => {\n this.resolve = resolve\n })\n }\n}\n\ndescribe('ConcurrentOutput', () => {\n test('renders a stream of concurrent outputs from sub-processes', async () => {\n // Given\n const backendSync = new Synchronizer()\n const frontendSync = new Synchronizer()\n const gate = new Synchronizer()\n\n const backendProcess = {\n prefix: 'backend',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n stdout.write('first backend message')\n stdout.write('second backend message')\n stdout.write('third backend message')\n\n backendSync.resolve()\n await gate.promise\n },\n }\n\n const frontendProcess = {\n prefix: 'frontend',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n await backendSync.promise\n\n stdout.write('first frontend message')\n stdout.write('second frontend message')\n stdout.write('third frontend message')\n\n frontendSync.resolve()\n await gate.promise\n },\n }\n // When\n\n const renderInstance = render(\n <ConcurrentOutput processes={[backendProcess, frontendProcess]} abortSignal={new AbortController().signal} />,\n )\n\n await frontendSync.promise\n // Wait for React 19 to render the process output\n await waitForContent(renderInstance, 'third frontend message')\n\n // Then\n expect(unstyled(renderInstance.lastFrame()!.replace(/\\d/g, '0'))).toMatchInlineSnapshot(`\n \"00:00:00 │ backend │ first backend message\n 00:00:00 │ backend │ second backend message\n 00:00:00 │ backend │ third backend message\n 00:00:00 │ frontend │ first frontend message\n 00:00:00 │ frontend │ second frontend message\n 00:00:00 │ frontend │ third frontend message\n \"\n `)\n\n gate.resolve()\n })\n\n test('strips ansi codes from the output by default', async () => {\n const output = 'foo'\n\n // Given\n const processSync = new Synchronizer()\n const gate = new Synchronizer()\n const processes = [\n {\n prefix: '1',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n stdout.write(`\\u001b[32m${output}\\u001b[39m`)\n processSync.resolve()\n await gate.promise\n },\n },\n ]\n\n // When\n const renderInstance = render(<ConcurrentOutput processes={processes} abortSignal={new AbortController().signal} />)\n await processSync.promise\n await waitForContent(renderInstance, output)\n\n // Then\n const logColumns = renderInstance.lastFrame()!.split('│')\n expect(logColumns.length).toBe(3)\n expect(logColumns[2]?.trim()).toEqual(output)\n gate.resolve()\n })\n\n test('does not strip ansi codes from the output when stripAnsi is false', async () => {\n const output = '\\u001b[32mfoo\\u001b[39m'\n\n // Given\n const processSync = new Synchronizer()\n const gate = new Synchronizer()\n const processes = [\n {\n prefix: '1',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n useConcurrentOutputContext({stripAnsi: false}, () => {\n stdout.write(output)\n })\n processSync.resolve()\n await gate.promise\n },\n },\n ]\n\n // When\n const renderInstance = render(<ConcurrentOutput processes={processes} abortSignal={new AbortController().signal} />)\n await processSync.promise\n await waitForContent(renderInstance, 'foo')\n\n // Then\n const logColumns = renderInstance.lastFrame()!.split('│')\n expect(logColumns.length).toBe(3)\n expect(logColumns[2]?.trim()).toEqual(output)\n gate.resolve()\n })\n\n test('renders custom prefixes on log lines', async () => {\n // Given\n const processSync = new Synchronizer()\n const gate = new Synchronizer()\n const extensionName = 'my-extension'\n const processes = [\n {\n prefix: '1',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n useConcurrentOutputContext({outputPrefix: extensionName}, () => {\n stdout.write('foo bar')\n })\n processSync.resolve()\n await gate.promise\n },\n },\n ]\n\n // When\n const renderInstance = render(\n <ConcurrentOutput\n processes={processes}\n // Ensure it's not truncated\n prefixColumnSize={extensionName.length}\n abortSignal={new AbortController().signal}\n />,\n )\n\n await processSync.promise\n await waitForContent(renderInstance, 'foo bar')\n\n // Then\n const logColumns = unstyled(renderInstance.lastFrame()!).split('│')\n expect(logColumns.length).toBe(3)\n expect(logColumns[1]?.trim()).toEqual(extensionName)\n gate.resolve()\n })\n\n test('renders prefix column width based on prefixColumnSize', async () => {\n // Given\n const processSync1 = new Synchronizer()\n const processSync2 = new Synchronizer()\n const gate = new Synchronizer()\n\n const columnSize = 5\n const processes = [\n {\n prefix: '1234567890',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n stdout.write('foo')\n processSync1.resolve()\n await gate.promise\n },\n },\n {\n prefix: '1',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n stdout.write('bar')\n processSync2.resolve()\n await gate.promise\n },\n },\n ]\n\n // When\n const renderInstance = render(\n <ConcurrentOutput\n processes={processes}\n prefixColumnSize={columnSize}\n abortSignal={new AbortController().signal}\n />,\n )\n await Promise.all([processSync1.promise, processSync2.promise])\n await waitForContent(renderInstance, 'bar')\n\n // Then\n const logLines = unstyled(renderInstance.lastFrame()!).split('\\n').filter(Boolean)\n expect(logLines.length).toBe(2)\n logLines.forEach((line) => {\n const logColumns = line.split('│')\n expect(logColumns.length).toBe(3)\n // Including spacing\n expect(logColumns[1]?.length).toBe(columnSize + 2)\n })\n gate.resolve()\n })\n\n test('renders prefix column width based on processes by default', async () => {\n // Given\n const processSync = new Synchronizer()\n const gate = new Synchronizer()\n const processes = [\n {\n prefix: '1',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n stdout.write('foo')\n processSync.resolve()\n await gate.promise\n },\n },\n {prefix: '12', action: async () => gate.promise},\n {prefix: '123', action: async () => gate.promise},\n {prefix: '1234', action: async () => gate.promise},\n ]\n\n // When\n const renderInstance = render(<ConcurrentOutput processes={processes} abortSignal={new AbortController().signal} />)\n await processSync.promise\n await waitForContent(renderInstance, 'foo')\n\n // Then\n const logColumns = unstyled(renderInstance.lastFrame()!).split('│')\n expect(logColumns.length).toBe(3)\n // 4 is largest prefix, plus spacing\n expect(logColumns[1]?.length).toBe(4 + 2)\n gate.resolve()\n })\n\n test('does not render prefix column larger than max', async () => {\n // Given\n const processSync = new Synchronizer()\n const gate = new Synchronizer()\n const processes = [\n {\n prefix: '1',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n stdout.write('foo')\n processSync.resolve()\n await gate.promise\n },\n },\n {prefix: new Array(26).join('0'), action: async () => gate.promise},\n ]\n\n // When\n const renderInstance = render(<ConcurrentOutput processes={processes} abortSignal={new AbortController().signal} />)\n await processSync.promise\n await waitForContent(renderInstance, 'foo')\n\n // Then\n const logColumns = unstyled(renderInstance.lastFrame()!).split('│')\n expect(logColumns.length).toBe(3)\n // 25 is largest column allowed, plus spacing\n expect(logColumns[1]?.length).toBe(25 + 2)\n gate.resolve()\n })\n\n test('rejects with the error thrown inside one of the processes', async () => {\n // Given\n const backendProcess = {\n prefix: 'backend',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n stdout.write('first backend message')\n stdout.write('second backend message')\n stdout.write('third backend message')\n\n throw new Error('something went wrong')\n },\n }\n\n // When\n\n const renderInstance = render(\n <ConcurrentOutput processes={[backendProcess]} abortSignal={new AbortController().signal} />,\n )\n\n const renderPromise = renderInstance.waitUntilExit()\n\n await expect(renderPromise).rejects.toThrowError('something went wrong')\n expect(renderPromise.isRejected()).toBe(true)\n })\n\n test(\"doesn't reject when an error is thrown inside one of the processes and keepRunningAfterProcessesResolve is true\", async () => {\n // Given\n const backendProcess = {\n prefix: 'backend',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n stdout.write('first backend message')\n stdout.write('second backend message')\n stdout.write('third backend message')\n\n throw new Error('something went wrong')\n },\n }\n\n // When\n\n const renderInstance = render(\n <ConcurrentOutput\n processes={[backendProcess]}\n abortSignal={new AbortController().signal}\n keepRunningAfterProcessesResolve\n />,\n )\n\n await new Promise((resolve) => setTimeout(resolve, 10))\n expect(renderInstance.waitUntilExit().isRejected()).toBe(false)\n })\n\n test('render promise resolves when all processes resolve by default', async () => {\n const backendProcess = {\n prefix: 'backend',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n stdout.write('first backend message')\n stdout.write('second backend message')\n stdout.write('third backend message')\n },\n }\n\n // When\n const renderInstance = render(\n <ConcurrentOutput processes={[backendProcess]} abortSignal={new AbortController().signal} />,\n )\n\n const renderPromise = renderInstance.waitUntilExit()\n\n await renderPromise\n expect(renderPromise.isFulfilled()).toBe(true)\n })\n\n test(\"render promise doesn't resolve when all processes resolve and keepRunningAfterProcessesResolve is true\", async () => {\n const backendProcess = {\n prefix: 'backend',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n stdout.write('first backend message')\n stdout.write('second backend message')\n stdout.write('third backend message')\n },\n }\n\n // When\n const renderInstance = render(\n <ConcurrentOutput\n keepRunningAfterProcessesResolve\n processes={[backendProcess]}\n abortSignal={new AbortController().signal}\n />,\n )\n\n await new Promise((resolve) => setTimeout(resolve, 10))\n\n expect(renderInstance.waitUntilExit().isFulfilled()).toBe(false)\n })\n})\n"]}
|
|
1
|
+
{"version":3,"file":"ConcurrentOutput.test.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/ConcurrentOutput.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import {ConcurrentOutput, useConcurrentOutputContext} from './ConcurrentOutput.js'\nimport {render, waitForContent} from '../../testing/ui.js'\nimport {AbortController, AbortSignal} from '../../../../public/node/abort.js'\nimport {unstyled} from '../../../../public/node/output.js'\n\nimport React from 'react'\nimport {describe, expect, test} from 'vitest'\n\nimport {Writable} from 'stream'\n\n/**\n * ConcurrentOutput tests are unreliable unless we await a promise that resolves after the process has written to stdout.\n */\nclass Synchronizer {\n resolve: () => void\n promise: Promise<void>\n\n constructor() {\n this.resolve = () => {}\n this.promise = new Promise<void>((resolve, _reject) => {\n this.resolve = resolve\n })\n }\n}\n\ndescribe('ConcurrentOutput', () => {\n test('renders a stream of concurrent outputs from sub-processes', async () => {\n // Given\n const backendSync = new Synchronizer()\n const frontendSync = new Synchronizer()\n const gate = new Synchronizer()\n\n const backendProcess = {\n prefix: 'backend',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n stdout.write('first backend message')\n stdout.write('second backend message')\n stdout.write('third backend message')\n\n backendSync.resolve()\n await gate.promise\n },\n }\n\n const frontendProcess = {\n prefix: 'frontend',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n await backendSync.promise\n\n stdout.write('first frontend message')\n stdout.write('second frontend message')\n stdout.write('third frontend message')\n\n frontendSync.resolve()\n await gate.promise\n },\n }\n // When\n\n const renderInstance = render(\n <ConcurrentOutput processes={[backendProcess, frontendProcess]} abortSignal={new AbortController().signal} />,\n )\n\n await frontendSync.promise\n // Wait for React 19 to render the process output\n await waitForContent(renderInstance, 'third frontend message')\n\n // Then\n expect(unstyled(renderInstance.lastFrame()!.replace(/\\d/g, '0'))).toMatchInlineSnapshot(`\n \"00:00:00 │ backend │ first backend message\n 00:00:00 │ backend │ second backend message\n 00:00:00 │ backend │ third backend message\n 00:00:00 │ frontend │ first frontend message\n 00:00:00 │ frontend │ second frontend message\n 00:00:00 │ frontend │ third frontend message\n \"\n `)\n\n gate.resolve()\n })\n\n test('strips ansi codes from the output by default', async () => {\n const output = 'foo'\n\n // Given\n const processSync = new Synchronizer()\n const gate = new Synchronizer()\n const processes = [\n {\n prefix: '1',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n stdout.write(`\\u001b[32m${output}\\u001b[39m`)\n processSync.resolve()\n await gate.promise\n },\n },\n ]\n\n // When\n const renderInstance = render(<ConcurrentOutput processes={processes} abortSignal={new AbortController().signal} />)\n await processSync.promise\n await waitForContent(renderInstance, output)\n\n // Then\n const logColumns = renderInstance.lastFrame()!.split('│')\n expect(logColumns.length).toBe(3)\n expect(logColumns[2]?.trim()).toEqual(output)\n gate.resolve()\n })\n\n test('does not strip ansi codes from the output when stripAnsi is false', async () => {\n const output = '\\u001b[32mfoo\\u001b[39m'\n\n // Given\n const processSync = new Synchronizer()\n const gate = new Synchronizer()\n const processes = [\n {\n prefix: '1',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n useConcurrentOutputContext({stripAnsi: false}, () => {\n stdout.write(output)\n })\n processSync.resolve()\n await gate.promise\n },\n },\n ]\n\n // When\n const renderInstance = render(<ConcurrentOutput processes={processes} abortSignal={new AbortController().signal} />)\n await processSync.promise\n await waitForContent(renderInstance, 'foo')\n\n // Then\n const logColumns = renderInstance.lastFrame()!.split('│')\n expect(logColumns.length).toBe(3)\n expect(logColumns[2]?.trim()).toEqual(output)\n gate.resolve()\n })\n\n test('renders custom prefixes on log lines', async () => {\n // Given\n const processSync = new Synchronizer()\n const gate = new Synchronizer()\n const extensionName = 'my-extension'\n const processes = [\n {\n prefix: '1',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n useConcurrentOutputContext({outputPrefix: extensionName}, () => {\n stdout.write('foo bar')\n })\n processSync.resolve()\n await gate.promise\n },\n },\n ]\n\n // When\n const renderInstance = render(\n <ConcurrentOutput\n processes={processes}\n // Ensure it's not truncated\n prefixColumnSize={extensionName.length}\n abortSignal={new AbortController().signal}\n />,\n )\n\n await processSync.promise\n await waitForContent(renderInstance, 'foo bar')\n\n // Then\n const logColumns = unstyled(renderInstance.lastFrame()!).split('│')\n expect(logColumns.length).toBe(3)\n expect(logColumns[1]?.trim()).toEqual(extensionName)\n gate.resolve()\n })\n\n test('renders prefix column width based on prefixColumnSize', async () => {\n // Given\n const processSync1 = new Synchronizer()\n const processSync2 = new Synchronizer()\n const gate = new Synchronizer()\n\n const columnSize = 5\n const processes = [\n {\n prefix: '1234567890',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n stdout.write('foo')\n processSync1.resolve()\n await gate.promise\n },\n },\n {\n prefix: '1',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n stdout.write('bar')\n processSync2.resolve()\n await gate.promise\n },\n },\n ]\n\n // When\n const renderInstance = render(\n <ConcurrentOutput\n processes={processes}\n prefixColumnSize={columnSize}\n abortSignal={new AbortController().signal}\n />,\n )\n await Promise.all([processSync1.promise, processSync2.promise])\n await waitForContent(renderInstance, 'bar')\n\n // Then\n const logLines = unstyled(renderInstance.lastFrame()!).split('\\n').filter(Boolean)\n expect(logLines.length).toBe(2)\n logLines.forEach((line) => {\n const logColumns = line.split('│')\n expect(logColumns.length).toBe(3)\n // Including spacing\n expect(logColumns[1]?.length).toBe(columnSize + 2)\n })\n gate.resolve()\n })\n\n test('renders prefix column width based on processes by default', async () => {\n // Given\n const processSync = new Synchronizer()\n const gate = new Synchronizer()\n const processes = [\n {\n prefix: '1',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n stdout.write('foo')\n processSync.resolve()\n await gate.promise\n },\n },\n {prefix: '12', action: async () => gate.promise},\n {prefix: '123', action: async () => gate.promise},\n {prefix: '1234', action: async () => gate.promise},\n ]\n\n // When\n const renderInstance = render(<ConcurrentOutput processes={processes} abortSignal={new AbortController().signal} />)\n await processSync.promise\n await waitForContent(renderInstance, 'foo')\n\n // Then\n const logColumns = unstyled(renderInstance.lastFrame()!).split('│')\n expect(logColumns.length).toBe(3)\n // 4 is largest prefix, plus spacing\n expect(logColumns[1]?.length).toBe(4 + 2)\n gate.resolve()\n })\n\n test('does not render prefix column larger than max', async () => {\n // Given\n const processSync = new Synchronizer()\n const gate = new Synchronizer()\n const processes = [\n {\n prefix: '1',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n stdout.write('foo')\n processSync.resolve()\n await gate.promise\n },\n },\n {prefix: new Array(26).join('0'), action: async () => gate.promise},\n ]\n\n // When\n const renderInstance = render(<ConcurrentOutput processes={processes} abortSignal={new AbortController().signal} />)\n await processSync.promise\n await waitForContent(renderInstance, 'foo')\n\n // Then\n const logColumns = unstyled(renderInstance.lastFrame()!).split('│')\n expect(logColumns.length).toBe(3)\n // 25 is largest column allowed, plus spacing\n expect(logColumns[1]?.length).toBe(25 + 2)\n gate.resolve()\n })\n\n test('rejects with the error thrown inside one of the processes', async () => {\n // Given\n const backendProcess = {\n prefix: 'backend',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n stdout.write('first backend message')\n stdout.write('second backend message')\n stdout.write('third backend message')\n\n throw new Error('something went wrong')\n },\n }\n\n // When\n\n const renderInstance = render(\n <ConcurrentOutput processes={[backendProcess]} abortSignal={new AbortController().signal} />,\n )\n\n const renderPromise = renderInstance.waitUntilExit()\n\n await expect(renderPromise).rejects.toThrowError('something went wrong')\n expect(renderPromise.isRejected()).toBe(true)\n })\n\n test(\"doesn't reject when an error is thrown inside one of the processes and keepRunningAfterProcessesResolve is true\", async () => {\n // Given\n const backendProcess = {\n prefix: 'backend',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n stdout.write('first backend message')\n stdout.write('second backend message')\n stdout.write('third backend message')\n\n throw new Error('something went wrong')\n },\n }\n\n // When\n\n const renderInstance = render(\n <ConcurrentOutput\n processes={[backendProcess]}\n abortSignal={new AbortController().signal}\n keepRunningAfterProcessesResolve\n />,\n )\n\n await new Promise((resolve) => setTimeout(resolve, 10))\n expect(renderInstance.waitUntilExit().isRejected()).toBe(false)\n })\n\n test('render promise resolves when all processes resolve by default', async () => {\n const backendProcess = {\n prefix: 'backend',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n stdout.write('first backend message')\n stdout.write('second backend message')\n stdout.write('third backend message')\n },\n }\n\n // When\n const renderInstance = render(\n <ConcurrentOutput processes={[backendProcess]} abortSignal={new AbortController().signal} />,\n )\n\n const renderPromise = renderInstance.waitUntilExit()\n\n await renderPromise\n expect(renderPromise.isFulfilled()).toBe(true)\n })\n\n test(\"render promise doesn't resolve when all processes resolve and keepRunningAfterProcessesResolve is true\", async () => {\n const backendProcess = {\n prefix: 'backend',\n action: async (stdout: Writable, _stderr: Writable, _signal: AbortSignal) => {\n stdout.write('first backend message')\n stdout.write('second backend message')\n stdout.write('third backend message')\n },\n }\n\n // When\n const renderInstance = render(\n <ConcurrentOutput\n keepRunningAfterProcessesResolve\n processes={[backendProcess]}\n abortSignal={new AbortController().signal}\n />,\n )\n\n await new Promise((resolve) => setTimeout(resolve, 10))\n\n expect(renderInstance.waitUntilExit().isFulfilled()).toBe(false)\n })\n})\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { InlineToken, TokenItem } from './TokenizedText.js';
|
|
2
1
|
import { InfoTableProps } from './Prompts/InfoTable.js';
|
|
3
2
|
import { AbortSignal } from '../../../../public/node/abort.js';
|
|
4
3
|
import { FunctionComponent } from 'react';
|
|
4
|
+
import type { InlineToken, TokenItem } from './token-item.js';
|
|
5
5
|
export interface DangerousConfirmationPromptProps {
|
|
6
6
|
message: string;
|
|
7
7
|
confirmation: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DangerousConfirmationPrompt.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/DangerousConfirmationPrompt.tsx"],"names":[],"mappings":"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","sourcesContent":["import {TextInput} from './TextInput.js'\nimport {InlineToken, TokenItem, TokenizedText} from './TokenizedText.js'\nimport {InfoTable, InfoTableProps} from './Prompts/InfoTable.js'\nimport {handleCtrlC, useComplete} from '../../ui.js'\nimport useLayout from '../hooks/use-layout.js'\nimport {messageWithPunctuation} from '../utilities.js'\nimport {AbortSignal} from '../../../../public/node/abort.js'\nimport useAbortSignal from '../hooks/use-abort-signal.js'\nimport usePrompt, {PromptState} from '../hooks/use-prompt.js'\n\nimport React, {FunctionComponent, useCallback, useEffect, useState} from 'react'\nimport {Box, useInput, Text} from 'ink'\nimport figures from 'figures'\n\nexport interface DangerousConfirmationPromptProps {\n message: string\n confirmation: string\n infoTable?: InfoTableProps['table']\n warningItem?: TokenItem<InlineToken>\n onSubmit: (value: boolean) => void\n abortSignal?: AbortSignal\n}\n\nconst DangerousConfirmationPrompt: FunctionComponent<DangerousConfirmationPromptProps> = ({\n message,\n confirmation,\n infoTable,\n warningItem,\n onSubmit,\n abortSignal,\n}) => {\n const validateAnswer = useCallback(\n (value: string): TokenItem<InlineToken> | undefined => {\n return value === confirmation ? undefined : ['Value must be exactly', {userInput: confirmation}]\n },\n [confirmation],\n )\n\n const {oneThird, twoThirds} = useLayout()\n const {promptState, setPromptState, answer, setAnswer} = usePrompt<string>({\n initialAnswer: '',\n })\n const complete = useComplete()\n const [error, setError] = useState<TokenItem<InlineToken> | undefined>(undefined)\n const color = promptState === PromptState.Error ? 'red' : 'cyan'\n const underline = new Array(oneThird - 3).fill('▔')\n const {isAborted} = useAbortSignal(abortSignal)\n\n useInput((input, key) => {\n handleCtrlC(input, key)\n\n if (key.escape) {\n setPromptState(PromptState.Cancelled)\n setError(undefined)\n }\n\n if (key.return) {\n const error = validateAnswer(answer)\n\n if (error) {\n setPromptState(PromptState.Error)\n setError(error)\n } else {\n setPromptState(PromptState.Submitted)\n }\n }\n })\n\n useEffect(() => {\n if (promptState === PromptState.Submitted) {\n onSubmit(true)\n complete()\n } else if (promptState === PromptState.Cancelled) {\n onSubmit(false)\n complete()\n }\n }, [onSubmit, promptState, complete])\n\n const completed = promptState === PromptState.Submitted || promptState === PromptState.Cancelled\n\n return isAborted ? null : (\n <Box flexDirection=\"column\" marginBottom={1} width={twoThirds}>\n <Box>\n <Box marginRight={2}>\n <Text>?</Text>\n </Box>\n <TokenizedText item={messageWithPunctuation(message)} />\n </Box>\n {completed ? (\n <CompletedPrompt {...{cancelled: promptState === PromptState.Cancelled}} />\n ) : (\n <>\n <Box flexDirection=\"column\" gap={1} marginTop={1} marginLeft={3}>\n {infoTable ? (\n <Box\n paddingLeft={2}\n borderStyle=\"bold\"\n borderLeft\n borderRight={false}\n borderTop={false}\n borderBottom={false}\n flexDirection=\"column\"\n gap={1}\n >\n <InfoTable table={infoTable} />\n </Box>\n ) : null}\n {warningItem ? (\n <Box flexDirection=\"column\">\n <Text color=\"red\">{figures.warning} WARNING</Text>\n <TokenizedText item={warningItem} />\n </Box>\n ) : null}\n <Box>\n <TokenizedText item={['Type', {userInput: confirmation}, 'to confirm, or press Escape to cancel.']} />\n </Box>\n </Box>\n <Box flexDirection=\"column\" width={oneThird}>\n <Box>\n <Box marginRight={2}>\n <Text color={color}>{`>`}</Text>\n </Box>\n <Box flexGrow={1}>\n <TextInput\n value={answer}\n onChange={(answer) => {\n setAnswer(answer)\n setPromptState(PromptState.Idle)\n }}\n defaultValue=\"\"\n color={color}\n />\n </Box>\n </Box>\n <Box marginLeft={3}>\n <Text color={color}>{underline}</Text>\n </Box>\n {promptState === PromptState.Error && error ? (\n <Box marginLeft={3}>\n <Text color={color}>\n <TokenizedText item={error} />\n </Text>\n </Box>\n ) : null}\n </Box>\n </>\n )}\n </Box>\n )\n}\n\ninterface CompletedPromptProps {\n cancelled: boolean\n}\n\nconst CompletedPrompt: FunctionComponent<CompletedPromptProps> = ({cancelled}) => (\n <Box>\n <Box width={3}>\n {cancelled ? <Text color=\"red\">{figures.cross}</Text> : <Text color=\"cyan\">{figures.tick}</Text>}\n </Box>\n\n <Box flexGrow={1}>{cancelled ? <Text color=\"red\">Cancelled</Text> : <Text color=\"cyan\">Confirmed</Text>}</Box>\n </Box>\n)\n\nexport {DangerousConfirmationPrompt}\n"]}
|
|
1
|
+
{"version":3,"file":"DangerousConfirmationPrompt.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/DangerousConfirmationPrompt.tsx"],"names":[],"mappings":"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","sourcesContent":["import {TextInput} from './TextInput.js'\nimport {TokenizedText} from './TokenizedText.js'\nimport {InfoTable, InfoTableProps} from './Prompts/InfoTable.js'\nimport {handleCtrlC, useComplete} from '../../ui.js'\nimport useLayout from '../hooks/use-layout.js'\nimport {messageWithPunctuation} from '../utilities.js'\nimport {AbortSignal} from '../../../../public/node/abort.js'\nimport useAbortSignal from '../hooks/use-abort-signal.js'\nimport usePrompt, {PromptState} from '../hooks/use-prompt.js'\n\nimport React, {FunctionComponent, useCallback, useEffect, useState} from 'react'\nimport {Box, useInput, Text} from 'ink'\nimport figures from 'figures'\nimport type {InlineToken, TokenItem} from './token-item.js'\n\nexport interface DangerousConfirmationPromptProps {\n message: string\n confirmation: string\n infoTable?: InfoTableProps['table']\n warningItem?: TokenItem<InlineToken>\n onSubmit: (value: boolean) => void\n abortSignal?: AbortSignal\n}\n\nconst DangerousConfirmationPrompt: FunctionComponent<DangerousConfirmationPromptProps> = ({\n message,\n confirmation,\n infoTable,\n warningItem,\n onSubmit,\n abortSignal,\n}) => {\n const validateAnswer = useCallback(\n (value: string): TokenItem<InlineToken> | undefined => {\n return value === confirmation ? undefined : ['Value must be exactly', {userInput: confirmation}]\n },\n [confirmation],\n )\n\n const {oneThird, twoThirds} = useLayout()\n const {promptState, setPromptState, answer, setAnswer} = usePrompt<string>({\n initialAnswer: '',\n })\n const complete = useComplete()\n const [error, setError] = useState<TokenItem<InlineToken> | undefined>(undefined)\n const color = promptState === PromptState.Error ? 'red' : 'cyan'\n const underline = new Array(oneThird - 3).fill('▔')\n const {isAborted} = useAbortSignal(abortSignal)\n\n useInput((input, key) => {\n handleCtrlC(input, key)\n\n if (key.escape) {\n setPromptState(PromptState.Cancelled)\n setError(undefined)\n }\n\n if (key.return) {\n const error = validateAnswer(answer)\n\n if (error) {\n setPromptState(PromptState.Error)\n setError(error)\n } else {\n setPromptState(PromptState.Submitted)\n }\n }\n })\n\n useEffect(() => {\n if (promptState === PromptState.Submitted) {\n onSubmit(true)\n complete()\n } else if (promptState === PromptState.Cancelled) {\n onSubmit(false)\n complete()\n }\n }, [onSubmit, promptState, complete])\n\n const completed = promptState === PromptState.Submitted || promptState === PromptState.Cancelled\n\n return isAborted ? null : (\n <Box flexDirection=\"column\" marginBottom={1} width={twoThirds}>\n <Box>\n <Box marginRight={2}>\n <Text>?</Text>\n </Box>\n <TokenizedText item={messageWithPunctuation(message)} />\n </Box>\n {completed ? (\n <CompletedPrompt {...{cancelled: promptState === PromptState.Cancelled}} />\n ) : (\n <>\n <Box flexDirection=\"column\" gap={1} marginTop={1} marginLeft={3}>\n {infoTable ? (\n <Box\n paddingLeft={2}\n borderStyle=\"bold\"\n borderLeft\n borderRight={false}\n borderTop={false}\n borderBottom={false}\n flexDirection=\"column\"\n gap={1}\n >\n <InfoTable table={infoTable} />\n </Box>\n ) : null}\n {warningItem ? (\n <Box flexDirection=\"column\">\n <Text color=\"red\">{figures.warning} WARNING</Text>\n <TokenizedText item={warningItem} />\n </Box>\n ) : null}\n <Box>\n <TokenizedText item={['Type', {userInput: confirmation}, 'to confirm, or press Escape to cancel.']} />\n </Box>\n </Box>\n <Box flexDirection=\"column\" width={oneThird}>\n <Box>\n <Box marginRight={2}>\n <Text color={color}>{`>`}</Text>\n </Box>\n <Box flexGrow={1}>\n <TextInput\n value={answer}\n onChange={(answer) => {\n setAnswer(answer)\n setPromptState(PromptState.Idle)\n }}\n defaultValue=\"\"\n color={color}\n />\n </Box>\n </Box>\n <Box marginLeft={3}>\n <Text color={color}>{underline}</Text>\n </Box>\n {promptState === PromptState.Error && error ? (\n <Box marginLeft={3}>\n <Text color={color}>\n <TokenizedText item={error} />\n </Text>\n </Box>\n ) : null}\n </Box>\n </>\n )}\n </Box>\n )\n}\n\ninterface CompletedPromptProps {\n cancelled: boolean\n}\n\nconst CompletedPrompt: FunctionComponent<CompletedPromptProps> = ({cancelled}) => (\n <Box>\n <Box width={3}>\n {cancelled ? <Text color=\"red\">{figures.cross}</Text> : <Text color=\"cyan\">{figures.tick}</Text>}\n </Box>\n\n <Box flexGrow={1}>{cancelled ? <Text color=\"red\">Cancelled</Text> : <Text color=\"cyan\">Confirmed</Text>}</Box>\n </Box>\n)\n\nexport {DangerousConfirmationPrompt}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { InlineToken, TokenItem } from './TokenizedText.js';
|
|
2
1
|
import { TextProps } from 'ink';
|
|
3
2
|
import { FunctionComponent } from 'react';
|
|
3
|
+
import type { InlineToken, TokenItem } from './token-item.js';
|
|
4
4
|
export interface CustomListItem {
|
|
5
5
|
type?: string;
|
|
6
6
|
item: TokenItem<InlineToken>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"List.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/List.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"List.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/List.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAC,GAAG,EAAE,IAAI,EAAY,MAAM,KAAK,CAAA;AACxC,OAAO,KAA0B,MAAM,OAAO,CAAA;AAqB9C,MAAM,GAAG,GAAG,GAAG,CAAA;AAEf;;;GAGG;AACH,MAAM,IAAI,GAAiC,CAAC,EAC1C,KAAK,EACL,KAAK,EACL,MAAM,GAAG,IAAI,EACb,OAAO,GAAG,KAAK,EACf,KAAK,EACL,MAAM,GAAG,GAAG,GACb,EAAe,EAAE;IAChB,SAAS,gBAAgB,CAAC,IAA6C;QACrE,OAAQ,IAAuB,CAAC,IAAI,KAAK,SAAS,CAAA;IACpD,CAAC;IAED,SAAS,eAAe,CAAC,IAAc,EAAE,KAAa;QACpD,MAAM,YAAY,GAAG;YACnB,KAAK;YACL,KAAK;YACL,MAAM;YACN,OAAO;YACP,IAAI,EAAE,IAA8B;SACrC,CAAA;QACD,OAAO,gBAAgB,CAAC,IAAI,CAAC;YAC3B,CAAC,CAAC;gBACE,GAAG,YAAY;gBACf,GAAG,IAAI;aACR;YACH,CAAC,CAAC,YAAY,CAAA;IAClB,CAAC;IAUD,MAAM,QAAQ,GAAqC,CAAC,EAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAC,EAAE,EAAE;QAC3F,OAAO,CACL,oBAAC,GAAG,IAAC,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK,IAAG,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAQ;YAE/D,oBAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC;gBAC7B,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK;oBAChB,oBAAC,aAAa,IAAC,IAAI,EAAE,IAAI,GAAI,CACxB,CACH,CACF,CACP,CAAA;IACH,CAAC,CAAA;IAED,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;QACxB,KAAK,CAAC,CAAC,CAAC,CACP,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK;YAChB,oBAAC,aAAa,IAAC,IAAI,EAAE,KAAK,GAAI,CACzB,CACR,CAAC,CAAC,CAAC,IAAI;QACP,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,EAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAC,EAAE,EAAE,CAAC,CACzE,oBAAC,QAAQ,IAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAI,CACnG,CAAC,CACE,CACP,CAAA;AACH,CAAC,CAAA;AAED,OAAO,EAAC,IAAI,EAAC,CAAA","sourcesContent":["import {TokenizedText} from './TokenizedText.js'\nimport {Box, Text, TextProps} from 'ink'\nimport React, {FunctionComponent} from 'react'\nimport type {InlineToken, TokenItem} from './token-item.js'\n\nexport interface CustomListItem {\n type?: string\n item: TokenItem<InlineToken>\n bullet?: string\n color?: TextProps['color']\n}\n\ntype ListItem = TokenItem<InlineToken> | CustomListItem\n\ninterface ListProps {\n title?: TokenItem<InlineToken>\n items: ListItem[]\n ordered?: boolean\n margin?: boolean\n color?: TextProps['color']\n bullet?: string\n}\n\nconst DOT = '•'\n\n/**\n * `List` displays an unordered or ordered list with text aligned with the bullet point\n * and wrapped to the container width.\n */\nconst List: FunctionComponent<ListProps> = ({\n title,\n items,\n margin = true,\n ordered = false,\n color,\n bullet = DOT,\n}): JSX.Element => {\n function isCustomListItem(item: TokenItem<InlineToken> | CustomListItem): item is CustomListItem {\n return (item as CustomListItem).item !== undefined\n }\n\n function resolveListItem(item: ListItem, index: number) {\n const resolvedItem = {\n index,\n color,\n bullet,\n ordered,\n item: item as TokenItem<InlineToken>,\n }\n return isCustomListItem(item)\n ? {\n ...resolvedItem,\n ...item,\n }\n : resolvedItem\n }\n\n interface ListItemProps {\n item: TokenItem<InlineToken>\n color: TextProps['color']\n bullet: string\n index: number\n ordered: boolean\n }\n\n const ListItem: FunctionComponent<ListItemProps> = ({item, color, bullet, index, ordered}) => {\n return (\n <Box key={index} marginLeft={margin ? 2 : 0}>\n <Text color={color}>{ordered ? `${index + 1}.` : bullet}</Text>\n\n <Box flexGrow={1} marginLeft={1}>\n <Text color={color}>\n <TokenizedText item={item} />\n </Text>\n </Box>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\">\n {title ? (\n <Text color={color}>\n <TokenizedText item={title} />\n </Text>\n ) : null}\n {items.map(resolveListItem).map(({index, item, color, bullet, ordered}) => (\n <ListItem key={index} item={item} color={color} bullet={bullet} index={index} ordered={ordered} />\n ))}\n </Box>\n )\n}\n\nexport {List}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { InlineToken, LinkToken, TokenItem, UserInputToken } from '../TokenizedText.js';
|
|
2
1
|
import { TextProps } from 'ink';
|
|
3
2
|
import { FunctionComponent } from 'react';
|
|
3
|
+
import type { InlineToken, LinkToken, TokenItem, UserInputToken } from '../token-item.js';
|
|
4
4
|
export interface InfoMessageProps {
|
|
5
5
|
message: {
|
|
6
6
|
title: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InfoMessage.js","sourceRoot":"","sources":["../../../../../../src/private/node/ui/components/Prompts/InfoMessage.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"InfoMessage.js","sourceRoot":"","sources":["../../../../../../src/private/node/ui/components/Prompts/InfoMessage.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAC,GAAG,EAAE,IAAI,EAAY,MAAM,KAAK,CAAA;AACxC,OAAO,KAA0B,MAAM,OAAO,CAAA;AAa9C,MAAM,WAAW,GAAwC,CAAC,EACxD,OAAO,EAAE,EACP,KAAK,EAAE,EAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAC,EAC3B,IAAI,GACL,GACF,EAAE,EAAE;IACH,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,GAAG,EAAE,CAAC;QAChC,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK;YAChB,oBAAC,aAAa,IAAC,IAAI,EAAE,KAAK,GAAI,CACzB;QACP,oBAAC,aAAa,IAAC,IAAI,EAAE,IAAI,GAAI,CACzB,CACP,CAAA;AACH,CAAC,CAAA;AAED,OAAO,EAAC,WAAW,EAAC,CAAA","sourcesContent":["import {TokenizedText} from '../TokenizedText.js'\nimport {Box, Text, TextProps} from 'ink'\nimport React, {FunctionComponent} from 'react'\nimport type {InlineToken, LinkToken, TokenItem, UserInputToken} from '../token-item.js'\n\nexport interface InfoMessageProps {\n message: {\n title: {\n color?: TextProps['color']\n text: TokenItem<Exclude<InlineToken, UserInputToken | LinkToken>>\n }\n body: TokenItem\n }\n}\n\nconst InfoMessage: FunctionComponent<InfoMessageProps> = ({\n message: {\n title: {color, text: title},\n body,\n },\n}) => {\n return (\n <Box flexDirection=\"column\" gap={1}>\n <Text color={color}>\n <TokenizedText item={title} />\n </Text>\n <TokenizedText item={body} />\n </Box>\n )\n}\n\nexport {InfoMessage}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CustomListItem } from '../List.js';
|
|
2
|
-
import { InlineToken, TokenItem } from '../TokenizedText.js';
|
|
3
2
|
import { TextProps } from 'ink';
|
|
4
3
|
import { FunctionComponent } from 'react';
|
|
4
|
+
import type { InlineToken, TokenItem } from '../token-item.js';
|
|
5
5
|
type Items = (TokenItem<InlineToken> | CustomListItem)[];
|
|
6
6
|
export interface InfoTableSection {
|
|
7
7
|
color?: TextProps['color'];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InfoTable.js","sourceRoot":"","sources":["../../../../../../src/private/node/ui/components/Prompts/InfoTable.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,IAAI,EAAC,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAC,UAAU,EAAC,MAAM,wCAAwC,CAAA;AACjE,OAAO,
|
|
1
|
+
{"version":3,"file":"InfoTable.js","sourceRoot":"","sources":["../../../../../../src/private/node/ui/components/Prompts/InfoTable.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,IAAI,EAAC,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAC,UAAU,EAAC,MAAM,wCAAwC,CAAA;AACjE,OAAO,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAC,GAAG,EAAE,IAAI,EAAY,MAAM,KAAK,CAAA;AACxC,OAAO,KAA0B,MAAM,OAAO,CAAA;AAkB9C,MAAM,SAAS,GAAsC,CAAC,EAAC,KAAK,EAAC,EAAE,EAAE;IAC/D,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACnC,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAClC,MAAM;YAEN,KAAK,EAAE,KAAK,CAAC,MAAM,CAAE;YACrB,KAAK,EAAE,SAAS;YAChB,UAAU,EAAE,SAAS;YACrB,MAAM,EAAE,SAAS;YACjB,cAAc,EAAE,SAAS;SAC1B,CAAC,CAAC,CAAA;IAEP,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAChC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC1B,OAAO,IAAI,CAAC,GAAG,CACb,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACzC,OAAO,IAAI,CAAC,MAAM,CAAA;QACpB,CAAC,CAAC,CACH,CAAA;IACH,CAAC,CAAC,CACH,CAAA;IAED,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,IACxB,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAChC,oBAAC,GAAG,IAAC,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAC,QAAQ;QACzF,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAC5B,oBAAC,GAAG,IAAC,KAAK,EAAE,iBAAiB,GAAG,CAAC;YAC/B,oBAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,UAC7B,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CACtB,CACH,CACP;QACD,oBAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,EAAC,GAAG,EAAE,CAAC;YAC5C,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACtD,oBAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,KAAK;gBACxB,oBAAC,aAAa,IAAC,IAAI,EAAE,EAAC,OAAO,EAAE,OAAO,CAAC,cAAc,EAAC,GAAI,CACrD,CACR,CAAC,CAAC,CAAC,CACF,oBAAC,IAAI,IAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,GAAI,CAC5F;YACA,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,oBAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAG,OAAO,CAAC,UAAU,CAAQ,CAAC,CAAC,CAAC,IAAI,CAChF,CACF,CACP,CAAC,CACE,CACP,CAAA;AACH,CAAC,CAAA;AAED,OAAO,EAAC,SAAS,EAAC,CAAA","sourcesContent":["import {CustomListItem, List} from '../List.js'\nimport {capitalize} from '../../../../../public/common/string.js'\nimport {TokenizedText} from '../TokenizedText.js'\nimport {Box, Text, TextProps} from 'ink'\nimport React, {FunctionComponent} from 'react'\nimport type {InlineToken, TokenItem} from '../token-item.js'\n\ntype Items = (TokenItem<InlineToken> | CustomListItem)[]\n\nexport interface InfoTableSection {\n color?: TextProps['color']\n header: string\n bullet?: string\n helperText?: string\n items: Items\n emptyItemsText?: string\n}\n\nexport interface InfoTableProps {\n table: Record<string, Items> | InfoTableSection[]\n}\n\nconst InfoTable: FunctionComponent<InfoTableProps> = ({table}) => {\n const sections = Array.isArray(table)\n ? table\n : Object.keys(table).map((header) => ({\n header,\n\n items: table[header]!,\n color: undefined,\n helperText: undefined,\n bullet: undefined,\n emptyItemsText: undefined,\n }))\n\n const headerColumnWidth = Math.max(\n ...sections.map((section) => {\n return Math.max(\n ...section.header.split('\\n').map((line) => {\n return line.length\n }),\n )\n }),\n )\n\n return (\n <Box flexDirection=\"column\">\n {sections.map((section, index) => (\n <Box key={index} marginBottom={index === sections.length - 1 ? 0 : 1} flexDirection=\"column\">\n {section.header.length > 0 && (\n <Box width={headerColumnWidth + 1}>\n <Text color={section.color} bold>\n {capitalize(section.header)}\n </Text>\n </Box>\n )}\n <Box flexGrow={1} flexDirection=\"column\" gap={1}>\n {section.emptyItemsText && section.items.length === 0 ? (\n <Text color={section.color}>\n <TokenizedText item={{subdued: section.emptyItemsText}} />\n </Text>\n ) : (\n <List margin={false} items={section.items} color={section.color} bullet={section.bullet} />\n )}\n {section.helperText ? <Text color={section.color}>{section.helperText}</Text> : null}\n </Box>\n </Box>\n ))}\n </Box>\n )\n}\n\nexport {InfoTable}\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { InfoTableProps } from './InfoTable.js';
|
|
2
2
|
import { InfoMessageProps } from './InfoMessage.js';
|
|
3
|
-
import { InlineToken, LinkToken, TokenItem } from '../TokenizedText.js';
|
|
4
3
|
import { AbortSignal } from '../../../../../public/node/abort.js';
|
|
5
4
|
import { PromptState } from '../../hooks/use-prompt.js';
|
|
6
5
|
import { ReactElement } from 'react';
|
|
6
|
+
import type { InlineToken, LinkToken, TokenItem } from '../token-item.js';
|
|
7
7
|
export type Message = TokenItem<Exclude<InlineToken, LinkToken>>;
|
|
8
8
|
interface PromptLayoutProps {
|
|
9
9
|
message: Message;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PromptLayout.js","sourceRoot":"","sources":["../../../../../../src/private/node/ui/components/Prompts/PromptLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAiB,MAAM,gBAAgB,CAAA;AACxD,OAAO,EAAC,WAAW,EAAmB,MAAM,kBAAkB,CAAA;AAC9D,OAAO,
|
|
1
|
+
{"version":3,"file":"PromptLayout.js","sourceRoot":"","sources":["../../../../../../src/private/node/ui/components/Prompts/PromptLayout.tsx"],"names":[],"mappings":"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","sourcesContent":["import {InfoTable, InfoTableProps} from './InfoTable.js'\nimport {InfoMessage, InfoMessageProps} from './InfoMessage.js'\nimport {TokenizedText} from '../TokenizedText.js'\nimport {messageWithPunctuation} from '../../utilities.js'\nimport {AbortSignal} from '../../../../../public/node/abort.js'\nimport useAbortSignal from '../../hooks/use-abort-signal.js'\nimport {PromptState} from '../../hooks/use-prompt.js'\nimport React, {ReactElement, cloneElement, useCallback, useLayoutEffect, useState} from 'react'\n\nimport {Box, measureElement, Text, useStdout, DOMElement} from 'ink'\nimport figures from 'figures'\nimport type {InlineToken, LinkToken, TokenItem} from '../token-item.js'\n\nexport type Message = TokenItem<Exclude<InlineToken, LinkToken>>\n\ninterface PromptLayoutProps {\n message: Message\n infoTable?: InfoTableProps['table']\n abortSignal?: AbortSignal\n infoMessage?: InfoMessageProps['message']\n header?: ReactElement | null\n state: PromptState\n submittedAnswerLabel?: string\n input: ReactElement\n}\n\nconst PromptLayout = ({\n message,\n infoTable,\n abortSignal,\n infoMessage,\n header,\n state,\n input,\n submittedAnswerLabel,\n}: PromptLayoutProps): ReactElement | null => {\n const {stdout} = useStdout()\n const [wrapperHeight, setWrapperHeight] = useState(0)\n const [promptAreaHeight, setPromptAreaHeight] = useState(0)\n const [inputFixedAreaHeight, setInputFixedAreaHeight] = useState(0)\n const currentAvailableLines = stdout.rows - promptAreaHeight - inputFixedAreaHeight\n const [availableLines, setAvailableLines] = useState(currentAvailableLines)\n\n const wrapperRef = useCallback(\n (node: DOMElement | null) => {\n if (node !== null) {\n const {height} = measureElement(node)\n if (wrapperHeight !== height) {\n setWrapperHeight(height)\n }\n }\n },\n [wrapperHeight],\n )\n\n const promptAreaRef = useCallback((node: DOMElement | null) => {\n if (node !== null) {\n const {height} = measureElement(node)\n setPromptAreaHeight(height)\n }\n }, [])\n\n const inputFixedAreaRef = useCallback((node: DOMElement | null) => {\n if (node !== null) {\n const {height} = measureElement(node)\n // + 3 accounts for the margins inside the input elements and the last empty line of the terminal\n setInputFixedAreaHeight(height + 3)\n }\n }, [])\n\n const inputComponent = cloneElement(input, {availableLines, inputFixedAreaRef})\n\n useLayoutEffect(() => {\n function onResize() {\n const newAvailableLines = stdout.rows - promptAreaHeight - inputFixedAreaHeight\n if (newAvailableLines !== availableLines) {\n setAvailableLines(newAvailableLines)\n }\n }\n\n onResize()\n\n stdout.on('resize', onResize)\n return () => {\n stdout.off('resize', onResize)\n }\n }, [wrapperHeight, promptAreaHeight, stdout, availableLines, inputFixedAreaHeight])\n\n const {isAborted} = useAbortSignal(abortSignal)\n // Object.keys on an array returns the indices as strings\n const showInfoTable = infoTable && Object.keys(infoTable).length > 0\n\n return isAborted ? null : (\n <Box flexDirection=\"column\" marginBottom={1} ref={wrapperRef}>\n <Box ref={promptAreaRef} flexDirection=\"column\">\n <Box>\n <Box marginRight={2}>\n <Text>?</Text>\n </Box>\n <TokenizedText item={messageWithPunctuation(message)} />\n {header}\n </Box>\n\n {(showInfoTable || infoMessage) && state !== PromptState.Submitted ? (\n <Box\n marginTop={1}\n marginLeft={3}\n paddingLeft={2}\n borderStyle=\"bold\"\n borderLeft\n borderRight={false}\n borderTop={false}\n borderBottom={false}\n flexDirection=\"column\"\n gap={1}\n >\n {infoMessage ? <InfoMessage message={infoMessage} /> : null}\n {showInfoTable ? <InfoTable table={infoTable} /> : null}\n </Box>\n ) : null}\n </Box>\n\n {state === PromptState.Submitted && submittedAnswerLabel ? (\n <Box>\n <Box width={3}>\n <Text color=\"cyan\">{figures.tick}</Text>\n </Box>\n\n <Text color=\"cyan\">{submittedAnswerLabel}</Text>\n </Box>\n ) : (\n <Box marginTop={1}>{inputComponent}</Box>\n )}\n </Box>\n )\n}\n\nexport {PromptLayout}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SingleTask.test.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/SingleTask.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import {SingleTask} from './SingleTask.js'\nimport {render} from '../../testing/ui.js'\nimport {TokenizedString} from '../../../../public/node/output.js'\nimport React from 'react'\n\nimport {describe, expect, test} from 'vitest'\n\ndescribe('SingleTask', () => {\n test('unmounts when promise resolves successfully', async () => {\n // Given\n const title = new TokenizedString('Uploading files')\n let resolvePromise: (value: string) => void\n const task = () =>\n new Promise<string>((resolve) => {\n resolvePromise = resolve\n })\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n\n // Wait for initial render\n await new Promise((resolve) => setTimeout(resolve, 10))\n\n // Resolve the promise\n resolvePromise!('success')\n\n // Wait for component to update and unmount\n await renderInstance.waitUntilExit()\n\n // Then - component should unmount cleanly\n expect(renderInstance.lastFrame()).toBeDefined()\n })\n\n test('unmounts when promise rejects', async () => {\n // Given\n const title = new TokenizedString('Failed task')\n let rejectPromise: (error: Error) => void\n const task = () =>\n new Promise<string>((resolve, reject) => {\n rejectPromise = reject\n })\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n\n // Wait for initial render\n await new Promise((resolve) => setTimeout(resolve, 10))\n\n // Reject the promise and expect waitUntilExit to reject\n rejectPromise!(new Error('Task failed'))\n\n // The component should exit with the error\n await expect(renderInstance.waitUntilExit()).rejects.toThrow('Task failed')\n })\n\n test('handles promise that resolves immediately', async () => {\n // Given\n const title = new TokenizedString('Instant task')\n const task = () => Promise.resolve('immediate success')\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n await renderInstance.waitUntilExit()\n\n // Then - component should complete successfully\n expect(renderInstance.lastFrame()).toBeDefined()\n })\n\n test('handles promise that rejects immediately', async () => {\n // Given\n const title = new TokenizedString('Instant failure')\n const task = () => Promise.reject(new Error('Immediate error'))\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n\n // Then - should exit with error\n await expect(renderInstance.waitUntilExit()).rejects.toThrow('Immediate error')\n })\n\n test('handles different types of promise return values', async () => {\n // Test with string\n let stringResult: string | undefined\n const stringTask = () => Promise.resolve('task completed')\n const stringRender = render(\n <SingleTask\n title={new TokenizedString('String task')}\n task={stringTask}\n onComplete={(result) => (stringResult = result)}\n />,\n )\n await stringRender.waitUntilExit()\n expect(stringRender.lastFrame()).toBeDefined()\n expect(stringResult).toBe('task completed')\n\n // Test with object\n let objectResult: {id: number; name: string} | undefined\n const objectTask = () => Promise.resolve({id: 1, name: 'test'})\n const objectRender = render(\n <SingleTask\n title={new TokenizedString('Object task')}\n task={objectTask}\n onComplete={(result) => (objectResult = result)}\n />,\n )\n await objectRender.waitUntilExit()\n expect(objectRender.lastFrame()).toBeDefined()\n\n // Test with number\n let numberResult: number | undefined\n const numberTask = () => Promise.resolve(42)\n const numberRender = render(\n <SingleTask\n title={new TokenizedString('Number task')}\n task={numberTask}\n onComplete={(result) => (numberResult = result)}\n />,\n )\n await numberRender.waitUntilExit()\n expect(numberRender.lastFrame()).toBeDefined()\n expect(numberResult).toBe(42)\n\n // Test with boolean\n let booleanResult: boolean | undefined\n const booleanTask = () => Promise.resolve(true)\n const booleanRender = render(\n <SingleTask\n title={new TokenizedString('Boolean task')}\n task={booleanTask}\n onComplete={(result) => (booleanResult = result)}\n />,\n )\n await booleanRender.waitUntilExit()\n expect(booleanRender.lastFrame()).toBeDefined()\n expect(booleanResult).toBe(true)\n })\n\n test('handles promise with delayed resolution', async () => {\n // Given\n const title = new TokenizedString('Delayed task')\n const task = () =>\n new Promise<string>((resolve) => {\n setTimeout(() => resolve('completed'), 100)\n })\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n\n // Wait for completion\n await renderInstance.waitUntilExit()\n\n // Then\n expect(renderInstance.lastFrame()).toBeDefined()\n })\n\n test('handles promise with delayed rejection', async () => {\n // Given\n const title = new TokenizedString('Delayed failure')\n const task = () =>\n new Promise<string>((resolve, reject) => {\n setTimeout(() => reject(new Error('delayed error')), 100)\n })\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n\n // Wait for completion - should throw error\n await expect(renderInstance.waitUntilExit()).rejects.toThrow('delayed error')\n })\n\n test('preserves error types and messages', async () => {\n // Test with custom error\n class CustomError extends Error {\n constructor(\n message: string,\n public code: string,\n ) {\n super(message)\n this.name = 'CustomError'\n }\n }\n\n const customError = new CustomError('Custom error message', 'CUSTOM_CODE')\n const task = () => Promise.reject(customError)\n\n // When\n const renderInstance = render(<SingleTask title={new TokenizedString('Custom error task')} task={task} />)\n\n // Then - should preserve the exact error\n await expect(renderInstance.waitUntilExit()).rejects.toThrow('Custom error message')\n })\n\n test('handles concurrent promise operations', async () => {\n // Given - Multiple SingleTask components with different promises\n const fastPromise = () => new Promise((resolve) => setTimeout(() => resolve('fast'), 50))\n const slowPromise = () => new Promise((resolve) => setTimeout(() => resolve('slow'), 150))\n\n // When\n const fastRender = render(<SingleTask title={new TokenizedString('Fast task')} task={fastPromise} />)\n const slowRender = render(<SingleTask title={new TokenizedString('Slow task')} task={slowPromise} />)\n\n // Then - Both should complete successfully\n await fastRender.waitUntilExit()\n await slowRender.waitUntilExit()\n\n expect(fastRender.lastFrame()).toBeDefined()\n expect(slowRender.lastFrame()).toBeDefined()\n })\n\n test('passes noColor prop to LoadingBar component', async () => {\n // Given\n const title = new TokenizedString('No color task')\n const task = () => Promise.resolve()\n\n // When - Test that noColor prop doesn't break the component\n const renderInstance = render(<SingleTask title={title} task={task} noColor />)\n await renderInstance.waitUntilExit()\n\n // Then - Component should complete successfully with noColor prop\n expect(renderInstance.lastFrame()).toBeDefined()\n })\n\n test('updates status message during task execution', async () => {\n // Given\n const initialTitle = new TokenizedString('Starting task')\n let step1Resolve: () => void\n let step2Resolve: () => void\n let step3Resolve: () => void\n\n const step1Promise = new Promise<void>((resolve) => {\n step1Resolve = resolve\n })\n const step2Promise = new Promise<void>((resolve) => {\n step2Resolve = resolve\n })\n const step3Promise = new Promise<void>((resolve) => {\n step3Resolve = resolve\n })\n\n const task = async (updateStatus: (status: TokenizedString) => void) => {\n updateStatus(new TokenizedString('Running (1 complete)...'))\n await step1Promise\n\n updateStatus(new TokenizedString('Running (2 complete)...'))\n await step2Promise\n\n updateStatus(new TokenizedString('Running (3 complete)...'))\n await step3Promise\n\n return 'completed'\n }\n\n // When\n const renderInstance = render(<SingleTask title={initialTitle} task={task} />)\n\n // Wait for component to render with first status\n await new Promise((resolve) => setTimeout(resolve, 10))\n const frame1 = renderInstance.lastFrame()\n expect(frame1).toContain('1 complete')\n\n // Progress to step 2\n step1Resolve!()\n await new Promise((resolve) => setTimeout(resolve, 10))\n const frame2 = renderInstance.lastFrame()\n expect(frame2).toContain('2 complete')\n\n // Progress to step 3\n step2Resolve!()\n await new Promise((resolve) => setTimeout(resolve, 10))\n const frame3 = renderInstance.lastFrame()\n expect(frame3).toContain('3 complete')\n\n // Complete the task\n step3Resolve!()\n await renderInstance.waitUntilExit()\n })\n})\n"]}
|
|
1
|
+
{"version":3,"file":"SingleTask.test.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/SingleTask.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import {SingleTask} from './SingleTask.js'\nimport {render} from '../../testing/ui.js'\nimport {TokenizedString} from '../../../../public/node/output.js'\nimport React from 'react'\n\nimport {describe, expect, test} from 'vitest'\n\ndescribe('SingleTask', () => {\n test('unmounts when promise resolves successfully', async () => {\n // Given\n const title = new TokenizedString('Uploading files')\n let resolvePromise: (value: string) => void\n const task = () =>\n new Promise<string>((resolve) => {\n resolvePromise = resolve\n })\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n\n // Wait for initial render\n await new Promise((resolve) => setTimeout(resolve, 10))\n\n // Resolve the promise\n resolvePromise!('success')\n\n // Wait for component to update and unmount\n await renderInstance.waitUntilExit()\n\n // Then - component should unmount cleanly\n expect(renderInstance.lastFrame()).toBeDefined()\n })\n\n test('unmounts when promise rejects', async () => {\n // Given\n const title = new TokenizedString('Failed task')\n let rejectPromise: (error: Error) => void\n const task = () =>\n new Promise<string>((resolve, reject) => {\n rejectPromise = reject\n })\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n\n // Wait for initial render\n await new Promise((resolve) => setTimeout(resolve, 10))\n\n // Reject the promise and expect waitUntilExit to reject\n rejectPromise!(new Error('Task failed'))\n\n // The component should exit with the error\n await expect(renderInstance.waitUntilExit()).rejects.toThrow('Task failed')\n })\n\n test('handles promise that resolves immediately', async () => {\n // Given\n const title = new TokenizedString('Instant task')\n const task = () => Promise.resolve('immediate success')\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n await renderInstance.waitUntilExit()\n\n // Then - component should complete successfully\n expect(renderInstance.lastFrame()).toBeDefined()\n })\n\n test('handles promise that rejects immediately', async () => {\n // Given\n const title = new TokenizedString('Instant failure')\n const task = () => Promise.reject(new Error('Immediate error'))\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n\n // Then - should exit with error\n await expect(renderInstance.waitUntilExit()).rejects.toThrow('Immediate error')\n })\n\n test('handles different types of promise return values', async () => {\n // Test with string\n let stringResult: string | undefined\n const stringTask = () => Promise.resolve('task completed')\n const stringRender = render(\n <SingleTask\n title={new TokenizedString('String task')}\n task={stringTask}\n onComplete={(result) => (stringResult = result)}\n />,\n )\n await stringRender.waitUntilExit()\n expect(stringRender.lastFrame()).toBeDefined()\n expect(stringResult).toBe('task completed')\n\n // Test with object\n let objectResult: {id: number; name: string} | undefined\n const objectTask = () => Promise.resolve({id: 1, name: 'test'})\n const objectRender = render(\n <SingleTask\n title={new TokenizedString('Object task')}\n task={objectTask}\n onComplete={(result) => (objectResult = result)}\n />,\n )\n await objectRender.waitUntilExit()\n expect(objectRender.lastFrame()).toBeDefined()\n\n // Test with number\n let numberResult: number | undefined\n const numberTask = () => Promise.resolve(42)\n const numberRender = render(\n <SingleTask\n title={new TokenizedString('Number task')}\n task={numberTask}\n onComplete={(result) => (numberResult = result)}\n />,\n )\n await numberRender.waitUntilExit()\n expect(numberRender.lastFrame()).toBeDefined()\n expect(numberResult).toBe(42)\n\n // Test with boolean\n let booleanResult: boolean | undefined\n const booleanTask = () => Promise.resolve(true)\n const booleanRender = render(\n <SingleTask\n title={new TokenizedString('Boolean task')}\n task={booleanTask}\n onComplete={(result) => (booleanResult = result)}\n />,\n )\n await booleanRender.waitUntilExit()\n expect(booleanRender.lastFrame()).toBeDefined()\n expect(booleanResult).toBe(true)\n })\n\n test('handles promise with delayed resolution', async () => {\n // Given\n const title = new TokenizedString('Delayed task')\n const task = () =>\n new Promise<string>((resolve) => {\n setTimeout(() => resolve('completed'), 100)\n })\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n\n // Wait for completion\n await renderInstance.waitUntilExit()\n\n // Then\n expect(renderInstance.lastFrame()).toBeDefined()\n })\n\n test('handles promise with delayed rejection', async () => {\n // Given\n const title = new TokenizedString('Delayed failure')\n const task = () =>\n new Promise<string>((resolve, reject) => {\n setTimeout(() => reject(new Error('delayed error')), 100)\n })\n\n // When\n const renderInstance = render(<SingleTask title={title} task={task} />)\n\n // Wait for completion - should throw error\n await expect(renderInstance.waitUntilExit()).rejects.toThrow('delayed error')\n })\n\n test('preserves error types and messages', async () => {\n // Test with custom error\n class CustomError extends Error {\n constructor(\n message: string,\n public code: string,\n ) {\n super(message)\n this.name = 'CustomError'\n }\n }\n\n const customError = new CustomError('Custom error message', 'CUSTOM_CODE')\n const task = () => Promise.reject(customError)\n\n // When\n const renderInstance = render(<SingleTask title={new TokenizedString('Custom error task')} task={task} />)\n\n // Then - should preserve the exact error\n await expect(renderInstance.waitUntilExit()).rejects.toThrow('Custom error message')\n })\n\n test('handles concurrent promise operations', async () => {\n // Given - Multiple SingleTask components with different promises\n const fastPromise = () => new Promise((resolve) => setTimeout(() => resolve('fast'), 50))\n const slowPromise = () => new Promise((resolve) => setTimeout(() => resolve('slow'), 150))\n\n // When\n const fastRender = render(<SingleTask title={new TokenizedString('Fast task')} task={fastPromise} />)\n const slowRender = render(<SingleTask title={new TokenizedString('Slow task')} task={slowPromise} />)\n\n // Then - Both should complete successfully\n await fastRender.waitUntilExit()\n await slowRender.waitUntilExit()\n\n expect(fastRender.lastFrame()).toBeDefined()\n expect(slowRender.lastFrame()).toBeDefined()\n })\n\n test('passes noColor prop to LoadingBar component', async () => {\n // Given\n const title = new TokenizedString('No color task')\n const task = () => Promise.resolve()\n\n // When - Test that noColor prop doesn't break the component\n const renderInstance = render(<SingleTask title={title} task={task} noColor />)\n await renderInstance.waitUntilExit()\n\n // Then - Component should complete successfully with noColor prop\n expect(renderInstance.lastFrame()).toBeDefined()\n })\n\n test('updates status message during task execution', async () => {\n // Given\n const initialTitle = new TokenizedString('Starting task')\n let step1Resolve: () => void\n let step2Resolve: () => void\n let step3Resolve: () => void\n\n const step1Promise = new Promise<void>((resolve) => {\n step1Resolve = resolve\n })\n const step2Promise = new Promise<void>((resolve) => {\n step2Resolve = resolve\n })\n const step3Promise = new Promise<void>((resolve) => {\n step3Resolve = resolve\n })\n\n const task = async (updateStatus: (status: TokenizedString) => void) => {\n updateStatus(new TokenizedString('Running (1 complete)...'))\n await step1Promise\n\n updateStatus(new TokenizedString('Running (2 complete)...'))\n await step2Promise\n\n updateStatus(new TokenizedString('Running (3 complete)...'))\n await step3Promise\n\n return 'completed'\n }\n\n // When\n const renderInstance = render(<SingleTask title={initialTitle} task={task} />)\n\n // Wait for component to render with first status\n await new Promise((resolve) => setTimeout(resolve, 10))\n const frame1 = renderInstance.lastFrame()\n expect(frame1).toContain('1 complete')\n\n // Progress to step 2\n step1Resolve!()\n await new Promise((resolve) => setTimeout(resolve, 10))\n const frame2 = renderInstance.lastFrame()\n expect(frame2).toContain('2 complete')\n\n // Progress to step 3\n step2Resolve!()\n await new Promise((resolve) => setTimeout(resolve, 10))\n const frame3 = renderInstance.lastFrame()\n expect(frame3).toContain('3 complete')\n\n // Complete the task\n step3Resolve!()\n await renderInstance.waitUntilExit()\n })\n})\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { TokenizedText
|
|
1
|
+
import { TokenizedText } from './TokenizedText.js';
|
|
2
|
+
import { tokenItemToString } from './token-item.js';
|
|
2
3
|
import { unstyled } from '../../../../public/node/output.js';
|
|
3
4
|
import { Box } from 'ink';
|
|
4
5
|
import React from 'react';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TabularData.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/TabularData.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"TabularData.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/TabularData.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAC,iBAAiB,EAAmB,MAAM,iBAAiB,CAAA;AACnE,OAAO,EAAC,QAAQ,EAAC,MAAM,mCAAmC,CAAA;AAC1D,OAAO,EAAC,GAAG,EAAC,MAAM,KAAK,CAAA;AACvB,OAAO,KAA0B,MAAM,OAAO,CAAA;AAO9C,MAAM,WAAW,GAAwC,CAAC,EAAC,WAAW,EAAE,IAAI,EAAE,kBAAkB,EAAC,EAAE,EAAE;IACnG,MAAM,YAAY,GAAa,IAAI,CAAC,MAAM,CAAW,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAChE,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC1B,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QAClF,CAAC,CAAC,CAAA;QACF,OAAO,GAAG,CAAA;IACZ,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,IACxB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CACxB,oBAAC,GAAG,IAAC,GAAG,EAAE,KAAK,EAAE,aAAa,EAAC,KAAK,EAAC,GAAG,EAAE,CAAC,IACxC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CACxB,oBAAC,GAAG,IAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,oBAAC,aAAa,IACZ,IAAI,EAAE,KAAK,KAAK,CAAC,IAAI,kBAAkB,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC,IAAI,GAC5F,CACE,CACP,CAAC,CACE,CACP,CAAC,CACE,CACP,CAAA;AACH,CAAC,CAAA;AAED,OAAO,EAAC,WAAW,EAAC,CAAA","sourcesContent":["import {TokenizedText} from './TokenizedText.js'\nimport {tokenItemToString, type InlineToken} from './token-item.js'\nimport {unstyled} from '../../../../public/node/output.js'\nimport {Box} from 'ink'\nimport React, {FunctionComponent} from 'react'\n\nexport interface TabularDataProps {\n tabularData: InlineToken[][]\n firstColumnSubdued?: boolean\n}\n\nconst TabularData: FunctionComponent<TabularDataProps> = ({tabularData: data, firstColumnSubdued}) => {\n const columnWidths: number[] = data.reduce<number[]>((acc, row) => {\n row.forEach((cell, index) => {\n acc[index] = Math.max(acc[index] ?? 0, unstyled(tokenItemToString(cell)).length)\n })\n return acc\n }, [])\n\n return (\n <Box flexDirection=\"column\">\n {data.map((row, index) => (\n <Box key={index} flexDirection=\"row\" gap={2}>\n {row.map((cell, index) => (\n <Box key={index} width={columnWidths[index] ?? 0} flexShrink={index === 0 ? 0 : 1}>\n <TokenizedText\n item={index === 0 && firstColumnSubdued && typeof cell === 'string' ? {subdued: cell} : cell}\n />\n </Box>\n ))}\n </Box>\n ))}\n </Box>\n )\n}\n\nexport {TabularData}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { InlineToken, TokenItem } from './TokenizedText.js';
|
|
2
1
|
import { AbortSignal } from '../../../../public/node/abort.js';
|
|
3
2
|
import { FunctionComponent } from 'react';
|
|
3
|
+
import type { InlineToken, TokenItem } from './token-item.js';
|
|
4
4
|
export interface TextPromptProps {
|
|
5
5
|
message: TokenItem;
|
|
6
6
|
onSubmit: (value: string) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextPrompt.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/TextPrompt.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"TextPrompt.js","sourceRoot":"","sources":["../../../../../src/private/node/ui/components/TextPrompt.tsx"],"names":[],"mappings":"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","sourcesContent":["import {TokenizedText} from './TokenizedText.js'\nimport {TextInput} from './TextInput.js'\nimport {handleCtrlC, useComplete} from '../../ui.js'\nimport useLayout from '../hooks/use-layout.js'\nimport {messageWithPunctuation} from '../utilities.js'\nimport {AbortSignal} from '../../../../public/node/abort.js'\nimport useAbortSignal from '../hooks/use-abort-signal.js'\nimport usePrompt, {PromptState} from '../hooks/use-prompt.js'\nimport React, {FunctionComponent, useCallback, useEffect, useState} from 'react'\n\nimport {Box, useInput, Text} from 'ink'\nimport figures from 'figures'\nimport type {InlineToken, TokenItem} from './token-item.js'\n\nexport interface TextPromptProps {\n message: TokenItem\n onSubmit: (value: string) => void\n defaultValue?: string\n password?: boolean\n validate?: (value: string) => string | undefined\n allowEmpty?: boolean\n emptyDisplayedValue?: string\n abortSignal?: AbortSignal\n preview?: (value: string) => TokenItem<InlineToken>\n initialAnswer?: string\n}\n\nconst TextPrompt: FunctionComponent<TextPromptProps> = ({\n message,\n onSubmit,\n validate,\n defaultValue = '',\n password = false,\n allowEmpty = false,\n emptyDisplayedValue = '(empty)',\n abortSignal,\n preview,\n initialAnswer = '',\n}) => {\n if (password && defaultValue) {\n throw new Error(\"Can't use defaultValue with password\")\n }\n\n const validateAnswer = useCallback(\n (value: string): string | undefined => {\n if (validate) {\n return validate(value)\n }\n\n if (value.length === 0 && !allowEmpty) return 'Type an answer to the prompt.'\n\n return undefined\n },\n [allowEmpty, validate],\n )\n\n const {oneThird} = useLayout()\n const {promptState, setPromptState, answer, setAnswer} = usePrompt<string>({\n initialAnswer,\n })\n const answerOrDefault = answer.length > 0 ? answer : defaultValue\n const displayEmptyValue = answerOrDefault === ''\n const displayedAnswer = displayEmptyValue ? emptyDisplayedValue : answerOrDefault\n const complete = useComplete()\n const [error, setError] = useState<string | undefined>(undefined)\n const color = promptState === PromptState.Error ? 'red' : 'cyan'\n const underline = new Array(oneThird - 3).fill('▔')\n const {isAborted} = useAbortSignal(abortSignal)\n\n useInput((input, key) => {\n handleCtrlC(input, key)\n\n if (key.return) {\n const error = validateAnswer(answerOrDefault)\n\n if (error) {\n setPromptState(PromptState.Error)\n setError(error)\n } else {\n setPromptState(PromptState.Submitted)\n }\n }\n })\n\n useEffect(() => {\n if (promptState === PromptState.Submitted) {\n onSubmit(answerOrDefault)\n complete()\n }\n }, [answerOrDefault, onSubmit, promptState, complete])\n\n return isAborted ? null : (\n <Box flexDirection=\"column\" marginBottom={1} width={oneThird}>\n <Box>\n <Box marginRight={2}>\n <Text>?</Text>\n </Box>\n <TokenizedText item={messageWithPunctuation(message)} />\n </Box>\n {promptState === PromptState.Submitted ? (\n <Box>\n <Box width={3}>\n <Text color=\"cyan\">{figures.tick}</Text>\n </Box>\n\n <Box flexGrow={1}>\n <Text color=\"cyan\" dimColor={displayEmptyValue}>\n {password ? '*'.repeat(answer.length) : displayedAnswer}\n </Text>\n </Box>\n </Box>\n ) : (\n <Box flexDirection=\"column\">\n <Box>\n <Box marginRight={2}>\n <Text color={color}>{`>`}</Text>\n </Box>\n <Box flexGrow={1}>\n <TextInput\n value={answer}\n onChange={(answer) => {\n setAnswer(answer)\n setPromptState(PromptState.Idle)\n }}\n defaultValue={defaultValue}\n color={color}\n password={password}\n />\n </Box>\n </Box>\n <Box marginLeft={3}>\n <Text color={color}>{underline}</Text>\n </Box>\n {promptState === PromptState.Error ? (\n <Box marginLeft={3}>\n <Text color={color}>{error}</Text>\n </Box>\n ) : null}\n {promptState !== PromptState.Error && preview ? (\n <Box marginLeft={3}>\n <TokenizedText item={preview(answerOrDefault)} />\n </Box>\n ) : null}\n </Box>\n )}\n </Box>\n )\n}\n\nexport {TextPrompt}\n"]}
|
|
@@ -1,42 +1,5 @@
|
|
|
1
1
|
import { FunctionComponent } from 'react';
|
|
2
|
-
|
|
3
|
-
link: {
|
|
4
|
-
label?: string;
|
|
5
|
-
url: string;
|
|
6
|
-
};
|
|
7
|
-
}
|
|
8
|
-
export interface UserInputToken {
|
|
9
|
-
userInput: string;
|
|
10
|
-
}
|
|
11
|
-
export interface ListToken {
|
|
12
|
-
list: {
|
|
13
|
-
title?: TokenItem<InlineToken>;
|
|
14
|
-
items: TokenItem<InlineToken>[];
|
|
15
|
-
ordered?: boolean;
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
export interface BoldToken {
|
|
19
|
-
bold: string;
|
|
20
|
-
}
|
|
21
|
-
export type Token = string | {
|
|
22
|
-
command: string;
|
|
23
|
-
} | LinkToken | {
|
|
24
|
-
char: string;
|
|
25
|
-
} | UserInputToken | {
|
|
26
|
-
subdued: string;
|
|
27
|
-
} | {
|
|
28
|
-
filePath: string;
|
|
29
|
-
} | ListToken | BoldToken | {
|
|
30
|
-
info: string;
|
|
31
|
-
} | {
|
|
32
|
-
warn: string;
|
|
33
|
-
} | {
|
|
34
|
-
error: string;
|
|
35
|
-
};
|
|
36
|
-
export type InlineToken = Exclude<Token, ListToken>;
|
|
37
|
-
export type TokenItem<T extends Token = Token> = T | T[];
|
|
38
|
-
export declare function tokenItemToString(token: TokenItem): string;
|
|
39
|
-
export declare function appendToTokenItem(token: TokenItem, suffix: string): TokenItem;
|
|
2
|
+
import type { TokenItem } from './token-item.js';
|
|
40
3
|
interface TokenizedTextProps {
|
|
41
4
|
item: TokenItem;
|
|
42
5
|
}
|