@gadgetinc/ggt 1.0.3 → 1.0.5
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/add-4ME2KTJQ.js +84 -0
- package/dist/add-4ME2KTJQ.js.map +7 -0
- package/dist/build-4BGA4IZE.js +3 -0
- package/dist/build-4BGA4IZE.js.map +7 -0
- package/dist/chunk-57XALM2W.js +2 -0
- package/dist/chunk-57XALM2W.js.map +7 -0
- package/dist/chunk-5DLLJX5F.js +11 -0
- package/dist/chunk-5DLLJX5F.js.map +7 -0
- package/dist/chunk-5WC5D4WL.js +2 -0
- package/dist/chunk-5WC5D4WL.js.map +7 -0
- package/dist/chunk-BSCZOMV4.js +2 -0
- package/dist/chunk-BSCZOMV4.js.map +7 -0
- package/dist/chunk-BZY2AIPV.js +57 -0
- package/dist/chunk-BZY2AIPV.js.map +7 -0
- package/dist/chunk-D2K5XPNJ.js +2 -0
- package/dist/chunk-D2K5XPNJ.js.map +7 -0
- package/dist/chunk-F3EZ4KS3.js +2 -0
- package/dist/chunk-F3EZ4KS3.js.map +7 -0
- package/dist/chunk-G3VNV5Z6.js +33 -0
- package/dist/chunk-G3VNV5Z6.js.map +7 -0
- package/dist/chunk-GA7AL463.js +24 -0
- package/dist/chunk-GA7AL463.js.map +7 -0
- package/dist/chunk-GOBNB5VT.js +2 -0
- package/dist/chunk-GOBNB5VT.js.map +7 -0
- package/dist/chunk-HKBXEZNF.js +2 -0
- package/dist/chunk-HKBXEZNF.js.map +7 -0
- package/{lib/commands/push.js → dist/chunk-IKJVXTZK.js} +7 -48
- package/dist/chunk-IKJVXTZK.js.map +7 -0
- package/dist/chunk-KGSSHEEC.js +17 -0
- package/dist/chunk-KGSSHEEC.js.map +7 -0
- package/dist/chunk-KXK37C5D.js +183 -0
- package/dist/chunk-KXK37C5D.js.map +7 -0
- package/dist/chunk-NJIDVM2C.js +27 -0
- package/dist/chunk-NJIDVM2C.js.map +7 -0
- package/dist/chunk-Q5N5L6H3.js +6 -0
- package/dist/chunk-Q5N5L6H3.js.map +7 -0
- package/dist/chunk-QEVWPU3D.js +8 -0
- package/dist/chunk-QEVWPU3D.js.map +7 -0
- package/dist/chunk-X36GM74C.js +2 -0
- package/dist/chunk-X36GM74C.js.map +7 -0
- package/dist/chunk-YRP2UZ2I.js +126 -0
- package/dist/chunk-YRP2UZ2I.js.map +7 -0
- package/dist/deploy-6HOBYPE6.js +30 -0
- package/dist/deploy-6HOBYPE6.js.map +7 -0
- package/dist/dev-M3WDGK4D.js +57 -0
- package/dist/dev-M3WDGK4D.js.map +7 -0
- package/dist/esm-BL3OM5UJ.js +33 -0
- package/dist/esm-BL3OM5UJ.js.map +7 -0
- package/dist/list-725RHWD5.js +11 -0
- package/dist/list-725RHWD5.js.map +7 -0
- package/dist/login-I4RGMDLE.js +2 -0
- package/dist/login-I4RGMDLE.js.map +7 -0
- package/dist/logout-UZBACOIX.js +7 -0
- package/dist/logout-UZBACOIX.js.map +7 -0
- package/dist/main.js +45 -0
- package/dist/main.js.map +7 -0
- package/dist/open-GWKGQQG3.js +74 -0
- package/dist/open-GWKGQQG3.js.map +7 -0
- package/{lib/commands/pull.js → dist/pull-7C5A65KB.js} +7 -48
- package/dist/pull-7C5A65KB.js.map +7 -0
- package/dist/push-LPUIR4EO.js +2 -0
- package/dist/push-LPUIR4EO.js.map +7 -0
- package/dist/status-DFKKSRVB.js +14 -0
- package/dist/status-DFKKSRVB.js.map +7 -0
- package/dist/version-JD42JXWY.js +11 -0
- package/dist/version-JD42JXWY.js.map +7 -0
- package/dist/whoami-I23R6HOG.js +7 -0
- package/dist/whoami-I23R6HOG.js.map +7 -0
- package/package.json +73 -75
- package/lib/__generated__/graphql.js +0 -78
- package/lib/__generated__/graphql.js.map +0 -1
- package/lib/commands/add.js +0 -385
- package/lib/commands/add.js.map +0 -1
- package/lib/commands/deploy.js +0 -287
- package/lib/commands/deploy.js.map +0 -1
- package/lib/commands/dev.js +0 -374
- package/lib/commands/dev.js.map +0 -1
- package/lib/commands/list.js +0 -47
- package/lib/commands/list.js.map +0 -1
- package/lib/commands/login.js +0 -93
- package/lib/commands/login.js.map +0 -1
- package/lib/commands/logout.js +0 -20
- package/lib/commands/logout.js.map +0 -1
- package/lib/commands/open.js +0 -159
- package/lib/commands/open.js.map +0 -1
- package/lib/commands/pull.js.map +0 -1
- package/lib/commands/push.js.map +0 -1
- package/lib/commands/root.js +0 -110
- package/lib/commands/root.js.map +0 -1
- package/lib/commands/status.js +0 -56
- package/lib/commands/status.js.map +0 -1
- package/lib/commands/version.js +0 -18
- package/lib/commands/version.js.map +0 -1
- package/lib/commands/whoami.js +0 -23
- package/lib/commands/whoami.js.map +0 -1
- package/lib/ggt.js +0 -65
- package/lib/ggt.js.map +0 -1
- package/lib/main.js +0 -5
- package/lib/main.js.map +0 -1
- package/lib/services/app/api/api.js +0 -191
- package/lib/services/app/api/api.js.map +0 -1
- package/lib/services/app/api/operation.js +0 -23
- package/lib/services/app/api/operation.js.map +0 -1
- package/lib/services/app/app.js +0 -95
- package/lib/services/app/app.js.map +0 -1
- package/lib/services/app/arg.js +0 -28
- package/lib/services/app/arg.js.map +0 -1
- package/lib/services/app/client.js +0 -182
- package/lib/services/app/client.js.map +0 -1
- package/lib/services/app/edit/edit.js +0 -191
- package/lib/services/app/edit/edit.js.map +0 -1
- package/lib/services/app/edit/operation.js +0 -155
- package/lib/services/app/edit/operation.js.map +0 -1
- package/lib/services/app/error.js +0 -65
- package/lib/services/app/error.js.map +0 -1
- package/lib/services/command/arg.js +0 -55
- package/lib/services/command/arg.js.map +0 -1
- package/lib/services/command/command.js +0 -47
- package/lib/services/command/command.js.map +0 -1
- package/lib/services/command/context.js +0 -209
- package/lib/services/command/context.js.map +0 -1
- package/lib/services/config/config.js +0 -133
- package/lib/services/config/config.js.map +0 -1
- package/lib/services/config/env.js +0 -22
- package/lib/services/config/env.js.map +0 -1
- package/lib/services/config/package-json.js +0 -9
- package/lib/services/config/package-json.js.map +0 -1
- package/lib/services/filesync/changes.js +0 -134
- package/lib/services/filesync/changes.js.map +0 -1
- package/lib/services/filesync/conflicts.js +0 -140
- package/lib/services/filesync/conflicts.js.map +0 -1
- package/lib/services/filesync/directory.js +0 -269
- package/lib/services/filesync/directory.js.map +0 -1
- package/lib/services/filesync/error.js +0 -137
- package/lib/services/filesync/error.js.map +0 -1
- package/lib/services/filesync/file.js +0 -3
- package/lib/services/filesync/file.js.map +0 -1
- package/lib/services/filesync/filesync.js +0 -791
- package/lib/services/filesync/filesync.js.map +0 -1
- package/lib/services/filesync/hashes.js +0 -172
- package/lib/services/filesync/hashes.js.map +0 -1
- package/lib/services/filesync/strategy.js +0 -59
- package/lib/services/filesync/strategy.js.map +0 -1
- package/lib/services/filesync/sync-json.js +0 -475
- package/lib/services/filesync/sync-json.js.map +0 -1
- package/lib/services/http/auth.js +0 -70
- package/lib/services/http/auth.js.map +0 -1
- package/lib/services/http/http.js +0 -136
- package/lib/services/http/http.js.map +0 -1
- package/lib/services/output/confirm.js +0 -149
- package/lib/services/output/confirm.js.map +0 -1
- package/lib/services/output/footer.js +0 -22
- package/lib/services/output/footer.js.map +0 -1
- package/lib/services/output/log/field.js +0 -3
- package/lib/services/output/log/field.js.map +0 -1
- package/lib/services/output/log/format/format.js +0 -8
- package/lib/services/output/log/format/format.js.map +0 -1
- package/lib/services/output/log/format/json.js +0 -37
- package/lib/services/output/log/format/json.js.map +0 -1
- package/lib/services/output/log/format/pretty.js +0 -158
- package/lib/services/output/log/format/pretty.js.map +0 -1
- package/lib/services/output/log/level.js +0 -41
- package/lib/services/output/log/level.js.map +0 -1
- package/lib/services/output/log/logger.js +0 -53
- package/lib/services/output/log/logger.js.map +0 -1
- package/lib/services/output/log/structured.js +0 -52
- package/lib/services/output/log/structured.js.map +0 -1
- package/lib/services/output/notify.js +0 -27
- package/lib/services/output/notify.js.map +0 -1
- package/lib/services/output/output.js +0 -197
- package/lib/services/output/output.js.map +0 -1
- package/lib/services/output/print.js +0 -31
- package/lib/services/output/print.js.map +0 -1
- package/lib/services/output/problems.js +0 -84
- package/lib/services/output/problems.js.map +0 -1
- package/lib/services/output/prompt.js +0 -185
- package/lib/services/output/prompt.js.map +0 -1
- package/lib/services/output/report.js +0 -190
- package/lib/services/output/report.js.map +0 -1
- package/lib/services/output/select.js +0 -198
- package/lib/services/output/select.js.map +0 -1
- package/lib/services/output/spinner.js +0 -141
- package/lib/services/output/spinner.js.map +0 -1
- package/lib/services/output/sprint.js +0 -44
- package/lib/services/output/sprint.js.map +0 -1
- package/lib/services/output/symbols.js +0 -23
- package/lib/services/output/symbols.js.map +0 -1
- package/lib/services/output/table.js +0 -98
- package/lib/services/output/table.js.map +0 -1
- package/lib/services/output/timestamp.js +0 -12
- package/lib/services/output/timestamp.js.map +0 -1
- package/lib/services/output/update.js +0 -99
- package/lib/services/output/update.js.map +0 -1
- package/lib/services/user/session.js +0 -54
- package/lib/services/user/session.js.map +0 -1
- package/lib/services/user/user.js +0 -76
- package/lib/services/user/user.js.map +0 -1
- package/lib/services/util/assert.js +0 -11
- package/lib/services/util/assert.js.map +0 -1
- package/lib/services/util/boolean.js +0 -15
- package/lib/services/util/boolean.js.map +0 -1
- package/lib/services/util/collection.js +0 -38
- package/lib/services/util/collection.js.map +0 -1
- package/lib/services/util/function.js +0 -153
- package/lib/services/util/function.js.map +0 -1
- package/lib/services/util/is.js +0 -97
- package/lib/services/util/is.js.map +0 -1
- package/lib/services/util/json.js +0 -33
- package/lib/services/util/json.js.map +0 -1
- package/lib/services/util/number.js +0 -27
- package/lib/services/util/number.js.map +0 -1
- package/lib/services/util/object.js +0 -104
- package/lib/services/util/object.js.map +0 -1
- package/lib/services/util/paths.js +0 -36
- package/lib/services/util/paths.js.map +0 -1
- package/lib/services/util/promise.js +0 -74
- package/lib/services/util/promise.js.map +0 -1
- package/lib/services/util/types.js +0 -5
- package/lib/services/util/types.js.map +0 -1
- package/npm-shrinkwrap.json +0 -29512
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
import { _ as _define_property } from "@swc/helpers/_/_define_property";
|
|
2
|
-
import ansiEscapes from "ansi-escapes";
|
|
3
|
-
import assert from "node:assert";
|
|
4
|
-
import EventEmitter from "node:events";
|
|
5
|
-
import process from "node:process";
|
|
6
|
-
import readline from "node:readline";
|
|
7
|
-
import { output } from "./output.js";
|
|
8
|
-
/**
|
|
9
|
-
* Inspired by `prompts`:
|
|
10
|
-
* https://github.com/terkelg/prompts/blob/e0519913ec4fcc6746bb3d97d8cd0960c3f3ffde/lib/elements/prompt.js
|
|
11
|
-
*
|
|
12
|
-
* MIT License
|
|
13
|
-
*
|
|
14
|
-
* Copyright (c) 2018 Terkel Gjervig Nielsen
|
|
15
|
-
*
|
|
16
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
17
|
-
* of this software and associated documentation files (the "Software"), to deal
|
|
18
|
-
* in the Software without restriction, including without limitation the rights
|
|
19
|
-
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
20
|
-
* copies of the Software, and to permit persons to whom the Software is
|
|
21
|
-
* furnished to do so, subject to the following conditions:
|
|
22
|
-
*
|
|
23
|
-
* The above copyright notice and this permission notice shall be included in all
|
|
24
|
-
* copies or substantial portions of the Software.
|
|
25
|
-
*
|
|
26
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
27
|
-
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
28
|
-
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
29
|
-
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
30
|
-
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
31
|
-
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
32
|
-
* SOFTWARE.
|
|
33
|
-
*/ export class Prompt extends EventEmitter {
|
|
34
|
-
_(_str, _key) {
|
|
35
|
-
// noop
|
|
36
|
-
}
|
|
37
|
-
onRender() {
|
|
38
|
-
// noop
|
|
39
|
-
}
|
|
40
|
-
fire() {
|
|
41
|
-
this.emit("state", {
|
|
42
|
-
value: this.value,
|
|
43
|
-
aborted: this.aborted,
|
|
44
|
-
exited: this.exited
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
bell() {
|
|
48
|
-
output.writeStdout(ansiEscapes.beep);
|
|
49
|
-
}
|
|
50
|
-
render() {
|
|
51
|
-
this.onRender();
|
|
52
|
-
if (this.firstRender) {
|
|
53
|
-
this.firstRender = false;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
constructor(){
|
|
57
|
-
super();
|
|
58
|
-
// state
|
|
59
|
-
_define_property(this, "value", undefined);
|
|
60
|
-
_define_property(this, "firstRender", true);
|
|
61
|
-
_define_property(this, "done", false);
|
|
62
|
-
_define_property(this, "closed", false);
|
|
63
|
-
_define_property(this, "aborted", false);
|
|
64
|
-
_define_property(this, "exited", false);
|
|
65
|
-
// methods that rely on constructor closure
|
|
66
|
-
_define_property(this, "close", void 0);
|
|
67
|
-
assert(!Prompt.active, "only one prompt can be active at a time");
|
|
68
|
-
Prompt.active = true;
|
|
69
|
-
const rl = readline.createInterface({
|
|
70
|
-
input: process.stdin,
|
|
71
|
-
escapeCodeTimeout: 50
|
|
72
|
-
});
|
|
73
|
-
readline.emitKeypressEvents(process.stdin, rl);
|
|
74
|
-
if (process.stdin.isTTY) {
|
|
75
|
-
process.stdin.setRawMode(true);
|
|
76
|
-
}
|
|
77
|
-
const isSelect = [
|
|
78
|
-
"SelectPrompt"
|
|
79
|
-
].includes(this.constructor.name);
|
|
80
|
-
const keypress = (str, key)=>{
|
|
81
|
-
const action = getPromptAction(key, isSelect);
|
|
82
|
-
if (action === false) {
|
|
83
|
-
this._(str, key);
|
|
84
|
-
} else if (action && typeof this[action] === "function") {
|
|
85
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
|
86
|
-
this[action](key);
|
|
87
|
-
} else {
|
|
88
|
-
this.bell();
|
|
89
|
-
}
|
|
90
|
-
};
|
|
91
|
-
this.close = ()=>{
|
|
92
|
-
process.stdin.removeListener("keypress", keypress);
|
|
93
|
-
if (process.stdin.isTTY) {
|
|
94
|
-
process.stdin.setRawMode(false);
|
|
95
|
-
}
|
|
96
|
-
rl.close();
|
|
97
|
-
this.emit(this.aborted ? "abort" : this.exited ? "exit" : "submit", this.value);
|
|
98
|
-
this.closed = true;
|
|
99
|
-
Prompt.active = false;
|
|
100
|
-
};
|
|
101
|
-
process.stdin.on("keypress", keypress);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
_define_property(Prompt, "active", false);
|
|
105
|
-
const getPromptAction = (key, isSelect)=>{
|
|
106
|
-
if (key.meta && key.name !== "escape") {
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
if (key.ctrl) {
|
|
110
|
-
switch(key.name){
|
|
111
|
-
case "a":
|
|
112
|
-
return "first";
|
|
113
|
-
case "c":
|
|
114
|
-
case "d":
|
|
115
|
-
return "abort";
|
|
116
|
-
case "e":
|
|
117
|
-
return "last";
|
|
118
|
-
case "g":
|
|
119
|
-
return "reset";
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
if (isSelect) {
|
|
123
|
-
if (key.name === "j") {
|
|
124
|
-
return "down";
|
|
125
|
-
}
|
|
126
|
-
if (key.name === "k") {
|
|
127
|
-
return "up";
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
switch(key.name){
|
|
131
|
-
case "return":
|
|
132
|
-
case "enter":
|
|
133
|
-
return "submit";
|
|
134
|
-
case "backspace":
|
|
135
|
-
return "delete";
|
|
136
|
-
case "delete":
|
|
137
|
-
return "deleteForward";
|
|
138
|
-
case "abort":
|
|
139
|
-
return "abort";
|
|
140
|
-
case "escape":
|
|
141
|
-
return "exit";
|
|
142
|
-
case "tab":
|
|
143
|
-
return "next";
|
|
144
|
-
case "pagedown":
|
|
145
|
-
return "nextPage";
|
|
146
|
-
case "pageup":
|
|
147
|
-
return "prevPage";
|
|
148
|
-
case "home":
|
|
149
|
-
return "home";
|
|
150
|
-
case "end":
|
|
151
|
-
return "end";
|
|
152
|
-
case "up":
|
|
153
|
-
return "up";
|
|
154
|
-
case "down":
|
|
155
|
-
return "down";
|
|
156
|
-
case "right":
|
|
157
|
-
return "right";
|
|
158
|
-
case "left":
|
|
159
|
-
return "left";
|
|
160
|
-
default:
|
|
161
|
-
return false;
|
|
162
|
-
}
|
|
163
|
-
};
|
|
164
|
-
/**
|
|
165
|
-
* Determine what entries should be displayed on the screen, based on the
|
|
166
|
-
* currently selected index and the maximum visible. Used in list-based
|
|
167
|
-
* prompts like `select` and `multiselect`.
|
|
168
|
-
*
|
|
169
|
-
* @param cursor - the currently selected entry
|
|
170
|
-
* @param total - the total entries available to display
|
|
171
|
-
* @param [maxVisible] - the number of entries that can be displayed
|
|
172
|
-
*/ export const entriesToDisplay = (cursor, total, maxVisible)=>{
|
|
173
|
-
maxVisible = maxVisible || total;
|
|
174
|
-
let startIndex = Math.min(total - maxVisible, cursor - Math.floor(maxVisible / 2));
|
|
175
|
-
if (startIndex < 0) {
|
|
176
|
-
startIndex = 0;
|
|
177
|
-
}
|
|
178
|
-
const endIndex = Math.min(startIndex + maxVisible, total);
|
|
179
|
-
return {
|
|
180
|
-
startIndex,
|
|
181
|
-
endIndex
|
|
182
|
-
};
|
|
183
|
-
};
|
|
184
|
-
|
|
185
|
-
//# sourceMappingURL=prompt.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/services/output/prompt.ts"],"sourcesContent":["import ansiEscapes from \"ansi-escapes\";\nimport assert from \"node:assert\";\nimport EventEmitter from \"node:events\";\nimport process from \"node:process\";\nimport readline from \"node:readline\";\nimport { output } from \"./output.js\";\n\n/**\n * Inspired by `prompts`:\n * https://github.com/terkelg/prompts/blob/e0519913ec4fcc6746bb3d97d8cd0960c3f3ffde/lib/elements/prompt.js\n *\n * MIT License\n *\n * Copyright (c) 2018 Terkel Gjervig Nielsen\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nexport class Prompt extends EventEmitter {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [action: string]: any; // (key: StdinKey) => void;\n\n static active = false;\n\n // state\n value: unknown = undefined;\n firstRender = true;\n done = false;\n closed = false;\n aborted = false;\n exited = false;\n\n // methods that rely on constructor closure\n close: () => void;\n\n constructor() {\n super();\n assert(!Prompt.active, \"only one prompt can be active at a time\");\n Prompt.active = true;\n\n const rl = readline.createInterface({ input: process.stdin, escapeCodeTimeout: 50 });\n readline.emitKeypressEvents(process.stdin, rl);\n\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n }\n\n const isSelect = [\"SelectPrompt\"].includes(this.constructor.name);\n const keypress = (str: string, key: StdinKey): void => {\n const action = getPromptAction(key, isSelect);\n if (action === false) {\n this._(str, key);\n } else if (action && typeof this[action] === \"function\") {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n this[action](key);\n } else {\n this.bell();\n }\n };\n\n this.close = () => {\n process.stdin.removeListener(\"keypress\", keypress);\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n }\n\n rl.close();\n this.emit(this.aborted ? \"abort\" : this.exited ? \"exit\" : \"submit\", this.value);\n this.closed = true;\n Prompt.active = false;\n };\n\n process.stdin.on(\"keypress\", keypress);\n }\n\n _(_str: string, _key: StdinKey): void {\n // noop\n }\n\n onRender(): void {\n // noop\n }\n\n fire(): void {\n this.emit(\"state\", {\n value: this.value,\n aborted: this.aborted,\n exited: this.exited,\n });\n }\n\n bell(): void {\n output.writeStdout(ansiEscapes.beep);\n }\n\n render(): void {\n this.onRender();\n if (this.firstRender) {\n this.firstRender = false;\n }\n }\n}\n\nexport type PromptAction =\n | \"abort\"\n | \"exit\"\n | \"submit\"\n | \"next\"\n | \"nextPage\"\n | \"prevPage\"\n | \"home\"\n | \"end\"\n | \"up\"\n | \"down\"\n | \"right\"\n | \"left\"\n | \"reset\"\n | \"delete\"\n | \"deleteForward\"\n | \"first\"\n | \"last\";\n\nexport type StdinKey = {\n name: string;\n ctrl: boolean;\n meta: boolean;\n};\n\nconst getPromptAction = (key: StdinKey, isSelect: boolean): PromptAction | false | undefined => {\n if (key.meta && key.name !== \"escape\") {\n return;\n }\n\n if (key.ctrl) {\n switch (key.name) {\n case \"a\":\n return \"first\";\n case \"c\":\n case \"d\":\n return \"abort\";\n case \"e\":\n return \"last\";\n case \"g\":\n return \"reset\";\n }\n }\n\n if (isSelect) {\n if (key.name === \"j\") {\n return \"down\";\n }\n if (key.name === \"k\") {\n return \"up\";\n }\n }\n\n switch (key.name) {\n case \"return\":\n case \"enter\":\n return \"submit\";\n case \"backspace\":\n return \"delete\";\n case \"delete\":\n return \"deleteForward\";\n case \"abort\":\n return \"abort\";\n case \"escape\":\n return \"exit\";\n case \"tab\":\n return \"next\";\n case \"pagedown\":\n return \"nextPage\";\n case \"pageup\":\n return \"prevPage\";\n case \"home\":\n return \"home\";\n case \"end\":\n return \"end\";\n case \"up\":\n return \"up\";\n case \"down\":\n return \"down\";\n case \"right\":\n return \"right\";\n case \"left\":\n return \"left\";\n default:\n return false;\n }\n};\n\n/**\n * Determine what entries should be displayed on the screen, based on the\n * currently selected index and the maximum visible. Used in list-based\n * prompts like `select` and `multiselect`.\n *\n * @param cursor - the currently selected entry\n * @param total - the total entries available to display\n * @param [maxVisible] - the number of entries that can be displayed\n */\nexport const entriesToDisplay = (cursor: number, total: number, maxVisible: number): { startIndex: number; endIndex: number } => {\n maxVisible = maxVisible || total;\n\n let startIndex = Math.min(total - maxVisible, cursor - Math.floor(maxVisible / 2));\n if (startIndex < 0) {\n startIndex = 0;\n }\n\n const endIndex = Math.min(startIndex + maxVisible, total);\n\n return { startIndex, endIndex };\n};\n"],"names":["ansiEscapes","assert","EventEmitter","process","readline","output","Prompt","_","_str","_key","onRender","fire","emit","value","aborted","exited","bell","writeStdout","beep","render","firstRender","constructor","undefined","done","closed","close","active","rl","createInterface","input","stdin","escapeCodeTimeout","emitKeypressEvents","isTTY","setRawMode","isSelect","includes","name","keypress","str","key","action","getPromptAction","removeListener","on","meta","ctrl","entriesToDisplay","cursor","total","maxVisible","startIndex","Math","min","floor","endIndex"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
import { _ as _define_property } from "@swc/helpers/_/_define_property";
|
|
2
|
-
import * as Sentry from "@sentry/node";
|
|
3
|
-
import cleanStack from "clean-stack";
|
|
4
|
-
import ms from "ms";
|
|
5
|
-
import { randomUUID } from "node:crypto";
|
|
6
|
-
import os from "node:os";
|
|
7
|
-
import terminalLink from "terminal-link";
|
|
8
|
-
import { config } from "../config/config.js";
|
|
9
|
-
import { env } from "../config/env.js";
|
|
10
|
-
import { packageJson } from "../config/package-json.js";
|
|
11
|
-
import { isAbortError } from "../util/is.js";
|
|
12
|
-
import { serializeError } from "../util/object.js";
|
|
13
|
-
import { workspaceRoot } from "../util/paths.js";
|
|
14
|
-
import { println } from "./print.js";
|
|
15
|
-
import { sprintln } from "./sprint.js";
|
|
16
|
-
export const reportErrorAndExit = async (ctx, cause)=>{
|
|
17
|
-
if (isAbortError(cause)) {
|
|
18
|
-
ctx.log.debug("aborting without reporting error", {
|
|
19
|
-
error: cause
|
|
20
|
-
});
|
|
21
|
-
return process.exit(1);
|
|
22
|
-
}
|
|
23
|
-
ctx.log.error("reporting error and exiting", {
|
|
24
|
-
error: cause
|
|
25
|
-
});
|
|
26
|
-
try {
|
|
27
|
-
const error = GGTError.from(cause);
|
|
28
|
-
error.print();
|
|
29
|
-
if (error.isBug === IsBug.NO) {
|
|
30
|
-
return undefined;
|
|
31
|
-
}
|
|
32
|
-
Sentry.captureException(error, {
|
|
33
|
-
event_id: error.id,
|
|
34
|
-
captureContext: {
|
|
35
|
-
user: ctx.user && {
|
|
36
|
-
id: String(ctx.user.id),
|
|
37
|
-
email: ctx.user.email,
|
|
38
|
-
username: ctx.user.name ?? undefined
|
|
39
|
-
},
|
|
40
|
-
tags: {
|
|
41
|
-
application_id: ctx.app?.id,
|
|
42
|
-
arch: config.arch,
|
|
43
|
-
bug: error.isBug,
|
|
44
|
-
environment: env.value,
|
|
45
|
-
platform: config.platform,
|
|
46
|
-
shell: config.shell,
|
|
47
|
-
version: packageJson.version
|
|
48
|
-
},
|
|
49
|
-
contexts: {
|
|
50
|
-
ctx: {
|
|
51
|
-
argv: process.argv,
|
|
52
|
-
args: ctx.args
|
|
53
|
-
},
|
|
54
|
-
cause: error.cause ? serializeError(error.cause) : undefined,
|
|
55
|
-
app: {
|
|
56
|
-
app_name: packageJson.name,
|
|
57
|
-
app_version: packageJson.version
|
|
58
|
-
},
|
|
59
|
-
device: {
|
|
60
|
-
name: os.hostname(),
|
|
61
|
-
family: os.type(),
|
|
62
|
-
arch: os.arch()
|
|
63
|
-
},
|
|
64
|
-
runtime: {
|
|
65
|
-
name: process.release.name,
|
|
66
|
-
version: process.version
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
await Sentry.flush(ms("2s"));
|
|
72
|
-
} finally{
|
|
73
|
-
process.exit(1);
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
export const installErrorHandlers = (ctx)=>{
|
|
77
|
-
ctx.log.debug("installing error handlers");
|
|
78
|
-
Sentry.init({
|
|
79
|
-
dsn: "https://0c26e0d8afd94e77a88ee1c3aa9e7065@o250689.ingest.sentry.io/6703266",
|
|
80
|
-
enabled: env.productionLike && (ctx.args["--telemetry"] ?? false),
|
|
81
|
-
release: packageJson.version,
|
|
82
|
-
environment: packageJson.version.includes("experimental") ? "experimental" : "production"
|
|
83
|
-
});
|
|
84
|
-
const handleError = (error)=>void reportErrorAndExit(ctx, error);
|
|
85
|
-
process.once("uncaughtException", handleError);
|
|
86
|
-
process.once("unhandledRejection", handleError);
|
|
87
|
-
};
|
|
88
|
-
export const IsBug = Object.freeze({
|
|
89
|
-
YES: "yes",
|
|
90
|
-
NO: "no",
|
|
91
|
-
MAYBE: "maybe"
|
|
92
|
-
});
|
|
93
|
-
/**
|
|
94
|
-
* Base class for all errors.
|
|
95
|
-
*/ export class GGTError extends Error {
|
|
96
|
-
/**
|
|
97
|
-
* Constructs a GGTError from an unknown cause.
|
|
98
|
-
*
|
|
99
|
-
* @param cause - The cause of the error.
|
|
100
|
-
*/ static from(cause) {
|
|
101
|
-
if (cause instanceof GGTError) {
|
|
102
|
-
return cause;
|
|
103
|
-
}
|
|
104
|
-
return new UnexpectedError(cause);
|
|
105
|
-
}
|
|
106
|
-
sprint() {
|
|
107
|
-
let rendered = this.render();
|
|
108
|
-
if (this.isBug !== IsBug.NO) {
|
|
109
|
-
// ensure the rendered message ends with a newline
|
|
110
|
-
rendered = sprintln(rendered);
|
|
111
|
-
const thisIsABug = this.isBug === IsBug.YES ? "This is a bug" : "If you think this is a bug";
|
|
112
|
-
const issueLink = `https://github.com/gadget-inc/ggt/issues/new?template=bug_report.yml&error-id=${this.id}`;
|
|
113
|
-
if (terminalLink.isSupported) {
|
|
114
|
-
rendered += sprintln({
|
|
115
|
-
ensureEmptyLineAbove: true
|
|
116
|
-
})`
|
|
117
|
-
${thisIsABug}, ${terminalLink("click here", issueLink)} to create an issue on GitHub.
|
|
118
|
-
`;
|
|
119
|
-
} else {
|
|
120
|
-
rendered += sprintln({
|
|
121
|
-
ensureEmptyLineAbove: true
|
|
122
|
-
})`
|
|
123
|
-
${thisIsABug}, use the link below to create an issue on GitHub.
|
|
124
|
-
|
|
125
|
-
${issueLink}
|
|
126
|
-
`;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
return rendered;
|
|
130
|
-
}
|
|
131
|
-
print(options) {
|
|
132
|
-
println({
|
|
133
|
-
ensureEmptyLineAbove: true,
|
|
134
|
-
...options
|
|
135
|
-
})(this.sprint());
|
|
136
|
-
}
|
|
137
|
-
constructor(message){
|
|
138
|
-
super(message);
|
|
139
|
-
/**
|
|
140
|
-
* The ID for this error.
|
|
141
|
-
*/ _define_property(this, "id", env.testLike ? "00000000-0000-0000-0000-000000000000" : randomUUID());
|
|
142
|
-
/**
|
|
143
|
-
* The underlying *thing* that caused this error.
|
|
144
|
-
*/ _define_property(this, "cause", void 0);
|
|
145
|
-
/**
|
|
146
|
-
* Assume the stack trace exists.
|
|
147
|
-
*/ _define_property(this, "stack", void 0);
|
|
148
|
-
Error.captureStackTrace(this, this.constructor);
|
|
149
|
-
this.stack = cleanStack(this.stack, {
|
|
150
|
-
pretty: true,
|
|
151
|
-
basePath: workspaceRoot
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Our "catch all" error.
|
|
157
|
-
*
|
|
158
|
-
* If this error is thrown, we almost certainly have a bug, and should
|
|
159
|
-
* either fix it or add a more specific error so that we can provide
|
|
160
|
-
* more useful information.
|
|
161
|
-
*/ export class UnexpectedError extends GGTError {
|
|
162
|
-
render() {
|
|
163
|
-
const serialized = serializeError(this.cause);
|
|
164
|
-
const body = serialized.stack || serialized.message || this.stack;
|
|
165
|
-
return this.message + ".\n\n" + body;
|
|
166
|
-
}
|
|
167
|
-
constructor(cause){
|
|
168
|
-
super("An unexpected error occurred");
|
|
169
|
-
_define_property(this, "cause", void 0);
|
|
170
|
-
_define_property(this, "isBug", void 0);
|
|
171
|
-
this.cause = cause;
|
|
172
|
-
this.isBug = IsBug.YES;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* An error that is expected to happen sometimes.
|
|
177
|
-
*/ export class EdgeCaseError extends GGTError {
|
|
178
|
-
render() {
|
|
179
|
-
return this.message;
|
|
180
|
-
}
|
|
181
|
-
constructor(message, cause){
|
|
182
|
-
super(message);
|
|
183
|
-
_define_property(this, "cause", void 0);
|
|
184
|
-
_define_property(this, "isBug", void 0);
|
|
185
|
-
this.cause = cause;
|
|
186
|
-
this.isBug = IsBug.MAYBE;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
//# sourceMappingURL=report.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/services/output/report.ts"],"sourcesContent":["import * as Sentry from \"@sentry/node\";\nimport cleanStack from \"clean-stack\";\nimport ms from \"ms\";\nimport { randomUUID } from \"node:crypto\";\nimport os from \"node:os\";\nimport terminalLink from \"terminal-link\";\nimport type { Context } from \"../command/context.js\";\nimport { config } from \"../config/config.js\";\nimport { env } from \"../config/env.js\";\nimport { packageJson } from \"../config/package-json.js\";\nimport { isAbortError } from \"../util/is.js\";\nimport { serializeError } from \"../util/object.js\";\nimport { workspaceRoot } from \"../util/paths.js\";\nimport { println } from \"./print.js\";\nimport { sprintln, type SprintOptions } from \"./sprint.js\";\n\nexport const reportErrorAndExit = async (ctx: Context, cause: unknown): Promise<never> => {\n if (isAbortError(cause)) {\n ctx.log.debug(\"aborting without reporting error\", { error: cause });\n return process.exit(1);\n }\n\n ctx.log.error(\"reporting error and exiting\", { error: cause });\n\n try {\n const error = GGTError.from(cause);\n error.print();\n\n if (error.isBug === IsBug.NO) {\n return undefined as never;\n }\n\n Sentry.captureException(error, {\n event_id: error.id,\n captureContext: {\n user: ctx.user && {\n id: String(ctx.user.id),\n email: ctx.user.email,\n username: ctx.user.name ?? undefined,\n },\n tags: {\n application_id: ctx.app?.id,\n arch: config.arch,\n bug: error.isBug,\n environment: env.value,\n platform: config.platform,\n shell: config.shell,\n version: packageJson.version,\n },\n contexts: {\n ctx: {\n argv: process.argv,\n args: ctx.args,\n },\n cause: error.cause ? serializeError(error.cause) : undefined,\n app: {\n app_name: packageJson.name,\n app_version: packageJson.version,\n },\n device: {\n name: os.hostname(),\n family: os.type(),\n arch: os.arch(),\n },\n runtime: {\n name: process.release.name,\n version: process.version,\n },\n },\n },\n });\n\n await Sentry.flush(ms(\"2s\"));\n } finally {\n process.exit(1);\n }\n};\n\nexport const installErrorHandlers = (ctx: Context): void => {\n ctx.log.debug(\"installing error handlers\");\n\n Sentry.init({\n dsn: \"https://0c26e0d8afd94e77a88ee1c3aa9e7065@o250689.ingest.sentry.io/6703266\",\n enabled: env.productionLike && (ctx.args[\"--telemetry\"] ?? false),\n release: packageJson.version,\n environment: packageJson.version.includes(\"experimental\") ? \"experimental\" : \"production\",\n });\n\n const handleError = (error: unknown) => void reportErrorAndExit(ctx, error);\n process.once(\"uncaughtException\", handleError);\n process.once(\"unhandledRejection\", handleError);\n};\n\nexport const IsBug = Object.freeze({\n YES: \"yes\",\n NO: \"no\",\n MAYBE: \"maybe\",\n});\n\nexport type IsBug = (typeof IsBug)[keyof typeof IsBug];\n\n/**\n * Base class for all errors.\n */\nexport abstract class GGTError extends Error {\n /**\n * The ID for this error.\n */\n id = env.testLike ? \"00000000-0000-0000-0000-000000000000\" : randomUUID();\n\n /**\n * The underlying *thing* that caused this error.\n */\n cause?: unknown;\n\n /**\n * Assume the stack trace exists.\n */\n override stack!: string;\n\n /**\n * Indicates whether this error is considered a bug or not.\n */\n abstract isBug: IsBug;\n\n constructor(message: string) {\n super(message);\n Error.captureStackTrace(this, this.constructor);\n this.stack = cleanStack(this.stack, { pretty: true, basePath: workspaceRoot });\n }\n\n /**\n * Constructs a GGTError from an unknown cause.\n *\n * @param cause - The cause of the error.\n */\n static from(cause: unknown): GGTError {\n if (cause instanceof GGTError) {\n return cause;\n }\n return new UnexpectedError(cause);\n }\n\n sprint(): string {\n let rendered = this.render();\n\n if (this.isBug !== IsBug.NO) {\n // ensure the rendered message ends with a newline\n rendered = sprintln(rendered);\n\n const thisIsABug = this.isBug === IsBug.YES ? \"This is a bug\" : \"If you think this is a bug\";\n const issueLink = `https://github.com/gadget-inc/ggt/issues/new?template=bug_report.yml&error-id=${this.id}`;\n\n if (terminalLink.isSupported) {\n rendered += sprintln({ ensureEmptyLineAbove: true })`\n ${thisIsABug}, ${terminalLink(\"click here\", issueLink)} to create an issue on GitHub.\n `;\n } else {\n rendered += sprintln({ ensureEmptyLineAbove: true })`\n ${thisIsABug}, use the link below to create an issue on GitHub.\n\n ${issueLink}\n `;\n }\n }\n\n return rendered;\n }\n\n print(options?: SprintOptions): void {\n println({ ensureEmptyLineAbove: true, ...options })(this.sprint());\n }\n\n /**\n * Turns this error into a user-friendly message that explains what\n * went wrong and how to fix it. A good write up of what an error\n * should look like can be found here:\n * {@link https://clig.dev/#errors}\n */\n protected abstract render(): string;\n}\n\n/**\n * Our \"catch all\" error.\n *\n * If this error is thrown, we almost certainly have a bug, and should\n * either fix it or add a more specific error so that we can provide\n * more useful information.\n */\nexport class UnexpectedError extends GGTError {\n isBug = IsBug.YES;\n\n constructor(override cause: unknown) {\n super(\"An unexpected error occurred\");\n }\n\n protected render(): string {\n const serialized = serializeError(this.cause);\n const body = serialized.stack || serialized.message || this.stack;\n return this.message + \".\\n\\n\" + body;\n }\n}\n\n/**\n * An error that is expected to happen sometimes.\n */\nexport class EdgeCaseError extends GGTError {\n isBug = IsBug.MAYBE;\n\n constructor(\n message: string,\n override cause?: unknown,\n ) {\n super(message);\n }\n\n protected render(): string {\n return this.message;\n }\n}\n"],"names":["Sentry","cleanStack","ms","randomUUID","os","terminalLink","config","env","packageJson","isAbortError","serializeError","workspaceRoot","println","sprintln","reportErrorAndExit","ctx","cause","log","debug","error","process","exit","GGTError","from","print","isBug","IsBug","NO","undefined","captureException","event_id","id","captureContext","user","String","email","username","name","tags","application_id","app","arch","bug","environment","value","platform","shell","version","contexts","argv","args","app_name","app_version","device","hostname","family","type","runtime","release","flush","installErrorHandlers","init","dsn","enabled","productionLike","includes","handleError","once","Object","freeze","YES","MAYBE","Error","UnexpectedError","sprint","rendered","render","thisIsABug","issueLink","isSupported","ensureEmptyLineAbove","options","constructor","message","testLike","stack","captureStackTrace","pretty","basePath","serialized","body","EdgeCaseError"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
import { _ as _define_property } from "@swc/helpers/_/_define_property";
|
|
2
|
-
import chalk from "chalk";
|
|
3
|
-
import indentString from "indent-string";
|
|
4
|
-
import assert from "node:assert";
|
|
5
|
-
import process from "node:process";
|
|
6
|
-
import { isString } from "../util/is.js";
|
|
7
|
-
import { defaults } from "../util/object.js";
|
|
8
|
-
import { output } from "./output.js";
|
|
9
|
-
import { println } from "./print.js";
|
|
10
|
-
import { entriesToDisplay, Prompt } from "./prompt.js";
|
|
11
|
-
import { sprint, sprintln } from "./sprint.js";
|
|
12
|
-
import { symbol } from "./symbols.js";
|
|
13
|
-
// TODO: i regret this api... don't make it the same as println... just make it take ctx and options
|
|
14
|
-
export const select = (options)=>{
|
|
15
|
-
options = defaults(options, {
|
|
16
|
-
ensureEmptyLineAbove: true
|
|
17
|
-
});
|
|
18
|
-
return (template, ...values)=>{
|
|
19
|
-
let text = template;
|
|
20
|
-
if (!isString(text)) {
|
|
21
|
-
text = sprint(template, ...values);
|
|
22
|
-
}
|
|
23
|
-
if (!output.isInteractive) {
|
|
24
|
-
// TODO: log an error here
|
|
25
|
-
println(options)(text);
|
|
26
|
-
println({
|
|
27
|
-
ensureEmptyLineAbove: true
|
|
28
|
-
})`
|
|
29
|
-
Aborting because ggt is not running in an interactive terminal.
|
|
30
|
-
`;
|
|
31
|
-
process.exit(1);
|
|
32
|
-
}
|
|
33
|
-
return new Promise((resolve)=>{
|
|
34
|
-
const sel = new Select(text, {
|
|
35
|
-
formatChoice: (choice)=>choice,
|
|
36
|
-
formatSelection: (choice)=>choice,
|
|
37
|
-
...options
|
|
38
|
-
});
|
|
39
|
-
sel.on("submit", resolve);
|
|
40
|
-
sel.on("exit", ()=>process.exit(0));
|
|
41
|
-
sel.on("abort", ()=>process.exit(0));
|
|
42
|
-
});
|
|
43
|
-
};
|
|
44
|
-
};
|
|
45
|
-
/**
|
|
46
|
-
* Inspired by `prompts`:
|
|
47
|
-
* https://github.com/terkelg/prompts/blob/e0519913ec4fcc6746bb3d97d8cd0960c3f3ffde/lib/elements/select.js
|
|
48
|
-
*
|
|
49
|
-
* MIT License
|
|
50
|
-
*
|
|
51
|
-
* Copyright (c) 2018 Terkel Gjervig Nielsen
|
|
52
|
-
*
|
|
53
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
54
|
-
* of this software and associated documentation files (the "Software"), to deal
|
|
55
|
-
* in the Software without restriction, including without limitation the rights
|
|
56
|
-
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
57
|
-
* copies of the Software, and to permit persons to whom the Software is
|
|
58
|
-
* furnished to do so, subject to the following conditions:
|
|
59
|
-
*
|
|
60
|
-
* The above copyright notice and this permission notice shall be included in all
|
|
61
|
-
* copies or substantial portions of the Software.
|
|
62
|
-
*
|
|
63
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
64
|
-
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
65
|
-
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
66
|
-
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
67
|
-
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
68
|
-
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
69
|
-
* SOFTWARE.
|
|
70
|
-
*/ // TODO: implement autocomplete https://github.com/terkelg/prompts/blob/e0519913ec4fcc6746bb3d97d8cd0960c3f3ffde/lib/elements/autocomplete.js
|
|
71
|
-
class Select extends Prompt {
|
|
72
|
-
get selection() {
|
|
73
|
-
const choice = this.options.choices[this.cursor];
|
|
74
|
-
assert(choice, `choices[${this.cursor}] is not defined`);
|
|
75
|
-
return choice;
|
|
76
|
-
}
|
|
77
|
-
moveCursor(n) {
|
|
78
|
-
this.cursor = n;
|
|
79
|
-
this.fire();
|
|
80
|
-
}
|
|
81
|
-
reset() {
|
|
82
|
-
this.moveCursor(0);
|
|
83
|
-
this.fire();
|
|
84
|
-
this.render();
|
|
85
|
-
}
|
|
86
|
-
exit() {
|
|
87
|
-
this.abort();
|
|
88
|
-
}
|
|
89
|
-
abort() {
|
|
90
|
-
this.done = this.aborted = true;
|
|
91
|
-
this.fire();
|
|
92
|
-
this.render("Cancel (Ctrl+C)");
|
|
93
|
-
this.close();
|
|
94
|
-
}
|
|
95
|
-
submit() {
|
|
96
|
-
this.done = true;
|
|
97
|
-
this.aborted = false;
|
|
98
|
-
this.value = this.selection;
|
|
99
|
-
this.fire();
|
|
100
|
-
this.render();
|
|
101
|
-
this.close();
|
|
102
|
-
}
|
|
103
|
-
first() {
|
|
104
|
-
this.moveCursor(0);
|
|
105
|
-
this.render();
|
|
106
|
-
}
|
|
107
|
-
last() {
|
|
108
|
-
this.moveCursor(this.options.choices.length - 1);
|
|
109
|
-
this.render();
|
|
110
|
-
}
|
|
111
|
-
up() {
|
|
112
|
-
if (this.cursor === 0) {
|
|
113
|
-
this.moveCursor(this.options.choices.length - 1);
|
|
114
|
-
} else {
|
|
115
|
-
this.moveCursor(this.cursor - 1);
|
|
116
|
-
}
|
|
117
|
-
this.render();
|
|
118
|
-
}
|
|
119
|
-
down() {
|
|
120
|
-
if (this.cursor === this.options.choices.length - 1) {
|
|
121
|
-
this.moveCursor(0);
|
|
122
|
-
} else {
|
|
123
|
-
this.moveCursor(this.cursor + 1);
|
|
124
|
-
}
|
|
125
|
-
this.render();
|
|
126
|
-
}
|
|
127
|
-
next() {
|
|
128
|
-
this.moveCursor((this.cursor + 1) % this.options.choices.length);
|
|
129
|
-
this.render();
|
|
130
|
-
}
|
|
131
|
-
_(char, _key) {
|
|
132
|
-
if (char === " ") {
|
|
133
|
-
this.submit();
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
render(selection) {
|
|
138
|
-
if (this.closed) {
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
super.render();
|
|
142
|
-
let question = this.text;
|
|
143
|
-
if (this.done) {
|
|
144
|
-
output.persistPrompt(sprintln`
|
|
145
|
-
${question.trimEnd()} ${this.options.formatChoice(selection ?? this.selection)}
|
|
146
|
-
`);
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
question += ` ${chalk.gray("Use arrow keys to move")}\n\n`;
|
|
150
|
-
let choices = "";
|
|
151
|
-
const { startIndex, endIndex } = entriesToDisplay(this.cursor, this.options.choices.length, this.optionsPerPage);
|
|
152
|
-
for(let index = startIndex; index < endIndex; index++){
|
|
153
|
-
// determine whether to display "more choices" indicators
|
|
154
|
-
let prefix;
|
|
155
|
-
if (this.cursor === index) {
|
|
156
|
-
prefix = `${symbol.arrowRight} `;
|
|
157
|
-
} else if (index === startIndex && startIndex > 0) {
|
|
158
|
-
prefix = `${symbol.arrowUp} `;
|
|
159
|
-
} else if (index === endIndex - 1 && endIndex < this.options.choices.length) {
|
|
160
|
-
prefix = `${symbol.arrowDown} `;
|
|
161
|
-
} else {
|
|
162
|
-
prefix = " ";
|
|
163
|
-
}
|
|
164
|
-
const choice_ = this.options.choices[index];
|
|
165
|
-
assert(choice_, `choices[${index}] is not defined`);
|
|
166
|
-
let choice = this.options.formatChoice(choice_);
|
|
167
|
-
if (this.cursor === index) {
|
|
168
|
-
choice = chalk.blue.underline(choice);
|
|
169
|
-
}
|
|
170
|
-
choices += `${prefix}${choice}\n`;
|
|
171
|
-
}
|
|
172
|
-
if (this.options.indent) {
|
|
173
|
-
choices = indentString(choices, this.options.indent);
|
|
174
|
-
}
|
|
175
|
-
output.updatePrompt(question + choices);
|
|
176
|
-
}
|
|
177
|
-
constructor(text, options){
|
|
178
|
-
super();
|
|
179
|
-
_define_property(this, "text", void 0);
|
|
180
|
-
_define_property(this, "cursor", void 0);
|
|
181
|
-
_define_property(this, "optionsPerPage", void 0);
|
|
182
|
-
_define_property(this, "options", void 0);
|
|
183
|
-
this.text = text;
|
|
184
|
-
this.cursor = 0;
|
|
185
|
-
this.optionsPerPage = 10;
|
|
186
|
-
this.options = defaults(options, {
|
|
187
|
-
formatChoice: (choice)=>choice,
|
|
188
|
-
formatSelection: (choice)=>choice,
|
|
189
|
-
...options
|
|
190
|
-
});
|
|
191
|
-
if (this.options.ensureEmptyLineAbove) {
|
|
192
|
-
this.text = "\n" + this.text;
|
|
193
|
-
}
|
|
194
|
-
this.render();
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
//# sourceMappingURL=select.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/services/output/select.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport indentString from \"indent-string\";\nimport assert from \"node:assert\";\nimport process from \"node:process\";\nimport { isString } from \"../util/is.js\";\nimport { defaults } from \"../util/object.js\";\nimport { output } from \"./output.js\";\nimport { println } from \"./print.js\";\nimport { entriesToDisplay, Prompt, type StdinKey } from \"./prompt.js\";\nimport { sprint, sprintln, type SprintOptions } from \"./sprint.js\";\nimport { symbol } from \"./symbols.js\";\n\nexport type SelectOptions<Choice extends string> = SprintOptions & {\n choices: Choice[];\n formatChoice?: (choice: Choice) => string;\n formatSelection?: (choice: Choice) => string;\n};\n\nexport type select<Choice extends string> = (options: SelectOptions<Choice>) => selectWithChoices<Choice>;\n\nexport type selectWithChoices<Choice extends string> = {\n (str: string): Promise<Choice>;\n (template: TemplateStringsArray, ...values: unknown[]): Promise<Choice>;\n};\n\n// TODO: i regret this api... don't make it the same as println... just make it take ctx and options\nexport const select = <Choice extends string>(options: SelectOptions<Choice>): selectWithChoices<Choice> => {\n options = defaults(options, {\n ensureEmptyLineAbove: true,\n });\n\n return ((template: string | TemplateStringsArray, ...values: unknown[]): Promise<Choice> => {\n let text = template as string;\n if (!isString(text)) {\n text = sprint(template as TemplateStringsArray, ...values);\n }\n\n if (!output.isInteractive) {\n // TODO: log an error here\n println(options)(text);\n println({ ensureEmptyLineAbove: true })`\n Aborting because ggt is not running in an interactive terminal.\n `;\n process.exit(1);\n }\n\n return new Promise((resolve) => {\n const sel = new Select(text, {\n formatChoice: (choice) => choice,\n formatSelection: (choice) => choice,\n ...options,\n });\n sel.on(\"submit\", resolve);\n sel.on(\"exit\", () => process.exit(0));\n sel.on(\"abort\", () => process.exit(0));\n });\n }) as selectWithChoices<Choice>;\n};\n\n/**\n * Inspired by `prompts`:\n * https://github.com/terkelg/prompts/blob/e0519913ec4fcc6746bb3d97d8cd0960c3f3ffde/lib/elements/select.js\n *\n * MIT License\n *\n * Copyright (c) 2018 Terkel Gjervig Nielsen\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n// TODO: implement autocomplete https://github.com/terkelg/prompts/blob/e0519913ec4fcc6746bb3d97d8cd0960c3f3ffde/lib/elements/autocomplete.js\nclass Select<Choice extends string> extends Prompt {\n cursor = 0;\n optionsPerPage = 10;\n options;\n\n constructor(\n readonly text: string,\n options: SelectOptions<Choice>,\n ) {\n super();\n\n this.options = defaults(options, {\n formatChoice: (choice) => choice,\n formatSelection: (choice) => choice,\n ...options,\n });\n\n if (this.options.ensureEmptyLineAbove) {\n this.text = \"\\n\" + this.text;\n }\n\n this.render();\n }\n\n get selection(): Choice {\n const choice = this.options.choices[this.cursor];\n assert(choice, `choices[${this.cursor}] is not defined`);\n return choice;\n }\n\n moveCursor(n: number): void {\n this.cursor = n;\n this.fire();\n }\n\n reset(): void {\n this.moveCursor(0);\n this.fire();\n this.render();\n }\n\n exit(): void {\n this.abort();\n }\n\n abort(): void {\n this.done = this.aborted = true;\n this.fire();\n this.render(\"Cancel (Ctrl+C)\" as Choice);\n this.close();\n }\n\n submit(): void {\n this.done = true;\n this.aborted = false;\n this.value = this.selection;\n this.fire();\n this.render();\n this.close();\n }\n\n first(): void {\n this.moveCursor(0);\n this.render();\n }\n\n last(): void {\n this.moveCursor(this.options.choices.length - 1);\n this.render();\n }\n\n up(): void {\n if (this.cursor === 0) {\n this.moveCursor(this.options.choices.length - 1);\n } else {\n this.moveCursor(this.cursor - 1);\n }\n this.render();\n }\n\n down(): void {\n if (this.cursor === this.options.choices.length - 1) {\n this.moveCursor(0);\n } else {\n this.moveCursor(this.cursor + 1);\n }\n this.render();\n }\n\n next(): void {\n this.moveCursor((this.cursor + 1) % this.options.choices.length);\n this.render();\n }\n\n override _(char: string, _key: StdinKey): void {\n if (char === \" \") {\n this.submit();\n return;\n }\n }\n\n override render(selection?: Choice): void {\n if (this.closed) {\n return;\n }\n\n super.render();\n\n let question = this.text;\n if (this.done) {\n output.persistPrompt(sprintln`\n ${question.trimEnd()} ${this.options.formatChoice(selection ?? this.selection)}\n `);\n return;\n }\n\n question += ` ${chalk.gray(\"Use arrow keys to move\")}\\n\\n`;\n\n let choices = \"\";\n const { startIndex, endIndex } = entriesToDisplay(this.cursor, this.options.choices.length, this.optionsPerPage);\n for (let index = startIndex; index < endIndex; index++) {\n // determine whether to display \"more choices\" indicators\n let prefix: string;\n if (this.cursor === index) {\n prefix = `${symbol.arrowRight} `;\n } else if (index === startIndex && startIndex > 0) {\n prefix = `${symbol.arrowUp} `;\n } else if (index === endIndex - 1 && endIndex < this.options.choices.length) {\n prefix = `${symbol.arrowDown} `;\n } else {\n prefix = \" \";\n }\n\n const choice_ = this.options.choices[index];\n assert(choice_, `choices[${index}] is not defined`);\n\n let choice = this.options.formatChoice(choice_);\n if (this.cursor === index) {\n choice = chalk.blue.underline(choice);\n }\n\n choices += `${prefix}${choice}\\n`;\n }\n\n if (this.options.indent) {\n choices = indentString(choices, this.options.indent);\n }\n\n output.updatePrompt(question + choices);\n }\n}\n"],"names":["chalk","indentString","assert","process","isString","defaults","output","println","entriesToDisplay","Prompt","sprint","sprintln","symbol","select","options","ensureEmptyLineAbove","template","values","text","isInteractive","exit","Promise","resolve","sel","Select","formatChoice","choice","formatSelection","on","selection","choices","cursor","moveCursor","n","fire","reset","render","abort","done","aborted","close","submit","value","first","last","length","up","down","next","_","char","_key","closed","question","persistPrompt","trimEnd","gray","startIndex","endIndex","optionsPerPage","index","prefix","arrowRight","arrowUp","arrowDown","choice_","blue","underline","indent","updatePrompt","constructor"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|