ink 4.0.0 → 4.2.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/build/components/Box.d.ts +2 -76
- package/build/components/Box.js +6 -13
- package/build/components/Box.js.map +1 -1
- package/build/dom.d.ts +3 -3
- package/build/dom.js +2 -5
- package/build/dom.js.map +1 -1
- package/build/get-max-width.d.ts +2 -2
- package/build/get-max-width.js +2 -1
- package/build/get-max-width.js.map +1 -1
- package/build/hooks/use-input.js +29 -33
- package/build/hooks/use-input.js.map +1 -1
- package/build/ink.d.ts +2 -0
- package/build/ink.js +29 -7
- package/build/ink.js.map +1 -1
- package/build/output.d.ts +9 -1
- package/build/output.js +87 -20
- package/build/output.js.map +1 -1
- package/build/parse-keypress.d.ts +14 -0
- package/build/parse-keypress.js +225 -0
- package/build/parse-keypress.js.map +1 -0
- package/build/reconciler.js +58 -57
- package/build/reconciler.js.map +1 -1
- package/build/render-border.js +47 -10
- package/build/render-border.js.map +1 -1
- package/build/render-node-to-output.js +28 -1
- package/build/render-node-to-output.js.map +1 -1
- package/build/renderer.d.ts +1 -1
- package/build/renderer.js +1 -4
- package/build/renderer.js.map +1 -1
- package/build/styles.d.ts +107 -4
- package/build/styles.js +56 -7
- package/build/styles.js.map +1 -1
- package/package.json +11 -5
- package/readme.md +234 -29
|
@@ -2,85 +2,11 @@ import React from 'react';
|
|
|
2
2
|
import { type Except } from 'type-fest';
|
|
3
3
|
import { type Styles } from '../styles.js';
|
|
4
4
|
import { type DOMElement } from '../dom.js';
|
|
5
|
-
export type Props = Except<Styles, 'textWrap'
|
|
6
|
-
/**
|
|
7
|
-
* Margin on all sides. Equivalent to setting `marginTop`, `marginBottom`, `marginLeft` and `marginRight`.
|
|
8
|
-
*
|
|
9
|
-
* @default 0
|
|
10
|
-
*/
|
|
11
|
-
readonly margin?: number;
|
|
12
|
-
/**
|
|
13
|
-
* Horizontal margin. Equivalent to setting `marginLeft` and `marginRight`.
|
|
14
|
-
*
|
|
15
|
-
* @default 0
|
|
16
|
-
*/
|
|
17
|
-
readonly marginX?: number;
|
|
18
|
-
/**
|
|
19
|
-
* Vertical margin. Equivalent to setting `marginTop` and `marginBottom`.
|
|
20
|
-
*
|
|
21
|
-
* @default 0
|
|
22
|
-
*/
|
|
23
|
-
readonly marginY?: number;
|
|
24
|
-
/**
|
|
25
|
-
* Padding on all sides. Equivalent to setting `paddingTop`, `paddingBottom`, `paddingLeft` and `paddingRight`.
|
|
26
|
-
*
|
|
27
|
-
* @default 0
|
|
28
|
-
*/
|
|
29
|
-
readonly padding?: number;
|
|
30
|
-
/**
|
|
31
|
-
* Horizontal padding. Equivalent to setting `paddingLeft` and `paddingRight`.
|
|
32
|
-
*
|
|
33
|
-
* @default 0
|
|
34
|
-
*/
|
|
35
|
-
readonly paddingX?: number;
|
|
36
|
-
/**
|
|
37
|
-
* Vertical padding. Equivalent to setting `paddingTop` and `paddingBottom`.
|
|
38
|
-
*
|
|
39
|
-
* @default 0
|
|
40
|
-
*/
|
|
41
|
-
readonly paddingY?: number;
|
|
42
|
-
};
|
|
5
|
+
export type Props = Except<Styles, 'textWrap'>;
|
|
43
6
|
/**
|
|
44
7
|
* `<Box>` is an essential Ink component to build your layout. It's like `<div style="display: flex">` in the browser.
|
|
45
8
|
*/
|
|
46
|
-
declare const Box: React.ForwardRefExoticComponent<
|
|
47
|
-
/**
|
|
48
|
-
* Margin on all sides. Equivalent to setting `marginTop`, `marginBottom`, `marginLeft` and `marginRight`.
|
|
49
|
-
*
|
|
50
|
-
* @default 0
|
|
51
|
-
*/
|
|
52
|
-
readonly margin?: number | undefined;
|
|
53
|
-
/**
|
|
54
|
-
* Horizontal margin. Equivalent to setting `marginLeft` and `marginRight`.
|
|
55
|
-
*
|
|
56
|
-
* @default 0
|
|
57
|
-
*/
|
|
58
|
-
readonly marginX?: number | undefined;
|
|
59
|
-
/**
|
|
60
|
-
* Vertical margin. Equivalent to setting `marginTop` and `marginBottom`.
|
|
61
|
-
*
|
|
62
|
-
* @default 0
|
|
63
|
-
*/
|
|
64
|
-
readonly marginY?: number | undefined;
|
|
65
|
-
/**
|
|
66
|
-
* Padding on all sides. Equivalent to setting `paddingTop`, `paddingBottom`, `paddingLeft` and `paddingRight`.
|
|
67
|
-
*
|
|
68
|
-
* @default 0
|
|
69
|
-
*/
|
|
70
|
-
readonly padding?: number | undefined;
|
|
71
|
-
/**
|
|
72
|
-
* Horizontal padding. Equivalent to setting `paddingLeft` and `paddingRight`.
|
|
73
|
-
*
|
|
74
|
-
* @default 0
|
|
75
|
-
*/
|
|
76
|
-
readonly paddingX?: number | undefined;
|
|
77
|
-
/**
|
|
78
|
-
* Vertical padding. Equivalent to setting `paddingTop` and `paddingBottom`.
|
|
79
|
-
*
|
|
80
|
-
* @default 0
|
|
81
|
-
*/
|
|
82
|
-
readonly paddingY?: number | undefined;
|
|
83
|
-
} & {
|
|
9
|
+
declare const Box: React.ForwardRefExoticComponent<Props & {
|
|
84
10
|
children?: React.ReactNode;
|
|
85
11
|
} & React.RefAttributes<DOMElement>>;
|
|
86
12
|
export default Box;
|
package/build/components/Box.js
CHANGED
|
@@ -1,24 +1,17 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */
|
|
2
1
|
import React, { forwardRef } from 'react';
|
|
3
2
|
/**
|
|
4
3
|
* `<Box>` is an essential Ink component to build your layout. It's like `<div style="display: flex">` in the browser.
|
|
5
4
|
*/
|
|
6
5
|
const Box = forwardRef(({ children, ...style }, ref) => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
marginBottom: style.marginBottom || style.marginY || style.margin || 0,
|
|
13
|
-
paddingLeft: style.paddingLeft || style.paddingX || style.padding || 0,
|
|
14
|
-
paddingRight: style.paddingRight || style.paddingX || style.padding || 0,
|
|
15
|
-
paddingTop: style.paddingTop || style.paddingY || style.padding || 0,
|
|
16
|
-
paddingBottom: style.paddingBottom || style.paddingY || style.padding || 0
|
|
17
|
-
};
|
|
18
|
-
return (React.createElement("ink-box", { ref: ref, style: transformedStyle }, children));
|
|
6
|
+
return (React.createElement("ink-box", { ref: ref, style: {
|
|
7
|
+
...style,
|
|
8
|
+
overflowX: style.overflowX ?? style.overflow ?? 'visible',
|
|
9
|
+
overflowY: style.overflowY ?? style.overflow ?? 'visible'
|
|
10
|
+
} }, children));
|
|
19
11
|
});
|
|
20
12
|
Box.displayName = 'Box';
|
|
21
13
|
Box.defaultProps = {
|
|
14
|
+
flexWrap: 'nowrap',
|
|
22
15
|
flexDirection: 'row',
|
|
23
16
|
flexGrow: 0,
|
|
24
17
|
flexShrink: 1
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Box.js","sourceRoot":"","sources":["../../src/components/Box.tsx"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"Box.js","sourceRoot":"","sources":["../../src/components/Box.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAC,UAAU,EAAyB,MAAM,OAAO,CAAC;AAOhE;;GAEG;AACH,MAAM,GAAG,GAAG,UAAU,CACrB,CAAC,EAAC,QAAQ,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE;IAC7B,OAAO,CACN,iCACC,GAAG,EAAE,GAAG,EACR,KAAK,EAAE;YACN,GAAG,KAAK;YACR,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,IAAI,SAAS;YACzD,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,IAAI,SAAS;SACzD,IAEA,QAAQ,CACA,CACV,CAAC;AACH,CAAC,CACD,CAAC;AAEF,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC;AAExB,GAAG,CAAC,YAAY,GAAG;IAClB,QAAQ,EAAE,QAAQ;IAClB,aAAa,EAAE,KAAK;IACpB,QAAQ,EAAE,CAAC;IACX,UAAU,EAAE,CAAC;CACb,CAAC;AAEF,eAAe,GAAG,CAAC"}
|
package/build/dom.d.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
import Yoga from 'yoga-layout-prebuilt';
|
|
1
|
+
import { type Node as YogaNode } from 'yoga-wasm-web/auto';
|
|
3
2
|
import { type Styles } from './styles.js';
|
|
4
3
|
import { type OutputTransformer } from './render-node-to-output.js';
|
|
5
4
|
type InkNode = {
|
|
6
5
|
parentNode: DOMElement | undefined;
|
|
7
|
-
yogaNode?:
|
|
6
|
+
yogaNode?: YogaNode;
|
|
8
7
|
internal_static?: boolean;
|
|
9
8
|
style: Styles;
|
|
10
9
|
};
|
|
@@ -18,6 +17,7 @@ export type DOMElement = {
|
|
|
18
17
|
internal_transform?: OutputTransformer;
|
|
19
18
|
isStaticDirty?: boolean;
|
|
20
19
|
staticNode?: DOMElement;
|
|
20
|
+
onComputeLayout?: () => void;
|
|
21
21
|
onRender?: () => void;
|
|
22
22
|
onImmediateRender?: () => void;
|
|
23
23
|
} & InkNode;
|
package/build/dom.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
// eslint-disable-next-line n/file-extension-in-import
|
|
2
|
+
import Yoga from 'yoga-wasm-web/auto';
|
|
2
3
|
import measureText from './measure-text.js';
|
|
3
|
-
import applyStyles from './styles.js';
|
|
4
4
|
import wrapText from './wrap-text.js';
|
|
5
5
|
import squashTextNodes from './squash-text-nodes.js';
|
|
6
6
|
export const createNode = (nodeName) => {
|
|
@@ -69,9 +69,6 @@ export const setAttribute = (node, key, value) => {
|
|
|
69
69
|
};
|
|
70
70
|
export const setStyle = (node, style) => {
|
|
71
71
|
node.style = style;
|
|
72
|
-
if (node.yogaNode) {
|
|
73
|
-
applyStyles(node.yogaNode, style);
|
|
74
|
-
}
|
|
75
72
|
};
|
|
76
73
|
export const createTextNode = (text) => {
|
|
77
74
|
const node = {
|
package/build/dom.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom.js","sourceRoot":"","sources":["../src/dom.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"dom.js","sourceRoot":"","sources":["../src/dom.ts"],"names":[],"mappings":"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"}
|
package/build/get-max-width.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import
|
|
2
|
-
declare const getMaxWidth: (yogaNode:
|
|
1
|
+
import { type Node as YogaNode } from 'yoga-wasm-web/auto';
|
|
2
|
+
declare const getMaxWidth: (yogaNode: YogaNode) => number;
|
|
3
3
|
export default getMaxWidth;
|
package/build/get-max-width.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-max-width.js","sourceRoot":"","sources":["../src/get-max-width.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"get-max-width.js","sourceRoot":"","sources":["../src/get-max-width.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,OAAO,IAA6B,MAAM,oBAAoB,CAAC;AAE/D,MAAM,WAAW,GAAG,CAAC,QAAkB,EAAE,EAAE;IAC1C,OAAO,CACN,QAAQ,CAAC,gBAAgB,EAAE;QAC3B,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC;QAC3C,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;QAC5C,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC;QAC1C,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAC3C,CAAC;AACH,CAAC,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
package/build/hooks/use-input.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { useEffect } from 'react';
|
|
2
|
+
import { isUpperCase } from 'is-upper-case';
|
|
3
|
+
import parseKeypress, { nonAlphanumericKeys } from '../parse-keypress.js';
|
|
2
4
|
import useStdin from './use-stdin.js';
|
|
3
5
|
/**
|
|
4
6
|
* This hook is used for handling user input.
|
|
@@ -41,47 +43,41 @@ const useInput = (inputHandler, options = {}) => {
|
|
|
41
43
|
return;
|
|
42
44
|
}
|
|
43
45
|
const handleData = (data) => {
|
|
44
|
-
|
|
46
|
+
const keypress = parseKeypress(data);
|
|
45
47
|
const key = {
|
|
46
|
-
upArrow:
|
|
47
|
-
downArrow:
|
|
48
|
-
leftArrow:
|
|
49
|
-
rightArrow:
|
|
50
|
-
pageDown:
|
|
51
|
-
pageUp:
|
|
52
|
-
return:
|
|
53
|
-
escape:
|
|
54
|
-
ctrl:
|
|
55
|
-
shift:
|
|
56
|
-
tab:
|
|
57
|
-
backspace:
|
|
58
|
-
delete:
|
|
59
|
-
meta
|
|
48
|
+
upArrow: keypress.name === 'up',
|
|
49
|
+
downArrow: keypress.name === 'down',
|
|
50
|
+
leftArrow: keypress.name === 'left',
|
|
51
|
+
rightArrow: keypress.name === 'right',
|
|
52
|
+
pageDown: keypress.name === 'pagedown',
|
|
53
|
+
pageUp: keypress.name === 'pageup',
|
|
54
|
+
return: keypress.name === 'return',
|
|
55
|
+
escape: keypress.name === 'escape',
|
|
56
|
+
ctrl: keypress.ctrl,
|
|
57
|
+
shift: keypress.shift,
|
|
58
|
+
tab: keypress.name === 'tab',
|
|
59
|
+
backspace: keypress.name === 'backspace',
|
|
60
|
+
delete: keypress.name === 'delete',
|
|
61
|
+
// `parseKeypress` parses \u001B\u001B[A (meta + up arrow) as meta = false
|
|
62
|
+
// but with option = true, so we need to take this into account here
|
|
63
|
+
// to avoid breaking changes in Ink.
|
|
64
|
+
// TODO(vadimdemedes): consider removing this in the next major version.
|
|
65
|
+
meta: keypress.meta || keypress.name === 'escape' || keypress.option
|
|
60
66
|
};
|
|
61
|
-
|
|
62
|
-
if (
|
|
63
|
-
|
|
64
|
-
input = String.fromCharCode(
|
|
65
|
-
// eslint-disable-next-line unicorn/prefer-code-point
|
|
66
|
-
input.charCodeAt(0) + 'a'.charCodeAt(0) - 1);
|
|
67
|
-
key.ctrl = true;
|
|
67
|
+
let input = keypress.ctrl ? keypress.name : keypress.sequence;
|
|
68
|
+
if (nonAlphanumericKeys.includes(keypress.name)) {
|
|
69
|
+
input = '';
|
|
68
70
|
}
|
|
71
|
+
// Strip meta if it's still remaining after `parseKeypress`
|
|
72
|
+
// TODO(vadimdemedes): remove this in the next major version.
|
|
69
73
|
if (input.startsWith('\u001B')) {
|
|
70
74
|
input = input.slice(1);
|
|
71
|
-
key.meta = true;
|
|
72
|
-
}
|
|
73
|
-
const isLatinUppercase = input >= 'A' && input <= 'Z';
|
|
74
|
-
const isCyrillicUppercase = input >= 'А' && input <= 'Я';
|
|
75
|
-
if (input.length === 1 && (isLatinUppercase || isCyrillicUppercase)) {
|
|
76
|
-
key.shift = true;
|
|
77
75
|
}
|
|
78
|
-
|
|
79
|
-
|
|
76
|
+
if (input.length === 1 &&
|
|
77
|
+
typeof input[0] === 'string' &&
|
|
78
|
+
isUpperCase(input[0])) {
|
|
80
79
|
key.shift = true;
|
|
81
80
|
}
|
|
82
|
-
if (key.tab || key.backspace || key.delete) {
|
|
83
|
-
input = '';
|
|
84
|
-
}
|
|
85
81
|
// If app is not supposed to exit on Ctrl+C, then let input listener handle it
|
|
86
82
|
if (!(input === 'c' && key.ctrl) || !internal_exitOnCtrlC) {
|
|
87
83
|
inputHandler(input, key);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-input.js","sourceRoot":"","sources":["../../src/hooks/use-input.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AAChC,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAyFtC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,QAAQ,GAAG,CAAC,YAAqB,EAAE,UAAmB,EAAE,EAAE,EAAE;IACjE,gEAAgE;IAChE,MAAM,EAAC,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAC,GAAG,QAAQ,EAAE,CAAC;IAE7D,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK,EAAE;YAC/B,OAAO;SACP;QAED,UAAU,CAAC,IAAI,CAAC,CAAC;QAEjB,OAAO,GAAG,EAAE;YACX,UAAU,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;IAEnC,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK,EAAE;YAC/B,OAAO;SACP;QAED,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE;YACnC,
|
|
1
|
+
{"version":3,"file":"use-input.js","sourceRoot":"","sources":["../../src/hooks/use-input.ts"],"names":[],"mappings":"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"}
|
package/build/ink.d.ts
CHANGED
|
@@ -22,9 +22,11 @@ export default class Ink {
|
|
|
22
22
|
private restoreConsole?;
|
|
23
23
|
private readonly unsubscribeResize?;
|
|
24
24
|
constructor(options: Options);
|
|
25
|
+
resized: () => void;
|
|
25
26
|
resolveExitPromise: () => void;
|
|
26
27
|
rejectExitPromise: (reason?: Error) => void;
|
|
27
28
|
unsubscribeExit: () => void;
|
|
29
|
+
calculateLayout: () => void;
|
|
28
30
|
onRender: () => void;
|
|
29
31
|
render(node: ReactNode): void;
|
|
30
32
|
writeToStdout(data: string): void;
|
package/build/ink.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import process from 'node:process';
|
|
2
2
|
import React from 'react';
|
|
3
|
-
import
|
|
3
|
+
import throttle from 'lodash/throttle.js';
|
|
4
4
|
import ansiEscapes from 'ansi-escapes';
|
|
5
5
|
import originalIsCi from 'is-ci';
|
|
6
6
|
import autoBind from 'auto-bind';
|
|
7
7
|
import signalExit from 'signal-exit';
|
|
8
8
|
import patchConsole from 'patch-console';
|
|
9
|
+
// eslint-disable-next-line n/file-extension-in-import
|
|
10
|
+
import Yoga from 'yoga-wasm-web/auto';
|
|
9
11
|
import reconciler from './reconciler.js';
|
|
10
12
|
import render from './renderer.js';
|
|
11
13
|
import * as dom from './dom.js';
|
|
@@ -85,6 +87,15 @@ export default class Ink {
|
|
|
85
87
|
writable: true,
|
|
86
88
|
value: void 0
|
|
87
89
|
});
|
|
90
|
+
Object.defineProperty(this, "resized", {
|
|
91
|
+
enumerable: true,
|
|
92
|
+
configurable: true,
|
|
93
|
+
writable: true,
|
|
94
|
+
value: () => {
|
|
95
|
+
this.calculateLayout();
|
|
96
|
+
this.onRender();
|
|
97
|
+
}
|
|
98
|
+
});
|
|
88
99
|
Object.defineProperty(this, "resolveExitPromise", {
|
|
89
100
|
enumerable: true,
|
|
90
101
|
configurable: true,
|
|
@@ -103,6 +114,18 @@ export default class Ink {
|
|
|
103
114
|
writable: true,
|
|
104
115
|
value: () => { }
|
|
105
116
|
});
|
|
117
|
+
Object.defineProperty(this, "calculateLayout", {
|
|
118
|
+
enumerable: true,
|
|
119
|
+
configurable: true,
|
|
120
|
+
writable: true,
|
|
121
|
+
value: () => {
|
|
122
|
+
// The 'columns' property can be undefined or 0 when not using a TTY.
|
|
123
|
+
// In that case we fall back to 80.
|
|
124
|
+
const terminalWidth = this.options.stdout.columns || 80;
|
|
125
|
+
this.rootNode.yogaNode.setWidth(terminalWidth);
|
|
126
|
+
this.rootNode.yogaNode.calculateLayout(undefined, undefined, Yoga.DIRECTION_LTR);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
106
129
|
Object.defineProperty(this, "onRender", {
|
|
107
130
|
enumerable: true,
|
|
108
131
|
configurable: true,
|
|
@@ -111,10 +134,7 @@ export default class Ink {
|
|
|
111
134
|
if (this.isUnmounted) {
|
|
112
135
|
return;
|
|
113
136
|
}
|
|
114
|
-
const { output, outputHeight, staticOutput } = render(this.rootNode
|
|
115
|
-
// The 'columns' property can be undefined or 0 when not using a TTY.
|
|
116
|
-
// In that case we fall back to 80.
|
|
117
|
-
this.options.stdout.columns || 80);
|
|
137
|
+
const { output, outputHeight, staticOutput } = render(this.rootNode);
|
|
118
138
|
// If <Static> output isn't empty, it means new children have been added to it
|
|
119
139
|
const hasStaticOutput = staticOutput && staticOutput !== '\n';
|
|
120
140
|
if (this.options.debug) {
|
|
@@ -154,6 +174,7 @@ export default class Ink {
|
|
|
154
174
|
autoBind(this);
|
|
155
175
|
this.options = options;
|
|
156
176
|
this.rootNode = dom.createNode('ink-root');
|
|
177
|
+
this.rootNode.onComputeLayout = this.calculateLayout;
|
|
157
178
|
this.rootNode.onRender = options.debug
|
|
158
179
|
? this.onRender
|
|
159
180
|
: throttle(this.onRender, 32, {
|
|
@@ -194,9 +215,9 @@ export default class Ink {
|
|
|
194
215
|
this.patchConsole();
|
|
195
216
|
}
|
|
196
217
|
if (!isCi) {
|
|
197
|
-
options.stdout.on('resize', this.
|
|
218
|
+
options.stdout.on('resize', this.resized);
|
|
198
219
|
this.unsubscribeResize = () => {
|
|
199
|
-
options.stdout.off('resize', this.
|
|
220
|
+
options.stdout.off('resize', this.resized);
|
|
200
221
|
};
|
|
201
222
|
}
|
|
202
223
|
}
|
|
@@ -242,6 +263,7 @@ export default class Ink {
|
|
|
242
263
|
if (this.isUnmounted) {
|
|
243
264
|
return;
|
|
244
265
|
}
|
|
266
|
+
this.calculateLayout();
|
|
245
267
|
this.onRender();
|
|
246
268
|
this.unsubscribeExit();
|
|
247
269
|
if (typeof this.restoreConsole === 'function') {
|
package/build/ink.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ink.js","sourceRoot":"","sources":["../src/ink.tsx"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,KAAuB,MAAM,OAAO,CAAC;AAC5C,OAAO,
|
|
1
|
+
{"version":3,"file":"ink.js","sourceRoot":"","sources":["../src/ink.tsx"],"names":[],"mappings":"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"}
|
package/build/output.d.ts
CHANGED
|
@@ -11,14 +11,22 @@ type Options = {
|
|
|
11
11
|
width: number;
|
|
12
12
|
height: number;
|
|
13
13
|
};
|
|
14
|
+
type Clip = {
|
|
15
|
+
x1: number | undefined;
|
|
16
|
+
x2: number | undefined;
|
|
17
|
+
y1: number | undefined;
|
|
18
|
+
y2: number | undefined;
|
|
19
|
+
};
|
|
14
20
|
export default class Output {
|
|
15
21
|
width: number;
|
|
16
22
|
height: number;
|
|
17
|
-
private readonly
|
|
23
|
+
private readonly operations;
|
|
18
24
|
constructor(options: Options);
|
|
19
25
|
write(x: number, y: number, text: string, options: {
|
|
20
26
|
transformers: OutputTransformer[];
|
|
21
27
|
}): void;
|
|
28
|
+
clip(clip: Clip): void;
|
|
29
|
+
unclip(): void;
|
|
22
30
|
get(): {
|
|
23
31
|
output: string;
|
|
24
32
|
height: number;
|
package/build/output.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import sliceAnsi from 'slice-ansi';
|
|
2
2
|
import stringWidth from 'string-width';
|
|
3
|
+
import widestLine from 'widest-line';
|
|
3
4
|
export default class Output {
|
|
4
5
|
constructor(options) {
|
|
5
6
|
Object.defineProperty(this, "width", {
|
|
@@ -14,8 +15,7 @@ export default class Output {
|
|
|
14
15
|
writable: true,
|
|
15
16
|
value: void 0
|
|
16
17
|
});
|
|
17
|
-
|
|
18
|
-
Object.defineProperty(this, "writes", {
|
|
18
|
+
Object.defineProperty(this, "operations", {
|
|
19
19
|
enumerable: true,
|
|
20
20
|
configurable: true,
|
|
21
21
|
writable: true,
|
|
@@ -30,32 +30,99 @@ export default class Output {
|
|
|
30
30
|
if (!text) {
|
|
31
31
|
return;
|
|
32
32
|
}
|
|
33
|
-
this.
|
|
33
|
+
this.operations.push({
|
|
34
|
+
type: 'write',
|
|
35
|
+
x,
|
|
36
|
+
y,
|
|
37
|
+
text,
|
|
38
|
+
transformers
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
clip(clip) {
|
|
42
|
+
this.operations.push({
|
|
43
|
+
type: 'clip',
|
|
44
|
+
clip
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
unclip() {
|
|
48
|
+
this.operations.push({
|
|
49
|
+
type: 'unclip'
|
|
50
|
+
});
|
|
34
51
|
}
|
|
35
52
|
get() {
|
|
53
|
+
// Initialize output array with a specific set of rows, so that margin/padding at the bottom is preserved
|
|
36
54
|
const output = [];
|
|
37
55
|
for (let y = 0; y < this.height; y++) {
|
|
38
56
|
output.push(' '.repeat(this.width));
|
|
39
57
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
58
|
+
const clips = [];
|
|
59
|
+
for (const operation of this.operations) {
|
|
60
|
+
if (operation.type === 'clip') {
|
|
61
|
+
clips.push(operation.clip);
|
|
62
|
+
}
|
|
63
|
+
if (operation.type === 'unclip') {
|
|
64
|
+
clips.pop();
|
|
65
|
+
}
|
|
66
|
+
if (operation.type === 'write') {
|
|
67
|
+
const { text, transformers } = operation;
|
|
68
|
+
let { x, y } = operation;
|
|
69
|
+
let lines = text.split('\n');
|
|
70
|
+
const clip = clips[clips.length - 1];
|
|
71
|
+
if (clip) {
|
|
72
|
+
const clipHorizontally = typeof clip?.x1 === 'number' && typeof clip?.x2 === 'number';
|
|
73
|
+
const clipVertically = typeof clip?.y1 === 'number' && typeof clip?.y2 === 'number';
|
|
74
|
+
// If text is positioned outside of clipping area altogether,
|
|
75
|
+
// skip to the next operation to avoid unnecessary calculations
|
|
76
|
+
if (clipHorizontally) {
|
|
77
|
+
const width = widestLine(text);
|
|
78
|
+
if (x + width < clip.x1 || x > clip.x2) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (clipVertically) {
|
|
83
|
+
const height = lines.length;
|
|
84
|
+
if (y + height < clip.y1 || y > clip.y2) {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (clipHorizontally) {
|
|
89
|
+
lines = lines.map(line => {
|
|
90
|
+
const from = x < clip.x1 ? clip.x1 - x : 0;
|
|
91
|
+
const width = stringWidth(line);
|
|
92
|
+
const to = x + width > clip.x2 ? clip.x2 - x : width;
|
|
93
|
+
return sliceAnsi(line, from, to);
|
|
94
|
+
});
|
|
95
|
+
if (x < clip.x1) {
|
|
96
|
+
x = clip.x1;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (clipVertically) {
|
|
100
|
+
const from = y < clip.y1 ? clip.y1 - y : 0;
|
|
101
|
+
const height = lines.length;
|
|
102
|
+
const to = y + height > clip.y2 ? clip.y2 - y : height;
|
|
103
|
+
lines = lines.slice(from, to);
|
|
104
|
+
if (y < clip.y1) {
|
|
105
|
+
y = clip.y1;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
49
108
|
}
|
|
50
|
-
|
|
51
|
-
for (
|
|
52
|
-
|
|
109
|
+
let offsetY = 0;
|
|
110
|
+
for (let line of lines) {
|
|
111
|
+
const currentLine = output[y + offsetY];
|
|
112
|
+
// Line can be missing if `text` is taller than height of pre-initialized `this.output`
|
|
113
|
+
if (!currentLine) {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
const width = stringWidth(line);
|
|
117
|
+
for (const transformer of transformers) {
|
|
118
|
+
line = transformer(line);
|
|
119
|
+
}
|
|
120
|
+
output[y + offsetY] =
|
|
121
|
+
sliceAnsi(currentLine, 0, x) +
|
|
122
|
+
line +
|
|
123
|
+
sliceAnsi(currentLine, x + width);
|
|
124
|
+
offsetY++;
|
|
53
125
|
}
|
|
54
|
-
output[y + offsetY] =
|
|
55
|
-
sliceAnsi(currentLine, 0, x) +
|
|
56
|
-
line +
|
|
57
|
-
sliceAnsi(currentLine, x + width);
|
|
58
|
-
offsetY++;
|
|
59
126
|
}
|
|
60
127
|
}
|
|
61
128
|
const generatedOutput = output.map(line => line.trimEnd()).join('\n');
|
package/build/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,WAAW,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
|