mcp-client-gen 0.0.1 โ 0.0.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/README.md +42 -15
- package/dist/index.js +917 -18
- package/package.json +13 -5
package/README.md
CHANGED
|
@@ -8,17 +8,17 @@ import { notion, github, slack } from "./lib/mcp-client";
|
|
|
8
8
|
// Type-safe client calls with full IntelliSense
|
|
9
9
|
const page = await notion.createPage({
|
|
10
10
|
title: "Meeting Notes",
|
|
11
|
-
content: "Discussion about Q4 roadmap..."
|
|
11
|
+
content: "Discussion about Q4 roadmap...",
|
|
12
12
|
});
|
|
13
13
|
|
|
14
14
|
const issue = await github.createIssue({
|
|
15
15
|
title: "Bug: Login failure",
|
|
16
|
-
body: "Users cannot authenticate..."
|
|
16
|
+
body: "Users cannot authenticate...",
|
|
17
17
|
});
|
|
18
18
|
|
|
19
19
|
await slack.notify({
|
|
20
20
|
channel: "#dev",
|
|
21
|
-
message: `New issue created: ${issue.url}
|
|
21
|
+
message: `New issue created: ${issue.url}`,
|
|
22
22
|
});
|
|
23
23
|
```
|
|
24
24
|
|
|
@@ -28,7 +28,8 @@ await slack.notify({
|
|
|
28
28
|
๐ **Multi-Provider** - Connect to multiple MCP servers simultaneously
|
|
29
29
|
๐ฏ **Tree-Shakable** - Only bundle the methods you use
|
|
30
30
|
โก **Fast** - Built with Bun for optimal performance
|
|
31
|
-
๐ ๏ธ **CLI
|
|
31
|
+
๐ ๏ธ **Interactive CLI** - Smart prompts with sensible defaults
|
|
32
|
+
โ๏ธ **Flexible** - Works with multiple MCP config formats
|
|
32
33
|
|
|
33
34
|
## Installation
|
|
34
35
|
|
|
@@ -49,18 +50,27 @@ Create a `.mcp.json` file with your MCP server endpoints:
|
|
|
49
50
|
"mcpServers": {
|
|
50
51
|
"notion": {
|
|
51
52
|
"type": "http",
|
|
52
|
-
"url": "https://mcp.notion.com/mcp"
|
|
53
|
+
"url": "https://mcp.notion.com/mcp",
|
|
53
54
|
},
|
|
54
55
|
"github": {
|
|
55
|
-
"type": "http",
|
|
56
|
-
"url": "https://api.githubcopilot.com/mcp/"
|
|
57
|
-
}
|
|
58
|
-
}
|
|
56
|
+
"type": "http",
|
|
57
|
+
"url": "https://api.githubcopilot.com/mcp/",
|
|
58
|
+
},
|
|
59
|
+
},
|
|
59
60
|
}
|
|
60
61
|
```
|
|
61
62
|
|
|
62
63
|
### 2. Generate Client SDK
|
|
63
64
|
|
|
65
|
+
**Interactive Mode (Recommended):**
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
npx mcp-client-gen # Launch interactive prompts
|
|
69
|
+
npx mcp-client-gen -y # Accept all defaults and proceed
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Direct Mode:**
|
|
73
|
+
|
|
64
74
|
```bash
|
|
65
75
|
npx mcp-client-gen ./lib/mcp-client.ts
|
|
66
76
|
```
|
|
@@ -74,11 +84,21 @@ import { notion } from "./lib/mcp-client";
|
|
|
74
84
|
const page = await notion.fetchPage("page-id");
|
|
75
85
|
const newPage = await notion.createPage({
|
|
76
86
|
title: "My Page",
|
|
77
|
-
content: "Page content..."
|
|
87
|
+
content: "Page content...",
|
|
78
88
|
});
|
|
79
89
|
```
|
|
80
90
|
|
|
81
|
-
## CLI
|
|
91
|
+
## CLI Reference
|
|
92
|
+
|
|
93
|
+
### Interactive Mode
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
npx mcp-client-gen # Launch interactive prompts
|
|
97
|
+
npx mcp-client-gen -y # Accept defaults and proceed
|
|
98
|
+
npx mcp-client-gen --yes # Same as -y
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Direct Mode
|
|
82
102
|
|
|
83
103
|
```bash
|
|
84
104
|
npx mcp-client-gen [options] <output-file>
|
|
@@ -87,11 +107,14 @@ Arguments:
|
|
|
87
107
|
output-file Path for the generated client file
|
|
88
108
|
|
|
89
109
|
Options:
|
|
90
|
-
--config <file> MCP configuration file (default:
|
|
110
|
+
--config <file> MCP configuration file (default: auto-discover)
|
|
111
|
+
-y, --yes Accept all defaults and skip prompts
|
|
91
112
|
--help Show help information
|
|
92
113
|
|
|
93
114
|
Examples:
|
|
94
|
-
npx mcp-client-gen
|
|
115
|
+
npx mcp-client-gen # Interactive mode
|
|
116
|
+
npx mcp-client-gen -y # Quick generation with defaults
|
|
117
|
+
npx mcp-client-gen ./lib/mcp.ts # Direct mode with output file
|
|
95
118
|
npx mcp-client-gen --config custom.json ./src/clients.ts
|
|
96
119
|
```
|
|
97
120
|
|
|
@@ -100,20 +123,24 @@ Examples:
|
|
|
100
123
|
๐ **API Integration** - Connect to multiple services with one SDK
|
|
101
124
|
๐ค **Workflow Automation** - Build cross-platform automation scripts
|
|
102
125
|
๐ **Data Synchronization** - Keep data in sync across different platforms
|
|
103
|
-
๐งช **Rapid Prototyping** - Quickly test integrations with type safety
|
|
126
|
+
๐งช **Rapid Prototyping** - Quickly test integrations with type safety
|
|
104
127
|
|
|
105
128
|
## Development Status
|
|
106
129
|
|
|
107
130
|
> **Preview Release** - This is an early preview. The core CLI and configuration parsing works, but MCP server introspection is still in development.
|
|
108
131
|
|
|
109
132
|
**Current Status:**
|
|
133
|
+
|
|
110
134
|
- โ
CLI interface and configuration parsing
|
|
111
|
-
- โ
|
|
135
|
+
- โ
Interactive prompts with smart defaults
|
|
136
|
+
- โ
Multi-server client generation structure
|
|
137
|
+
- โ
Multiple MCP config format support (.mcp.json, .cursor/, .vscode/)
|
|
112
138
|
- ๐ง MCP server schema introspection (in progress)
|
|
113
139
|
- ๐ง Real-time type generation from server capabilities
|
|
114
140
|
- ๐ Plugin system for custom transformations
|
|
115
141
|
|
|
116
142
|
**Coming Soon:**
|
|
143
|
+
|
|
117
144
|
- Full MCP protocol implementation
|
|
118
145
|
- Authentication handling
|
|
119
146
|
- Streaming support
|
package/dist/index.js
CHANGED
|
@@ -1,15 +1,856 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __toESM = (mod, isNodeMode, target) => {
|
|
8
|
+
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
9
|
+
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
10
|
+
for (let key of __getOwnPropNames(mod))
|
|
11
|
+
if (!__hasOwnProp.call(to, key))
|
|
12
|
+
__defProp(to, key, {
|
|
13
|
+
get: () => mod[key],
|
|
14
|
+
enumerable: true
|
|
15
|
+
});
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
19
|
+
|
|
20
|
+
// node_modules/sisteransi/src/index.js
|
|
21
|
+
var require_src = __commonJS((exports, module) => {
|
|
22
|
+
var ESC = "\x1B";
|
|
23
|
+
var CSI = `${ESC}[`;
|
|
24
|
+
var beep = "\x07";
|
|
25
|
+
var cursor = {
|
|
26
|
+
to(x, y) {
|
|
27
|
+
if (!y)
|
|
28
|
+
return `${CSI}${x + 1}G`;
|
|
29
|
+
return `${CSI}${y + 1};${x + 1}H`;
|
|
30
|
+
},
|
|
31
|
+
move(x, y) {
|
|
32
|
+
let ret = "";
|
|
33
|
+
if (x < 0)
|
|
34
|
+
ret += `${CSI}${-x}D`;
|
|
35
|
+
else if (x > 0)
|
|
36
|
+
ret += `${CSI}${x}C`;
|
|
37
|
+
if (y < 0)
|
|
38
|
+
ret += `${CSI}${-y}A`;
|
|
39
|
+
else if (y > 0)
|
|
40
|
+
ret += `${CSI}${y}B`;
|
|
41
|
+
return ret;
|
|
42
|
+
},
|
|
43
|
+
up: (count = 1) => `${CSI}${count}A`,
|
|
44
|
+
down: (count = 1) => `${CSI}${count}B`,
|
|
45
|
+
forward: (count = 1) => `${CSI}${count}C`,
|
|
46
|
+
backward: (count = 1) => `${CSI}${count}D`,
|
|
47
|
+
nextLine: (count = 1) => `${CSI}E`.repeat(count),
|
|
48
|
+
prevLine: (count = 1) => `${CSI}F`.repeat(count),
|
|
49
|
+
left: `${CSI}G`,
|
|
50
|
+
hide: `${CSI}?25l`,
|
|
51
|
+
show: `${CSI}?25h`,
|
|
52
|
+
save: `${ESC}7`,
|
|
53
|
+
restore: `${ESC}8`
|
|
54
|
+
};
|
|
55
|
+
var scroll = {
|
|
56
|
+
up: (count = 1) => `${CSI}S`.repeat(count),
|
|
57
|
+
down: (count = 1) => `${CSI}T`.repeat(count)
|
|
58
|
+
};
|
|
59
|
+
var erase = {
|
|
60
|
+
screen: `${CSI}2J`,
|
|
61
|
+
up: (count = 1) => `${CSI}1J`.repeat(count),
|
|
62
|
+
down: (count = 1) => `${CSI}J`.repeat(count),
|
|
63
|
+
line: `${CSI}2K`,
|
|
64
|
+
lineEnd: `${CSI}K`,
|
|
65
|
+
lineStart: `${CSI}1K`,
|
|
66
|
+
lines(count) {
|
|
67
|
+
let clear = "";
|
|
68
|
+
for (let i = 0;i < count; i++)
|
|
69
|
+
clear += this.line + (i < count - 1 ? cursor.up() : "");
|
|
70
|
+
if (count)
|
|
71
|
+
clear += cursor.left;
|
|
72
|
+
return clear;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
module.exports = { cursor, scroll, erase, beep };
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// node_modules/picocolors/picocolors.js
|
|
79
|
+
var require_picocolors = __commonJS((exports, module) => {
|
|
80
|
+
var p = process || {};
|
|
81
|
+
var argv = p.argv || [];
|
|
82
|
+
var env = p.env || {};
|
|
83
|
+
var isColorSupported = !(!!env.NO_COLOR || argv.includes("--no-color")) && (!!env.FORCE_COLOR || argv.includes("--color") || p.platform === "win32" || (p.stdout || {}).isTTY && env.TERM !== "dumb" || !!env.CI);
|
|
84
|
+
var formatter = (open, close, replace = open) => (input) => {
|
|
85
|
+
let string = "" + input, index = string.indexOf(close, open.length);
|
|
86
|
+
return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close;
|
|
87
|
+
};
|
|
88
|
+
var replaceClose = (string, close, replace, index) => {
|
|
89
|
+
let result = "", cursor = 0;
|
|
90
|
+
do {
|
|
91
|
+
result += string.substring(cursor, index) + replace;
|
|
92
|
+
cursor = index + close.length;
|
|
93
|
+
index = string.indexOf(close, cursor);
|
|
94
|
+
} while (~index);
|
|
95
|
+
return result + string.substring(cursor);
|
|
96
|
+
};
|
|
97
|
+
var createColors = (enabled = isColorSupported) => {
|
|
98
|
+
let f = enabled ? formatter : () => String;
|
|
99
|
+
return {
|
|
100
|
+
isColorSupported: enabled,
|
|
101
|
+
reset: f("\x1B[0m", "\x1B[0m"),
|
|
102
|
+
bold: f("\x1B[1m", "\x1B[22m", "\x1B[22m\x1B[1m"),
|
|
103
|
+
dim: f("\x1B[2m", "\x1B[22m", "\x1B[22m\x1B[2m"),
|
|
104
|
+
italic: f("\x1B[3m", "\x1B[23m"),
|
|
105
|
+
underline: f("\x1B[4m", "\x1B[24m"),
|
|
106
|
+
inverse: f("\x1B[7m", "\x1B[27m"),
|
|
107
|
+
hidden: f("\x1B[8m", "\x1B[28m"),
|
|
108
|
+
strikethrough: f("\x1B[9m", "\x1B[29m"),
|
|
109
|
+
black: f("\x1B[30m", "\x1B[39m"),
|
|
110
|
+
red: f("\x1B[31m", "\x1B[39m"),
|
|
111
|
+
green: f("\x1B[32m", "\x1B[39m"),
|
|
112
|
+
yellow: f("\x1B[33m", "\x1B[39m"),
|
|
113
|
+
blue: f("\x1B[34m", "\x1B[39m"),
|
|
114
|
+
magenta: f("\x1B[35m", "\x1B[39m"),
|
|
115
|
+
cyan: f("\x1B[36m", "\x1B[39m"),
|
|
116
|
+
white: f("\x1B[37m", "\x1B[39m"),
|
|
117
|
+
gray: f("\x1B[90m", "\x1B[39m"),
|
|
118
|
+
bgBlack: f("\x1B[40m", "\x1B[49m"),
|
|
119
|
+
bgRed: f("\x1B[41m", "\x1B[49m"),
|
|
120
|
+
bgGreen: f("\x1B[42m", "\x1B[49m"),
|
|
121
|
+
bgYellow: f("\x1B[43m", "\x1B[49m"),
|
|
122
|
+
bgBlue: f("\x1B[44m", "\x1B[49m"),
|
|
123
|
+
bgMagenta: f("\x1B[45m", "\x1B[49m"),
|
|
124
|
+
bgCyan: f("\x1B[46m", "\x1B[49m"),
|
|
125
|
+
bgWhite: f("\x1B[47m", "\x1B[49m"),
|
|
126
|
+
blackBright: f("\x1B[90m", "\x1B[39m"),
|
|
127
|
+
redBright: f("\x1B[91m", "\x1B[39m"),
|
|
128
|
+
greenBright: f("\x1B[92m", "\x1B[39m"),
|
|
129
|
+
yellowBright: f("\x1B[93m", "\x1B[39m"),
|
|
130
|
+
blueBright: f("\x1B[94m", "\x1B[39m"),
|
|
131
|
+
magentaBright: f("\x1B[95m", "\x1B[39m"),
|
|
132
|
+
cyanBright: f("\x1B[96m", "\x1B[39m"),
|
|
133
|
+
whiteBright: f("\x1B[97m", "\x1B[39m"),
|
|
134
|
+
bgBlackBright: f("\x1B[100m", "\x1B[49m"),
|
|
135
|
+
bgRedBright: f("\x1B[101m", "\x1B[49m"),
|
|
136
|
+
bgGreenBright: f("\x1B[102m", "\x1B[49m"),
|
|
137
|
+
bgYellowBright: f("\x1B[103m", "\x1B[49m"),
|
|
138
|
+
bgBlueBright: f("\x1B[104m", "\x1B[49m"),
|
|
139
|
+
bgMagentaBright: f("\x1B[105m", "\x1B[49m"),
|
|
140
|
+
bgCyanBright: f("\x1B[106m", "\x1B[49m"),
|
|
141
|
+
bgWhiteBright: f("\x1B[107m", "\x1B[49m")
|
|
142
|
+
};
|
|
143
|
+
};
|
|
144
|
+
module.exports = createColors();
|
|
145
|
+
module.exports.createColors = createColors;
|
|
146
|
+
});
|
|
2
147
|
|
|
3
148
|
// index.ts
|
|
4
149
|
import { parseArgs } from "node:util";
|
|
5
|
-
import { readFileSync, existsSync } from "node:fs";
|
|
150
|
+
import { readFileSync as readFileSync2, existsSync as existsSync3 } from "node:fs";
|
|
151
|
+
import { resolve as resolve3 } from "node:path";
|
|
152
|
+
|
|
153
|
+
// node_modules/@clack/core/dist/index.mjs
|
|
154
|
+
var import_sisteransi = __toESM(require_src(), 1);
|
|
155
|
+
import { stdin as j, stdout as M } from "node:process";
|
|
156
|
+
var import_picocolors = __toESM(require_picocolors(), 1);
|
|
157
|
+
import O from "node:readline";
|
|
158
|
+
import { Writable as X } from "node:stream";
|
|
159
|
+
function DD({ onlyFirst: e = false } = {}) {
|
|
160
|
+
const t = ["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?(?:\\u0007|\\u001B\\u005C|\\u009C))", "(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");
|
|
161
|
+
return new RegExp(t, e ? undefined : "g");
|
|
162
|
+
}
|
|
163
|
+
var uD = DD();
|
|
164
|
+
function P(e) {
|
|
165
|
+
if (typeof e != "string")
|
|
166
|
+
throw new TypeError(`Expected a \`string\`, got \`${typeof e}\``);
|
|
167
|
+
return e.replace(uD, "");
|
|
168
|
+
}
|
|
169
|
+
function L(e) {
|
|
170
|
+
return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
|
|
171
|
+
}
|
|
172
|
+
var W = { exports: {} };
|
|
173
|
+
(function(e) {
|
|
174
|
+
var u = {};
|
|
175
|
+
e.exports = u, u.eastAsianWidth = function(F) {
|
|
176
|
+
var s = F.charCodeAt(0), i = F.length == 2 ? F.charCodeAt(1) : 0, D = s;
|
|
177
|
+
return 55296 <= s && s <= 56319 && 56320 <= i && i <= 57343 && (s &= 1023, i &= 1023, D = s << 10 | i, D += 65536), D == 12288 || 65281 <= D && D <= 65376 || 65504 <= D && D <= 65510 ? "F" : D == 8361 || 65377 <= D && D <= 65470 || 65474 <= D && D <= 65479 || 65482 <= D && D <= 65487 || 65490 <= D && D <= 65495 || 65498 <= D && D <= 65500 || 65512 <= D && D <= 65518 ? "H" : 4352 <= D && D <= 4447 || 4515 <= D && D <= 4519 || 4602 <= D && D <= 4607 || 9001 <= D && D <= 9002 || 11904 <= D && D <= 11929 || 11931 <= D && D <= 12019 || 12032 <= D && D <= 12245 || 12272 <= D && D <= 12283 || 12289 <= D && D <= 12350 || 12353 <= D && D <= 12438 || 12441 <= D && D <= 12543 || 12549 <= D && D <= 12589 || 12593 <= D && D <= 12686 || 12688 <= D && D <= 12730 || 12736 <= D && D <= 12771 || 12784 <= D && D <= 12830 || 12832 <= D && D <= 12871 || 12880 <= D && D <= 13054 || 13056 <= D && D <= 19903 || 19968 <= D && D <= 42124 || 42128 <= D && D <= 42182 || 43360 <= D && D <= 43388 || 44032 <= D && D <= 55203 || 55216 <= D && D <= 55238 || 55243 <= D && D <= 55291 || 63744 <= D && D <= 64255 || 65040 <= D && D <= 65049 || 65072 <= D && D <= 65106 || 65108 <= D && D <= 65126 || 65128 <= D && D <= 65131 || 110592 <= D && D <= 110593 || 127488 <= D && D <= 127490 || 127504 <= D && D <= 127546 || 127552 <= D && D <= 127560 || 127568 <= D && D <= 127569 || 131072 <= D && D <= 194367 || 177984 <= D && D <= 196605 || 196608 <= D && D <= 262141 ? "W" : 32 <= D && D <= 126 || 162 <= D && D <= 163 || 165 <= D && D <= 166 || D == 172 || D == 175 || 10214 <= D && D <= 10221 || 10629 <= D && D <= 10630 ? "Na" : D == 161 || D == 164 || 167 <= D && D <= 168 || D == 170 || 173 <= D && D <= 174 || 176 <= D && D <= 180 || 182 <= D && D <= 186 || 188 <= D && D <= 191 || D == 198 || D == 208 || 215 <= D && D <= 216 || 222 <= D && D <= 225 || D == 230 || 232 <= D && D <= 234 || 236 <= D && D <= 237 || D == 240 || 242 <= D && D <= 243 || 247 <= D && D <= 250 || D == 252 || D == 254 || D == 257 || D == 273 || D == 275 || D == 283 || 294 <= D && D <= 295 || D == 299 || 305 <= D && D <= 307 || D == 312 || 319 <= D && D <= 322 || D == 324 || 328 <= D && D <= 331 || D == 333 || 338 <= D && D <= 339 || 358 <= D && D <= 359 || D == 363 || D == 462 || D == 464 || D == 466 || D == 468 || D == 470 || D == 472 || D == 474 || D == 476 || D == 593 || D == 609 || D == 708 || D == 711 || 713 <= D && D <= 715 || D == 717 || D == 720 || 728 <= D && D <= 731 || D == 733 || D == 735 || 768 <= D && D <= 879 || 913 <= D && D <= 929 || 931 <= D && D <= 937 || 945 <= D && D <= 961 || 963 <= D && D <= 969 || D == 1025 || 1040 <= D && D <= 1103 || D == 1105 || D == 8208 || 8211 <= D && D <= 8214 || 8216 <= D && D <= 8217 || 8220 <= D && D <= 8221 || 8224 <= D && D <= 8226 || 8228 <= D && D <= 8231 || D == 8240 || 8242 <= D && D <= 8243 || D == 8245 || D == 8251 || D == 8254 || D == 8308 || D == 8319 || 8321 <= D && D <= 8324 || D == 8364 || D == 8451 || D == 8453 || D == 8457 || D == 8467 || D == 8470 || 8481 <= D && D <= 8482 || D == 8486 || D == 8491 || 8531 <= D && D <= 8532 || 8539 <= D && D <= 8542 || 8544 <= D && D <= 8555 || 8560 <= D && D <= 8569 || D == 8585 || 8592 <= D && D <= 8601 || 8632 <= D && D <= 8633 || D == 8658 || D == 8660 || D == 8679 || D == 8704 || 8706 <= D && D <= 8707 || 8711 <= D && D <= 8712 || D == 8715 || D == 8719 || D == 8721 || D == 8725 || D == 8730 || 8733 <= D && D <= 8736 || D == 8739 || D == 8741 || 8743 <= D && D <= 8748 || D == 8750 || 8756 <= D && D <= 8759 || 8764 <= D && D <= 8765 || D == 8776 || D == 8780 || D == 8786 || 8800 <= D && D <= 8801 || 8804 <= D && D <= 8807 || 8810 <= D && D <= 8811 || 8814 <= D && D <= 8815 || 8834 <= D && D <= 8835 || 8838 <= D && D <= 8839 || D == 8853 || D == 8857 || D == 8869 || D == 8895 || D == 8978 || 9312 <= D && D <= 9449 || 9451 <= D && D <= 9547 || 9552 <= D && D <= 9587 || 9600 <= D && D <= 9615 || 9618 <= D && D <= 9621 || 9632 <= D && D <= 9633 || 9635 <= D && D <= 9641 || 9650 <= D && D <= 9651 || 9654 <= D && D <= 9655 || 9660 <= D && D <= 9661 || 9664 <= D && D <= 9665 || 9670 <= D && D <= 9672 || D == 9675 || 9678 <= D && D <= 9681 || 9698 <= D && D <= 9701 || D == 9711 || 9733 <= D && D <= 9734 || D == 9737 || 9742 <= D && D <= 9743 || 9748 <= D && D <= 9749 || D == 9756 || D == 9758 || D == 9792 || D == 9794 || 9824 <= D && D <= 9825 || 9827 <= D && D <= 9829 || 9831 <= D && D <= 9834 || 9836 <= D && D <= 9837 || D == 9839 || 9886 <= D && D <= 9887 || 9918 <= D && D <= 9919 || 9924 <= D && D <= 9933 || 9935 <= D && D <= 9953 || D == 9955 || 9960 <= D && D <= 9983 || D == 10045 || D == 10071 || 10102 <= D && D <= 10111 || 11093 <= D && D <= 11097 || 12872 <= D && D <= 12879 || 57344 <= D && D <= 63743 || 65024 <= D && D <= 65039 || D == 65533 || 127232 <= D && D <= 127242 || 127248 <= D && D <= 127277 || 127280 <= D && D <= 127337 || 127344 <= D && D <= 127386 || 917760 <= D && D <= 917999 || 983040 <= D && D <= 1048573 || 1048576 <= D && D <= 1114109 ? "A" : "N";
|
|
178
|
+
}, u.characterLength = function(F) {
|
|
179
|
+
var s = this.eastAsianWidth(F);
|
|
180
|
+
return s == "F" || s == "W" || s == "A" ? 2 : 1;
|
|
181
|
+
};
|
|
182
|
+
function t(F) {
|
|
183
|
+
return F.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g) || [];
|
|
184
|
+
}
|
|
185
|
+
u.length = function(F) {
|
|
186
|
+
for (var s = t(F), i = 0, D = 0;D < s.length; D++)
|
|
187
|
+
i = i + this.characterLength(s[D]);
|
|
188
|
+
return i;
|
|
189
|
+
}, u.slice = function(F, s, i) {
|
|
190
|
+
textLen = u.length(F), s = s || 0, i = i || 1, s < 0 && (s = textLen + s), i < 0 && (i = textLen + i);
|
|
191
|
+
for (var D = "", C = 0, n = t(F), E = 0;E < n.length; E++) {
|
|
192
|
+
var a = n[E], o = u.length(a);
|
|
193
|
+
if (C >= s - (o == 2 ? 1 : 0))
|
|
194
|
+
if (C + o <= i)
|
|
195
|
+
D += a;
|
|
196
|
+
else
|
|
197
|
+
break;
|
|
198
|
+
C += o;
|
|
199
|
+
}
|
|
200
|
+
return D;
|
|
201
|
+
};
|
|
202
|
+
})(W);
|
|
203
|
+
var tD = W.exports;
|
|
204
|
+
var eD = L(tD);
|
|
205
|
+
var FD = function() {
|
|
206
|
+
return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5-\uDED7\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDD77\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g;
|
|
207
|
+
};
|
|
208
|
+
var sD = L(FD);
|
|
209
|
+
function p(e, u = {}) {
|
|
210
|
+
if (typeof e != "string" || e.length === 0 || (u = { ambiguousIsNarrow: true, ...u }, e = P(e), e.length === 0))
|
|
211
|
+
return 0;
|
|
212
|
+
e = e.replace(sD(), " ");
|
|
213
|
+
const t = u.ambiguousIsNarrow ? 1 : 2;
|
|
214
|
+
let F = 0;
|
|
215
|
+
for (const s of e) {
|
|
216
|
+
const i = s.codePointAt(0);
|
|
217
|
+
if (i <= 31 || i >= 127 && i <= 159 || i >= 768 && i <= 879)
|
|
218
|
+
continue;
|
|
219
|
+
switch (eD.eastAsianWidth(s)) {
|
|
220
|
+
case "F":
|
|
221
|
+
case "W":
|
|
222
|
+
F += 2;
|
|
223
|
+
break;
|
|
224
|
+
case "A":
|
|
225
|
+
F += t;
|
|
226
|
+
break;
|
|
227
|
+
default:
|
|
228
|
+
F += 1;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return F;
|
|
232
|
+
}
|
|
233
|
+
var w = 10;
|
|
234
|
+
var N = (e = 0) => (u) => `\x1B[${u + e}m`;
|
|
235
|
+
var I = (e = 0) => (u) => `\x1B[${38 + e};5;${u}m`;
|
|
236
|
+
var R = (e = 0) => (u, t, F) => `\x1B[${38 + e};2;${u};${t};${F}m`;
|
|
237
|
+
var r = { modifier: { reset: [0, 0], bold: [1, 22], dim: [2, 22], italic: [3, 23], underline: [4, 24], overline: [53, 55], inverse: [7, 27], hidden: [8, 28], strikethrough: [9, 29] }, color: { black: [30, 39], red: [31, 39], green: [32, 39], yellow: [33, 39], blue: [34, 39], magenta: [35, 39], cyan: [36, 39], white: [37, 39], blackBright: [90, 39], gray: [90, 39], grey: [90, 39], redBright: [91, 39], greenBright: [92, 39], yellowBright: [93, 39], blueBright: [94, 39], magentaBright: [95, 39], cyanBright: [96, 39], whiteBright: [97, 39] }, bgColor: { bgBlack: [40, 49], bgRed: [41, 49], bgGreen: [42, 49], bgYellow: [43, 49], bgBlue: [44, 49], bgMagenta: [45, 49], bgCyan: [46, 49], bgWhite: [47, 49], bgBlackBright: [100, 49], bgGray: [100, 49], bgGrey: [100, 49], bgRedBright: [101, 49], bgGreenBright: [102, 49], bgYellowBright: [103, 49], bgBlueBright: [104, 49], bgMagentaBright: [105, 49], bgCyanBright: [106, 49], bgWhiteBright: [107, 49] } };
|
|
238
|
+
Object.keys(r.modifier);
|
|
239
|
+
var iD = Object.keys(r.color);
|
|
240
|
+
var CD = Object.keys(r.bgColor);
|
|
241
|
+
[...iD];
|
|
242
|
+
function rD() {
|
|
243
|
+
const e = new Map;
|
|
244
|
+
for (const [u, t] of Object.entries(r)) {
|
|
245
|
+
for (const [F, s] of Object.entries(t))
|
|
246
|
+
r[F] = { open: `\x1B[${s[0]}m`, close: `\x1B[${s[1]}m` }, t[F] = r[F], e.set(s[0], s[1]);
|
|
247
|
+
Object.defineProperty(r, u, { value: t, enumerable: false });
|
|
248
|
+
}
|
|
249
|
+
return Object.defineProperty(r, "codes", { value: e, enumerable: false }), r.color.close = "\x1B[39m", r.bgColor.close = "\x1B[49m", r.color.ansi = N(), r.color.ansi256 = I(), r.color.ansi16m = R(), r.bgColor.ansi = N(w), r.bgColor.ansi256 = I(w), r.bgColor.ansi16m = R(w), Object.defineProperties(r, { rgbToAnsi256: { value: (u, t, F) => u === t && t === F ? u < 8 ? 16 : u > 248 ? 231 : Math.round((u - 8) / 247 * 24) + 232 : 16 + 36 * Math.round(u / 255 * 5) + 6 * Math.round(t / 255 * 5) + Math.round(F / 255 * 5), enumerable: false }, hexToRgb: { value: (u) => {
|
|
250
|
+
const t = /[a-f\d]{6}|[a-f\d]{3}/i.exec(u.toString(16));
|
|
251
|
+
if (!t)
|
|
252
|
+
return [0, 0, 0];
|
|
253
|
+
let [F] = t;
|
|
254
|
+
F.length === 3 && (F = [...F].map((i) => i + i).join(""));
|
|
255
|
+
const s = Number.parseInt(F, 16);
|
|
256
|
+
return [s >> 16 & 255, s >> 8 & 255, s & 255];
|
|
257
|
+
}, enumerable: false }, hexToAnsi256: { value: (u) => r.rgbToAnsi256(...r.hexToRgb(u)), enumerable: false }, ansi256ToAnsi: { value: (u) => {
|
|
258
|
+
if (u < 8)
|
|
259
|
+
return 30 + u;
|
|
260
|
+
if (u < 16)
|
|
261
|
+
return 90 + (u - 8);
|
|
262
|
+
let t, F, s;
|
|
263
|
+
if (u >= 232)
|
|
264
|
+
t = ((u - 232) * 10 + 8) / 255, F = t, s = t;
|
|
265
|
+
else {
|
|
266
|
+
u -= 16;
|
|
267
|
+
const C = u % 36;
|
|
268
|
+
t = Math.floor(u / 36) / 5, F = Math.floor(C / 6) / 5, s = C % 6 / 5;
|
|
269
|
+
}
|
|
270
|
+
const i = Math.max(t, F, s) * 2;
|
|
271
|
+
if (i === 0)
|
|
272
|
+
return 30;
|
|
273
|
+
let D = 30 + (Math.round(s) << 2 | Math.round(F) << 1 | Math.round(t));
|
|
274
|
+
return i === 2 && (D += 60), D;
|
|
275
|
+
}, enumerable: false }, rgbToAnsi: { value: (u, t, F) => r.ansi256ToAnsi(r.rgbToAnsi256(u, t, F)), enumerable: false }, hexToAnsi: { value: (u) => r.ansi256ToAnsi(r.hexToAnsi256(u)), enumerable: false } }), r;
|
|
276
|
+
}
|
|
277
|
+
var ED = rD();
|
|
278
|
+
var d = new Set(["\x1B", "ย"]);
|
|
279
|
+
var oD = 39;
|
|
280
|
+
var y = "\x07";
|
|
281
|
+
var V = "[";
|
|
282
|
+
var nD = "]";
|
|
283
|
+
var G = "m";
|
|
284
|
+
var _ = `${nD}8;;`;
|
|
285
|
+
var z = (e) => `${d.values().next().value}${V}${e}${G}`;
|
|
286
|
+
var K = (e) => `${d.values().next().value}${_}${e}${y}`;
|
|
287
|
+
var aD = (e) => e.split(" ").map((u) => p(u));
|
|
288
|
+
var k = (e, u, t) => {
|
|
289
|
+
const F = [...u];
|
|
290
|
+
let s = false, i = false, D = p(P(e[e.length - 1]));
|
|
291
|
+
for (const [C, n] of F.entries()) {
|
|
292
|
+
const E = p(n);
|
|
293
|
+
if (D + E <= t ? e[e.length - 1] += n : (e.push(n), D = 0), d.has(n) && (s = true, i = F.slice(C + 1).join("").startsWith(_)), s) {
|
|
294
|
+
i ? n === y && (s = false, i = false) : n === G && (s = false);
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
D += E, D === t && C < F.length - 1 && (e.push(""), D = 0);
|
|
298
|
+
}
|
|
299
|
+
!D && e[e.length - 1].length > 0 && e.length > 1 && (e[e.length - 2] += e.pop());
|
|
300
|
+
};
|
|
301
|
+
var hD = (e) => {
|
|
302
|
+
const u = e.split(" ");
|
|
303
|
+
let t = u.length;
|
|
304
|
+
for (;t > 0 && !(p(u[t - 1]) > 0); )
|
|
305
|
+
t--;
|
|
306
|
+
return t === u.length ? e : u.slice(0, t).join(" ") + u.slice(t).join("");
|
|
307
|
+
};
|
|
308
|
+
var lD = (e, u, t = {}) => {
|
|
309
|
+
if (t.trim !== false && e.trim() === "")
|
|
310
|
+
return "";
|
|
311
|
+
let F = "", s, i;
|
|
312
|
+
const D = aD(e);
|
|
313
|
+
let C = [""];
|
|
314
|
+
for (const [E, a] of e.split(" ").entries()) {
|
|
315
|
+
t.trim !== false && (C[C.length - 1] = C[C.length - 1].trimStart());
|
|
316
|
+
let o = p(C[C.length - 1]);
|
|
317
|
+
if (E !== 0 && (o >= u && (t.wordWrap === false || t.trim === false) && (C.push(""), o = 0), (o > 0 || t.trim === false) && (C[C.length - 1] += " ", o++)), t.hard && D[E] > u) {
|
|
318
|
+
const c = u - o, f = 1 + Math.floor((D[E] - c - 1) / u);
|
|
319
|
+
Math.floor((D[E] - 1) / u) < f && C.push(""), k(C, a, u);
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
if (o + D[E] > u && o > 0 && D[E] > 0) {
|
|
323
|
+
if (t.wordWrap === false && o < u) {
|
|
324
|
+
k(C, a, u);
|
|
325
|
+
continue;
|
|
326
|
+
}
|
|
327
|
+
C.push("");
|
|
328
|
+
}
|
|
329
|
+
if (o + D[E] > u && t.wordWrap === false) {
|
|
330
|
+
k(C, a, u);
|
|
331
|
+
continue;
|
|
332
|
+
}
|
|
333
|
+
C[C.length - 1] += a;
|
|
334
|
+
}
|
|
335
|
+
t.trim !== false && (C = C.map((E) => hD(E)));
|
|
336
|
+
const n = [...C.join(`
|
|
337
|
+
`)];
|
|
338
|
+
for (const [E, a] of n.entries()) {
|
|
339
|
+
if (F += a, d.has(a)) {
|
|
340
|
+
const { groups: c } = new RegExp(`(?:\\${V}(?<code>\\d+)m|\\${_}(?<uri>.*)${y})`).exec(n.slice(E).join("")) || { groups: {} };
|
|
341
|
+
if (c.code !== undefined) {
|
|
342
|
+
const f = Number.parseFloat(c.code);
|
|
343
|
+
s = f === oD ? undefined : f;
|
|
344
|
+
} else
|
|
345
|
+
c.uri !== undefined && (i = c.uri.length === 0 ? undefined : c.uri);
|
|
346
|
+
}
|
|
347
|
+
const o = ED.codes.get(Number(s));
|
|
348
|
+
n[E + 1] === `
|
|
349
|
+
` ? (i && (F += K("")), s && o && (F += z(o))) : a === `
|
|
350
|
+
` && (s && o && (F += z(s)), i && (F += K(i)));
|
|
351
|
+
}
|
|
352
|
+
return F;
|
|
353
|
+
};
|
|
354
|
+
function Y(e, u, t) {
|
|
355
|
+
return String(e).normalize().replace(/\r\n/g, `
|
|
356
|
+
`).split(`
|
|
357
|
+
`).map((F) => lD(F, u, t)).join(`
|
|
358
|
+
`);
|
|
359
|
+
}
|
|
360
|
+
var xD = ["up", "down", "left", "right", "space", "enter", "cancel"];
|
|
361
|
+
var B = { actions: new Set(xD), aliases: new Map([["k", "up"], ["j", "down"], ["h", "left"], ["l", "right"], ["\x03", "cancel"], ["escape", "cancel"]]) };
|
|
362
|
+
function $(e, u) {
|
|
363
|
+
if (typeof e == "string")
|
|
364
|
+
return B.aliases.get(e) === u;
|
|
365
|
+
for (const t of e)
|
|
366
|
+
if (t !== undefined && $(t, u))
|
|
367
|
+
return true;
|
|
368
|
+
return false;
|
|
369
|
+
}
|
|
370
|
+
function BD(e, u) {
|
|
371
|
+
if (e === u)
|
|
372
|
+
return;
|
|
373
|
+
const t = e.split(`
|
|
374
|
+
`), F = u.split(`
|
|
375
|
+
`), s = [];
|
|
376
|
+
for (let i = 0;i < Math.max(t.length, F.length); i++)
|
|
377
|
+
t[i] !== F[i] && s.push(i);
|
|
378
|
+
return s;
|
|
379
|
+
}
|
|
380
|
+
var AD = globalThis.process.platform.startsWith("win");
|
|
381
|
+
var S = Symbol("clack:cancel");
|
|
382
|
+
function pD(e) {
|
|
383
|
+
return e === S;
|
|
384
|
+
}
|
|
385
|
+
function m(e, u) {
|
|
386
|
+
const t = e;
|
|
387
|
+
t.isTTY && t.setRawMode(u);
|
|
388
|
+
}
|
|
389
|
+
var gD = Object.defineProperty;
|
|
390
|
+
var vD = (e, u, t) => (u in e) ? gD(e, u, { enumerable: true, configurable: true, writable: true, value: t }) : e[u] = t;
|
|
391
|
+
var h = (e, u, t) => (vD(e, typeof u != "symbol" ? u + "" : u, t), t);
|
|
392
|
+
|
|
393
|
+
class x {
|
|
394
|
+
constructor(u, t = true) {
|
|
395
|
+
h(this, "input"), h(this, "output"), h(this, "_abortSignal"), h(this, "rl"), h(this, "opts"), h(this, "_render"), h(this, "_track", false), h(this, "_prevFrame", ""), h(this, "_subscribers", new Map), h(this, "_cursor", 0), h(this, "state", "initial"), h(this, "error", ""), h(this, "value");
|
|
396
|
+
const { input: F = j, output: s = M, render: i, signal: D, ...C } = u;
|
|
397
|
+
this.opts = C, this.onKeypress = this.onKeypress.bind(this), this.close = this.close.bind(this), this.render = this.render.bind(this), this._render = i.bind(this), this._track = t, this._abortSignal = D, this.input = F, this.output = s;
|
|
398
|
+
}
|
|
399
|
+
unsubscribe() {
|
|
400
|
+
this._subscribers.clear();
|
|
401
|
+
}
|
|
402
|
+
setSubscriber(u, t) {
|
|
403
|
+
const F = this._subscribers.get(u) ?? [];
|
|
404
|
+
F.push(t), this._subscribers.set(u, F);
|
|
405
|
+
}
|
|
406
|
+
on(u, t) {
|
|
407
|
+
this.setSubscriber(u, { cb: t });
|
|
408
|
+
}
|
|
409
|
+
once(u, t) {
|
|
410
|
+
this.setSubscriber(u, { cb: t, once: true });
|
|
411
|
+
}
|
|
412
|
+
emit(u, ...t) {
|
|
413
|
+
const F = this._subscribers.get(u) ?? [], s = [];
|
|
414
|
+
for (const i of F)
|
|
415
|
+
i.cb(...t), i.once && s.push(() => F.splice(F.indexOf(i), 1));
|
|
416
|
+
for (const i of s)
|
|
417
|
+
i();
|
|
418
|
+
}
|
|
419
|
+
prompt() {
|
|
420
|
+
return new Promise((u, t) => {
|
|
421
|
+
if (this._abortSignal) {
|
|
422
|
+
if (this._abortSignal.aborted)
|
|
423
|
+
return this.state = "cancel", this.close(), u(S);
|
|
424
|
+
this._abortSignal.addEventListener("abort", () => {
|
|
425
|
+
this.state = "cancel", this.close();
|
|
426
|
+
}, { once: true });
|
|
427
|
+
}
|
|
428
|
+
const F = new X;
|
|
429
|
+
F._write = (s, i, D) => {
|
|
430
|
+
this._track && (this.value = this.rl?.line.replace(/\t/g, ""), this._cursor = this.rl?.cursor ?? 0, this.emit("value", this.value)), D();
|
|
431
|
+
}, this.input.pipe(F), this.rl = O.createInterface({ input: this.input, output: F, tabSize: 2, prompt: "", escapeCodeTimeout: 50, terminal: true }), O.emitKeypressEvents(this.input, this.rl), this.rl.prompt(), this.opts.initialValue !== undefined && this._track && this.rl.write(this.opts.initialValue), this.input.on("keypress", this.onKeypress), m(this.input, true), this.output.on("resize", this.render), this.render(), this.once("submit", () => {
|
|
432
|
+
this.output.write(import_sisteransi.cursor.show), this.output.off("resize", this.render), m(this.input, false), u(this.value);
|
|
433
|
+
}), this.once("cancel", () => {
|
|
434
|
+
this.output.write(import_sisteransi.cursor.show), this.output.off("resize", this.render), m(this.input, false), u(S);
|
|
435
|
+
});
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
onKeypress(u, t) {
|
|
439
|
+
if (this.state === "error" && (this.state = "active"), t?.name && (!this._track && B.aliases.has(t.name) && this.emit("cursor", B.aliases.get(t.name)), B.actions.has(t.name) && this.emit("cursor", t.name)), u && (u.toLowerCase() === "y" || u.toLowerCase() === "n") && this.emit("confirm", u.toLowerCase() === "y"), u === "\t" && this.opts.placeholder && (this.value || (this.rl?.write(this.opts.placeholder), this.emit("value", this.opts.placeholder))), u && this.emit("key", u.toLowerCase()), t?.name === "return") {
|
|
440
|
+
if (this.opts.validate) {
|
|
441
|
+
const F = this.opts.validate(this.value);
|
|
442
|
+
F && (this.error = F instanceof Error ? F.message : F, this.state = "error", this.rl?.write(this.value));
|
|
443
|
+
}
|
|
444
|
+
this.state !== "error" && (this.state = "submit");
|
|
445
|
+
}
|
|
446
|
+
$([u, t?.name, t?.sequence], "cancel") && (this.state = "cancel"), (this.state === "submit" || this.state === "cancel") && this.emit("finalize"), this.render(), (this.state === "submit" || this.state === "cancel") && this.close();
|
|
447
|
+
}
|
|
448
|
+
close() {
|
|
449
|
+
this.input.unpipe(), this.input.removeListener("keypress", this.onKeypress), this.output.write(`
|
|
450
|
+
`), m(this.input, false), this.rl?.close(), this.rl = undefined, this.emit(`${this.state}`, this.value), this.unsubscribe();
|
|
451
|
+
}
|
|
452
|
+
restoreCursor() {
|
|
453
|
+
const u = Y(this._prevFrame, process.stdout.columns, { hard: true }).split(`
|
|
454
|
+
`).length - 1;
|
|
455
|
+
this.output.write(import_sisteransi.cursor.move(-999, u * -1));
|
|
456
|
+
}
|
|
457
|
+
render() {
|
|
458
|
+
const u = Y(this._render(this) ?? "", process.stdout.columns, { hard: true });
|
|
459
|
+
if (u !== this._prevFrame) {
|
|
460
|
+
if (this.state === "initial")
|
|
461
|
+
this.output.write(import_sisteransi.cursor.hide);
|
|
462
|
+
else {
|
|
463
|
+
const t = BD(this._prevFrame, u);
|
|
464
|
+
if (this.restoreCursor(), t && t?.length === 1) {
|
|
465
|
+
const F = t[0];
|
|
466
|
+
this.output.write(import_sisteransi.cursor.move(0, F)), this.output.write(import_sisteransi.erase.lines(1));
|
|
467
|
+
const s = u.split(`
|
|
468
|
+
`);
|
|
469
|
+
this.output.write(s[F]), this._prevFrame = u, this.output.write(import_sisteransi.cursor.move(0, s.length - F - 1));
|
|
470
|
+
return;
|
|
471
|
+
}
|
|
472
|
+
if (t && t?.length > 1) {
|
|
473
|
+
const F = t[0];
|
|
474
|
+
this.output.write(import_sisteransi.cursor.move(0, F)), this.output.write(import_sisteransi.erase.down());
|
|
475
|
+
const s = u.split(`
|
|
476
|
+
`).slice(F);
|
|
477
|
+
this.output.write(s.join(`
|
|
478
|
+
`)), this._prevFrame = u;
|
|
479
|
+
return;
|
|
480
|
+
}
|
|
481
|
+
this.output.write(import_sisteransi.erase.down());
|
|
482
|
+
}
|
|
483
|
+
this.output.write(u), this.state === "initial" && (this.state = "active"), this._prevFrame = u;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
var A;
|
|
488
|
+
A = new WeakMap;
|
|
489
|
+
var kD = Object.defineProperty;
|
|
490
|
+
var $D = (e, u, t) => (u in e) ? kD(e, u, { enumerable: true, configurable: true, writable: true, value: t }) : e[u] = t;
|
|
491
|
+
var H = (e, u, t) => ($D(e, typeof u != "symbol" ? u + "" : u, t), t);
|
|
492
|
+
var SD = class extends x {
|
|
493
|
+
constructor(u) {
|
|
494
|
+
super(u, false), H(this, "options"), H(this, "cursor", 0), this.options = u.options, this.value = [...u.initialValues ?? []], this.cursor = Math.max(this.options.findIndex(({ value: t }) => t === u.cursorAt), 0), this.on("key", (t) => {
|
|
495
|
+
t === "a" && this.toggleAll();
|
|
496
|
+
}), this.on("cursor", (t) => {
|
|
497
|
+
switch (t) {
|
|
498
|
+
case "left":
|
|
499
|
+
case "up":
|
|
500
|
+
this.cursor = this.cursor === 0 ? this.options.length - 1 : this.cursor - 1;
|
|
501
|
+
break;
|
|
502
|
+
case "down":
|
|
503
|
+
case "right":
|
|
504
|
+
this.cursor = this.cursor === this.options.length - 1 ? 0 : this.cursor + 1;
|
|
505
|
+
break;
|
|
506
|
+
case "space":
|
|
507
|
+
this.toggleValue();
|
|
508
|
+
break;
|
|
509
|
+
}
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
get _value() {
|
|
513
|
+
return this.options[this.cursor].value;
|
|
514
|
+
}
|
|
515
|
+
toggleAll() {
|
|
516
|
+
const u = this.value.length === this.options.length;
|
|
517
|
+
this.value = u ? [] : this.options.map((t) => t.value);
|
|
518
|
+
}
|
|
519
|
+
toggleValue() {
|
|
520
|
+
const u = this.value.includes(this._value);
|
|
521
|
+
this.value = u ? this.value.filter((t) => t !== this._value) : [...this.value, this._value];
|
|
522
|
+
}
|
|
523
|
+
};
|
|
524
|
+
class RD extends x {
|
|
525
|
+
get valueWithCursor() {
|
|
526
|
+
if (this.state === "submit")
|
|
527
|
+
return this.value;
|
|
528
|
+
if (this.cursor >= this.value.length)
|
|
529
|
+
return `${this.value}โ`;
|
|
530
|
+
const u = this.value.slice(0, this.cursor), [t, ...F] = this.value.slice(this.cursor);
|
|
531
|
+
return `${u}${import_picocolors.default.inverse(t)}${F.join("")}`;
|
|
532
|
+
}
|
|
533
|
+
get cursor() {
|
|
534
|
+
return this._cursor;
|
|
535
|
+
}
|
|
536
|
+
constructor(u) {
|
|
537
|
+
super(u), this.on("finalize", () => {
|
|
538
|
+
this.value || (this.value = u.defaultValue);
|
|
539
|
+
});
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
// node_modules/@clack/prompts/dist/index.mjs
|
|
544
|
+
var import_picocolors2 = __toESM(require_picocolors(), 1);
|
|
545
|
+
var import_sisteransi2 = __toESM(require_src(), 1);
|
|
546
|
+
import y2 from "node:process";
|
|
547
|
+
function ce() {
|
|
548
|
+
return y2.platform !== "win32" ? y2.env.TERM !== "linux" : !!y2.env.CI || !!y2.env.WT_SESSION || !!y2.env.TERMINUS_SUBLIME || y2.env.ConEmuTask === "{cmd::Cmder}" || y2.env.TERM_PROGRAM === "Terminus-Sublime" || y2.env.TERM_PROGRAM === "vscode" || y2.env.TERM === "xterm-256color" || y2.env.TERM === "alacritty" || y2.env.TERMINAL_EMULATOR === "JetBrains-JediTerm";
|
|
549
|
+
}
|
|
550
|
+
var V2 = ce();
|
|
551
|
+
var u = (t, n) => V2 ? t : n;
|
|
552
|
+
var le = u("โ", "*");
|
|
553
|
+
var L2 = u("โ ", "x");
|
|
554
|
+
var W2 = u("โฒ", "x");
|
|
555
|
+
var C = u("โ", "o");
|
|
556
|
+
var ue = u("โ", "T");
|
|
557
|
+
var o = u("โ", "|");
|
|
558
|
+
var d2 = u("โ", "โ");
|
|
559
|
+
var k2 = u("โ", ">");
|
|
560
|
+
var P2 = u("โ", " ");
|
|
561
|
+
var A2 = u("โป", "[โข]");
|
|
562
|
+
var T = u("โผ", "[+]");
|
|
563
|
+
var F = u("โป", "[ ]");
|
|
564
|
+
var $e = u("โช", "โข");
|
|
565
|
+
var _2 = u("โ", "-");
|
|
566
|
+
var me = u("โฎ", "+");
|
|
567
|
+
var de = u("โ", "+");
|
|
568
|
+
var pe = u("โฏ", "+");
|
|
569
|
+
var q = u("โ", "โข");
|
|
570
|
+
var D = u("โ", "*");
|
|
571
|
+
var U = u("โฒ", "!");
|
|
572
|
+
var K2 = u("โ ", "x");
|
|
573
|
+
var b2 = (t) => {
|
|
574
|
+
switch (t) {
|
|
575
|
+
case "initial":
|
|
576
|
+
case "active":
|
|
577
|
+
return import_picocolors2.default.cyan(le);
|
|
578
|
+
case "cancel":
|
|
579
|
+
return import_picocolors2.default.red(L2);
|
|
580
|
+
case "error":
|
|
581
|
+
return import_picocolors2.default.yellow(W2);
|
|
582
|
+
case "submit":
|
|
583
|
+
return import_picocolors2.default.green(C);
|
|
584
|
+
}
|
|
585
|
+
};
|
|
586
|
+
var G2 = (t) => {
|
|
587
|
+
const { cursor: n, options: r2, style: i } = t, s = t.maxItems ?? Number.POSITIVE_INFINITY, c = Math.max(process.stdout.rows - 4, 0), a = Math.min(c, Math.max(s, 5));
|
|
588
|
+
let l2 = 0;
|
|
589
|
+
n >= l2 + a - 3 ? l2 = Math.max(Math.min(n - a + 3, r2.length - a), 0) : n < l2 + 2 && (l2 = Math.max(n - 2, 0));
|
|
590
|
+
const $2 = a < r2.length && l2 > 0, g = a < r2.length && l2 + a < r2.length;
|
|
591
|
+
return r2.slice(l2, l2 + a).map((p2, v2, f) => {
|
|
592
|
+
const j2 = v2 === 0 && $2, E = v2 === f.length - 1 && g;
|
|
593
|
+
return j2 || E ? import_picocolors2.default.dim("...") : i(p2, v2 + l2 === n);
|
|
594
|
+
});
|
|
595
|
+
};
|
|
596
|
+
var he = (t) => new RD({ validate: t.validate, placeholder: t.placeholder, defaultValue: t.defaultValue, initialValue: t.initialValue, render() {
|
|
597
|
+
const n = `${import_picocolors2.default.gray(o)}
|
|
598
|
+
${b2(this.state)} ${t.message}
|
|
599
|
+
`, r2 = t.placeholder ? import_picocolors2.default.inverse(t.placeholder[0]) + import_picocolors2.default.dim(t.placeholder.slice(1)) : import_picocolors2.default.inverse(import_picocolors2.default.hidden("_")), i = this.value ? this.valueWithCursor : r2;
|
|
600
|
+
switch (this.state) {
|
|
601
|
+
case "error":
|
|
602
|
+
return `${n.trim()}
|
|
603
|
+
${import_picocolors2.default.yellow(o)} ${i}
|
|
604
|
+
${import_picocolors2.default.yellow(d2)} ${import_picocolors2.default.yellow(this.error)}
|
|
605
|
+
`;
|
|
606
|
+
case "submit":
|
|
607
|
+
return `${n}${import_picocolors2.default.gray(o)} ${import_picocolors2.default.dim(this.value || t.placeholder)}`;
|
|
608
|
+
case "cancel":
|
|
609
|
+
return `${n}${import_picocolors2.default.gray(o)} ${import_picocolors2.default.strikethrough(import_picocolors2.default.dim(this.value ?? ""))}${this.value?.trim() ? `
|
|
610
|
+
${import_picocolors2.default.gray(o)}` : ""}`;
|
|
611
|
+
default:
|
|
612
|
+
return `${n}${import_picocolors2.default.cyan(o)} ${i}
|
|
613
|
+
${import_picocolors2.default.cyan(d2)}
|
|
614
|
+
`;
|
|
615
|
+
}
|
|
616
|
+
} }).prompt();
|
|
617
|
+
var fe = (t) => {
|
|
618
|
+
const n = (r2, i) => {
|
|
619
|
+
const s = r2.label ?? String(r2.value);
|
|
620
|
+
return i === "active" ? `${import_picocolors2.default.cyan(A2)} ${s} ${r2.hint ? import_picocolors2.default.dim(`(${r2.hint})`) : ""}` : i === "selected" ? `${import_picocolors2.default.green(T)} ${import_picocolors2.default.dim(s)} ${r2.hint ? import_picocolors2.default.dim(`(${r2.hint})`) : ""}` : i === "cancelled" ? `${import_picocolors2.default.strikethrough(import_picocolors2.default.dim(s))}` : i === "active-selected" ? `${import_picocolors2.default.green(T)} ${s} ${r2.hint ? import_picocolors2.default.dim(`(${r2.hint})`) : ""}` : i === "submitted" ? `${import_picocolors2.default.dim(s)}` : `${import_picocolors2.default.dim(F)} ${import_picocolors2.default.dim(s)}`;
|
|
621
|
+
};
|
|
622
|
+
return new SD({ options: t.options, initialValues: t.initialValues, required: t.required ?? true, cursorAt: t.cursorAt, validate(r2) {
|
|
623
|
+
if (this.required && r2.length === 0)
|
|
624
|
+
return `Please select at least one option.
|
|
625
|
+
${import_picocolors2.default.reset(import_picocolors2.default.dim(`Press ${import_picocolors2.default.gray(import_picocolors2.default.bgWhite(import_picocolors2.default.inverse(" space ")))} to select, ${import_picocolors2.default.gray(import_picocolors2.default.bgWhite(import_picocolors2.default.inverse(" enter ")))} to submit`))}`;
|
|
626
|
+
}, render() {
|
|
627
|
+
const r2 = `${import_picocolors2.default.gray(o)}
|
|
628
|
+
${b2(this.state)} ${t.message}
|
|
629
|
+
`, i = (s, c) => {
|
|
630
|
+
const a = this.value.includes(s.value);
|
|
631
|
+
return c && a ? n(s, "active-selected") : a ? n(s, "selected") : n(s, c ? "active" : "inactive");
|
|
632
|
+
};
|
|
633
|
+
switch (this.state) {
|
|
634
|
+
case "submit":
|
|
635
|
+
return `${r2}${import_picocolors2.default.gray(o)} ${this.options.filter(({ value: s }) => this.value.includes(s)).map((s) => n(s, "submitted")).join(import_picocolors2.default.dim(", ")) || import_picocolors2.default.dim("none")}`;
|
|
636
|
+
case "cancel": {
|
|
637
|
+
const s = this.options.filter(({ value: c }) => this.value.includes(c)).map((c) => n(c, "cancelled")).join(import_picocolors2.default.dim(", "));
|
|
638
|
+
return `${r2}${import_picocolors2.default.gray(o)} ${s.trim() ? `${s}
|
|
639
|
+
${import_picocolors2.default.gray(o)}` : ""}`;
|
|
640
|
+
}
|
|
641
|
+
case "error": {
|
|
642
|
+
const s = this.error.split(`
|
|
643
|
+
`).map((c, a) => a === 0 ? `${import_picocolors2.default.yellow(d2)} ${import_picocolors2.default.yellow(c)}` : ` ${c}`).join(`
|
|
644
|
+
`);
|
|
645
|
+
return `${r2 + import_picocolors2.default.yellow(o)} ${G2({ options: this.options, cursor: this.cursor, maxItems: t.maxItems, style: i }).join(`
|
|
646
|
+
${import_picocolors2.default.yellow(o)} `)}
|
|
647
|
+
${s}
|
|
648
|
+
`;
|
|
649
|
+
}
|
|
650
|
+
default:
|
|
651
|
+
return `${r2}${import_picocolors2.default.cyan(o)} ${G2({ options: this.options, cursor: this.cursor, maxItems: t.maxItems, style: i }).join(`
|
|
652
|
+
${import_picocolors2.default.cyan(o)} `)}
|
|
653
|
+
${import_picocolors2.default.cyan(d2)}
|
|
654
|
+
`;
|
|
655
|
+
}
|
|
656
|
+
} }).prompt();
|
|
657
|
+
};
|
|
658
|
+
var xe = (t = "") => {
|
|
659
|
+
process.stdout.write(`${import_picocolors2.default.gray(d2)} ${import_picocolors2.default.red(t)}
|
|
660
|
+
|
|
661
|
+
`);
|
|
662
|
+
};
|
|
663
|
+
var Ie = (t = "") => {
|
|
664
|
+
process.stdout.write(`${import_picocolors2.default.gray(ue)} ${t}
|
|
665
|
+
`);
|
|
666
|
+
};
|
|
667
|
+
var Se = (t = "") => {
|
|
668
|
+
process.stdout.write(`${import_picocolors2.default.gray(o)}
|
|
669
|
+
${import_picocolors2.default.gray(d2)} ${t}
|
|
670
|
+
|
|
671
|
+
`);
|
|
672
|
+
};
|
|
673
|
+
var J = `${import_picocolors2.default.gray(o)} `;
|
|
674
|
+
|
|
675
|
+
// lib/prompts.ts
|
|
676
|
+
import { existsSync as existsSync2 } from "node:fs";
|
|
677
|
+
import { resolve as resolve2 } from "node:path";
|
|
678
|
+
|
|
679
|
+
// lib/config.ts
|
|
680
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
6
681
|
import { resolve } from "node:path";
|
|
682
|
+
var MCP_CONFIG_PATHS = [
|
|
683
|
+
".mcp.local.json",
|
|
684
|
+
".mcp.json",
|
|
685
|
+
".cursor/mcp.local.json",
|
|
686
|
+
".cursor/mcp.json",
|
|
687
|
+
".vscode/mcp.local.json",
|
|
688
|
+
".vscode/mcp.json"
|
|
689
|
+
];
|
|
690
|
+
async function findMcpConfigFiles(cwd = process.cwd()) {
|
|
691
|
+
const foundFiles = [];
|
|
692
|
+
for (const configPath of MCP_CONFIG_PATHS) {
|
|
693
|
+
const fullPath = resolve(cwd, configPath);
|
|
694
|
+
if (existsSync(fullPath)) {
|
|
695
|
+
foundFiles.push(fullPath);
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
return foundFiles;
|
|
699
|
+
}
|
|
700
|
+
function getMcpServers(paths) {
|
|
701
|
+
const servers = [];
|
|
702
|
+
const seenUrls = new Set;
|
|
703
|
+
for (const path of paths) {
|
|
704
|
+
try {
|
|
705
|
+
const content = readFileSync(path, "utf8");
|
|
706
|
+
const config = JSON.parse(content);
|
|
707
|
+
const isVSCodeFormat = !!config.servers;
|
|
708
|
+
const serverConfigs = config.mcpServers || config.servers;
|
|
709
|
+
if (serverConfigs && typeof serverConfigs === "object") {
|
|
710
|
+
for (const [, serverConfig] of Object.entries(serverConfigs)) {
|
|
711
|
+
if (typeof serverConfig === "object" && serverConfig !== null) {
|
|
712
|
+
const server = serverConfig;
|
|
713
|
+
const trimmedUrl = typeof server.url === "string" ? server.url.trim() : "";
|
|
714
|
+
if (trimmedUrl && !seenUrls.has(trimmedUrl)) {
|
|
715
|
+
let serverType = null;
|
|
716
|
+
if (server.type === "http" || server.type === "sse") {
|
|
717
|
+
serverType = server.type;
|
|
718
|
+
} else if (server.type === "stdio" || server.command) {
|
|
719
|
+
continue;
|
|
720
|
+
} else if (!server.type) {
|
|
721
|
+
if (isVSCodeFormat || config.mcpServers) {
|
|
722
|
+
serverType = "http";
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
if (serverType) {
|
|
726
|
+
seenUrls.add(trimmedUrl);
|
|
727
|
+
servers.push({
|
|
728
|
+
type: serverType,
|
|
729
|
+
url: trimmedUrl
|
|
730
|
+
});
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
} catch (error) {
|
|
737
|
+
continue;
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
return servers;
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
// lib/prompts.ts
|
|
744
|
+
async function promptForConfigFiles(cwd = process.cwd()) {
|
|
745
|
+
const availableFiles = await findMcpConfigFiles(cwd);
|
|
746
|
+
if (availableFiles.length === 0) {
|
|
747
|
+
throw new Error("No MCP configuration files found. Create a .mcp.json file with your MCP server configuration.");
|
|
748
|
+
}
|
|
749
|
+
const configSelection = await fe({
|
|
750
|
+
message: "Select MCP configuration files to use:",
|
|
751
|
+
options: availableFiles.map((file) => ({
|
|
752
|
+
value: file,
|
|
753
|
+
label: file.replace(cwd + "/", ""),
|
|
754
|
+
hint: `Found at ${file}`
|
|
755
|
+
})),
|
|
756
|
+
initialValues: availableFiles,
|
|
757
|
+
required: true
|
|
758
|
+
});
|
|
759
|
+
if (pD(configSelection)) {
|
|
760
|
+
xe("Operation cancelled");
|
|
761
|
+
process.exit(0);
|
|
762
|
+
}
|
|
763
|
+
return configSelection;
|
|
764
|
+
}
|
|
765
|
+
async function promptForServers(configFiles) {
|
|
766
|
+
const allServers = getMcpServers(configFiles);
|
|
767
|
+
if (allServers.length === 0) {
|
|
768
|
+
throw new Error("No valid MCP servers found in configuration files. Check your .mcp.json configuration.");
|
|
769
|
+
}
|
|
770
|
+
const serverSelection = await fe({
|
|
771
|
+
message: "Select MCP servers to include:",
|
|
772
|
+
options: allServers.map((server) => ({
|
|
773
|
+
value: server,
|
|
774
|
+
label: `${server.url}`,
|
|
775
|
+
hint: `Type: ${server.type}`
|
|
776
|
+
})),
|
|
777
|
+
initialValues: allServers,
|
|
778
|
+
required: true
|
|
779
|
+
});
|
|
780
|
+
if (pD(serverSelection)) {
|
|
781
|
+
xe("Operation cancelled");
|
|
782
|
+
process.exit(0);
|
|
783
|
+
}
|
|
784
|
+
return serverSelection;
|
|
785
|
+
}
|
|
786
|
+
async function promptForOutputFile(cwd = process.cwd()) {
|
|
787
|
+
const srcExists = existsSync2(resolve2(cwd, "src"));
|
|
788
|
+
const defaultPath = srcExists ? "src/lib/mcp-client.ts" : "lib/mcp-client.ts";
|
|
789
|
+
const outputPath = await he({
|
|
790
|
+
message: "Enter output file path:",
|
|
791
|
+
placeholder: defaultPath,
|
|
792
|
+
defaultValue: defaultPath,
|
|
793
|
+
validate: (value) => {
|
|
794
|
+
if (!value || value.trim() === "") {
|
|
795
|
+
return "Output file path is required";
|
|
796
|
+
}
|
|
797
|
+
if (!value.endsWith(".ts")) {
|
|
798
|
+
return "Output file must have .ts extension";
|
|
799
|
+
}
|
|
800
|
+
return;
|
|
801
|
+
}
|
|
802
|
+
});
|
|
803
|
+
if (pD(outputPath)) {
|
|
804
|
+
xe("Operation cancelled");
|
|
805
|
+
process.exit(0);
|
|
806
|
+
}
|
|
807
|
+
return outputPath.trim();
|
|
808
|
+
}
|
|
809
|
+
async function runInteractiveSetup(cwd = process.cwd(), useDefaults = false) {
|
|
810
|
+
if (useDefaults) {
|
|
811
|
+
const configFiles = await findMcpConfigFiles(cwd);
|
|
812
|
+
if (configFiles.length === 0) {
|
|
813
|
+
throw new Error("No MCP configuration files found. Create a .mcp.json file with your MCP server configuration.");
|
|
814
|
+
}
|
|
815
|
+
const servers = getMcpServers(configFiles);
|
|
816
|
+
if (servers.length === 0) {
|
|
817
|
+
throw new Error("No valid MCP servers found in configuration files. Check your .mcp.json configuration.");
|
|
818
|
+
}
|
|
819
|
+
const srcExists = existsSync2(resolve2(cwd, "src"));
|
|
820
|
+
const outputFile = srcExists ? "src/lib/mcp-client.ts" : "lib/mcp-client.ts";
|
|
821
|
+
console.log(`\uD83D\uDE80 Using defaults: ${servers.length} server${servers.length !== 1 ? "s" : ""} โ ${outputFile}`);
|
|
822
|
+
return {
|
|
823
|
+
configFiles,
|
|
824
|
+
servers,
|
|
825
|
+
outputFile
|
|
826
|
+
};
|
|
827
|
+
}
|
|
828
|
+
Ie("\uD83E\uDDE9 MCP Client Generator");
|
|
829
|
+
try {
|
|
830
|
+
const configFiles = await promptForConfigFiles(cwd);
|
|
831
|
+
const servers = await promptForServers(configFiles);
|
|
832
|
+
const outputFile = await promptForOutputFile(cwd);
|
|
833
|
+
Se(`\x05 Configuration complete! Generating client for ${servers.length} server${servers.length !== 1 ? "s" : ""}`);
|
|
834
|
+
return {
|
|
835
|
+
configFiles,
|
|
836
|
+
servers,
|
|
837
|
+
outputFile
|
|
838
|
+
};
|
|
839
|
+
} catch (error) {
|
|
840
|
+
xe(`Error: ${error.message}`);
|
|
841
|
+
process.exit(1);
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
// index.ts
|
|
7
846
|
function showHelp() {
|
|
8
847
|
console.log(`
|
|
9
848
|
mcp-client-gen - Generate type-safe MCP client SDK
|
|
10
849
|
|
|
11
850
|
Usage:
|
|
12
|
-
npx mcp-client-gen
|
|
851
|
+
npx mcp-client-gen # Launch interactive mode
|
|
852
|
+
npx mcp-client-gen -y # Accept defaults and proceed
|
|
853
|
+
npx mcp-client-gen <output-file> # Use specific output file
|
|
13
854
|
npx mcp-client-gen --config <config-file> <output-file>
|
|
14
855
|
|
|
15
856
|
Arguments:
|
|
@@ -17,10 +858,13 @@ Arguments:
|
|
|
17
858
|
|
|
18
859
|
Options:
|
|
19
860
|
--config <file> Path to MCP configuration file (default: .mcp.json)
|
|
861
|
+
-y, --yes Accept all defaults and skip interactive prompts
|
|
20
862
|
--help Show this help message
|
|
21
863
|
|
|
22
|
-
|
|
23
|
-
npx mcp-client-gen
|
|
864
|
+
Examples:
|
|
865
|
+
npx mcp-client-gen # Interactive mode with prompts
|
|
866
|
+
npx mcp-client-gen -y # Quick generation with defaults
|
|
867
|
+
npx mcp-client-gen ./lib/mcp-client.ts # Specify output file
|
|
24
868
|
npx mcp-client-gen --config custom.mcp.json ./lib/mcp.ts
|
|
25
869
|
`);
|
|
26
870
|
}
|
|
@@ -29,7 +873,8 @@ function parseArguments() {
|
|
|
29
873
|
const { values, positionals } = parseArgs({
|
|
30
874
|
options: {
|
|
31
875
|
config: { type: "string" },
|
|
32
|
-
help: { type: "boolean", short: "h" }
|
|
876
|
+
help: { type: "boolean", short: "h" },
|
|
877
|
+
yes: { type: "boolean", short: "y" }
|
|
33
878
|
},
|
|
34
879
|
allowPositionals: true
|
|
35
880
|
});
|
|
@@ -38,13 +883,16 @@ function parseArguments() {
|
|
|
38
883
|
return null;
|
|
39
884
|
}
|
|
40
885
|
if (positionals.length === 0) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
886
|
+
return {
|
|
887
|
+
output: "",
|
|
888
|
+
config: values.config,
|
|
889
|
+
yes: values.yes || false
|
|
890
|
+
};
|
|
44
891
|
}
|
|
45
892
|
return {
|
|
46
893
|
output: positionals[0],
|
|
47
|
-
config: values.config
|
|
894
|
+
config: values.config,
|
|
895
|
+
yes: values.yes || false
|
|
48
896
|
};
|
|
49
897
|
} catch (error) {
|
|
50
898
|
console.error("Error parsing arguments:", error.message);
|
|
@@ -53,22 +901,22 @@ function parseArguments() {
|
|
|
53
901
|
}
|
|
54
902
|
}
|
|
55
903
|
function loadMCPConfig(configPath) {
|
|
56
|
-
const defaultConfigPath =
|
|
57
|
-
const actualConfigPath = configPath ?
|
|
58
|
-
if (!
|
|
904
|
+
const defaultConfigPath = resolve3(process.cwd(), ".mcp.json");
|
|
905
|
+
const actualConfigPath = configPath ? resolve3(process.cwd(), configPath) : defaultConfigPath;
|
|
906
|
+
if (!existsSync3(actualConfigPath)) {
|
|
59
907
|
console.error(`Error: Configuration file not found: ${actualConfigPath}`);
|
|
60
908
|
console.error("Create a .mcp.json file with your MCP server configuration.");
|
|
61
909
|
process.exit(1);
|
|
62
910
|
}
|
|
63
911
|
try {
|
|
64
|
-
const configContent =
|
|
912
|
+
const configContent = readFileSync2(actualConfigPath, "utf-8");
|
|
65
913
|
return JSON.parse(configContent);
|
|
66
914
|
} catch (error) {
|
|
67
915
|
console.error(`Error reading configuration file: ${error.message}`);
|
|
68
916
|
process.exit(1);
|
|
69
917
|
}
|
|
70
918
|
}
|
|
71
|
-
async function
|
|
919
|
+
async function generateMCPClientFromConfig(args) {
|
|
72
920
|
const config = loadMCPConfig(args.config);
|
|
73
921
|
const serverNames = Object.keys(config.mcpServers);
|
|
74
922
|
console.log(`Generating MCP client SDK from ${serverNames.length} servers...`);
|
|
@@ -76,7 +924,12 @@ async function generateMCPClient(args) {
|
|
|
76
924
|
console.log("โณ Connecting to MCP servers...");
|
|
77
925
|
console.log("โณ Fetching server capabilities...");
|
|
78
926
|
console.log("โณ Generating TypeScript client...");
|
|
79
|
-
const clientExports = serverNames.map((name) =>
|
|
927
|
+
const clientExports = serverNames.map((name) => {
|
|
928
|
+
const server = config.mcpServers[name];
|
|
929
|
+
if (!server)
|
|
930
|
+
throw new Error(`Server ${name} not found in configuration`);
|
|
931
|
+
return `export const ${name} = new ${capitalize(name)}Client("${server.url}");`;
|
|
932
|
+
}).join(`
|
|
80
933
|
`);
|
|
81
934
|
const clientClasses = serverNames.map((name) => `
|
|
82
935
|
export class ${capitalize(name)}Client {
|
|
@@ -90,7 +943,7 @@ export class ${capitalize(name)}Client {
|
|
|
90
943
|
}`).join(`
|
|
91
944
|
`);
|
|
92
945
|
const clientCode = `// Generated MCP client SDK
|
|
93
|
-
// Generated from: ${Object.entries(config.mcpServers).map(([name, server]) => `${name} (${server
|
|
946
|
+
// Generated from: ${Object.entries(config.mcpServers).map(([name, server]) => `${name} (${server?.url || "unknown"})`).join(", ")}
|
|
94
947
|
|
|
95
948
|
${clientClasses}
|
|
96
949
|
|
|
@@ -102,15 +955,61 @@ Usage:`);
|
|
|
102
955
|
console.log(`import { ${serverNames[0]} } from "${args.output.replace(".ts", ".js")}";`);
|
|
103
956
|
console.log(`const result = await ${serverNames[0]}.fetchPage("123");`);
|
|
104
957
|
}
|
|
958
|
+
async function generateMCPClientFromServers(servers, outputFile) {
|
|
959
|
+
console.log(`Generating MCP client SDK from ${servers.length} servers...`);
|
|
960
|
+
console.log(`Servers: ${servers.map((s) => s.url).join(", ")}`);
|
|
961
|
+
console.log("โณ Connecting to MCP servers...");
|
|
962
|
+
console.log("โณ Fetching server capabilities...");
|
|
963
|
+
console.log("โณ Generating TypeScript client...");
|
|
964
|
+
const serverNames = servers.map((_3, index) => `server${index + 1}`);
|
|
965
|
+
const clientExports = servers.map((server, index) => `export const server${index + 1} = new Server${index + 1}Client("${server.url}");`).join(`
|
|
966
|
+
`);
|
|
967
|
+
const clientClasses = servers.map((server, index) => `
|
|
968
|
+
export class Server${index + 1}Client {
|
|
969
|
+
constructor(private serverUrl: string) {}
|
|
970
|
+
|
|
971
|
+
// TODO: Generated methods based on server capabilities
|
|
972
|
+
async fetchPage(id: string) {
|
|
973
|
+
// Implementation will be generated based on MCP server schema
|
|
974
|
+
throw new Error("Not implemented yet");
|
|
975
|
+
}
|
|
976
|
+
}`).join(`
|
|
977
|
+
`);
|
|
978
|
+
const clientCode = `// Generated MCP client SDK
|
|
979
|
+
// Generated from: ${servers.map((s) => `${s.url} (${s.type})`).join(", ")}
|
|
980
|
+
|
|
981
|
+
${clientClasses}
|
|
982
|
+
|
|
983
|
+
${clientExports}
|
|
984
|
+
`;
|
|
985
|
+
console.log(`โ
Generated client saved to ${outputFile}`);
|
|
986
|
+
console.log(`
|
|
987
|
+
Usage:`);
|
|
988
|
+
console.log(`import { ${serverNames[0]} } from "${outputFile.replace(".ts", ".js")}";`);
|
|
989
|
+
console.log(`const result = await ${serverNames[0]}.fetchPage("123");`);
|
|
990
|
+
}
|
|
105
991
|
function capitalize(str) {
|
|
106
992
|
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
107
993
|
}
|
|
108
994
|
async function main() {
|
|
109
995
|
const args = parseArguments();
|
|
110
|
-
if (!args)
|
|
996
|
+
if (!args) {
|
|
997
|
+
console.error("Error: No arguments provided and help not requested");
|
|
998
|
+
showHelp();
|
|
999
|
+
process.exit(1);
|
|
1000
|
+
}
|
|
1001
|
+
if (!args.output) {
|
|
1002
|
+
try {
|
|
1003
|
+
const result = await runInteractiveSetup(process.cwd(), args.yes);
|
|
1004
|
+
await generateMCPClientFromServers(result.servers, result.outputFile);
|
|
1005
|
+
} catch (error) {
|
|
1006
|
+
console.error("Error:", error.message);
|
|
1007
|
+
process.exit(1);
|
|
1008
|
+
}
|
|
111
1009
|
return;
|
|
1010
|
+
}
|
|
112
1011
|
try {
|
|
113
|
-
await
|
|
1012
|
+
await generateMCPClientFromConfig(args);
|
|
114
1013
|
} catch (error) {
|
|
115
1014
|
console.error("Error:", error.message);
|
|
116
1015
|
process.exit(1);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-client-gen",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "CLI tool that generates
|
|
3
|
+
"version": "0.0.2",
|
|
4
|
+
"description": "Interactive CLI tool that generates type-safe TypeScript clients from MCP servers",
|
|
5
5
|
"module": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
@@ -18,12 +18,13 @@
|
|
|
18
18
|
"codegen",
|
|
19
19
|
"anthropic",
|
|
20
20
|
"cli",
|
|
21
|
+
"interactive",
|
|
21
22
|
"typescript",
|
|
22
23
|
"api-client",
|
|
23
|
-
"
|
|
24
|
+
"prompts",
|
|
24
25
|
"schema",
|
|
25
26
|
"tool",
|
|
26
|
-
"
|
|
27
|
+
"type-safe"
|
|
27
28
|
],
|
|
28
29
|
"author": "Konstantin Tarkus <koistya@kriasoft.com>",
|
|
29
30
|
"license": "MIT",
|
|
@@ -35,12 +36,19 @@
|
|
|
35
36
|
"bugs": {
|
|
36
37
|
"url": "https://github.com/kriasoft/mcp-client-gen/issues"
|
|
37
38
|
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@clack/prompts": "^0.11.0",
|
|
41
|
+
"ts-morph": "^26.0.0"
|
|
42
|
+
},
|
|
38
43
|
"peerDependencies": {
|
|
44
|
+
"@modelcontextprotocol/sdk": "^1.17.2",
|
|
39
45
|
"typescript": "^5.9.2"
|
|
40
46
|
},
|
|
41
47
|
"devDependencies": {
|
|
48
|
+
"@modelcontextprotocol/sdk": "^1.17.2",
|
|
42
49
|
"@types/bun": "latest",
|
|
43
|
-
"prettier": "^3.6.2"
|
|
50
|
+
"prettier": "^3.6.2",
|
|
51
|
+
"typescript": "^5.9.2"
|
|
44
52
|
},
|
|
45
53
|
"scripts": {
|
|
46
54
|
"build": "bun build index.ts --outdir dist --target node",
|