create-a-pkg 1.0.7 → 1.2.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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  # MIT License
2
2
 
3
- Copyright (c) <2024> <earthnut.dev>
3
+ Copyright ©️ <2024> <Mr.MudBean>
4
4
 
5
5
  Permission to use, copy, modify, and/or distribute this software for any
6
6
  purpose with or without fee is hereby granted, provided that the above
@@ -16,7 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16
16
 
17
17
  # MIT 许可证
18
18
 
19
- 版权所有 (c) [2024] [花生亻]
19
+ 版权所有 ©️ [2024] [泥豆君]
20
20
 
21
21
  特此免费授予任何获得本软件及相关文档文件(以下简称“软件”)副本的人不受限制地处置该软件的权利,包括不受限制地使用、复制、修改、合并、发布、分发、再许可和/或出售该软件副本的权利,并允许向其提供该软件的人这样做,但须遵守以下条件:
22
22
 
package/README.md CHANGED
@@ -1,6 +1,9 @@
1
1
  # 构建简单的 npm 库
2
2
 
3
- [![version](<https://img.shields.io/npm/v/create-a-npm.svg?logo=npm&logoColor=rgb(0,0,0)&label=版本号&labelColor=rgb(73,73,228)&color=rgb(0,0,0)>)](https://www.npmjs.com/package/create-a-npm) [![issues 提交](<https://img.shields.io/badge/issues-提交-rgb(255,0,63)?logo=github>)](https://github.com/earthnutDev/create-a-npm/issues)
3
+ [![version](<https://img.shields.io/npm/v/create-a-npm.svg?logo=npm&logoColor=rgb(0,0,0)&label=版本号&labelColor=rgb(73,73,228)&color=rgb(0,0,0)>)](https://www.npmjs.com/package/create-a-npm) [![issues 提交](<https://img.shields.io/badge/issues-提交-rgb(255,0,63)?logo=github>)](https://github.com/MrMudBead/create-a-npm/issues)
4
+
5
+ > [info]
6
+ > 广告时间到,推荐 [vscode 插件](https://marketplace.visualstudio.com/items?itemName=MrMudBean.auto-last-modified) 自动添加文件头部注释
4
7
 
5
8
  ## 安装
6
9
 
@@ -0,0 +1,226 @@
1
+ THIRD-PARTY LICENSE
2
+ ==================================================
3
+
4
+ a-type-of-js (2.0.0)
5
+ ------------------------------
6
+ # MIT License
7
+
8
+ Copyright (c) <2025> <Mr.MudBean>
9
+
10
+ Permission to use, copy, modify, and/or distribute this software for any
11
+ purpose with or without fee is hereby granted, provided that the above
12
+ copyright notice and this permission notice appear in all copies.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
15
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
16
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
17
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
18
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
19
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
20
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21
+
22
+ # MIT 许可证
23
+
24
+ 版权所有 (c) [2025] [花生亻]
25
+
26
+ 特此免费授予任何获得本软件及相关文档文件(以下简称“软件”)副本的人不受限制地处置该软件的权利,包括不受限制地使用、复制、修改、合并、发布、分发、再许可和/或出售该软件副本的权利,并允许向其提供该软件的人这样做,但须遵守以下条件:
27
+
28
+ 上述版权声明和本许可声明应包含在所有副本或软件的重要部分中。
29
+
30
+ 软件按“原样”提供,不附带任何形式的明示或暗示的保证,包括但不限于适销性、特定用途适用性和不侵权的保证。在任何情况下,作者或版权持有人均不对因合同、侵权或其他方式引起的任何索赔、损害或其他责任负责,无论是在与软件或软件的使用或其他交易有关的任何诉讼中。
31
+
32
+ a-node-tools (4.4.2)
33
+ ------------------------------
34
+ # MIT License
35
+
36
+ Copyright (c) <2024> <Mr.MudBean>
37
+
38
+ Permission to use, copy, modify, and/or distribute this software for any
39
+ purpose with or without fee is hereby granted, provided that the above
40
+ copyright notice and this permission notice appear in all copies.
41
+
42
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
43
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
44
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
45
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
46
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
47
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
48
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
49
+
50
+ # MIT 许可证
51
+
52
+ 版权所有 (c) [2024] [泥豆君]
53
+
54
+ 特此免费授予任何获得本软件及相关文档文件(以下简称“软件”)副本的人不受限制地处置该软件的权利,包括不受限制地使用、复制、修改、合并、发布、分发、再许可和/或出售该软件副本的权利,并允许向其提供该软件的人这样做,但须遵守以下条件:
55
+
56
+ 上述版权声明和本许可声明应包含在所有副本或软件的重要部分中。
57
+
58
+ 软件按“原样”提供,不附带任何形式的明示或暗示的保证,包括但不限于适销性、特定用途适用性和不侵权的保证。在任何情况下,作者或版权持有人均不对因合同、侵权或其他方式引起的任何索赔、损害或其他责任负责,无论是在与软件或软件的使用或其他交易有关的任何诉讼中。
59
+
60
+ @color-pen/static (1.1.1)
61
+ ------------------------------
62
+ # MIT License
63
+
64
+ Copyright (c) <2025> <Mr.MudBean>
65
+
66
+ Permission to use, copy, modify, and/or distribute this software for any
67
+ purpose with or without fee is hereby granted, provided that the above
68
+ copyright notice and this permission notice appear in all copies.
69
+
70
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
71
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
72
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
73
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
74
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
75
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
76
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
77
+
78
+ # MIT 许可证
79
+
80
+ 版权所有 (c) [2025] [泥豆君]
81
+
82
+ 特此免费授予任何获得本软件及相关文档文件(以下简称“软件”)副本的人不受限制地处置该软件的权利,包括不受限制地使用、复制、修改、合并、发布、分发、再许可和/或出售该软件副本的权利,并允许向其提供该软件的人这样做,但须遵守以下条件:
83
+
84
+ 上述版权声明和本许可声明应包含在所有副本或软件的重要部分中。
85
+
86
+ 软件按“原样”提供,不附带任何形式的明示或暗示的保证,包括但不限于适销性、特定用途适用性和不侵权的保证。在任何情况下,作者或版权持有人均不对因合同、侵权或其他方式引起的任何索赔、损害或其他责任负责,无论是在与软件或软件的使用或其他交易有关的任何诉讼中。
87
+
88
+ a-js-tools (2.0.1)
89
+ ------------------------------
90
+ # MIT License
91
+
92
+ Copyright (c) <2024> <Mr.MudBean>
93
+
94
+ Permission to use, copy, modify, and/or distribute this software for any
95
+ purpose with or without fee is hereby granted, provided that the above
96
+ copyright notice and this permission notice appear in all copies.
97
+
98
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
99
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
100
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
101
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
102
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
103
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
104
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
105
+
106
+ # MIT 许可证
107
+
108
+ 版权所有 (c) [2024] [泥豆君]
109
+
110
+ 特此免费授予任何获得本软件及相关文档文件(以下简称“软件”)副本的人不受限制地处置该软件的权利,包括不受限制地使用、复制、修改、合并、发布、分发、再许可和/或出售该软件副本的权利,并允许向其提供该软件的人这样做,但须遵守以下条件:
111
+
112
+ 上述版权声明和本许可声明应包含在所有副本或软件的重要部分中。
113
+
114
+ 软件按“原样”提供,不附带任何形式的明示或暗示的保证,包括但不限于适销性、特定用途适用性和不侵权的保证。在任何情况下,作者或版权持有人均不对因合同、侵权或其他方式引起的任何索赔、损害或其他责任负责,无论是在与软件或软件的使用或其他交易有关的任何诉讼中。
115
+
116
+ color-pen (3.0.0)
117
+ ------------------------------
118
+ # MIT License
119
+
120
+ Copyright (c) <2025> <Mr.MudBean>
121
+
122
+ Permission to use, copy, modify, and/or distribute this software for any
123
+ purpose with or without fee is hereby granted, provided that the above
124
+ copyright notice and this permission notice appear in all copies.
125
+
126
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
127
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
128
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
129
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
130
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
131
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
132
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
133
+
134
+ # MIT 许可证
135
+
136
+ 版权所有 (c) [2025] [泥豆君]
137
+
138
+ 特此免费授予任何获得本软件及相关文档文件(以下简称“软件”)副本的人不受限制地处置该软件的权利,包括不受限制地使用、复制、修改、合并、发布、分发、再许可和/或出售该软件副本的权利,并允许向其提供该软件的人这样做,但须遵守以下条件:
139
+
140
+ 上述版权声明和本许可声明应包含在所有副本或软件的重要部分中。
141
+
142
+ 软件按“原样”提供,不附带任何形式的明示或暗示的保证,包括但不限于适销性、特定用途适用性和不侵权的保证。在任何情况下,作者或版权持有人均不对因合同、侵权或其他方式引起的任何索赔、损害或其他责任负责,无论是在与软件或软件的使用或其他交易有关的任何诉讼中。
143
+
144
+ @qqi/log (1.1.3)
145
+ ------------------------------
146
+ # MIT License
147
+
148
+ Copyright (c) <2025> <Mr.MudBean>
149
+
150
+ Permission to use, copy, modify, and/or distribute this software for any
151
+ purpose with or without fee is hereby granted, provided that the above
152
+ copyright notice and this permission notice appear in all copies.
153
+
154
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
155
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
156
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
157
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
158
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
159
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
160
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
161
+
162
+ # MIT 许可证
163
+
164
+ 版权所有 (c) [2025] [泥豆君]
165
+
166
+ 特此免费授予任何获得本软件及相关文档文件(以下简称“软件”)副本的人不受限制地处置该软件的权利,包括不受限制地使用、复制、修改、合并、发布、分发、再许可和/或出售该软件副本的权利,并允许向其提供该软件的人这样做,但须遵守以下条件:
167
+
168
+ 上述版权声明和本许可声明应包含在所有副本或软件的重要部分中。
169
+
170
+ 软件按“原样”提供,不附带任何形式的明示或暗示的保证,包括但不限于适销性、特定用途适用性和不侵权的保证。在任何情况下,作者或版权持有人均不对因合同、侵权或其他方式引起的任何索赔、损害或其他责任负责,无论是在与软件或软件的使用或其他交易有关的任何诉讼中。
171
+
172
+ a-command (3.0.1)
173
+ ------------------------------
174
+ # MIT License
175
+
176
+ Copyright (c) <2024> <MrMudBean>
177
+
178
+ Permission to use, copy, modify, and/or distribute this software for any
179
+ purpose with or without fee is hereby granted, provided that the above
180
+ copyright notice and this permission notice appear in all copies.
181
+
182
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
183
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
184
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
185
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
186
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
187
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
188
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
189
+
190
+ # MIT 许可证
191
+
192
+ 版权所有 (c) [2024] [泥豆君]
193
+
194
+ 特此免费授予任何获得本软件及相关文档文件(以下简称“软件”)副本的人不受限制地处置该软件的权利,包括不受限制地使用、复制、修改、合并、发布、分发、再许可和/或出售该软件副本的权利,并允许向其提供该软件的人这样做,但须遵守以下条件:
195
+
196
+ 上述版权声明和本许可声明应包含在所有副本或软件的重要部分中。
197
+
198
+ 软件按“原样”提供,不附带任何形式的明示或暗示的保证,包括但不限于适销性、特定用途适用性和不侵权的保证。在任何情况下,作者或版权持有人均不对因合同、侵权或其他方式引起的任何索赔、损害或其他责任负责,无论是在与软件或软件的使用或其他交易有关的任何诉讼中。
199
+
200
+ qqi (1.0.0)
201
+ ------------------------------
202
+ # MIT License
203
+
204
+ Copyright (c) <2025> <Mr.MudBean>
205
+
206
+ Permission to use, copy, modify, and/or distribute this software for any
207
+ purpose with or without fee is hereby granted, provided that the above
208
+ copyright notice and this permission notice appear in all copies.
209
+
210
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
211
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
212
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
213
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
214
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
215
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
216
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
217
+
218
+ # MIT 许可证
219
+
220
+ 版权所有 (c) [2025] [泥豆君]
221
+
222
+ 特此免费授予任何获得本软件及相关文档文件(以下简称“软件”)副本的人不受限制地处置该软件的权利,包括不受限制地使用、复制、修改、合并、发布、分发、再许可和/或出售该软件副本的权利,并允许向其提供该软件的人这样做,但须遵守以下条件:
223
+
224
+ 上述版权声明和本许可声明应包含在所有副本或软件的重要部分中。
225
+
226
+ 软件按“原样”提供,不附带任何形式的明示或暗示的保证,包括但不限于适销性、特定用途适用性和不侵权的保证。在任何情况下,作者或版权持有人均不对因合同、侵权或其他方式引起的任何索赔、损害或其他责任负责,无论是在与软件或软件的使用或其他交易有关的任何诉讼中。
package/bin.js ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import{statSync as e,readFileSync as n,readdirSync as t,writeFileSync as r,mkdirSync as i,unlinkSync as s}from"node:fs";import{dirname as o,normalize as a,join as c,resolve as l}from"node:path";import{arch as u,homedir as p,userInfo as d}from"node:os";import"node:fs/promises";import{fileURLToPath as f}from"node:url";import{emitKeypressEvents as h}from"node:readline";import{spawn as m}from"node:child_process";import g from"node:https";import{resolve as b}from"node:path/posix";function $(e){const n=typeof e;if("object"!==n&&"function"!==n)return n;const t=Reflect.apply(Object.prototype.toString,e,[]).replace(/^.*\s(.*)]$/,"$1").toLowerCase();return"error"!==t?t:e instanceof SyntaxError?"syntaxerror":e instanceof TypeError?"typeerror":e instanceof URIError?"urierror":e instanceof ReferenceError?"referenceerror":e instanceof AggregateError?"aggregateerror":e instanceof RangeError?"rangeerror":e instanceof EvalError?"evalerror":"error"}function w(e){return"string"===$(e)}function y(e){return"regexp"===$(e)}function v(e){return w(e)&&""===e.valueOf()}function E(e){return w(e)&&""===e.valueOf().trim()}function x(e){return"number"===$(e)}function C(e){return Number.isNaN(e)}function k(e){return 0===e}function I(e){return"boolean"===$(e)}function _(e){return!0===e}function A(e){return!1===e}function T(e){return null===e}function S(e){return void 0===e}function O(e){return"function"===$(e)}function R(e){return Array.isArray(e)}function N(e){if(R(e))return 0===e.length;throw new TypeError("参数必须为数组")}function j(e){return"object"===$(e)}function P(e){return j(e)&&0===Reflect.ownKeys(e).length}function D(e){return"symbol"===$(e)}function G(e,n){return void 0===n||("function"==typeof n?n(e):n)}function L(n){return e(n,{throwIfNoEntry:!1})}const F="",M=`${F}[`;function H(){return new RegExp(`(\\x1b\\[(${["([1-4]?[0-9])(;([1-4]?[0-9]+))*m","[m]","\\?(25|7)[hl]","\\d*;?\\d*[HFr]","6n","\\d{0,4}[A-DTS]","[0-3]?[JKg]","[0-6]?W"].map(e=>`(${e})`).join("|")}))`.concat("|(\\x1b[78DMc])"),"g")}const U=`${M}0m`;function B(e){return e.prototype.apply=Function.apply,e.prototype.bind=Function.bind,e.prototype.call=Function.call,e.prototype.length=Function.length,e.prototype.name=Function.name,e.prototype.toString=Function.toString,e}function K(e,n){return Object.keys(n).forEach(t=>e[t]=n[t]),e}function W(e=1,n=0){if(!isFinite(e)||!isFinite(n)||C(e)||C(n)||!x(e)||!x(n))throw new TypeError("getRandomInt: max or min is NaN or is not a number");let t=Math.ceil(Number(n)),r=Math.floor(Number(e));return r===t?r:(t>r&&([r,t]=[t,r]),Math.round(Math.random()*(r-t)+t))}function J(e){if(!j(e)&&!x(e)||x(e)&&C(e)||x(e)&&!isFinite(e)||x(e)&&!Number.isInteger(e)||x(e)&&Number.isInteger(e)&&e<1||x(e)&&e<1||j(e)&&(!x(e.length)||e.length<1||!Number.isInteger(e.length)))throw new TypeError("参数类型错误 ❌ (getRandomString)");const n={length:32,chars:"abcdefghijklmnopqrstuvwxyz",chars2:"0123456789",chars3:"!@#$%^&*()_+~`|}{[]:;?><,./-=",type:"string",includeUppercaseLetters:!1,includeNumbers:!1,includeSpecial:!1};if("uuid"===n.type)return crypto.randomUUID();x(e)&&Number.isInteger(e)&&e>0&&K(n,{length:e}),j(e)&&(K(n,e),n.length=n.length<1?32:n.length);const t=n.chars.split("");n.includeUppercaseLetters&&o(t,n.chars.toUpperCase()),n.includeNumbers&&o(t,n.chars2),n.includeSpecial&&o(t,n.chars3);let r="";const i=t.join(""),s=i.length;if(globalThis&&globalThis.crypto&&globalThis.crypto.getRandomValues){globalThis.crypto.getRandomValues(new Uint8Array(n.length)).forEach(e=>r+=i[e%s])}else for(let e=0;e<n.length;e++)r+=i[W(s-1)];function o(e,n){const t=e.length,r=n.length,i=Math.max(t,r);for(let s=0;s<i;s++)s<t&&!S(n[s])?e[s]+=n[s]:s<r&&(e[s]=n[s])}if(!/[a-zA-Z]/.test(r))return String.fromCharCode(W(97,122)).concat(r.slice(1));for(;!/^[a-zA-Z]$/.test(r[0]);)r=r.slice(1)+r[0];return r}function q(e,n=200){if(!O(e))throw new TypeError("callback must be a function");let t;x(n)&&(n={delay:n,this:null}),(S(n.delay)||!isFinite(n.delay)||n.delay<0)&&(n.delay=200);const r=()=>{t&&(clearTimeout(t),t=void 0)},i=(...i)=>{r(),t=setTimeout(()=>{try{const t=n&&n.this?n.this:null;e.apply(t,i)}catch(e){console.log("Debounce callback throw an error",e)}},Math.max(n.delay||5,5))};return i.cancel=()=>r(),i}function Y(){return!S(globalThis&&globalThis.process&&globalThis.process.versions&&globalThis.process.versions.node||void 0)}function V(e,n){if(!R(e)||!R(n))throw new TypeError("参数需为数组");if(N(e)||N(n))return e;const t=new Set(n);return e.filter(e=>!t.has(e))}const z={union:function(...e){if(N(e))return[];if(e.some(e=>!R(e)))throw new TypeError("参数必须都是数组形式的元素");if(1===e.length)return[...e[0]];const n=new Set;for(const t of e)for(const e of t)n.add(e);return Array.from(n)},intersection:function(e,n){if(!R(e)||!R(n))throw new TypeError("参数必须是数组类型数据");if(N(e)||N(n))return[];const[t,r]=e.length<=n.length?[e,n]:[n,e],i=new Set(t);return r.filter(e=>i.has(e))},difference:V,symmetricDifference:function(e,n){if(!R(e)||!R(n))throw new TypeError("参数必须是数组");return N(e)?[...n]:N(n)?[...e]:[...V(e,n),...V(n,e)]}};async function X(e=1e3){if(!isFinite(e)||e<0)throw new TypeError("delay 应该是一个正常的数值");return k(e)?Promise.resolve():new Promise(n=>setTimeout(n,e))}function Z(e,n=!0){if(_(n)){if(!w(e))throw new TypeError("`color` must be a string or number but not number[] when isHex is true");if(e.startsWith("0x"))e=e.replace(/0x/,"#");else if(!e.startsWith("#"))throw new TypeError("`color` must be a string or number but not number[] when isHex is true")}else{if(!A(n))throw new TypeError("The second variable `isHex` must be boolean");if(R(e)){if(e.some(e=>!isFinite(e))||3!==e.length)throw new TypeError("If the `color` is an array, it must be 3 in length and be of numeric type");e=`rgb(${e.join(",")})`}else{if(x(e))throw new TypeError("If the `color` is not number when isHex is false");if(w(e)){if(!e.startsWith("rgb(")||!e.endsWith(")"))throw new TypeError("If the `color` is a string, it must be rgb(r, g, b)");{const n=e.replace(/.*\((.*)\).*/,"$1").split(",");if(3!==n.length||n.some(e=>!isFinite(Number(e))||Number(e)<0||Number(e)>255))throw new TypeError("If the `color` is a string, it must be rgb(r, g, b)")}}}}let t=0,r=0,i=0;if(e.startsWith("#"))if(6==(e=e.slice(1)).length)t=Q(parseInt(e.slice(0,2),16)),r=Q(parseInt(e.slice(2,4),16)),i=Q(parseInt(e.slice(4,6),16));else{if(3!=e.length)return W(255);t=Q(parseInt(e.slice(0,1).repeat(2),16)),r=Q(parseInt(e.slice(1,2).repeat(2),16)),i=Q(parseInt(e.slice(2,3).repeat(2),16))}else if(e.startsWith("rgb")){const n=e.replace(/.*\((.*)\).*/,"$1").split(",");t=Q(Number(n[0])),r=Q(Number(n[1])),i=Q(Number(n[2]))}return 16+36*t+6*r+i}function Q(e){const n=isFinite(e)?Math.floor(6*e/256):W(6);return Math.min(5,Math.max(0,n))}function ee(e,n,t,r=!0){const i=r?"38":"48";if(x(e)&&x(n)&&x(t))return`${i};5;${Z([e,n,t],!1)}`;if(w(e)&&S(n)&&S(t)){if(e.startsWith("rgb"))return`${i};5;${Z(e,!1)}`;if(e.startsWith("#")||e.startsWith("0x"))return`${i};5;${Z(e,!0)}`;ne()}else{if(x(e)&&S(n)&&S(t))return`${i};5;${Z(e,!0)}`;ne()}}function ne(){throw new TypeError(' 使用 color() 或 bgColor() 时,可使用三整数 `r , g , b` 或单字符串 `"rgb(r , g, b)"` 或十六进制数值 `0xrgb`、`0xrrggbb` 或十六进制字符串表达 `"#rgb"`、`"#rrggbb"` ,不接受其他格式的参数')}function te(e,n,t,r=!0){try{return ee(e,n,t,r)}catch(e){throw console.error(e),new TypeError('使用 rgb() 或 bgRgb() 时,参数可以为单字符串 `"rgb(r, g, b)"` 或三个数值 `r , g ,b`。不接受其他格式')}}function re(e,n=!0){try{return ee(e,void 0,void 0,n)}catch(e){throw console.error(e),new TypeError('使用 hex() 或 bgHex() 时,参数可以为单字符串 `"0xnnnnnn"`、`"#rgb"` 、`"#rrggbb"` 或一个数值 `0xrrggbb`。不接受其他格式')}}function ie(e,n=!1){return e<0&&(e=0),e>255&&(e=255),e=isFinite(e)?Math.round(e):W(255),`${[48,38][Number(n)]};5;${e}`}const se={black:"38;5;0",red:"38;5;1",green:"38;5;2",yellow:"38;5;3",blue:"38;5;4",magenta:"38;5;5",cyan:"38;5;6",white:"38;5;7",brightBlack:"38;5;8",brightRed:"38;5;9",brightGreen:"38;5;10",brightYellow:"38;5;11",brightBlue:"38;5;12",brightMagenta:"38;5;13",brightCyan:"38;5;14",brightWhite:"38;5;15",bgBlack:"48;5;0",bgRed:"48;5;1",bgGreen:"48;5;2",bgYellow:"48;5;3",bgBlue:"48;5;4",bgMagenta:"48;5;5",bgCyan:"48;5;6",bgWhite:"48;5;7",bgBrightBlack:"48;5;8",bgBrightRed:"48;5;9",bgBrightGreen:"48;5;10",bgBrightYellow:"48;5;11",bgBrightBlue:"48;5;12",bgBrightMagenta:"48;5;13",bgBrightCyan:"48;5;14",bgBrightWhite:"48;5;15",bold:"1",dim:"2",italic:"3",underline:"4",blink:"5",reversed:"7",hide:"8",random:"random",bgRandom:"bgRandom",rgb:(e,n,t)=>te(e,n,t),hex:e=>re(e),color:(e,n,t)=>ee(e,n,t),number:e=>ie(e,!0),bgRgb:(e,n,t)=>te(e,n,t,!1),bgHex:e=>re(e,!1),bgColor:(e,n,t)=>ee(e,n,t,!1),bgNumber:e=>ie(e)};Object.freeze(se);const oe=["#000000","#c23621","#25bc24","#adad29","#492ee1","#dd38dd","#33bbc8","#cbcccd","#818383","#fc391f","#31e722","#eaec23","#5833ff","#f93578","#14f0f0","#ebeded"];function ae(e){let n=Number(e);if(!isFinite(n))throw new TypeError("色值反向解析出错");if(n<16){return oe[n]}const t=e=>Math.floor(256*e/6+W(42)).toString(16).padStart(2,"0");n-=16;const r=n%36;return`#${t(Math.floor(n/36))}${t(Math.floor(r/6))}${t(r%6)}`}class ce{constructor(e){this.parse(e),this.build()}build(){this.hide&&(this.color="transparent"),this.reversed&&([this.color,this.bgColor]=[this.bgColor,this.color]),S(this.color)||(this.str+=`color: ${this.color};`),S(this.bgColor)||(this.str+=`background: ${this.bgColor};`),0!==this.bold&&(this.str+=`font-weight: ${1===this.bold?800:200};`),this.italic&&(this.str+="font-style: italic;"),this.underline&&(this.str+="border-bottom: 1px #666 solid;")}color=void 0;bgColor=void 0;bold=0;italic=!1;underline=!1;reversed=!1;hide=!1;str="";parse(e){e.replace(/38;5;(\d+)/g,"c-$1").replace(/48;5;(\d+)/g,"b-$1").split(";").reverse().forEach(e=>{0===this.bold&&e===se.bold?this.bold=1:0===this.bold&&e===se.dim?this.bold=-1:e===se.italic?this.italic=!0:e===se.underline?this.underline=!0:e===se.reversed?this.reversed=!0:e===se.hide?this.hide=!0:S(this.color)&&e.startsWith("c")?this.color=ae(e.split("-")[1]):S(this.bgColor)&&e.startsWith("b")&&(this.bgColor=ae(e.split("-")[1]))})}}function le(e){return Y()?[e]:function(e){e=e.replace(new RegExp("\\\\[0m","g"),"");const n=H(),t=[""];let r,i=0,s="";const o=()=>{const n=e.substring(i,r?.index??e.length);t[0]+="%c".concat(n),t.push(s)};for(;!T(r=n.exec(e));)o(),s=S(r[7])?new ce(r[3].slice(0,-1)).str:"",i=n.lastIndex;return o(),t}(e)}function ue(e,n){if(v(e=T(e)||S(e)?"":e.toString()))return"";if(N(n))return e;const t=e.indexOf(M),r=e.indexOf(`${M}0m`);return n=function(e){return e.map(e=>"random"===e?`38;5;${W(255)}`:"bgRandom"===e?`48;5;${W(255)}`:e)}(n),t>-1&&r>-1?ue(e.substring(0,t),n).concat(e.substring(t,r+4)).concat(ue(e.substring(r+4),n)):e.endsWith("\r\n")?(e=e.substring(0,e.length-2),`${M}${n.join(";")}m${e}${M}0m\r\n`):e.endsWith("\n")?(e=e.substring(0,e.length-1),`${M}${n.join(";")}m${e}${M}0m\n`):`${M}${n.join(";")}m${e}${M}0m`}function pe(e,n){const t=parseInt(n);if(t>10){const r=_(38===t)?"38;5;":"48;5;",i=e.findIndex(e=>e.startsWith(r));return i>-1?e.toSpliced(i,1,n):[...e,n]}return e.includes(n)?[...e]:[...e,n]}const de=B(function(e=[]){const n=(n,...t)=>{if(G(n,()=>R(n)&&n.every(e=>w(e)))){let r="";for(let i=0;i<n.length;i++)r+=ue(n[i],e),i<t.length&&(r+=ue(t[i],e));return r}if(N(t))return ue(n,e);throw new Error("pen: 缺少参数")},t=Object.keys(se).map(n=>[n,{get:()=>function(e,n){let t=[];if(G(e,w(se[e])))return t=pe(n,se[e]),new de(t);if("hex"===e||"bgHex"===e)return r=>(t=pe(n,se[e](r)),new de(t));if("rgb"===e||"bgRgb"===e)return(r,i,s)=>{if(w(r)&&S(i)&&S(s))t=pe(n,se[e](r));else{if(!(x(r)&&x(i)&&x(s)))throw new Error(`${e} 的参数类型不正确,请使用 'rgb' 或 'hex' 函数`);t=pe(n,se[e](r,i,s))}return new de(t)};if("color"===e||"bgColor"===e)return(r,i,s)=>{if(w(r)&&S(i)&&S(s))t=pe(n,se[e](r));else{if(!(x(r)&&x(i)&&x(s)))throw new Error(`${e} 的参数类型不正确,请使用 'rgb' 或 'hex' 函数`);t=pe(n,se[e](r,i,s))}return new de(t)};if("number"===e||"bgNumber"===e)return r=>{if(x(r))return t=pe(n,se[e](r)),new de(t);throw new TypeError(`${e} 的参数应为有效正整数数值,范围 0 - 255`)};throw new Error(`${e} 函数不存在`)}(n,e)}]),r=Object.fromEntries(t);return Object.defineProperties(n,r),n});const fe=new de([]),he=new de([se.red]),me=new de([se.green]),ge=new de([se.yellow]);new de([se.blue]);const be=new de([se.magenta]),$e=new de([se.cyan]);new de([se.white]);const we=new de([se.brightBlack]),ye=new de([se.brightRed]),ve=new de([se.brightGreen]),Ee=new de([se.brightYellow]);new de([se.brightBlue]);new de([se.brightMagenta]),new de([se.brightCyan]);new de([se.brightWhite]);const xe=new de([se.bgBlack]);new de([se.bgRed]),new de([se.bgGreen]),new de([se.bgYellow]),new de([se.bgBlue]),new de([se.bgMagenta]);const Ce=new de([se.bgCyan]);new de([se.bgWhite]),new de([se.bgBrightBlack]),new de([se.bgBrightRed]),new de([se.bgBrightGreen]);const ke=new de([se.bgBrightYellow]);new de([se.bgBrightBlue]);const Ie=new de([se.bgBrightMagenta]);new de([se.bgBrightCyan]),new de([se.bgBrightWhite]);const _e=new de([se.bold]),Ae=new de([se.italic]),Te=new de([se.underline]),Se=new de([se.hide]);new de([se.dim]),new de([se.blink]),new de([se.reversed]),fe.rgb;const Oe=fe.hex;fe.color,fe.bgRgb;const Re=fe.bgHex;function Ne(e){const n=H(),t=e.replace(n,"");let r=0;for(let e=0,n=t.length;e<n;e++)r+=1+Number(je(t[e]));return r}function je(e){const n=e.codePointAt(0)||0;return n>=19968&&n<=40959||n>=13312&&n<=19903||n>=131072&&n<=191471||n>=63744&&n<=64255||n>=65280&&n<=65519||n>=65381&&n<=65439||n>=127744&&n<=129750||n>=128512&&n<=128591||n>=128640&&n<=128767||n>=9728&&n<=9983||n>=9984&&n<=10175||n>=44032&&n<=55215||n>=12288&&n<=12351}function Pe(e,n,t=!0){const r=n,i=e;if(0===r)return"";let s=!1;const o=Ne(i);if(o<=r)return i.concat(" ".repeat(r-o));const a=r>0,c=H();c.lastIndex=0;const l=[...i.replaceAll(c,"")],u=a?l:l.reverse(),p=u.length,d=Math.abs(r);let f=Math.floor(d/2),h=u.slice(0,f).join(""),m=Ne(h);for(;f<p;){if(m+=Ne(u[f]),m===d){h+=u[f];break}if(m===d+1){t&&(s=!0);break}if(m>d+1)break;h+=u[f],f++}if(a&&i.startsWith(h)||!a&&i.endsWith(h=[...h].reverse().join("")))return s?h+" ":h;if(a){let e;for(c.lastIndex=0;null!==(e=c.exec(i));){const n=h;if(h=n.slice(0,e.index).concat(e[0]).concat(n.slice(e.index)),i.startsWith(h))break}h+=U}else{const e=[...h];let n=e.length-1;h="";const t=[...i].reverse();for(let r=0,i=t.length;r<i;r++){const i=t[r];if(i===e[n])--n;else if(n<0)break;h=i+h}h=U+h}return s?h+" ":h}function De(e){return`${M}?7l${e.toString()}${M}?7h`}fe.bgColor,fe.random,fe.bgRandom,fe.number,fe.bgNumber;var Ge=[!1,!0,"all","info","error","warn"];var Le=Y()?"node":"browser";var Fe=B(Me);function Me(e){var n=this,t=function(e){var n={name:J(10),type:!1,fold:!1};return S(e)?n:I(e)?(n.type=e,n):w(e)?(n.name=e.trim().replace(/\s+/g,"_"),n):w(e.name)?(n.name=e.name.trim().replace(/\s+/g,"_"),n):e}(e);this.name=t.name||J(12),this.fold=Boolean(t.fold);var r=function(e){var n;void 0===e&&(e=J(10));var t=!1;if("node"===Le&&(null===(n=null===globalThis||void 0===globalThis?void 0:globalThis.process)||void 0===n?void 0:n.env)){var r=process.env;t=r[e.toUpperCase().concat("_DEV")]||r[e.toLowerCase().concat("_dev")]||!1}return"false"!==t&&("true"===t||t)}(this.name),i=t.type||!1;this.mark="",this.type="node"!==Le||function(e){return!!Ge.includes(e)&&e}(null!=r?r:i);var s=function(e){var t,r,i,s,o,a,c;try{throw new Error}catch(m){var l=((null===(t=m.stack)||void 0===t?void 0:t.split("\n"))||[]).map(function(e){var n=/at\s(.*)\s\((.*):(\d*):(\d*)\)/.exec(e);return n?{name:n[1],path:n[2],line:n[3],column:n[4]}:{name:""}}),u=l.filter(function(e){return""!==e.name&&void 0!==e.path}),p=null!==(s=null!==(i=null!==(r=u[3])&&void 0!==r?r:u[2])&&void 0!==i?i:u[1])&&void 0!==s?s:u[0],d=" ".concat("info"===e?"💡":"error"===e?"❌":"⚠️ "," ").concat((new Date).toLocaleString()," "),f=("info"===e?Ce.brightWhite:"error"===e?xe.red:ke.brightGreen)(d),h=null!==(o=null==p?void 0:p.name)&&void 0!==o?o:"";return n.fold&&h&&(h===n.mark||(n.mark&&console.groupEnd(),console.groupCollapsed(h))),n.mark=h,le("".concat(f," ").concat(h," ").concat(null===(a=null==p?void 0:p.line)||void 0===a?void 0:a.concat(" 行")," ").concat(null===(c=null==p?void 0:p.column)||void 0===c?void 0:c.concat(" 列")))}};this.info=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];if("all"===n.type||"info"===n.type||!0===n.type){var r=s("info");console.log.apply(console,r),console.log.apply(console,e)}},this.warn=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];if("all"===n.type||"warn"===n.type||!0===n.type){var r=s("warn");console.log.apply(console,r),console.warn.apply(console,e)}},this.error=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];if("all"===n.type||"error"===n.type||!0===n.type){var r=s("error");console.log.apply(console,r),console.error.apply(console,e)}};var o=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];n.info.apply(n,e)};Object.setPrototypeOf(o,this);var a=this;return new Proxy(o,{get:function(e,n,t){return"apply"===n?e:Reflect.get(e,n,t)},set:function(e,n,t){return Reflect.set(a,n,t),!0}})}Me.prototype.clear=function(){"browser"===Le?console.clear():console.log(F.concat("c"))};const He=new Fe({type:"error",name:"a node tools"});function Ue(...e){return a(c(...e))}function Be(e,n="file",...t){t=t.filter(e=>w(e));let r=l(...t);const i=L(r);if(He("当前工作目录",r),!i)return He("🎯 工作目录不存在"),"";if(i.isFile())r=o(r);else if(!i.isDirectory())return;let s=20;const a=()=>{const t=L(Ue(r,e));if(t&&("file"==n&&t.isFile()||"directory"==n&&t.isDirectory()))return r;if(k(s))return;s--,He("♻️ 查找中...",r);const i=Ue(r,"..");return i!==r?(r=i,a()):void 0};return a()}function Ke(t){if(!/.json^/.test(t)&&!e(t,{throwIfNoEntry:!1}))return null;try{const e=n(t,{encoding:"utf-8"});return JSON.parse(e||"null")}catch(e){return He.error(e),null}}function We(e=1){const n=function(e){const n=1,t=void 0;if(S(e))return{depth:n,path:t};const r=e=>x(e)?(e=Math.floor(e))<1||e>20?1:e:1;if(x(e))return{depth:r(e),path:void 0};if(w(e))return{depth:1,path:e};return{depth:r(e.depth)||1,path:e.path||void 0}}(e),t=n.depth;let r=1;if(r>t||t>20)return He("不满足条件退出了查找",r,t),null;let i="";const s="package.json";let o,a=n.path;do{if(He("当前执行的路径",a),a=Be(s,"file",a||""),S(a)){He("未获取 package.json 的路径");break}if(i=Ue(a,s),r===t){try{o=Ke(i)??void 0}catch(e){return He.error("获取 package.json 文件报错",e),null}He("已获取到文件内容");break}r++,a=Ue(a,"..")}while(r<=t);return He("经过了 while 循环",r,t,o),void 0===o?null:{content:o,depth:t,path:i}}function Je(e){try{const n=L(e);if(n&&n.isDirectory())return 0==t(e,{withFileTypes:!0}).length?1:0}catch(e){return He.error("is ",e),-1}return-1}function qe(e,n){try{return r(e,JSON.stringify(n,null,2),{encoding:"utf-8",flag:"w"}),!0}catch(e){return He.error(e),!1}}const Ye=qe,Ve=()=>Y()&&process&&process.stdout&&process.stdout.isTTY||!1,ze=Y()&&"win32"===process.platform||!Y()&&window.navigator.userAgent.includes("Windows");function Xe(e){const n=new RegExp(e);let t;try{throw new Error}catch(e){t=e}const r=(t.stack?.replace(/\\/gm,"/").split("\n")).reverse(),i=r.findIndex((e,t,r)=>!n.test(e)&&n.test(r[t+1]));if(-1==i)return{name:"",line:0,row:0,originArr:r};let s=r[i];return/\(.*\)/.test(s)&&(s=s.replace(/^.*\((.*)\).*/,"$1")),/file:\/*/.test(s)&&(s=s.replace(/^.*file:\/*(.*)/,"$1")),ze||s.startsWith("/")||(s="/"+s),{name:s.replace(/^(.*):\d+:\d+$/,"$1"),line:Number(s.replace(/^.*:(\d+):\d+$/,"$")),row:Number(s.replace(/^.*:\d+:(\d+)$/,"$1")),originArr:r}}function Ze(){let e;try{new Function('import("")'),e=f(import.meta.url)}catch(n){He.error(n),e=__filename}ze&&(e=e.replace(/\\/gm,"/")),e=Xe(e).name;return[e,o(e)]}const{stdin:Qe}=process,en={list:[],listened:!1,on(e,n,t){A(this.listened)&&(this.listened=!0,h(process.stdin),Ve()&&process.stdin.setRawMode(!0),process.stdin.resume(),Qe.on("keypress",rn),process.on("beforeExit",nn),process.stdin.on("end",tn));const r=this.list,i={key:e,callback:n,resolve:t};return N(r)&&He("当前执行的栈中没有数据",i),r.push(e),this[e]=i,i},remove(){const e=this.list,n=e.shift();return n&&this.del(n),He("执行完毕一项,还有:",e),!(e.length>0)&&(this.listened=!1,nn(),He("监听已移除"),!0)},del(e){He("开始移除",e);const n=this.list[0]===e&&!S(this[e]);if(He("当前 key 是否为当前执行项",n),n)return this.remove(),!0;{const n=this.list.includes(e),t=!S(this[e]);return n&&t?(this.list.splice(this.list.indexOf(e),1),this[e].resolve(!0),delete this[e],!0):n?(this.list.splice(this.list.indexOf(e),1),!0):!!t&&(this.list.splice(this.list.indexOf(e),1),this[e].resolve(!0),!0)}}};function nn(){Qe.removeListener("keypress",rn),process.removeListener("beforeExit",nn),process.stdin.removeListener("end",tn),Ve()&&Qe?.setRawMode(!1),Qe.pause()}function tn(){nn()}function rn(e,n){const t=en[en.list[0]],{callback:r,resolve:i}=t;He("当前执行的回调是",{...t,rl:"原始值为 readline 的 Interface 对象"}),O(r)?_(Reflect.apply(r,null,[e,n]))&&(He("回调遇见了想待的键,执行了退出操作,keyValue: < ",e,"> key: <",n,">"),en.remove(),i(!0)):(en.remove(),i(!1))}const sn=(e,n)=>async function(e,n){if(!Y())throw new RangeError("当前环境不支持 readInput");const t=n??Symbol(J(3));return new Promise(n=>{en.on(t,e,n)})}(e,n);function on(e="",n=!0){let t="";const r=$(e);if(!I(n))throw He.error(""),new TypeError("lineFeed 的类型必须是 boolean ");if("bigint"===r){const r=Object.prototype.toString.call(e).concat("n");t=n?`${r}\n`:`${r}`}else if(["string","number","boolean","function","null"].includes(r))t=n?`${e}\n`:`${e}`;else{const r=JSON.stringify(e,(e,n)=>O(n)?`${n}`:null==n?"undefined":n,2);t=n?`${r}\n`:`${r}`}Y()?process.stdout.write(t):console.log(...le(t.replace(/\n$/,"")))}function an(e,n=!0){on(`${n?M:F}${e}`,!1)}function cn(){an("?25l")}function ln(){an("?25h")}function un(e=!1){e&&dn(1/0),an("0J")}function pn(e=1,n=!1){an(`${hn(e,"vertical")}A`),n&&dn(1/0)}function dn(e=1){an(`${hn(e)}D`)}function fn(e=1){an(`${hn(e)}C`)}function hn(e,n="horizontal"){(!x(e=Number(e))||isNaN(e)||e<1||!1===Number.isInteger(e)&&e!==1/0)&&(e=1);const t=Y()?"horizontal"===n?process.stdout.columns:process.stdout.rows:80;return(1/0===e||e>t)&&(e=t),e}function mn(){ln()}function gn(e){const n=e[e.length-1];w(n)&&!n.endsWith("\n")&&e.push("\n"),e.forEach(e=>on(e,!1))}function bn(e,n){const{show:t,info:r,prefix:i,interval:s,canCtrlCExit:o,canCtrlDExit:a,beforeDestroyed:c}=n??{show:!0,info:"请等待",prefix:0,interval:20,canCtrlCExit:!1,canCtrlDExit:!1,beforeDestroyed:()=>{}},l=I(e)?{show:e,info:r,prefix:i,interval:s,canCtrlCExit:o,canCtrlDExit:a,beforeDestroyed:c}:w(e)?{show:t,info:e,prefix:i,interval:s,canCtrlCExit:o,canCtrlDExit:a,beforeDestroyed:c}:S(e)?{show:t,info:r,prefix:i,interval:s,canCtrlCExit:o,canCtrlDExit:a,beforeDestroyed:c}:x(e)?{show:!0,info:"请等待",prefix:isNaN(e)?i:Math.min(Math.max(0,e),2),interval:s,canCtrlCExit:o,canCtrlDExit:a,beforeDestroyed:c}:{show:t,info:r,prefix:i,interval:s,canCtrlCExit:o,canCtrlDExit:a,beforeDestroyed:c,...e};return l.interval=isFinite(l.interval)?Math.max(20,Math.min(2e3,l.interval)):s,l.info=l.info.replace(/\n/g,"\\n"),l}function $n(){ln()}Object.defineProperties(sn,{remove:{value:e=>en.del(e)}});const wn=[".","..","...","....","...",".."],yn=[["⋯","⋱","⋮","⋰","⋯","⋱","⋮","⋰"],["🕐","🕑","🕒","🕓","🕔","🕕","🕖","🕗","🕘","🕙","🕚","🕛"],["🕜","🕝","🕞","🕟","🕠","🕡","🕢","🕣","🕤","🕥","🕦","🕧"],["👈","👆","👉","👇","🤘","🤟","🫳","🫴","👊"],["🌞","🌕","🌖","🌗","🌜","🌘","🌑","🌒","🌓","🌛","🌔","🌔","🌔","🌝"]];class vn{#e;#n=void 0;#t=Symbol("waiting-tips");#r=[];#i=(...e)=>gn(e);state="destroyed";#s=0;#o=4e4;#a=!1;async destroyed(){"destroyed"!==this.state&&(this.state="destroyed",this.#s=0,S(this.#n)||clearInterval(this.#n),sn.remove(this.#t),dn(1/0),un(),process.removeListener("exit",mn),process.removeListener("SIGINT",$n),ln(),this.#r.forEach(e=>this.#i(...e)),this.#r.length=0,this.log=this.#i,!function(e){return"promise"===$(e)}(this.#e.beforeDestroyed)?this.#e.beforeDestroyed(this.#a):await this.#e.beforeDestroyed(this.#a),this.#a=!1)}log=this.#i;run(e){"run"===this.state&&this.destroyed(),this.#a=!1,this.state="run",this.#s=Date.now(),this.#e=S(e)?this.#e:bn(e,this.#e);const{prefix:n,info:t,interval:r,canCtrlCExit:i,canCtrlDExit:s}=this.#e;this.log=(...e)=>this.#r.push(e);const o=wn.length,a=yn[Math.min(yn.length-1,Math.max(n,0))],c=a.length,l=a.reduce((e,n)=>Math.max(e,Ne(n)),0);let u=0;cn(),process.on("exit",mn),process.on("SIGINT",$n),this.#n=setInterval(()=>{un(!0),this.#r.forEach(e=>gn(e)),this.#r.length=0,on("\n".repeat(2)),pn(3),an(7,!1);const e=Pe(a[++u%c],l);Date.now()-this.#s<this.#o?on(De(`${e} ${t.replace(/\n/,"\\n")}${wn[Math.floor(u/10)%o]}`),!1):on(De(`${e} ${t} ${be`当前已执行 ${Math.ceil((Date.now()-this.#s)/1e3)} 秒`}\n \n\r${$e`可使用双击 esc 键退出(确保执行完成,若执行仍在期望时间内,请忽略)`}`),!1),an(8,!1)},r),sn((e,n)=>!!(n?.meta&&n?.sequence===F.repeat(2)||_(n?.ctrl)&&(i&&"c"===n?.name||s&&"d"===n?.name))&&(this.#a=!0,this.destroyed(),!0),this.#t)}set timeout(e){this.#s=Date.now(),this.#o=!isFinite(e)||e<0?4e4:e<600?1e3*e:e}get timeout(){return this.#o}constructor(e){this.#e=bn(e),_(this.#e.show)&&this.run()}}function En(e){return new vn(e)}function xn(e,n,t){let r=e.toString().trim();return/\n$/.test(r)||(r=r.concat(ze?"\r\n":"\n")),r=r.replace(/\n+/g,"\n"),un(),n&&t.log(r),r}function Cn(e){const n={result:{success:!1,data:"",error:"",status:1,isSIGINT:!1,runCode:"",runCwd:""},env:{cmd:[],code:"",cwd:"",printLog:!1,shell:!0,callBack:()=>{},waiting:{show:!1,info:"",prefix:0,interval:10,canCtrlDExit:!1,canCtrlCExit:!1,async beforeDestroyed(){}}}},{env:t,result:r}=n;He("runOtherCode 方法 开始执行 "),function(e,n){if(A(Y()))throw new RangeError("当前环境不支持 node 环境");const{env:t}=n;w(e)&&(t.code=e,e={code:e,waiting:!1});const r=process.cwd();let i=b(r,e.cwd||"");-1===Je(i)&&(He(`执行目录 ${he(i)} 不存在,使用命令执行目录 ${$e(r)}`),i=r);const s=e.code.replace(/\s{2,}/g," ").trim().split(" ");Object.assign(n.env,{shell:!0,hideWaiting:!0,waitingMessage:"请稍等",printLog:!1,...e,cmd:s,cwd:i})}(e,n),He("执行参数",n);const{cmd:i,waiting:s,cwd:o,shell:a,code:c}=t,[l,u]=(()=>{if(s instanceof vn)return[s,"run"===s.state];const e=bn(s);return[En(e),e.show]})();r.runCode=c,r.runCwd=o||process.cwd();try{return new Promise(e=>{const t=_(a)?m(c,[],{cwd:o,shell:a}):m(i[0],i.slice(1),{cwd:o,shell:a});u&&l.run({beforeDestroyed:e=>{if(e){if(He("执行退出前"),ze){try{t.killed||t.kill(-1)}catch(e){He.error("使用 child.kill(child.pid, -1 ) 关闭子进程失败",e),m("taskkill",["/pid",t.pid?.toString()||"","/T","/F"],{stdio:"pipe"})}He("终结在 windows 下的子进程")}else t.kill("SIGTERM"),He("终结在非 windows 下的子进程");n.result.isSIGINT=!0}}}),t.on("spawn",()=>function(e){const{result:n}=e;He("子线程已启动,运行状态良好"),n.success=!0,n.status=1}(n)),t.stdout.on("data",e=>function(e,n,t){const{env:r,result:i}=n,s=xn(e,r.printLog,t);He(Ie`stdout on data`,s),i.data+=s}(e,n,l)),t.on("exit",(e,n)=>{He("子进程已退出了,退出码为 <",e,">"),T(n)||He.error("子进程被其他信号中断执行,执行的退出信号为:",n)}),t.stderr.on("data",e=>function(e,n,t){const{env:r,result:i}=n,s=xn(e,r.printLog,t);He(Ie`stderr on data`,s),i.error+=s}(e,n,l)),t.on("error",e=>function(e,n,t){const{env:r,result:i}=n;{const n=xn(e,r.printLog,t);He(Ie`error`,n),He.error("error",n),i.success=!1,i.status=""!==i.data?2:3,i.error+=n}}(e,n,l)),t.on("close",(t,r)=>function(e,n,t,r,i){const{env:s,result:o}=r,{callBack:a}=s;He("进行正常关闭",e),setTimeout(async()=>{a&&O(a)&&Reflect.apply(a,null,[]),await i.destroyed(),0!==e&&"SIGINT"!==n&&"SIGTERM"!==n?(o.success=!1,o.status=3):"SIGINT"!==n&&"SIGTERM"!==n||(o.success=!1,o.status=4,o.isSIGINT=!0),t(o)})}(t??0,r??"",e,n,l))})}catch(e){const n=e.toString();return He.error("创建(但是确是非 node 无法创建子进程,而是更上游的 node 创建的错误)子进程出错",e),new Promise(e=>{(async()=>{await l.destroyed()})(),r.error=n,r.success=!1,r.status=0,e(r)})}}const kn=e=>Cn(e);async function In(e,n="官方",t=5e3){const r={"淘宝":"registry.npmmirror.com","官方":"registry.npmjs.org","腾讯":"mirrors.tencent.com","中科大":"npmreg.proxy.ustclug.org",yarn:"registry.yarnpkg.com"},i=r[n]||r["官方"];return He("get npm pkg info 开始执行"),new Promise(r=>{(()=>{let s="";const o=function(e){if(!e||!w(e))return null;if(e.includes("@")){const n=e.replace(/\/+/g,"/").replace(/@+/g,"@").replace(/\/$/,"").split("@").map(e=>e.trim().replace(/^\/*/,"")),t=n.length;return""===n[0]?3===t||2===t&&""!==n[1]?`@${n[1]}`:null:2===t?`${n[0]}`:null}return e}(e)||"a-node-tools";He("解析后的 pkg 名称",o);const a=("腾讯"===n?"/npm":"").concat(`/${o}`),c={hostname:i,path:a,port:443,method:"GET",timeout:t,headers:{"sec-fetch-dest":"empty","X-Spiferacl":"1"}};He("请求参数",c);const l=g.get(c,e=>{e.on("data",e=>{S(e)||(s+=e.toString())}),e.on("end",()=>{if(200==e.statusCode)try{const e=JSON.parse(s);e.version=e["dist-tags"].latest,r({data:e,success:!0,status:"success",error:null})}catch(e){He.error("转化错误",e),r({data:null,success:!0,status:"parseJsonError",error:e,message:s})}else 404==e.statusCode?r({data:null,success:!0,status:"notFound",error:null,message:"npm 中没有该包"}):r({data:null,success:!0,status:"otherCode",error:null,message:`请求的返回请求码: ${e.statusCode}`})})});l.on("error",e=>{He.error("请求错误",e),r({data:null,success:!1,status:"error",error:e})}),l.on("timeout",()=>{He.error("请求超时"),l.destroy(),r({data:null,success:!1,status:"timeout",error:null})}),l.end(),He("结束方法")})()})}function _n(e=!1){if(A(e)){const e=e=>Boolean(Be(e,"file"));if(e("pnpm-lock.yaml"))return"pnpm";if(e("yarn.lock"))return"yarn";if(e("package-lock.json"))return"npm"}const n=process.env.npm_config_user_agent||"";return n.includes("pnpm")?"pnpm":n.includes("yarn")?"yarn":n.includes("npm")?"npm":process.env.PNPM_HOME?"pnpm":process.env.YARN_IGNORE_PATH?"yarn":"npm"}const An=process.argv.slice(2);Object.freeze(An);class Tn{originalArg=An.slice();name="";__filename="";get state(){return this._state}set state(e){this._state=[void 0,{code:1,text:"start"},{code:2,text:"bind over"},{code:3,text:"run over"},{code:4,text:"over",overCode:e}][x(e)?e:4]}_state={code:1,text:"start"};args=new Sn;abbr={};helpInfo="";hasShowVersion=!1;originalBind={};values=[]}class Sn extends Array{get $nomatch(){return[]}get $map(){return{}}get $arrMap(){return[]}get $only(){return[]}get $original(){return[]}get $isVoid(){return!1}}const On={},Rn=new Fe({name:"a command"}),Nn=A(Rn.type);function jn(e){return[e.replace(/^(.*?)\s.*/gm,"$1")||"",/<.+>/.test(e)&&e.replace(/.*<(.+)>.*/,"$1")||"",e.replace(/.*?\((.*)\).*?/,"$1")||""]}function Pn(e,n){switch(n.state.code){case 3:return void Rn.warn("执行绑定","但是已经执行过 `run`");case 4:return void Rn.warn("执行绑定,但是 command 已完成全部应做动作");default:n.state=2}if(w(e)){const[t,r,i]=jn(e);return Pn({name:t,abbr:r,info:i},n)}if(R(e))return e.forEach(e=>Pn(e,n));if(!S(e)&&!e.name&&!e.info)return function(e,n){const t={name:"",info:"",abbr:"",options:[]},r=Object.keys(e),i=Object.keys(t);return r.forEach(t=>{if(!i.includes(t)){const[r,i,s]=jn(t);return Pn({name:r,info:s,abbr:i,options:e[t]},n)}})}(e,n);const t=e;t.abbr&&(n.abbr[t.abbr]=t.name),t.options?t.options=function(e,n,t){R(e)||(e=[e]);const r={};return e.forEach(e=>{let i={name:"",abbr:"",info:""};w(e)?[i.name,i.abbr,i.info]=jn(e):i=Object.assign(i,e),i.abbr&&(t.abbr[`${n}^${i.abbr}`]=i.name),r[i.name]=i}),r}(t.options,t.name,n):t.options={},n.originalBind[t.name]={abbr:"",...t}}function Dn(){return new Proxy(new Tn,{get(e,n,t){if("args"===n){const n=JSON.parse(JSON.stringify(e[Symbol.for("_args")]||[]));return new Proxy(n,{get(t,r,i){return"$nomatch"===r?e.values.slice():"$map"===r?function(e){if(N(e))return{};const n=new Object;return e.forEach(e=>{const t=n[e.name]||{};t.value=[...t.value||[],...e.value||[]],e.options&&e.options.forEach(e=>{t[e.name]=[...t[e.name]||[],...e.value||[]]}),n[e.name]=t}),n}(n):"$arrMap"===r?N(s=n)?[]:s.map(e=>{const n={},t=n[e.name]||{};return e.value&&!N(e.value)&&(t.value=e.value),S(e)||S(e.options)||N(e.options)||(t.options=[],e.options.forEach(e=>{t.options?.push(Object.fromEntries([[e.name,e.value]]))})),n[e.name]=t,n}):"$only"===r?[...new Set(n.map(e=>e.name))]:"$original"===r?An.slice():"$isVoid"===r?0==An.slice().length:Reflect.get(t,r,i);var s},set:(e,n,t,r)=>(Reflect.set(e,n,t,r),!0)})}return Reflect.get(e,n,t)},set:(e,n,t,r)=>("args"===n?e[Symbol.for("_args")]=t:Reflect.set(e,n,t,r),!0)})}const Gn=" ".repeat(4);function Ln(e){return e.state="help",w(e.helpInfo)&&"help"!==e.helpInfo?function(e,n){const t=e.originalBind[n];if(on(`${Gn}${t.name}${Gn}${be(t.info)}\n`),t.options&&!P(t.options)){on(`${ge(`${Gn}使用:`)} ${e.name} ${n} [subOptions/subAbbr [value]]\n`),on(`${$e(`${Gn}subOptions:`)} \n`),Fn(t.options||{})}else{on(`${me(`${Gn}使用:`)} ${e.name} ${n} [value]\n`)}}(e,e.helpInfo):R(e.helpInfo)&&2==e.helpInfo.length?function(e){const n=e.name,t=e.helpInfo.join(" "),r=e.originalBind[e.helpInfo[0]].options[e.helpInfo[1]].info;on(`${$e(" 可使用:")} ${n} ${t} [value]\n${me(" 描述:")} ${r}`)}(e):function(e){on(`${ye(" 可使用:")} ${e.name} options/abbr [subOptions/subAbbr [value]]\n\n选项:\n`);const n=Fn(e.originalBind);!function(e){["version -v 版本描述","help -h 帮助查看"].forEach(n=>{const[t,r,i]=n.split(" ");on(Mn({len:e,name:t,info:i,abbr:r})),on("")})}(n)}(e)}function Fn(e){const n=Object.keys(e).sort();let t=8;n.forEach(e=>t=Math.max(t,e.length));const r=Math.min(15,t+1);return on(Mn({len:r,name:"子命令",info:"描述",abbr:"缩写",color:!1})),on(""),n.forEach(n=>{const{name:t,abbr:i,info:s}=e[n];let o=!1;"options"in e[n]&&!P(e[n].options)&&(o=!0),on(Mn({len:r,name:t,info:s,abbr:i,textDecoration:o})),on("")}),r}function Mn(e){const n=Object.assign({name:"",info:"",abbr:"",len:15,color:!0,textDecoration:!1},e);let t=fe[n.color?"green":"black"](Gn);return t+=fe[n.textDecoration?"blue":"black"](n.name.slice(0,n.len)),t+=" ".repeat(n.len+1-Hn(n.name,n.len)),t+=fe[n.color?"yellow":"black"]`${n.abbr?.slice(0,6)||""}${" ".repeat(7-Hn(n.abbr||"",6))}`,t+=n.color?be(n.info):n.info,t}function Hn(e,n){return Math.min(e.replace(/[^\x00-\x7f]/,"11").length,n)}const Un="";function Bn(e){const{name:n,object:t,item:r,result:i}=e;E(n)||(r.name&&t.options?.push(r),i.push(JSON.parse(JSON.stringify(t))))}function Kn(e,n){"true"==e?e=!0:"false"==e?e=!1:e==Number(e)&&(e=Number(e)),E(n.name)?n.values.push(e):n[n.item.name?"item":"object"].value.push(e)}function Wn(e,n){const t=[];let r="";const i=(e,n)=>S(n)||E(n)?t.push(e):t.push(e,n);function s(e,o){if(!E(r)){if(n.originalBind[r].options[e])return i(e,o);const t=n.abbr[`${r}^${e}`];if(!S(t))return i(t,o)}if(n.originalBind[e])return r=e,i(e,o);if(n.abbr[e])return e=n.abbr[e],r=e,i(e,o);if(e.includes("=")){const n=e.indexOf("=");if(0===n||n===e.length-1)return t.push(e);const[r,i]=[e.slice(0,n),e.slice(n+1)||"true"];return s(r,i)}return S(o)||E(o)?t.push(e):t.push(`${e}=${o}`)}return e.forEach(e=>s(e)),t}function Jn(e,n,t){t.init(),e=Wn(e.filter(e=>""!==e),n),e.forEach(e=>{const{name:r}=t;return e=e.trim(),/^([a-z]|[A-Z]|-|\$|_)/.test(e)?!E(r)&&n.originalBind[r].options&&n.originalBind[r].options[e]?function(e,n){const{item:t,object:r}=n;t.name&&r.options.push(t),n.resetItem(e)}(e,t):n.originalBind[e]?function(e,n){E(n.name)||(Bn(n),n.resetItem("")),n.resetObject(e)}(e,t):Kn(e,t):Kn(e,t)}),Bn(t)}function qn(e){switch(e.state.code){case 3:return void on("已经执行过 `run`");case 4:return void on("已完成全部");default:e.state=3}!function(e){if(2==process.argv.length)return;const n=e.originalArg,t=`${Un}${n.join(Un)}${Un}`,r=n.findIndex(e=>/^(-h|help)$/.test(e));if(new RegExp(`${Un}(-v|version)${Un}`,"i").test(t))return void(e.hasShowVersion=!0);if(k(r))return void(e.helpInfo="help");let i=[];const s={result:[],values:[],name:"",object:{name:"",value:[],options:[]},item:{name:"",value:[]},resetObject(e){this.name=e,this.object={name:e,value:[],options:[]}},resetItem(e){this.item={name:e,value:[]}},init(){this.result=[],this.values=[],this.resetItem(""),this.resetObject("")}};r>0?(Jn(n.slice(0,r+1),e,s),e.values=s.values,e.args=s.result,i=e.args,N(i)?e.helpInfo="help":[S,N].some(e=>e(i[0].options))?e.helpInfo=i[0].name:e.helpInfo=[i[0].name,i[0].options[0].name]):(Jn(n,e,s),e.values=s.values,e.args=s.result)}(e),function(e){["name","originBind","abbr"].forEach(n=>{const t=n;e[t]&&(Object.freeze(e[t]),Object.defineProperty(e,n,{value:e[t],writable:!1,enumerable:!0,configurable:!1}))})}(e)}function Yn(e){e.state="version";const n=Be("package.json","file",Xe(e.__filename).name);if(S(n))return Vn();const t=Ue(n,"package.json");if(!L(t))return Vn();const r=Ke(t);if(T(r))return Vn();const{platform:i}=process,s=fe.brightCyan(r.name),o=r.version,a="win32"==i?"Windows":"darwin"==i?"mac":i,c=fe.brightMagenta(u());on(`${s} 版本 ${fe.brightRed(o)} (${a} ${c})`)}function Vn(){on("抱歉,未找到版本定义说明")}const zn=Oe("#333"),Xn=Oe("#666"),Zn=Oe("#aaa"),Qn=Re("#666"),et=Xn(".".repeat(3)),nt=(e="❖")=>ve(e),tt=(e="▶︎")=>Ee(e),rt=(e="⚉")=>ye(e),it=(e="◦")=>Xn(e),st=(e="●")=>ve.blink(e),ot=(e="□")=>Xn(e),at=(e="□")=>ve.blink(e),ct=(e="■")=>Xn(e),lt=(e="■")=>ve.blink(e);function ut(e,n="⚉"){on(`${rt(n)} ${Oe("#612").italic(e)}`)}function pt(e,n="❖"){on(`${nt(n)} ${e}`)}const dt={callList:[],on(e,n){const t=this.callList;N(t)&&(Rn("当前执行列表为空,直接执行任务",e),Reflect.apply(n,void 0,[])),t.push([e,n])},remove(e){const n=this.callList,t=n.findIndex(([n])=>n===e);return n.splice(t,1),N(n)?(Rn("当前执行列表为空,返回 true 结束执行"),!0):(Reflect.apply(n[0][1],null,[]),!1)}},ft={data:"",kind:0,multi:!1,progressCount:0,indexOfCursor:0,init:function(e){this.data=e,this.multi=R(e)}},ht={get kind(){return ft.kind},set kind(e){(!isFinite(e)||0!=e&&1!=e)&&(e=0),ft.kind=e},get multi(){return ft.multi},enterText:[],get progressCount(){return ft.progressCount},set progressCount(e){ft.progressCount=e,e<0&&Reflect.apply(mt,this,[])},get indexOfCursor(){return ft.indexOfCursor},set indexOfCursor(e){ft.indexOfCursor=e},currentIssue:{text:"请更换为你自己的问题",tip:"",type:"text",private:!0,errorText:"",resultText:"",required:!0,defaultValue:"",mustInfo:!1,canCtrlCExit:!1,canCtrlDExit:!1,isWrapLine:!1,usableLength:0,mustInfoLen:0,row:0,cum:0,maxLen:0,minLen:0,len:0,verify:[]},results:[],assign(e){Object.keys(e).forEach(n=>{if(!Object.hasOwn(this,n)||S(e[n]))throw on(`${n} is not exist`),new Error(`${n} is not exist`);this[n]=e[n]})},beforeStart(){this.results.length=this.enterText.length=this.indexOfCursor=0,this.progressCount=ft.multi?-ft.data.length:-1}};function mt(){const{multi:e,progressCount:n}=this,t=e&&R(ft.data)?ft.data[ft.data.length+n]:ft.data,r={text:"请更换为你自己的问题",tip:"",type:"text",private:!0,errorText:"",resultText:"",required:!0,defaultValue:"",mustInfo:!1,canCtrlCExit:!1,canCtrlDExit:!1,isWrapLine:!1,usableLength:0,mustInfoLen:0,row:0,cum:0,maxLen:0,minLen:0,len:0,verify:[]};Object.assign(r,w(t)||x(t)?{text:t}:t);const i=R(r.tip)?1:0;let s;1==i?s=[r.tip[0]]:(s=[],[r.tip,r.defaultValue].every(e=>v(e))&&(r.required=!0),!E(r.defaultValue)&&v(r.tip)&&(r.tip=r.defaultValue)),r.text=E(r.text.toString())?"请使用你自己的问题":r.text,this.assign({indexOfCursor:0,kind:i,enterText:s,currentIssue:r})}const gt=q(()=>{const{kind:e,currentIssue:n,enterText:t}=ht,{mustInfo:r,text:i,required:s,tip:o,verify:a}=n;cn();let c="",l=!1;if(k(n.row)||(c+=`${M}${n.row}A`,n.row=0),c+=`\r${M}0J${U}`,r)c=bt(c),l=!0;else if(!N(t)){const e=t.join("");for(const t of a)if(y(t.reg)&&w(t.info)&&[S,I].some(e=>e(t.inverse))){t.reg.lastIndex=0;const r=t.reg.test(e);if(_(t.inverse)&&_(r)||_(!t.inverse)&&A(r)){n.mustInfo=t.warn?Ee(t.info):t.info,c=bt(c),l=!0;break}}}const u=0===e&&s?ye.blink("*"):"";c+=`${tt()} ${u}${i}${u}: `,n.row+=Number(n.isWrapLine),c+="\n".repeat(Number(n.isWrapLine)),k(e)?N(t)&&w(o)?v(o)?c+=Ae.dim.blink("I"):c+=" ".concat(Qn.italic.dim(o[0])).concat(Ae.dim(o.slice(1))):(c+=" ",c=function(e){const{type:n,usableLength:t}=ht.currentIssue;e="text"===n?function(e,n){const{enterText:t,indexOfCursor:r}=ht,i=Ne(t.join(""))>n;r===t.length?(i?e=function(e,n){const{enterText:t}=ht;return e+=et.concat([...Pe(t.toReversed().join(""),n-3,!1)].reverse().join("")),e}(e,n):e+=t.join(""),e+=Qn.hide(" ")):i?e=function(e,n){const{indexOfCursor:t,enterText:r}=ht,i=r.join(""),s=r.length,o=Math.floor(n/2),a=Pe(i,o),c=a.length-1,l=a[c]===i[c]?c:c-1,u=Pe(i,-o),p=u.length-1,d=u[p]===i[s-1-p]?s-1-p:s-p,f=r.map((e,n)=>n===t?Qn(e):e).join("");if(t>=d)e+=et,e+=Pe(f,3-n,!1);else if(t<l)e+=Pe(f,n-3,!1),e+=et;else{const n=o-Ne(r[t])-3;e+=et,e+=Pe(i.slice(0,t),-n,!1),e+=Qn(r[t]),e+=Pe(i.slice(t+1),n,!1),e+=et}return e}(e,n):e+=`${t.map((e,n)=>n===r?Qn(e):e).join("")}`;return e}(e,t):function(e){const{enterText:n,indexOfCursor:t}=ht;t===n.length?(e+=` ${n.map(()=>"*").join("")}`,e+=Qn.hide("1")):e+=` ${n.map((e,n)=>n===t?Qn("*"):"*").join("")}`;return e}(e);return e}(c)):c=function(e){const{currentIssue:n,enterText:t}=ht;return e+n.tip.map(e=>e===t[0]?Te.bold.blink.cyan(e):be(e)).join(" ")}(c),Rn("计算完成的文本为",c),on(De(c)),n.row++,function(e){const{currentIssue:n,indexOfCursor:t,enterText:r}=ht,{text:i,required:s,mustInfoLen:o}=n;if(e)return fn(o);const a=r.slice(0,t).join(""),c=i.toString().concat(a),l=Ne(c),u=l+7+2*Number(s),p=u%process.stdout.columns;Rn("用户输入",r.join("")),Rn("光标所在的位置",t),Rn("实际参与计算的用户输入的文本为",a),Rn("计算总文本",c),Rn("计算文本长度",l),Rn("计算可用长度",u),Rn("屏幕宽",process.stdout.columns),Rn("光标偏移量",u%process.stdout.columns),fn(p)}(l),l||on(Se("I"),!1),an("8m")},66);function bt(e){const{currentIssue:n}=ht;e+="\n\r",n.row++;let t="";if(I(n.mustInfo)){const e=n.required?" ":"";t+=" ".repeat(2).concat(e).concat(he(n.text)).concat(e).concat(" ".repeat(3)),t+=he.blink`👆`}else t+=be(n.mustInfo);let r=Ne(t);const i=process.stderr.columns-4;return i<r&&(r=i,t=Pe(t,i)),n.mustInfoLen=r,e+=t,e+=`\r${M}1A`,n.row--,n.mustInfo=!1,e}function $t(){const{currentIssue:e}=ht;!function(){const{currentIssue:e}=ht,n=process.stdout.columns;let t=n-Ne(e.text.toString())-2*Number(e.required)-4-7;const r=t<5;r&&(t=n-4);e.isWrapLine=r,e.usableLength=t}();const{isWrapLine:n}=e,t=2+Number(n);on("\n".repeat(t),!1),e.row+=t,pn(t),e.row-=t}async function wt(){try{await sn((e=this,(n,t)=>{const{kind:r,currentIssue:i,enterText:s,results:o}=e,{tip:a,text:c,canCtrlCExit:l,canCtrlDExit:u}=i;let p=[],d=0,f=0,h=!0;switch(k(r)||(p=a,d=p.length-1,f=p.indexOf(s[0])),Rn("\n 用户使用了",n,t),t.name){case"return":if(function(){const{enterText:e,currentIssue:n,results:t}=ht,r=n.text;let i=e.join("").trim();if(v(i)&&n.required)return n.mustInfo=!0,!1;const{len:s,minLen:o,maxLen:a,verify:c}=n,l=i.length;if(k(ht.kind)){if(c.length>0)for(const e of c)if([S,A].some(n=>n(e.warn))&&y(e.reg)&&w(e.info)&&[S,I].some(n=>n(e.inverse))){e.reg.lastIndex=0;const n=e.reg.test(i);if(_(e.inverse)&&n||!e.inverse&&!n)return!1}if(!k(s)&&l!==s)return n.mustInfo=`您输入的长度 ${me(l)} 不符合要求值 ${$e(s)}`,!1;if(!k(o)&&l<o)return n.mustInfo=`您输入的长度 ${me(l)} 小于最低要求${$e(o)}`,!1;if(a>o&&l>a)return n.mustInfo=`您输入的长度 ${me(l)} 大于最低要求${$e(a)}`,!1}return v(i)&&A(n.required)&&(i=n.defaultValue||n.tip||""),t.push({q:r,r:i}),!0}())return h=!1,!0;break;case"left":!function(e,n,t){const{kind:r,enterText:i}=ht;k(r)?ht.indexOfCursor=0===ht.indexOfCursor?i.length:ht.indexOfCursor-1:i[0]=e[0===n?t:n-1]}(p,f,d);break;case"right":!function(e,n,t){const{kind:r,enterText:i}=ht;k(r)?ht.indexOfCursor=ht.indexOfCursor==ht.enterText.length?0:ht.indexOfCursor+1:i[0]=e[n==t?0:n+1]}(p,f,d);break;case"delete":case"backspace":!function(){const{enterText:e,kind:n}=ht;k(n)&&!k(ht.indexOfCursor)&&(e.splice(ht.indexOfCursor-1,1),ht.indexOfCursor--)}();break;case"escape":if(t?.sequence===F.repeat(2))return o.push({q:c,r:void 0}),h=!1,!0;break;default:if(Rn("当前触发为含 ctrl 键的功能键",n,t),A(t?.ctrl))!function(e){const{enterText:n,kind:t}=ht;S(e)||0!==t||(ht.indexOfCursor==n.length?n.push(e):n.splice(ht.indexOfCursor,0,e),ht.indexOfCursor+=1)}(n);else if(h=!1,an("m"),_(l)&&"c"===t?.name||_(u)&&"d"===t?.name)return o.push({q:c,r:void 0}),!0}return h&&gt(),!1}))}catch(e){Rn.error("接收用户输入出错",e),on(e)}var e}function yt(e,n){const t=Symbol("question");try{return new Promise((r,i)=>{dt.on(t,async()=>{try{const i=await async function(e,n){process.stdout.removeListener("resize",vt),process.stdout.on("resize",vt),Rn("初始化问题"),ft.init(e),Rn("初始化当前问题"),ht.beforeStart(),Rn("开始绘制问题");do{$t(),gt();try{await Reflect.apply(wt,ht,[])}catch(e){Rn.error(e)}const{currentIssue:e,results:n}=ht;k(e.row)||(pn(e.row,!0),e.row=0),an("m"),ln(),un(!0);const t=e.resultText||e.text,r=n[n.length-1].r;e.private||(S(r)?ut(e.errorText||t):pt(`${Xn(t)}: ${"text"===e.type?r:r.replace(/./gm,"*")}`)),++ht.progressCount}while(ht.progressCount<0);return process.stdout.removeListener("resize",vt),an("m"),ln(),un(!0),ht.multi?_(n)&&R(e)?ht.results.map(e=>e.r):ht.results:ht.results[0].r}(e,n);dt.remove(t),r(i)}catch(e){Rn.error("\n\n\n\n\n执行出现错误",e),dt.remove(t),i(e)}})})}catch(e){return Rn.error("系统故障",e),on("系统故障",!1),on(e),new Promise((n,t)=>{t(e)})}}const vt=q(()=>{const{currentIssue:e}=ht;k(e.row)||(pn(e.row,!0),e.row=0),on(U,!1),un(!0),$t(),gt()}),Et=async function(e,n){return yt(e,n)};function xt(e=!0){return process.stdout.rows-4*(1+Number(e))}function Ct(e){const n=[];for(let t=0,r=e.length;t<r;t++){const r=e[t];if(G(r,e=>[w,x].some(n=>n(e))))n.push({value:r,label:r,checked:!1,tip:"",disable:!1});else{if(!G(r,e=>[w,w].some(n=>n(e.label))&&[w,x,D].some(n=>n(e.value))))throw new TypeError(`${r} 的类型非法(有可能是返回值类型更改后未在解析中兼容)`);{let e=r.checked;!S(e)&&I(e)||(e=!1);let t=r.tip;!S(t)&&w(t)||(t="");const i=r.value;if(S(i)||T(i))throw new TypeError("value 值类型非法");const s=r.label,o=_(r.disable);n.push({checked:e,tip:t,value:i,label:s,disable:o})}}}return n}const kt="请使用键盘选择,请使用 Enter 键进行选择",It=!1,_t="radio",At={drawData:[],info:kt,focus:0,renderInfo:{rows:0,renderRows:0,otherInfoRows:0,allowBelow:!1,size:{width:0,height:0}},resultText:"",errorText:"",private:It,required:It,kind:_t,canCtrlCExit:It,canCtrlDExit:It,mustInfo:It,maxRows:xt(),data:[],initData(e){Rn("初始化数据"),this.reset(),R(e)?this.data=Ct(e):Object.keys(e).forEach(n=>{const t=e[n];switch(n){case"data":this.data=R(t)?Ct(t):[];break;case"info":this.info=w(t)?t:kt;break;case"resultText":this.resultText=w(t)?t:this.info||"";break;case"errorText":this.errorText=w(t)?t:this.resultText||this.info||"";break;case"private":this.private=I(t)?t:It;break;case"required":this.required=I(t)?t:It;break;case"kind":this.kind="check"===t?"check":_t;break;case"canCtrlCExit":this.canCtrlCExit=I(t)?t:It;break;case"canCtrlDExit":this.canCtrlDExit=I(t)?t:It;break;case"maxRows":this.maxRows=isFinite(t)&&Number.isInteger(t)&&t>0?t+4:xt()}});const n=this.data;for(const e in n){if(!n[e].disable)return this.focus=Number(e),!1}return!0},reset(){this.drawData.length=this.data.length=this.focus=0,this.maxRows=xt(),this.renderInfo={rows:0,renderRows:0,otherInfoRows:0,allowBelow:!1,size:{width:0,height:0}},this.info=kt,this.kind=_t,this.resultText=this.errorText="",this.private=!0,this.required=this.canCtrlCExit=this.canCtrlDExit=this.mustInfo=It}};function Tt(e){const{data:n}=At,t=process.stdout.columns-7,r=t-3,i=n[e].label.toString();return Ne(i)<=t?i:Pe(i,r,!1).concat(et)}const St=()=>{!function(){const{focus:e,drawData:n,data:t,kind:r}=At;for(let i=0,s=t.length;i<s;i++){const s=t[i];if(S(n[i])){const t=Ne(s.label.toString());n[i]={index:i,text:Tt(i),length:t,checked:"radio"!==r&&s.checked,focus:i===e,changed:!0,show:!0,disable:s.disable}}else i===e?(n[i].changed=!0,n[i].focus=!0):i!==e&&_(n[i].focus)&&(n[i].changed=!0,n[i].focus=!1)}}(),function(){const{drawData:e,renderInfo:n,focus:t}=At,{renderRows:r}=n,i=e.length;if(i===r)return void e.forEach(e=>e.show=!0);const s=i-1,o=Math.floor((r-1)/2);let a=1&r?t-o:t-o-1;a=a<0?0:a;let c=r+a-1;c>s&&(c=s,a=c-r+1);e.forEach(e=>{const{index:n}=e;n>c||n<a?e.show=!1:n===c&&n!==s||n===a&&0!==n?(e.show=!0,e.text=et):e.text===et?(e.show=!0,e.text=Tt(n)):e.show=!0})}();const{info:e,mustInfo:n,renderInfo:t,focus:r,data:i}=At,{rows:s,allowBelow:o,size:a}=t,{width:c}=a;let l=`${M}${c}D`;l+="\n".repeat(s),l+=`${M}${s}A`,l+=`${M}J`,l+=De(`${tt()} ${e} \n\n`),l+=function(){const{drawData:e,kind:n}=At;let t="";for(let r=0,i=e.length;r<i;r++){const i=e[r];i.show&&(i.focus?(t+=De(` ${"radio"===n?st():i.checked?lt():at()} ${i.text}`),t+="\n"):i.text===et?(t+=` ${et}`,t+="\n"):i.disable?(t+=De(` ${"radio"===n?Zn`⊗`:i.checked?Zn`▣`:Zn`☒`} ${Zn(i.text)}`),t+="\n"):(t+=De(` ${"radio"===n?it():i.checked?ct():ot()} ${zn(i.text||"")}`),t+="\n"))}return t}(),l+=`${M}J`,o&&(n?l+=function(){const e=process.stdout.columns-7;At.mustInfo=!1;const n="抱歉,该项至少选择一项!!!请使用空格键或是左右键切换选择状态",t=Ne(n)<e?n:Pe(n,e);return"\n".concat(he(t))}():i[r].tip?(l+="\n",l+=De(`${$e(i[r].tip)}`)):l+="\n",l+="\n"),Nn&&(l+=`${M}${c}D${M}${s}A`),on(l,!1)},Ot=q(St,66),Rt=q(St,600);function Nt(){const{data:e,renderInfo:n,maxRows:t}=At,[r,i]=[process.stdout.columns,process.stdout.rows],s=e.length;n.size={width:r,height:i};const o=n.rows=Math.max(Math.min(s+4,xt(!1),t),5),a=n.allowBelow=xt()>e.length||o>6,c=n.otherInfoRows=a?4:2;n.renderRows=o-c}async function jt(){const{data:e,required:n,kind:t,drawData:r,canCtrlCExit:i,canCtrlDExit:s}=At,o={exit:!1};return await sn((a,c)=>{const{focus:l}=At;switch(c.name){case"return":return Rn("用户已选择,返回真值告诉等待程序可终结当前输入"),"check"!==t||!n||!N(r.filter(e=>e.checked))||(At.mustInfo=!0,Ot(),!1);case"up":Rn("用户使用了键盘键的 up 键"),Dt(!1),Ot();break;case"down":Rn("用户使用了键盘键的 down 键"),Dt(),Ot();break;case"right":Rn("用户使用了键盘键的右键");case"left":Rn("用户使用了键盘键的左键");case"space":Rn("用户使用了键盘键的空格键"),"check"===t&&(e[l].checked=r[l].checked=!r[l].checked,Ot());break;case"escape":if(c?.sequence===F.repeat(2))return o.exit=!0,!0;break;default:if(Rn("用户使用了键盘键的非方向键 <",a,">, <",c,">"),_(c?.ctrl)&&("check"===At.kind&&("a"===c?.name&&(Pt(),Ot()),"z"===c?.name&&(Pt(!1),Ot()),"r"===c?.name&&(At.data.forEach(e=>{e.disable||(e.checked=!e.checked)}),At.drawData.forEach(e=>{e.disable||(e.checked=!e.checked)}),Ot())),_(i)&&"c"===c?.name||_(s)&&"d"===c?.name))return o.exit=!0,!0}return!1}),o.exit}function Pt(e=!0){At.data.forEach(n=>{n.disable||(n.checked=e)}),At.drawData.forEach(n=>{n.disable||(n.checked=e)})}function Dt(e=!0){const{focus:n,drawData:t}=At,r=t.length-1,i=e?n===r?t:[...t.slice(n+1),...t.slice(0,n+1)]:0===n?t.toReversed():[...t.slice(n),...t.slice(0,n)].toReversed();for(const e of i)if(!e.disable)return void(At.focus=e.index)}async function Gt(e,n){if(process.stdout.removeListener("resize",Lt),process.stdout.on("resize",Lt),At.initData(e))return;cn(),Rn("初始绘制问题选项"),Nt(),Ot(),Rn("绘制完成,等待用户操作");const t=await jt();on(U,!1),process.stdout.removeListener("resize",Lt);const{resultText:r,info:i,focus:s,kind:o,drawData:a,errorText:c}=At;if(ln(),un(!0),t)return void(At.private||ut(c||r||i));const l=a.filter(e=>e.checked);if(!At.private){const e="radio"===o?[a[s].text]:l.map(e=>e.text);pt(`${Xn.italic.dim(r||i)}: ${Xn(e.join("、"))}`)}const u="radio"===o?At.data[s].value:l.map(e=>At.data[e.index].value),p="radio"===o?s:l.map(e=>e.index);return"string"==n||S(n)?u:p}const Lt=q(()=>{const{drawData:e,renderInfo:n}=At,t=n.size.height;e.length=0,on(U,!1),un(),Nt(),process.stdout.rows!==t?Rt():Ot()},33);function Ft(e,n){return async function(e,n){const t=Symbol("selection");return new Promise((r,i)=>{dt.on(t,async()=>{try{const i=await Gt(e,n);dt.remove(t),r(i)}catch(e){Rn.error(e),dt.remove(t),i()}})})}(e,n)}const Mt=new Fe({name:"create a npm",type:!1}),Ht=!!Mt.type,Ut={manager:{value:"",accept:["npm","yarn","pnpm"]}};var Bt;!function(e){e.PACKAGE_JSON="package.json",e.TSCONFIG_BASE="tsconfig.base.json",e.TSCONFIG="tsconfig.json",e.TSCONFIG_TYPES="tsconfig.types.json",e.TSCONFIG_ROLLUP="tsconfig.rollup.json",e.INDEX_TS="src/index.ts",e.INDEX_JS="src/index.js",e.README="README.md",e.LICENSE="LICENSE",e.CHANGE_LOG="CHANGELOG.md",e.GIT_IGNORE=".gitignore",e.EG_INDEX_TS="eg/index.ts",e.EG_INDEX_JS="eg/index.js",e.CLEAN_PACKAGE_JSON="scripts/clean-package-json.js",e.PUB_SH="scripts/pub.sh",e.DETECT_CHANGES="scripts/detect_changes.sh",e.WORKFLOW_DISPATCH="scripts/workflow_dispatch.sh",e.CHECK_VERSION_INSTALL="scripts/check_version_install.sh",e.CI_CD=".github/workflows",e.CI_CD_PUB=".github/workflows/发布.yml",e.ROLLUP_CONFIG="rollup.config.js",e.ROLLUP_EG_CONFIG="rollup.config.eg.js",e.ESLINT_CONFIG="eslint.config.js",e.MARKDOWN_LINT=".markdownlint.json",e.PRETTIER=".prettierrc",e.PRETTIER_IGNORE=".prettierignore"}(Bt||(Bt={}));const Kt=new class{#c;#l;constructor(e=""){if(w(e)||(e=`${e}`),this.#c=Symbol(e),On[this.#c])throw new Error(`${e} 已经存在,请更换初始化命令名称,若仍想在原命令上操作,请抽离为单独的文件做数据共享`);this.#l=On[this.#c]=Dn(),[this.#l.__filename]=Ze(),this.#l.name=e||w(process.argv[1])&&process.argv.slice(1,2)[0].replace(/.*\/.*?$/,"$1")||"",Object.defineProperty(this,"#uniKey",{value:this.#c,writable:!1,enumerable:!1,configurable:!1})}get name(){return this.#l.name}get state(){return this.#l.state}isEnd(e=!1){const n=4===this.#l.state.code;return n&&_(e)&&this.end(),n}end(){return this.#l.state="end",process.exit()}error(){return this.#l.state="error",process.exit(1)}bind(e){return Pn(e,this.#l),this}run(){const e=this.#l;return qn(e),E(e.helpInfo)||Ln(e),e.hasShowVersion&&Yn(e),this}get args(){return this.#l.args}get values(){return this.#l.values.slice()}help(e,n){const t=this.#l;w(e)&&t.originalBind[e]?w(n)&&t.originalBind[e].options&&t.originalBind[e].options[n]?t.helpInfo=[e,n]:t.helpInfo=e:t.helpInfo="help",Ln(this.#l)}version(){Yn(this.#l)}}("create a npm");Kt.bind(["manager <-m> (包管理器)"]),Kt.run().isEnd(!0);const Wt=En({show:!1});async function Jt(e="好的,正在做退出前最后的工作,请稍等"){return await async function(e,n=10){if(!w(e))throw new TypeError("str 需是一个字符串");if(!isFinite(n)||n<0||n>1e4)throw new RangeError("delay 需是一个 0 到 10000 之间(不包括两端)的数值");const t=Array.from(e);if(0!==t.length){for(const r of t)await X(n),He(`当前字符 ${_e(r)} 长度为:`,r.length),He(`当前字符 ${fe.reversed(r)} 在 charCodeAt`,r.charCodeAt(0),r.charCodeAt(1),r.charCodeAt(2)),1===r.length&&C(r.charCodeAt(1))?on(r,!1):2===e.length&&e.charCodeAt(0)>=55296&&e.charCodeAt(0)<=56319&&e.charCodeAt(1)>=56320&&e.charCodeAt(1)<=57343?(on(r,!1),on(" ",!1)):2===e.length&&65039===e.charCodeAt(1)?(on(r,!1),on(" ",!1)):(on(r,!1),on(" ",!1));on()}else on()}(e),Wt.destroyed(),un(),ln(),Kt.end()}function qt(){const{manager:e}=Ut;return"pnpm"===e.value?"pnpm install --frozen-lockfile --prod=false":e.value+" ci"}function Yt(e,n,t="pkg"){r(fr["pkg"===t?"pkgFile":"rangeFile"](e),n)}function Vt(e="pkg"){Yt(Bt.PRETTIER_IGNORE,"\nnode_modules\ndist\n*.tgz\n*.zip\ncoverage\n.DS_Store\n.eg",e),Yt(Bt.PRETTIER,JSON.stringify({printWidth:80,tabWidth:2,useTabs:!1,semi:!0,singleQuote:!0,trailingComma:"all",bracketSpacing:!0,arrowParens:"avoid",endOfLine:"auto"},null,2),e)}function zt(e="pkg"){Yt(Bt.GIT_IGNORE,"\nnode_modules\ndist\n*.tgz\n*.zip\ncoverage\n.DS_Store\n.eg",e)}function Xt(e="pkg"){Yt(Bt.LICENSE,(()=>{const e=(new Date).getFullYear(),{name:n}=fr.local.author;return`# MIT License\n \nCopyright ©️ <${e}> <${n}>\n\nPermission to use, copy, modify, and/or distribute this software for any \npurpose with or without fee is hereby granted, provided that the above \ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES \nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF \nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR \nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES \nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN \nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF \nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n# MIT 许可证\n\n版权所有 ©️ [${e}] [${n}]\n\n特此免费授予任何获得本软件及相关文档文件(以下简称“软件”)副本的人不受限制地处置该软件的权利,包括不受限制地使用、复制、修改、合并、发布、分发、再许可和/或出售该软件副本的权利,并允许向其提供该软件的人这样做,但须遵守以下条件:\n\n上述版权声明和本许可声明应包含在所有副本或软件的重要部分中。\n\n软件按“原样”提供,不附带任何形式的明示或暗示的保证,包括但不限于适销性、特定用途适用性和不侵权的保证。在任何情况下,作者或版权持有人均不对因合同、侵权或其他方式引起的任何索赔、损害或其他责任负责,无论是在与软件或软件的使用或其他交易有关的任何诉讼中。`})(),e)}function Zt(e="pkg"){Yt(Bt.MARKDOWN_LINT,'{\n "MD024": false,\n "MD013": false\n}\n',e)}function Qt(e="pkg"){Yt(Bt.ESLINT_CONFIG,function(){const{dependencies:e}=fr.local,n="++++",t=e.includes("prettier"),r=e.includes("typescript");return`// eslint.config.mjs(ESM 格式)\nimport globals from 'globals'; // 全局变量(非插件,必备)\nimport js from '@eslint/js'; // 必须:核心推荐规则\n${r?"import tseslint from 'typescript-eslint'; // 必须:TypeScript 支持":n}\nimport importPlugin from 'eslint-plugin-import'; // 必须:导入导出规范\n${t?"import prettierConfig from 'eslint-config-prettier'; // 必须:关闭 Prettier 冲突规则":n}\n\n// 可选插件(按需启用)\nimport jsdocPlugin from 'eslint-plugin-jsdoc'; // 可选:JSDoc 注释\nimport unusedImportsPlugin from 'eslint-plugin-unused-imports'; // 可选:删除未使用导入\n\n${r?`import { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n \nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst tsconfigPath = resolve(__dirname, ${fr.workspace?Bt.TSCONFIG_ROLLUP:Bt.TSCONFIG});`:n}\n\nconst ignorePattern = [\n 'node_modules/',\n 'dist/',\n 'build/',\n 'coverage/',\n 'lib/',\n 'es/',\n '**/test/**', // 匹配任何目录下的 test 目录\n '**/*.test.ts', // 匹配任何目标下的 .test.ts 文件\n '**/*.spec.ts', // 匹配 .spec.ts 文件\n '**/*.min.js',\n 'pnpm-lock.yaml',\n 'package-lock.json',\n 'yarn.lock',\n '.docusaurus',\n '.wrangler',\n];\n\nexport default [\n // 0. 忽略文件配置\n {\n ignores: ignorePattern, // 优先配置忽略规则,提升性能\n },\n // 1. 基础配置(所有文件通用)\n js.configs.recommended, // 必须:ESLint 核心推荐规则\n {\n languageOptions: {\n globals: {\n ...globals.browser, // 浏览器全局变量\n ...globals.node, // Node.js 全局变量\n // React: 'readonly', // 常用于 React 项目\n // chrome: 'readonly', // 常用于 chrome 插件开发\n // NodeJS: 'readonly', // 常用语 Node 环境,其实 \`NodeJs.timeout\` 更常用\n },\n },\n },\n\n ${r?"// 2. TypeScript 配置(必须)\n ...tseslint.configs.recommended.map(config => ({\n ...config,\n files: ['src/**/*.{ts,tsx}'], // 按需配置\n // ignores: ignorePattern,\n languageOptions: {\n ...config.languageOptions,\n globals: {\n ...globals.browser,\n ...globals.node,\n ...globals.es2025, // 浏览器 + Node + ES2025 全局\n },\n // parser: tseslint.parser, // 显式指定 TS 解析器,解决接口不匹配\n parserOptions: {\n ...config.languageOptions?.parserOptions,\n tsconfigRootDir: __dirname, // ESM 获取当前配置目录\n project: [tsconfigPath], // 类型感知规则,或者指定实际的 tsconfig.json\n ecmaVersion: 'latest',\n sourceType: 'module',\n // ecmaFeatures: { jsx: true }, // 开启JSX解析,适配React\n },\n },\n plugins: {\n ...config?.plugins,\n // 需要搭配安装 eslint-import-resolver-typescript\n import: importPlugin,\n 'unused-imports': unusedImportsPlugin, // 内置未使用导入插件\n },\n settings: {\n 'import/parsers': {\n '@typescript-eslint/parser': ['.ts', '.tsx'],\n },\n 'import/resolver': {\n typescript: {\n project: tsconfigPath,\n alwaysTryTypes: true,\n },\n node: true, // 兜底 node 解析器,兼容 commonjs/esm 混合模块\n },\n },\n rules: {\n // 原生规则对 TS 语法支持极差,必须关闭\n 'no-unused-vars': 'off',\n '@typescript-eslint/no-unused-vars': [\n 'warn',\n {\n vars: 'all',\n args: 'after-used',\n argsIgnorePattern: '^_',\n varsIgnorePattern: '^_',\n },\n ],\n // 自动修复 tsconfig.json 中开启 `compilerOptions.verbatimModuleSyntax` 的类型错误提示\n '@typescript-eslint/consistent-type-imports': [\n 'error',\n {\n prefer: 'type-imports',\n disallowTypeAnnotations: false, // 禁用 在单个 import 中混合值与类型\n fixStyle: 'inline-type-imports',\n },\n ],\n 'import/order': [\n 'error',\n {\n groups: [\n 'builtin',\n 'external',\n 'internal',\n 'parent',\n 'sibling',\n 'index',\n ],\n alphabetize: {\n order: 'asc',\n caseInsensitive: true,\n },\n },\n ],\n 'import/no-duplicates': 'error',\n 'import/no-cycle': 'warn',\n // 未使用的导入规则, error 强制级别删除,联动 ts-eslint 规则\n 'unused-imports/no-unused-imports': 'error',\n 'unused-imports/no-unused-vars': 'off', // 与 '@typescript-eslint/no-unused-vars' 冲突\n },\n })),":"// 2. import 插件配置\n {\n plugins: {\n import: pluginImport,\n },\n rules: {\n ...pluginImport.configs.recommended.rules,\n 'import/no-unresolved': 'error',\n 'import/order': [\n 'error',\n {\n groups: ['builtin', 'external', 'parent', 'sibling', 'index'],\n pathGroups: [\n {\n pattern: '{react,react-dom/**}',\n group: 'external',\n position: 'before',\n },\n ],\n pathGroupsExcludedImportTypes: ['react'],\n 'newlines-between': 'always',\n alphabetize: { order: 'asc', caseInsensitive: true },\n },\n ],\n },\n },"}\n\n // 3. 可选:JSDoc 注释规范 \n {\n files: ['**/*.{js,ts,jsx,tsx}'],\n plugins: {\n jsdoc: jsdocPlugin,\n },\n rules: {\n // 基础规则\n 'jsdoc/check-alignment': 'error',\n 'jsdoc/check-param-names': 'error',\n 'jsdoc/check-tag-names': [\n 'error',\n {\n // 配置允许的标签\n definedTags: ['packageDocumentation', 'lastModified'],\n },\n ],\n 'jsdoc/check-types': 'error',\n\n ${r?"\n // TypeScript 适配规则\n 'jsdoc/no-types': 'error',\n 'jsdoc/require-param-type': 'off', // 使用 TS 类型\n 'jsdoc/require-returns-type': 'off', // 使用 TS 类型":n}\n\n // 文档质量规则\n 'jsdoc/require-description': [\n 'error',\n {\n contexts: ['TSInterfaceDeclaration', 'TSTypeAliasDeclaration'],\n },\n ],\n 'jsdoc/require-jsdoc': [\n 'warn',\n {\n require: {\n FunctionDeclaration: true,\n MethodDefinition: true,\n ClassDeclaration: true,\n },\n },\n ],\n },\n },\n\n${r?n:" // 4. 未使用导入插件\n {\n plugins: {\n 'unused-imports': pluginUnusedImports,\n },\n rules: {\n 'unused-imports/no-unused-imports': 'error',\n 'unused-imports/no-unused-vars': [\n 'warn',\n { vars: 'all', varsIgnorePattern: '^_', args: 'after-used', argsIgnorePattern: '^_' },\n ],\n },\n },"}\n\n ${t?` // ${r?4:5}. 关闭 Prettier 冲突规则(必须,用 Prettier 时)\n prettierConfig,`:n}\n // ${r?5:6} 文件特定覆盖\n {\n files: ['**/*.test.js', '**/*.spec.js'],\n languageOptions: {\n globals: {\n ...globals.mocha,\n ...globals.jest,\n },\n },\n },\n];\n`.replace(/\+{3,}\n?/gm,"")}(),e)}function er(){Yt(Bt.README,function(){const{author:e}=fr.local,{name:n,url:t}=e,r=fr.name.replace(/^@/,""),i=r.split("/");return`# ${fr.name}\n\r\n[![version](<https://img.shields.io/npm/v/${fr.name}.svg?logo=npm&logoColor=rgb(0,0,0)&label=版本号&labelColor=rgb(73,73,228)&color=rgb(0,0,0)>)](https://www.npmjs.com/package/${fr.name}) [![issues 提交](<https://img.shields.io/badge/issues-提交-rgb(255,0,63)?logo=github>)](https://github.com/${n.replace(/\s+/g,"_")}/${i[0]}/issues)\n \n## 文档地址\n\n参看 [${t}/${r}](${t}/${r})`}())}function nr(e="pkg"){Yt(Bt.ROLLUP_CONFIG,function(e){const{dependencies:n}=fr.local,t=n.includes("typescript"),r=1===fr.bin;return`${t?"// import typescript from '@rollup/plugin-typescript';\n// 使用更可控的 rollup-plugin-typescript2 代替官插 @rollup/plugin-typescript\nimport typescript from 'rollup-plugin-typescript2';":""}\nimport resolve from '@rollup/plugin-node-resolve';\nimport commonjs from '@rollup/plugin-commonjs';\nimport json from '@rollup/plugin-json';\nimport cleanup from 'rollup-plugin-cleanup';\nimport copy from 'rollup-plugin-copy';\nimport { external } from '@qqi/rollup-external';\n${r?"import license form 'rollup-plugin-license';\nimport terser from '@rollup/plugin-terser';":""}\n\nexport default {\n input: './${t?Bt.INDEX_TS:Bt.INDEX_JS}',\n output: ['es' ${r?"":", 'cjs'"} ].map(e => ({\n format: e, // 打包模式\n entryFileNames: '${r?"bin":"[name]"}.js', // 打包文件名\n preserveModules: ${r}, // 保留独立模块结构(关键)\n // preserveModulesRoot: 'src', // 保持 src 目录结构\n sourcemap: false, // 正式环境:关闭 source map\n // exports: 'named', // 导出模式\n dir: \`dist/${r?"":"${e}/"}\`,\n })),\n // 配置需要排除或包含的包\n external: external({\n ignore: ['node:']\n }),\n plugins: [\n resolve({\n extensions: ['.js', '.ts', '.jsx', '.tsx'], // 按需添加\n }),\n commonjs(),\n json(),${t?`\ntypescript({\n tsconfig: './${"pkg"===e?Bt.TSCONFIG:Bt.TSCONFIG_ROLLUP}',\n tsconfigOverride: {\n noEmit: true, // 仅允许生成类型文件\n declaration: true,\n emitDeclarationOnly: true,\n importHelpers: false, // 确保不引入 tslib\n },\n clean: true,\n }),`:""}\n cleanup(), ${r?"\nterser({\n format: {\n comments: false\n }\n }),":""}\n copy({\n targets: [\n { src: 'README.md', dest: 'dist' },\n { src: 'LICENSE', dest: 'dist' },\n ],\n }),${r?`\nlicense({\n thirdParty: {\n allow: '(MIT OR Apache-2.0 OR BSD-3-Clause)', // 仅允许这些许可证依赖\n output: {\n file: 'dist/THIRD-PARTY-LICENSES.txt',\n template: dependencies =>\n \`THIRD-PARTY LICENSE\n${"=".repeat(50)}\n\n\`.concat(\n dependencies\n ?.map(\n dep =>\n \`\${dep.name} (\${dep.version})\n${"-".repeat(30)}\n\${dep.licenseText}\n\`,\n )\n .join('\n'),\n ),\n },\n },\n }),`:""}\n ],\n};`}(e))}function tr(){Yt(Bt.CLEAN_PACKAGE_JSON,function(){i(Ue(fr.pkgFile("scripts")),{recursive:!0});const{author:e}=fr.local,n=fr.name.replace(/^@/,"").split("/"),t=n[0],{bin:r}=fr;return`import {\n pathJoin,\n readFileToJsonSync,\n writeJsonFileSync,\n ${1!==r?"getDirectoryBy,\n fileExist,":""}\n} from 'a-node-tools';\n${1!==r?"import { readdirSync } from 'node:fs';\nimport { basename, extname } from 'node:path';":""}\n\n// 原始 package.json 内容\nlet packageJson = readFileToJsonSync('./package.json');\nconst dependencies = packageJson.dependencies;\n// 移除冗余的键\n[\n 'scripts',\n 'devDependencies',\n 'lint-staged',\n 'private',\n 'dependencies',\n].forEach(key => delete packageJson[key]);\n ${1!==r?"const esPrefix = 'es'; // es 前缀\nconst cjsPrefix = 'cjs'; // cjs 前缀\nconst dtsPrefix = 'es/src'; // 类型文件的前缀\n// 查看当前打包 dist 文件路径\nconst distParentPath = getDirectoryBy('dist', 'directory');\n// <-- !!! --\x3e\n// <-- !!! --\x3e\n// <-- !!! --\x3e\n// 查看当前的源码文件路径(原则上与上面值一致)\nconst srcParentDirectory = getDirectoryBy('src', 'directory');\n// 当前 src 的路径\nconst srcDirectory = pathJoin(srcParentDirectory, 'src');\n// src 目录下的文件列表\nconst srcChildrenList = readdirSync(srcDirectory);\n// 打包的 exports\nconst exportsList = {};\n\nfor (const childrenName of srcChildrenList) {\n // 如果是测试文件则跳过\n if (\n // 剔除测试文件\n childrenName.endsWith('.test.ts') ||\n // 剔除单独配置的根文件\n childrenName.endsWith('index.ts') ||\n childrenName.endsWith('utils') ||\n // 剔除非导出模块\n ['testData.ts', 'types.ts'].includes(childrenName)\n )\n continue;\n // 文件名(不带后缀)\n const childrenBaseName = basename(childrenName, extname(childrenName));\n // 子文件/夹的路径\n const childPath = pathJoin(srcDirectory, childrenName);\n\n const childFile = fileExist(childPath); // 文件元数据\n if (!childFile) throw new RangeError(`${childrenName} 文件未能读取`);\n // 子文件是文件夹时以 index.xxx.js 为准\n if (childFile.isDirectory()) {\n exportsList[`./${childrenBaseName}`] = {\n default: `./${esPrefix}/${childrenName}/index.js`,\n import: `./${esPrefix}/${childrenName}/index.js`,\n require: `./${cjsPrefix}/${childrenName}/index.js`,\n types: `./${dtsPrefix}/${childrenName}/index.d.ts`,\n };\n } else if (childFile.isFile()) {\n exportsList[`./${childrenBaseName}`] = {\n default: `./${esPrefix}/${childrenBaseName}.js`,\n import: `./${esPrefix}/${childrenBaseName}.js`,\n require: `./${cjsPrefix}/${childrenBaseName}.js`,\n types: `./${dtsPrefix}/${childrenBaseName}.d.ts`,\n };\n } else {\n throw new RangeError(`${childrenName} 文件类型不符合要求`);\n }\n}":""}\npackageJson = {\n ...packageJson,\n ${1!==r?"main: `${cjsPrefix}/index.js`,\n module: `${esPrefix}/index.mjs`,\n types: 'index.d.ts',":""}\n author: {\n name: '${e.name}',\n email: '${e.email}',\n url: '${e.url}',\n },\n sideEffects: false, // 如果是 react 等库包,可能需要使用 ['*.css' ,'*.scss' ,'*.sass', '*.less'] 或其他\n description: '',\n license: 'MIT',\n files: [${1!==r?"cjsPrefix, esPrefix ,":""} ${0!==r?"bin.js ,":""} 'LICENSE', 'README.md'],\n exports: {\n '.': {\n import: {\n default: './index.mjs',\n types: './index.d.ts',\n },\n require: {\n default: './index.cjs',\n types: './index.d.ts',\n },\n },\n },\n keywords: ['${t}', '${n[0]}'],\n homepage: '${e.url.startsWith("http")?e.url:"https://".concat(e.url)}',\n dependencies,\n bugs: {\n url: 'https://github.com/${e.name}/${t}/issues',\n email: '${e.email}',\n },${0!==r?`\n bin: {\n ${fr.name} : './bin.js',\n },\n `:""} \n repository: {\n type: 'git',\n url: 'git+https://github.com/${e.name}/${t}.git',\n },\n publishConfig: {\n access: 'public',\n registry: 'https://registry.npmjs.org/',\n },\n browserslist: ['> 1%', 'last 2 versions'], // 浏览器兼容\n engines: {\n node: '>=18.0.0',\n },\n};\n\n{\n // 整理打包后 package.json 文件路径\n const distPackagePath = pathJoin(distParentPath, './dist/package.json');\n // 写入新的 packages.json 文件\n writeJsonFileSync(distPackagePath, packageJson);\n}\n`}())}function rr(){const{dependencies:e}=fr.local,n=e.includes("typescript");i(fr.pkgFile("eg"),{recursive:!0}),Yt(n?Bt.EG_INDEX_TS:Bt.EG_INDEX_JS,"import { sayHello } from '../src/index';\n\nsayHello(); \n")}function ir(){const e=(()=>{const e=new Date;return`${e.getFullYear()}-${e.getMonth()+1}-${e.getDate()}`})();Yt(Bt.CHANGE_LOG,`# 更新日志 📔\n\n## v0.0.0 (${e})\n`)}function sr(){const{dependencies:e}=fr.local,n=e.includes("typescript"),t=1===fr.bin;i(fr.pkgFile("src"),{recursive:!0}),Yt(n?Bt.INDEX_TS:Bt.INDEX_JS,t?'#!/usr/bin/env node\n\nconsole.log("你好");':"export function sayHello() {\n console.log('哈喽');\n }\n ")}function or(e="pkg"){Yt(Bt.TSCONFIG_BASE,' {\n "compilerOptions": {\n "allowJs": true,\n "allowSyntheticDefaultImports": true, // 设定为 true 时,模块没有指定显式的默认导出,允许 `import React from "react";` 而不是 `import * as React from "react";`\n "declaration": false, // 生成 .d.ts 类型声明文件\n // "declarationDir": "dist", // 类型声明文件输出目录\n "downlevelIteration": true, // 迭代器降级\n "esModuleInterop": true, // 兼容 CommonJS/ES Module\n "experimentalDecorators": true, // 启用装饰器\n "forceConsistentCasingInFileNames": true, // 机器适配\n "importHelpers": false, // 关键:禁用 tslib 导入\n "incremental": false, // 增量生成(嗯,不适用于经常 rm dist 场景)\n "isolatedModules": true,\n "jsx": "react-jsx", // React 17+ 的 JSX 转换(无需显式导入 React)\n "jsxImportSource": "react", // 指定 JSX 导入源\n "module": "esnext", // 模块系统(ES Module)\n "moduleResolution": "bundler", // 模块解析策略(适用于打包工具)\n "noEmit": true, // 确保 TypeScript 不生成任何 JS\n "noEmitOnError": false, // 禁止编译器生成文件\n "noUnusedLocals": false, // 未使用的块变量\n "noUnusedParameters": false, // 未使用的参数\n "resolveJsonModule": true, // 解析 JSON 模块\n "rootDir": ".", // 源码根目录\n "skipLibCheck": true, // 跳过第三方库类型检查(加速编译)\n "sourceMap": false, //\n "strict": true, // 开启严格模式(推荐)\n "target": "ESNext", // 目标 JS 版本(现代浏览器/工具支持)\n "verbatimModuleSyntax": true, // TS 5.0 + 推荐:强制 type 导入\n "preserveSymlinks": true, // 推荐 pnpm 用户添加\n "lib": ["DOM", "DOM.Iterable", "ESNext", "es5"]\n }\n }\n ',e)}function ar(e="pkg"){1!==fr.bin&&Yt(Bt.TSCONFIG_TYPES,function(e="pkg"){return`{\n "extends": "./${"pkg"===e?Bt.TSCONFIG:Bt.TSCONFIG_ROLLUP}",\n "compilerOptions": {\n "declaration": true, // 生成类型文件\n "declarationDir": "dist",\n "emitDeclarationOnly": true,\n "noEmit": false,\n "rootDir": "."\n },\n "include": ["src/"],\n "exclude": ["node_modules", "dist", "**/*.test.ts", "eg", "jest.setup.ts"]\n}\n`}(e))}function cr(){Yt(fr.workspace?Bt.TSCONFIG_ROLLUP:Bt.TSCONFIG,`{\n "extends": ".${fr.workspace?"./..":""}/${Bt.TSCONFIG_BASE}",\n "compilerOptions": {\n "rootDir": "."\n },\n "include": ["index.ts", "src/", "**.d.ts", "test/**/*.ts"],\n "exclude": ["node_modules", "dist"]\n }`)}const lr=["husky","action","rollup","typescript","eslint","prettier"],[ur]=Ze();let pr=Be(Bt.PACKAGE_JSON,"file",ur);Mt("获取到的地址为",pr),S(pr)&&(pr=process.cwd());const dr=Ke(Ue(pr,Bt.PACKAGE_JSON));Mt("获取到的数据为:",dr);const fr=new class{packagePath="";workSpaceRootPath="";pkgFile(...e){return Ue(this.packagePath,...e)}rangeFile(...e){return Ue(this.workSpaceRootPath,...e)}_name="";get name(){return this._name}set name(e){this._name=this.package.name=e;const n=e.match(/^(@(.+)\/)?(.+)$/);T(n)?Jt("未正确识别到包名"):this.workspace&&this.withRoot?S(n[2])||S(n[3])?Jt("未能正确解析到包名"):(this.workSpaceRootPath=n[2]??"",this.packagePath=`${n[2]}/packages/${n[3]}`):this.packagePath=n[3]??n[0]??""}bin=0;local={author:{name:"",email:"",url:""},dependencies:lr};package={name:"",version:"0.0.0",description:"",author:{name:"",email:"",url:""},dependencies:dr?.dependencies||{},devDependencies:dr?.devDependencies||{}};install=!1;workspace=!1;withRoot=!1;buildDevDependencies(){const{dependencies:e}=this.local,{devDependencies:n}=this.package;Mt("获取的本地的包信息",e),Mt("获取本地的");const t={},r=function(e){Object.keys(e).forEach(t=>this[t]=n?.[t]||e[t])}.bind(t);return r({"@eslint/js":"^9.39.2","@qqi/check-version":"^1.1.0","@qqi/rollup-external":"^1.1.0","@rollup/plugin-commonjs":"^29.0.0","@rollup/plugin-json":"^6.1.0","@rollup/plugin-node-resolve":"^16.0.3","@rollup/plugin-terser":"^0.4.4","@rollup/plugin-typescript":"^12.3.0",gvv:"^1.0.0",jja:"^2.4.0",pjj:"^1.0.5",rollup:"^4.55.1","rollup-plugin-cleanup":"^3.2.1","rollup-plugin-copy":"^3.5.0",vjj:"^1.0.12","@color-pen/static":"^1.1.1","@qqi/log":"^1.0.0","a-command":"^3.0.1","a-js-tools":"^2.0.1","a-node-tools":"^4.4.2","a-type-of-js":"^2.0.0","color-pen":"^3.0.0","colored-table":"^0.2.0",qqi:"^1.0.0"}),e.includes("husky")&&e.includes("prettier")&&r({husky:"^9.1.7","lint-staged":"^16.2.7"}),e.includes("eslint")&&(r({eslint:"^9.39.2","eslint-config-prettier":"^10.1.8","eslint-plugin-jsdoc":"^62.0.0",globals:"^17.0.0","@eslint/js":"^9.39.2","eslint-plugin-import":"^2.32.0","eslint-plugin-jsonc":"^2.21.0","eslint-plugin-unused-imports":"^4.3.0","eslint-import-resolver-typescript":"^4.4.4"}),e.includes("typescript")&&r({"typescript-eslint":"^8.53.0"}),e.includes("prettier")&&r({"eslint-config-prettier":"^10.1.8"})),e.includes("prettier")&&r({prettier:"^3.8.0"}),e.includes("typescript")&&r({"@types/node":"^25.0.9","@rollup/plugin-node-resolve":"^16.0.3",typescript:"^5.9.3"}),delete t.merge,Ht&&(Mt("构建的依赖图",t),Mt(`构建依赖图(${Object.keys(t).length})和原版本的 ${Object.keys(n??{}).length}`),Mt("俩者的差集",z.symmetricDifference(Object.keys(n??{}),Object.keys(t)))),t}commandParameters=Ut};async function hr(e=!0){let t=e&&Kt.args.$original[0]||"";if(Mt("当前获取的输入名称",t),E(t)&&(t=await async function(){const e=await Et({text:"您即将创建的包名",tip:"请使用空格/连字符(-)做分隔符",minLen:1,maxLen:212,verify:[{reg:/^[a-z@]/,info:"首字符应为小写英文字符或 @"},{reg:/[A-Z]/,info:"不应当有大些英文字符",inverse:!0},{reg:/^[^@].*\/.*/,info:`仅当为范围时才可以包含 ${be`/`} 符号`,inverse:!0},{reg:/.*\/.*\/.*/,info:`仅只能包含一个 ${be`/`} 符号`,inverse:!0},{reg:/^[@a-z].*@.*$/,info:`${be`@`} 仅允许在首位出现`,inverse:!0},{reg:/^[a-z0-9@/\-_.]+$/,info:`仅允许 ${be`-`}、${be`_`} 字符出现`}]});return e||await Jt("您选择退出,清稍等")}()),t=t.trim().replace(/\s+/gm,"-"),E(t)||/^[^a-z@]/.test(t)||/^[a-z0-9][a-z0-9.\-_]*\/[a-z0-9.\-_]*$/.test(t)||t.length>212||/[A-Z]/gm.test(t)||/\s/.test(t)||/.*\/.*\/.*/.test(t)||/^[@a-z].*@.*$/gm.test(t)||/^[^a-z0-9@/\-_.]+$/gm.test(t))return await async function(){const e=["重新输入","退出"],n=await Et({text:Oe("#f63")("您的输入为字符非法")+"重新输入或退出",tip:e});if(n!==e[0])return await Jt()}(),await X(100),await hr(!1);const r=await async function(e){fr.workspace=fr.withRoot=!1;!function(e){const t=We();if(null===t)return!1;const{content:r,path:i}=t,s=o(i);if("pnpm"===e){const e=Ue(s,"pnpm-workspace.yaml");if(!L(e))return!1;if(n(e,{encoding:"utf-8"}).split("\n").some(e=>e.startsWith("packages:")))return!0}if(r.workspaces){if("yarn"===e&&L(Ue(s,".yarnrc.yml")))return!0;if("npm"===e)return!0}return!1}(_n())?e.startsWith("@")&&await async function(e){const n=await Ft({info:"检测到您设定的包名中包含域",data:[{value:0,label:"独立包模式",tip:`将 ${me("直接在当前目录")} 构建包`},{value:1,label:"我就是在工作区下",tip:"抱歉,可能我判断失误,为您构建为子包"},{value:2,label:"嵌套包(工作区)模式",tip:`默认为您创建 ${me(e.replace(/@/,"").replace(/\//,"/packages/"))} 路径`}]});if(S(n))return await Jt();switch(n){case 1:gr(!0),mr(!1);break;case 2:gr(!0),mr(!0);break;default:gr(!1),mr(!1)}}(e):(gr(!0),mr(!1));const t=e.startsWith("@")?fr.withRoot?e.replace(/@/,"").replace(/\//,"/packages/"):e.replace(/^.*\/(.*)$/,"$1"):e;Mt("获取当前的目录",t);const r=Je(t);if(0==r){const n=["更换为其他名称","直接退出"],t=await Et({text:`当前目录下存在非空同名文件夹(${ye(e)})`,tip:n});return!(!S(t)&&t!==n[1])&&await Jt()}Wt.run({info:"正在检测 npm 是否有该同名包"});const s=Ht&&await In(e)||{data:void 0};if(Wt.destroyed(),Mt("获取线上的 npm 包数据",s),s.data){const n=["更改为其他名称","忽视并继续","直接退出"],t=await Et({text:Oe("#f63")`当前包名称(${be(e)})已经存在于 npm 中`,tip:n});if(S(t)||t===n[2])return await Jt();if(t===n[0])return!1}fr.name=e,-1===r&&i(t,{recursive:!0});return!0}(t);return A(r)?await hr(!1):void 0}function mr(e){fr.withRoot=Boolean(e)}function gr(e){fr.workspace=Boolean(e)}function br(){i(fr.rangeFile("scripts"),{recursive:!0}),Yt(Bt.CHECK_VERSION_INSTALL,'#!/bin/bash\n\ninstall_check_version() {\n # 在子项目的直接\n if ! npm list -g --depth=0 | grep -q " ${CHECK_VERSION}"; then \n echo "当前未全局安装 \'${CHECK_VERSION}\',即将进行安装"\n npm install ${CHECK_VERSION} --global\n else \n echo "包 ${CHECK_VERSION} 已全局安装"\n fi\n}',"range"),Yt(Bt.DETECT_CHANGES,'#!/bin/bash\n\n# 获取上一次提交的 SHA\nPREVIOUS_COMMIT=$(git rev-parse HEAD^)\nCURRENT_COMMIT=$(git rev-parse HEAD)\n\n# 获取变更的文件列表\nCHANGED_FILES=$(git diff --name-only $PREVIOUS_COMMIT $CURRENT_COMMIT)\n\n# 初始化变更的包数组\nCHANGED_PACKAGE_ARRAY=()\n\necho "开始循环调用验证函数"\n\nmain() {\n # 遍历变更的文件,找出变更的 packages 下的直接子文件夹\n for file in $CHANGED_FILES; do\n if [[ $file == packages/* ]]; then\n PACKAGE_DIR=$(echo $file | cut -d\'/\' -f2)\n # 如果其不存在于数组之中\n if [[ ! " ${CHANGED_PACKAGE_ARRAY[@]} " =~ " ${PACKAGE_DIR} " ]]; then\n CHANGED_PACKAGE_ARRAY+=("$PACKAGE_DIR") # 文件变更数组添加元素\n fi\n fi\n done\n \n # 将数组转为逗号分隔的字符串\n CHANGED_PACKAGES=$(IFS=,; echo "${CHANGED_PACKAGE_ARRAY[*]}")\n \n # 将变更的数据输出到步骤输出值中\n # echo "update_packages=$CHANGED_PACKAGES" >> $GITHUB_OUTPUT \n # 将变更的包字符串输出到环境变量\n echo "update_packages=$CHANGED_PACKAGES" >> $GITHUB_ENV\n \n printf "\\e[31m检测文件变更的包信息处理完成 \\e[m$CHANGED_PACKAGES \\n"\n}\necho "准备好了么"\nmain\necho "哈哈,执行 🎊 🎊 🎊"\n',"range"),function(){const{manager:e}=Ut;Yt(Bt.PUB_SH,`#!/bin/bash\n\n# 获取环境变量中的变更包字符串\nUPDATE_PACKAGES=$UPDATE_PACKAGES\n# 执行根路径\nREPO_ROOT=$REPO_ROOT\n# 发布异常的包\nPUB_ERROR=()\nCHECK_VERSION="@qqi/check-version"\n# 读取版本检测是否可用\nsource ./scripts/check_version_install.sh \necho "工作根路径 $REPO_ROOT"\nPACKAGES_DIR="\${REPO_ROOT}/packages"\n# 将字符串转为数组\nIFS=',' read -r -a PACKAGE_ARRAY <<< "$UPDATE_PACKAGES"\n \nupdate_version() {\n local input="$1"\n local NAME=$(echo "\${input//-/ }" | tr -s ' ') # 替换 - 为空格并删除重复的空格\n local CWD="\${PACKAGES_DIR}/$input"\n\n local tag=""\n cd $REPO_ROOT # 每次需要手动更新到根下才能正确的校验版本号\n if ! tag=$(npx "\${CHECK_VERSION}" n=\${input} 2>&1); then\n echo "未通过版本校验:$tag"\n return 0 \n fi\n echo "获取 \${NAME} 的发布标签为 \${tag}"\n\n if [ ! -d "$CWD" ]; then \n echo "进入项目 $NAME 故障,路径为 \${CWD}"\n return 0\n fi\n cd "$CWD"\n\n # 依赖安装 \n ${qt()}\n if ! ${e.value} run build; then \n echo "构建 $NAME 失败" \n PUB_ERROR+=("$input")\n return 0\n fi\n local BUILD_DIST="\${CWD}/dist"\n if [ ! -d "\${BUILD_DIST}" ]; then\n echo "未找到 $NAME dist 构建:\${BUILD_DIST}"\n PUB_ERROR+=("$input")\n return 0\n fi\n cd "\${BUILD_DIST}" \n \n echo "开始发布 $NAME npm 包 \${tag} 版本"\n if ! ${e.value} publish --provenance --access public --tag "\${tag}" --no-git-checks; then\n echo "💥💥💥 $NAME 发布到 npm 💥💥💥"\n PUB_ERROR+=("$input")\n else \n echo "🪧 $package 发布终结 🫧🫧🫧🫧🫧🫧"\n fi\n}\n\nmain() {\n # 校验版本可用情况\n if [ ! -d "$PACKAGES_DIR" ]; then\n echo "没有找到 \${PACKAGES_DIR}"\n exit 0\n fi\n echo "☁️ 来"\n install_check_version # 检查版本包安装校验\n # 遍历变更的包数组,进行 npm 包推送\n # "\${ARR[@]}" 引用数组所有元素\n # "\${!ARR[@]}" 引用数组所有索引 \${ARR[$index]}\n # "\${#ARR[@]}" 数组长度 \n for package in "\${PACKAGE_ARRAY[@]}"; do\n echo "当前执行的推送为 $package"\n update_version "$package"\n done\n\n}\n\necho "准备好了么"\nmain\nif [ \${#PUB_ERROR[@]} -gt 0 ]; then \n echo "发布包 \${PUB_ERROR[@]} 异常 "\nelse \n echo "所有发布均已成功:\${PACKAGE_ARRAY[@]}"\n echo "🚀🚀 发布成功,完结 🎉🎉 撒花 🎉🎉"\nfi`,"range")}(),Yt(Bt.WORKFLOW_DISPATCH,'#!/bin/bash\n\n# 从环境变量中获取手动触发要更新的包数据\nINPUT_PACKAGE=$INPUT_PACKAGE\n# 初始化变更的包数组\nCHANGED_PACKAGE_ARRAY=()\n# 初始化最终要更新的包的数组\nUPDATE_PACKAGE_ARRAY=()\n\n# 读取 packages 下直接子文件夹名并放入到数组 CHANGED_PACKAGE_ARRAY 中 \nwhile IFS= read -r PACKAGE_DIR; do \n PACKAGE_DIR=$(echo "${PACKAGE_DIR// /?}" | tr -s \'?\') # 保护我方空格\n CHANGED_PACKAGE_ARRAY+=("$PACKAGE_DIR")\ndone < <(find packages -mindepth 1 -maxdepth 1 -type d -exec basename {} \\;)\n\ncheck_version() {\n local input="$1"\n local NAME=$(echo "${input//-/ }" | tr -s \' \') # 替换 - 为空格并删除重复的空白字符\n echo "输入:${input}"\n echo "使用:${NAME}"\n \n # 该包是否由手动触发选择\n if [ "$INPUT_PACKAGE" = "all" ] || [ "$INPUT_PACKAGE" = "${input}" ]; then\n echo "手动触发发布且包含 ${NAME}"\n UPDATE_PACKAGE_ARRAY+=("$input")\n return 0\n else\n echo "该包 ${input} 未在手动触发选择"\n return 0\n fi\n}\n\n\nmain() {\n for PACKAGE_NAME in ${CHANGED_PACKAGE_ARRAY[@]}; do \n check_version "$PACKAGE_NAME"\n done\n\n echo "校验版本数据完毕 ${UPDATE_PACKAGE_ARRAY}"\n\n # 将数组转为逗号分隔的字符串\n UPDATE_PACKAGES=$(IFS=,; echo "${UPDATE_PACKAGE_ARRAY[*]}")\n\n # 将变更的包字符串输出到环境变量\n # echo "update_packages=$UPDATE_PACKAGES" >> $GITHUB_OUTPUT \n echo "update_packages=$UPDATE_PACKAGES" >> $GITHUB_ENV\n\n printf "\\e[38;5;164m手动触发的包为 \\e[m$UPDATE_PACKAGES \\n"\n}\necho "准备好了么"\nmain\necho "哈哈,执行 🎊 🎊 🎊"\n',"range")}function $r(){const{dependencies:e}=fr.local;e.includes("action")&&(!function(){const{manager:e}=Ut;i(fr.rangeFile(Bt.CI_CD),{recursive:!0}),Yt(Bt.CI_CD_PUB,`name: 发布到 npm\non:\n push:\n branches: '*'\n paths:\n - 'packages/**' # 主包更新\n - 'package.json' # 全局依赖\n\n workflow_dispatch: # 手动触发\n inputs:\n version:\n description: '触发原因(选填)'\n required: false\n default: '手动触发'\n ref:\n description: '分支(选填)'\n required: false\n default: ''\n type: string\n package:\n description: '子包'\n required: true\n type: choice\n options:\n - core\n - all\n default: 'all'\n \n# 新的 OpenID Connect 验证方式\n# 无需手动填写 NODE_AUTH_TOKEN 且定期更换\npermissions:\n id-token: write # 唯一必须的权限:启用 OIDC\n contents: read # write 必须,克隆代码库权限\n # packages: write\n\njobs:\n pub:\n # 在提交的代码包含 \`version\` 字样时才运行该动作\n # 或者手动触发\n name: |\n 发布到 npm\n runs-on: ubuntu-latest\n # permissions:\n # packages: write\n # contents: write\n # id-token: write\n # 复合条件判断(自动触发检查提交信息,手动触发直接放行)\n # contains 函数\n # startsWith 函数\n # endsWith 函数\n if: |\n (github.event_name == 'push' && startsWith(github.event.head_commit.message, 'version')) ||\n github.event_name == 'workflow_dispatch'\n steps:\n - name: 代码检出\n uses: actions/checkout@v4\n with:\n ref: \${{ github.event.inputs.ref || github.ref_name }}\n fetch-depth: 0\n\n - name: 初始化 Node 并设定 Node 版本\n uses: actions/setup-node@v4\n with:\n node-version: 24\n registry-url: https://registry.npmjs.org\n\n - name: clean npm auth\n run: |\n npm config delete //registry.npmjs.org/:_authToken\n rm -f ~/.npmrc\n shell: bash\n\n ${"pnpm"===e.value?"\n - name: pnpm 安装\n uses: pnpm/action-setup@v2\n with:\n version: 10\n run_install: false\n\n - name: 缓存 pnpm\n id: pnpm-store\n run: echo \"STORE_PATH=$(pnpm store path)\" >> $GITHUB_OUTPUT\n\n - name: Cache pnpm store\n uses: actions/cache@v4\n with:\n path: ${{ steps.pnpm-store.outputs.STORE_PATH }}\n key: ${{ runner.os }}-pnpm-store-${{ hashFiles('pnpm-lock.yaml') }}\n restore-keys: |\n ${{ runner.os }}-pnpm-store-\n ":"yarn"===e.value?"\n - name: yarn 安装\n uses: actions/setup-yarn@v4\n with:\n version: '1.22' \n - name: 获取 yarn 缓存路径\n id: yarn-cache-path\n run: echo \"CACHE_PATH=$(yarn cache dir)\" >> $GITHUB_OUTPUT # 获取 Yarn 全局环衬路径\n \n - name: 缓存 Yarn 依赖\n uses: actions/cache@v4\n with: \n path: ${{ steps.yarn-cache-path.outputs.CACHE_PATH }} # 缓存 Yarn 全局缓存目录\n key: ${{ runner.os }}-yarn-cache-${{ hashFiles('yarn.lock) }} # 基于 yarn.lock 哈希值生成唯一的 key\n restore-keys: |\n ${{ runner.os }}-yarn-cache # 缓存未命中时,按前缀恢复最近的缓存 \n ":""}\n \n - name: 安装全局依赖\n run: |\n ${qt()}\n chmod +x ${Bt.DETECT_CHANGES}\n chmod +x ${Bt.WORKFLOW_DISPATCH}\n chmod +x ${Bt.PUB_SH}\n\n - name: 检测子包变更情况(推送代码时触发)\n if: github.event_name == 'push'\n id: detect-changes\n run: |\n ./${Bt.DETECT_CHANGES}\n\n - name: 检测子包变更情况(手动触发时触发)\n if: github.event_name == 'workflow_dispatch'\n id: workflow-changes\n env:\n INPUT_PACKAGE: \${{ github.event.inputs.package }}\n run: |\n ./${Bt.WORKFLOW_DISPATCH}\n\n - name: 设置工作根路径\n run: |\n echo "REPO_ROOT=$(pwd)" >> $GITHUB_ENV\n\n - name: 发布到 npm\n if: \${{ env.update_packages && env.update_packages != '' }}\n env:\n NPM_CONFIG_USERCONFIG: /dev/null # 强制忽略本地配置\n UPDATE_PACKAGES: \${{ env.update_packages }}\n REPO_ROOT: \${{ env.REPO_ROOT }}\n run: |\n ./${Bt.PUB_SH}\n\n `,"range")}(),br()),e.includes("typescript")&&or("range"),Yt("README.md","# 你会更改这里的内容的\n \n毕竟,我猜你有很多话要说\n记录下来,哪怕不会有人看见\n ","range"),function(){const{dependencies:e}=fr.local,n={name:fr.name.replace(/^@(.*)\/.*$/,"$1")+"-root",version:"0.0.0",type:"module",private:!0,description:"改了这里。毕竟,你有自己的话要说",scripts:{diff:"jja pkg --diff=官方",vjj:"vjj",push:"gvv","push:version":"gvv",prepublishOnly:"pjj"},devDependencies:fr.buildDevDependencies()};e.includes("husky")&&e.includes("prettier")&&(n["lint-staged"]={"*.{js,ts}":["prettier --write"]},n.scripts.prepare="husky"),e.includes("eslint")&&(n.scripts.lint="jja cls && eslint . --fix"),e.includes("prettier")&&(n.scripts.beautify="jja cls && prettier . --write"),qe(fr.rangeFile("package.json"),n)}(),Xt("range"),e.includes("eslint")&&Qt("range"),e.includes("prettier")&&Vt("range"),Zt("range"),zt("range")}function wr(){const{dependencies:e}=fr.local;e.includes("typescript")&&(cr(),ar("range")),nr("range"),function(){const{dependencies:e}=fr.local,n=e.includes("typescript");Yt(Bt.ROLLUP_EG_CONFIG,`${n?"import typescript from '@rollup/plugin-typescript';":""}\nimport resolve from '@rollup/plugin-node-resolve';\nimport commonjs from '@rollup/plugin-commonjs';\nimport json from '@rollup/plugin-json';\nimport cleanup from 'rollup-plugin-cleanup';\nimport { external } from '@qqi/rollup-external';\n\n/** 生成 npm 文件的打包配置文件 */\nexport default {\n input: './eg/index.${n?"ts":"js"}',\n output:{\n format: 'es',\n entryFileNames: '[name].mjs',\n preserveModules: false,\n sourcemap: false,\n exports: 'named',\n dir: '.eg/',\n },\n // 配置需要排除的包\n external: external({ ignore: ['node:'] }),\n plugins: [\n resolve(),\n commonjs(),\n // 可打包 json 内容\n json(),\n ${n?`\ntypescript({\ntsconfig: './${Bt.TSCONFIG_ROLLUP}',\n}),\n`:""}\n // 去除无用代码\n cleanup(),\n ],\n};\n`)}(),er(),function(){const{manager:e}=Ut,{dependencies:n}=fr.local,t=n.includes("typescript"),r={type:"module",version:"0.0.0",name:fr.name,description:"写点什么吧,空白只本应存在于虚空",scripts:{b:`rollup --config ${Bt.ROLLUP_CONFIG}${t||1!==fr.bin?` && tsc -p ${Bt.TSCONFIG_TYPES}`:""}`,build:`${e.value} run b && ${e.value} run clean:package`,test:`jja rm .eg && rollup --config ${Bt.ROLLUP_EG_CONFIG} && node .${Bt.EG_INDEX_JS}`,"push:version":"gvv",push:"gvv",diff:"jja pkg --diff=官方",vjj:"vjj",prepublishOnly:"pjj","clean:package":"node ".concat(Bt.CLEAN_PACKAGE_JSON)},license:"MIT"};n.includes("eslint")&&(r.scripts.lint="jja cls && eslint . --fix"),n.includes("prettier")&&(r.scripts.beautify="jja cls && prettier . --write");const{description:i,...s}=r;Yt(Bt.PACKAGE_JSON,JSON.stringify(s,null,2))}(),Xt(),sr(),ir(),Yt("todo.md","# 代办\n\n"),tr(),rr()}const yr=new Fe({name:"qqi",type:!1});A(yr.type);const vr=new class{#u;#p=!0;get available(){return this.#p}constructor(e){const n=function(){const e=p();if(yr("当前获取用户主目录为",e),!e||"/"===e||e.includes("Default"))throw new Error("未能获取到主目录路径 <"+e+">");try{const n=Ue(e,"test_write"+Date.now());return Ye(n,{}),s(n),e}catch(e){return void yr.error(e)}}();if(S(n))return this.#p=!1,void(this.#u="");this.#p=!0,this.#u=Ue(n,".earthnut.dev.data",`${e}`)}read(e){if(!this.available)return null;const n=Ue(this.#u,e);return S(L(n))?{}:Ke(n)||{}}write(e,n){if(!this.available)return!1;const t=Ue(this.#u,e),r=Ue(t,"../");yr("创建的文件路径为"),i(r,{recursive:!0}),yr("写入的文件路径为:",t),yr("写入文件内容为",n);const s=Ye(t,n);return yr("写入反馈",s),s}getPath(e){return Ue(this.#u,e)}}("create-a-npm");function Er(e,n){if(!vr.available)return;const t=vr.read("config"),r=t?.author?.[n]??"";if(E(r))return;fr.local.author[n]=r;let i=!1;for(const n in e){const t=e[n];if(t.value===r){t.tip+=me`(上次使用该值)`,i=!0,e.unshift(e.splice(Number(n),1)[0]);break}}i||e.unshift({label:`${r}`,value:r,tip:"上次使用"})}function xr(e){const n=Symbol("diy");return e.push({label:"手动输入值",value:n,tip:"使用其他输入名称"}),n}async function Cr(){const e=[];await async function(e){const n=await kn("git config user.email");if(!n.success)return await Jt("获取本地的 git config user.email 出错\n".concat(n.error||n.data));const t=n.data.replace(/\n$/,"")||"";E(t)||e.push({value:t,tip:"该值从 git 全局配置读取",label:t})}(e),function(e){const{author:n}=fr.local;if(E(n.name))return;const t=`${n.name.replace(/\s+/g,"_")}@outlook.com`;e.push({value:t,label:t,tip:"该值由 name 值合成而来"})}(e),Er(e,"email");const n=xr(e);await async function(e,n){const{author:t}=fr.local,r=t.email;let i=await Ft({data:e,info:"请选择您的通讯邮箱"});if(S(i))return await Jt();G(i,e=>e===n)&&(i=await async function(){const e=await Et({text:"请输入您将配置的邮箱",maxLen:50,minLen:5,verify:[{reg:/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/,info:"需符合邮箱基本模式"}]});if(S(e))return await Jt();return e}());Ht&&Mt(we("获取当前的用户名 "),i);Mt("是否执行写入",vr.available),fr.package.author.email=t.email=i,vr.available&&r!==i&&(Mt("写入的值",fr.local),vr.write("config",fr.local))}(e,n)}async function kr(){const e=[];!function(e){const{author:n}=fr.local;if(E(n.name))return;const t=`${n.name.replace(/\s+/g,"_")}.github.io`;e.push({value:t,label:t,tip:"该值由 name 值合成而来"})}(e),Er(e,"url");const n=xr(e);await async function(e,n){const{author:t}=fr.local,r=t.url;let i=await Ft({data:e,info:"请配置您的个人网站"});if(S(i))return await Jt();G(i,e=>e===n)&&(i=await async function(){const e=await Et({text:"请输入您将配置的网址",maxLen:50,minLen:5,verify:[{reg:/^https?:\/{2}.+/,info:"需符合网址基本模式"}]});if(S(e))return await Jt();return e}());Ht&&Mt(we("获取当前的网址 "),i);Mt("是否执行写入",vr.available),fr.package.author.url=t.url=i,vr.available&&r!==i&&(Mt("写入的值",fr.local),vr.write("config",fr.local))}(e,n)}async function Ir(){const e=[];await async function(e){const n=await kn("git config user.name");if(n.success){const t=n.data?.replace(/\n$/,"")||"";E(t)||e.push({label:`${t}`,value:t,tip:"由 git 全局配置读取"})}}(e),function(e){const n=process.env.USER??process.env.USERNAME??d().username;e.push({label:`${n}`,value:n,tip:"设备用户名"})}(e);const n=xr(e);Er(e,"name"),await async function(e,n){const{author:t}=fr.local,r=t.name;let i=await Ft({data:e,info:"请选择要使用的用户名"});if(S(i))return await Jt();G(i,e=>e===n)&&(i=await async function(){const e=await Et({text:"请输入您将配置的用户名",maxLen:16});if(S(e))return await Jt();return e}());Ht&&Mt(we("获取当前的用户名 "),i);Mt("是否执行写入",vr.available),fr.package.author.name=t.name=i,vr.available&&r!==i&&(Mt("写入的值",fr.local),vr.write("config",fr.local))}(e,n)}async function _r(){const e=await async function(){const e=["name","email","url"],{local:n}=fr;if(!vr.available)return e;const t=vr.read("config");if(S(t?.author))return e;R(t?.dependencies)&&(n.dependencies=t.dependencies);const{author:r}=t,i=Object.keys(r).filter(e=>!E(r[e])&&(n.author[e]=r[e])&&!0).map(e=>({value:e,label:`${e} : ${r[e]}`,checked:!0}));if(N(i))return e;const s=await Ft({info:"以下为上次使用配置,选中的项将跳过配置",data:i,kind:"check"});return S(s)?await Jt():(Mt("选项的值",s),z.difference(e,s))}();Mt("获取需要更改的项",e),e.includes("name")&&await Ir(),e.includes("email")&&await Cr(),e.includes("url")&&await kr(),await async function(){const e=await Ft({info:"请选择开发模式",data:[{value:0,label:"仅是可用库",tip:"当前仅是使用的库,譬如:"+me`a-js-tools`},{value:1,label:"仅是可执行库",tip:"当前仅包含可执行内容,譬如:"+me`jja`},{value:2,label:"库 + bin",tip:"即包含可执行又包含可导出使用内容,譬如:"+me`qqi`}]});S(e)||(fr.bin=e)}(),await async function(){const{local:e}=fr,n=e.dependencies,t=[{value:"rollup",tip:"该项为必须项",label:"打包工具 rollup",checked:!0,disable:!0},{value:"typescript",tip:"如果使用 typescript 建议使用该项",label:"使用 "+me`typescript`,checked:n.includes("typescript")},...[["eslint",`使用代码问题工具 ${me`eslint`}`],["prettier",`格式化代码 ${me`prettier`}`],["husky",`git 提交 hook 管理 ${me`husky`}`],["action",`CI/CD 使用自动化构建、发布 ${me`github action`} `]].map(e=>({value:e[0],label:e[1],checked:n.includes(e[0])}))],r=await Ft({data:t,kind:"check",info:"请选择要使用的辅助功能"});Mt("用户选择的依赖",r),S(r)?e.dependencies=lr:(e.dependencies=r,vr.available&&(Mt("执行储存的数据",e),vr.write("config",e)))}(),await async function(){const e=["安装","跳过"],n=await Et({text:"是否安装依赖",tip:e});S(n)||n===e[1]||(fr.install=!0)}()}function Ar(){const{manager:e}=Ut,{dependencies:n}=fr.local,t=n.includes("typescript"),r={name:fr.name,version:"0.0.0",type:"module",private:!0,description:"",scripts:{b:`rollup --config ${Bt.ROLLUP_CONFIG} ${1!==fr.bin&&t?` && tsc -p ${Bt.TSCONFIG_TYPES}`:""}`,build:`jja cls rm dist && ${e.value} run b && ${e.value} run clean:package`,"clean:package":"node ".concat(Bt.CLEAN_PACKAGE_JSON),diff:"jja pkg --diff=淘宝",prepublishOnly:"pjj",push:"gvv","push:version":"gvv",test:`jja rm .eg && rollup --config ${Bt.ROLLUP_EG_CONFIG} && node .${Bt.EG_INDEX_JS}`,vjj:"vjj"},devDependencies:fr.buildDevDependencies()},i=function(e,n="scripts"){Object.keys(e).forEach(t=>{this[n]||(this[n]={}),this[n][t]=e[t]})}.bind(r);n.includes("husky")&&n.includes("prettier")&&(i({"*.{js,ts}":["prettier --write"]},"lint-staged"),i({prepare:"husky"})),n.includes("eslint")&&i({lint:"jja cls && eslint . --fix"}),n.includes("prettier")&&i({beautify:"jja cls && prettier . --write"});const{description:s,...o}=r;var a,c;a=Bt.PACKAGE_JSON,c=o,qe(fr.pkgFile(a),c)}function Tr(){const{dependencies:e}=fr.local;e.includes("action")&&(function(){const{manager:e}=Ut;i(fr.pkgFile(Bt.CI_CD),{recursive:!0}),Yt(Bt.CI_CD_PUB,`name: 发布到 npm\non:\n push:\n branches: '*'\n workflow_dispatch: # 手动触发\n inputs:\n version:\n description: '触发原因(选填)'\n required: false\n default: '手动触发'\n type: string\n ref:\n description: '发布的分支(选填)'\n required: false\n default: ''\n type: string\n\n# 新的 OpenID Connect 验证方式\n# 无需手动填写 NODE_AUTH_TOKEN 且定期更换\npermissions:\n id-token: write # 唯一必须的权限:启用 OIDC\n contents: read # write 必须,克隆代码库权限\n # packages: write\n\njobs:\n pub:\n # 在提交的代码包含 \`version\` 字样时才运行该动作\n # 或者手动触发\n name: |\n 发布到 npm\n runs-on: ubuntu-latest\n # 复合条件判断(自动触发检查提交信息,手动触发直接放行)\n # startsWith(github.event.head_commit.message, 'version')\n # contains(github.event.inputs.version, '手动触发')\n # endsWith(github.event.head_commit.message, 'version')\n if: |\n (github.event_name == 'push' && startsWith(github.event.head_commit.message, 'version')) ||\n github.event_name == 'workflow_dispatch'\n steps:\n - name: 代码检出\n uses: actions/checkout@v4\n with:\n ref: \${{ github.event.inputs.ref || github.ref_name }}\n fetch-depth: 1\n\n - name: 初始化 Node 并设定 Node 版本\n uses: actions/setup-node@v4\n with:\n node-version: 24\n registry-url: https://registry.npmjs.org\n\n - name: clean npm auth\n run: |\n npm config delete //registry.npmjs.org/:_authToken\n rm -f ~/.npmrc\n shell: bash\n\n ${"pnpm"===e.value?"\n - name: pnpm 安装\n uses: pnpm/action-setup@v2\n with:\n version: 10\n run_install: false\n\n - name: 缓存 pnpm\n id: pnpm-store\n run: echo \"STORE_PATH=$(pnpm store path)\" >> $GITHUB_OUTPUT\n\n - name: Cache pnpm store\n uses: actions/cache@v4\n with:\n path: ${{ steps.pnpm-store.outputs.STORE_PATH }}\n key: ${{ runner.os }}-pnpm-store-${{ hashFiles('pnpm-lock.yaml') }}\n restore-keys: |\n ${{ runner.os }}-pnpm-store-\n ":"yarn"===e.value?"\n - name: yarn 安装\n uses: actions/setup-yarn@v4\n with:\n version: '1.22' \n - name: 获取 yarn 缓存路径\n id: yarn-cache-path\n run: echo \"CACHE_PATH=$(yarn cache dir)\" >> $GITHUB_OUTPUT # 获取 Yarn 全局环衬路径\n \n - name: 缓存 Yarn 依赖\n uses: actions/cache@v4\n with: \n path: ${{ steps.yarn-cache-path.outputs.CACHE_PATH }} # 缓存 Yarn 全局缓存目录\n key: ${{ runner.os }}-yarn-cache-${{ hashFiles('yarn.lock) }} # 基于 yarn.lock 哈希值生成唯一的 key\n restore-keys: |\n ${{ runner.os }}-yarn-cache # 缓存未命中时,按前缀恢复最近的缓存 \n ":""}\n \n - name: 发布到 npm\n env:\n NPM_CONFIG_USERCONFIG: /dev/null # 强制忽略本地配置\n run: |\n chmod +x ./${Bt.PUB_SH}\n ./${Bt.PUB_SH}\n`)}(),function(){const{manager:e}=Ut;i(Ue(fr.pkgFile("scripts")),{recursive:!0}),Yt(Bt.PUB_SH,`#!/bin/bash\n\nCHECK_VERSION="@qqi/check-version"\n# 安装 \ninstall_check_version() {\n if ! npm list -g --depth=0 | grep -q " \${CHECK_VERSION}"; then \n echo "当前未全局安装 '\${CHECK_VERSION}',即将进行安装"\n npm install \${CHECK_VERSION} --global\n else \n echo "包 \${CHECK_VERSION} 已全局安装"\n fi\n}\n\ntag=""\ninstall_check_version\nif ! tag=$(npx "\${CHECK_VERSION}" c=. 2>&1); then\n echo "未通过版本校验:$tag"\n exit 0\nfi\necho "获取🉐发布标签为 \${tag}"\n# 依赖安装\n${qt()}\n# 构建项目\nif ! ${e.value} run build; then \n echo "构建失败" \n exit 0\nfi\n\n# 切换到构建目录\nif [ ! -d "dist" ]; then \n echo "未找到 dist 构建码"\n exit 0\nfi\n\n# 确保脚本在遇见错误时立即退出\nset -e\n\ncd "dist"\necho "开始发布 npm 包 \${tag} 版本"\nif ! ${e.value} publish --provenance --access public --tag "\${tag}" --no-git-checks; then\n echo "发布失败" \n exit 1\nfi\necho "🚀🚀 发布成功,完结 🎉🎉 撒花 🎉🎉"\n\n`)}()),e.includes("typescript")&&(or(),cr(),ar()),nr(),function(){const{dependencies:e}=fr.local,n=e.includes("typescript");Yt(Bt.ROLLUP_EG_CONFIG,`${n?"import typescript from '@rollup/plugin-typescript';":""}\nimport resolve from '@rollup/plugin-node-resolve';\nimport commonjs from '@rollup/plugin-commonjs';\nimport json from '@rollup/plugin-json';\nimport cleanup from 'rollup-plugin-cleanup';\nimport { external } from '@qqi/rollup-external';\n\n/** 生成 npm 文件的打包配置文件 */\nexport default {\n input: './${n?Bt.EG_INDEX_TS:Bt.EG_INDEX_JS}',\n output: {\n format: 'es',\n entryFileNames: '[name].mjs',\n preserveModules: false,\n sourcemap: false,\n exports: 'named',\n dir: '.eg/',\n },\n // 配置需要排除的包\n external: external({ ignore: ['node:'] }),\n plugins: [\n resolve(),\n commonjs(),\n // 可打包 json 内容\n json(),\n ${n?"typescript(),":""}\n // 去除无用代码\n cleanup(),\n ],\n};\n `)}(),er(),Ar(),Xt(),sr(),e.includes("eslint")&&Qt(),e.includes("prettier")&&Vt(),Zt(),ir(),zt(),tr(),rr()}async function Sr(){return Mt("开始构建应用"),""==fr.name?(await hr(),await _r(),void await Sr()):fr.workspace?(fr.withRoot&&$r(),void wr()):void Tr()}(async()=>{try{try{const e=Ue("test_write"+Date.now());qe(e,{}),s(e)}catch(e){return Mt.error(e),console.log(e),await Jt("您没有当前目录的写文件的权限,请确认后再试")}!function(){const e=Kt.args.$map,{manager:n}=Ut;Mt("解析元素参数",e);const t=e.manager?.value?.[0]??"";n.accept.includes(t)&&(n.value=t)}();const{manager:e}=Ut;Mt(e),await async function(){const{manager:e}=Ut;if(!v(e.value))return on($e`您选择使用 ${be(e.value)} 作为包管理器`);const n=_n(),t=Array.from(new Set([n,...e.accept])),r=await Ft({info:"请选择您使用的包管理器",data:t});if(S(r))return await Jt();e.value=r??"npm"}(),await hr(),await _r(),await Sr(),fr.install&&await async function(){const{manager:e}=Ut;await kn({code:`${e.value} install`,cwd:fr.workspace?fr.rangeFile(""):fr.pkgFile(""),printLog:!0,waiting:"请稍等,正在安装依赖"})}(),function(){const{manager:e}=Ut;on(me`创建项目完毕`),on(`请 cd 到 ${be`./${fr.workspace?fr.workSpaceRootPath:fr.packagePath}`} 目录下`),on(),fr.install||on(`执行 ${we("npm"===e.value?"npm install":"yarn"===e.value?"yarn":"pnpm install")}`);on(we`简单测试使用 ${ve`${e.value} test`}`),on(we`简单打包使用 ${ve`${e.value} run build`}`),on(me`创建项目完毕`),on()}(),await Jt("")}catch(e){Mt.error(e)}})();
package/package.json CHANGED
@@ -1,75 +1,85 @@
1
1
  {
2
2
  "name": "create-a-pkg",
3
3
  "type": "module",
4
- "version": "1.0.7",
5
- "description": "一个一键生成一个符合特定规则 <就是一个简单的代码模板库> 的 npm 包",
6
- "license": "MIT",
4
+ "version": "1.2.0",
7
5
  "devDependencies": {
8
- "@eslint/js": "^9.32.0",
9
- "@qqi/check-version": "^1.0.5",
10
- "@qqi/rollup-external": "^1.0.10",
11
- "@rollup/plugin-commonjs": "^28.0.6",
6
+ "@color-pen/static": "^1.1.1",
7
+ "@eslint/js": "^9.39.2",
8
+ "@qqi/check-version": "^1.1.0",
9
+ "@qqi/log": "^1.1.3",
10
+ "@qqi/rollup-external": "^1.1.1",
11
+ "@rollup/plugin-commonjs": "^29.0.0",
12
12
  "@rollup/plugin-json": "^6.1.0",
13
- "@rollup/plugin-node-resolve": "^16.0.1",
13
+ "@rollup/plugin-node-resolve": "^16.0.3",
14
14
  "@rollup/plugin-terser": "^0.4.4",
15
- "@rollup/plugin-typescript": "^12.1.4",
16
- "@types/node": "^24.1.0",
17
- "eslint": "^9.32.0",
15
+ "@rollup/plugin-typescript": "^12.3.0",
16
+ "@types/node": "^25.1.0",
17
+ "a-command": "^3.0.1",
18
+ "a-js-tools": "^2.0.1",
19
+ "a-node-tools": "^4.4.2",
20
+ "a-type-of-js": "^2.0.0",
21
+ "color-pen": "^3.0.0",
22
+ "colored-table": "^0.2.0",
23
+ "eslint": "^9.39.2",
18
24
  "eslint-config-prettier": "^10.1.8",
19
- "eslint-plugin-jsdoc": "^52.0.2",
20
- "globals": "^16.3.0",
21
- "gvv": "^0.1.6",
25
+ "eslint-import-resolver-typescript": "^4.4.4",
26
+ "eslint-plugin-import": "^2.32.0",
27
+ "eslint-plugin-jsdoc": "^62.5.0",
28
+ "eslint-plugin-jsonc": "^2.21.0",
29
+ "eslint-plugin-promise": "^7.2.1",
30
+ "eslint-plugin-unused-imports": "^4.3.0",
31
+ "globals": "^17.2.0",
32
+ "gvv": "^1.0.0",
22
33
  "husky": "^9.1.7",
23
- "jja": "^2.3.16",
24
- "lint-staged": "^16.1.2",
25
- "pjj": "^1.0.4",
26
- "prettier": "^3.6.2",
27
- "rollup": "^4.46.2",
34
+ "jja": "^2.4.0",
35
+ "lint-staged": "^16.2.7",
36
+ "pjj": "^1.0.5",
37
+ "prettier": "^3.8.1",
38
+ "qqi": "^1.0.0",
39
+ "rollup": "^4.57.0",
28
40
  "rollup-plugin-cleanup": "^3.2.1",
29
41
  "rollup-plugin-copy": "^3.5.0",
42
+ "rollup-plugin-license": "^3.6.0",
30
43
  "tslib": "^2.8.1",
31
- "typescript": "^5.9.2",
32
- "typescript-eslint": "^8.38.0",
33
- "vjj": "^1.0.10"
34
- },
35
- "dependencies": {
36
- "@color-pen/static": "^1.0.1",
37
- "@qqi/log": "^0.1.1",
38
- "a-command": "^2.3.15",
39
- "a-js-tools": "^1.0.10",
40
- "a-node-tools": "^4.2.19",
41
- "a-type-of-js": "^1.0.7",
42
- "color-pen": "^2.0.13",
43
- "colored-table": "^0.1.0",
44
- "qqi": "^0.1.2"
44
+ "typescript": "^5.9.3",
45
+ "typescript-eslint": "^8.54.0",
46
+ "vjj": "^1.0.12"
45
47
  },
46
48
  "author": {
47
- "name": "🥜",
48
- "email": "earthnut.dev@outlook.com",
49
+ "name": "泥豆君",
50
+ "email": "Mr.MudBean@outlook.com",
49
51
  "url": "https://earthnut.dev"
50
52
  },
53
+ "description": "一个简单的代码模板库",
54
+ "license": "MIT",
51
55
  "files": [
52
- "bin.mjs"
56
+ "bin.js",
57
+ "LICENSE",
58
+ "README.md",
59
+ "THIRD-PARTY-LICENSES.txt"
53
60
  ],
54
61
  "keywords": [
55
62
  "crate-a-npm",
56
63
  "create-a-pkg",
57
- "earthnut"
64
+ "crate a npm"
58
65
  ],
59
- "repository": {
60
- "type": "git",
61
- "url": "git+https://github.com/earthnutDev/create-a-npm.git"
62
- },
63
66
  "homepage": "https://earthnut.dev/npm/create-a-npm",
64
67
  "bugs": {
65
- "url": "https://github.com/earthnutDev/create-a-npm/issues",
66
- "email": "earthnut.dev@outlook.com"
68
+ "url": "https://github.com/MrMudBean/create-a-npm/issues",
69
+ "email": "Mr.MudBean@outlook.com"
70
+ },
71
+ "repository": {
72
+ "type": "git",
73
+ "url": "git+https://github.com/MrMudBean/create-a-npm.git"
67
74
  },
68
75
  "publishConfig": {
69
76
  "access": "public",
70
77
  "registry": "https://registry.npmjs.org/"
71
78
  },
72
79
  "bin": {
73
- "create-a-pkg": "./bin.mjs"
80
+ "create-a-pkg": "./bin.js"
81
+ },
82
+ "engines": {
83
+ "node": ">=18.0.0"
74
84
  }
75
85
  }
package/bin.mjs DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import{initializeFile as n,getDirectoryBy as e,readFileToJsonSync as t,pathJoin as s,waitingTips as i,typewrite as a,cursorAfterClear as o,cursorShow as r,colorLine as c,writeJsonFile as l,isEmptyDir as p,getNpmPkgInfo as u,runOtherCode as d,detectPackageManager as m,_p as g}from"a-node-tools";import{Dog as f}from"@qqi/log";import{isFalse as h,isUndefined as $,isBusinessEmptyString as A,isType as v,isArray as E,isEmptyArray as y,isEmptyString as _}from"a-type-of-js";import{Command as j}from"a-command";import{magentaPen as k,greenPen as b,brightRedPen as w,hexPen as R,brightBlackPen as C,cyanPen as T,brightGreenPen as P}from"color-pen";import{mkdirSync as O,writeFileSync as D,unlinkSync as N}from"node:fs";import{sleep as x,enArr as I}from"a-js-tools";import{userInfo as S}from"node:os";import{QQI as F}from"qqi";const G=new f({name:"create a npm",type:!1}),H=h(G.type),U=new j("create a npm");U.bind(["manager <-m> (包管理器)"]),U.run().isEnd(!0);const K=["husky","action","rollup","typescript","eslint","prettier"],M={manager:{value:"",accept:["npm","yarn","pnpm"]}},[q]=n();let L=e("package.json","file",q);G("获取到的地址为",L),$(L)&&(L=process.cwd());const B=t(s(L,"package.json"));G("获取到的数据为:",B);const W={cwd:"",range:"",pkgFile(...n){return s(this.cwd,...n)},rangeFile(...n){return s(this.range,...n)},get name(){return this.package.name},set name(n){this.childPkg?this.carryRange?(this.range=n.replace(/^@(.*)\/.*$/g,"$1"),this.cwd=n.replace(/@/,"").replace(/\//,"/packages/")):this.cwd=n.replace(/^.*\/(.*)$/g,"$1"):this.cwd=n,this.package.name=n},bin:0,local:{author:{name:"",email:"",url:""},dependencies:K},package:{name:"",version:"0.0.0",description:"",author:{name:"",email:"",url:""},dependencies:B?.dependencies||{},devDependencies:B?.devDependencies||{}},install:!1,carryRange:!1,childPkg:!1,buildDevDependencies(){const{dependencies:n}=this.local,{devDependencies:e,dependencies:t}=this.package;G("获取的本地的包信息",n),G("获取本地的");const s={"@qqi/check-version":e["@qqi/check-version"]||"^1.0.2","@qqi/rollup-external":e["@qqi/rollup-external"]||"^1.0.6","@rollup/plugin-commonjs":e["@rollup/plugin-commonjs"]||"^28.0.3","@rollup/plugin-json":e["@rollup/plugin-json"]||"^6.1.0","@rollup/plugin-node-resolve":e["@rollup/plugin-node-resolve"]||"^16.0.1","@rollup/plugin-terser":e["@rollup/plugin-terser"]||"^0.4.4","a-command":t["a-command"]||"^2.3.8","a-node-tools":t["a-node-tools"]||"^4.2.6",gvv:e.gvv||"^0.0.7",tslib:e.tslib||"^2.8.1",jja:e.jja||"^2.3.8",pjj:e.pjj||"^1.0.1",vjj:e.vjj||"^1.0.5",rollup:e.rollup||"^4.43.0","rollup-plugin-cleanup":e["rollup-plugin-cleanup"]||"^3.2.1","rollup-plugin-copy":e["rollup-plugin-copy"]||"^3.5.0"};return n.includes("husky")&&n.includes("prettier")&&(s.husky=e.husky||"^9.1.7",s["lint-staged"]=e["lint-staged"]||"^16.1.0"),n.includes("eslint")&&(s.eslint=e.eslint||"^9.28.0",s["eslint-plugin-jsdoc"]=e["eslint-plugin-jsdoc"]||"^51.0.1",s.globals=e.globals||"^16.2.0",s["@eslint/js"]=e["@eslint/js"]||"^9.28.0",n.includes("typescript")&&(s["typescript-eslint"]=e["typescript-eslint"]||"^8.34.0"),n.includes("prettier")&&(s["eslint-config-prettier"]=e["eslint-config-prettier"]||"^10.1.5")),n.includes("prettier")&&(s.prettier=e.prettier||"^3.5.3"),n.includes("typescript")&&(s["@types/node"]=e["@types/node"]||"^24.0.1",s["@rollup/plugin-typescript"]=e["@rollup/plugin-typescript"]||"^12.1.2",s.typescript=e.typescript||"^5.8.3"),G("构建的依赖图",s),s},commandParameters:M},Y=i({show:!1});function V(n,e){l(W.pkgFile(n),e)}async function z(n="好的,正在做退出前最后的工作,请稍等"){return await a(n),Y.destroyed(),o(),r(),c("终结线",!0),U.end()}function J(){const{manager:n}=M;return"pnpm"===n.value?"pnpm install --frozen-lockfile --prod=false":n.value+" ci"}async function Q(n){W.childPkg=W.carryRange=!1,n.startsWith("@")&&(W.childPkg=!0,await async function(n){const e=await U.selection({info:"检测到当前文件包含域",data:[{value:0,label:"子包模式",tip:`默认您是在${b(n.replace(/^@(.*)\/.*$/,"$1").concat("/packages"))}目录下`},{value:1,label:"嵌套模式",tip:`默认为您创建 ${b(n.replace(/@/,"").replace(/\//,"/packages/"))}`}]});if($(e))return await z();W.carryRange=Boolean(e)}(n));const e=n.startsWith("@")?W.carryRange?n.replace(/@/,"").replace(/\//,"/packages/"):n.replace(/^.*\/(.*)$/,"$1"):n;G("获取当前的目录",e);const t=p(e);if(0==t){const e=["更换为其他名称","直接退出"],t=await U.question({text:`当前目录下存在非空同名文件夹(${w(n)})`,tip:e});return!(!$(t)&&t!==e[1])&&await z()}Y.run({info:"正在检测 npm 是否有该同名包"});const s=H&&await u(n)||{data:void 0};if(Y.destroyed(),G("获取线上的 npm 包数据",s),s.data){const e=["更改为其他名称","忽视并继续","直接退出"],t=await U.question({text:R("#f63")`当前包名称(${k(n)})已经存在于 npm 中`,tip:e});if($(t)||t===e[2])return await z();if(t===e[0])return!1}return W.name=n,-1===t&&O(e,{recursive:!0}),!0}async function Z(n=!0){let e=n&&U.args.$original[0]||"";if(G("当前获取的输入名称",e),A(e)&&(e=await async function(){const n=await U.question({text:"您即将创建的包名",tip:"请使用空格/连字符(-)做分隔符",minLen:1,maxLen:212,verify:[{reg:/^[a-z@]/,info:"首字符应为小写英文字符或 @"},{reg:/[A-Z]/,info:"不应当有大些英文字符",inverse:!0},{reg:/^[^@].*\/.*/,info:`仅当为范围时才可以包含 ${k`/`} 符号`,inverse:!0},{reg:/.*\/.*\/.*/,info:`仅只能包含一个 ${k`/`} 符号`,inverse:!0},{reg:/^[@a-z].*@.*$/,info:`${k`@`} 仅允许在首位出现`,inverse:!0},{reg:/^[a-z0-9@/\-_.]+$/,info:`仅允许 ${k`-`}、${k`_`} 字符出现`}]});return $(n)?await z("您选择退出,清稍等"):n}()),e=e.trim().replace(/\s+/gm,"-"),A(e)||/^[^a-z@]/.test(e)||/^[a-z0-9][a-z0-9.\-_]*\/[a-z0-9.\-_]*$/.test(e)||e.length>212||/[A-Z]/gm.test(e)||/\s/.test(e)||/.*\/.*\/.*/.test(e)||/^[@a-z].*@.*$/gm.test(e)||/^[^a-z0-9@/\-_.]+$/gm.test(e))return await async function(){const n=["重新输入","退出"],e=await U.question({text:R("#f63")("您的输入为字符非法")+"重新输入或退出",tip:n});if($(e)||e===n[1])return await z()}(),await x(100),await Z(!1);const t=await Q(e);return h(t)?await Z(!1):void 0}function X(n){const e=Symbol("diy");return n.push({label:"手动输入值",value:e,tip:"使用其他输入名称"}),e}const nn=new F("create-a-npm");async function en(n,e){const{author:t}=W.local,s=t.name;let i=await U.selection({data:n,info:"请选择要使用的用户名"});if($(i))return await z();v(i,n=>n===e)&&(i=await async function(){const n=await U.question({text:"请输入您将配置的用户名",maxLen:16});return $(n)?await z():n}()),H||G(C("获取当前的用户名 "),i),G("是否执行写入",nn.available),W.package.author.name=t.name=i,nn.available&&s!==i&&(G("写入的值",W.local),nn.write("config",W.local))}function tn(n,e){if(!nn.available)return;const t=nn.read("config"),s=t?.author?.[e]??"";if(A(s))return;W.local.author[e]=s;let i=!1;for(const e in n){const t=n[e];if(t.value===s){t.tip+=b`(上次使用该值)`,i=!0,n.unshift(n.splice(Number(e),1)[0]);break}}i||n.unshift({label:`${s}`,value:s,tip:"上次使用"})}async function sn(){const n=[];await async function(n){const e=await d("git config user.name");if(e.success){const t=e.data?.replace(/\n$/,"")||"";A(t)||n.push({label:`${t}`,value:t,tip:"由 git 全局配置读取"})}}(n),function(n){const e=process.env.USER??process.env.USERNAME??S().username;n.push({label:`${e}`,value:e,tip:"设备用户名"})}(n);const e=X(n);tn(n,"name"),await en(n,e)}async function an(n,e){const{author:t}=W.local,s=t.email;let i=await U.selection({data:n,info:"请选择您的通讯邮箱"});if($(i))return await z();v(i,n=>n===e)&&(i=await async function(){const n=await U.question({text:"请输入您将配置的邮箱",maxLen:50,minLen:5,verify:[{reg:/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/,info:"需符合邮箱基本模式"}]});return $(n)?await z():n}()),H||G(C("获取当前的用户名 "),i),G("是否执行写入",nn.available),W.package.author.email=t.email=i,nn.available&&s!==i&&(G("写入的值",W.local),nn.write("config",W.local))}async function on(){const n=[];await async function(n){const e=await d("git config user.email");if(!e.success)return await z("获取本地的 git config user.email 出错\n".concat(e.error||e.data));const t=e.data.replace(/\n$/,"")||"";A(t)||n.push({value:t,tip:"该值从 git 全局配置读取",label:t})}(n),function(n){const{author:e}=W.local;if(A(e.name))return;const t=`${e.name.replace(/\s+/g,"_")}@outlook.com`;n.push({value:t,label:t,tip:"该值由 name 值合成而来"})}(n),tn(n,"email");const e=X(n);await an(n,e)}async function rn(n,e){const{author:t}=W.local,s=t.url;let i=await U.selection({data:n,info:"请配置您的个人网站"});if($(i))return await z();v(i,n=>n===e)&&(i=await async function(){const n=await U.question({text:"请输入您将配置的网址",maxLen:50,minLen:5,verify:[{reg:/^https?:\/{2}.+/,info:"需符合网址基本模式"}]});return $(n)?await z():n}()),H||G(C("获取当前的网址 "),i),G("是否执行写入",nn.available),W.package.author.url=t.url=i,nn.available&&s!==i&&(G("写入的值",W.local),nn.write("config",W.local))}async function cn(){const n=[];!function(n){const{author:e}=W.local;if(A(e.name))return;const t=`${e.name.replace(/\s+/g,"_")}.github.io`;n.push({value:t,label:t,tip:"该值由 name 值合成而来"})}(n),tn(n,"url");const e=X(n);await rn(n,e)}async function ln(){const n=await async function(){const n=["name","email","url"],{local:e}=W;if(!nn.available)return n;const t=nn.read("config");if($(t?.author))return n;E(t?.dependencies)&&(e.dependencies=t.dependencies);const{author:s}=t,i=Object.keys(s).filter(n=>!A(s[n])&&(e.author[n]=s[n])&&!0).map(n=>({value:n,label:`${n} : ${s[n]}`,checked:!0}));if(y(i))return n;const a=await U.selection({info:"以下为上次使用配置,选中的项将跳过配置",data:i,kind:"check"});return $(a)?await z():(G("选项的值",a),I.difference(n,a))}();G("获取需要更改的项",n),n.includes("name")&&await sn(),n.includes("email")&&await on(),n.includes("url")&&await cn(),await async function(){const n=await U.selection({info:"请选择开发模式",data:[{value:0,label:"仅是可用库",tip:"当前仅是使用的库,譬如:"+b`a-js-tools`},{value:1,label:"仅是可执行库",tip:"当前仅包含可执行内容,譬如:"+b`jja`},{value:2,label:"库 + bin",tip:"即包含可执行又包含可导出使用内容,譬如:"+b`qqi`}]});$(n)||(W.bin=n)}(),await async function(){const{local:n}=W,e=n.dependencies,t=[{value:"rollup",tip:"该项为必须项",label:"打包工具 rollup",checked:!0,disable:!0},{value:"typescript",tip:"如果使用 typescript 建议使用该项",label:"使用 "+b`typescript`,checked:e.includes("typescript")},...[["eslint",`使用代码问题工具 ${b`eslint`}`],["prettier",`格式化代码 ${b`prettier`}`],["husky",`git 提交 hook 管理 ${b`husky`}`],["action",`CI/CD 使用自动化构建、发布 ${b`github action`} `]].map(n=>({value:n[0],label:n[1],checked:e.includes(n[0])}))],s=await U.selection({data:t,kind:"check",info:"请选择要使用的辅助功能"});G("用户选择的依赖",s),$(s)?n.dependencies=K:(n.dependencies=s,nn.available&&(G("执行储存的数据",n),nn.write("config",n)))}(),await async function(){const n=["安装","跳过"],e=await U.question({text:"是否安装依赖",tip:n});$(e)||e===n[1]||(W.install=!0)}()}function pn(){const{dependencies:n}=W.local,e="++++",t=n.includes("prettier"),s=n.includes("typescript");return`import globals from 'globals';\nimport pluginJs from '@eslint/js';\n${t?"import tseslint from 'typescript-eslint';":e}\n${s?"import eslintConfigPrettier from 'eslint-config-prettier';":e}\nimport jsdocPlugin from 'eslint-plugin-jsdoc';\n\nexport default [\n { files: ['**/*.{js,mjs,cjs${s?".ts":""}}'] },\n { languageOptions: { globals: globals.browser } },\n pluginJs.configs.recommended,\n ${s?"...tseslint.configs.recommended,":e}\n\n {\n plugins: {\n jsdoc: jsdocPlugin,\n },\n rules: {\n // 基础规则\n 'jsdoc/check-alignment': 'error',\n 'jsdoc/check-param-names': 'error',\n 'jsdoc/check-tag-names': [\n 'error',\n {\n // 配置允许的标签\n definedTags: ['packageDocumentation'],\n },\n ],\n 'jsdoc/check-types': 'error',\n\n ${s?"\n // TypeScript 适配规则\n 'jsdoc/no-types': 'error',\n 'jsdoc/require-param-type': 'off', // 使用 TS 类型\n 'jsdoc/require-returns-type': 'off', // 使用 TS 类型":""}\n\n // 文档质量规则\n 'jsdoc/require-description': [\n 'error',\n {\n contexts: ['TSInterfaceDeclaration', 'TSTypeAliasDeclaration'],\n },\n ],\n 'jsdoc/require-jsdoc': [\n 'warn',\n {\n require: {\n FunctionDeclaration: true,\n MethodDefinition: true,\n ClassDeclaration: true,\n },\n },\n ],\n },\n },\n ${t?"eslintConfigPrettier,":e}\n];\n`.replace(/\+{3,}\n?/gm,"")}function un(){V("tsconfig.base.json",{compilerOptions:{baseUrl:".",jsx:"preserve",strict:!0,target:"ESNext",module:"ESNext",skipLibCheck:!0,esModuleInterop:!0,moduleResolution:"Bundler",allowSyntheticDefaultImports:!0,isolatedModules:!0,lib:["ESNext","DOM"],sourceMap:!1}}),V("tsconfig.json",{extends:"./tsconfig.base.json",include:["index.ts","src/**/*.ts","**.d.ts","test/**/*.ts"],exclude:["node_modules","dist"]}),V("tsconfig.types.json",{extends:"./tsconfig.base.json",compilerOptions:{emitDeclarationOnly:!0,declaration:!0,declarationDir:"dist/"},exclude:["node_modules","test","dist","eg"]})}function dn(){const{author:n}=W.local,{name:e,url:t}=n,s=W.name.replace(/^@/,""),i=s.split("/");D(W.pkgFile("README.md"),`# ${W.name}\n\r\n[![version](<https://img.shields.io/npm/v/${W.name}.svg?logo=npm&logoColor=rgb(0,0,0)&label=版本号&labelColor=rgb(73,73,228)&color=rgb(0,0,0)>)](https://www.npmjs.com/package/${W.name}) [![issues 提交](<https://img.shields.io/badge/issues-提交-rgb(255,0,63)?logo=github>)](https://github.com/${e.replace(/\s+/g,"_")}/${i[0]}/issues)\n \n## 文档地址\n\n参看 [${t}/${s}](${t}/${s})`)}const mn=()=>{const n=(new Date).getFullYear(),{name:e}=W.local.author;return`# MIT License\n \nCopyright (c) <${n}> <${e}>\n\nPermission to use, copy, modify, and/or distribute this software for any \npurpose with or without fee is hereby granted, provided that the above \ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES \nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF \nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR \nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES \nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN \nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF \nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n# MIT 许可证\n\n版权所有 (c) [${n}] [${e}]\n\n特此免费授予任何获得本软件及相关文档文件(以下简称“软件”)副本的人不受限制地处置该软件的权利,包括不受限制地使用、复制、修改、合并、发布、分发、再许可和/或出售该软件副本的权利,并允许向其提供该软件的人这样做,但须遵守以下条件:\n\n上述版权声明和本许可声明应包含在所有副本或软件的重要部分中。\n\n软件按“原样”提供,不附带任何形式的明示或暗示的保证,包括但不限于适销性、特定用途适用性和不侵权的保证。在任何情况下,作者或版权持有人均不对因合同、侵权或其他方式引起的任何索赔、损害或其他责任负责,无论是在与软件或软件的使用或其他交易有关的任何诉讼中。`};function gn(){D(W.pkgFile("LICENSE"),mn())}function fn(){const n=(()=>{const n=new Date;return`${n.getFullYear()}-${n.getMonth()+1}-${n.getDate()}`})();D(W.pkgFile("CHANGELOG.md"),`# 更新日志 📔\n\n## v0.0.0 (${n})\n`)}function hn(){const{dependencies:n}=W.local,e=n.includes("typescript")?"ts":"js";O(W.pkgFile("eg"),{recursive:!0}),D(W.pkgFile("eg/index."+e),"import { sayHello } from '../index';\n sayHello(); \n")}function $n(){const{dependencies:n}=W.local,e=n.includes("typescript");O(W.pkgFile("src"),{recursive:!0}),D(W.pkgFile("index."+(e?"ts":"js")),(0!==W.bin?"#!/usr/bin/env node\n\n":"")+"export { sayHello } from './src/index';"),D(W.pkgFile("src/index."+(e?"ts":"js")),"\n \rexport function sayHello() {\n console.log('哈喽');\n }\n ")}function An(){O(s(W.pkgFile("scripts")),{recursive:!0});const{author:n}=W.local,e=W.name.replace(/^@/,"").split("/"),t=e[0];D(W.pkgFile("scripts/clean-package-json.js"),`\nimport {\n pathJoin,\n readFileToJsonSync,\n getDirectoryBy,\n writeJsonFile,\n} from 'a-node-tools';\n\nlet packageJson = readFileToJsonSync('./package.json');\n\n['scripts', 'devDependencies', 'lint-staged', 'private'].forEach(\n key => delete packageJson[key],\n);\n\npackageJson = {\n main: 'index.cjs',\n module: 'index.mjs',\n types: 'index.d.ts',\n ...packageJson,\n publishConfig: {\n access: 'public',\n registry: 'https://registry.npmjs.org/',\n },\n files: ['index.d.ts', 'index.mjs', 'index.cjs', 'src'],\n exports: {\n '.': {\n import: {\n default: './index.mjs',\n types: './index.d.ts',\n },\n require: {\n default: './index.cjs',\n types: './index.d.ts',\n },\n },\n },\n repository: {\n type: 'git',\n url: 'git+https://github.com/${n.name}/${t}.git',\n },\n author: {\n name: '${n.name}',\n email: '${n.email}',\n url: '${n.url}',\n },\n browserslist: ['node>=18.0.0'],\n engines: {\n node: '>=18.0.0',\n },\n keywords: ['${t}', '${e[0]}'],\n homepage: '${n.url}',\n bugs: {\n url: 'https://github.com/${n.name}/${t}/issues',\n email: '${n.email}',\n },${0!==W.bin?`\n bin: {\n ${W.name} : './bin.mjs',\n },\n `:""}\n};\n\n{\n const distPath = getDirectoryBy('dist', 'directory');\n\n const distPackagePath = pathJoin(distPath, './dist/package.json');\n\n writeJsonFile(distPackagePath, packageJson);\n}\n`)}function vn(){const{dependencies:n}=W.local;n.includes("action")&&(function(){const{manager:n}=M,e=".github/workflows";O(W.pkgFile(e),{recursive:!0}),D(W.pkgFile(e,"发布.yml"),`name: 发布到 npm\non:\n push:\n branches: '*'\n workflow_dispatch: # 手动触发\n inputs:\n version:\n description: '触发原因(选填)'\n required: false\n default: '手动触发'\n type: string\n ref:\n description: '发布的分支(选填)'\n required: false\n default: ''\n type: string\n\njobs:\n pub:\n # 在提交的代码包含 \`version\` 字样时才运行该动作\n # 或者手动触发\n name: |\n 发布到 npm\n runs-on: ubuntu-latest\n permissions:\n packages: write\n contents: write\n id-token: write\n # 复合条件判断(自动触发检查提交信息,手动触发直接放行)\n # startsWith(github.event.head_commit.message, 'version')\n # contains(github.event.inputs.version, '手动触发')\n # endsWith(github.event.head_commit.message, 'version')\n if: |\n (github.event_name == 'push' && startsWith(github.event.head_commit.message, 'version')) ||\n github.event_name == 'workflow_dispatch'\n steps:\n - name: 代码检出\n uses: actions/checkout@v4\n with:\n ref: \${{ github.event.inputs.ref || github.ref_name }}\n fetch-depth: 1\n\n - name: 初始化 Node 并设定 Node 版本\n uses: actions/setup-node@v4\n with:\n node-version: 22.x\n registry-url: https://registry.npmjs.org\n ${"pnpm"===n.value?"\n - name: pnpm 安装\n uses: pnpm/action-setup@v2\n with:\n version: 10\n run_install: false\n\n - name: 缓存 pnpm\n id: pnpm-store\n run: echo \"STORE_PATH=$(pnpm store path)\" >> $GITHUB_OUTPUT\n\n - name: Cache pnpm store\n uses: actions/cache@v4\n with:\n path: ${{ steps.pnpm-store.outputs.STORE_PATH }}\n key: ${{ runner.os }}-pnpm-store-${{ hashFiles('pnpm-lock.yaml') }}\n restore-keys: |\n ${{ runner.os }}-pnpm-store-\n ":"yarn"===n.value?"\n - name: yarn 安装\n uses: actions/setup-yarn@v4\n with:\n version: '1.22' \n - name: 获取 yarn 缓存路径\n id: yarn-cache-path\n run: echo \"CACHE_PATH=$(yarn cache dir)\" >> $GITHUB_OUTPUT # 获取 Yarn 全局环衬路径\n \n - name: 缓存 Yarn 依赖\n uses: actions/cache@v4\n with: \n path: ${{ steps.yarn-cache-path.outputs.CACHE_PATH }} # 缓存 Yarn 全局缓存目录\n key: ${{ runner.os }}-yarn-cache-${{ hashFiles('yarn.lock) }} # 基于 yarn.lock 哈希值生成唯一的 key\n restore-keys: |\n ${{ runner.os }}-yarn-cache # 缓存未命中时,按前缀恢复最近的缓存 \n ":""}\n \n - name: 发布到 npm\n env:\n NODE_AUTH_TOKEN: \${{secrets.NPM_TOKEN}}\n run: |\n chmod +x ./scripts/pub.sh\n ./scripts/pub.sh\n`)}(),function(){const{manager:n}=M;O(s(W.pkgFile("scripts")),{recursive:!0}),D(W.pkgFile("scripts","pub.sh"),`#!/bin/bash\n\nCHECK_VERSION="@qqi/check-version"\n# 安装 \ninstall_check_version() {\n if ! npm list -g --depth=0 | grep -q " \${CHECK_VERSION}"; then \n echo "当前未全局安装 '\${CHECK_VERSION}',即将进行安装"\n npm install \${CHECK_VERSION} --global\n else \n echo "包 \${CHECK_VERSION} 已全局安装"\n fi\n}\n\ntag=""\ninstall_check_version\nif ! tag=$(npx "\${CHECK_VERSION}" c=. 2>&1); then\n echo "未通过版本校验:$tag"\n exit 0\nfi\necho "获取🉐发布标签为 \${tag}"\n# 依赖安装\n${J()}\n# 构建项目\nif ! ${n.value} run build; then \n echo "构建失败" \n exit 0\nfi\n\n# 切换到构建目录\nif [ ! -d "dist" ]; then \n echo "未找到 dist 构建码"\n exit 0\nfi\n\n# 确保脚本在遇见错误时立即退出\nset -e\n\ncd "dist"\necho "开始发布 npm 包 \${tag} 版本"\nif ! ${n.value} publish --provenance --access public --tag "\${tag}" --no-git-checks; then\n echo "发布失败" \n exit 1\nfi\necho "🚀🚀 发布成功,完结 🎉🎉 撒花 🎉🎉"\n\n`)}()),n.includes("typescript")&&un(),function(){const{dependencies:n}=W.local,e=n.includes("typescript");D(W.pkgFile("rollup.config.js"),`${e?"import typescript from '@rollup/plugin-typescript'":""};\nimport resolve from '@rollup/plugin-node-resolve';\nimport commonjs from '@rollup/plugin-commonjs';\nimport json from '@rollup/plugin-json';\nimport cleanup from 'rollup-plugin-cleanup';\nimport copy from 'rollup-plugin-copy';\nimport { external } from '@qqi/rollup-external';\n\nexport default {\n input: './index.${e?"ts":"js"}',\n output: ${1!==W.bin?"[\n {\n format: 'es',\n entryFileNames: '[name].mjs',\n preserveModules: true,\n sourcemap: false,\n exports: 'named',\n dir: 'dist/',\n },\n {\n format: 'cjs',\n entryFileNames: '[name].cjs',\n preserveModules: true,\n sourcemap: false,\n exports: 'named',\n dir: 'dist/',\n },\n ],":"{\n format: 'es',\n entryFileNames: '[name].mjs',\n preserveModules: false,\n sourcemap: false,\n exports: 'named',\n dir: 'dist/',\n },"}\n // 配置需要排除或包含的包\n external: external(),\n plugins: [\n resolve(),\n commonjs(),\n json(),${e?"typescript(),":""}\n cleanup(),\n copy({\n targets: [\n { src: 'README.md', dest: 'dist' },\n { src: 'LICENSE', dest: 'dist' },\n ],\n }),\n ],\n};`)}(),function(){const{dependencies:n}=W.local,e=n.includes("typescript");D(W.pkgFile("rollup.config.eg.js"),`${e?"import typescript from '@rollup/plugin-typescript';":""}\nimport resolve from '@rollup/plugin-node-resolve';\nimport commonjs from '@rollup/plugin-commonjs';\nimport json from '@rollup/plugin-json';\nimport cleanup from 'rollup-plugin-cleanup';\nimport { external } from '@qqi/rollup-external';\n\n/** 生成 npm 文件的打包配置文件 */\nexport default {\n input: './eg/index.${e?"ts":"js"}',\n output: {\n format: 'es',\n entryFileNames: '[name].mjs',\n preserveModules: false,\n sourcemap: false,\n exports: 'named',\n dir: '.eg/',\n },\n // 配置需要排除的包\n external: external({ ignore: ['node:'] }),\n plugins: [\n resolve(),\n commonjs(),\n // 可打包 json 内容\n json(),\n ${e?"typescript(),":""}\n // 去除无用代码\n cleanup(),\n ],\n};\n `)}(),dn(),function(){const{manager:n}=M,{dependencies:e}=W.local,t=e.includes("typescript"),s={name:W.name,version:"0.0.0",type:"module",private:!0,description:"",scripts:{b:"rollup --config rollup.config.js"+(1!==W.bin&&t?" && tsc -p tsconfig.types.json":""),build:`jja cls rm dist && ${n.value} run b && ${n.value} run clean:package`,"clean:package":"node scripts/clean-package-json.js",diff:"jja pkg --diff=官方",prepublishOnly:"pjj",push:"gvv","push:version":"gvv",test:"jja rm .eg && rollup --config rollup.config.eg.js && node .eg/index.mjs",vjj:"vjj"},license:"MIT",devDependencies:W.buildDevDependencies()};e.includes("husky")&&e.includes("prettier")&&(s["lint-staged"]={"*.{js,ts}":["prettier --write"]},s.scripts.prepare="husky"),e.includes("eslint")&&(s.scripts.eslint="jja cls && eslint packages"),e.includes("prettier")&&(s.scripts.prettier="jja cls && prettier . --write"),V("package.json",s)}(),gn(),$n(),n.includes("eslint")&&D(W.pkgFile("eslint.config.js"),pn()),n.includes("prettier")&&(D(W.pkgFile(".prettierignore"),"\nnode_modules\ndist\n*.tgz\ncoverage\n.DS_Store\n.eg"),D(W.pkgFile(".prettierrc"),'{\n "printWidth": 80,\n "tabWidth": 2,\n "useTabs": false,\n "semi": true,\n "singleQuote": true,\n "trailingComma": "all",\n "bracketSpacing": true,\n "arrowParens": "avoid",\n "endOfLine": "auto"\n}')),D(W.pkgFile(".markdownlint.json"),'{\n "MD024": false,\n "MD013": false\n}\n'),fn(),D(W.pkgFile(".gitignore"),"\nnode_modules\ndist\n*.tgz\ncoverage\n.DS_Store\n.eg"),An(),hn()}function En(){O(W.rangeFile("scripts"),{recursive:!0}),D(W.rangeFile("scripts/check_version_install.sh"),'#!/bin/bash\n\ninstall_check_version() {\n # 在子项目的直接\n if ! npm list -g --depth=0 | grep -q " ${CHECK_VERSION}"; then \n echo "当前未全局安装 \'${CHECK_VERSION}\',即将进行安装"\n npm install ${CHECK_VERSION} --global\n else \n echo "包 ${CHECK_VERSION} 已全局安装"\n fi\n}'),D(W.rangeFile("scripts/detect_changes.sh"),'#!/bin/bash\n\n# 获取上一次提交的 SHA\nPREVIOUS_COMMIT=$(git rev-parse HEAD^)\nCURRENT_COMMIT=$(git rev-parse HEAD)\n\n# 获取变更的文件列表\nCHANGED_FILES=$(git diff --name-only $PREVIOUS_COMMIT $CURRENT_COMMIT)\n\n# 初始化变更的包数组\nCHANGED_PACKAGE_ARRAY=()\n\necho "开始循环调用验证函数"\n\nmain() {\n # 遍历变更的文件,找出变更的 packages 下的直接子文件夹\n for file in $CHANGED_FILES; do\n if [[ $file == packages/* ]]; then\n PACKAGE_DIR=$(echo $file | cut -d\'/\' -f2)\n # 如果其不存在于数组之中\n if [[ ! " ${CHANGED_PACKAGE_ARRAY[@]} " =~ " ${PACKAGE_DIR} " ]]; then\n CHANGED_PACKAGE_ARRAY+=("$PACKAGE_DIR") # 文件变更数组添加元素\n fi\n fi\n done\n \n # 将数组转为逗号分隔的字符串\n CHANGED_PACKAGES=$(IFS=,; echo "${CHANGED_PACKAGE_ARRAY[*]}")\n \n # 将变更的数据输出到步骤输出值中\n # echo "update_packages=$CHANGED_PACKAGES" >> $GITHUB_OUTPUT \n # 将变更的包字符串输出到环境变量\n echo "update_packages=$CHANGED_PACKAGES" >> $GITHUB_ENV\n \n printf "\\e[31m检测文件变更的包信息处理完成 \\e[m$CHANGED_PACKAGES \\n"\n}\necho "准备好了么"\nmain\necho "哈哈,执行 🎊 🎊 🎊"\n'),function(){const{manager:n}=M;D(W.rangeFile("scripts/pub.sh"),`#!/bin/bash\n\n# 获取环境变量中的变更包字符串\nUPDATE_PACKAGES=$UPDATE_PACKAGES\n# 执行根路径\nREPO_ROOT=$REPO_ROOT\n# 发布异常的包\nPUB_ERROR=()\nCHECK_VERSION="@qqi/check-version"\n# 读取版本检测是否可用\nsource ./scripts/check_version_install.sh \necho "工作根路径 $REPO_ROOT"\nPACKAGES_DIR="\${REPO_ROOT}/packages"\n# 将字符串转为数组\nIFS=',' read -r -a PACKAGE_ARRAY <<< "$UPDATE_PACKAGES"\n \nupdate_version() {\n local input="$1"\n local NAME=$(echo "\${input//-/ }" | tr -s ' ') # 替换 - 为空格并删除重复的空格\n local CWD="\${PACKAGES_DIR}/$input"\n\n local tag=""\n cd $REPO_ROOT # 每次需要手动更新到根下才能正确的校验版本号\n if ! tag=$(npx "\${CHECK_VERSION}" n=\${input} 2>&1); then\n echo "未通过版本校验:$tag"\n return 0 \n fi\n echo "获取 \${NAME} 的发布标签为 \${tag}"\n\n if [ ! -d "$CWD" ]; then \n echo "进入项目 $NAME 故障,路径为 \${CWD}"\n return 0\n fi\n cd "$CWD"\n\n # 依赖安装 \n ${J()}\n if ! ${n.value} run build; then \n echo "构建 $NAME 失败" \n PUB_ERROR+=("$input")\n return 0\n fi\n local BUILD_DIST="\${CWD}/dist"\n if [ ! -d "\${BUILD_DIST}" ]; then\n echo "未找到 $NAME dist 构建:\${BUILD_DIST}"\n PUB_ERROR+=("$input")\n return 0\n fi\n cd "\${BUILD_DIST}" \n \n echo "开始发布 $NAME npm 包 \${tag} 版本"\n if ! ${n.value} publish --provenance --access public --tag "\${tag}" --no-git-checks; then\n echo "💥💥💥 $NAME 发布到 npm 💥💥💥"\n PUB_ERROR+=("$input")\n else \n echo "🪧 $package 发布终结 🫧🫧🫧🫧🫧🫧"\n fi\n}\n\nmain() {\n # 校验版本可用情况\n if [ ! -d "$PACKAGES_DIR" ]; then\n echo "没有找到 \${PACKAGES_DIR}"\n exit 0\n fi\n echo "☁️ 来"\n install_check_version # 检查版本包安装校验\n # 遍历变更的包数组,进行 npm 包推送\n # "\${ARR[@]}" 引用数组所有元素\n # "\${!ARR[@]}" 引用数组所有索引 \${ARR[$index]}\n # "\${#ARR[@]}" 数组长度 \n for package in "\${PACKAGE_ARRAY[@]}"; do\n echo "当前执行的推送为 $package"\n update_version "$package"\n done\n\n}\n\necho "准备好了么"\nmain\nif [ \${#PUB_ERROR[@]} -gt 0 ]; then \n echo "发布包 \${PUB_ERROR[@]} 异常 "\nelse \n echo "所有发布均已成功:\${PACKAGE_ARRAY[@]}"\n echo "🚀🚀 发布成功,完结 🎉🎉 撒花 🎉🎉"\nfi`)}(),D(W.rangeFile("scripts/workflow_dispatch.sh"),'#!/bin/bash\n\n# 从环境变量中获取手动触发要更新的包数据\nINPUT_PACKAGE=$INPUT_PACKAGE\n# 初始化变更的包数组\nCHANGED_PACKAGE_ARRAY=()\n# 初始化最终要更新的包的数组\nUPDATE_PACKAGE_ARRAY=()\n\n# 读取 packages 下直接子文件夹名并放入到数组 CHANGED_PACKAGE_ARRAY 中 \nwhile IFS= read -r PACKAGE_DIR; do \n PACKAGE_DIR=$(echo "${PACKAGE_DIR// /?}" | tr -s \'?\') # 保护我方空格\n CHANGED_PACKAGE_ARRAY+=("$PACKAGE_DIR")\ndone < <(find packages -mindepth 1 -maxdepth 1 -type d -exec basename {} \\;)\n\ncheck_version() {\n local input="$1"\n local NAME=$(echo "${input//-/ }" | tr -s \' \') # 替换 - 为空格并删除重复的空白字符\n echo "输入:${input}"\n echo "使用:${NAME}"\n \n # 该包是否由手动触发选择\n if [ "$INPUT_PACKAGE" = "all" ] || [ "$INPUT_PACKAGE" = "${input}" ]; then\n echo "手动触发发布且包含 ${NAME}"\n UPDATE_PACKAGE_ARRAY+=("$input")\n return 0\n else\n echo "该包 ${input} 未在手动触发选择"\n return 0\n fi\n}\n\n\nmain() {\n for PACKAGE_NAME in ${CHANGED_PACKAGE_ARRAY[@]}; do \n check_version "$PACKAGE_NAME"\n done\n\n echo "校验版本数据完毕 ${UPDATE_PACKAGE_ARRAY}"\n\n # 将数组转为逗号分隔的字符串\n UPDATE_PACKAGES=$(IFS=,; echo "${UPDATE_PACKAGE_ARRAY[*]}")\n\n # 将变更的包字符串输出到环境变量\n # echo "update_packages=$UPDATE_PACKAGES" >> $GITHUB_OUTPUT \n echo "update_packages=$UPDATE_PACKAGES" >> $GITHUB_ENV\n\n printf "\\e[38;5;164m手动触发的包为 \\e[m$UPDATE_PACKAGES \\n"\n}\necho "准备好了么"\nmain\necho "哈哈,执行 🎊 🎊 🎊"\n')}function yn(){const{dependencies:n}=W.local;n.includes("action")&&(!function(){const{manager:n}=M,e=".github/workflows";O(W.rangeFile(e),{recursive:!0}),D(W.rangeFile(e,"发布.yml"),`name: 发布到 npm\non:\n push:\n branches: '*'\n paths:\n - 'packages/**' # 主包更新\n - 'package.json' # 全局依赖\n\n workflow_dispatch: # 手动触发\n inputs:\n version:\n description: '触发原因(选填)'\n required: false\n default: '手动触发'\n ref:\n description: '分支(选填)'\n required: false\n default: ''\n type: string\n package:\n description: '子包'\n required: true\n type: choice\n options:\n - core\n - all\n default: 'all'\n\njobs:\n pub:\n # 在提交的代码包含 \`version\` 字样时才运行该动作\n # 或者手动触发\n name: |\n 发布到 npm\n runs-on: ubuntu-latest\n permissions:\n packages: write\n contents: write\n id-token: write\n # 复合条件判断(自动触发检查提交信息,手动触发直接放行)\n # contains 函数\n # startsWith 函数\n # endsWith 函数\n if: |\n (github.event_name == 'push' && startsWith(github.event.head_commit.message, 'version')) ||\n github.event_name == 'workflow_dispatch'\n steps:\n - name: 代码检出\n uses: actions/checkout@v4\n with:\n ref: \${{ github.event.inputs.ref || github.ref_name }}\n fetch-depth: 0\n\n - name: 初始化 Node 并设定 Node 版本\n uses: actions/setup-node@v4\n with:\n node-version: 22.x\n registry-url: https://registry.npmjs.org\n \n ${"pnpm"===n.value?"\n - name: pnpm 安装\n uses: pnpm/action-setup@v2\n with:\n version: 10\n run_install: false\n\n - name: 缓存 pnpm\n id: pnpm-store\n run: echo \"STORE_PATH=$(pnpm store path)\" >> $GITHUB_OUTPUT\n\n - name: Cache pnpm store\n uses: actions/cache@v4\n with:\n path: ${{ steps.pnpm-store.outputs.STORE_PATH }}\n key: ${{ runner.os }}-pnpm-store-${{ hashFiles('pnpm-lock.yaml') }}\n restore-keys: |\n ${{ runner.os }}-pnpm-store-\n ":"yarn"===n.value?"\n - name: yarn 安装\n uses: actions/setup-yarn@v4\n with:\n version: '1.22' \n - name: 获取 yarn 缓存路径\n id: yarn-cache-path\n run: echo \"CACHE_PATH=$(yarn cache dir)\" >> $GITHUB_OUTPUT # 获取 Yarn 全局环衬路径\n \n - name: 缓存 Yarn 依赖\n uses: actions/cache@v4\n with: \n path: ${{ steps.yarn-cache-path.outputs.CACHE_PATH }} # 缓存 Yarn 全局缓存目录\n key: ${{ runner.os }}-yarn-cache-${{ hashFiles('yarn.lock) }} # 基于 yarn.lock 哈希值生成唯一的 key\n restore-keys: |\n ${{ runner.os }}-yarn-cache # 缓存未命中时,按前缀恢复最近的缓存 \n ":""}\n \n - name: 安装全局依赖\n run: |\n ${J()}\n cd scripts\n chmod +x detect_changes.sh workflow_dispatch.sh pub.sh\n # chmod +x scripts/detect_changes.sh\n # chmod +x scripts/workflow_dispatch.sh\n # chmod +x scripts/pub.sh\n\n - name: 检测子包变更情况(推送代码时触发)\n if: github.event_name == 'push'\n id: detect-changes\n run: |\n ./scripts/detect_changes.sh\n\n - name: 检测子包变更情况(手动触发时触发)\n if: github.event_name == 'workflow_dispatch'\n id: workflow-changes\n env:\n INPUT_PACKAGE: \${{ github.event.inputs.package }}\n run: |\n ./scripts/workflow_dispatch.sh\n\n - name: 设置工作根路径\n run: |\n echo "REPO_ROOT=$(pwd)" >> $GITHUB_ENV\n\n - name: 发布到 npm\n if: \${{ env.update_packages && env.update_packages != '' }}\n env:\n NODE_AUTH_TOKEN: \${{ secrets.NPM_TOKEN }}\n UPDATE_PACKAGES: \${{ env.update_packages }}\n REPO_ROOT: \${{ env.REPO_ROOT }}\n run: |\n ./scripts/pub.sh\n\n `)}(),En()),n.includes("typescript")&&(D(W.rangeFile("tsconfig.json"),'{\n "extends": "./tsconfig.base.json",\n "include": [\n "packages/**/index.ts",\n "packages/**/src/**/*.ts",\n "packages/**/eg/**/*.ts"\n ],\n "exclude": [\n "node_modules",\n "packages/**/node_modules",\n "packages/**/**/*.test.ts",\n "jest.setup.ts"\n ]\n}\n'),D(W.rangeFile("tsconfig.base.json"),'{\n "compilerOptions": {\n "baseUrl": ".",\n "jsx": "preserve",\n "strict": false,\n "target": "ESNext",\n "module": "ESNext",\n "skipLibCheck": true,\n "esModuleInterop": true,\n "moduleResolution": "Bundler",\n "allowSyntheticDefaultImports": true,\n "isolatedModules": true,\n "lib": ["ESNext", "DOM"],\n "sourceMap": false\n }\n}\n')),D(W.rangeFile("README.md"),"# 你会更改这里的内容的\n \n毕竟,我猜你有很多话要说\n记录下来,哪怕不会有人看见\n "),function(){const{dependencies:n}=W.local,e={name:W.name.replace(/^@(.*)\/.*$/,"$1")+"-root",version:"0.0.0",type:"module",private:!0,description:"改了这里。毕竟,你有自己的话要说",scripts:{diff:"jja pkg --diff=官方",vjj:"vjj",push:"gvv","push:version":"gvv",prepublishOnly:"pjj"},devDependencies:W.buildDevDependencies()};n.includes("husky")&&n.includes("prettier")&&(e["lint-staged"]={"*.{js,ts}":["prettier --write"]},e.scripts.prepare="husky"),n.includes("eslint")&&(e.scripts.eslint="jja cls && eslint packages"),n.includes("prettier")&&(e.scripts.prettier="jja cls && prettier . --write"),l(W.rangeFile("package.json"),e)}(),D(W.rangeFile("LICENSE"),mn()),n.includes("eslint")&&D(W.rangeFile("eslint.config.js"),pn()),n.includes("prettier")&&(D(W.rangeFile(".prettierrc"),'{\n "printWidth": 80,\n "tabWidth": 2,\n "useTabs": false,\n "semi": true,\n "singleQuote": true,\n "trailingComma": "all",\n "bracketSpacing": true,\n "arrowParens": "avoid",\n "endOfLine": "auto"\n}'),D(W.rangeFile(".prettierignore"),"\nnode_modules\ndist\n*.tgz\ncoverage\n.DS_Store\n.eg")),D(W.rangeFile(".markdownlint.json"),'{\n "MD024": false,\n "MD013": false\n}\n'),D(W.rangeFile(".gitignore"),"\nnode_modules\ndist\n*.tgz\ncoverage\n.DS_Store\n.eg")}function _n(){const{dependencies:n}=W.local;n.includes("typescript")&&(1!==W.bin&&D(W.pkgFile("tsconfig.types.json"),'/** 该文件打包前使用 */\n{\n "extends": "../../tsconfig.base.json",\n "compilerOptions": {\n "emitDeclarationOnly": true,\n "declaration": true,\n "declarationDir": "dist/"\n // "types": ["node"],\n },\n "exclude": ["node_modules", "dist", "**/*.test.ts", "eg", "jest.setup.ts"]\n}\n'),D(W.pkgFile("tsconfig.rollup.json"),'{\n "extends": "./tsconfig.types.json",\n "compilerOptions": {\n "declarationDir": null,\n "declaration": false\n },\n "include": ["eg", "eg/*.ts", "src/**/*.ts", "./index.ts"],\n "exclude": ["node_modules", "**/*.test.ts"]\n}\n')),function(){const{dependencies:n}=W.local,e=n.includes("typescript");D(W.pkgFile("rollup.config.js"),`${e?"import typescript from '@rollup/plugin-typescript';":"+++++"}\nimport resolve from '@rollup/plugin-node-resolve';\nimport commonjs from '@rollup/plugin-commonjs';\nimport json from '@rollup/plugin-json';\nimport cleanup from 'rollup-plugin-cleanup';\nimport copy from 'rollup-plugin-copy';\nimport { external } from '@qqi/rollup-external';\n\nexport default {\n input: './index.${e?"ts":"js"}',\n output: \n ${1!==W.bin?"[{\n format: 'es',\n entryFileNames: '[name].mjs',\n preserveModules: true,\n sourcemap: false,\n exports: 'named',\n dir: 'dist/',\n },{\n format: 'cjs',\n entryFileNames: '[name].cjs',\n preserveModules: true,\n sourcemap: false,\n exports: 'named',\n dir: 'dist/',\n },],":"{\n format: 'es',\n entryFileNames: '[name].mjs',\n preserveModules: false,\n sourcemap: false,\n exports: 'named',\n dir: 'dist/',\n },"}\n // 配置需要排除的或包含包\n external: external(),\n plugins: [\n resolve(),\n commonjs(),\n json(),\n ${e?"typescript({\n tsconfig: './tsconfig.rollup.json',\n exclude: ['node_modules', 'test'],\n }),":"+++"}\n // 去除无用代码\n cleanup(),\n copy({\n targets: [\n { src: 'README.md', dest: 'dist' },\n { src: 'LICENSE', dest: 'dist' },\n ],\n }),\n ],\n};\n`.replace(/\+{2,}\n?/gm,""))}(),function(){const{dependencies:n}=W.local,e=n.includes("typescript");D(W.pkgFile("rollup.config.eg.js"),`${e?"import typescript from '@rollup/plugin-typescript';":""}\nimport resolve from '@rollup/plugin-node-resolve';\nimport commonjs from '@rollup/plugin-commonjs';\nimport json from '@rollup/plugin-json';\nimport cleanup from 'rollup-plugin-cleanup';\nimport { external } from '@qqi/rollup-external';\n\n/** 生成 npm 文件的打包配置文件 */\nexport default {\n input: './eg/index.${e?"ts":"js"}',\n output:{\n format: 'es',\n entryFileNames: '[name].mjs',\n preserveModules: false,\n sourcemap: false,\n exports: 'named',\n dir: '.eg/',\n },\n // 配置需要排除的包\n external: external({ ignore: ['node:'] }),\n plugins: [\n resolve(),\n commonjs(),\n // 可打包 json 内容\n json(),\n ${e?"\ntypescript({\ntsconfig: './tsconfig.rollup.json',\n}),\n":""}\n // 去除无用代码\n cleanup(),\n ],\n};\n`)}(),dn(),function(){const{manager:n}=M,{dependencies:e}=W.local,t=e.includes("typescript"),s={type:"module",version:"0.0.0",name:W.name,description:"写点什么吧,空白只本应存在于虚空",scripts:{b:"rollup --config rollup.config.js"+(t||1!==W.bin?" && tsc -p tsconfig.types.json":""),build:`${n.value} run b && ${n.value} run clean:package`,test:"jja rm .eg && rollup --config rollup.config.eg.js && node .eg/index.mjs","push:version":"gvv",push:"gvv",diff:"jja pkg --diff=官方",vjj:"vjj",prepublishOnly:"pjj","clean:package":"node scripts/clean-package-json.js"},license:"MIT"};l(W.pkgFile("package.json"),s)}(),gn(),$n(),fn(),D(W.pkgFile("todo.md"),"# 代办\n\n"),An(),hn()}async function jn(){return G("开始构建应用"),""==W.name?(await Z(),await ln(),void await jn()):W.childPkg?(W.carryRange&&yn(),void _n()):void vn()}(async()=>{try{try{const n=s("test_write"+Date.now());l(n,{}),N(n)}catch(n){return G.error(n),console.log(n),await z("您没有当前目录的写文件的权限,请确认后再试")}c("华丽开始分割",!0),function(){const n=U.args.$map,{manager:e}=M;G("解析元素参数",n);const t=n.manager?.value?.[0]??"";e.accept.includes(t)&&(e.value=t)}();const{manager:n}=M;G(n),_(n.value)?await async function(){const{manager:n}=M,e=m(),t=(()=>{const t=[...n.accept];if(t[0]===e)return t;for(let n=0,s=t.length;n<s;n++)if(t[n]===e){[t[0],t[n]]=[t[n],t[0]];break}return t})(),s=await U.selection({info:"请选择您使用的包管理器",data:t});n.value=s??"npm"}():g(T`您选择使用 ${k(n.value)} 作为包管理器`),await Z(),await ln(),await jn(),W.install&&await async function(){const{manager:n}=M;await d({code:`${n.value} install`,cwd:W.childPkg?W.rangeFile(""):W.pkgFile(""),printLog:!0,waiting:"请稍等,正在安装依赖"})}(),g(b`创建项目完毕`),W.childPkg?g(`请 cd 到 ${k`./${W.range}`} 目录下`):g(`请 cd 到 ${k(W.cwd)} 目录下`),g(),W.install||g(`执行 ${C("npm"===n.value?"npm install":"yarn"===n.value?"yarn":"pnpm install")}`),g(C`简单测试使用 ${P`${n.value} test`}`),g(C`简单打包使用 ${P`${n.value} run build`}`),g(b`创建项目完毕`),g(),await z("")}catch(n){G.error(n)}})();