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.
@@ -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\"\r\nimport { writeFile } from \"fs/promises\"\r\nimport { AddDependenciesConfig, addDependency } from \"./addDependency\"\r\nimport { readPackageJson } from \"./readPackageJson\"\r\nimport { writePackageJson } from \"./writePackageJson\"\r\nimport { installDependceny } from \"./installDependceny\"\r\n\r\nexport const prettierConfigText = `/**\r\n * @type {import(\"prettier\").Options}\r\n */\r\nconst config = {\r\n semi: false,\r\n tabWidth: 4,\r\n arrowParens: \"avoid\",\r\n printWidth: 160,\r\n plugins: [\"prettier-plugin-organize-imports\"],\r\n}\r\n\r\nexport default config\r\n`\r\n\r\nexport const prettierConfigTextWithTailwind = `/**\r\n * @type {import(\"prettier\").Options}\r\n */\r\nconst config = {\r\n semi: false,\r\n tabWidth: 4,\r\n arrowParens: \"avoid\",\r\n printWidth: 160,\r\n plugins: [\"prettier-plugin-organize-imports\", \"prettier-plugin-tailwindcss\"],\r\n}\r\n\r\nexport default config\r\n`\r\n\r\n/** 添加 prettier */\r\nexport async function addPrettier() {\r\n consola.start(\"开始添加 prettier 配置\")\r\n const packageJson = await readPackageJson()\r\n const tailwind =\r\n Object.keys(packageJson.dependencies ?? {}).includes(\"tailwindcss\") || Object.keys(packageJson.devDependencies ?? {}).includes(\"tailwindcss\")\r\n await writeFile(\"./prettier.config.mjs\", tailwind ? prettierConfigTextWithTailwind : prettierConfigText)\r\n const config: AddDependenciesConfig = {\r\n package: [\"prettier\", \"prettier-plugin-organize-imports\"],\r\n type: \"devDependencies\",\r\n }\r\n if (tailwind) (config.package as string[]).push(\"prettier-plugin-tailwindcss\")\r\n await addDependency(config)\r\n const packageJson2 = await readPackageJson()\r\n packageJson2.scripts ??= {}\r\n packageJson2.scripts.format = \"prettier --write .\"\r\n await writePackageJson({ data: packageJson2 })\r\n await installDependceny()\r\n consola.success(\"添加 prettier 配置成功\")\r\n}\r\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAoB;AACpB,sBAA0B;AAC1B,2BAAqD;AACrD,6BAAgC;AAChC,8BAAiC;AACjC,+BAAkC;AAE3B,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;",
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\"\r\nimport { join } from \"path\"\r\nimport { unzip } from \"soda-nodejs\"\r\nimport { download } from \".\"\r\nimport { getLatestRelease } from \"./getLatestRelease\"\r\n\r\nexport async function downloadBun(dir: string) {\r\n const release = await getLatestRelease(\"oven-sh\", \"bun\")\r\n const url = release.assets.find(asset => asset.name === \"bun-windows-x64.zip\")?.browser_download_url\r\n if (!url) throw new Error(\"未找到 bun-windows-x64.zip\")\r\n await download(url, dir)\r\n await unzip({\r\n input: \"bun-windows-x64.zip\",\r\n output: \".\",\r\n cwd: dir,\r\n })\r\n await rename(join(dir, \"bun-windows-x64\", \"bun.exe\"), join(dir, \"bun.exe\"))\r\n await rm(join(dir, \"bun-windows-x64.zip\"), { force: true })\r\n await rm(join(dir, \"bun-windows-x64\"), { force: true, recursive: true })\r\n}\r\n"],
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;AAE3B,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,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,OAAO,OAAO,wBAAQ;AAAA,EACnC,CAAC;AACD,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;",
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\"\r\n\r\nexport interface Release {\r\n url: string\r\n assets_url: string\r\n upload_url: string\r\n html_url: string\r\n id: number\r\n author: Author\r\n node_id: string\r\n tag_name: string\r\n target_commitish: string\r\n name: string\r\n draft: boolean\r\n prerelease: boolean\r\n created_at: string\r\n published_at: string\r\n assets: Asset[]\r\n tarball_url: string\r\n zipball_url: string\r\n body: string\r\n discussion_url: string\r\n reactions: Reactions\r\n}\r\n\r\nexport interface Reactions {\r\n url: string\r\n total_count: number\r\n \"+1\": number\r\n \"-1\": number\r\n laugh: number\r\n hooray: number\r\n confused: number\r\n heart: number\r\n rocket: number\r\n eyes: number\r\n}\r\n\r\nexport interface Asset {\r\n url: string\r\n id: number\r\n node_id: string\r\n name: string\r\n label?: string\r\n uploader: Author\r\n content_type: string\r\n state: string\r\n size: number\r\n download_count: number\r\n created_at: string\r\n updated_at: string\r\n browser_download_url: string\r\n}\r\n\r\nexport interface Author {\r\n login: string\r\n id: number\r\n node_id: string\r\n avatar_url: string\r\n gravatar_id: string\r\n url: string\r\n html_url: string\r\n followers_url: string\r\n following_url: string\r\n gists_url: string\r\n starred_url: string\r\n subscriptions_url: string\r\n organizations_url: string\r\n repos_url: string\r\n events_url: string\r\n received_events_url: string\r\n type: string\r\n site_admin: boolean\r\n}\r\n\r\nexport async function getLatestRelease(owner: string, repo: string): Promise<Release> {\r\n const { default: fetch } = await import(\"node-fetch\")\r\n const url = `https://api.github.com/repos/${owner}/${repo}/releases/latest`\r\n const response = await fetch(url, { agent })\r\n const data = await response.json()\r\n return data as Release\r\n}\r\n"],
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
+ }
@@ -120,5 +120,3 @@ export declare function getPidInfoFromPort(port: number): Promise<{
120
120
  pid: number;
121
121
  info: string;
122
122
  }[]>;
123
- export declare function getSetting(): Promise<any>;
124
- export declare function setSetting(setting: Record<string, any>): Promise<void>;
@@ -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 getSetting();
241
- const vscodeExts = setting?.vscodeExts;
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: vscodeExts?.filter((ext) => exts.some((item) => item.id === ext)) || exts.map((ext) => ext.id)
246
+ default: vscodeDownloadHistory?.filter((ext) => exts.some((item) => item.id === ext)) || exts.map((ext) => ext.id)
248
247
  });
249
- setting.vscodeExts = exts2.exts;
250
- await setSetting(setting);
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
  });
@@ -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": "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",
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
+ }
@@ -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) {\n await copyFile(join(snippetSource, file), join(snippetTarget, file))\n }\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,OAAO;AACtB,cAAM,8BAAS,kBAAK,eAAe,IAAI,OAAG,kBAAK,eAAe,IAAI,CAAC;AAAA,EACvE;AACA,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;",
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zixulu",
3
- "version": "1.46.0",
3
+ "version": "1.46.2",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "bin": {
@@ -1,55 +1,55 @@
1
- import consola from "consola"
2
- import { writeFile } from "fs/promises"
3
- import { AddDependenciesConfig, addDependency } from "./addDependency"
4
- import { readPackageJson } from "./readPackageJson"
5
- import { writePackageJson } from "./writePackageJson"
6
- import { installDependceny } from "./installDependceny"
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
+ }
@@ -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
+ }
@@ -1,14 +1,15 @@
1
1
  import { agent } from "@constant/index"
2
2
  import consola from "consola"
3
- import { createWriteStream, existsSync } from "fs"
4
- import { mkdir, readFile, readdir, rename, rm, writeFile } from "fs/promises"
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 getSetting()
322
- const vscodeExts = setting?.vscodeExts as string[] | undefined
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: vscodeExts?.filter(ext => exts.some(item => item.id === ext)) || exts.map(ext => ext.id),
329
+ default: vscodeDownloadHistory?.filter(ext => exts.some(item => item.id === ext)) || exts.map(ext => ext.id),
329
330
  })
330
- setting.vscodeExts = exts2.exts
331
- await setSetting(setting)
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
+ }
@@ -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 插件完成")