zixulu 1.46.0 → 1.46.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/utils/addPrettier.js +1 -1
- package/dist/utils/addPrettier.js.map +2 -2
- package/dist/utils/downloadBun.js.map +1 -1
- package/dist/utils/downloadLatestSoftware.js +7 -1
- package/dist/utils/downloadLatestSoftware.js.map +2 -2
- package/dist/utils/getLatestRelease.js.map +1 -1
- package/dist/utils/getZixuluSetting.d.ts +1 -0
- package/dist/utils/getZixuluSetting.js +42 -0
- package/dist/utils/getZixuluSetting.js.map +7 -0
- package/dist/utils/index.d.ts +0 -2
- package/dist/utils/index.js +7 -24
- package/dist/utils/index.js.map +2 -2
- package/dist/utils/setZixuluSetting.d.ts +1 -0
- package/dist/utils/setZixuluSetting.js +37 -0
- package/dist/utils/setZixuluSetting.js.map +7 -0
- package/dist/utils/syncVscode.js +1 -2
- package/dist/utils/syncVscode.js.map +2 -2
- package/package.json +1 -1
- package/src/utils/addPrettier.ts +55 -55
- package/src/utils/downloadBun.ts +20 -20
- package/src/utils/downloadLatestSoftware.ts +7 -1
- package/src/utils/getLatestRelease.ts +82 -82
- package/src/utils/getZixuluSetting.ts +14 -0
- package/src/utils/index.ts +9 -24
- package/src/utils/setZixuluSetting.ts +9 -0
- package/src/utils/syncVscode.ts +1 -3
|
@@ -37,9 +37,9 @@ module.exports = __toCommonJS(addPrettier_exports);
|
|
|
37
37
|
var import_consola = __toESM(require("consola"));
|
|
38
38
|
var import_promises = require("fs/promises");
|
|
39
39
|
var import_addDependency = require("./addDependency");
|
|
40
|
+
var import_installDependceny = require("./installDependceny");
|
|
40
41
|
var import_readPackageJson = require("./readPackageJson");
|
|
41
42
|
var import_writePackageJson = require("./writePackageJson");
|
|
42
|
-
var import_installDependceny = require("./installDependceny");
|
|
43
43
|
var prettierConfigText = `/**
|
|
44
44
|
* @type {import("prettier").Options}
|
|
45
45
|
*/
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/addPrettier.ts"],
|
|
4
|
-
"sourcesContent": ["import consola from \"consola\"\
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAoB;AACpB,sBAA0B;AAC1B,2BAAqD;AACrD,6BAAgC;AAChC,8BAAiC;
|
|
4
|
+
"sourcesContent": ["import consola from \"consola\"\nimport { writeFile } from \"fs/promises\"\nimport { AddDependenciesConfig, addDependency } from \"./addDependency\"\nimport { installDependceny } from \"./installDependceny\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nexport const prettierConfigText = `/**\n * @type {import(\"prettier\").Options}\n */\nconst config = {\n semi: false,\n tabWidth: 4,\n arrowParens: \"avoid\",\n printWidth: 160,\n plugins: [\"prettier-plugin-organize-imports\"],\n}\n\nexport default config\n`\n\nexport const prettierConfigTextWithTailwind = `/**\n * @type {import(\"prettier\").Options}\n */\nconst config = {\n semi: false,\n tabWidth: 4,\n arrowParens: \"avoid\",\n printWidth: 160,\n plugins: [\"prettier-plugin-organize-imports\", \"prettier-plugin-tailwindcss\"],\n}\n\nexport default config\n`\n\n/** 添加 prettier */\nexport async function addPrettier() {\n consola.start(\"开始添加 prettier 配置\")\n const packageJson = await readPackageJson()\n const tailwind =\n Object.keys(packageJson.dependencies ?? {}).includes(\"tailwindcss\") || Object.keys(packageJson.devDependencies ?? {}).includes(\"tailwindcss\")\n await writeFile(\"./prettier.config.mjs\", tailwind ? prettierConfigTextWithTailwind : prettierConfigText)\n const config: AddDependenciesConfig = {\n package: [\"prettier\", \"prettier-plugin-organize-imports\"],\n type: \"devDependencies\",\n }\n if (tailwind) (config.package as string[]).push(\"prettier-plugin-tailwindcss\")\n await addDependency(config)\n const packageJson2 = await readPackageJson()\n packageJson2.scripts ??= {}\n packageJson2.scripts.format = \"prettier --write .\"\n await writePackageJson({ data: packageJson2 })\n await installDependceny()\n consola.success(\"添加 prettier 配置成功\")\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAoB;AACpB,sBAA0B;AAC1B,2BAAqD;AACrD,+BAAkC;AAClC,6BAAgC;AAChC,8BAAiC;AAE1B,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAc3B,IAAM,iCAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAe9C,eAAsB,cAAc;AAChC,iBAAAA,QAAQ,MAAM,kBAAkB;AAChC,QAAM,cAAc,UAAM,wCAAgB;AAC1C,QAAM,WACF,OAAO,KAAK,YAAY,gBAAgB,CAAC,CAAC,EAAE,SAAS,aAAa,KAAK,OAAO,KAAK,YAAY,mBAAmB,CAAC,CAAC,EAAE,SAAS,aAAa;AAChJ,YAAM,2BAAU,yBAAyB,WAAW,iCAAiC,kBAAkB;AACvG,QAAM,SAAgC;AAAA,IAClC,SAAS,CAAC,YAAY,kCAAkC;AAAA,IACxD,MAAM;AAAA,EACV;AACA,MAAI;AAAU,IAAC,OAAO,QAAqB,KAAK,6BAA6B;AAC7E,YAAM,oCAAc,MAAM;AAC1B,QAAM,eAAe,UAAM,wCAAgB;AAC3C,eAAa,YAAY,CAAC;AAC1B,eAAa,QAAQ,SAAS;AAC9B,YAAM,0CAAiB,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAM,4CAAkB;AACxB,iBAAAA,QAAQ,QAAQ,kBAAkB;AACtC;",
|
|
6
6
|
"names": ["consola"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/downloadBun.ts"],
|
|
4
|
-
"sourcesContent": ["import { rename, rm } from \"fs/promises\"\
|
|
4
|
+
"sourcesContent": ["import { rename, rm } from \"fs/promises\"\nimport { join } from \"path\"\nimport { unzip } from \"soda-nodejs\"\nimport { download } from \".\"\nimport { getLatestRelease } from \"./getLatestRelease\"\n\nexport async function downloadBun(dir: string) {\n const release = await getLatestRelease(\"oven-sh\", \"bun\")\n const url = release.assets.find(asset => asset.name === \"bun-windows-x64.zip\")?.browser_download_url\n if (!url) throw new Error(\"未找到 bun-windows-x64.zip\")\n await download(url, dir)\n await unzip({\n input: \"bun-windows-x64.zip\",\n output: \".\",\n cwd: dir,\n })\n await rename(join(dir, \"bun-windows-x64\", \"bun.exe\"), join(dir, \"bun.exe\"))\n await rm(join(dir, \"bun-windows-x64.zip\"), { force: true })\n await rm(join(dir, \"bun-windows-x64\"), { force: true, recursive: true })\n}\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAA2B;AAC3B,kBAAqB;AACrB,yBAAsB;AACtB,eAAyB;AACzB,8BAAiC;AAEjC,eAAsB,YAAY,KAAa;AAC3C,QAAM,UAAU,UAAM,0CAAiB,WAAW,KAAK;AACvD,QAAM,MAAM,QAAQ,OAAO,KAAK,WAAS,MAAM,SAAS,qBAAqB,GAAG;AAChF,MAAI,CAAC;AAAK,UAAM,IAAI,MAAM,yBAAyB;AACnD,YAAM,mBAAS,KAAK,GAAG;AACvB,YAAM,0BAAM;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,EACT,CAAC;AACD,YAAM,4BAAO,kBAAK,KAAK,mBAAmB,SAAS,OAAG,kBAAK,KAAK,SAAS,CAAC;AAC1E,YAAM,wBAAG,kBAAK,KAAK,qBAAqB,GAAG,EAAE,OAAO,KAAK,CAAC;AAC1D,YAAM,wBAAG,kBAAK,KAAK,iBAAiB,GAAG,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC;AAC3E;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -44,6 +44,8 @@ var import_downloadFirefox = require("./downloadFirefox");
|
|
|
44
44
|
var import_downloadHoneyview = require("./downloadHoneyview");
|
|
45
45
|
var import_downloadPotPlayer = require("./downloadPotPlayer");
|
|
46
46
|
var import_downloadPowerToys = require("./downloadPowerToys");
|
|
47
|
+
var import_getZixuluSetting = require("./getZixuluSetting");
|
|
48
|
+
var import_setZixuluSetting = require("./setZixuluSetting");
|
|
47
49
|
var SoftwareDownloadMap = {
|
|
48
50
|
[import_constant.Software.Chrome]: import__.downloadChrome,
|
|
49
51
|
[import_constant.Software.NodeJS]: import__.downloadNodeJS,
|
|
@@ -63,13 +65,17 @@ async function downloadLatestSoftware() {
|
|
|
63
65
|
import_consola.default.start("开始下载软件");
|
|
64
66
|
const { default: inquirer } = await import("inquirer");
|
|
65
67
|
const dir = `softwares-${(0, import_dayjs.default)().format("YYYYMMDDHHmmss")}`;
|
|
68
|
+
const setting = await (0, import_getZixuluSetting.getZixuluSetting)();
|
|
69
|
+
const softwareDownloadHistory = setting?.softwareDownloadHistory;
|
|
66
70
|
const { softwares } = await inquirer.prompt({
|
|
67
71
|
type: "checkbox",
|
|
68
72
|
name: "softwares",
|
|
69
73
|
message: "请选择要下载的软件",
|
|
70
74
|
choices: Object.values(import_constant.Software),
|
|
71
|
-
default: Object.values(import_constant.Software)
|
|
75
|
+
default: softwareDownloadHistory?.filter((software) => Object.values(import_constant.Software).includes(software)) ?? Object.values(import_constant.Software)
|
|
72
76
|
});
|
|
77
|
+
setting.softwareDownloadHistory = softwares;
|
|
78
|
+
await (0, import_setZixuluSetting.setZixuluSetting)(setting);
|
|
73
79
|
if (softwares.length === 0)
|
|
74
80
|
return;
|
|
75
81
|
await (0, import_promises.mkdir)(dir, { recursive: true });
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/downloadLatestSoftware.ts"],
|
|
4
|
-
"sourcesContent": ["import { Software } from \"@constant/index\"\nimport consola from \"consola\"\nimport dayjs from \"dayjs\"\nimport { mkdir } from \"fs/promises\"\nimport { download7Zip, downloadChrome, downloadDeskGo, downloadGeekUninstaller, downloadGit, downloadNodeJS, downloadVscode } from \".\"\nimport { downloadAnydesk } from \"./downloadAnydesk\"\nimport { downloadBun } from \"./downloadBun\"\nimport { downloadFirefox } from \"./downloadFirefox\"\nimport { downloadHoneyview } from \"./downloadHoneyview\"\nimport { downloadPotPlayer } from \"./downloadPotPlayer\"\nimport { downloadPowerToys } from \"./downloadPowerToys\"\n\nexport const SoftwareDownloadMap: Record<Software, (dir: string) => Promise<void>> = {\n [Software.Chrome]: downloadChrome,\n [Software.NodeJS]: downloadNodeJS,\n [Software[\"7zip\"]]: download7Zip,\n [Software.Git]: downloadGit,\n [Software.DeskGo]: downloadDeskGo,\n [Software[\"Geek Uninstaller\"]]: downloadGeekUninstaller,\n [Software[\"VS Code\"]]: downloadVscode,\n [Software.PowerToys]: downloadPowerToys,\n [Software.Honeyview]: downloadHoneyview,\n [Software.AnyDesk]: downloadAnydesk,\n [Software.Firefox]: downloadFirefox,\n [Software.PotPlayer]: downloadPotPlayer,\n [Software.Bun]: downloadBun,\n}\n\nexport async function downloadLatestSoftware() {\n consola.start(\"开始下载软件\")\n const { default: inquirer } = await import(\"inquirer\")\n const dir = `softwares-${dayjs().format(\"YYYYMMDDHHmmss\")}`\n const { softwares } = await inquirer.prompt({\n type: \"checkbox\",\n name: \"softwares\",\n message: \"请选择要下载的软件\",\n choices: Object.values(Software),\n default: Object.values(Software),\n })\n if (softwares.length === 0) return\n await mkdir(dir, { recursive: true })\n for (const software of softwares) {\n consola.start(`正在下载 ${software}`)\n await SoftwareDownloadMap[software as Software](dir)\n }\n consola.success(\"软件下载完成\")\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAyB;AACzB,qBAAoB;AACpB,mBAAkB;AAClB,sBAAsB;AACtB,eAAmI;AACnI,6BAAgC;AAChC,yBAA4B;AAC5B,6BAAgC;AAChC,+BAAkC;AAClC,+BAAkC;AAClC,+BAAkC;
|
|
4
|
+
"sourcesContent": ["import { Software } from \"@constant/index\"\nimport consola from \"consola\"\nimport dayjs from \"dayjs\"\nimport { mkdir } from \"fs/promises\"\nimport { download7Zip, downloadChrome, downloadDeskGo, downloadGeekUninstaller, downloadGit, downloadNodeJS, downloadVscode } from \".\"\nimport { downloadAnydesk } from \"./downloadAnydesk\"\nimport { downloadBun } from \"./downloadBun\"\nimport { downloadFirefox } from \"./downloadFirefox\"\nimport { downloadHoneyview } from \"./downloadHoneyview\"\nimport { downloadPotPlayer } from \"./downloadPotPlayer\"\nimport { downloadPowerToys } from \"./downloadPowerToys\"\nimport { getZixuluSetting } from \"./getZixuluSetting\"\nimport { setZixuluSetting } from \"./setZixuluSetting\"\n\nexport const SoftwareDownloadMap: Record<Software, (dir: string) => Promise<void>> = {\n [Software.Chrome]: downloadChrome,\n [Software.NodeJS]: downloadNodeJS,\n [Software[\"7zip\"]]: download7Zip,\n [Software.Git]: downloadGit,\n [Software.DeskGo]: downloadDeskGo,\n [Software[\"Geek Uninstaller\"]]: downloadGeekUninstaller,\n [Software[\"VS Code\"]]: downloadVscode,\n [Software.PowerToys]: downloadPowerToys,\n [Software.Honeyview]: downloadHoneyview,\n [Software.AnyDesk]: downloadAnydesk,\n [Software.Firefox]: downloadFirefox,\n [Software.PotPlayer]: downloadPotPlayer,\n [Software.Bun]: downloadBun,\n}\n\nexport async function downloadLatestSoftware() {\n consola.start(\"开始下载软件\")\n const { default: inquirer } = await import(\"inquirer\")\n const dir = `softwares-${dayjs().format(\"YYYYMMDDHHmmss\")}`\n const setting = await getZixuluSetting()\n const softwareDownloadHistory = setting?.softwareDownloadHistory as Software[] | undefined\n const { softwares } = await inquirer.prompt({\n type: \"checkbox\",\n name: \"softwares\",\n message: \"请选择要下载的软件\",\n choices: Object.values(Software),\n default: softwareDownloadHistory?.filter(software => Object.values(Software).includes(software)) ?? Object.values(Software),\n })\n setting.softwareDownloadHistory = softwares\n await setZixuluSetting(setting)\n if (softwares.length === 0) return\n await mkdir(dir, { recursive: true })\n for (const software of softwares) {\n consola.start(`正在下载 ${software}`)\n await SoftwareDownloadMap[software as Software](dir)\n }\n consola.success(\"软件下载完成\")\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAyB;AACzB,qBAAoB;AACpB,mBAAkB;AAClB,sBAAsB;AACtB,eAAmI;AACnI,6BAAgC;AAChC,yBAA4B;AAC5B,6BAAgC;AAChC,+BAAkC;AAClC,+BAAkC;AAClC,+BAAkC;AAClC,8BAAiC;AACjC,8BAAiC;AAE1B,IAAM,sBAAwE;AAAA,EACjF,CAAC,yBAAS,MAAM,GAAG;AAAA,EACnB,CAAC,yBAAS,MAAM,GAAG;AAAA,EACnB,CAAC,yBAAS,MAAM,CAAC,GAAG;AAAA,EACpB,CAAC,yBAAS,GAAG,GAAG;AAAA,EAChB,CAAC,yBAAS,MAAM,GAAG;AAAA,EACnB,CAAC,yBAAS,kBAAkB,CAAC,GAAG;AAAA,EAChC,CAAC,yBAAS,SAAS,CAAC,GAAG;AAAA,EACvB,CAAC,yBAAS,SAAS,GAAG;AAAA,EACtB,CAAC,yBAAS,SAAS,GAAG;AAAA,EACtB,CAAC,yBAAS,OAAO,GAAG;AAAA,EACpB,CAAC,yBAAS,OAAO,GAAG;AAAA,EACpB,CAAC,yBAAS,SAAS,GAAG;AAAA,EACtB,CAAC,yBAAS,GAAG,GAAG;AACpB;AAEA,eAAsB,yBAAyB;AAC3C,iBAAAA,QAAQ,MAAM,QAAQ;AACtB,QAAM,EAAE,SAAS,SAAS,IAAI,MAAM,OAAO,UAAU;AACrD,QAAM,MAAM,iBAAa,aAAAC,SAAM,EAAE,OAAO,gBAAgB;AACxD,QAAM,UAAU,UAAM,0CAAiB;AACvC,QAAM,0BAA0B,SAAS;AACzC,QAAM,EAAE,UAAU,IAAI,MAAM,SAAS,OAAO;AAAA,IACxC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS,OAAO,OAAO,wBAAQ;AAAA,IAC/B,SAAS,yBAAyB,OAAO,cAAY,OAAO,OAAO,wBAAQ,EAAE,SAAS,QAAQ,CAAC,KAAK,OAAO,OAAO,wBAAQ;AAAA,EAC9H,CAAC;AACD,UAAQ,0BAA0B;AAClC,YAAM,0CAAiB,OAAO;AAC9B,MAAI,UAAU,WAAW;AAAG;AAC5B,YAAM,uBAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC,aAAW,YAAY,WAAW;AAC9B,mBAAAD,QAAQ,MAAM,QAAQ,UAAU;AAChC,UAAM,oBAAoB,QAAoB,EAAE,GAAG;AAAA,EACvD;AACA,iBAAAA,QAAQ,QAAQ,QAAQ;AAC5B;",
|
|
6
6
|
"names": ["consola", "dayjs"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/getLatestRelease.ts"],
|
|
4
|
-
"sourcesContent": ["import { agent } from \"@src/constant\"\
|
|
4
|
+
"sourcesContent": ["import { agent } from \"@src/constant\"\n\nexport interface Release {\n url: string\n assets_url: string\n upload_url: string\n html_url: string\n id: number\n author: Author\n node_id: string\n tag_name: string\n target_commitish: string\n name: string\n draft: boolean\n prerelease: boolean\n created_at: string\n published_at: string\n assets: Asset[]\n tarball_url: string\n zipball_url: string\n body: string\n discussion_url: string\n reactions: Reactions\n}\n\nexport interface Reactions {\n url: string\n total_count: number\n \"+1\": number\n \"-1\": number\n laugh: number\n hooray: number\n confused: number\n heart: number\n rocket: number\n eyes: number\n}\n\nexport interface Asset {\n url: string\n id: number\n node_id: string\n name: string\n label?: string\n uploader: Author\n content_type: string\n state: string\n size: number\n download_count: number\n created_at: string\n updated_at: string\n browser_download_url: string\n}\n\nexport interface Author {\n login: string\n id: number\n node_id: string\n avatar_url: string\n gravatar_id: string\n url: string\n html_url: string\n followers_url: string\n following_url: string\n gists_url: string\n starred_url: string\n subscriptions_url: string\n organizations_url: string\n repos_url: string\n events_url: string\n received_events_url: string\n type: string\n site_admin: boolean\n}\n\nexport async function getLatestRelease(owner: string, repo: string): Promise<Release> {\n const { default: fetch } = await import(\"node-fetch\")\n const url = `https://api.github.com/repos/${owner}/${repo}/releases/latest`\n const response = await fetch(url, { agent })\n const data = await response.json()\n return data as Release\n}\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAsB;AA2EtB,eAAsB,iBAAiB,OAAe,MAAgC;AAClF,QAAM,EAAE,SAAS,MAAM,IAAI,MAAM,OAAO,YAAY;AACpD,QAAM,MAAM,gCAAgC,SAAS;AACrD,QAAM,WAAW,MAAM,MAAM,KAAK,EAAE,6BAAM,CAAC;AAC3C,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,SAAO;AACX;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getZixuluSetting(): Promise<any>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
|
|
19
|
+
// src/utils/getZixuluSetting.ts
|
|
20
|
+
var getZixuluSetting_exports = {};
|
|
21
|
+
__export(getZixuluSetting_exports, {
|
|
22
|
+
getZixuluSetting: () => getZixuluSetting
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(getZixuluSetting_exports);
|
|
25
|
+
var import_fs = require("fs");
|
|
26
|
+
var import_promises = require("fs/promises");
|
|
27
|
+
var import_os = require("os");
|
|
28
|
+
var import_path = require("path");
|
|
29
|
+
async function getZixuluSetting() {
|
|
30
|
+
const userDir = (0, import_os.homedir)();
|
|
31
|
+
const settingPath = (0, import_path.join)(userDir, ".zixulu.json");
|
|
32
|
+
if ((0, import_fs.existsSync)(settingPath)) {
|
|
33
|
+
const setting = JSON.parse(await (0, import_promises.readFile)(settingPath, "utf-8"));
|
|
34
|
+
return setting;
|
|
35
|
+
}
|
|
36
|
+
return {};
|
|
37
|
+
}
|
|
38
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
39
|
+
0 && (module.exports = {
|
|
40
|
+
getZixuluSetting
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=getZixuluSetting.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/getZixuluSetting.ts"],
|
|
4
|
+
"sourcesContent": ["import { existsSync } from \"fs\"\nimport { readFile } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\nexport async function getZixuluSetting() {\n const userDir = homedir()\n const settingPath = join(userDir, \".zixulu.json\")\n if (existsSync(settingPath)) {\n const setting = JSON.parse(await readFile(settingPath, \"utf-8\"))\n return setting\n }\n return {}\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAA2B;AAC3B,sBAAyB;AACzB,gBAAwB;AACxB,kBAAqB;AAErB,eAAsB,mBAAmB;AACrC,QAAM,cAAU,mBAAQ;AACxB,QAAM,kBAAc,kBAAK,SAAS,cAAc;AAChD,UAAI,sBAAW,WAAW,GAAG;AACzB,UAAM,UAAU,KAAK,MAAM,UAAM,0BAAS,aAAa,OAAO,CAAC;AAC/D,WAAO;AAAA,EACX;AACA,SAAO,CAAC;AACZ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/utils/index.d.ts
CHANGED
package/dist/utils/index.js
CHANGED
|
@@ -43,10 +43,8 @@ __export(utils_exports, {
|
|
|
43
43
|
getFilename: () => getFilename,
|
|
44
44
|
getPidInfoFromPort: () => getPidInfoFromPort,
|
|
45
45
|
getProcessInfoFromPid: () => getProcessInfoFromPid,
|
|
46
|
-
getSetting: () => getSetting,
|
|
47
46
|
getVscodeExtInfo: () => getVscodeExtInfo,
|
|
48
47
|
isPositiveInteger: () => isPositiveInteger,
|
|
49
|
-
setSetting: () => setSetting,
|
|
50
48
|
sleep: () => sleep,
|
|
51
49
|
writeSyncVscodeScript: () => writeSyncVscodeScript
|
|
52
50
|
});
|
|
@@ -55,12 +53,13 @@ var import_constant = require("../constant/index");
|
|
|
55
53
|
var import_consola = __toESM(require("consola"));
|
|
56
54
|
var import_fs = require("fs");
|
|
57
55
|
var import_promises = require("fs/promises");
|
|
58
|
-
var import_os = require("os");
|
|
59
56
|
var import_path = require("path");
|
|
60
57
|
var import_soda_nodejs = require("soda-nodejs");
|
|
61
58
|
var import_stream = require("stream");
|
|
62
59
|
var import_yaml = __toESM(require("yaml"));
|
|
60
|
+
var import_getZixuluSetting = require("./getZixuluSetting");
|
|
63
61
|
var import_retry = require("./retry");
|
|
62
|
+
var import_setZixuluSetting = require("./setZixuluSetting");
|
|
64
63
|
function isPositiveInteger(value, allowZero = false) {
|
|
65
64
|
return Number.isInteger(value) && (allowZero ? value >= 0 : value > 0);
|
|
66
65
|
}
|
|
@@ -237,17 +236,17 @@ async function downloadVscodeExts(dir) {
|
|
|
237
236
|
const exts = await Promise.all(
|
|
238
237
|
extList.split(/[\n\r]/).filter(Boolean).map((ext) => getVscodeExtInfo(ext))
|
|
239
238
|
);
|
|
240
|
-
const setting = await
|
|
241
|
-
const
|
|
239
|
+
const setting = await (0, import_getZixuluSetting.getZixuluSetting)();
|
|
240
|
+
const vscodeDownloadHistory = setting?.vscodeDownloadHistory;
|
|
242
241
|
const exts2 = await inquirer.prompt({
|
|
243
242
|
type: "checkbox",
|
|
244
243
|
name: "exts",
|
|
245
244
|
message: "选择需要下载的扩展",
|
|
246
245
|
choices: exts.map((ext) => ({ name: ext.name, value: ext.id })),
|
|
247
|
-
default:
|
|
246
|
+
default: vscodeDownloadHistory?.filter((ext) => exts.some((item) => item.id === ext)) || exts.map((ext) => ext.id)
|
|
248
247
|
});
|
|
249
|
-
setting.
|
|
250
|
-
await
|
|
248
|
+
setting.vscodeDownloadHistory = exts2.exts;
|
|
249
|
+
await (0, import_setZixuluSetting.setZixuluSetting)(setting);
|
|
251
250
|
for (const ext of exts) {
|
|
252
251
|
if (!exts2.exts.includes(ext.id))
|
|
253
252
|
continue;
|
|
@@ -327,20 +326,6 @@ async function getPidInfoFromPort(port) {
|
|
|
327
326
|
return [];
|
|
328
327
|
}
|
|
329
328
|
}
|
|
330
|
-
async function getSetting() {
|
|
331
|
-
const userDir = (0, import_os.homedir)();
|
|
332
|
-
const settingPath = (0, import_path.join)(userDir, ".zixulu.json");
|
|
333
|
-
if ((0, import_fs.existsSync)(settingPath)) {
|
|
334
|
-
const setting = JSON.parse(await (0, import_promises.readFile)(settingPath, "utf-8"));
|
|
335
|
-
return setting;
|
|
336
|
-
}
|
|
337
|
-
return {};
|
|
338
|
-
}
|
|
339
|
-
async function setSetting(setting) {
|
|
340
|
-
const userDir = (0, import_os.homedir)();
|
|
341
|
-
const settingPath = (0, import_path.join)(userDir, ".zixulu.json");
|
|
342
|
-
await (0, import_promises.writeFile)(settingPath, JSON.stringify(setting, void 0, 4), "utf-8");
|
|
343
|
-
}
|
|
344
329
|
// Annotate the CommonJS export names for ESM import in node:
|
|
345
330
|
0 && (module.exports = {
|
|
346
331
|
download,
|
|
@@ -357,10 +342,8 @@ async function setSetting(setting) {
|
|
|
357
342
|
getFilename,
|
|
358
343
|
getPidInfoFromPort,
|
|
359
344
|
getProcessInfoFromPid,
|
|
360
|
-
getSetting,
|
|
361
345
|
getVscodeExtInfo,
|
|
362
346
|
isPositiveInteger,
|
|
363
|
-
setSetting,
|
|
364
347
|
sleep,
|
|
365
348
|
writeSyncVscodeScript
|
|
366
349
|
});
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/index.ts"],
|
|
4
|
-
"sourcesContent": ["import { agent } from \"@constant/index\"\nimport consola from \"consola\"\nimport { createWriteStream, existsSync } from \"fs\"\nimport { mkdir, readFile, readdir, rename, rm, writeFile } from \"fs/promises\"\nimport { type Headers as NodeFetchHeaders } from \"node-fetch\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\nimport { execAsync, unzip } from \"soda-nodejs\"\nimport { Readable } from \"stream\"\nimport YAML from \"yaml\"\nimport { retry } from \"./retry\"\n\nexport function isPositiveInteger(value: any, allowZero = false): value is number {\n return Number.isInteger(value) && (allowZero ? value >= 0 : value > 0)\n}\n\nexport function getFilename(headers: Headers | NodeFetchHeaders) {\n const disposition = headers.get(\"content-disposition\")\n if (!disposition) return undefined\n const reg = /filename=(.+?);/\n const result = disposition.match(reg)\n if (!result) return undefined\n return result[1]\n}\n\nexport async function download(url: string, dir: string, filename?: string) {\n const { default: fetch } = await import(\"node-fetch\")\n const response = await fetch(url, { agent })\n filename = getFilename(response.headers) || filename || new URL(url).pathname.split(\"/\").at(-1)!\n const writeable = createWriteStream(join(dir, filename))\n await new Promise((resolve, reject) => Readable.from(response.body!).pipe(writeable).on(\"finish\", resolve).on(\"error\", reject))\n return filename\n}\n\nexport async function downloadVscode(dir: string) {\n await downloadFromWinget({\n name: \"VSCode\",\n id: \"Microsoft.VisualStudioCode\",\n dir,\n filter: item => item.Architecture === \"x64\" && item.Scope === \"machine\",\n })\n}\n\nexport async function sleep(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n\nexport namespace PCQQ {\n export interface Result {\n resp: Resp\n }\n\n export interface Resp {\n soft_list: Softlist[]\n retCode: number\n }\n\n export interface Softlist {\n soft_id: number\n os_type: number\n os_bit: number\n display_name: string\n nick_ver: string\n ver_name: string\n file_size: string\n file_name: string\n publish_date: string\n download_url: string\n download_https_url: string\n }\n}\n\nexport async function downloadFromPCQQ(dir: string, cmdid: number, soft_id_list: number) {\n const data = new URLSearchParams()\n data.set(\"cmdid\", cmdid.toString())\n data.set(\"jprxReq[req][soft_id_list][]\", soft_id_list.toString())\n const headers = new Headers()\n headers.set(\"Content-Type\", \"application/x-www-form-urlencoded\")\n const response = await fetch(`https://luban.m.qq.com/api/public/software-manager/softwareProxy`, { method: \"POST\", headers, body: data.toString() })\n const result: PCQQ.Result = await response.json()\n await download(result.resp.soft_list[0].download_https_url, dir, result.resp.soft_list[0].file_name)\n}\n\nexport namespace Winget {\n export interface Package {\n PackageIdentifier: string\n PackageVersion: string\n InstallerType: string\n InstallModes: string[]\n InstallerSwitches: InstallerSwitches\n ExpectedReturnCodes: ExpectedReturnCode[]\n UpgradeBehavior: string\n Protocols: string[]\n FileExtensions: string[]\n AppsAndFeaturesEntries: AppsAndFeaturesEntry[]\n Installers: Installer[]\n ManifestType: string\n ManifestVersion: string\n }\n\n export interface Installer {\n Architecture: string\n Scope?: string\n InstallerUrl: string\n InstallerSha256: string\n InstallerLocale?: string\n InstallerType?: string\n }\n\n export interface InstallerSwitches2 {\n Custom: string\n }\n\n export interface AppsAndFeaturesEntry {\n UpgradeCode: string\n InstallerType: string\n }\n\n export interface ExpectedReturnCode {\n InstallerReturnCode: number\n ReturnResponse: string\n }\n\n export interface InstallerSwitches {\n Log: string\n }\n}\n\nexport type WingetItem = {\n filename: string\n version: string\n ext: string\n architecture: string\n}\n\nexport type WingetDownloadInfo = {\n name: string\n id: string\n dir: string\n filter: (item: Winget.Installer, index: number, arr: Winget.Installer[]) => boolean\n}\n\nexport async function downloadFromWinget({ name, id, dir, filter }: WingetDownloadInfo) {\n const { default: fetch } = await import(\"node-fetch\")\n const firstLetter = id[0].toLowerCase()\n const path = id.replace(/\\./g, \"/\")\n const response = await fetch(`https://api.github.com/repos/microsoft/winget-pkgs/contents/manifests/${firstLetter}/${path}`, { agent })\n const data: GithubContent[] = (await response.json()) as any\n if (!Array.isArray(data)) throw new Error((data as any).message)\n const reg2 = /^\\d+(\\.\\d+?)*$/\n const stables = data.filter(item => reg2.test(item.name))\n stables.sort((a, b) => {\n const avs = a.name.split(\".\")\n const bvs = b.name.split(\".\")\n const max = Math.max(avs.length, bvs.length)\n for (let i = 0; i < max; i++) {\n const av = avs[i] ? parseInt(avs[i]) : 0\n const bv = bvs[i] ? parseInt(bvs[i]) : 0\n if (av < bv) return 1\n if (av > bv) return -1\n }\n return 0\n })\n const response2 = await fetch(\n `https://raw.githubusercontent.com/microsoft/winget-pkgs/master/manifests/${firstLetter}/${path}/${stables[0].name}/${id}.installer.yaml`,\n { agent },\n )\n const yaml = await response2.text()\n const pkg: Winget.Package = YAML.parse(yaml)\n\n const installers = filter ? pkg.Installers.filter(filter) : pkg.Installers\n\n if (installers.length === 0) {\n consola.warn(`未找到 ${name} 的安装程序`)\n return\n }\n\n const result: WingetItem[] = []\n\n for (const { InstallerUrl, Architecture } of installers) {\n const filename = await download(InstallerUrl, dir)\n result.push({ filename, version: pkg.PackageVersion, ext: new URL(InstallerUrl).pathname.endsWith(\".exe\") ? \"exe\" : \"msi\", architecture: Architecture })\n }\n\n for (const { version, filename, architecture, ext } of result) {\n await sleep(100)\n await rename(join(dir, filename), join(dir, `${name}-${version}-${architecture}.${ext}`))\n }\n}\n\nexport interface GithubContent {\n name: string\n path: string\n sha: string\n size: number\n url: string\n html_url: string\n git_url: string\n download_url?: string | null\n type: string\n _links: Links\n}\n\nexport interface Links {\n self: string\n git: string\n html: string\n}\n\nexport async function downloadChrome(dir: string) {\n await downloadFromWinget({\n name: \"Chrome\",\n id: \"Google.Chrome\",\n dir,\n filter: item => item.Architecture === \"x64\",\n })\n}\n\nexport async function downloadNodeJS(dir: string) {\n await downloadFromWinget({\n name: \"NodeJS\",\n id: \"OpenJS.NodeJS.LTS\",\n dir,\n filter: item => item.Architecture === \"x64\",\n })\n}\n\nexport async function download7Zip(dir: string) {\n await downloadFromWinget({\n name: \"7Zip\",\n id: \"7zip.7zip\",\n dir,\n filter: item => item.Architecture === \"x64\" && item.InstallerType === \"exe\",\n })\n}\n\nexport async function downloadGit(dir: string) {\n await downloadFromWinget({\n name: \"Git\",\n id: \"Git.Git\",\n dir,\n filter: item => item.Architecture === \"x64\" && item.Scope === \"machine\",\n })\n}\n\nexport async function downloadDeskGo(dir: string) {\n await downloadFromPCQQ(dir, 3318, 23125)\n const dir2 = await readdir(dir)\n const file = dir2.find(item => item.startsWith(\"DeskGo\"))!\n await rename(\n join(dir, file),\n join(\n dir,\n file.replace(/^DeskGo_(.+)_full\\.exe$/, (match, arg) => `DeskGo-${arg.replace(/\\_/g, \".\")}-x64.exe`),\n ),\n )\n}\n\nexport async function downloadGeekUninstaller(dir: string) {\n await download(`https://geekuninstaller.com/geek.zip`, dir)\n await unzip({\n input: join(dir, \"geek.zip\"),\n output: dir,\n })\n await rm(join(dir, \"geek.zip\"), { force: true })\n const response = await fetch(\"https://geekuninstaller.com/download\")\n const text = await response.text()\n const version = text.match(/<b>(.+?)<\\/b>/)![1]\n await rename(join(dir, \"geek.exe\"), join(dir, `Geek-${version}-x64.exe`))\n}\n\nexport async function getVscodeExtInfo(ext: string): Promise<VscodeExt> {\n const { default: fetch } = await import(\"node-fetch\")\n const response = await fetch(`https://marketplace.visualstudio.com/items?itemName=${ext}`, { agent })\n const html = await response.text()\n const reg = /^(.+?)\\.(.+?)$/\n const [, author, name] = ext.match(reg)!\n let version: string\n if (ext === \"ms-ceintl.vscode-language-pack-zh-hans\") {\n const reg2 = /\"Versions\"\\:(\\[\\{\".+?\\])/\n const versions = JSON.parse(html.match(reg2)![1]) as { version: string }[]\n const output = await execAsync(\"code --version\")\n const codeVersions = output.split(\"\\n\")[0].split(\".\").map(Number)\n const item =\n versions.find(({ version }) =>\n version\n .split(\".\")\n .map(Number)\n .every((item, index) => index >= 2 || item <= codeVersions[index]),\n ) ?? versions[0]\n version = item.version\n } else {\n const reg2 = /\"Version\":\"(.+?)\"/\n version = html.match(reg2)![1]\n }\n const reg4 = /<span class=\"ux-item-name\">(.+?)<\\/span>/\n const displayName = html.match(reg4)![1]\n const url = `https://marketplace.visualstudio.com/_apis/public/gallery/publishers/${author}/vsextensions/${name}/${version}/vspackage`\n return { id: ext, name: displayName, version, url }\n // await download(url, dir, `${ext}-${version}.vsix`)\n}\n\nexport interface VscodeExt {\n id: string\n name: string\n version: string\n url: string\n}\n\nexport async function downloadVscodeExts(dir: string) {\n await mkdir(dir, { recursive: true })\n const { default: inquirer } = await import(\"inquirer\")\n consola.start(\"正在获取 VS Code 扩展列表\")\n const extList = await execAsync(\"code --list-extensions\")\n const exts = await Promise.all(\n extList\n .split(/[\\n\\r]/)\n .filter(Boolean)\n .map(ext => getVscodeExtInfo(ext)),\n )\n const setting = await getSetting()\n const vscodeExts = setting?.vscodeExts as string[] | undefined\n const exts2 = await inquirer.prompt({\n type: \"checkbox\",\n name: \"exts\",\n message: \"选择需要下载的扩展\",\n choices: exts.map(ext => ({ name: ext.name, value: ext.id })),\n default: vscodeExts?.filter(ext => exts.some(item => item.id === ext)) || exts.map(ext => ext.id),\n })\n setting.vscodeExts = exts2.exts\n await setSetting(setting)\n for (const ext of exts) {\n if (!exts2.exts.includes(ext.id)) continue\n consola.start(`正在下载 ${ext.name}`)\n await retry(() => download(ext.url, dir, `${ext.id}-${ext.version}.vsix`), 4)\n }\n}\n\nexport async function writeSyncVscodeScript(dir: string) {\n const script = `// @ts-check\nimport { spawn } from \"child_process\"\nimport { readdir, copyFile, rm } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\n/** \n * @param {string} command\n */\nfunction spawnAsync(command) {\n return new Promise((resolve, reject) => {\n const child = spawn(command, { shell: true, stdio: \"inherit\" })\n child.on(\"exit\", code => {\n if (code !== 0) return reject(new Error(\\`Command failed with code \\${code}\\`))\n resolve(0)\n })\n })\n}\n\nasync function main() {\n const dir = await readdir(\"./extensions\")\n for (const ext of dir) {\n await spawnAsync(\\`code --install-extension \"./extensions/\\${ext}\"\\`)\n }\n const userDir = homedir()\n const setting = join(userDir, \"AppData/Roaming/Code/User/settings.json\")\n await rm(setting, { force: true })\n await copyFile(\"./settings.json\", setting)\n const snippetTarget = join(userDir, \"AppData/Roaming/Code/User/snippets\")\n const dir2 = await readdir(\"./snippets\")\n for (const file of dir2) {\n await rm(join(snippetTarget, file), { force: true })\n await copyFile(join(\"./snippets\", file), join(snippetTarget, file))\n }\n}\n\nmain()`\n await writeFile(join(dir, \"syncVscode.mjs\"), script, \"utf-8\")\n}\n\nexport async function getProcessInfoFromPid(pid: number) {\n try {\n const stdout = await execAsync(`tasklist | findstr ${pid}`)\n const reg = new RegExp(`( +)${pid}( (Services|Console) +)`)\n return stdout\n .split(/[\\n\\r]/)\n .find(line => reg.test(line))\n ?.replace(reg, \"$1$2\")\n ?.replace(/ +/g, \" \")\n } catch (error) {\n return undefined\n }\n}\n\nexport type PidInfo = {\n pid: number\n info: string\n}\n\nexport async function getPidInfoFromPort(port: number) {\n try {\n const stdout = await execAsync(`netstat -ano | findstr :${port}`)\n const reg = new RegExp(` (\\\\[::\\\\]|(\\\\d{1,3}\\\\.){3}\\\\d{1,3}):${port} `)\n const result = Array.from(\n new Set(\n stdout\n .split(/[\\n\\r]/)\n .filter(line => reg.test(line))\n .map(line => ({ pid: parseInt(line.match(reg)![1]), info: line })),\n ),\n )\n for (let i = 0; ; ) {\n if (result.some(({ info }) => info[i] === undefined)) break\n if (result.some(({ info }) => info[i] !== \" \" || info[i + 1] !== \" \")) {\n i++\n continue\n }\n result.forEach(item => (item.info = `${item.info.slice(0, i)}${item.info.slice(i + 1)}`))\n }\n return result\n } catch (error) {\n return []\n }\n}\n\nexport async function getSetting() {\n const userDir = homedir()\n const settingPath = join(userDir, \".zixulu.json\")\n if (existsSync(settingPath)) {\n const setting = JSON.parse(await readFile(settingPath, \"utf-8\"))\n return setting\n }\n return {}\n}\n\nexport async function setSetting(setting: Record<string, any>) {\n const userDir = homedir()\n const settingPath = join(userDir, \".zixulu.json\")\n await writeFile(settingPath, JSON.stringify(setting, undefined, 4), \"utf-8\")\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA
|
|
4
|
+
"sourcesContent": ["import { agent } from \"@constant/index\"\nimport consola from \"consola\"\nimport { createWriteStream } from \"fs\"\nimport { mkdir, readdir, rename, rm, writeFile } from \"fs/promises\"\nimport { type Headers as NodeFetchHeaders } from \"node-fetch\"\nimport { join } from \"path\"\nimport { execAsync, unzip } from \"soda-nodejs\"\nimport { Readable } from \"stream\"\nimport YAML from \"yaml\"\nimport { getZixuluSetting } from \"./getZixuluSetting\"\nimport { retry } from \"./retry\"\nimport { setZixuluSetting } from \"./setZixuluSetting\"\n\nexport function isPositiveInteger(value: any, allowZero = false): value is number {\n return Number.isInteger(value) && (allowZero ? value >= 0 : value > 0)\n}\n\nexport function getFilename(headers: Headers | NodeFetchHeaders) {\n const disposition = headers.get(\"content-disposition\")\n if (!disposition) return undefined\n const reg = /filename=(.+?);/\n const result = disposition.match(reg)\n if (!result) return undefined\n return result[1]\n}\n\nexport async function download(url: string, dir: string, filename?: string) {\n const { default: fetch } = await import(\"node-fetch\")\n const response = await fetch(url, { agent })\n filename = getFilename(response.headers) || filename || new URL(url).pathname.split(\"/\").at(-1)!\n const writeable = createWriteStream(join(dir, filename))\n await new Promise((resolve, reject) => Readable.from(response.body!).pipe(writeable).on(\"finish\", resolve).on(\"error\", reject))\n return filename\n}\n\nexport async function downloadVscode(dir: string) {\n await downloadFromWinget({\n name: \"VSCode\",\n id: \"Microsoft.VisualStudioCode\",\n dir,\n filter: item => item.Architecture === \"x64\" && item.Scope === \"machine\",\n })\n}\n\nexport async function sleep(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n\nexport namespace PCQQ {\n export interface Result {\n resp: Resp\n }\n\n export interface Resp {\n soft_list: Softlist[]\n retCode: number\n }\n\n export interface Softlist {\n soft_id: number\n os_type: number\n os_bit: number\n display_name: string\n nick_ver: string\n ver_name: string\n file_size: string\n file_name: string\n publish_date: string\n download_url: string\n download_https_url: string\n }\n}\n\nexport async function downloadFromPCQQ(dir: string, cmdid: number, soft_id_list: number) {\n const data = new URLSearchParams()\n data.set(\"cmdid\", cmdid.toString())\n data.set(\"jprxReq[req][soft_id_list][]\", soft_id_list.toString())\n const headers = new Headers()\n headers.set(\"Content-Type\", \"application/x-www-form-urlencoded\")\n const response = await fetch(`https://luban.m.qq.com/api/public/software-manager/softwareProxy`, { method: \"POST\", headers, body: data.toString() })\n const result: PCQQ.Result = await response.json()\n await download(result.resp.soft_list[0].download_https_url, dir, result.resp.soft_list[0].file_name)\n}\n\nexport namespace Winget {\n export interface Package {\n PackageIdentifier: string\n PackageVersion: string\n InstallerType: string\n InstallModes: string[]\n InstallerSwitches: InstallerSwitches\n ExpectedReturnCodes: ExpectedReturnCode[]\n UpgradeBehavior: string\n Protocols: string[]\n FileExtensions: string[]\n AppsAndFeaturesEntries: AppsAndFeaturesEntry[]\n Installers: Installer[]\n ManifestType: string\n ManifestVersion: string\n }\n\n export interface Installer {\n Architecture: string\n Scope?: string\n InstallerUrl: string\n InstallerSha256: string\n InstallerLocale?: string\n InstallerType?: string\n }\n\n export interface InstallerSwitches2 {\n Custom: string\n }\n\n export interface AppsAndFeaturesEntry {\n UpgradeCode: string\n InstallerType: string\n }\n\n export interface ExpectedReturnCode {\n InstallerReturnCode: number\n ReturnResponse: string\n }\n\n export interface InstallerSwitches {\n Log: string\n }\n}\n\nexport type WingetItem = {\n filename: string\n version: string\n ext: string\n architecture: string\n}\n\nexport type WingetDownloadInfo = {\n name: string\n id: string\n dir: string\n filter: (item: Winget.Installer, index: number, arr: Winget.Installer[]) => boolean\n}\n\nexport async function downloadFromWinget({ name, id, dir, filter }: WingetDownloadInfo) {\n const { default: fetch } = await import(\"node-fetch\")\n const firstLetter = id[0].toLowerCase()\n const path = id.replace(/\\./g, \"/\")\n const response = await fetch(`https://api.github.com/repos/microsoft/winget-pkgs/contents/manifests/${firstLetter}/${path}`, { agent })\n const data: GithubContent[] = (await response.json()) as any\n if (!Array.isArray(data)) throw new Error((data as any).message)\n const reg2 = /^\\d+(\\.\\d+?)*$/\n const stables = data.filter(item => reg2.test(item.name))\n stables.sort((a, b) => {\n const avs = a.name.split(\".\")\n const bvs = b.name.split(\".\")\n const max = Math.max(avs.length, bvs.length)\n for (let i = 0; i < max; i++) {\n const av = avs[i] ? parseInt(avs[i]) : 0\n const bv = bvs[i] ? parseInt(bvs[i]) : 0\n if (av < bv) return 1\n if (av > bv) return -1\n }\n return 0\n })\n const response2 = await fetch(\n `https://raw.githubusercontent.com/microsoft/winget-pkgs/master/manifests/${firstLetter}/${path}/${stables[0].name}/${id}.installer.yaml`,\n { agent },\n )\n const yaml = await response2.text()\n const pkg: Winget.Package = YAML.parse(yaml)\n\n const installers = filter ? pkg.Installers.filter(filter) : pkg.Installers\n\n if (installers.length === 0) {\n consola.warn(`未找到 ${name} 的安装程序`)\n return\n }\n\n const result: WingetItem[] = []\n\n for (const { InstallerUrl, Architecture } of installers) {\n const filename = await download(InstallerUrl, dir)\n result.push({ filename, version: pkg.PackageVersion, ext: new URL(InstallerUrl).pathname.endsWith(\".exe\") ? \"exe\" : \"msi\", architecture: Architecture })\n }\n\n for (const { version, filename, architecture, ext } of result) {\n await sleep(100)\n await rename(join(dir, filename), join(dir, `${name}-${version}-${architecture}.${ext}`))\n }\n}\n\nexport interface GithubContent {\n name: string\n path: string\n sha: string\n size: number\n url: string\n html_url: string\n git_url: string\n download_url?: string | null\n type: string\n _links: Links\n}\n\nexport interface Links {\n self: string\n git: string\n html: string\n}\n\nexport async function downloadChrome(dir: string) {\n await downloadFromWinget({\n name: \"Chrome\",\n id: \"Google.Chrome\",\n dir,\n filter: item => item.Architecture === \"x64\",\n })\n}\n\nexport async function downloadNodeJS(dir: string) {\n await downloadFromWinget({\n name: \"NodeJS\",\n id: \"OpenJS.NodeJS.LTS\",\n dir,\n filter: item => item.Architecture === \"x64\",\n })\n}\n\nexport async function download7Zip(dir: string) {\n await downloadFromWinget({\n name: \"7Zip\",\n id: \"7zip.7zip\",\n dir,\n filter: item => item.Architecture === \"x64\" && item.InstallerType === \"exe\",\n })\n}\n\nexport async function downloadGit(dir: string) {\n await downloadFromWinget({\n name: \"Git\",\n id: \"Git.Git\",\n dir,\n filter: item => item.Architecture === \"x64\" && item.Scope === \"machine\",\n })\n}\n\nexport async function downloadDeskGo(dir: string) {\n await downloadFromPCQQ(dir, 3318, 23125)\n const dir2 = await readdir(dir)\n const file = dir2.find(item => item.startsWith(\"DeskGo\"))!\n await rename(\n join(dir, file),\n join(\n dir,\n file.replace(/^DeskGo_(.+)_full\\.exe$/, (match, arg) => `DeskGo-${arg.replace(/\\_/g, \".\")}-x64.exe`),\n ),\n )\n}\n\nexport async function downloadGeekUninstaller(dir: string) {\n await download(`https://geekuninstaller.com/geek.zip`, dir)\n await unzip({\n input: join(dir, \"geek.zip\"),\n output: dir,\n })\n await rm(join(dir, \"geek.zip\"), { force: true })\n const response = await fetch(\"https://geekuninstaller.com/download\")\n const text = await response.text()\n const version = text.match(/<b>(.+?)<\\/b>/)![1]\n await rename(join(dir, \"geek.exe\"), join(dir, `Geek-${version}-x64.exe`))\n}\n\nexport async function getVscodeExtInfo(ext: string): Promise<VscodeExt> {\n const { default: fetch } = await import(\"node-fetch\")\n const response = await fetch(`https://marketplace.visualstudio.com/items?itemName=${ext}`, { agent })\n const html = await response.text()\n const reg = /^(.+?)\\.(.+?)$/\n const [, author, name] = ext.match(reg)!\n let version: string\n if (ext === \"ms-ceintl.vscode-language-pack-zh-hans\") {\n const reg2 = /\"Versions\"\\:(\\[\\{\".+?\\])/\n const versions = JSON.parse(html.match(reg2)![1]) as { version: string }[]\n const output = await execAsync(\"code --version\")\n const codeVersions = output.split(\"\\n\")[0].split(\".\").map(Number)\n const item =\n versions.find(({ version }) =>\n version\n .split(\".\")\n .map(Number)\n .every((item, index) => index >= 2 || item <= codeVersions[index]),\n ) ?? versions[0]\n version = item.version\n } else {\n const reg2 = /\"Version\":\"(.+?)\"/\n version = html.match(reg2)![1]\n }\n const reg4 = /<span class=\"ux-item-name\">(.+?)<\\/span>/\n const displayName = html.match(reg4)![1]\n const url = `https://marketplace.visualstudio.com/_apis/public/gallery/publishers/${author}/vsextensions/${name}/${version}/vspackage`\n return { id: ext, name: displayName, version, url }\n // await download(url, dir, `${ext}-${version}.vsix`)\n}\n\nexport interface VscodeExt {\n id: string\n name: string\n version: string\n url: string\n}\n\nexport async function downloadVscodeExts(dir: string) {\n await mkdir(dir, { recursive: true })\n const { default: inquirer } = await import(\"inquirer\")\n consola.start(\"正在获取 VS Code 扩展列表\")\n const extList = await execAsync(\"code --list-extensions\")\n const exts = await Promise.all(\n extList\n .split(/[\\n\\r]/)\n .filter(Boolean)\n .map(ext => getVscodeExtInfo(ext)),\n )\n const setting = await getZixuluSetting()\n const vscodeDownloadHistory = setting?.vscodeDownloadHistory as string[] | undefined\n const exts2 = await inquirer.prompt({\n type: \"checkbox\",\n name: \"exts\",\n message: \"选择需要下载的扩展\",\n choices: exts.map(ext => ({ name: ext.name, value: ext.id })),\n default: vscodeDownloadHistory?.filter(ext => exts.some(item => item.id === ext)) || exts.map(ext => ext.id),\n })\n setting.vscodeDownloadHistory = exts2.exts\n await setZixuluSetting(setting)\n for (const ext of exts) {\n if (!exts2.exts.includes(ext.id)) continue\n consola.start(`正在下载 ${ext.name}`)\n await retry(() => download(ext.url, dir, `${ext.id}-${ext.version}.vsix`), 4)\n }\n}\n\nexport async function writeSyncVscodeScript(dir: string) {\n const script = `// @ts-check\nimport { spawn } from \"child_process\"\nimport { readdir, copyFile, rm } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\n/** \n * @param {string} command\n */\nfunction spawnAsync(command) {\n return new Promise((resolve, reject) => {\n const child = spawn(command, { shell: true, stdio: \"inherit\" })\n child.on(\"exit\", code => {\n if (code !== 0) return reject(new Error(\\`Command failed with code \\${code}\\`))\n resolve(0)\n })\n })\n}\n\nasync function main() {\n const dir = await readdir(\"./extensions\")\n for (const ext of dir) {\n await spawnAsync(\\`code --install-extension \"./extensions/\\${ext}\"\\`)\n }\n const userDir = homedir()\n const setting = join(userDir, \"AppData/Roaming/Code/User/settings.json\")\n await rm(setting, { force: true })\n await copyFile(\"./settings.json\", setting)\n const snippetTarget = join(userDir, \"AppData/Roaming/Code/User/snippets\")\n const dir2 = await readdir(\"./snippets\")\n for (const file of dir2) {\n await rm(join(snippetTarget, file), { force: true })\n await copyFile(join(\"./snippets\", file), join(snippetTarget, file))\n }\n}\n\nmain()`\n await writeFile(join(dir, \"syncVscode.mjs\"), script, \"utf-8\")\n}\n\nexport async function getProcessInfoFromPid(pid: number) {\n try {\n const stdout = await execAsync(`tasklist | findstr ${pid}`)\n const reg = new RegExp(`( +)${pid}( (Services|Console) +)`)\n return stdout\n .split(/[\\n\\r]/)\n .find(line => reg.test(line))\n ?.replace(reg, \"$1$2\")\n ?.replace(/ +/g, \" \")\n } catch (error) {\n return undefined\n }\n}\n\nexport type PidInfo = {\n pid: number\n info: string\n}\n\nexport async function getPidInfoFromPort(port: number) {\n try {\n const stdout = await execAsync(`netstat -ano | findstr :${port}`)\n const reg = new RegExp(` (\\\\[::\\\\]|(\\\\d{1,3}\\\\.){3}\\\\d{1,3}):${port} `)\n const result = Array.from(\n new Set(\n stdout\n .split(/[\\n\\r]/)\n .filter(line => reg.test(line))\n .map(line => ({ pid: parseInt(line.match(reg)![1]), info: line })),\n ),\n )\n for (let i = 0; ; ) {\n if (result.some(({ info }) => info[i] === undefined)) break\n if (result.some(({ info }) => info[i] !== \" \" || info[i + 1] !== \" \")) {\n i++\n continue\n }\n result.forEach(item => (item.info = `${item.info.slice(0, i)}${item.info.slice(i + 1)}`))\n }\n return result\n } catch (error) {\n return []\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["fetch", "YAML", "consola", "version", "item"]
|
|
7
7
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function setZixuluSetting(setting: Record<string, any>): Promise<void>;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
|
|
19
|
+
// src/utils/setZixuluSetting.ts
|
|
20
|
+
var setZixuluSetting_exports = {};
|
|
21
|
+
__export(setZixuluSetting_exports, {
|
|
22
|
+
setZixuluSetting: () => setZixuluSetting
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(setZixuluSetting_exports);
|
|
25
|
+
var import_promises = require("fs/promises");
|
|
26
|
+
var import_os = require("os");
|
|
27
|
+
var import_path = require("path");
|
|
28
|
+
async function setZixuluSetting(setting) {
|
|
29
|
+
const userDir = (0, import_os.homedir)();
|
|
30
|
+
const settingPath = (0, import_path.join)(userDir, ".zixulu.json");
|
|
31
|
+
await (0, import_promises.writeFile)(settingPath, JSON.stringify(setting, void 0, 4), "utf-8");
|
|
32
|
+
}
|
|
33
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
34
|
+
0 && (module.exports = {
|
|
35
|
+
setZixuluSetting
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=setZixuluSetting.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/setZixuluSetting.ts"],
|
|
4
|
+
"sourcesContent": ["import { writeFile } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\nexport async function setZixuluSetting(setting: Record<string, any>) {\n const userDir = homedir()\n const settingPath = join(userDir, \".zixulu.json\")\n await writeFile(settingPath, JSON.stringify(setting, undefined, 4), \"utf-8\")\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAA0B;AAC1B,gBAAwB;AACxB,kBAAqB;AAErB,eAAsB,iBAAiB,SAA8B;AACjE,QAAM,cAAU,mBAAQ;AACxB,QAAM,kBAAc,kBAAK,SAAS,cAAc;AAChD,YAAM,2BAAU,aAAa,KAAK,UAAU,SAAS,QAAW,CAAC,GAAG,OAAO;AAC/E;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/utils/syncVscode.js
CHANGED
|
@@ -50,9 +50,8 @@ async function syncVscode() {
|
|
|
50
50
|
import_consola.default.start("开始下载最新 VSCode 配置");
|
|
51
51
|
await (0, import_promises.copyFile)(setting, (0, import_path.join)(dir, "settings.json"));
|
|
52
52
|
const files = await (0, import_promises.readdir)(snippetSource);
|
|
53
|
-
for (const file of files)
|
|
53
|
+
for (const file of files)
|
|
54
54
|
await (0, import_promises.copyFile)((0, import_path.join)(snippetSource, file), (0, import_path.join)(snippetTarget, file));
|
|
55
|
-
}
|
|
56
55
|
import_consola.default.success("下载最新 VSCode 配置完成");
|
|
57
56
|
await (0, import__.downloadVscodeExts)((0, import_path.join)(dir, "extensions"));
|
|
58
57
|
import_consola.default.success("下载最新 VSCode 插件完成");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/syncVscode.ts"],
|
|
4
|
-
"sourcesContent": ["import consola from \"consola\"\nimport dayjs from \"dayjs\"\nimport { copyFile, mkdir, readdir } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\nimport { downloadVscode, downloadVscodeExts, writeSyncVscodeScript } from \".\"\n\nexport async function syncVscode() {\n const { default: inquirer } = await import(\"inquirer\")\n const userDir = homedir()\n const snippetSource = join(userDir, \"AppData/Roaming/Code/User/snippets\")\n const setting = join(userDir, \"AppData/Roaming/Code/User/settings.json\")\n const dir = `vscode-${dayjs().format(\"YYYYMMDDHHmmss\")}`\n await mkdir(dir, { recursive: true })\n const snippetTarget = join(dir, \"snippets\")\n await mkdir(snippetTarget, { recursive: true })\n consola.start(\"开始下载最新 VSCode 配置\")\n await copyFile(setting, join(dir, \"settings.json\"))\n const files = await readdir(snippetSource)\n for (const file of files)
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAoB;AACpB,mBAAkB;AAClB,sBAAyC;AACzC,gBAAwB;AACxB,kBAAqB;AACrB,eAA0E;AAE1E,eAAsB,aAAa;AAC/B,QAAM,EAAE,SAAS,SAAS,IAAI,MAAM,OAAO,UAAU;AACrD,QAAM,cAAU,mBAAQ;AACxB,QAAM,oBAAgB,kBAAK,SAAS,oCAAoC;AACxE,QAAM,cAAU,kBAAK,SAAS,yCAAyC;AACvE,QAAM,MAAM,cAAU,aAAAA,SAAM,EAAE,OAAO,gBAAgB;AACrD,YAAM,uBAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC,QAAM,oBAAgB,kBAAK,KAAK,UAAU;AAC1C,YAAM,uBAAM,eAAe,EAAE,WAAW,KAAK,CAAC;AAC9C,iBAAAC,QAAQ,MAAM,kBAAkB;AAChC,YAAM,0BAAS,aAAS,kBAAK,KAAK,eAAe,CAAC;AAClD,QAAM,QAAQ,UAAM,yBAAQ,aAAa;AACzC,aAAW,QAAQ
|
|
4
|
+
"sourcesContent": ["import consola from \"consola\"\nimport dayjs from \"dayjs\"\nimport { copyFile, mkdir, readdir } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\nimport { downloadVscode, downloadVscodeExts, writeSyncVscodeScript } from \".\"\n\nexport async function syncVscode() {\n const { default: inquirer } = await import(\"inquirer\")\n const userDir = homedir()\n const snippetSource = join(userDir, \"AppData/Roaming/Code/User/snippets\")\n const setting = join(userDir, \"AppData/Roaming/Code/User/settings.json\")\n const dir = `vscode-${dayjs().format(\"YYYYMMDDHHmmss\")}`\n await mkdir(dir, { recursive: true })\n const snippetTarget = join(dir, \"snippets\")\n await mkdir(snippetTarget, { recursive: true })\n consola.start(\"开始下载最新 VSCode 配置\")\n await copyFile(setting, join(dir, \"settings.json\"))\n const files = await readdir(snippetSource)\n for (const file of files) await copyFile(join(snippetSource, file), join(snippetTarget, file))\n consola.success(\"下载最新 VSCode 配置完成\")\n await downloadVscodeExts(join(dir, \"extensions\"))\n consola.success(\"下载最新 VSCode 插件完成\")\n await writeSyncVscodeScript(dir)\n const { vscode } = await inquirer.prompt({\n type: \"confirm\",\n name: \"vscode\",\n message: \"是否下载最新版 VSCode\",\n })\n if (vscode) {\n consola.start(\"开始下载最新 VSCode\")\n await downloadVscode(dir)\n consola.success(\"下载最新 VSCode 完成\")\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAoB;AACpB,mBAAkB;AAClB,sBAAyC;AACzC,gBAAwB;AACxB,kBAAqB;AACrB,eAA0E;AAE1E,eAAsB,aAAa;AAC/B,QAAM,EAAE,SAAS,SAAS,IAAI,MAAM,OAAO,UAAU;AACrD,QAAM,cAAU,mBAAQ;AACxB,QAAM,oBAAgB,kBAAK,SAAS,oCAAoC;AACxE,QAAM,cAAU,kBAAK,SAAS,yCAAyC;AACvE,QAAM,MAAM,cAAU,aAAAA,SAAM,EAAE,OAAO,gBAAgB;AACrD,YAAM,uBAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC,QAAM,oBAAgB,kBAAK,KAAK,UAAU;AAC1C,YAAM,uBAAM,eAAe,EAAE,WAAW,KAAK,CAAC;AAC9C,iBAAAC,QAAQ,MAAM,kBAAkB;AAChC,YAAM,0BAAS,aAAS,kBAAK,KAAK,eAAe,CAAC;AAClD,QAAM,QAAQ,UAAM,yBAAQ,aAAa;AACzC,aAAW,QAAQ;AAAO,cAAM,8BAAS,kBAAK,eAAe,IAAI,OAAG,kBAAK,eAAe,IAAI,CAAC;AAC7F,iBAAAA,QAAQ,QAAQ,kBAAkB;AAClC,YAAM,iCAAmB,kBAAK,KAAK,YAAY,CAAC;AAChD,iBAAAA,QAAQ,QAAQ,kBAAkB;AAClC,YAAM,gCAAsB,GAAG;AAC/B,QAAM,EAAE,OAAO,IAAI,MAAM,SAAS,OAAO;AAAA,IACrC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACb,CAAC;AACD,MAAI,QAAQ;AACR,mBAAAA,QAAQ,MAAM,eAAe;AAC7B,cAAM,yBAAe,GAAG;AACxB,mBAAAA,QAAQ,QAAQ,gBAAgB;AAAA,EACpC;AACJ;",
|
|
6
6
|
"names": ["dayjs", "consola"]
|
|
7
7
|
}
|
package/package.json
CHANGED
package/src/utils/addPrettier.ts
CHANGED
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
import consola from "consola"
|
|
2
|
-
import { writeFile } from "fs/promises"
|
|
3
|
-
import { AddDependenciesConfig, addDependency } from "./addDependency"
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
export const prettierConfigText = `/**
|
|
9
|
-
* @type {import("prettier").Options}
|
|
10
|
-
*/
|
|
11
|
-
const config = {
|
|
12
|
-
semi: false,
|
|
13
|
-
tabWidth: 4,
|
|
14
|
-
arrowParens: "avoid",
|
|
15
|
-
printWidth: 160,
|
|
16
|
-
plugins: ["prettier-plugin-organize-imports"],
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export default config
|
|
20
|
-
`
|
|
21
|
-
|
|
22
|
-
export const prettierConfigTextWithTailwind = `/**
|
|
23
|
-
* @type {import("prettier").Options}
|
|
24
|
-
*/
|
|
25
|
-
const config = {
|
|
26
|
-
semi: false,
|
|
27
|
-
tabWidth: 4,
|
|
28
|
-
arrowParens: "avoid",
|
|
29
|
-
printWidth: 160,
|
|
30
|
-
plugins: ["prettier-plugin-organize-imports", "prettier-plugin-tailwindcss"],
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export default config
|
|
34
|
-
`
|
|
35
|
-
|
|
36
|
-
/** 添加 prettier */
|
|
37
|
-
export async function addPrettier() {
|
|
38
|
-
consola.start("开始添加 prettier 配置")
|
|
39
|
-
const packageJson = await readPackageJson()
|
|
40
|
-
const tailwind =
|
|
41
|
-
Object.keys(packageJson.dependencies ?? {}).includes("tailwindcss") || Object.keys(packageJson.devDependencies ?? {}).includes("tailwindcss")
|
|
42
|
-
await writeFile("./prettier.config.mjs", tailwind ? prettierConfigTextWithTailwind : prettierConfigText)
|
|
43
|
-
const config: AddDependenciesConfig = {
|
|
44
|
-
package: ["prettier", "prettier-plugin-organize-imports"],
|
|
45
|
-
type: "devDependencies",
|
|
46
|
-
}
|
|
47
|
-
if (tailwind) (config.package as string[]).push("prettier-plugin-tailwindcss")
|
|
48
|
-
await addDependency(config)
|
|
49
|
-
const packageJson2 = await readPackageJson()
|
|
50
|
-
packageJson2.scripts ??= {}
|
|
51
|
-
packageJson2.scripts.format = "prettier --write ."
|
|
52
|
-
await writePackageJson({ data: packageJson2 })
|
|
53
|
-
await installDependceny()
|
|
54
|
-
consola.success("添加 prettier 配置成功")
|
|
55
|
-
}
|
|
1
|
+
import consola from "consola"
|
|
2
|
+
import { writeFile } from "fs/promises"
|
|
3
|
+
import { AddDependenciesConfig, addDependency } from "./addDependency"
|
|
4
|
+
import { installDependceny } from "./installDependceny"
|
|
5
|
+
import { readPackageJson } from "./readPackageJson"
|
|
6
|
+
import { writePackageJson } from "./writePackageJson"
|
|
7
|
+
|
|
8
|
+
export const prettierConfigText = `/**
|
|
9
|
+
* @type {import("prettier").Options}
|
|
10
|
+
*/
|
|
11
|
+
const config = {
|
|
12
|
+
semi: false,
|
|
13
|
+
tabWidth: 4,
|
|
14
|
+
arrowParens: "avoid",
|
|
15
|
+
printWidth: 160,
|
|
16
|
+
plugins: ["prettier-plugin-organize-imports"],
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export default config
|
|
20
|
+
`
|
|
21
|
+
|
|
22
|
+
export const prettierConfigTextWithTailwind = `/**
|
|
23
|
+
* @type {import("prettier").Options}
|
|
24
|
+
*/
|
|
25
|
+
const config = {
|
|
26
|
+
semi: false,
|
|
27
|
+
tabWidth: 4,
|
|
28
|
+
arrowParens: "avoid",
|
|
29
|
+
printWidth: 160,
|
|
30
|
+
plugins: ["prettier-plugin-organize-imports", "prettier-plugin-tailwindcss"],
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export default config
|
|
34
|
+
`
|
|
35
|
+
|
|
36
|
+
/** 添加 prettier */
|
|
37
|
+
export async function addPrettier() {
|
|
38
|
+
consola.start("开始添加 prettier 配置")
|
|
39
|
+
const packageJson = await readPackageJson()
|
|
40
|
+
const tailwind =
|
|
41
|
+
Object.keys(packageJson.dependencies ?? {}).includes("tailwindcss") || Object.keys(packageJson.devDependencies ?? {}).includes("tailwindcss")
|
|
42
|
+
await writeFile("./prettier.config.mjs", tailwind ? prettierConfigTextWithTailwind : prettierConfigText)
|
|
43
|
+
const config: AddDependenciesConfig = {
|
|
44
|
+
package: ["prettier", "prettier-plugin-organize-imports"],
|
|
45
|
+
type: "devDependencies",
|
|
46
|
+
}
|
|
47
|
+
if (tailwind) (config.package as string[]).push("prettier-plugin-tailwindcss")
|
|
48
|
+
await addDependency(config)
|
|
49
|
+
const packageJson2 = await readPackageJson()
|
|
50
|
+
packageJson2.scripts ??= {}
|
|
51
|
+
packageJson2.scripts.format = "prettier --write ."
|
|
52
|
+
await writePackageJson({ data: packageJson2 })
|
|
53
|
+
await installDependceny()
|
|
54
|
+
consola.success("添加 prettier 配置成功")
|
|
55
|
+
}
|
package/src/utils/downloadBun.ts
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { rename, rm } from "fs/promises"
|
|
2
|
-
import { join } from "path"
|
|
3
|
-
import { unzip } from "soda-nodejs"
|
|
4
|
-
import { download } from "."
|
|
5
|
-
import { getLatestRelease } from "./getLatestRelease"
|
|
6
|
-
|
|
7
|
-
export async function downloadBun(dir: string) {
|
|
8
|
-
const release = await getLatestRelease("oven-sh", "bun")
|
|
9
|
-
const url = release.assets.find(asset => asset.name === "bun-windows-x64.zip")?.browser_download_url
|
|
10
|
-
if (!url) throw new Error("未找到 bun-windows-x64.zip")
|
|
11
|
-
await download(url, dir)
|
|
12
|
-
await unzip({
|
|
13
|
-
input: "bun-windows-x64.zip",
|
|
14
|
-
output: ".",
|
|
15
|
-
cwd: dir,
|
|
16
|
-
})
|
|
17
|
-
await rename(join(dir, "bun-windows-x64", "bun.exe"), join(dir, "bun.exe"))
|
|
18
|
-
await rm(join(dir, "bun-windows-x64.zip"), { force: true })
|
|
19
|
-
await rm(join(dir, "bun-windows-x64"), { force: true, recursive: true })
|
|
20
|
-
}
|
|
1
|
+
import { rename, rm } from "fs/promises"
|
|
2
|
+
import { join } from "path"
|
|
3
|
+
import { unzip } from "soda-nodejs"
|
|
4
|
+
import { download } from "."
|
|
5
|
+
import { getLatestRelease } from "./getLatestRelease"
|
|
6
|
+
|
|
7
|
+
export async function downloadBun(dir: string) {
|
|
8
|
+
const release = await getLatestRelease("oven-sh", "bun")
|
|
9
|
+
const url = release.assets.find(asset => asset.name === "bun-windows-x64.zip")?.browser_download_url
|
|
10
|
+
if (!url) throw new Error("未找到 bun-windows-x64.zip")
|
|
11
|
+
await download(url, dir)
|
|
12
|
+
await unzip({
|
|
13
|
+
input: "bun-windows-x64.zip",
|
|
14
|
+
output: ".",
|
|
15
|
+
cwd: dir,
|
|
16
|
+
})
|
|
17
|
+
await rename(join(dir, "bun-windows-x64", "bun.exe"), join(dir, "bun.exe"))
|
|
18
|
+
await rm(join(dir, "bun-windows-x64.zip"), { force: true })
|
|
19
|
+
await rm(join(dir, "bun-windows-x64"), { force: true, recursive: true })
|
|
20
|
+
}
|
|
@@ -9,6 +9,8 @@ import { downloadFirefox } from "./downloadFirefox"
|
|
|
9
9
|
import { downloadHoneyview } from "./downloadHoneyview"
|
|
10
10
|
import { downloadPotPlayer } from "./downloadPotPlayer"
|
|
11
11
|
import { downloadPowerToys } from "./downloadPowerToys"
|
|
12
|
+
import { getZixuluSetting } from "./getZixuluSetting"
|
|
13
|
+
import { setZixuluSetting } from "./setZixuluSetting"
|
|
12
14
|
|
|
13
15
|
export const SoftwareDownloadMap: Record<Software, (dir: string) => Promise<void>> = {
|
|
14
16
|
[Software.Chrome]: downloadChrome,
|
|
@@ -30,13 +32,17 @@ export async function downloadLatestSoftware() {
|
|
|
30
32
|
consola.start("开始下载软件")
|
|
31
33
|
const { default: inquirer } = await import("inquirer")
|
|
32
34
|
const dir = `softwares-${dayjs().format("YYYYMMDDHHmmss")}`
|
|
35
|
+
const setting = await getZixuluSetting()
|
|
36
|
+
const softwareDownloadHistory = setting?.softwareDownloadHistory as Software[] | undefined
|
|
33
37
|
const { softwares } = await inquirer.prompt({
|
|
34
38
|
type: "checkbox",
|
|
35
39
|
name: "softwares",
|
|
36
40
|
message: "请选择要下载的软件",
|
|
37
41
|
choices: Object.values(Software),
|
|
38
|
-
default: Object.values(Software),
|
|
42
|
+
default: softwareDownloadHistory?.filter(software => Object.values(Software).includes(software)) ?? Object.values(Software),
|
|
39
43
|
})
|
|
44
|
+
setting.softwareDownloadHistory = softwares
|
|
45
|
+
await setZixuluSetting(setting)
|
|
40
46
|
if (softwares.length === 0) return
|
|
41
47
|
await mkdir(dir, { recursive: true })
|
|
42
48
|
for (const software of softwares) {
|
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
import { agent } from "@src/constant"
|
|
2
|
-
|
|
3
|
-
export interface Release {
|
|
4
|
-
url: string
|
|
5
|
-
assets_url: string
|
|
6
|
-
upload_url: string
|
|
7
|
-
html_url: string
|
|
8
|
-
id: number
|
|
9
|
-
author: Author
|
|
10
|
-
node_id: string
|
|
11
|
-
tag_name: string
|
|
12
|
-
target_commitish: string
|
|
13
|
-
name: string
|
|
14
|
-
draft: boolean
|
|
15
|
-
prerelease: boolean
|
|
16
|
-
created_at: string
|
|
17
|
-
published_at: string
|
|
18
|
-
assets: Asset[]
|
|
19
|
-
tarball_url: string
|
|
20
|
-
zipball_url: string
|
|
21
|
-
body: string
|
|
22
|
-
discussion_url: string
|
|
23
|
-
reactions: Reactions
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface Reactions {
|
|
27
|
-
url: string
|
|
28
|
-
total_count: number
|
|
29
|
-
"+1": number
|
|
30
|
-
"-1": number
|
|
31
|
-
laugh: number
|
|
32
|
-
hooray: number
|
|
33
|
-
confused: number
|
|
34
|
-
heart: number
|
|
35
|
-
rocket: number
|
|
36
|
-
eyes: number
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export interface Asset {
|
|
40
|
-
url: string
|
|
41
|
-
id: number
|
|
42
|
-
node_id: string
|
|
43
|
-
name: string
|
|
44
|
-
label?: string
|
|
45
|
-
uploader: Author
|
|
46
|
-
content_type: string
|
|
47
|
-
state: string
|
|
48
|
-
size: number
|
|
49
|
-
download_count: number
|
|
50
|
-
created_at: string
|
|
51
|
-
updated_at: string
|
|
52
|
-
browser_download_url: string
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export interface Author {
|
|
56
|
-
login: string
|
|
57
|
-
id: number
|
|
58
|
-
node_id: string
|
|
59
|
-
avatar_url: string
|
|
60
|
-
gravatar_id: string
|
|
61
|
-
url: string
|
|
62
|
-
html_url: string
|
|
63
|
-
followers_url: string
|
|
64
|
-
following_url: string
|
|
65
|
-
gists_url: string
|
|
66
|
-
starred_url: string
|
|
67
|
-
subscriptions_url: string
|
|
68
|
-
organizations_url: string
|
|
69
|
-
repos_url: string
|
|
70
|
-
events_url: string
|
|
71
|
-
received_events_url: string
|
|
72
|
-
type: string
|
|
73
|
-
site_admin: boolean
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export async function getLatestRelease(owner: string, repo: string): Promise<Release> {
|
|
77
|
-
const { default: fetch } = await import("node-fetch")
|
|
78
|
-
const url = `https://api.github.com/repos/${owner}/${repo}/releases/latest`
|
|
79
|
-
const response = await fetch(url, { agent })
|
|
80
|
-
const data = await response.json()
|
|
81
|
-
return data as Release
|
|
82
|
-
}
|
|
1
|
+
import { agent } from "@src/constant"
|
|
2
|
+
|
|
3
|
+
export interface Release {
|
|
4
|
+
url: string
|
|
5
|
+
assets_url: string
|
|
6
|
+
upload_url: string
|
|
7
|
+
html_url: string
|
|
8
|
+
id: number
|
|
9
|
+
author: Author
|
|
10
|
+
node_id: string
|
|
11
|
+
tag_name: string
|
|
12
|
+
target_commitish: string
|
|
13
|
+
name: string
|
|
14
|
+
draft: boolean
|
|
15
|
+
prerelease: boolean
|
|
16
|
+
created_at: string
|
|
17
|
+
published_at: string
|
|
18
|
+
assets: Asset[]
|
|
19
|
+
tarball_url: string
|
|
20
|
+
zipball_url: string
|
|
21
|
+
body: string
|
|
22
|
+
discussion_url: string
|
|
23
|
+
reactions: Reactions
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface Reactions {
|
|
27
|
+
url: string
|
|
28
|
+
total_count: number
|
|
29
|
+
"+1": number
|
|
30
|
+
"-1": number
|
|
31
|
+
laugh: number
|
|
32
|
+
hooray: number
|
|
33
|
+
confused: number
|
|
34
|
+
heart: number
|
|
35
|
+
rocket: number
|
|
36
|
+
eyes: number
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface Asset {
|
|
40
|
+
url: string
|
|
41
|
+
id: number
|
|
42
|
+
node_id: string
|
|
43
|
+
name: string
|
|
44
|
+
label?: string
|
|
45
|
+
uploader: Author
|
|
46
|
+
content_type: string
|
|
47
|
+
state: string
|
|
48
|
+
size: number
|
|
49
|
+
download_count: number
|
|
50
|
+
created_at: string
|
|
51
|
+
updated_at: string
|
|
52
|
+
browser_download_url: string
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface Author {
|
|
56
|
+
login: string
|
|
57
|
+
id: number
|
|
58
|
+
node_id: string
|
|
59
|
+
avatar_url: string
|
|
60
|
+
gravatar_id: string
|
|
61
|
+
url: string
|
|
62
|
+
html_url: string
|
|
63
|
+
followers_url: string
|
|
64
|
+
following_url: string
|
|
65
|
+
gists_url: string
|
|
66
|
+
starred_url: string
|
|
67
|
+
subscriptions_url: string
|
|
68
|
+
organizations_url: string
|
|
69
|
+
repos_url: string
|
|
70
|
+
events_url: string
|
|
71
|
+
received_events_url: string
|
|
72
|
+
type: string
|
|
73
|
+
site_admin: boolean
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export async function getLatestRelease(owner: string, repo: string): Promise<Release> {
|
|
77
|
+
const { default: fetch } = await import("node-fetch")
|
|
78
|
+
const url = `https://api.github.com/repos/${owner}/${repo}/releases/latest`
|
|
79
|
+
const response = await fetch(url, { agent })
|
|
80
|
+
const data = await response.json()
|
|
81
|
+
return data as Release
|
|
82
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { existsSync } from "fs"
|
|
2
|
+
import { readFile } from "fs/promises"
|
|
3
|
+
import { homedir } from "os"
|
|
4
|
+
import { join } from "path"
|
|
5
|
+
|
|
6
|
+
export async function getZixuluSetting() {
|
|
7
|
+
const userDir = homedir()
|
|
8
|
+
const settingPath = join(userDir, ".zixulu.json")
|
|
9
|
+
if (existsSync(settingPath)) {
|
|
10
|
+
const setting = JSON.parse(await readFile(settingPath, "utf-8"))
|
|
11
|
+
return setting
|
|
12
|
+
}
|
|
13
|
+
return {}
|
|
14
|
+
}
|
package/src/utils/index.ts
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { agent } from "@constant/index"
|
|
2
2
|
import consola from "consola"
|
|
3
|
-
import { createWriteStream
|
|
4
|
-
import { mkdir,
|
|
3
|
+
import { createWriteStream } from "fs"
|
|
4
|
+
import { mkdir, readdir, rename, rm, writeFile } from "fs/promises"
|
|
5
5
|
import { type Headers as NodeFetchHeaders } from "node-fetch"
|
|
6
|
-
import { homedir } from "os"
|
|
7
6
|
import { join } from "path"
|
|
8
7
|
import { execAsync, unzip } from "soda-nodejs"
|
|
9
8
|
import { Readable } from "stream"
|
|
10
9
|
import YAML from "yaml"
|
|
10
|
+
import { getZixuluSetting } from "./getZixuluSetting"
|
|
11
11
|
import { retry } from "./retry"
|
|
12
|
+
import { setZixuluSetting } from "./setZixuluSetting"
|
|
12
13
|
|
|
13
14
|
export function isPositiveInteger(value: any, allowZero = false): value is number {
|
|
14
15
|
return Number.isInteger(value) && (allowZero ? value >= 0 : value > 0)
|
|
@@ -318,17 +319,17 @@ export async function downloadVscodeExts(dir: string) {
|
|
|
318
319
|
.filter(Boolean)
|
|
319
320
|
.map(ext => getVscodeExtInfo(ext)),
|
|
320
321
|
)
|
|
321
|
-
const setting = await
|
|
322
|
-
const
|
|
322
|
+
const setting = await getZixuluSetting()
|
|
323
|
+
const vscodeDownloadHistory = setting?.vscodeDownloadHistory as string[] | undefined
|
|
323
324
|
const exts2 = await inquirer.prompt({
|
|
324
325
|
type: "checkbox",
|
|
325
326
|
name: "exts",
|
|
326
327
|
message: "选择需要下载的扩展",
|
|
327
328
|
choices: exts.map(ext => ({ name: ext.name, value: ext.id })),
|
|
328
|
-
default:
|
|
329
|
+
default: vscodeDownloadHistory?.filter(ext => exts.some(item => item.id === ext)) || exts.map(ext => ext.id),
|
|
329
330
|
})
|
|
330
|
-
setting.
|
|
331
|
-
await
|
|
331
|
+
setting.vscodeDownloadHistory = exts2.exts
|
|
332
|
+
await setZixuluSetting(setting)
|
|
332
333
|
for (const ext of exts) {
|
|
333
334
|
if (!exts2.exts.includes(ext.id)) continue
|
|
334
335
|
consola.start(`正在下载 ${ext.name}`)
|
|
@@ -421,19 +422,3 @@ export async function getPidInfoFromPort(port: number) {
|
|
|
421
422
|
return []
|
|
422
423
|
}
|
|
423
424
|
}
|
|
424
|
-
|
|
425
|
-
export async function getSetting() {
|
|
426
|
-
const userDir = homedir()
|
|
427
|
-
const settingPath = join(userDir, ".zixulu.json")
|
|
428
|
-
if (existsSync(settingPath)) {
|
|
429
|
-
const setting = JSON.parse(await readFile(settingPath, "utf-8"))
|
|
430
|
-
return setting
|
|
431
|
-
}
|
|
432
|
-
return {}
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
export async function setSetting(setting: Record<string, any>) {
|
|
436
|
-
const userDir = homedir()
|
|
437
|
-
const settingPath = join(userDir, ".zixulu.json")
|
|
438
|
-
await writeFile(settingPath, JSON.stringify(setting, undefined, 4), "utf-8")
|
|
439
|
-
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { writeFile } from "fs/promises"
|
|
2
|
+
import { homedir } from "os"
|
|
3
|
+
import { join } from "path"
|
|
4
|
+
|
|
5
|
+
export async function setZixuluSetting(setting: Record<string, any>) {
|
|
6
|
+
const userDir = homedir()
|
|
7
|
+
const settingPath = join(userDir, ".zixulu.json")
|
|
8
|
+
await writeFile(settingPath, JSON.stringify(setting, undefined, 4), "utf-8")
|
|
9
|
+
}
|
package/src/utils/syncVscode.ts
CHANGED
|
@@ -17,9 +17,7 @@ export async function syncVscode() {
|
|
|
17
17
|
consola.start("开始下载最新 VSCode 配置")
|
|
18
18
|
await copyFile(setting, join(dir, "settings.json"))
|
|
19
19
|
const files = await readdir(snippetSource)
|
|
20
|
-
for (const file of files)
|
|
21
|
-
await copyFile(join(snippetSource, file), join(snippetTarget, file))
|
|
22
|
-
}
|
|
20
|
+
for (const file of files) await copyFile(join(snippetSource, file), join(snippetTarget, file))
|
|
23
21
|
consola.success("下载最新 VSCode 配置完成")
|
|
24
22
|
await downloadVscodeExts(join(dir, "extensions"))
|
|
25
23
|
consola.success("下载最新 VSCode 插件完成")
|