@netlify/plugin-nextjs 4.40.1 → 4.40.2
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/lib/helpers/edge.js +1 -0
- package/lib/templates/vendor.js +20 -0
- package/package.json +7 -4
- package/src/templates/edge/next-dev.js +3 -3
- package/src/templates/edge/shims.js +6 -6
- package/src/templates/edge-shared/next-utils.ts +3 -3
- package/src/templates/edge-shared/utils.ts +1 -1
- package/src/templates/vendor/deno.land/std@0.134.0/fmt/colors.ts +536 -0
- package/src/templates/vendor/deno.land/std@0.134.0/testing/_diff.ts +360 -0
- package/src/templates/vendor/deno.land/std@0.134.0/testing/asserts.ts +866 -0
- package/src/templates/vendor/deno.land/std@0.175.0/_util/asserts.ts +25 -0
- package/src/templates/vendor/deno.land/std@0.175.0/_util/os.ts +23 -0
- package/src/templates/vendor/deno.land/std@0.175.0/async/abortable.ts +149 -0
- package/src/templates/vendor/deno.land/std@0.175.0/async/deadline.ts +30 -0
- package/src/templates/vendor/deno.land/std@0.175.0/async/debounce.ts +79 -0
- package/src/templates/vendor/deno.land/std@0.175.0/async/deferred.ts +48 -0
- package/src/templates/vendor/deno.land/std@0.175.0/async/delay.ts +67 -0
- package/src/templates/vendor/deno.land/std@0.175.0/async/mod.ts +18 -0
- package/src/templates/vendor/deno.land/std@0.175.0/async/mux_async_iterator.ts +97 -0
- package/src/templates/vendor/deno.land/std@0.175.0/async/pool.ts +95 -0
- package/src/templates/vendor/deno.land/std@0.175.0/async/retry.ts +81 -0
- package/src/templates/vendor/deno.land/std@0.175.0/async/tee.ts +100 -0
- package/src/templates/vendor/deno.land/std@0.175.0/bytes/index_of_needle.ts +49 -0
- package/src/templates/vendor/deno.land/std@0.175.0/crypto/timing_safe_equal.ts +29 -0
- package/src/templates/vendor/deno.land/std@0.175.0/datetime/to_imf.ts +45 -0
- package/src/templates/vendor/deno.land/std@0.175.0/encoding/base64.ts +144 -0
- package/src/templates/vendor/deno.land/std@0.175.0/encoding/base64url.ts +70 -0
- package/src/templates/vendor/deno.land/std@0.175.0/flags/mod.ts +785 -0
- package/src/templates/vendor/deno.land/std@0.175.0/fmt/colors.ts +569 -0
- package/src/templates/vendor/deno.land/std@0.175.0/fmt/printf.ts +939 -0
- package/src/templates/vendor/deno.land/std@0.175.0/http/cookie.ts +403 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/_core.ts +77 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/_events.d.ts +848 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/_events.mjs +1033 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/_global.d.ts +66 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/_next_tick.ts +173 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/_process/exiting.ts +4 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/_process/process.ts +131 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/_process/stdio.mjs +7 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/_process/streams.mjs +146 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/_stream.d.ts +1488 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/_stream.mjs +746 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/_util/_util_callbackify.ts +129 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/_utils.ts +206 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/assert.ts +940 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/assertion_error.ts +579 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/async_hooks.ts +331 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/buffer.ts +13 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/events.ts +14 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/buffer.d.ts +2074 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/buffer.mjs +2607 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/crypto/_keys.ts +16 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/crypto/constants.ts +5 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/error_codes.ts +7 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/errors.ts +2867 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/fixed_queue.ts +123 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/hide_stack_frames.ts +16 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/net.ts +95 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/normalize_encoding.mjs +72 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/options.ts +45 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/primordials.mjs +30 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/process/per_thread.mjs +272 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/readline/callbacks.mjs +137 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/readline/utils.mjs +580 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/streams/destroy.mjs +320 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/streams/end-of-stream.mjs +229 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/streams/utils.mjs +242 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/util/comparisons.ts +669 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/util/debuglog.ts +118 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/util/inspect.mjs +2237 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/util/types.ts +113 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/util.mjs +143 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal/validators.mjs +317 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/_libuv_winerror.ts +229 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/_listen.ts +16 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/_node.ts +18 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/_timingSafeEqual.ts +12 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/_utils.ts +86 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/_winerror.ts +16873 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/ares.ts +66 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/async_wrap.ts +152 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/buffer.ts +130 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/cares_wrap.ts +541 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/config.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/connection_wrap.ts +80 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/constants.ts +900 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/contextify.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/credentials.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/crypto.ts +14 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/errors.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/fs.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/fs_dir.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/fs_event_wrap.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/handle_wrap.ts +50 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/heap_utils.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/http_parser.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/icu.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/inspector.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/js_stream.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/messaging.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/mod.ts +108 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/module_wrap.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/native_module.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/natives.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/node_file.ts +84 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/node_options.ts +39 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/options.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/os.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/performance.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/pipe_wrap.ts +392 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/process_methods.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/report.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/serdes.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/signal_wrap.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/spawn_sync.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/stream_wrap.ts +354 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/string_decoder.ts +15 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/symbols.ts +27 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/task_queue.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/tcp_wrap.ts +488 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/timers.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/tls_wrap.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/trace_events.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/tty_wrap.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/types.ts +186 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/udp_wrap.ts +496 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/url.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/util.ts +126 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/uv.ts +437 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/v8.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/worker.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/internal_binding/zlib.ts +3 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/process.ts +705 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/stream.ts +37 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/string_decoder.ts +337 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/util/types.ts +4 -0
- package/src/templates/vendor/deno.land/std@0.175.0/node/util.ts +289 -0
- package/src/templates/vendor/deno.land/std@0.175.0/path/_constants.ts +49 -0
- package/src/templates/vendor/deno.land/std@0.175.0/path/_interface.ts +30 -0
- package/src/templates/vendor/deno.land/std@0.175.0/path/_util.ts +194 -0
- package/src/templates/vendor/deno.land/std@0.175.0/path/common.ts +40 -0
- package/src/templates/vendor/deno.land/std@0.175.0/path/glob.ts +418 -0
- package/src/templates/vendor/deno.land/std@0.175.0/path/mod.ts +53 -0
- package/src/templates/vendor/deno.land/std@0.175.0/path/posix.ts +487 -0
- package/src/templates/vendor/deno.land/std@0.175.0/path/separator.ts +7 -0
- package/src/templates/vendor/deno.land/std@0.175.0/path/win32.ts +962 -0
- package/src/templates/vendor/deno.land/std@0.175.0/streams/write_all.ts +64 -0
- package/src/templates/vendor/deno.land/std@0.175.0/testing/_diff.ts +440 -0
- package/src/templates/vendor/deno.land/std@0.175.0/testing/_format.ts +23 -0
- package/src/templates/vendor/deno.land/std@0.175.0/testing/asserts.ts +906 -0
- package/src/templates/vendor/deno.land/std@0.175.0/types.d.ts +89 -0
- package/src/templates/vendor/deno.land/x/html_rewriter@v0.1.0-pre.17/index.ts +133 -0
- package/src/templates/vendor/deno.land/x/html_rewriter@v0.1.0-pre.17/vendor/asyncify.js +112 -0
- package/src/templates/vendor/deno.land/x/html_rewriter@v0.1.0-pre.17/vendor/html_rewriter.d.ts +88 -0
- package/src/templates/vendor/deno.land/x/html_rewriter@v0.1.0-pre.17/vendor/html_rewriter.js +974 -0
- package/src/templates/vendor/deno.land/x/path_to_regexp@v6.2.1/index.ts +621 -0
- package/src/templates/vendor/esm.sh/v91/next@12.2.5/deno/dist/compiled/cookie.js +13 -0
- package/src/templates/vendor/esm.sh/v91/next@12.2.5/deno/dist/server/web/spec-extension/request.js +12 -0
- package/src/templates/vendor/esm.sh/v91/next@12.2.5/deno/dist/server/web/spec-extension/response.js +5 -0
- package/src/templates/vendor/import_map.json +13 -0
- package/src/templates/vendor/raw.githubusercontent.com/worker-tools/resolvable-promise/master/index.ts +50 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
|
|
2
|
+
// Copyright Joyent, Inc. and other Node contributors.
|
|
3
|
+
//
|
|
4
|
+
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
5
|
+
// copy of this software and associated documentation files (the
|
|
6
|
+
// "Software"), to deal in the Software without restriction, including
|
|
7
|
+
// without limitation the rights to use, copy, modify, merge, publish,
|
|
8
|
+
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
9
|
+
// persons to whom the Software is furnished to do so, subject to the
|
|
10
|
+
// following conditions:
|
|
11
|
+
//
|
|
12
|
+
// The above copyright notice and this permission notice shall be included
|
|
13
|
+
// in all copies or substantial portions of the Software.
|
|
14
|
+
//
|
|
15
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
16
|
+
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
17
|
+
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
18
|
+
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
19
|
+
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
20
|
+
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
21
|
+
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
+
|
|
23
|
+
"use strict";
|
|
24
|
+
|
|
25
|
+
import { ERR_INVALID_ARG_VALUE, ERR_INVALID_CURSOR_POS } from "../errors.ts";
|
|
26
|
+
|
|
27
|
+
import { validateFunction } from "../validators.mjs";
|
|
28
|
+
|
|
29
|
+
import { CSI } from "./utils.mjs";
|
|
30
|
+
|
|
31
|
+
const {
|
|
32
|
+
kClearLine,
|
|
33
|
+
kClearScreenDown,
|
|
34
|
+
kClearToLineBeginning,
|
|
35
|
+
kClearToLineEnd,
|
|
36
|
+
} = CSI;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* moves the cursor to the x and y coordinate on the given stream
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
export function cursorTo(stream, x, y, callback) {
|
|
43
|
+
if (callback !== undefined) {
|
|
44
|
+
validateFunction(callback, "callback");
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (typeof y === "function") {
|
|
48
|
+
callback = y;
|
|
49
|
+
y = undefined;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (Number.isNaN(x)) throw new ERR_INVALID_ARG_VALUE("x", x);
|
|
53
|
+
if (Number.isNaN(y)) throw new ERR_INVALID_ARG_VALUE("y", y);
|
|
54
|
+
|
|
55
|
+
if (stream == null || (typeof x !== "number" && typeof y !== "number")) {
|
|
56
|
+
if (typeof callback === "function") process.nextTick(callback, null);
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (typeof x !== "number") throw new ERR_INVALID_CURSOR_POS();
|
|
61
|
+
|
|
62
|
+
const data = typeof y !== "number" ? CSI`${x + 1}G` : CSI`${y + 1};${x + 1}H`;
|
|
63
|
+
return stream.write(data, callback);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* moves the cursor relative to its current location
|
|
68
|
+
*/
|
|
69
|
+
|
|
70
|
+
export function moveCursor(stream, dx, dy, callback) {
|
|
71
|
+
if (callback !== undefined) {
|
|
72
|
+
validateFunction(callback, "callback");
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (stream == null || !(dx || dy)) {
|
|
76
|
+
if (typeof callback === "function") process.nextTick(callback, null);
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
let data = "";
|
|
81
|
+
|
|
82
|
+
if (dx < 0) {
|
|
83
|
+
data += CSI`${-dx}D`;
|
|
84
|
+
} else if (dx > 0) {
|
|
85
|
+
data += CSI`${dx}C`;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (dy < 0) {
|
|
89
|
+
data += CSI`${-dy}A`;
|
|
90
|
+
} else if (dy > 0) {
|
|
91
|
+
data += CSI`${dy}B`;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return stream.write(data, callback);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* clears the current line the cursor is on:
|
|
99
|
+
* -1 for left of the cursor
|
|
100
|
+
* +1 for right of the cursor
|
|
101
|
+
* 0 for the entire line
|
|
102
|
+
*/
|
|
103
|
+
|
|
104
|
+
export function clearLine(stream, dir, callback) {
|
|
105
|
+
if (callback !== undefined) {
|
|
106
|
+
validateFunction(callback, "callback");
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (stream === null || stream === undefined) {
|
|
110
|
+
if (typeof callback === "function") process.nextTick(callback, null);
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const type = dir < 0
|
|
115
|
+
? kClearToLineBeginning
|
|
116
|
+
: dir > 0
|
|
117
|
+
? kClearToLineEnd
|
|
118
|
+
: kClearLine;
|
|
119
|
+
return stream.write(type, callback);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* clears the screen from the current position of the cursor down
|
|
124
|
+
*/
|
|
125
|
+
|
|
126
|
+
export function clearScreenDown(stream, callback) {
|
|
127
|
+
if (callback !== undefined) {
|
|
128
|
+
validateFunction(callback, "callback");
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (stream === null || stream === undefined) {
|
|
132
|
+
if (typeof callback === "function") process.nextTick(callback, null);
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return stream.write(kClearScreenDown, callback);
|
|
137
|
+
}
|
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
|
|
2
|
+
// Copyright Joyent, Inc. and other Node contributors.
|
|
3
|
+
//
|
|
4
|
+
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
5
|
+
// copy of this software and associated documentation files (the
|
|
6
|
+
// "Software"), to deal in the Software without restriction, including
|
|
7
|
+
// without limitation the rights to use, copy, modify, merge, publish,
|
|
8
|
+
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
9
|
+
// persons to whom the Software is furnished to do so, subject to the
|
|
10
|
+
// following conditions:
|
|
11
|
+
//
|
|
12
|
+
// The above copyright notice and this permission notice shall be included
|
|
13
|
+
// in all copies or substantial portions of the Software.
|
|
14
|
+
//
|
|
15
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
16
|
+
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
17
|
+
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
18
|
+
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
19
|
+
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
20
|
+
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
21
|
+
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
+
|
|
23
|
+
"use strict";
|
|
24
|
+
|
|
25
|
+
const kUTF16SurrogateThreshold = 0x10000; // 2 ** 16
|
|
26
|
+
const kEscape = "\x1b";
|
|
27
|
+
export const kSubstringSearch = Symbol("kSubstringSearch");
|
|
28
|
+
|
|
29
|
+
export function CSI(strings, ...args) {
|
|
30
|
+
let ret = `${kEscape}[`;
|
|
31
|
+
for (let n = 0; n < strings.length; n++) {
|
|
32
|
+
ret += strings[n];
|
|
33
|
+
if (n < args.length) {
|
|
34
|
+
ret += args[n];
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return ret;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
CSI.kEscape = kEscape;
|
|
41
|
+
CSI.kClearToLineBeginning = CSI`1K`;
|
|
42
|
+
CSI.kClearToLineEnd = CSI`0K`;
|
|
43
|
+
CSI.kClearLine = CSI`2K`;
|
|
44
|
+
CSI.kClearScreenDown = CSI`0J`;
|
|
45
|
+
|
|
46
|
+
// TODO(BridgeAR): Treat combined characters as single character, i.e,
|
|
47
|
+
// 'a\u0301' and '\u0301a' (both have the same visual output).
|
|
48
|
+
// Check Canonical_Combining_Class in
|
|
49
|
+
// http://userguide.icu-project.org/strings/properties
|
|
50
|
+
export function charLengthLeft(str, i) {
|
|
51
|
+
if (i <= 0) {
|
|
52
|
+
return 0;
|
|
53
|
+
}
|
|
54
|
+
if (
|
|
55
|
+
(i > 1 &&
|
|
56
|
+
str.codePointAt(i - 2) >= kUTF16SurrogateThreshold) ||
|
|
57
|
+
str.codePointAt(i - 1) >= kUTF16SurrogateThreshold
|
|
58
|
+
) {
|
|
59
|
+
return 2;
|
|
60
|
+
}
|
|
61
|
+
return 1;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function charLengthAt(str, i) {
|
|
65
|
+
if (str.length <= i) {
|
|
66
|
+
// Pretend to move to the right. This is necessary to autocomplete while
|
|
67
|
+
// moving to the right.
|
|
68
|
+
return 1;
|
|
69
|
+
}
|
|
70
|
+
return str.codePointAt(i) >= kUTF16SurrogateThreshold ? 2 : 1;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/*
|
|
74
|
+
Some patterns seen in terminal key escape codes, derived from combos seen
|
|
75
|
+
at http://www.midnight-commander.org/browser/lib/tty/key.c
|
|
76
|
+
|
|
77
|
+
ESC letter
|
|
78
|
+
ESC [ letter
|
|
79
|
+
ESC [ modifier letter
|
|
80
|
+
ESC [ 1 ; modifier letter
|
|
81
|
+
ESC [ num char
|
|
82
|
+
ESC [ num ; modifier char
|
|
83
|
+
ESC O letter
|
|
84
|
+
ESC O modifier letter
|
|
85
|
+
ESC O 1 ; modifier letter
|
|
86
|
+
ESC N letter
|
|
87
|
+
ESC [ [ num ; modifier char
|
|
88
|
+
ESC [ [ 1 ; modifier letter
|
|
89
|
+
ESC ESC [ num char
|
|
90
|
+
ESC ESC O letter
|
|
91
|
+
|
|
92
|
+
- char is usually ~ but $ and ^ also happen with rxvt
|
|
93
|
+
- modifier is 1 +
|
|
94
|
+
(shift * 1) +
|
|
95
|
+
(left_alt * 2) +
|
|
96
|
+
(ctrl * 4) +
|
|
97
|
+
(right_alt * 8)
|
|
98
|
+
- two leading ESCs apparently mean the same as one leading ESC
|
|
99
|
+
*/
|
|
100
|
+
export function* emitKeys(stream) {
|
|
101
|
+
while (true) {
|
|
102
|
+
let ch = yield;
|
|
103
|
+
let s = ch;
|
|
104
|
+
let escaped = false;
|
|
105
|
+
const key = {
|
|
106
|
+
sequence: null,
|
|
107
|
+
name: undefined,
|
|
108
|
+
ctrl: false,
|
|
109
|
+
meta: false,
|
|
110
|
+
shift: false,
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
if (ch === kEscape) {
|
|
114
|
+
escaped = true;
|
|
115
|
+
s += ch = yield;
|
|
116
|
+
|
|
117
|
+
if (ch === kEscape) {
|
|
118
|
+
s += ch = yield;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (escaped && (ch === "O" || ch === "[")) {
|
|
123
|
+
// ANSI escape sequence
|
|
124
|
+
let code = ch;
|
|
125
|
+
let modifier = 0;
|
|
126
|
+
|
|
127
|
+
if (ch === "O") {
|
|
128
|
+
// ESC O letter
|
|
129
|
+
// ESC O modifier letter
|
|
130
|
+
s += ch = yield;
|
|
131
|
+
|
|
132
|
+
if (ch >= "0" && ch <= "9") {
|
|
133
|
+
modifier = (ch >> 0) - 1;
|
|
134
|
+
s += ch = yield;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
code += ch;
|
|
138
|
+
} else if (ch === "[") {
|
|
139
|
+
// ESC [ letter
|
|
140
|
+
// ESC [ modifier letter
|
|
141
|
+
// ESC [ [ modifier letter
|
|
142
|
+
// ESC [ [ num char
|
|
143
|
+
s += ch = yield;
|
|
144
|
+
|
|
145
|
+
if (ch === "[") {
|
|
146
|
+
// \x1b[[A
|
|
147
|
+
// ^--- escape codes might have a second bracket
|
|
148
|
+
code += ch;
|
|
149
|
+
s += ch = yield;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/*
|
|
153
|
+
* Here and later we try to buffer just enough data to get
|
|
154
|
+
* a complete ascii sequence.
|
|
155
|
+
*
|
|
156
|
+
* We have basically two classes of ascii characters to process:
|
|
157
|
+
*
|
|
158
|
+
* 1. `\x1b[24;5~` should be parsed as { code: '[24~', modifier: 5 }
|
|
159
|
+
*
|
|
160
|
+
* This particular example is featuring Ctrl+F12 in xterm.
|
|
161
|
+
*
|
|
162
|
+
* - `;5` part is optional, e.g. it could be `\x1b[24~`
|
|
163
|
+
* - first part can contain one or two digits
|
|
164
|
+
*
|
|
165
|
+
* So the generic regexp is like /^\d\d?(;\d)?[~^$]$/
|
|
166
|
+
*
|
|
167
|
+
* 2. `\x1b[1;5H` should be parsed as { code: '[H', modifier: 5 }
|
|
168
|
+
*
|
|
169
|
+
* This particular example is featuring Ctrl+Home in xterm.
|
|
170
|
+
*
|
|
171
|
+
* - `1;5` part is optional, e.g. it could be `\x1b[H`
|
|
172
|
+
* - `1;` part is optional, e.g. it could be `\x1b[5H`
|
|
173
|
+
*
|
|
174
|
+
* So the generic regexp is like /^((\d;)?\d)?[A-Za-z]$/
|
|
175
|
+
*/
|
|
176
|
+
const cmdStart = s.length - 1;
|
|
177
|
+
|
|
178
|
+
// Skip one or two leading digits
|
|
179
|
+
if (ch >= "0" && ch <= "9") {
|
|
180
|
+
s += ch = yield;
|
|
181
|
+
|
|
182
|
+
if (ch >= "0" && ch <= "9") {
|
|
183
|
+
s += ch = yield;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// skip modifier
|
|
188
|
+
if (ch === ";") {
|
|
189
|
+
s += ch = yield;
|
|
190
|
+
|
|
191
|
+
if (ch >= "0" && ch <= "9") {
|
|
192
|
+
s += yield;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/*
|
|
197
|
+
* We buffered enough data, now trying to extract code
|
|
198
|
+
* and modifier from it
|
|
199
|
+
*/
|
|
200
|
+
const cmd = s.slice(cmdStart);
|
|
201
|
+
let match;
|
|
202
|
+
|
|
203
|
+
if ((match = cmd.match(/^(\d\d?)(;(\d))?([~^$])$/))) {
|
|
204
|
+
code += match[1] + match[4];
|
|
205
|
+
modifier = (match[3] || 1) - 1;
|
|
206
|
+
} else if (
|
|
207
|
+
(match = cmd.match(/^((\d;)?(\d))?([A-Za-z])$/))
|
|
208
|
+
) {
|
|
209
|
+
code += match[4];
|
|
210
|
+
modifier = (match[3] || 1) - 1;
|
|
211
|
+
} else {
|
|
212
|
+
code += cmd;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Parse the key modifier
|
|
217
|
+
key.ctrl = !!(modifier & 4);
|
|
218
|
+
key.meta = !!(modifier & 10);
|
|
219
|
+
key.shift = !!(modifier & 1);
|
|
220
|
+
key.code = code;
|
|
221
|
+
|
|
222
|
+
// Parse the key itself
|
|
223
|
+
switch (code) {
|
|
224
|
+
/* xterm/gnome ESC [ letter (with modifier) */
|
|
225
|
+
case "[P":
|
|
226
|
+
key.name = "f1";
|
|
227
|
+
break;
|
|
228
|
+
case "[Q":
|
|
229
|
+
key.name = "f2";
|
|
230
|
+
break;
|
|
231
|
+
case "[R":
|
|
232
|
+
key.name = "f3";
|
|
233
|
+
break;
|
|
234
|
+
case "[S":
|
|
235
|
+
key.name = "f4";
|
|
236
|
+
break;
|
|
237
|
+
|
|
238
|
+
/* xterm/gnome ESC O letter (without modifier) */
|
|
239
|
+
|
|
240
|
+
case "OP":
|
|
241
|
+
key.name = "f1";
|
|
242
|
+
break;
|
|
243
|
+
case "OQ":
|
|
244
|
+
key.name = "f2";
|
|
245
|
+
break;
|
|
246
|
+
case "OR":
|
|
247
|
+
key.name = "f3";
|
|
248
|
+
break;
|
|
249
|
+
case "OS":
|
|
250
|
+
key.name = "f4";
|
|
251
|
+
break;
|
|
252
|
+
|
|
253
|
+
/* xterm/rxvt ESC [ number ~ */
|
|
254
|
+
|
|
255
|
+
case "[11~":
|
|
256
|
+
key.name = "f1";
|
|
257
|
+
break;
|
|
258
|
+
case "[12~":
|
|
259
|
+
key.name = "f2";
|
|
260
|
+
break;
|
|
261
|
+
case "[13~":
|
|
262
|
+
key.name = "f3";
|
|
263
|
+
break;
|
|
264
|
+
case "[14~":
|
|
265
|
+
key.name = "f4";
|
|
266
|
+
break;
|
|
267
|
+
|
|
268
|
+
/* from Cygwin and used in libuv */
|
|
269
|
+
|
|
270
|
+
case "[[A":
|
|
271
|
+
key.name = "f1";
|
|
272
|
+
break;
|
|
273
|
+
case "[[B":
|
|
274
|
+
key.name = "f2";
|
|
275
|
+
break;
|
|
276
|
+
case "[[C":
|
|
277
|
+
key.name = "f3";
|
|
278
|
+
break;
|
|
279
|
+
case "[[D":
|
|
280
|
+
key.name = "f4";
|
|
281
|
+
break;
|
|
282
|
+
case "[[E":
|
|
283
|
+
key.name = "f5";
|
|
284
|
+
break;
|
|
285
|
+
|
|
286
|
+
/* common */
|
|
287
|
+
|
|
288
|
+
case "[15~":
|
|
289
|
+
key.name = "f5";
|
|
290
|
+
break;
|
|
291
|
+
case "[17~":
|
|
292
|
+
key.name = "f6";
|
|
293
|
+
break;
|
|
294
|
+
case "[18~":
|
|
295
|
+
key.name = "f7";
|
|
296
|
+
break;
|
|
297
|
+
case "[19~":
|
|
298
|
+
key.name = "f8";
|
|
299
|
+
break;
|
|
300
|
+
case "[20~":
|
|
301
|
+
key.name = "f9";
|
|
302
|
+
break;
|
|
303
|
+
case "[21~":
|
|
304
|
+
key.name = "f10";
|
|
305
|
+
break;
|
|
306
|
+
case "[23~":
|
|
307
|
+
key.name = "f11";
|
|
308
|
+
break;
|
|
309
|
+
case "[24~":
|
|
310
|
+
key.name = "f12";
|
|
311
|
+
break;
|
|
312
|
+
|
|
313
|
+
/* xterm ESC [ letter */
|
|
314
|
+
|
|
315
|
+
case "[A":
|
|
316
|
+
key.name = "up";
|
|
317
|
+
break;
|
|
318
|
+
case "[B":
|
|
319
|
+
key.name = "down";
|
|
320
|
+
break;
|
|
321
|
+
case "[C":
|
|
322
|
+
key.name = "right";
|
|
323
|
+
break;
|
|
324
|
+
case "[D":
|
|
325
|
+
key.name = "left";
|
|
326
|
+
break;
|
|
327
|
+
case "[E":
|
|
328
|
+
key.name = "clear";
|
|
329
|
+
break;
|
|
330
|
+
case "[F":
|
|
331
|
+
key.name = "end";
|
|
332
|
+
break;
|
|
333
|
+
case "[H":
|
|
334
|
+
key.name = "home";
|
|
335
|
+
break;
|
|
336
|
+
|
|
337
|
+
/* xterm/gnome ESC O letter */
|
|
338
|
+
|
|
339
|
+
case "OA":
|
|
340
|
+
key.name = "up";
|
|
341
|
+
break;
|
|
342
|
+
case "OB":
|
|
343
|
+
key.name = "down";
|
|
344
|
+
break;
|
|
345
|
+
case "OC":
|
|
346
|
+
key.name = "right";
|
|
347
|
+
break;
|
|
348
|
+
case "OD":
|
|
349
|
+
key.name = "left";
|
|
350
|
+
break;
|
|
351
|
+
case "OE":
|
|
352
|
+
key.name = "clear";
|
|
353
|
+
break;
|
|
354
|
+
case "OF":
|
|
355
|
+
key.name = "end";
|
|
356
|
+
break;
|
|
357
|
+
case "OH":
|
|
358
|
+
key.name = "home";
|
|
359
|
+
break;
|
|
360
|
+
|
|
361
|
+
/* xterm/rxvt ESC [ number ~ */
|
|
362
|
+
|
|
363
|
+
case "[1~":
|
|
364
|
+
key.name = "home";
|
|
365
|
+
break;
|
|
366
|
+
case "[2~":
|
|
367
|
+
key.name = "insert";
|
|
368
|
+
break;
|
|
369
|
+
case "[3~":
|
|
370
|
+
key.name = "delete";
|
|
371
|
+
break;
|
|
372
|
+
case "[4~":
|
|
373
|
+
key.name = "end";
|
|
374
|
+
break;
|
|
375
|
+
case "[5~":
|
|
376
|
+
key.name = "pageup";
|
|
377
|
+
break;
|
|
378
|
+
case "[6~":
|
|
379
|
+
key.name = "pagedown";
|
|
380
|
+
break;
|
|
381
|
+
|
|
382
|
+
/* putty */
|
|
383
|
+
|
|
384
|
+
case "[[5~":
|
|
385
|
+
key.name = "pageup";
|
|
386
|
+
break;
|
|
387
|
+
case "[[6~":
|
|
388
|
+
key.name = "pagedown";
|
|
389
|
+
break;
|
|
390
|
+
|
|
391
|
+
/* rxvt */
|
|
392
|
+
|
|
393
|
+
case "[7~":
|
|
394
|
+
key.name = "home";
|
|
395
|
+
break;
|
|
396
|
+
case "[8~":
|
|
397
|
+
key.name = "end";
|
|
398
|
+
break;
|
|
399
|
+
|
|
400
|
+
/* rxvt keys with modifiers */
|
|
401
|
+
|
|
402
|
+
case "[a":
|
|
403
|
+
key.name = "up";
|
|
404
|
+
key.shift = true;
|
|
405
|
+
break;
|
|
406
|
+
case "[b":
|
|
407
|
+
key.name = "down";
|
|
408
|
+
key.shift = true;
|
|
409
|
+
break;
|
|
410
|
+
case "[c":
|
|
411
|
+
key.name = "right";
|
|
412
|
+
key.shift = true;
|
|
413
|
+
break;
|
|
414
|
+
case "[d":
|
|
415
|
+
key.name = "left";
|
|
416
|
+
key.shift = true;
|
|
417
|
+
break;
|
|
418
|
+
case "[e":
|
|
419
|
+
key.name = "clear";
|
|
420
|
+
key.shift = true;
|
|
421
|
+
break;
|
|
422
|
+
|
|
423
|
+
case "[2$":
|
|
424
|
+
key.name = "insert";
|
|
425
|
+
key.shift = true;
|
|
426
|
+
break;
|
|
427
|
+
case "[3$":
|
|
428
|
+
key.name = "delete";
|
|
429
|
+
key.shift = true;
|
|
430
|
+
break;
|
|
431
|
+
case "[5$":
|
|
432
|
+
key.name = "pageup";
|
|
433
|
+
key.shift = true;
|
|
434
|
+
break;
|
|
435
|
+
case "[6$":
|
|
436
|
+
key.name = "pagedown";
|
|
437
|
+
key.shift = true;
|
|
438
|
+
break;
|
|
439
|
+
case "[7$":
|
|
440
|
+
key.name = "home";
|
|
441
|
+
key.shift = true;
|
|
442
|
+
break;
|
|
443
|
+
case "[8$":
|
|
444
|
+
key.name = "end";
|
|
445
|
+
key.shift = true;
|
|
446
|
+
break;
|
|
447
|
+
|
|
448
|
+
case "Oa":
|
|
449
|
+
key.name = "up";
|
|
450
|
+
key.ctrl = true;
|
|
451
|
+
break;
|
|
452
|
+
case "Ob":
|
|
453
|
+
key.name = "down";
|
|
454
|
+
key.ctrl = true;
|
|
455
|
+
break;
|
|
456
|
+
case "Oc":
|
|
457
|
+
key.name = "right";
|
|
458
|
+
key.ctrl = true;
|
|
459
|
+
break;
|
|
460
|
+
case "Od":
|
|
461
|
+
key.name = "left";
|
|
462
|
+
key.ctrl = true;
|
|
463
|
+
break;
|
|
464
|
+
case "Oe":
|
|
465
|
+
key.name = "clear";
|
|
466
|
+
key.ctrl = true;
|
|
467
|
+
break;
|
|
468
|
+
|
|
469
|
+
case "[2^":
|
|
470
|
+
key.name = "insert";
|
|
471
|
+
key.ctrl = true;
|
|
472
|
+
break;
|
|
473
|
+
case "[3^":
|
|
474
|
+
key.name = "delete";
|
|
475
|
+
key.ctrl = true;
|
|
476
|
+
break;
|
|
477
|
+
case "[5^":
|
|
478
|
+
key.name = "pageup";
|
|
479
|
+
key.ctrl = true;
|
|
480
|
+
break;
|
|
481
|
+
case "[6^":
|
|
482
|
+
key.name = "pagedown";
|
|
483
|
+
key.ctrl = true;
|
|
484
|
+
break;
|
|
485
|
+
case "[7^":
|
|
486
|
+
key.name = "home";
|
|
487
|
+
key.ctrl = true;
|
|
488
|
+
break;
|
|
489
|
+
case "[8^":
|
|
490
|
+
key.name = "end";
|
|
491
|
+
key.ctrl = true;
|
|
492
|
+
break;
|
|
493
|
+
|
|
494
|
+
/* misc. */
|
|
495
|
+
|
|
496
|
+
case "[Z":
|
|
497
|
+
key.name = "tab";
|
|
498
|
+
key.shift = true;
|
|
499
|
+
break;
|
|
500
|
+
default:
|
|
501
|
+
key.name = "undefined";
|
|
502
|
+
break;
|
|
503
|
+
}
|
|
504
|
+
} else if (ch === "\r") {
|
|
505
|
+
// carriage return
|
|
506
|
+
key.name = "return";
|
|
507
|
+
key.meta = escaped;
|
|
508
|
+
} else if (ch === "\n") {
|
|
509
|
+
// Enter, should have been called linefeed
|
|
510
|
+
key.name = "enter";
|
|
511
|
+
key.meta = escaped;
|
|
512
|
+
} else if (ch === "\t") {
|
|
513
|
+
// tab
|
|
514
|
+
key.name = "tab";
|
|
515
|
+
key.meta = escaped;
|
|
516
|
+
} else if (ch === "\b" || ch === "\x7f") {
|
|
517
|
+
// backspace or ctrl+h
|
|
518
|
+
key.name = "backspace";
|
|
519
|
+
key.meta = escaped;
|
|
520
|
+
} else if (ch === kEscape) {
|
|
521
|
+
// escape key
|
|
522
|
+
key.name = "escape";
|
|
523
|
+
key.meta = escaped;
|
|
524
|
+
} else if (ch === " ") {
|
|
525
|
+
key.name = "space";
|
|
526
|
+
key.meta = escaped;
|
|
527
|
+
} else if (!escaped && ch <= "\x1a") {
|
|
528
|
+
// ctrl+letter
|
|
529
|
+
key.name = String.fromCharCode(
|
|
530
|
+
ch.charCodeAt() + "a".charCodeAt() - 1,
|
|
531
|
+
);
|
|
532
|
+
key.ctrl = true;
|
|
533
|
+
} else if (/^[0-9A-Za-z]$/.test(ch)) {
|
|
534
|
+
// Letter, number, shift+letter
|
|
535
|
+
key.name = ch.toLowerCase();
|
|
536
|
+
key.shift = /^[A-Z]$/.test(ch);
|
|
537
|
+
key.meta = escaped;
|
|
538
|
+
} else if (escaped) {
|
|
539
|
+
// Escape sequence timeout
|
|
540
|
+
key.name = ch.length ? undefined : "escape";
|
|
541
|
+
key.meta = true;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
key.sequence = s;
|
|
545
|
+
|
|
546
|
+
if (s.length !== 0 && (key.name !== undefined || escaped)) {
|
|
547
|
+
/* Named character or sequence */
|
|
548
|
+
stream.emit("keypress", escaped ? undefined : s, key);
|
|
549
|
+
} else if (charLengthAt(s, 0) === s.length) {
|
|
550
|
+
/* Single unnamed character, e.g. "." */
|
|
551
|
+
stream.emit("keypress", s, key);
|
|
552
|
+
}
|
|
553
|
+
/* Unrecognized or broken escape sequence, don't emit anything */
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
// This runs in O(n log n).
|
|
558
|
+
export function commonPrefix(strings) {
|
|
559
|
+
if (strings.length === 1) {
|
|
560
|
+
return strings[0];
|
|
561
|
+
}
|
|
562
|
+
const sorted = strings.slice().sort();
|
|
563
|
+
const min = sorted[0];
|
|
564
|
+
const max = sorted[sorted.length - 1];
|
|
565
|
+
for (let i = 0; i < min.length; i++) {
|
|
566
|
+
if (min[i] !== max[i]) {
|
|
567
|
+
return min.slice(0, i);
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
return min;
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
export default {
|
|
574
|
+
CSI,
|
|
575
|
+
charLengthAt,
|
|
576
|
+
charLengthLeft,
|
|
577
|
+
emitKeys,
|
|
578
|
+
commonPrefix,
|
|
579
|
+
kSubstringSearch,
|
|
580
|
+
};
|