veryfront 0.0.94 → 0.0.95
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/esm/deno.js +1 -1
- package/esm/src/cli/app/index.d.ts.map +1 -1
- package/esm/src/cli/app/index.js +7 -2
- package/esm/src/platform/compat/react-paths.d.ts.map +1 -1
- package/esm/src/platform/compat/react-paths.js +7 -2
- package/esm/src/platform/compat/stdin.d.ts +13 -0
- package/esm/src/platform/compat/stdin.d.ts.map +1 -1
- package/esm/src/platform/compat/stdin.js +34 -3
- package/package.json +1 -1
- package/src/deno.js +1 -1
- package/src/src/cli/app/index.ts +11 -2
- package/src/src/platform/compat/react-paths.ts +7 -2
- package/src/src/platform/compat/stdin.ts +51 -0
package/esm/deno.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/cli/app/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/cli/app/index.ts"],"names":[],"mappings":"AAsCA,OAAO,EAEL,KAAK,QAAQ,EAcb,KAAK,YAAY,EAQlB,MAAM,YAAY,CAAC;AASpB,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,GAAG;IAClB,oBAAoB;IACpB,KAAK,IAAI,IAAI,CAAC;IACd,wCAAwC;IACxC,IAAI,IAAI,IAAI,CAAC;IACb,mBAAmB;IACnB,MAAM,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IACpC,wBAAwB;IACxB,QAAQ,IAAI,QAAQ,CAAC;IACrB,8BAA8B;IAC9B,MAAM,IAAI,IAAI,CAAC;IACf,uBAAuB;IACvB,cAAc,IAAI,IAAI,CAAC;IACvB,mBAAmB;IACnB,QAAQ,IAAI,IAAI,CAAC;IACjB,mBAAmB;IACnB,WAAW,IAAI,IAAI,CAAC;IACpB,uCAAuC;IACvC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvE,qDAAqD;IACrD,gBAAgB,IAAI,MAAM,IAAI,CAAC;CAChC;AAuMD;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,GAAG,CAinChD;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BhE;AAED,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,6BAA6B,CAAC"}
|
package/esm/src/cli/app/index.js
CHANGED
|
@@ -9,7 +9,7 @@ import * as dntShim from "../../../_dnt.shims.js";
|
|
|
9
9
|
import { cwd, exit, isInteractive, isStdoutTTY, writeStdout, } from "../../platform/compat/process.js";
|
|
10
10
|
import { join } from "../../platform/compat/path/index.js";
|
|
11
11
|
import { getRuntimeEnv } from "../../config/runtime-env.js";
|
|
12
|
-
import { getStdinReader, setRawMode } from "../../platform/compat/stdin.js";
|
|
12
|
+
import { createEscapeBuffer, getStdinReader, setRawMode, } from "../../platform/compat/stdin.js";
|
|
13
13
|
import { cursor, screen, SPINNER_FRAMES } from "../ui/ansi.js";
|
|
14
14
|
import { brand, dim } from "../ui/colors.js";
|
|
15
15
|
import { getTerminalWidth } from "../ui/layout.js";
|
|
@@ -481,15 +481,20 @@ export function createApp(config) {
|
|
|
481
481
|
setRawMode(true);
|
|
482
482
|
const reader = getStdinReader();
|
|
483
483
|
const decoder = new TextDecoder();
|
|
484
|
+
// Buffer escape sequences (arrow keys like \x1b[A may arrive as separate reads)
|
|
485
|
+
const escapeBuffer = createEscapeBuffer((key) => handleKey(key));
|
|
484
486
|
try {
|
|
485
487
|
while (running) {
|
|
486
488
|
const { value, done } = await reader.read();
|
|
487
489
|
if (done)
|
|
488
490
|
break;
|
|
489
|
-
|
|
491
|
+
const key = escapeBuffer.push(decoder.decode(value));
|
|
492
|
+
if (key)
|
|
493
|
+
await handleKey(key);
|
|
490
494
|
}
|
|
491
495
|
}
|
|
492
496
|
finally {
|
|
497
|
+
escapeBuffer.clear();
|
|
493
498
|
reader.releaseLock();
|
|
494
499
|
try {
|
|
495
500
|
setRawMode(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-paths.d.ts","sourceRoot":"","sources":["../../../../src/src/platform/compat/react-paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"react-paths.d.ts","sourceRoot":"","sources":["../../../../src/src/platform/compat/react-paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAwEH,wBAAgB,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAa3D;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAO3D;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
*
|
|
9
9
|
* @module
|
|
10
10
|
*/
|
|
11
|
-
import { pathToFileURL } from "node:url";
|
|
11
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
12
|
+
import { dirname } from "node:path";
|
|
12
13
|
import { isBun, isDeno, isNode } from "./runtime.js";
|
|
13
14
|
import { cwd } from "./process.js";
|
|
14
15
|
let localReactPathsCache = null;
|
|
@@ -45,7 +46,11 @@ function resolveReactSpecifier(specifier) {
|
|
|
45
46
|
return `file://${resolved}`;
|
|
46
47
|
}
|
|
47
48
|
if (isNode) {
|
|
48
|
-
|
|
49
|
+
// Use import.meta.url (this module's location) as the parent URL.
|
|
50
|
+
// This ensures React is resolved from veryfront's node_modules,
|
|
51
|
+
// not from the cwd which may not have React installed.
|
|
52
|
+
const thisModuleDir = dirname(fileURLToPath(globalThis[Symbol.for("import-meta-ponyfill-esmodule")](import.meta).url));
|
|
53
|
+
const parentUrl = pathToFileURL(`${thisModuleDir}/`).href;
|
|
49
54
|
return resolveWithImportMeta(specifier, parentUrl) ?? undefined;
|
|
50
55
|
}
|
|
51
56
|
}
|
|
@@ -27,5 +27,18 @@ export declare function waitForKeypress(): Promise<void>;
|
|
|
27
27
|
* Returns true if Enter was pressed (continue), false if Ctrl+C (exit).
|
|
28
28
|
* Works in both Deno and Node.js.
|
|
29
29
|
*/
|
|
30
|
+
/**
|
|
31
|
+
* Buffer for escape sequences that may arrive in separate reads.
|
|
32
|
+
* Arrow keys (\x1b[A) can arrive as "\x1b" then "[A" - this combines them.
|
|
33
|
+
*/
|
|
34
|
+
export interface EscapeBuffer {
|
|
35
|
+
push(input: string): string | null;
|
|
36
|
+
clear(): void;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Create an escape sequence buffer.
|
|
40
|
+
* @param onTimeout Called when a standalone Escape key times out
|
|
41
|
+
*/
|
|
42
|
+
export declare function createEscapeBuffer(onTimeout: (key: string) => void): EscapeBuffer;
|
|
30
43
|
export declare function waitForEnterOrExit(): Promise<boolean>;
|
|
31
44
|
//# sourceMappingURL=stdin.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stdin.d.ts","sourceRoot":"","sources":["../../../../src/src/platform/compat/stdin.ts"],"names":[],"mappings":"AAsBA;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAUjD;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,UAAU,GAAG,SAAS,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAClE,WAAW,IAAI,IAAI,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,WAAW,CA0D5C;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA2B/C;AAOD;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CA+DrD"}
|
|
1
|
+
{"version":3,"file":"stdin.d.ts","sourceRoot":"","sources":["../../../../src/src/platform/compat/stdin.ts"],"names":[],"mappings":"AAsBA;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAUjD;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,UAAU,GAAG,SAAS,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAClE,WAAW,IAAI,IAAI,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,WAAW,CA0D5C;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA2B/C;AAOD;;;;GAIG;AACH;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACnC,KAAK,IAAI,IAAI,CAAC;CACf;AAKD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,YAAY,CAiCjF;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CA+DrD"}
|
|
@@ -109,11 +109,42 @@ export function waitForKeypress() {
|
|
|
109
109
|
const CTRL_C = 0x03;
|
|
110
110
|
const ENTER_CR = 0x0d;
|
|
111
111
|
const ENTER_LF = 0x0a;
|
|
112
|
+
const ESC = "\x1b";
|
|
113
|
+
const ESC_TIMEOUT_MS = 50;
|
|
112
114
|
/**
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
* Works in both Deno and Node.js.
|
|
115
|
+
* Create an escape sequence buffer.
|
|
116
|
+
* @param onTimeout Called when a standalone Escape key times out
|
|
116
117
|
*/
|
|
118
|
+
export function createEscapeBuffer(onTimeout) {
|
|
119
|
+
let pending = "";
|
|
120
|
+
let timeoutId = null;
|
|
121
|
+
function clear() {
|
|
122
|
+
if (timeoutId) {
|
|
123
|
+
clearTimeout(timeoutId);
|
|
124
|
+
timeoutId = null;
|
|
125
|
+
}
|
|
126
|
+
pending = "";
|
|
127
|
+
}
|
|
128
|
+
function push(input) {
|
|
129
|
+
if (pending) {
|
|
130
|
+
const result = pending + input;
|
|
131
|
+
clear();
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
if (input === ESC) {
|
|
135
|
+
pending = input;
|
|
136
|
+
timeoutId = dntShim.setTimeout(() => {
|
|
137
|
+
const key = pending;
|
|
138
|
+
clear();
|
|
139
|
+
if (key)
|
|
140
|
+
onTimeout(key);
|
|
141
|
+
}, ESC_TIMEOUT_MS);
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
return input;
|
|
145
|
+
}
|
|
146
|
+
return { push, clear };
|
|
147
|
+
}
|
|
117
148
|
export function waitForEnterOrExit() {
|
|
118
149
|
return new Promise((resolve) => {
|
|
119
150
|
if (typeof dntShim.Deno !== "undefined" && dntShim.Deno.stdin) {
|
package/package.json
CHANGED
package/src/deno.js
CHANGED
package/src/src/cli/app/index.ts
CHANGED
|
@@ -17,7 +17,11 @@ import {
|
|
|
17
17
|
} from "../../platform/compat/process.js";
|
|
18
18
|
import { join } from "../../platform/compat/path/index.js";
|
|
19
19
|
import { getRuntimeEnv } from "../../config/runtime-env.js";
|
|
20
|
-
import {
|
|
20
|
+
import {
|
|
21
|
+
createEscapeBuffer,
|
|
22
|
+
getStdinReader,
|
|
23
|
+
setRawMode,
|
|
24
|
+
} from "../../platform/compat/stdin.js";
|
|
21
25
|
import { cursor, screen, SPINNER_FRAMES } from "../ui/ansi.js";
|
|
22
26
|
import { brand, dim } from "../ui/colors.js";
|
|
23
27
|
import { getTerminalWidth } from "../ui/layout.js";
|
|
@@ -612,14 +616,19 @@ export function createApp(config: AppConfig): App {
|
|
|
612
616
|
const reader = getStdinReader();
|
|
613
617
|
const decoder = new TextDecoder();
|
|
614
618
|
|
|
619
|
+
// Buffer escape sequences (arrow keys like \x1b[A may arrive as separate reads)
|
|
620
|
+
const escapeBuffer = createEscapeBuffer((key) => handleKey(key));
|
|
621
|
+
|
|
615
622
|
try {
|
|
616
623
|
while (running) {
|
|
617
624
|
const { value, done } = await reader.read();
|
|
618
625
|
if (done) break;
|
|
619
626
|
|
|
620
|
-
|
|
627
|
+
const key = escapeBuffer.push(decoder.decode(value));
|
|
628
|
+
if (key) await handleKey(key);
|
|
621
629
|
}
|
|
622
630
|
} finally {
|
|
631
|
+
escapeBuffer.clear();
|
|
623
632
|
reader.releaseLock();
|
|
624
633
|
try {
|
|
625
634
|
setRawMode(false);
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
// Bun global type declaration for cross-runtime compatibility
|
|
13
13
|
declare const Bun: { resolveSync?: (specifier: string, dir: string) => string } | undefined;
|
|
14
14
|
|
|
15
|
-
import { pathToFileURL } from "node:url";
|
|
15
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
16
|
+
import { dirname } from "node:path";
|
|
16
17
|
import { isBun, isDeno, isNode } from "./runtime.js";
|
|
17
18
|
import { cwd } from "./process.js";
|
|
18
19
|
|
|
@@ -62,7 +63,11 @@ function resolveReactSpecifier(specifier: string): string | undefined {
|
|
|
62
63
|
}
|
|
63
64
|
|
|
64
65
|
if (isNode) {
|
|
65
|
-
|
|
66
|
+
// Use import.meta.url (this module's location) as the parent URL.
|
|
67
|
+
// This ensures React is resolved from veryfront's node_modules,
|
|
68
|
+
// not from the cwd which may not have React installed.
|
|
69
|
+
const thisModuleDir = dirname(fileURLToPath(import.meta.url));
|
|
70
|
+
const parentUrl = pathToFileURL(`${thisModuleDir}/`).href;
|
|
66
71
|
return resolveWithImportMeta(specifier, parentUrl) ?? undefined;
|
|
67
72
|
}
|
|
68
73
|
} catch (error) {
|
|
@@ -150,6 +150,57 @@ const ENTER_LF = 0x0a;
|
|
|
150
150
|
* Returns true if Enter was pressed (continue), false if Ctrl+C (exit).
|
|
151
151
|
* Works in both Deno and Node.js.
|
|
152
152
|
*/
|
|
153
|
+
/**
|
|
154
|
+
* Buffer for escape sequences that may arrive in separate reads.
|
|
155
|
+
* Arrow keys (\x1b[A) can arrive as "\x1b" then "[A" - this combines them.
|
|
156
|
+
*/
|
|
157
|
+
export interface EscapeBuffer {
|
|
158
|
+
push(input: string): string | null;
|
|
159
|
+
clear(): void;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const ESC = "\x1b";
|
|
163
|
+
const ESC_TIMEOUT_MS = 50;
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Create an escape sequence buffer.
|
|
167
|
+
* @param onTimeout Called when a standalone Escape key times out
|
|
168
|
+
*/
|
|
169
|
+
export function createEscapeBuffer(onTimeout: (key: string) => void): EscapeBuffer {
|
|
170
|
+
let pending = "";
|
|
171
|
+
let timeoutId: ReturnType<typeof dntShim.setTimeout> | null = null;
|
|
172
|
+
|
|
173
|
+
function clear(): void {
|
|
174
|
+
if (timeoutId) {
|
|
175
|
+
clearTimeout(timeoutId);
|
|
176
|
+
timeoutId = null;
|
|
177
|
+
}
|
|
178
|
+
pending = "";
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function push(input: string): string | null {
|
|
182
|
+
if (pending) {
|
|
183
|
+
const result = pending + input;
|
|
184
|
+
clear();
|
|
185
|
+
return result;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
if (input === ESC) {
|
|
189
|
+
pending = input;
|
|
190
|
+
timeoutId = dntShim.setTimeout(() => {
|
|
191
|
+
const key = pending;
|
|
192
|
+
clear();
|
|
193
|
+
if (key) onTimeout(key);
|
|
194
|
+
}, ESC_TIMEOUT_MS);
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return input;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return { push, clear };
|
|
202
|
+
}
|
|
203
|
+
|
|
153
204
|
export function waitForEnterOrExit(): Promise<boolean> {
|
|
154
205
|
return new Promise((resolve) => {
|
|
155
206
|
if (typeof dntShim.Deno !== "undefined" && dntShim.Deno.stdin) {
|