create-esa-stack 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/LICENSE +21 -0
- package/README.md +75 -0
- package/dist/cli.js +1096 -0
- package/package.json +57 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
### Planned for 0.2.0
|
|
11
|
+
- Template registry system
|
|
12
|
+
- Project structure schema
|
|
13
|
+
- Commander.js CLI framework
|
|
14
|
+
- AST-based code transformations
|
|
15
|
+
- Test infrastructure
|
|
16
|
+
- Critical bug fixes
|
|
17
|
+
|
|
18
|
+
## [0.1.0] - 2026-01-22
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
- Initial CLI scaffolding tool
|
|
22
|
+
- Next.js project generation with:
|
|
23
|
+
- TypeScript
|
|
24
|
+
- Tailwind CSS
|
|
25
|
+
- Biome.js
|
|
26
|
+
- React Compiler
|
|
27
|
+
- Turbopack
|
|
28
|
+
- pnpm
|
|
29
|
+
- Optional integrations:
|
|
30
|
+
- @tanstack/react-query
|
|
31
|
+
- shadcn/ui
|
|
32
|
+
- Resend
|
|
33
|
+
- Interactive prompts with @clack/prompts
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 ESA Stack
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# create-esa-stack
|
|
2
|
+
|
|
3
|
+
A CLI tool to quickly scaffold Next.js projects with ESA's preferred tech stack.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
Creates a Next.js project with the following tech stack:
|
|
8
|
+
|
|
9
|
+
- ✅ **Next.js** - React framework with App Router
|
|
10
|
+
- ✅ **TypeScript** - Type-safe JavaScript
|
|
11
|
+
- ✅ **Tailwind CSS** - Utility-first CSS framework
|
|
12
|
+
- ✅ **Biome.js** - Fast linter and formatter
|
|
13
|
+
- ✅ **React Compiler** - Optimized React performance
|
|
14
|
+
- ✅ **Turbopack** - Fast bundler for development
|
|
15
|
+
- ✅ **pnpm** - Efficient package manager
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
### Using npx (Recommended)
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npx create-esa-stack
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Using Bun
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
bun create esa-stack
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Local Development
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# Install dependencies
|
|
35
|
+
bun install
|
|
36
|
+
|
|
37
|
+
# Run the CLI locally
|
|
38
|
+
bun run dev
|
|
39
|
+
|
|
40
|
+
# Build the CLI
|
|
41
|
+
bun run build
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## How It Works
|
|
45
|
+
|
|
46
|
+
The CLI prompts you for a project name and then runs `create-next-app` with the following flags:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
npx create-next-app@latest <project-name> \
|
|
50
|
+
--ts \
|
|
51
|
+
--tailwind \
|
|
52
|
+
--biome \
|
|
53
|
+
--react-compiler \
|
|
54
|
+
--app \
|
|
55
|
+
--use-pnpm \
|
|
56
|
+
--turbopack \
|
|
57
|
+
--yes
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Roadmap
|
|
61
|
+
|
|
62
|
+
Optional integrations available:
|
|
63
|
+
|
|
64
|
+
- [x] **@tanstack/react-query** - Data fetching and caching ✨
|
|
65
|
+
- [x] **shadcn/ui** - Beautiful UI component library ✨
|
|
66
|
+
- [x] **resend** - Email API for sending emails ✨
|
|
67
|
+
|
|
68
|
+
Coming soon:
|
|
69
|
+
|
|
70
|
+
- [ ] **react-email** - Email templates
|
|
71
|
+
- [ ] **Storybook** - Component development
|
|
72
|
+
|
|
73
|
+
## License
|
|
74
|
+
|
|
75
|
+
MIT
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,1096 @@
|
|
|
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
|
+
});
|
|
147
|
+
|
|
148
|
+
// node_modules/@clack/core/dist/index.mjs
|
|
149
|
+
var import_sisteransi = __toESM(require_src(), 1);
|
|
150
|
+
var import_picocolors = __toESM(require_picocolors(), 1);
|
|
151
|
+
import { stdin as $, stdout as k } from "node:process";
|
|
152
|
+
import * as f from "node:readline";
|
|
153
|
+
import _ from "node:readline";
|
|
154
|
+
import { WriteStream as U } from "node:tty";
|
|
155
|
+
function q({ onlyFirst: e = false } = {}) {
|
|
156
|
+
const F = ["[\\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("|");
|
|
157
|
+
return new RegExp(F, e ? undefined : "g");
|
|
158
|
+
}
|
|
159
|
+
var J = q();
|
|
160
|
+
function S(e) {
|
|
161
|
+
if (typeof e != "string")
|
|
162
|
+
throw new TypeError(`Expected a \`string\`, got \`${typeof e}\``);
|
|
163
|
+
return e.replace(J, "");
|
|
164
|
+
}
|
|
165
|
+
function T(e) {
|
|
166
|
+
return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
|
|
167
|
+
}
|
|
168
|
+
var j = { exports: {} };
|
|
169
|
+
(function(e) {
|
|
170
|
+
var u = {};
|
|
171
|
+
e.exports = u, u.eastAsianWidth = function(t) {
|
|
172
|
+
var s = t.charCodeAt(0), C = t.length == 2 ? t.charCodeAt(1) : 0, D = s;
|
|
173
|
+
return 55296 <= s && s <= 56319 && 56320 <= C && C <= 57343 && (s &= 1023, C &= 1023, D = s << 10 | C, 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";
|
|
174
|
+
}, u.characterLength = function(t) {
|
|
175
|
+
var s = this.eastAsianWidth(t);
|
|
176
|
+
return s == "F" || s == "W" || s == "A" ? 2 : 1;
|
|
177
|
+
};
|
|
178
|
+
function F(t) {
|
|
179
|
+
return t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g) || [];
|
|
180
|
+
}
|
|
181
|
+
u.length = function(t) {
|
|
182
|
+
for (var s = F(t), C = 0, D = 0;D < s.length; D++)
|
|
183
|
+
C = C + this.characterLength(s[D]);
|
|
184
|
+
return C;
|
|
185
|
+
}, u.slice = function(t, s, C) {
|
|
186
|
+
textLen = u.length(t), s = s || 0, C = C || 1, s < 0 && (s = textLen + s), C < 0 && (C = textLen + C);
|
|
187
|
+
for (var D = "", i = 0, n = F(t), E = 0;E < n.length; E++) {
|
|
188
|
+
var h = n[E], o = u.length(h);
|
|
189
|
+
if (i >= s - (o == 2 ? 1 : 0))
|
|
190
|
+
if (i + o <= C)
|
|
191
|
+
D += h;
|
|
192
|
+
else
|
|
193
|
+
break;
|
|
194
|
+
i += o;
|
|
195
|
+
}
|
|
196
|
+
return D;
|
|
197
|
+
};
|
|
198
|
+
})(j);
|
|
199
|
+
var Q = j.exports;
|
|
200
|
+
var X = T(Q);
|
|
201
|
+
var DD = function() {
|
|
202
|
+
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;
|
|
203
|
+
};
|
|
204
|
+
var uD = T(DD);
|
|
205
|
+
function A(e, u = {}) {
|
|
206
|
+
if (typeof e != "string" || e.length === 0 || (u = { ambiguousIsNarrow: true, ...u }, e = S(e), e.length === 0))
|
|
207
|
+
return 0;
|
|
208
|
+
e = e.replace(uD(), " ");
|
|
209
|
+
const F = u.ambiguousIsNarrow ? 1 : 2;
|
|
210
|
+
let t = 0;
|
|
211
|
+
for (const s of e) {
|
|
212
|
+
const C = s.codePointAt(0);
|
|
213
|
+
if (C <= 31 || C >= 127 && C <= 159 || C >= 768 && C <= 879)
|
|
214
|
+
continue;
|
|
215
|
+
switch (X.eastAsianWidth(s)) {
|
|
216
|
+
case "F":
|
|
217
|
+
case "W":
|
|
218
|
+
t += 2;
|
|
219
|
+
break;
|
|
220
|
+
case "A":
|
|
221
|
+
t += F;
|
|
222
|
+
break;
|
|
223
|
+
default:
|
|
224
|
+
t += 1;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return t;
|
|
228
|
+
}
|
|
229
|
+
var d = 10;
|
|
230
|
+
var M = (e = 0) => (u) => `\x1B[${u + e}m`;
|
|
231
|
+
var P = (e = 0) => (u) => `\x1B[${38 + e};5;${u}m`;
|
|
232
|
+
var W = (e = 0) => (u, F, t) => `\x1B[${38 + e};2;${u};${F};${t}m`;
|
|
233
|
+
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] } };
|
|
234
|
+
Object.keys(r.modifier);
|
|
235
|
+
var FD = Object.keys(r.color);
|
|
236
|
+
var eD = Object.keys(r.bgColor);
|
|
237
|
+
[...FD, ...eD];
|
|
238
|
+
function tD() {
|
|
239
|
+
const e = new Map;
|
|
240
|
+
for (const [u, F] of Object.entries(r)) {
|
|
241
|
+
for (const [t, s] of Object.entries(F))
|
|
242
|
+
r[t] = { open: `\x1B[${s[0]}m`, close: `\x1B[${s[1]}m` }, F[t] = r[t], e.set(s[0], s[1]);
|
|
243
|
+
Object.defineProperty(r, u, { value: F, enumerable: false });
|
|
244
|
+
}
|
|
245
|
+
return Object.defineProperty(r, "codes", { value: e, enumerable: false }), r.color.close = "\x1B[39m", r.bgColor.close = "\x1B[49m", r.color.ansi = M(), r.color.ansi256 = P(), r.color.ansi16m = W(), r.bgColor.ansi = M(d), r.bgColor.ansi256 = P(d), r.bgColor.ansi16m = W(d), Object.defineProperties(r, { rgbToAnsi256: { value: (u, F, t) => u === F && F === t ? u < 8 ? 16 : u > 248 ? 231 : Math.round((u - 8) / 247 * 24) + 232 : 16 + 36 * Math.round(u / 255 * 5) + 6 * Math.round(F / 255 * 5) + Math.round(t / 255 * 5), enumerable: false }, hexToRgb: { value: (u) => {
|
|
246
|
+
const F = /[a-f\d]{6}|[a-f\d]{3}/i.exec(u.toString(16));
|
|
247
|
+
if (!F)
|
|
248
|
+
return [0, 0, 0];
|
|
249
|
+
let [t] = F;
|
|
250
|
+
t.length === 3 && (t = [...t].map((C) => C + C).join(""));
|
|
251
|
+
const s = Number.parseInt(t, 16);
|
|
252
|
+
return [s >> 16 & 255, s >> 8 & 255, s & 255];
|
|
253
|
+
}, enumerable: false }, hexToAnsi256: { value: (u) => r.rgbToAnsi256(...r.hexToRgb(u)), enumerable: false }, ansi256ToAnsi: { value: (u) => {
|
|
254
|
+
if (u < 8)
|
|
255
|
+
return 30 + u;
|
|
256
|
+
if (u < 16)
|
|
257
|
+
return 90 + (u - 8);
|
|
258
|
+
let F, t, s;
|
|
259
|
+
if (u >= 232)
|
|
260
|
+
F = ((u - 232) * 10 + 8) / 255, t = F, s = F;
|
|
261
|
+
else {
|
|
262
|
+
u -= 16;
|
|
263
|
+
const i = u % 36;
|
|
264
|
+
F = Math.floor(u / 36) / 5, t = Math.floor(i / 6) / 5, s = i % 6 / 5;
|
|
265
|
+
}
|
|
266
|
+
const C = Math.max(F, t, s) * 2;
|
|
267
|
+
if (C === 0)
|
|
268
|
+
return 30;
|
|
269
|
+
let D = 30 + (Math.round(s) << 2 | Math.round(t) << 1 | Math.round(F));
|
|
270
|
+
return C === 2 && (D += 60), D;
|
|
271
|
+
}, enumerable: false }, rgbToAnsi: { value: (u, F, t) => r.ansi256ToAnsi(r.rgbToAnsi256(u, F, t)), enumerable: false }, hexToAnsi: { value: (u) => r.ansi256ToAnsi(r.hexToAnsi256(u)), enumerable: false } }), r;
|
|
272
|
+
}
|
|
273
|
+
var sD = tD();
|
|
274
|
+
var g = new Set(["\x1B", ""]);
|
|
275
|
+
var CD = 39;
|
|
276
|
+
var b = "\x07";
|
|
277
|
+
var O = "[";
|
|
278
|
+
var iD = "]";
|
|
279
|
+
var I = "m";
|
|
280
|
+
var w = `${iD}8;;`;
|
|
281
|
+
var N = (e) => `${g.values().next().value}${O}${e}${I}`;
|
|
282
|
+
var L = (e) => `${g.values().next().value}${w}${e}${b}`;
|
|
283
|
+
var rD = (e) => e.split(" ").map((u) => A(u));
|
|
284
|
+
var y = (e, u, F) => {
|
|
285
|
+
const t = [...u];
|
|
286
|
+
let s = false, C = false, D = A(S(e[e.length - 1]));
|
|
287
|
+
for (const [i, n] of t.entries()) {
|
|
288
|
+
const E = A(n);
|
|
289
|
+
if (D + E <= F ? e[e.length - 1] += n : (e.push(n), D = 0), g.has(n) && (s = true, C = t.slice(i + 1).join("").startsWith(w)), s) {
|
|
290
|
+
C ? n === b && (s = false, C = false) : n === I && (s = false);
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
D += E, D === F && i < t.length - 1 && (e.push(""), D = 0);
|
|
294
|
+
}
|
|
295
|
+
!D && e[e.length - 1].length > 0 && e.length > 1 && (e[e.length - 2] += e.pop());
|
|
296
|
+
};
|
|
297
|
+
var ED = (e) => {
|
|
298
|
+
const u = e.split(" ");
|
|
299
|
+
let F = u.length;
|
|
300
|
+
for (;F > 0 && !(A(u[F - 1]) > 0); )
|
|
301
|
+
F--;
|
|
302
|
+
return F === u.length ? e : u.slice(0, F).join(" ") + u.slice(F).join("");
|
|
303
|
+
};
|
|
304
|
+
var oD = (e, u, F = {}) => {
|
|
305
|
+
if (F.trim !== false && e.trim() === "")
|
|
306
|
+
return "";
|
|
307
|
+
let t = "", s, C;
|
|
308
|
+
const D = rD(e);
|
|
309
|
+
let i = [""];
|
|
310
|
+
for (const [E, h] of e.split(" ").entries()) {
|
|
311
|
+
F.trim !== false && (i[i.length - 1] = i[i.length - 1].trimStart());
|
|
312
|
+
let o = A(i[i.length - 1]);
|
|
313
|
+
if (E !== 0 && (o >= u && (F.wordWrap === false || F.trim === false) && (i.push(""), o = 0), (o > 0 || F.trim === false) && (i[i.length - 1] += " ", o++)), F.hard && D[E] > u) {
|
|
314
|
+
const B = u - o, p = 1 + Math.floor((D[E] - B - 1) / u);
|
|
315
|
+
Math.floor((D[E] - 1) / u) < p && i.push(""), y(i, h, u);
|
|
316
|
+
continue;
|
|
317
|
+
}
|
|
318
|
+
if (o + D[E] > u && o > 0 && D[E] > 0) {
|
|
319
|
+
if (F.wordWrap === false && o < u) {
|
|
320
|
+
y(i, h, u);
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
i.push("");
|
|
324
|
+
}
|
|
325
|
+
if (o + D[E] > u && F.wordWrap === false) {
|
|
326
|
+
y(i, h, u);
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
i[i.length - 1] += h;
|
|
330
|
+
}
|
|
331
|
+
F.trim !== false && (i = i.map((E) => ED(E)));
|
|
332
|
+
const n = [...i.join(`
|
|
333
|
+
`)];
|
|
334
|
+
for (const [E, h] of n.entries()) {
|
|
335
|
+
if (t += h, g.has(h)) {
|
|
336
|
+
const { groups: B } = new RegExp(`(?:\\${O}(?<code>\\d+)m|\\${w}(?<uri>.*)${b})`).exec(n.slice(E).join("")) || { groups: {} };
|
|
337
|
+
if (B.code !== undefined) {
|
|
338
|
+
const p = Number.parseFloat(B.code);
|
|
339
|
+
s = p === CD ? undefined : p;
|
|
340
|
+
} else
|
|
341
|
+
B.uri !== undefined && (C = B.uri.length === 0 ? undefined : B.uri);
|
|
342
|
+
}
|
|
343
|
+
const o = sD.codes.get(Number(s));
|
|
344
|
+
n[E + 1] === `
|
|
345
|
+
` ? (C && (t += L("")), s && o && (t += N(o))) : h === `
|
|
346
|
+
` && (s && o && (t += N(s)), C && (t += L(C)));
|
|
347
|
+
}
|
|
348
|
+
return t;
|
|
349
|
+
};
|
|
350
|
+
function R(e, u, F) {
|
|
351
|
+
return String(e).normalize().replace(/\r\n/g, `
|
|
352
|
+
`).split(`
|
|
353
|
+
`).map((t) => oD(t, u, F)).join(`
|
|
354
|
+
`);
|
|
355
|
+
}
|
|
356
|
+
var nD = Object.defineProperty;
|
|
357
|
+
var aD = (e, u, F) => (u in e) ? nD(e, u, { enumerable: true, configurable: true, writable: true, value: F }) : e[u] = F;
|
|
358
|
+
var a = (e, u, F) => (aD(e, typeof u != "symbol" ? u + "" : u, F), F);
|
|
359
|
+
function hD(e, u) {
|
|
360
|
+
if (e === u)
|
|
361
|
+
return;
|
|
362
|
+
const F = e.split(`
|
|
363
|
+
`), t = u.split(`
|
|
364
|
+
`), s = [];
|
|
365
|
+
for (let C = 0;C < Math.max(F.length, t.length); C++)
|
|
366
|
+
F[C] !== t[C] && s.push(C);
|
|
367
|
+
return s;
|
|
368
|
+
}
|
|
369
|
+
var V = Symbol("clack:cancel");
|
|
370
|
+
function lD(e) {
|
|
371
|
+
return e === V;
|
|
372
|
+
}
|
|
373
|
+
function v(e, u) {
|
|
374
|
+
e.isTTY && e.setRawMode(u);
|
|
375
|
+
}
|
|
376
|
+
var z = new Map([["k", "up"], ["j", "down"], ["h", "left"], ["l", "right"]]);
|
|
377
|
+
var xD = new Set(["up", "down", "left", "right", "space", "enter"]);
|
|
378
|
+
|
|
379
|
+
class x {
|
|
380
|
+
constructor({ render: u, input: F = $, output: t = k, ...s }, C = true) {
|
|
381
|
+
a(this, "input"), a(this, "output"), a(this, "rl"), a(this, "opts"), a(this, "_track", false), a(this, "_render"), a(this, "_cursor", 0), a(this, "state", "initial"), a(this, "value"), a(this, "error", ""), a(this, "subscribers", new Map), a(this, "_prevFrame", ""), this.opts = s, this.onKeypress = this.onKeypress.bind(this), this.close = this.close.bind(this), this.render = this.render.bind(this), this._render = u.bind(this), this._track = C, this.input = F, this.output = t;
|
|
382
|
+
}
|
|
383
|
+
prompt() {
|
|
384
|
+
const u = new U(0);
|
|
385
|
+
return u._write = (F, t, s) => {
|
|
386
|
+
this._track && (this.value = this.rl.line.replace(/\t/g, ""), this._cursor = this.rl.cursor, this.emit("value", this.value)), s();
|
|
387
|
+
}, this.input.pipe(u), this.rl = _.createInterface({ input: this.input, output: u, tabSize: 2, prompt: "", escapeCodeTimeout: 50 }), _.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), v(this.input, true), this.output.on("resize", this.render), this.render(), new Promise((F, t) => {
|
|
388
|
+
this.once("submit", () => {
|
|
389
|
+
this.output.write(import_sisteransi.cursor.show), this.output.off("resize", this.render), v(this.input, false), F(this.value);
|
|
390
|
+
}), this.once("cancel", () => {
|
|
391
|
+
this.output.write(import_sisteransi.cursor.show), this.output.off("resize", this.render), v(this.input, false), F(V);
|
|
392
|
+
});
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
on(u, F) {
|
|
396
|
+
const t = this.subscribers.get(u) ?? [];
|
|
397
|
+
t.push({ cb: F }), this.subscribers.set(u, t);
|
|
398
|
+
}
|
|
399
|
+
once(u, F) {
|
|
400
|
+
const t = this.subscribers.get(u) ?? [];
|
|
401
|
+
t.push({ cb: F, once: true }), this.subscribers.set(u, t);
|
|
402
|
+
}
|
|
403
|
+
emit(u, ...F) {
|
|
404
|
+
const t = this.subscribers.get(u) ?? [], s = [];
|
|
405
|
+
for (const C of t)
|
|
406
|
+
C.cb(...F), C.once && s.push(() => t.splice(t.indexOf(C), 1));
|
|
407
|
+
for (const C of s)
|
|
408
|
+
C();
|
|
409
|
+
}
|
|
410
|
+
unsubscribe() {
|
|
411
|
+
this.subscribers.clear();
|
|
412
|
+
}
|
|
413
|
+
onKeypress(u, F) {
|
|
414
|
+
if (this.state === "error" && (this.state = "active"), F?.name && !this._track && z.has(F.name) && this.emit("cursor", z.get(F.name)), F?.name && xD.has(F.name) && this.emit("cursor", F.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()), F?.name === "return") {
|
|
415
|
+
if (this.opts.validate) {
|
|
416
|
+
const t = this.opts.validate(this.value);
|
|
417
|
+
t && (this.error = t, this.state = "error", this.rl.write(this.value));
|
|
418
|
+
}
|
|
419
|
+
this.state !== "error" && (this.state = "submit");
|
|
420
|
+
}
|
|
421
|
+
u === "\x03" && (this.state = "cancel"), (this.state === "submit" || this.state === "cancel") && this.emit("finalize"), this.render(), (this.state === "submit" || this.state === "cancel") && this.close();
|
|
422
|
+
}
|
|
423
|
+
close() {
|
|
424
|
+
this.input.unpipe(), this.input.removeListener("keypress", this.onKeypress), this.output.write(`
|
|
425
|
+
`), v(this.input, false), this.rl.close(), this.emit(`${this.state}`, this.value), this.unsubscribe();
|
|
426
|
+
}
|
|
427
|
+
restoreCursor() {
|
|
428
|
+
const u = R(this._prevFrame, process.stdout.columns, { hard: true }).split(`
|
|
429
|
+
`).length - 1;
|
|
430
|
+
this.output.write(import_sisteransi.cursor.move(-999, u * -1));
|
|
431
|
+
}
|
|
432
|
+
render() {
|
|
433
|
+
const u = R(this._render(this) ?? "", process.stdout.columns, { hard: true });
|
|
434
|
+
if (u !== this._prevFrame) {
|
|
435
|
+
if (this.state === "initial")
|
|
436
|
+
this.output.write(import_sisteransi.cursor.hide);
|
|
437
|
+
else {
|
|
438
|
+
const F = hD(this._prevFrame, u);
|
|
439
|
+
if (this.restoreCursor(), F && F?.length === 1) {
|
|
440
|
+
const t = F[0];
|
|
441
|
+
this.output.write(import_sisteransi.cursor.move(0, t)), this.output.write(import_sisteransi.erase.lines(1));
|
|
442
|
+
const s = u.split(`
|
|
443
|
+
`);
|
|
444
|
+
this.output.write(s[t]), this._prevFrame = u, this.output.write(import_sisteransi.cursor.move(0, s.length - t - 1));
|
|
445
|
+
return;
|
|
446
|
+
} else if (F && F?.length > 1) {
|
|
447
|
+
const t = F[0];
|
|
448
|
+
this.output.write(import_sisteransi.cursor.move(0, t)), this.output.write(import_sisteransi.erase.down());
|
|
449
|
+
const s = u.split(`
|
|
450
|
+
`).slice(t);
|
|
451
|
+
this.output.write(s.join(`
|
|
452
|
+
`)), this._prevFrame = u;
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
|
+
this.output.write(import_sisteransi.erase.down());
|
|
456
|
+
}
|
|
457
|
+
this.output.write(u), this.state === "initial" && (this.state = "active"), this._prevFrame = u;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
class BD extends x {
|
|
463
|
+
get cursor() {
|
|
464
|
+
return this.value ? 0 : 1;
|
|
465
|
+
}
|
|
466
|
+
get _value() {
|
|
467
|
+
return this.cursor === 0;
|
|
468
|
+
}
|
|
469
|
+
constructor(u) {
|
|
470
|
+
super(u, false), this.value = !!u.initialValue, this.on("value", () => {
|
|
471
|
+
this.value = this._value;
|
|
472
|
+
}), this.on("confirm", (F) => {
|
|
473
|
+
this.output.write(import_sisteransi.cursor.move(0, -1)), this.value = F, this.state = "submit", this.close();
|
|
474
|
+
}), this.on("cursor", () => {
|
|
475
|
+
this.value = !this.value;
|
|
476
|
+
});
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
var TD = Object.defineProperty;
|
|
480
|
+
var jD = (e, u, F) => (u in e) ? TD(e, u, { enumerable: true, configurable: true, writable: true, value: F }) : e[u] = F;
|
|
481
|
+
var MD = (e, u, F) => (jD(e, typeof u != "symbol" ? u + "" : u, F), F);
|
|
482
|
+
|
|
483
|
+
class PD extends x {
|
|
484
|
+
constructor(u) {
|
|
485
|
+
super(u), MD(this, "valueWithCursor", ""), this.on("finalize", () => {
|
|
486
|
+
this.value || (this.value = u.defaultValue), this.valueWithCursor = this.value;
|
|
487
|
+
}), this.on("value", () => {
|
|
488
|
+
if (this.cursor >= this.value.length)
|
|
489
|
+
this.valueWithCursor = `${this.value}${import_picocolors.default.inverse(import_picocolors.default.hidden("_"))}`;
|
|
490
|
+
else {
|
|
491
|
+
const F = this.value.slice(0, this.cursor), t = this.value.slice(this.cursor);
|
|
492
|
+
this.valueWithCursor = `${F}${import_picocolors.default.inverse(t[0])}${t.slice(1)}`;
|
|
493
|
+
}
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
get cursor() {
|
|
497
|
+
return this._cursor;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
var WD = globalThis.process.platform.startsWith("win");
|
|
501
|
+
function OD({ input: e = $, output: u = k, overwrite: F = true, hideCursor: t = true } = {}) {
|
|
502
|
+
const s = f.createInterface({ input: e, output: u, prompt: "", tabSize: 1 });
|
|
503
|
+
f.emitKeypressEvents(e, s), e.isTTY && e.setRawMode(true);
|
|
504
|
+
const C = (D, { name: i }) => {
|
|
505
|
+
if (String(D) === "\x03") {
|
|
506
|
+
t && u.write(import_sisteransi.cursor.show), process.exit(0);
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
if (!F)
|
|
510
|
+
return;
|
|
511
|
+
let n = i === "return" ? 0 : -1, E = i === "return" ? -1 : 0;
|
|
512
|
+
f.moveCursor(u, n, E, () => {
|
|
513
|
+
f.clearLine(u, 1, () => {
|
|
514
|
+
e.once("keypress", C);
|
|
515
|
+
});
|
|
516
|
+
});
|
|
517
|
+
};
|
|
518
|
+
return t && u.write(import_sisteransi.cursor.hide), e.once("keypress", C), () => {
|
|
519
|
+
e.off("keypress", C), t && u.write(import_sisteransi.cursor.show), e.isTTY && !WD && e.setRawMode(false), s.terminal = false, s.close();
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
// node_modules/@clack/prompts/dist/index.mjs
|
|
524
|
+
var import_picocolors2 = __toESM(require_picocolors(), 1);
|
|
525
|
+
var import_sisteransi2 = __toESM(require_src(), 1);
|
|
526
|
+
import h from "node:process";
|
|
527
|
+
function K() {
|
|
528
|
+
return h.platform !== "win32" ? h.env.TERM !== "linux" : !!h.env.CI || !!h.env.WT_SESSION || !!h.env.TERMINUS_SUBLIME || h.env.ConEmuTask === "{cmd::Cmder}" || h.env.TERM_PROGRAM === "Terminus-Sublime" || h.env.TERM_PROGRAM === "vscode" || h.env.TERM === "xterm-256color" || h.env.TERM === "alacritty" || h.env.TERMINAL_EMULATOR === "JetBrains-JediTerm";
|
|
529
|
+
}
|
|
530
|
+
var C = K();
|
|
531
|
+
var u = (s, n) => C ? s : n;
|
|
532
|
+
var Y = u("◆", "*");
|
|
533
|
+
var P2 = u("■", "x");
|
|
534
|
+
var V2 = u("▲", "x");
|
|
535
|
+
var M2 = u("◇", "o");
|
|
536
|
+
var Q2 = u("┌", "T");
|
|
537
|
+
var a2 = u("│", "|");
|
|
538
|
+
var $2 = u("└", "—");
|
|
539
|
+
var I2 = u("●", ">");
|
|
540
|
+
var T2 = u("○", " ");
|
|
541
|
+
var j2 = u("◻", "[•]");
|
|
542
|
+
var b2 = u("◼", "[+]");
|
|
543
|
+
var B = u("◻", "[ ]");
|
|
544
|
+
var X2 = u("▪", "•");
|
|
545
|
+
var G = u("─", "-");
|
|
546
|
+
var H = u("╮", "+");
|
|
547
|
+
var ee = u("├", "+");
|
|
548
|
+
var te = u("╯", "+");
|
|
549
|
+
var se = u("●", "•");
|
|
550
|
+
var re = u("◆", "*");
|
|
551
|
+
var ie = u("▲", "!");
|
|
552
|
+
var ne = u("■", "x");
|
|
553
|
+
var y2 = (s) => {
|
|
554
|
+
switch (s) {
|
|
555
|
+
case "initial":
|
|
556
|
+
case "active":
|
|
557
|
+
return import_picocolors2.default.cyan(Y);
|
|
558
|
+
case "cancel":
|
|
559
|
+
return import_picocolors2.default.red(P2);
|
|
560
|
+
case "error":
|
|
561
|
+
return import_picocolors2.default.yellow(V2);
|
|
562
|
+
case "submit":
|
|
563
|
+
return import_picocolors2.default.green(M2);
|
|
564
|
+
}
|
|
565
|
+
};
|
|
566
|
+
var ae = (s) => new PD({ validate: s.validate, placeholder: s.placeholder, defaultValue: s.defaultValue, initialValue: s.initialValue, render() {
|
|
567
|
+
const n = `${import_picocolors2.default.gray(a2)}
|
|
568
|
+
${y2(this.state)} ${s.message}
|
|
569
|
+
`, t = s.placeholder ? import_picocolors2.default.inverse(s.placeholder[0]) + import_picocolors2.default.dim(s.placeholder.slice(1)) : import_picocolors2.default.inverse(import_picocolors2.default.hidden("_")), i = this.value ? this.valueWithCursor : t;
|
|
570
|
+
switch (this.state) {
|
|
571
|
+
case "error":
|
|
572
|
+
return `${n.trim()}
|
|
573
|
+
${import_picocolors2.default.yellow(a2)} ${i}
|
|
574
|
+
${import_picocolors2.default.yellow($2)} ${import_picocolors2.default.yellow(this.error)}
|
|
575
|
+
`;
|
|
576
|
+
case "submit":
|
|
577
|
+
return `${n}${import_picocolors2.default.gray(a2)} ${import_picocolors2.default.dim(this.value || s.placeholder)}`;
|
|
578
|
+
case "cancel":
|
|
579
|
+
return `${n}${import_picocolors2.default.gray(a2)} ${import_picocolors2.default.strikethrough(import_picocolors2.default.dim(this.value ?? ""))}${this.value?.trim() ? `
|
|
580
|
+
` + import_picocolors2.default.gray(a2) : ""}`;
|
|
581
|
+
default:
|
|
582
|
+
return `${n}${import_picocolors2.default.cyan(a2)} ${i}
|
|
583
|
+
${import_picocolors2.default.cyan($2)}
|
|
584
|
+
`;
|
|
585
|
+
}
|
|
586
|
+
} }).prompt();
|
|
587
|
+
var ce = (s) => {
|
|
588
|
+
const n = s.active ?? "Yes", t = s.inactive ?? "No";
|
|
589
|
+
return new BD({ active: n, inactive: t, initialValue: s.initialValue ?? true, render() {
|
|
590
|
+
const i = `${import_picocolors2.default.gray(a2)}
|
|
591
|
+
${y2(this.state)} ${s.message}
|
|
592
|
+
`, r2 = this.value ? n : t;
|
|
593
|
+
switch (this.state) {
|
|
594
|
+
case "submit":
|
|
595
|
+
return `${i}${import_picocolors2.default.gray(a2)} ${import_picocolors2.default.dim(r2)}`;
|
|
596
|
+
case "cancel":
|
|
597
|
+
return `${i}${import_picocolors2.default.gray(a2)} ${import_picocolors2.default.strikethrough(import_picocolors2.default.dim(r2))}
|
|
598
|
+
${import_picocolors2.default.gray(a2)}`;
|
|
599
|
+
default:
|
|
600
|
+
return `${i}${import_picocolors2.default.cyan(a2)} ${this.value ? `${import_picocolors2.default.green(I2)} ${n}` : `${import_picocolors2.default.dim(T2)} ${import_picocolors2.default.dim(n)}`} ${import_picocolors2.default.dim("/")} ${this.value ? `${import_picocolors2.default.dim(T2)} ${import_picocolors2.default.dim(t)}` : `${import_picocolors2.default.green(I2)} ${t}`}
|
|
601
|
+
${import_picocolors2.default.cyan($2)}
|
|
602
|
+
`;
|
|
603
|
+
}
|
|
604
|
+
} }).prompt();
|
|
605
|
+
};
|
|
606
|
+
var R2 = (s) => s.replace(ye(), "");
|
|
607
|
+
var me = (s = "", n = "") => {
|
|
608
|
+
const t = `
|
|
609
|
+
${s}
|
|
610
|
+
`.split(`
|
|
611
|
+
`), i = R2(n).length, r2 = Math.max(t.reduce((c2, l2) => (l2 = R2(l2), l2.length > c2 ? l2.length : c2), 0), i) + 2, o = t.map((c2) => `${import_picocolors2.default.gray(a2)} ${import_picocolors2.default.dim(c2)}${" ".repeat(r2 - R2(c2).length)}${import_picocolors2.default.gray(a2)}`).join(`
|
|
612
|
+
`);
|
|
613
|
+
process.stdout.write(`${import_picocolors2.default.gray(a2)}
|
|
614
|
+
${import_picocolors2.default.green(M2)} ${import_picocolors2.default.reset(n)} ${import_picocolors2.default.gray(G.repeat(Math.max(r2 - i - 1, 1)) + H)}
|
|
615
|
+
${o}
|
|
616
|
+
${import_picocolors2.default.gray(ee + G.repeat(r2 + 2) + te)}
|
|
617
|
+
`);
|
|
618
|
+
};
|
|
619
|
+
var he = (s = "") => {
|
|
620
|
+
process.stdout.write(`${import_picocolors2.default.gray($2)} ${import_picocolors2.default.red(s)}
|
|
621
|
+
|
|
622
|
+
`);
|
|
623
|
+
};
|
|
624
|
+
var pe = (s = "") => {
|
|
625
|
+
process.stdout.write(`${import_picocolors2.default.gray(Q2)} ${s}
|
|
626
|
+
`);
|
|
627
|
+
};
|
|
628
|
+
var ge = (s = "") => {
|
|
629
|
+
process.stdout.write(`${import_picocolors2.default.gray(a2)}
|
|
630
|
+
${import_picocolors2.default.gray($2)} ${s}
|
|
631
|
+
|
|
632
|
+
`);
|
|
633
|
+
};
|
|
634
|
+
var v2 = { message: (s = "", { symbol: n = import_picocolors2.default.gray(a2) } = {}) => {
|
|
635
|
+
const t = [`${import_picocolors2.default.gray(a2)}`];
|
|
636
|
+
if (s) {
|
|
637
|
+
const [i, ...r2] = s.split(`
|
|
638
|
+
`);
|
|
639
|
+
t.push(`${n} ${i}`, ...r2.map((o) => `${import_picocolors2.default.gray(a2)} ${o}`));
|
|
640
|
+
}
|
|
641
|
+
process.stdout.write(`${t.join(`
|
|
642
|
+
`)}
|
|
643
|
+
`);
|
|
644
|
+
}, info: (s) => {
|
|
645
|
+
v2.message(s, { symbol: import_picocolors2.default.blue(se) });
|
|
646
|
+
}, success: (s) => {
|
|
647
|
+
v2.message(s, { symbol: import_picocolors2.default.green(re) });
|
|
648
|
+
}, step: (s) => {
|
|
649
|
+
v2.message(s, { symbol: import_picocolors2.default.green(M2) });
|
|
650
|
+
}, warn: (s) => {
|
|
651
|
+
v2.message(s, { symbol: import_picocolors2.default.yellow(ie) });
|
|
652
|
+
}, warning: (s) => {
|
|
653
|
+
v2.warn(s);
|
|
654
|
+
}, error: (s) => {
|
|
655
|
+
v2.message(s, { symbol: import_picocolors2.default.red(ne) });
|
|
656
|
+
} };
|
|
657
|
+
var _2 = () => {
|
|
658
|
+
const s = C ? ["◒", "◐", "◓", "◑"] : ["•", "o", "O", "0"], n = C ? 80 : 120;
|
|
659
|
+
let t, i, r2 = false, o = "";
|
|
660
|
+
const c2 = (g2) => {
|
|
661
|
+
const m2 = g2 > 1 ? "Something went wrong" : "Canceled";
|
|
662
|
+
r2 && x2(m2, g2);
|
|
663
|
+
}, l2 = () => c2(2), d2 = () => c2(1), p = () => {
|
|
664
|
+
process.on("uncaughtExceptionMonitor", l2), process.on("unhandledRejection", l2), process.on("SIGINT", d2), process.on("SIGTERM", d2), process.on("exit", c2);
|
|
665
|
+
}, S2 = () => {
|
|
666
|
+
process.removeListener("uncaughtExceptionMonitor", l2), process.removeListener("unhandledRejection", l2), process.removeListener("SIGINT", d2), process.removeListener("SIGTERM", d2), process.removeListener("exit", c2);
|
|
667
|
+
}, f2 = (g2 = "") => {
|
|
668
|
+
r2 = true, t = OD(), o = g2.replace(/\.+$/, ""), process.stdout.write(`${import_picocolors2.default.gray(a2)}
|
|
669
|
+
`);
|
|
670
|
+
let m2 = 0, w2 = 0;
|
|
671
|
+
p(), i = setInterval(() => {
|
|
672
|
+
const L2 = import_picocolors2.default.magenta(s[m2]), O2 = ".".repeat(Math.floor(w2)).slice(0, 3);
|
|
673
|
+
process.stdout.write(import_sisteransi2.cursor.move(-999, 0)), process.stdout.write(import_sisteransi2.erase.down(1)), process.stdout.write(`${L2} ${o}${O2}`), m2 = m2 + 1 < s.length ? m2 + 1 : 0, w2 = w2 < s.length ? w2 + 0.125 : 0;
|
|
674
|
+
}, n);
|
|
675
|
+
}, x2 = (g2 = "", m2 = 0) => {
|
|
676
|
+
o = g2 ?? o, r2 = false, clearInterval(i);
|
|
677
|
+
const w2 = m2 === 0 ? import_picocolors2.default.green(M2) : m2 === 1 ? import_picocolors2.default.red(P2) : import_picocolors2.default.red(V2);
|
|
678
|
+
process.stdout.write(import_sisteransi2.cursor.move(-999, 0)), process.stdout.write(import_sisteransi2.erase.down(1)), process.stdout.write(`${w2} ${o}
|
|
679
|
+
`), S2(), t();
|
|
680
|
+
};
|
|
681
|
+
return { start: f2, stop: x2, message: (g2 = "") => {
|
|
682
|
+
o = g2 ?? o;
|
|
683
|
+
} };
|
|
684
|
+
};
|
|
685
|
+
function ye() {
|
|
686
|
+
const s = ["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)", "(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");
|
|
687
|
+
return new RegExp(s, "g");
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
// src/utils/process.ts
|
|
691
|
+
import { spawn } from "child_process";
|
|
692
|
+
async function executeCommand(command, args, options = {}) {
|
|
693
|
+
return new Promise((resolve) => {
|
|
694
|
+
const child = spawn(command, args, {
|
|
695
|
+
cwd: options.cwd || process.cwd(),
|
|
696
|
+
env: { ...process.env, ...options.env },
|
|
697
|
+
stdio: "inherit"
|
|
698
|
+
});
|
|
699
|
+
let output = "";
|
|
700
|
+
let errorOutput = "";
|
|
701
|
+
child.on("close", (code) => {
|
|
702
|
+
resolve({
|
|
703
|
+
success: code === 0,
|
|
704
|
+
code,
|
|
705
|
+
output,
|
|
706
|
+
error: errorOutput || undefined
|
|
707
|
+
});
|
|
708
|
+
});
|
|
709
|
+
child.on("error", (error) => {
|
|
710
|
+
resolve({
|
|
711
|
+
success: false,
|
|
712
|
+
code: null,
|
|
713
|
+
output,
|
|
714
|
+
error: error.message
|
|
715
|
+
});
|
|
716
|
+
});
|
|
717
|
+
});
|
|
718
|
+
}
|
|
719
|
+
async function runCreateNextApp(projectName, options = {}) {
|
|
720
|
+
const args = [
|
|
721
|
+
"create-next-app@latest",
|
|
722
|
+
projectName,
|
|
723
|
+
"--ts",
|
|
724
|
+
"--tailwind",
|
|
725
|
+
"--biome",
|
|
726
|
+
"--react-compiler",
|
|
727
|
+
"--app",
|
|
728
|
+
"--use-pnpm",
|
|
729
|
+
"--turbopack",
|
|
730
|
+
"--yes"
|
|
731
|
+
];
|
|
732
|
+
return executeCommand("npx", args, options);
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
// src/generators/nextjs.ts
|
|
736
|
+
async function generateNextJsProject(config) {
|
|
737
|
+
const s = _2();
|
|
738
|
+
s.start(`Creating Next.js project: ${config.projectName}...`);
|
|
739
|
+
try {
|
|
740
|
+
const result = await runCreateNextApp(config.projectName);
|
|
741
|
+
if (result.success) {
|
|
742
|
+
s.stop(`✓ Project created successfully!`);
|
|
743
|
+
return true;
|
|
744
|
+
} else {
|
|
745
|
+
s.stop(`✗ Failed to create project`);
|
|
746
|
+
if (result.error) {
|
|
747
|
+
v2.error(result.error);
|
|
748
|
+
}
|
|
749
|
+
return false;
|
|
750
|
+
}
|
|
751
|
+
} catch (error) {
|
|
752
|
+
s.stop(`✗ Failed to create project`);
|
|
753
|
+
v2.error(error instanceof Error ? error.message : "Unknown error occurred");
|
|
754
|
+
return false;
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
// src/generators/react-query.ts
|
|
759
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
760
|
+
import { join } from "path";
|
|
761
|
+
async function setupReactQuery(config) {
|
|
762
|
+
const s = _2();
|
|
763
|
+
s.start("Setting up @tanstack/react-query...");
|
|
764
|
+
try {
|
|
765
|
+
const projectPath = config.projectPath;
|
|
766
|
+
s.message("Installing @tanstack/react-query...");
|
|
767
|
+
const installResult = await executeCommand("pnpm", ["add", "@tanstack/react-query"], { cwd: projectPath });
|
|
768
|
+
if (!installResult.success) {
|
|
769
|
+
s.stop("✗ Failed to install @tanstack/react-query");
|
|
770
|
+
return false;
|
|
771
|
+
}
|
|
772
|
+
s.message("Creating RootProviders component...");
|
|
773
|
+
const providersDir = join(projectPath, "src", "components", "templates", "RootProviders");
|
|
774
|
+
if (!existsSync(providersDir)) {
|
|
775
|
+
mkdirSync(providersDir, { recursive: true });
|
|
776
|
+
}
|
|
777
|
+
const providersPath = join(providersDir, "RootProviders.component.tsx");
|
|
778
|
+
const providersTemplate = `'use client'
|
|
779
|
+
|
|
780
|
+
// Since QueryClientProvider relies on useContext under the hood, we have to put 'use client' on top
|
|
781
|
+
import {
|
|
782
|
+
isServer,
|
|
783
|
+
QueryClient,
|
|
784
|
+
QueryClientProvider,
|
|
785
|
+
} from '@tanstack/react-query'
|
|
786
|
+
import { useState } from 'react'
|
|
787
|
+
|
|
788
|
+
function makeQueryClient() {
|
|
789
|
+
return new QueryClient({
|
|
790
|
+
defaultOptions: {
|
|
791
|
+
queries: {
|
|
792
|
+
// With SSR, we usually want to set some default staleTime
|
|
793
|
+
// above 0 to avoid refetching immediately on the client
|
|
794
|
+
staleTime: 60 * 1000,
|
|
795
|
+
},
|
|
796
|
+
},
|
|
797
|
+
})
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
let browserQueryClient: QueryClient | undefined = undefined
|
|
801
|
+
|
|
802
|
+
function getQueryClient() {
|
|
803
|
+
if (isServer) {
|
|
804
|
+
// Server: always make a new query client
|
|
805
|
+
return makeQueryClient()
|
|
806
|
+
} else {
|
|
807
|
+
// Browser: make a new query client if we don't already have one
|
|
808
|
+
// This is very important, so we don't re-make a new client if React
|
|
809
|
+
// suspends during the initial render. This may not be needed if we
|
|
810
|
+
// have a suspense boundary BELOW the creation of the query client
|
|
811
|
+
if (!browserQueryClient) browserQueryClient = makeQueryClient()
|
|
812
|
+
return browserQueryClient
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
export default function RootProviders({ children }: { children: React.ReactNode }) {
|
|
817
|
+
// NOTE: Avoid useState when initializing the query client if you don't
|
|
818
|
+
// have a suspense boundary between this and the code that may
|
|
819
|
+
// suspend because React will throw away the client on the initial
|
|
820
|
+
// render if it suspends and there is no boundary
|
|
821
|
+
const queryClient = getQueryClient()
|
|
822
|
+
|
|
823
|
+
return (
|
|
824
|
+
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
|
|
825
|
+
)
|
|
826
|
+
}
|
|
827
|
+
`;
|
|
828
|
+
writeFileSync(providersPath, providersTemplate);
|
|
829
|
+
s.message("Updating root layout...");
|
|
830
|
+
const layoutPath = join(projectPath, "src", "app", "layout.tsx");
|
|
831
|
+
if (existsSync(layoutPath)) {
|
|
832
|
+
let layoutContent = readFileSync(layoutPath, "utf-8");
|
|
833
|
+
const importStatement = `import RootProviders from "@/components/templates/RootProviders/RootProviders.component";
|
|
834
|
+
`;
|
|
835
|
+
if (!layoutContent.includes("RootProviders")) {
|
|
836
|
+
const importRegex = /(import.*from.*;\n)+/;
|
|
837
|
+
layoutContent = layoutContent.replace(importRegex, (match) => match + importStatement);
|
|
838
|
+
layoutContent = layoutContent.replace(/(<body[^>]*>)([\s\S]*?)(<\/body>)/, (match, openTag, content, closeTag) => {
|
|
839
|
+
if (content.includes("<RootProviders>")) {
|
|
840
|
+
return match;
|
|
841
|
+
}
|
|
842
|
+
return `${openTag}
|
|
843
|
+
<RootProviders>${content}</RootProviders>
|
|
844
|
+
${closeTag}`;
|
|
845
|
+
});
|
|
846
|
+
writeFileSync(layoutPath, layoutContent);
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
s.stop("✓ React Query setup complete!");
|
|
850
|
+
return true;
|
|
851
|
+
} catch (error) {
|
|
852
|
+
s.stop("✗ Failed to set up React Query");
|
|
853
|
+
v2.error(error instanceof Error ? error.message : "Unknown error occurred");
|
|
854
|
+
return false;
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
// src/generators/resend.ts
|
|
859
|
+
async function setupResend(config) {
|
|
860
|
+
const s = _2();
|
|
861
|
+
s.start("Setting up Resend...");
|
|
862
|
+
try {
|
|
863
|
+
const projectPath = config.projectPath;
|
|
864
|
+
s.message("Installing resend package...");
|
|
865
|
+
const result = await executeCommand("pnpm", ["add", "resend"], { cwd: projectPath });
|
|
866
|
+
if (result.success) {
|
|
867
|
+
s.stop("✓ Resend setup complete!");
|
|
868
|
+
return true;
|
|
869
|
+
} else {
|
|
870
|
+
s.stop("✗ Failed to install Resend");
|
|
871
|
+
if (result.error) {
|
|
872
|
+
v2.error(result.error);
|
|
873
|
+
}
|
|
874
|
+
return false;
|
|
875
|
+
}
|
|
876
|
+
} catch (error) {
|
|
877
|
+
s.stop("✗ Failed to set up Resend");
|
|
878
|
+
v2.error(error instanceof Error ? error.message : "Unknown error occurred");
|
|
879
|
+
return false;
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
// src/generators/shadcn.ts
|
|
884
|
+
async function setupShadcn(config) {
|
|
885
|
+
const s = _2();
|
|
886
|
+
s.start("Setting up shadcn/ui...");
|
|
887
|
+
try {
|
|
888
|
+
const projectPath = config.projectPath;
|
|
889
|
+
s.message("Running shadcn init...");
|
|
890
|
+
const result = await executeCommand("pnpm", ["dlx", "shadcn@latest", "init", "-y"], { cwd: projectPath });
|
|
891
|
+
if (result.success) {
|
|
892
|
+
s.stop("✓ shadcn/ui setup complete!");
|
|
893
|
+
return true;
|
|
894
|
+
} else {
|
|
895
|
+
s.stop("✗ Failed to set up shadcn/ui");
|
|
896
|
+
if (result.error) {
|
|
897
|
+
v2.error(result.error);
|
|
898
|
+
}
|
|
899
|
+
return false;
|
|
900
|
+
}
|
|
901
|
+
} catch (error) {
|
|
902
|
+
s.stop("✗ Failed to set up shadcn/ui");
|
|
903
|
+
v2.error(error instanceof Error ? error.message : "Unknown error occurred");
|
|
904
|
+
return false;
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
// src/utils/file-system.ts
|
|
909
|
+
import { join as join2, resolve } from "path";
|
|
910
|
+
function resolvePath(path) {
|
|
911
|
+
return resolve(process.cwd(), path);
|
|
912
|
+
}
|
|
913
|
+
function getProjectPath(projectName, targetDir) {
|
|
914
|
+
if (targetDir) {
|
|
915
|
+
return resolvePath(join2(targetDir, projectName));
|
|
916
|
+
}
|
|
917
|
+
return resolvePath(projectName);
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
// src/utils/validators.ts
|
|
921
|
+
import { existsSync as existsSync2 } from "fs";
|
|
922
|
+
function isValidProjectName(name) {
|
|
923
|
+
const validNameRegex = /^(?![@._])[a-z0-9-_]+$/;
|
|
924
|
+
if (!name || name.length === 0) {
|
|
925
|
+
return false;
|
|
926
|
+
}
|
|
927
|
+
if (name.length > 214) {
|
|
928
|
+
return false;
|
|
929
|
+
}
|
|
930
|
+
return validNameRegex.test(name);
|
|
931
|
+
}
|
|
932
|
+
function getProjectNameValidationMessage(name) {
|
|
933
|
+
if (!name || name.length === 0) {
|
|
934
|
+
return "Project name cannot be empty";
|
|
935
|
+
}
|
|
936
|
+
if (name.length > 214) {
|
|
937
|
+
return "Project name must be 214 characters or less";
|
|
938
|
+
}
|
|
939
|
+
if (name.startsWith(".") || name.startsWith("_")) {
|
|
940
|
+
return "Project name cannot start with . or _";
|
|
941
|
+
}
|
|
942
|
+
if (!/^[a-z0-9-_]+$/.test(name)) {
|
|
943
|
+
return "Project name can only contain lowercase letters, numbers, hyphens, and underscores";
|
|
944
|
+
}
|
|
945
|
+
return "Invalid project name";
|
|
946
|
+
}
|
|
947
|
+
function directoryExists(path) {
|
|
948
|
+
return existsSync2(path);
|
|
949
|
+
}
|
|
950
|
+
|
|
951
|
+
// src/prompts.ts
|
|
952
|
+
async function promptForProjectConfig() {
|
|
953
|
+
console.log("");
|
|
954
|
+
pe("\uD83D\uDE80 Create ESA Stack");
|
|
955
|
+
const projectName = await ae({
|
|
956
|
+
message: "What is your project name?",
|
|
957
|
+
placeholder: "my-awesome-app",
|
|
958
|
+
validate: (value) => {
|
|
959
|
+
if (!isValidProjectName(value)) {
|
|
960
|
+
return getProjectNameValidationMessage(value);
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
});
|
|
964
|
+
if (lD(projectName)) {
|
|
965
|
+
he("Operation cancelled");
|
|
966
|
+
return null;
|
|
967
|
+
}
|
|
968
|
+
const projectPath = getProjectPath(projectName);
|
|
969
|
+
if (directoryExists(projectPath)) {
|
|
970
|
+
const shouldContinue = await ce({
|
|
971
|
+
message: `Directory "${projectName}" already exists. Continue anyway?`,
|
|
972
|
+
initialValue: false
|
|
973
|
+
});
|
|
974
|
+
if (lD(shouldContinue) || !shouldContinue) {
|
|
975
|
+
he("Operation cancelled");
|
|
976
|
+
return null;
|
|
977
|
+
}
|
|
978
|
+
}
|
|
979
|
+
console.log("");
|
|
980
|
+
me("Select optional integrations to add to your project", "Optional Integrations");
|
|
981
|
+
const reactQuery = await ce({
|
|
982
|
+
message: "Add @tanstack/react-query for data fetching?",
|
|
983
|
+
initialValue: true
|
|
984
|
+
});
|
|
985
|
+
if (lD(reactQuery)) {
|
|
986
|
+
he("Operation cancelled");
|
|
987
|
+
return null;
|
|
988
|
+
}
|
|
989
|
+
const shadcn = await ce({
|
|
990
|
+
message: "Add shadcn/ui component library?",
|
|
991
|
+
initialValue: true
|
|
992
|
+
});
|
|
993
|
+
if (lD(shadcn)) {
|
|
994
|
+
he("Operation cancelled");
|
|
995
|
+
return null;
|
|
996
|
+
}
|
|
997
|
+
const resend = await ce({
|
|
998
|
+
message: "Add Resend for email API?",
|
|
999
|
+
initialValue: false
|
|
1000
|
+
});
|
|
1001
|
+
if (lD(resend)) {
|
|
1002
|
+
he("Operation cancelled");
|
|
1003
|
+
return null;
|
|
1004
|
+
}
|
|
1005
|
+
const integrations = {
|
|
1006
|
+
reactQuery,
|
|
1007
|
+
shadcn,
|
|
1008
|
+
resend
|
|
1009
|
+
};
|
|
1010
|
+
const s = _2();
|
|
1011
|
+
s.start("Preparing to create your project...");
|
|
1012
|
+
await new Promise((resolve2) => setTimeout(resolve2, 500));
|
|
1013
|
+
s.stop("Configuration ready!");
|
|
1014
|
+
const integrationsText = [
|
|
1015
|
+
integrations.reactQuery && " ✓ @tanstack/react-query",
|
|
1016
|
+
integrations.shadcn && " ✓ shadcn/ui",
|
|
1017
|
+
integrations.resend && " ✓ resend"
|
|
1018
|
+
].filter(Boolean).join(`
|
|
1019
|
+
`);
|
|
1020
|
+
console.log("");
|
|
1021
|
+
me(`Project: ${projectName}
|
|
1022
|
+
Path: ${projectPath}
|
|
1023
|
+
|
|
1024
|
+
Default Tech Stack:
|
|
1025
|
+
✓ Next.js (App Router)
|
|
1026
|
+
✓ TypeScript
|
|
1027
|
+
✓ Tailwind CSS
|
|
1028
|
+
✓ Biome.js
|
|
1029
|
+
✓ React Compiler
|
|
1030
|
+
✓ Turbopack
|
|
1031
|
+
✓ pnpm${integrationsText ? `
|
|
1032
|
+
|
|
1033
|
+
Optional Integrations:
|
|
1034
|
+
${integrationsText}` : ""}`, "Configuration");
|
|
1035
|
+
const shouldProceed = await ce({
|
|
1036
|
+
message: "Create project with this configuration?",
|
|
1037
|
+
initialValue: true
|
|
1038
|
+
});
|
|
1039
|
+
if (lD(shouldProceed) || !shouldProceed) {
|
|
1040
|
+
he("Operation cancelled");
|
|
1041
|
+
return null;
|
|
1042
|
+
}
|
|
1043
|
+
return {
|
|
1044
|
+
projectName,
|
|
1045
|
+
projectPath,
|
|
1046
|
+
integrations
|
|
1047
|
+
};
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
// src/cli.ts
|
|
1051
|
+
async function main() {
|
|
1052
|
+
try {
|
|
1053
|
+
const config = await promptForProjectConfig();
|
|
1054
|
+
if (!config) {
|
|
1055
|
+
process.exit(0);
|
|
1056
|
+
}
|
|
1057
|
+
const success = await generateNextJsProject(config);
|
|
1058
|
+
if (!success) {
|
|
1059
|
+
ge("❌ Project creation failed");
|
|
1060
|
+
process.exit(1);
|
|
1061
|
+
}
|
|
1062
|
+
if (config.integrations.reactQuery) {
|
|
1063
|
+
const reactQuerySuccess = await setupReactQuery(config);
|
|
1064
|
+
if (!reactQuerySuccess) {
|
|
1065
|
+
v2.warn("React Query setup failed, but project was created successfully");
|
|
1066
|
+
}
|
|
1067
|
+
}
|
|
1068
|
+
if (config.integrations.shadcn) {
|
|
1069
|
+
const shadcnSuccess = await setupShadcn(config);
|
|
1070
|
+
if (!shadcnSuccess) {
|
|
1071
|
+
v2.warn("shadcn/ui setup failed, but project was created successfully");
|
|
1072
|
+
}
|
|
1073
|
+
}
|
|
1074
|
+
if (config.integrations.resend) {
|
|
1075
|
+
const resendSuccess = await setupResend(config);
|
|
1076
|
+
if (!resendSuccess) {
|
|
1077
|
+
v2.warn("Resend setup failed, but project was created successfully");
|
|
1078
|
+
}
|
|
1079
|
+
}
|
|
1080
|
+
console.log("");
|
|
1081
|
+
ge("\uD83C\uDF89 Project created successfully!");
|
|
1082
|
+
const nextSteps = [
|
|
1083
|
+
`cd ${config.projectName}`,
|
|
1084
|
+
config.integrations.reactQuery ? "# React Query is ready to use!" : "",
|
|
1085
|
+
"pnpm dev"
|
|
1086
|
+
].filter(Boolean).join(`
|
|
1087
|
+
`);
|
|
1088
|
+
console.log("");
|
|
1089
|
+
me(nextSteps, "Next steps");
|
|
1090
|
+
process.exit(0);
|
|
1091
|
+
} catch (error) {
|
|
1092
|
+
v2.error(error instanceof Error ? error.message : "An unexpected error occurred");
|
|
1093
|
+
process.exit(1);
|
|
1094
|
+
}
|
|
1095
|
+
}
|
|
1096
|
+
main();
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "create-esa-stack",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI tool to scaffold Next.js projects with ESA's preferred tech stack",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"create-esa-stack": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "bun build ./src/cli.ts --outdir ./dist --target node --format esm",
|
|
11
|
+
"dev": "bun run ./src/cli.ts",
|
|
12
|
+
"prepublishOnly": "bun run build"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"nextjs",
|
|
16
|
+
"next",
|
|
17
|
+
"react",
|
|
18
|
+
"cli",
|
|
19
|
+
"scaffold",
|
|
20
|
+
"create",
|
|
21
|
+
"generator",
|
|
22
|
+
"typescript",
|
|
23
|
+
"tailwind",
|
|
24
|
+
"tailwindcss",
|
|
25
|
+
"biome",
|
|
26
|
+
"turbopack",
|
|
27
|
+
"react-compiler",
|
|
28
|
+
"pnpm",
|
|
29
|
+
"shadcn",
|
|
30
|
+
"tanstack-query"
|
|
31
|
+
],
|
|
32
|
+
"author": "ESA Stack",
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "https://github.com/esa-stack/create-esa-stack"
|
|
37
|
+
},
|
|
38
|
+
"homepage": "https://github.com/esa-stack/create-esa-stack#readme",
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/esa-stack/create-esa-stack/issues"
|
|
41
|
+
},
|
|
42
|
+
"files": [
|
|
43
|
+
"dist",
|
|
44
|
+
"README.md",
|
|
45
|
+
"LICENSE",
|
|
46
|
+
"CHANGELOG.md"
|
|
47
|
+
],
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"@clack/prompts": "^0.8.2"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@types/bun": "latest"
|
|
53
|
+
},
|
|
54
|
+
"engines": {
|
|
55
|
+
"node": ">=18.0.0"
|
|
56
|
+
}
|
|
57
|
+
}
|