create-a-pkg 1.0.4 → 1.0.6-test.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.
Files changed (3) hide show
  1. package/README.md +97 -0
  2. package/bin.mjs +1 -1
  3. package/package.json +23 -24
package/README.md CHANGED
@@ -24,6 +24,103 @@ npm create a-npm
24
24
  - Windows: C:\Users\`username`\earthnut.dev.data\create-a-npm\config
25
25
 
26
26
  (尚未在 windows 上进行全量测试)
27
+ 在使用 `npm create a-npm` 命令后,即开始构建步骤
28
+
29
+ - 步骤一:询问并获取输入包名
30
+ - 步骤二:校验包名是否以有 npm 同名包。如果有同名的包存在,询问是否更改、忽略或退出
31
+ - 步骤三:查找本地是否储存了相关的数据,没有信息将直接问询输入
32
+ - 步骤四:选择开发的模式(是否携带 `bin` )
33
+ - 步骤五:选择使用的辅助工具
34
+
35
+ ### 输入包名
36
+
37
+ 正常使用输入包名,该步骤不可被跳过。
38
+
39
+ - 仅接受小写英文字符和数字
40
+ - 首字符仅接受小写英文字符或 `@`
41
+ - `@` 仅可出现在首位
42
+ - 仅在首位出现 `@` 时使用 `/`
43
+ - 仅可用 `-`、`_` 作为分割符
44
+
45
+ ```bash
46
+ ▶︎ *您即将创建的包名*: 连字符(-)做分隔符
47
+ ```
48
+
49
+ 如果没有输入或是不符合要求,则将触发以下输入判断:
50
+
51
+ 输入空格、首字符非小写英文或 `@` 的提示
52
+
53
+ ```bash
54
+ ▶︎ *您即将创建的包名*: 1
55
+ 首字符应为小写英文字符或 @
56
+ ```
57
+
58
+ 非法使用 `@` 时的反馈
59
+
60
+ ```bash
61
+ ▶︎ *您即将创建的包名*: a@
62
+ @ 仅允许在首位出现
63
+ ```
64
+
65
+ 使用非法的字符
66
+
67
+ ```bash
68
+ ▶︎ *您即将创建的包名*: a、
69
+ 仅允许 -、_ 字符出现
70
+ ```
71
+
72
+ ### 校验包名
73
+
74
+ 当包名在当前执行目录下存在同名的包时,会提示更换包名或退出
75
+
76
+ ```bash
77
+ ▶︎ 当前目录下存在非空同名文件夹(create-a-npm): 更换为其他名称 直接退出
78
+ ```
79
+
80
+ 当包名在同目录下不存在同名的文件夹,开始校验该包名是否存在于 [npm](https://registry.npmjs.org/)
81
+
82
+ ```bash
83
+ ▶︎ 当前包名称(create a npm)已经存在于 npm 中: 更改为其他名称 忽视并继续 直接退出
84
+ ```
85
+
86
+ ### 使用数据
87
+
88
+ 在构建中,会用到一个用于发布者姓名的 `name` 和一个用于包通讯的 `email` 、一个用于展示的个人网址 `url`
89
+
90
+ ```bash
91
+ □ name : earthnutDev
92
+ □ email : earthnut.dev@outlook.com
93
+ □ url : https://earthnut.dev
94
+ ```
95
+
96
+ ### 选择开发模式
97
+
98
+ 完善了个人信息后就进入了开始模式选择,可以使用库模式、执行库模式或混合模式
99
+
100
+ ```bash
101
+ ▶︎ 请选择开发模式
102
+
103
+ ● 仅是可用库
104
+ ◦ 仅是可执行库
105
+ ◦ 库 + bin
106
+ ```
107
+
108
+ ### 选择使用的工具
109
+
110
+ 默认是全选的状态,且 `rollup` 状态只读
111
+
112
+ ```bash
113
+ ▣ 打包工具 rollup
114
+ ■ 使用 typescript
115
+ ■ 使用代码问题工具 eslint
116
+ ■ 格式化代码 prettier
117
+ ■ git 提交 hook 管理 husky
118
+ ■ CI/CD 使用自动化构建、发布 github action
119
+ ```
120
+
121
+ ### 是否安装依赖
122
+
123
+ 在快结束的时候会提醒是否直接安装依赖包,该步骤可被跳过。完成或跳过该步骤即完成了简单的包创建
27
124
 
28
125
  ## 📄 文档地址
29
126
 
package/bin.mjs CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{initializeFile as n,getDirectoryBy as e,readFileToJsonSync as t,pathJoin as i,waitingTips as s,typewrite as o,cursorAfterClear as a,cursorShow as r,colorLine as l,writeJsonFile as c,isEmptyDir as p,getNpmPkgInfo as u,runOtherCode as d,_p as g}from"a-node-tools";import{Dog as m}from"@qqi/log";import{isFalse as f,isUndefined as h,isBusinessEmptyString as $,isType as A,isArray as E,isEmptyArray as j}from"a-type-of-js";import{Command as v}from"a-command";import{magentaPen as _,greenPen as y,brightRedPen as k,hexPen as b,brightBlackPen as R,brightGreenPen as w}from"color-pen";import{mkdirSync as C,writeFileSync as D,unlinkSync as N}from"node:fs";import{sleep as O,enArr as x}from"a-js-tools";import{userInfo as P}from"node:os";import{QQI as I}from"qqi";const T=new m({name:"create a npm",type:!1}),S=f(T.type),F=new v("create-a-npm");F.run().isEnd(!0);const G=["husky","action","rollup","typescript","eslint","prettier"],[K]=n();let M=e("package.json","file",K);T("获取到的地址为",M),h(M)&&(M=process.cwd());const H=t(i(M,"package.json"));T("获取到的数据为:",H);const U={cwd:"",range:"",pkgFile(...n){return i(this.cwd,...n)},rangeFile(...n){return i(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:G},package:{name:"",version:"0.0.0",description:"",author:{name:"",email:"",url:""},dependencies:H?.dependencies||{},devDependencies:H?.devDependencies||{}},install:!1,carryRange:!1,childPkg:!1,buildDevDependencies(){const{dependencies:n}=this.local,{devDependencies:e,dependencies:t}=this.package;T("获取的本地的包信息",n),T("获取本地的");const i={"@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")&&(i.husky=e.husky||"^9.1.7",i["lint-staged"]=e["lint-staged"]||"^16.1.0"),n.includes("eslint")&&(i.eslint=e.eslint||"^9.28.0",i["eslint-plugin-jsdoc"]=e["eslint-plugin-jsdoc"]||"^51.0.1",i.globals=e.globals||"^16.2.0",i["@eslint/js"]=e["@eslint/js"]||"^9.28.0",n.includes("typescript")&&(i["typescript-eslint"]=e["typescript-eslint"]||"^8.34.0"),n.includes("prettier")&&(i["eslint-config-prettier"]=e["eslint-config-prettier"]||"^10.1.5")),n.includes("prettier")&&(i.prettier=e.prettier||"^3.5.3"),n.includes("typescript")&&(i["@types/node"]=e["@types/node"]||"^24.0.1",i["@rollup/plugin-typescript"]=e["@rollup/plugin-typescript"]||"^12.1.2",i.typescript=e.typescript||"^5.8.3"),T("构建的依赖图",i),i}},q=s({show:!1});function L(n,e){c(U.pkgFile(n),e)}async function W(n="好的,正在做退出前最后的工作,请稍等"){return await o(n),q.destroyed(),a(),r(),l("终结线",!0),F.end()}async function B(n){U.childPkg=U.carryRange=!1,n.startsWith("@")&&(U.childPkg=!0,await async function(n){const e=await F.selection({info:"检测到当前文件包含域",data:[{value:0,label:"子包模式",tip:`默认您是在${y(n.replace(/^@(.*)\/.*$/,"$1").concat("/packages"))}目录下`},{value:1,label:"嵌套模式",tip:`默认为您创建 ${y(n.replace(/@/,"").replace(/\//,"/packages/"))}`}]});if(h(e))return await W();U.carryRange=Boolean(e)}(n));const e=n.startsWith("@")?U.carryRange?n.replace(/@/,"").replace(/\//,"/packages/"):n.replace(/^.*\/(.*)$/,"$1"):n;T("获取当前的目录",e);const t=p(e);if(0==t){const e=["更换为其他名称","直接退出"],t=await F.question({text:`当前目录下存在非空同名文件夹(${k(n)})`,tip:e});return!(!h(t)&&t!==e[1])&&await W()}q.run({info:"正在检测 npm 是否有该同名包"});const i=S&&await u(n)||{data:void 0};if(q.destroyed(),T("获取线上的 npm 包数据",i),i.data){const e=["更改为其他名称","忽视并继续","直接退出"],t=await F.question({text:b("#f63")`当前包名称(${_(n)})已经存在于 npm 中`,tip:e});if(h(t)||t===e[2])return await W();if(t===e[0])return!1}return U.name=n,-1===t&&C(e,{recursive:!0}),!0}async function V(n=!0){let e=n&&F.args.$original[0]||"";if(T("当前获取的输入名称",e),$(e)&&(e=await async function(){const n=await F.question({text:"您即将创建的包名",tip:"请使用空格/连字符(-)做分隔符",minLen:1,maxLen:212,verify:[{reg:/^[a-z@]/,info:"首字符应为小写英文字符或 @"},{reg:/[A-Z]/,info:"不应当有大些英文字符",inverse:!0},{reg:/^[^@].*\/.*/,info:`仅当为范围时才可以包含 ${_`/`} 符号`,inverse:!0},{reg:/.*\/.*\/.*/,info:`仅只能包含一个 ${_`/`} 符号`,inverse:!0},{reg:/^[@a-z].*@.*$/,info:`${_`@`} 仅允许在首位出现`,inverse:!0},{reg:/^[a-z0-9@/\-_.]+$/,info:`仅允许 ${_`-`}、${_`_`} 字符出现`}]});return h(n)?await W("您选择退出,清稍等"):n}()),e=e.trim().replace(/\s+/gm,"-"),$(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 F.question({text:b("#f63")("您的输入为字符非法")+"重新输入或退出",tip:n});if(h(e)||e===n[1])return await W()}(),await O(100),await V(!1);const t=await B(e);return f(t)?await V(!1):void 0}function Y(n){const e=Symbol("diy");return n.push({label:"手动输入值",value:e,tip:"使用其他输入名称"}),e}const z=new I("create-a-npm");async function J(n,e){const{author:t}=U.local,i=t.name;let s=await F.selection({data:n,info:"请选择要使用的用户名"});if(h(s))return await W();A(s,(n=>n===e))&&(s=await async function(){const n=await F.question({text:"请输入您将配置的用户名",maxLen:16});return h(n)?await W():n}()),S||T(R("获取当前的用户名 "),s),T("是否执行写入",z.available),U.package.author.name=t.name=s,z.available&&i!==s&&(T("写入的值",U.local),z.write("config",U.local))}function Q(n,e){if(!z.available)return;const t=z.read("config"),i=t?.author?.[e]??"";if($(i))return;U.local.author[e]=i;let s=!1;for(const e in n){const t=n[e];if(t.value===i){t.tip+=y`(上次使用该值)`,s=!0,n.unshift(n.splice(Number(e),1)[0]);break}}s||n.unshift({label:`${i}`,value:i,tip:"上次使用"})}async function Z(){const n=[];await async function(n){const e=await d("git config user.name");if(e.success){const t=e.data?.replace(/\n$/,"")||"";$(t)||n.push({label:`${t}`,value:t,tip:"由 git 全局配置读取"})}}(n),function(n){const e=process.env.USER??process.env.USERNAME??P().username;n.push({label:`${e}`,value:e,tip:"设备用户名"})}(n);const e=Y(n);Q(n,"name"),await J(n,e)}async function X(n,e){const{author:t}=U.local,i=t.email;let s=await F.selection({data:n,info:"请选择您的通讯邮箱"});if(h(s))return await W();A(s,(n=>n===e))&&(s=await async function(){const n=await F.question({text:"请输入您将配置的邮箱",maxLen:50,minLen:5,verify:[{reg:/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/,info:"需符合邮箱基本模式"}]});return h(n)?await W():n}()),S||T(R("获取当前的用户名 "),s),T("是否执行写入",z.available),U.package.author.email=t.email=s,z.available&&i!==s&&(T("写入的值",U.local),z.write("config",U.local))}async function nn(){const n=[];await async function(n){const e=await d("git config user.email");if(!e.success)return await W("获取本地的 git config user.email 出错\n".concat(e.error||e.data));const t=e.data.replace(/\n$/,"")||"";$(t)||n.push({value:t,tip:"该值从 git 全局配置读取",label:t})}(n),function(n){const{author:e}=U.local;if($(e.name))return;const t=`${e.name.replace(/\s+/g,"_")}@outlook.com`;n.push({value:t,label:t,tip:"该值由 name 值合成而来"})}(n),Q(n,"email");const e=Y(n);await X(n,e)}async function en(n,e){const{author:t}=U.local,i=t.url;let s=await F.selection({data:n,info:"请配置您的个人网站"});if(h(s))return await W();A(s,(n=>n===e))&&(s=await async function(){const n=await F.question({text:"请输入您将配置的网址",maxLen:50,minLen:5,verify:[{reg:/^https?:\/{2}.+/,info:"需符合网址基本模式"}]});return h(n)?await W():n}()),S||T(R("获取当前的网址 "),s),T("是否执行写入",z.available),U.package.author.url=t.url=s,z.available&&i!==s&&(T("写入的值",U.local),z.write("config",U.local))}async function tn(){const n=[];!function(n){const{author:e}=U.local;if($(e.name))return;const t=`${e.name.replace(/\s+/g,"_")}.github.io`;n.push({value:t,label:t,tip:"该值由 name 值合成而来"})}(n),Q(n,"url");const e=Y(n);await en(n,e)}async function sn(){const n=await async function(){const n=["name","email","url"],{local:e}=U;if(!z.available)return n;const t=z.read("config");if(h(t?.author))return n;E(t?.dependencies)&&(e.dependencies=t.dependencies);const{author:i}=t,s=Object.keys(i).filter((n=>!$(i[n])&&(e.author[n]=i[n])&&!0)).map((n=>({value:n,label:`${n} : ${i[n]}`,checked:!0})));if(j(s))return n;const o=await F.selection({info:"以下为上次使用配置,选中的项将跳过配置",data:s,kind:"check"});return h(o)?await W():(T("选项的值",o),x.difference(n,o))}();T("获取需要更改的项",n),n.includes("name")&&await Z(),n.includes("email")&&await nn(),n.includes("url")&&await tn(),await async function(){const n=await F.selection({info:"请选择开发模式",data:[{value:0,label:"仅是可用库",tip:"当前仅是使用的库,譬如:"+y`a-js-tools`},{value:1,label:"仅是可执行库",tip:"当前仅包含可执行内容,譬如:"+y`jja`},{value:2,label:"库 + bin",tip:"即包含可执行又包含可导出使用内容,譬如:"+y`qqi`}]});h(n)||(U.bin=n)}(),await async function(){const{local:n}=U,e=n.dependencies,t=[{value:"rollup",tip:"该项为必须项",label:"打包工具 rollup",checked:!0,disable:!0},{value:"typescript",tip:"如果使用 typescript 建议使用该项",label:"使用 "+y`typescript`,checked:e.includes("typescript")},...[["eslint",`使用代码问题工具 ${y`eslint`}`],["prettier",`格式化代码 ${y`prettier`}`],["husky",`git 提交 hook 管理 ${y`husky`}`],["action",`CI/CD 使用自动化构建、发布 ${y`github action`} `]].map((n=>({value:n[0],label:n[1],checked:e.includes(n[0])})))],i=await F.selection({data:t,kind:"check",info:"请选择要使用的辅助功能"});T("用户选择的依赖",i),h(i)?n.dependencies=G:(n.dependencies=i,z.available&&(T("执行储存的数据",n),z.write("config",n)))}(),await async function(){const n=["安装","跳过"],e=await F.question({text:"是否安装依赖",tip:n});h(e)||e===n[1]||(U.install=!0)}()}function on(){const{dependencies:n}=U.local,e="++++",t=n.includes("prettier"),i=n.includes("typescript");return`import globals from 'globals';\nimport pluginJs from '@eslint/js';\n${t?"import tseslint from 'typescript-eslint';":e}\n${i?"import eslintConfigPrettier from 'eslint-config-prettier';":e}\nimport jsdocPlugin from 'eslint-plugin-jsdoc';\n\nexport default [\n { files: ['**/*.{js,mjs,cjs${i?".ts":""}}'] },\n { languageOptions: { globals: globals.browser } },\n pluginJs.configs.recommended,\n ${i?"...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 ${i?"\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 an(){L("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}}),L("tsconfig.json",{extends:"./tsconfig.base.json",include:["index.ts","src/**/*.ts","**.d.ts","test/**/*.ts"],exclude:["node_modules","dist"]}),L("tsconfig.types.json",{extends:"./tsconfig.base.json",compilerOptions:{emitDeclarationOnly:!0,declaration:!0,declarationDir:"dist/"},exclude:["node_modules","test","dist","eg"]})}function rn(){const{author:n}=U.local,{name:e,url:t}=n,i=U.name.replace(/^@/,""),s=i.split("/");D(U.pkgFile("README.md"),`# ${U.name}\n\r\n[![version](<https://img.shields.io/npm/v/${U.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/${U.name}) [![issues 提交](<https://img.shields.io/badge/issues-提交-rgb(255,0,63)?logo=github>)](https://github.com/${e.replace(/\s+/g,"_")}/${s[0]}/issues)\n \n## 文档地址\n\n参看 [${t}/${i}](${t}/${i})`)}const ln=()=>{const n=(new Date).getFullYear(),{name:e}=U.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 cn(){D(U.pkgFile("LICENSE"),ln())}function pn(){const n=(()=>{const n=new Date;return`${n.getFullYear()}-${n.getMonth()+1}-${n.getDate()}`})();D(U.pkgFile("CHANGELOG.md"),`# 更新日志 📔\n\n## v0.0.0 (${n})\n`)}function un(){const{dependencies:n}=U.local,e=n.includes("typescript")?"ts":"js";C(U.pkgFile("eg"),{recursive:!0}),D(U.pkgFile("eg/index."+e),"import { sayHello } from '../index';\n sayHello(); \n")}function dn(){const{dependencies:n}=U.local,e=n.includes("typescript");C(U.pkgFile("src"),{recursive:!0}),D(U.pkgFile("index."+(e?"ts":"js")),(0!==U.bin?"#!/usr/bin/env node\n\n":"")+"export { sayHello } from './src/index';"),D(U.pkgFile("src/index."+(e?"ts":"js")),"\n \rexport function sayHello() {\n console.log('哈喽');\n }\n ")}function gn(){C(i(U.pkgFile("scripts")),{recursive:!0});const{author:n}=U.local,e=U.name.replace(/^@/,"").split("/"),t=e[0];D(U.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!==U.bin?`\n bin: {\n ${U.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 mn(){const{dependencies:n}=U.local;n.includes("action")&&(!function(){const n=".github/workflows";C(U.pkgFile(n),{recursive:!0}),D(U.pkgFile(n,"发布.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\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")}(),C(i(U.pkgFile("scripts")),{recursive:!0}),D(U.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# 依赖安装\nnpm ci\n# 构建项目\nif ! npm 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 ! npm publish --provenance --access public --tag "${tag}"; then\n echo "发布失败" \n exit 1\nfi\necho "🚀🚀 发布成功,完结 🎉🎉 撒花 🎉🎉"\n\n')),n.includes("typescript")&&an(),function(){const{dependencies:n}=U.local,e=n.includes("typescript");D(U.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!==U.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}=U.local,e=n.includes("typescript");D(U.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 `)}(),rn(),function(){const{dependencies:n}=U.local,e=n.includes("typescript"),t={name:U.name,version:"0.0.0",type:"module",private:!0,description:"",scripts:{b:"rollup --config rollup.config.js"+(1!==U.bin&&e?" && tsc -p tsconfig.types.json":""),build:"jja cls rm dist && npm run b && npm 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:U.buildDevDependencies()};n.includes("husky")&&n.includes("prettier")&&(t["lint-staged"]={"*.{js,ts}":["prettier --write"]},t.scripts.prepare="husky"),n.includes("eslint")&&(t.scripts.eslint="jja cls && eslint packages"),n.includes("prettier")&&(t.scripts.prettier="jja cls && prettier . --write"),L("package.json",t)}(),cn(),dn(),n.includes("eslint")&&D(U.pkgFile("eslint.config.js"),on()),n.includes("prettier")&&(D(U.pkgFile(".prettierignore"),"\nnode_modules\ndist\n*.tgz\ncoverage\n.DS_Store\n.eg"),D(U.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(U.pkgFile(".markdownlint.json"),'{\n "MD024": false,\n "MD013": false\n}\n'),pn(),D(U.pkgFile(".gitignore"),"\nnode_modules\ndist\n*.tgz\ncoverage\n.DS_Store\n.eg"),gn(),un()}function fn(){C(U.rangeFile("scripts"),{recursive:!0}),D(U.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(U.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'),D(U.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 npm ci\n if ! npm 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 ! npm publish --provenance --access public --tag "${tag}" ; 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(U.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 hn(){const{dependencies:n}=U.local;n.includes("action")&&(!function(){const n=".github/workflows";C(U.rangeFile(n),{recursive:!0}),D(U.rangeFile(n,"发布.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 - name: 安装全局依赖\n run: |\n npm ci\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 ")}(),fn()),n.includes("typescript")&&(D(U.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(U.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(U.rangeFile("README.md"),"# 你会更改这里的内容的\n \n毕竟,我猜你有很多话要说\n记录下来,哪怕不会有人看见\n "),function(){const{dependencies:n}=U.local,e={name:U.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:U.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"),c(U.rangeFile("package.json"),e)}(),D(U.rangeFile("LICENSE"),ln()),n.includes("eslint")&&D(U.rangeFile("eslint.config.js"),on()),n.includes("prettier")&&(D(U.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(U.rangeFile(".prettierignore"),"\nnode_modules\ndist\n*.tgz\ncoverage\n.DS_Store\n.eg")),D(U.rangeFile(".markdownlint.json"),'{\n "MD024": false,\n "MD013": false\n}\n'),D(U.rangeFile(".gitignore"),"\nnode_modules\ndist\n*.tgz\ncoverage\n.DS_Store\n.eg")}function $n(){const{dependencies:n}=U.local;n.includes("typescript")&&(1!==U.bin&&D(U.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(U.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}=U.local,e=n.includes("typescript");D(U.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!==U.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}=U.local,e=n.includes("typescript");D(U.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`)}(),rn(),function(){const{dependencies:n}=U.local,e=n.includes("typescript"),t={type:"module",version:"0.0.0",name:U.name,description:"写点什么吧,空白只本应存在于虚空",scripts:{b:"rollup --config rollup.config.js"+(e||1!==U.bin?" && tsc -p tsconfig.types.json":""),build:"npm run b && npm 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"};c(U.pkgFile("package.json"),t)}(),cn(),dn(),pn(),D(U.pkgFile("todo.md"),"# 代办\n\n"),gn(),un()}async function An(){return T("开始构建应用"),""==U.name?(await V(),await sn(),void await An()):U.childPkg?(U.carryRange&&hn(),void $n()):void mn()}(async()=>{try{try{const n=i("test_write"+Date.now());c(n,{}),N(n)}catch(n){return T.error(n),console.log(n),await W("您没有当前目录的写文件的权限,请确认后再试")}l("华丽开始分割",!0),await V(),await sn(),await An(),U.install&&await async function(){U.childPkg&&await d({code:"npm install",cwd:U.rangeFile(""),printLog:!0,waiting:"请稍等,正在安装依赖"}),await d({code:"npm install",cwd:U.pkgFile(""),printLog:!0,waiting:"请稍等,正在安装依赖"})}(),U.childPkg?(g(y`创建项目完毕`),g(`请 cd 到 ${_`./${U.range}`} 目录下`),g(),U.install||g(`执行 ${R`npm install`}`),g(R`简单测试使用 ${w`npm test`}`),g(R`简单打包使用 ${w`npm run build`}`)):(g(y`创建项目完毕`),g(`请 cd 到 ${_(U.cwd)} 目录下`),g(),U.install||g(`执行 ${R`npm install`}`),g(R`简单测试使用 ${w`npm test`}`),g(R`简单打包使用 ${w`npm run build`}`)),await W("")}catch(n){T.error(n)}})();
2
+ import{initializeFile as n,getDirectoryBy as e,readFileToJsonSync as t,pathJoin as i,waitingTips as s,typewrite as o,cursorAfterClear as a,cursorShow as r,colorLine as l,writeJsonFile as c,isEmptyDir as p,getNpmPkgInfo as u,runOtherCode as d,_p as g}from"a-node-tools";import{Dog as m}from"@qqi/log";import{isFalse as f,isUndefined as h,isBusinessEmptyString as $,isType as A,isArray as E,isEmptyArray as j}from"a-type-of-js";import{Command as v}from"a-command";import{magentaPen as _,greenPen as y,brightRedPen as k,hexPen as b,brightBlackPen as R,brightGreenPen as w}from"color-pen";import{mkdirSync as C,writeFileSync as D,unlinkSync as N}from"node:fs";import{sleep as O,enArr as x}from"a-js-tools";import{userInfo as P}from"node:os";import{QQI as I}from"qqi";const T=new m({name:"create a npm",type:!1}),S=f(T.type),F=new v("create-a-npm");F.run().isEnd(!0);const G=["husky","action","rollup","typescript","eslint","prettier"],[K]=n();let M=e("package.json","file",K);T("获取到的地址为",M),h(M)&&(M=process.cwd());const H=t(i(M,"package.json"));T("获取到的数据为:",H);const U={cwd:"",range:"",pkgFile(...n){return i(this.cwd,...n)},rangeFile(...n){return i(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:G},package:{name:"",version:"0.0.0",description:"",author:{name:"",email:"",url:""},dependencies:H?.dependencies||{},devDependencies:H?.devDependencies||{}},install:!1,carryRange:!1,childPkg:!1,buildDevDependencies(){const{dependencies:n}=this.local,{devDependencies:e,dependencies:t}=this.package;T("获取的本地的包信息",n),T("获取本地的");const i={"@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")&&(i.husky=e.husky||"^9.1.7",i["lint-staged"]=e["lint-staged"]||"^16.1.0"),n.includes("eslint")&&(i.eslint=e.eslint||"^9.28.0",i["eslint-plugin-jsdoc"]=e["eslint-plugin-jsdoc"]||"^51.0.1",i.globals=e.globals||"^16.2.0",i["@eslint/js"]=e["@eslint/js"]||"^9.28.0",n.includes("typescript")&&(i["typescript-eslint"]=e["typescript-eslint"]||"^8.34.0"),n.includes("prettier")&&(i["eslint-config-prettier"]=e["eslint-config-prettier"]||"^10.1.5")),n.includes("prettier")&&(i.prettier=e.prettier||"^3.5.3"),n.includes("typescript")&&(i["@types/node"]=e["@types/node"]||"^24.0.1",i["@rollup/plugin-typescript"]=e["@rollup/plugin-typescript"]||"^12.1.2",i.typescript=e.typescript||"^5.8.3"),T("构建的依赖图",i),i}},q=s({show:!1});function L(n,e){c(U.pkgFile(n),e)}async function W(n="好的,正在做退出前最后的工作,请稍等"){return await o(n),q.destroyed(),a(),r(),l("终结线",!0),F.end()}async function B(n){U.childPkg=U.carryRange=!1,n.startsWith("@")&&(U.childPkg=!0,await async function(n){const e=await F.selection({info:"检测到当前文件包含域",data:[{value:0,label:"子包模式",tip:`默认您是在${y(n.replace(/^@(.*)\/.*$/,"$1").concat("/packages"))}目录下`},{value:1,label:"嵌套模式",tip:`默认为您创建 ${y(n.replace(/@/,"").replace(/\//,"/packages/"))}`}]});if(h(e))return await W();U.carryRange=Boolean(e)}(n));const e=n.startsWith("@")?U.carryRange?n.replace(/@/,"").replace(/\//,"/packages/"):n.replace(/^.*\/(.*)$/,"$1"):n;T("获取当前的目录",e);const t=p(e);if(0==t){const e=["更换为其他名称","直接退出"],t=await F.question({text:`当前目录下存在非空同名文件夹(${k(n)})`,tip:e});return!(!h(t)&&t!==e[1])&&await W()}q.run({info:"正在检测 npm 是否有该同名包"});const i=S&&await u(n)||{data:void 0};if(q.destroyed(),T("获取线上的 npm 包数据",i),i.data){const e=["更改为其他名称","忽视并继续","直接退出"],t=await F.question({text:b("#f63")`当前包名称(${_(n)})已经存在于 npm 中`,tip:e});if(h(t)||t===e[2])return await W();if(t===e[0])return!1}return U.name=n,-1===t&&C(e,{recursive:!0}),!0}async function V(n=!0){let e=n&&F.args.$original[0]||"";if(T("当前获取的输入名称",e),$(e)&&(e=await async function(){const n=await F.question({text:"您即将创建的包名",tip:"请使用空格/连字符(-)做分隔符",minLen:1,maxLen:212,verify:[{reg:/^[a-z@]/,info:"首字符应为小写英文字符或 @"},{reg:/[A-Z]/,info:"不应当有大些英文字符",inverse:!0},{reg:/^[^@].*\/.*/,info:`仅当为范围时才可以包含 ${_`/`} 符号`,inverse:!0},{reg:/.*\/.*\/.*/,info:`仅只能包含一个 ${_`/`} 符号`,inverse:!0},{reg:/^[@a-z].*@.*$/,info:`${_`@`} 仅允许在首位出现`,inverse:!0},{reg:/^[a-z0-9@/\-_.]+$/,info:`仅允许 ${_`-`}、${_`_`} 字符出现`}]});return h(n)?await W("您选择退出,清稍等"):n}()),e=e.trim().replace(/\s+/gm,"-"),$(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 F.question({text:b("#f63")("您的输入为字符非法")+"重新输入或退出",tip:n});if(h(e)||e===n[1])return await W()}(),await O(100),await V(!1);const t=await B(e);return f(t)?await V(!1):void 0}function Y(n){const e=Symbol("diy");return n.push({label:"手动输入值",value:e,tip:"使用其他输入名称"}),e}const z=new I("create-a-npm");async function J(n,e){const{author:t}=U.local,i=t.name;let s=await F.selection({data:n,info:"请选择要使用的用户名"});if(h(s))return await W();A(s,n=>n===e)&&(s=await async function(){const n=await F.question({text:"请输入您将配置的用户名",maxLen:16});return h(n)?await W():n}()),S||T(R("获取当前的用户名 "),s),T("是否执行写入",z.available),U.package.author.name=t.name=s,z.available&&i!==s&&(T("写入的值",U.local),z.write("config",U.local))}function Q(n,e){if(!z.available)return;const t=z.read("config"),i=t?.author?.[e]??"";if($(i))return;U.local.author[e]=i;let s=!1;for(const e in n){const t=n[e];if(t.value===i){t.tip+=y`(上次使用该值)`,s=!0,n.unshift(n.splice(Number(e),1)[0]);break}}s||n.unshift({label:`${i}`,value:i,tip:"上次使用"})}async function Z(){const n=[];await async function(n){const e=await d("git config user.name");if(e.success){const t=e.data?.replace(/\n$/,"")||"";$(t)||n.push({label:`${t}`,value:t,tip:"由 git 全局配置读取"})}}(n),function(n){const e=process.env.USER??process.env.USERNAME??P().username;n.push({label:`${e}`,value:e,tip:"设备用户名"})}(n);const e=Y(n);Q(n,"name"),await J(n,e)}async function X(n,e){const{author:t}=U.local,i=t.email;let s=await F.selection({data:n,info:"请选择您的通讯邮箱"});if(h(s))return await W();A(s,n=>n===e)&&(s=await async function(){const n=await F.question({text:"请输入您将配置的邮箱",maxLen:50,minLen:5,verify:[{reg:/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/,info:"需符合邮箱基本模式"}]});return h(n)?await W():n}()),S||T(R("获取当前的用户名 "),s),T("是否执行写入",z.available),U.package.author.email=t.email=s,z.available&&i!==s&&(T("写入的值",U.local),z.write("config",U.local))}async function nn(){const n=[];await async function(n){const e=await d("git config user.email");if(!e.success)return await W("获取本地的 git config user.email 出错\n".concat(e.error||e.data));const t=e.data.replace(/\n$/,"")||"";$(t)||n.push({value:t,tip:"该值从 git 全局配置读取",label:t})}(n),function(n){const{author:e}=U.local;if($(e.name))return;const t=`${e.name.replace(/\s+/g,"_")}@outlook.com`;n.push({value:t,label:t,tip:"该值由 name 值合成而来"})}(n),Q(n,"email");const e=Y(n);await X(n,e)}async function en(n,e){const{author:t}=U.local,i=t.url;let s=await F.selection({data:n,info:"请配置您的个人网站"});if(h(s))return await W();A(s,n=>n===e)&&(s=await async function(){const n=await F.question({text:"请输入您将配置的网址",maxLen:50,minLen:5,verify:[{reg:/^https?:\/{2}.+/,info:"需符合网址基本模式"}]});return h(n)?await W():n}()),S||T(R("获取当前的网址 "),s),T("是否执行写入",z.available),U.package.author.url=t.url=s,z.available&&i!==s&&(T("写入的值",U.local),z.write("config",U.local))}async function tn(){const n=[];!function(n){const{author:e}=U.local;if($(e.name))return;const t=`${e.name.replace(/\s+/g,"_")}.github.io`;n.push({value:t,label:t,tip:"该值由 name 值合成而来"})}(n),Q(n,"url");const e=Y(n);await en(n,e)}async function sn(){const n=await async function(){const n=["name","email","url"],{local:e}=U;if(!z.available)return n;const t=z.read("config");if(h(t?.author))return n;E(t?.dependencies)&&(e.dependencies=t.dependencies);const{author:i}=t,s=Object.keys(i).filter(n=>!$(i[n])&&(e.author[n]=i[n])&&!0).map(n=>({value:n,label:`${n} : ${i[n]}`,checked:!0}));if(j(s))return n;const o=await F.selection({info:"以下为上次使用配置,选中的项将跳过配置",data:s,kind:"check"});return h(o)?await W():(T("选项的值",o),x.difference(n,o))}();T("获取需要更改的项",n),n.includes("name")&&await Z(),n.includes("email")&&await nn(),n.includes("url")&&await tn(),await async function(){const n=await F.selection({info:"请选择开发模式",data:[{value:0,label:"仅是可用库",tip:"当前仅是使用的库,譬如:"+y`a-js-tools`},{value:1,label:"仅是可执行库",tip:"当前仅包含可执行内容,譬如:"+y`jja`},{value:2,label:"库 + bin",tip:"即包含可执行又包含可导出使用内容,譬如:"+y`qqi`}]});h(n)||(U.bin=n)}(),await async function(){const{local:n}=U,e=n.dependencies,t=[{value:"rollup",tip:"该项为必须项",label:"打包工具 rollup",checked:!0,disable:!0},{value:"typescript",tip:"如果使用 typescript 建议使用该项",label:"使用 "+y`typescript`,checked:e.includes("typescript")},...[["eslint",`使用代码问题工具 ${y`eslint`}`],["prettier",`格式化代码 ${y`prettier`}`],["husky",`git 提交 hook 管理 ${y`husky`}`],["action",`CI/CD 使用自动化构建、发布 ${y`github action`} `]].map(n=>({value:n[0],label:n[1],checked:e.includes(n[0])}))],i=await F.selection({data:t,kind:"check",info:"请选择要使用的辅助功能"});T("用户选择的依赖",i),h(i)?n.dependencies=G:(n.dependencies=i,z.available&&(T("执行储存的数据",n),z.write("config",n)))}(),await async function(){const n=["安装","跳过"],e=await F.question({text:"是否安装依赖",tip:n});h(e)||e===n[1]||(U.install=!0)}()}function on(){const{dependencies:n}=U.local,e="++++",t=n.includes("prettier"),i=n.includes("typescript");return`import globals from 'globals';\nimport pluginJs from '@eslint/js';\n${t?"import tseslint from 'typescript-eslint';":e}\n${i?"import eslintConfigPrettier from 'eslint-config-prettier';":e}\nimport jsdocPlugin from 'eslint-plugin-jsdoc';\n\nexport default [\n { files: ['**/*.{js,mjs,cjs${i?".ts":""}}'] },\n { languageOptions: { globals: globals.browser } },\n pluginJs.configs.recommended,\n ${i?"...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 ${i?"\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 an(){L("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}}),L("tsconfig.json",{extends:"./tsconfig.base.json",include:["index.ts","src/**/*.ts","**.d.ts","test/**/*.ts"],exclude:["node_modules","dist"]}),L("tsconfig.types.json",{extends:"./tsconfig.base.json",compilerOptions:{emitDeclarationOnly:!0,declaration:!0,declarationDir:"dist/"},exclude:["node_modules","test","dist","eg"]})}function rn(){const{author:n}=U.local,{name:e,url:t}=n,i=U.name.replace(/^@/,""),s=i.split("/");D(U.pkgFile("README.md"),`# ${U.name}\n\r\n[![version](<https://img.shields.io/npm/v/${U.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/${U.name}) [![issues 提交](<https://img.shields.io/badge/issues-提交-rgb(255,0,63)?logo=github>)](https://github.com/${e.replace(/\s+/g,"_")}/${s[0]}/issues)\n \n## 文档地址\n\n参看 [${t}/${i}](${t}/${i})`)}const ln=()=>{const n=(new Date).getFullYear(),{name:e}=U.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 cn(){D(U.pkgFile("LICENSE"),ln())}function pn(){const n=(()=>{const n=new Date;return`${n.getFullYear()}-${n.getMonth()+1}-${n.getDate()}`})();D(U.pkgFile("CHANGELOG.md"),`# 更新日志 📔\n\n## v0.0.0 (${n})\n`)}function un(){const{dependencies:n}=U.local,e=n.includes("typescript")?"ts":"js";C(U.pkgFile("eg"),{recursive:!0}),D(U.pkgFile("eg/index."+e),"import { sayHello } from '../index';\n sayHello(); \n")}function dn(){const{dependencies:n}=U.local,e=n.includes("typescript");C(U.pkgFile("src"),{recursive:!0}),D(U.pkgFile("index."+(e?"ts":"js")),(0!==U.bin?"#!/usr/bin/env node\n\n":"")+"export { sayHello } from './src/index';"),D(U.pkgFile("src/index."+(e?"ts":"js")),"\n \rexport function sayHello() {\n console.log('哈喽');\n }\n ")}function gn(){C(i(U.pkgFile("scripts")),{recursive:!0});const{author:n}=U.local,e=U.name.replace(/^@/,"").split("/"),t=e[0];D(U.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!==U.bin?`\n bin: {\n ${U.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 mn(){const{dependencies:n}=U.local;n.includes("action")&&(!function(){const n=".github/workflows";C(U.pkgFile(n),{recursive:!0}),D(U.pkgFile(n,"发布.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\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")}(),C(i(U.pkgFile("scripts")),{recursive:!0}),D(U.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# 依赖安装\nnpm ci\n# 构建项目\nif ! npm 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 ! npm publish --provenance --access public --tag "${tag}"; then\n echo "发布失败" \n exit 1\nfi\necho "🚀🚀 发布成功,完结 🎉🎉 撒花 🎉🎉"\n\n')),n.includes("typescript")&&an(),function(){const{dependencies:n}=U.local,e=n.includes("typescript");D(U.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!==U.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}=U.local,e=n.includes("typescript");D(U.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 `)}(),rn(),function(){const{dependencies:n}=U.local,e=n.includes("typescript"),t={name:U.name,version:"0.0.0",type:"module",private:!0,description:"",scripts:{b:"rollup --config rollup.config.js"+(1!==U.bin&&e?" && tsc -p tsconfig.types.json":""),build:"jja cls rm dist && npm run b && npm 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:U.buildDevDependencies()};n.includes("husky")&&n.includes("prettier")&&(t["lint-staged"]={"*.{js,ts}":["prettier --write"]},t.scripts.prepare="husky"),n.includes("eslint")&&(t.scripts.eslint="jja cls && eslint packages"),n.includes("prettier")&&(t.scripts.prettier="jja cls && prettier . --write"),L("package.json",t)}(),cn(),dn(),n.includes("eslint")&&D(U.pkgFile("eslint.config.js"),on()),n.includes("prettier")&&(D(U.pkgFile(".prettierignore"),"\nnode_modules\ndist\n*.tgz\ncoverage\n.DS_Store\n.eg"),D(U.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(U.pkgFile(".markdownlint.json"),'{\n "MD024": false,\n "MD013": false\n}\n'),pn(),D(U.pkgFile(".gitignore"),"\nnode_modules\ndist\n*.tgz\ncoverage\n.DS_Store\n.eg"),gn(),un()}function fn(){C(U.rangeFile("scripts"),{recursive:!0}),D(U.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(U.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'),D(U.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 npm ci\n if ! npm 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 ! npm publish --provenance --access public --tag "${tag}" ; 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(U.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 hn(){const{dependencies:n}=U.local;n.includes("action")&&(!function(){const n=".github/workflows";C(U.rangeFile(n),{recursive:!0}),D(U.rangeFile(n,"发布.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 - name: 安装全局依赖\n run: |\n npm ci\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 ")}(),fn()),n.includes("typescript")&&(D(U.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(U.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(U.rangeFile("README.md"),"# 你会更改这里的内容的\n \n毕竟,我猜你有很多话要说\n记录下来,哪怕不会有人看见\n "),function(){const{dependencies:n}=U.local,e={name:U.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:U.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"),c(U.rangeFile("package.json"),e)}(),D(U.rangeFile("LICENSE"),ln()),n.includes("eslint")&&D(U.rangeFile("eslint.config.js"),on()),n.includes("prettier")&&(D(U.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(U.rangeFile(".prettierignore"),"\nnode_modules\ndist\n*.tgz\ncoverage\n.DS_Store\n.eg")),D(U.rangeFile(".markdownlint.json"),'{\n "MD024": false,\n "MD013": false\n}\n'),D(U.rangeFile(".gitignore"),"\nnode_modules\ndist\n*.tgz\ncoverage\n.DS_Store\n.eg")}function $n(){const{dependencies:n}=U.local;n.includes("typescript")&&(1!==U.bin&&D(U.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(U.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}=U.local,e=n.includes("typescript");D(U.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!==U.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}=U.local,e=n.includes("typescript");D(U.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`)}(),rn(),function(){const{dependencies:n}=U.local,e=n.includes("typescript"),t={type:"module",version:"0.0.0",name:U.name,description:"写点什么吧,空白只本应存在于虚空",scripts:{b:"rollup --config rollup.config.js"+(e||1!==U.bin?" && tsc -p tsconfig.types.json":""),build:"npm run b && npm 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"};c(U.pkgFile("package.json"),t)}(),cn(),dn(),pn(),D(U.pkgFile("todo.md"),"# 代办\n\n"),gn(),un()}async function An(){return T("开始构建应用"),""==U.name?(await V(),await sn(),void await An()):U.childPkg?(U.carryRange&&hn(),void $n()):void mn()}(async()=>{try{try{const n=i("test_write"+Date.now());c(n,{}),N(n)}catch(n){return T.error(n),console.log(n),await W("您没有当前目录的写文件的权限,请确认后再试")}l("华丽开始分割",!0),await V(),await sn(),await An(),U.install&&await async function(){U.childPkg&&await d({code:"npm install",cwd:U.rangeFile(""),printLog:!0,waiting:"请稍等,正在安装依赖"}),await d({code:"npm install",cwd:U.pkgFile(""),printLog:!0,waiting:"请稍等,正在安装依赖"})}(),U.childPkg?(g(y`创建项目完毕`),g(`请 cd 到 ${_`./${U.range}`} 目录下`),g(),U.install||g(`执行 ${R`npm install`}`),g(R`简单测试使用 ${w`npm test`}`),g(R`简单打包使用 ${w`npm run build`}`)):(g(y`创建项目完毕`),g(`请 cd 到 ${_(U.cwd)} 目录下`),g(),U.install||g(`执行 ${R`npm install`}`),g(R`简单测试使用 ${w`npm test`}`),g(R`简单打包使用 ${w`npm run build`}`)),await W("")}catch(n){T.error(n)}})();
package/package.json CHANGED
@@ -1,47 +1,47 @@
1
1
  {
2
2
  "name": "create-a-pkg",
3
3
  "type": "module",
4
- "version": "1.0.4",
4
+ "version": "1.0.6-test.0",
5
5
  "description": "一个一键生成一个符合特定规则 <就是一个简单的代码模板库> 的 npm 包",
6
6
  "license": "MIT",
7
7
  "devDependencies": {
8
- "@eslint/js": "^9.29.0",
9
- "@qqi/check-version": "^1.0.3",
10
- "@qqi/rollup-external": "^1.0.8",
8
+ "@eslint/js": "^9.31.0",
9
+ "@qqi/check-version": "^1.0.4",
10
+ "@qqi/rollup-external": "^1.0.9",
11
11
  "@rollup/plugin-commonjs": "^28.0.6",
12
12
  "@rollup/plugin-json": "^6.1.0",
13
13
  "@rollup/plugin-node-resolve": "^16.0.1",
14
14
  "@rollup/plugin-terser": "^0.4.4",
15
- "@rollup/plugin-typescript": "^12.1.3",
16
- "@types/node": "^24.0.3",
17
- "eslint": "^9.29.0",
18
- "eslint-config-prettier": "^10.1.5",
19
- "eslint-plugin-jsdoc": "^51.1.1",
20
- "globals": "^16.2.0",
21
- "gvv": "^0.1.0",
15
+ "@rollup/plugin-typescript": "^12.1.4",
16
+ "@types/node": "^24.0.14",
17
+ "eslint": "^9.31.0",
18
+ "eslint-config-prettier": "^10.1.7",
19
+ "eslint-plugin-jsdoc": "^51.4.1",
20
+ "globals": "^16.3.0",
21
+ "gvv": "^0.1.3",
22
22
  "husky": "^9.1.7",
23
- "jja": "^2.3.10",
23
+ "jja": "^2.3.11",
24
24
  "lint-staged": "^16.1.2",
25
25
  "pjj": "^1.0.2",
26
- "prettier": "^3.5.3",
27
- "rollup": "^4.44.0",
26
+ "prettier": "^3.6.2",
27
+ "rollup": "^4.45.1",
28
28
  "rollup-plugin-cleanup": "^3.2.1",
29
29
  "rollup-plugin-copy": "^3.5.0",
30
30
  "tslib": "^2.8.1",
31
31
  "typescript": "^5.8.3",
32
- "typescript-eslint": "^8.34.1",
33
- "vjj": "^1.0.6"
32
+ "typescript-eslint": "^8.37.0",
33
+ "vjj": "^1.0.8"
34
34
  },
35
35
  "dependencies": {
36
36
  "@color-pen/static": "^1.0.0",
37
- "@qqi/log": "^0.0.1",
38
- "a-command": "^2.3.10",
39
- "a-js-tools": "^1.0.0",
40
- "a-node-tools": "^4.2.12",
41
- "a-type-of-js": "^1.0.1",
42
- "color-pen": "^2.0.10",
37
+ "@qqi/log": "^0.1.0",
38
+ "a-command": "^2.3.13",
39
+ "a-js-tools": "^1.0.8",
40
+ "a-node-tools": "^4.2.16",
41
+ "a-type-of-js": "^1.0.5",
42
+ "color-pen": "^2.0.12",
43
43
  "colored-table": "^0.0.2",
44
- "qqi": "^0.0.5"
44
+ "qqi": "^0.1.0"
45
45
  },
46
46
  "author": {
47
47
  "name": "🥜",
@@ -49,7 +49,6 @@
49
49
  "url": "https://earthnut.dev"
50
50
  },
51
51
  "files": [
52
- "src",
53
52
  "bin.mjs"
54
53
  ],
55
54
  "keywords": [