create-cookbook 1.0.0-alpha.76 → 1.0.0-alpha.77

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/index.mjs +103 -28
  2. package/package.json +2 -1
package/index.mjs CHANGED
@@ -10,33 +10,40 @@ import { mkdirSync, existsSync, createWriteStream, rmSync } from "node:fs";
10
10
  import { remove } from "fs-extra";
11
11
  import consola from "consola";
12
12
  import gradient from "gradient-string";
13
- import * as tar from "tar";
13
+ import compressing from "compressing";
14
14
 
15
15
  const colorLong = gradient(["cyan", "green"]);
16
16
  const color = gradient(["cyan", "#2d9b87"]);
17
17
 
18
18
  (async () => {
19
+ const args = process.argv.slice(2);
20
+ let version = "latest";
21
+ if (args[0] && args[0].startsWith("--version=")) {
22
+ version = args[0].slice(10);
23
+ }
19
24
  let workspace = process.platform === "win32" ? join(process.env.USERPROFILE, ".cookbook") : join(process.env.HOME, ".cookbook");
20
25
  let tempspace = process.platform === "win32" ? join(process.env.USERPROFILE, ".cookbook", ".temp") : join(process.env.HOME, ".cookbook", ".temp");
21
26
  if (!existsSync(workspace)) mkdirSync(workspace);
22
27
  if (!existsSync(tempspace)) mkdirSync(tempspace);
23
28
 
24
- const name = `@milkio/cookbook-${process.platform}-${os.arch()}`;
25
- let packageInfo;
29
+ const uiName = `@milkio/cookbook-ui`;
30
+ const cookbookName = `@milkio/cookbook-${process.platform}-${os.arch()}`;
31
+ let uiPackageInfo;
32
+ let cookbookPackageInfo;
33
+ console.log("");
26
34
  for (const mirror of ["https://registry.npmjs.org/", "https://registry.npmmirror.com/", "https://mirrors.cloud.tencent.com/npm/", "https://cdn.jsdelivr.net/npm/"]) {
27
35
  try {
28
- console.log("");
29
- consola.start(color(`Checking (${mirror}${name})..`));
36
+ consola.start(color(`Checking (${mirror}${uiName})..`));
30
37
  const controller = new AbortController();
31
38
  const timeout = setTimeout(() => controller.abort(), 8000);
32
- const response = await fetch(`${mirror}${name}`, {
39
+ const response = await fetch(`${mirror}${uiName}`, {
33
40
  signal: controller.signal
34
41
  });
35
42
  clearTimeout(timeout);
36
43
  if (response.status !== 200) continue;
37
44
  const json = await response.json();
38
- if (json.name !== name) continue;
39
- packageInfo = {
45
+ if (json.name !== uiName) continue;
46
+ uiPackageInfo = {
40
47
  mirror,
41
48
  json,
42
49
  };
@@ -45,29 +52,70 @@ const color = gradient(["cyan", "#2d9b87"]);
45
52
  continue;
46
53
  }
47
54
  }
48
- if (!packageInfo) {
55
+ if (!uiPackageInfo) {
49
56
  consola.error(color("Network connection failed!"));
50
57
  exit(1);
51
58
  }
59
+ for (const mirror of ["https://registry.npmjs.org/", "https://registry.npmmirror.com/", "https://mirrors.cloud.tencent.com/npm/", "https://cdn.jsdelivr.net/npm/"]) {
60
+ try {
61
+ consola.start(color(`Checking (${mirror}${cookbookName})..`));
62
+ const controller = new AbortController();
63
+ const timeout = setTimeout(() => controller.abort(), 8000);
64
+ const response = await fetch(`${mirror}${cookbookName}`, {
65
+ signal: controller.signal
66
+ });
67
+ clearTimeout(timeout);
68
+ if (response.status !== 200) continue;
69
+ const json = await response.json();
70
+ if (json.name !== cookbookName) continue;
71
+ cookbookPackageInfo = {
72
+ mirror,
73
+ json,
74
+ };
75
+ break;
76
+ } catch (error) {
77
+ continue;
78
+ }
79
+ }
80
+ if (!cookbookPackageInfo) {
81
+ consola.error(color("Network connection failed!"));
82
+ exit(1);
83
+ }
84
+
85
+ const uiUrl = `${cookbookPackageInfo.mirror}${uiName}/-/cookbook-ui-${version === 'latest' ? uiPackageInfo.json["dist-tags"].latest : version}.tgz`;
86
+ consola.start(uiUrl);
87
+ consola.start(color(`Downloading Cookbook UI (${uiUrl})..`));
88
+ await utils.downloadFile(uiUrl, tempspace, "ui.tgz");
89
+ consola.success(color("Downloaded!"));
90
+ const uiExtractPromise = ((async () => {
91
+ consola.start(color(`Cookbook UI Extracting..`));
92
+ if (!existsSync(join(tempspace, "ui"))) mkdirSync(join(tempspace, "ui"))
93
+ await compressing.tgz.uncompress(join(tempspace, "ui.tgz"), join(tempspace, "ui"));
94
+ consola.success(color("Cookbook UI Extracted!"));
95
+ }))();
52
96
 
53
- const url = `${packageInfo.mirror}${name}/-/cookbook-${process.platform}-${os.arch()}-${packageInfo.json["dist-tags"].latest}.tgz`;
54
- console.log(url)
55
- consola.start(url);
56
- consola.start(color(`Downloading..`));
57
- await utils.downloadFile(url, tempspace, "cookbook.tgz");
97
+ const cookbookUrl = `${cookbookPackageInfo.mirror}${cookbookName}/-/cookbook-${process.platform}-${os.arch()}-${version === 'latest' ? cookbookPackageInfo.json["dist-tags"].latest : version}.tgz`;
98
+ consola.start(cookbookUrl);
99
+ consola.start(color(`Downloading Cookbook Core (${cookbookUrl})..`));
100
+ await utils.downloadFile(cookbookUrl, tempspace, "cookbook.tgz");
58
101
  consola.success(color("Downloaded!"));
102
+ const cookbookExtractPromise = ((async () => {
103
+ consola.start(color(`Cookbook Core Extracting..`));
104
+ await compressing.tgz.uncompress(join(tempspace, "cookbook.tgz"), tempspace);
105
+ consola.success(color("Cookbook Core Extracted!"));
106
+ }))();
59
107
 
60
- consola.start(color(`Extracting..`));
61
- await tar.extract({
62
- file: join(tempspace, "cookbook.tgz"),
63
- cwd: tempspace,
64
- });
65
- await utils.mvToPathAndClean(join(tempspace, "package"), process.platform === "win32" ? "co.exe" : "co", tempspace);
66
- consola.success(color("Extracted!"));
108
+ await Promise.all([uiExtractPromise, cookbookExtractPromise]);
109
+
110
+ consola.success(color("Installing.."));
111
+ await utils.mvToPathAndInstall(join(tempspace, "package"), process.platform === "win32" ? "co.exe" : "co", tempspace);
112
+ await utils.mvUIDir(join(tempspace, "ui", "package"));
113
+ await utils.tempspaceClean(tempspace);
114
+ consola.success(color("Installed!"));
67
115
 
68
116
  console.log("");
69
117
  consola.info(color(`Try run: co version`));
70
- consola.info(colorLong(`If you find that the co command does not exist, try restarting your Terminal or System`));
118
+ consola.info(colorLong(`* If you find that the co command does not exist, try restarting your Terminal or System`));
71
119
  })();
72
120
 
73
121
  const utils = {
@@ -78,7 +126,35 @@ const utils = {
78
126
  const fileStream = createWriteStream(destination, { flags: "wx" });
79
127
  await finished(Readable.fromWeb(res.body).pipe(fileStream));
80
128
  },
81
- mvToPathAndClean: async (workspace, filename, tempspace) => {
129
+ mvUIDir: async (tempspace) => {
130
+ if (!existsSync(process.env.USERPROFILE, ".cookbook")) mkdirSync(process.env.USERPROFILE, ".cookbook");
131
+ if (process.platform === "win32") {
132
+ if (existsSync(join(process.env.USERPROFILE, ".cookbook", 'ui'))) await utils.executePowershell(`Remove-Item -Recurse -Force "${join(process.env.USERPROFILE, ".cookbook", 'ui')}";`);
133
+ await utils.executePowershell(`Move-Item -Path "${join(tempspace)}" -Destination "${join(process.env.USERPROFILE, ".cookbook", 'ui')}" -Force;`);
134
+ return;
135
+ }
136
+ if (process.platform === "linux") {
137
+ if (existsSync(join(process.env.HOME, ".cookbook", 'ui'))) await utils.executeBash(`rm -rf "${join(process.env.HOME, ".cookbook", 'ui')}";`);
138
+ await utils.executeBash(`mv "${join(tempspace)}" "${join(process.env.HOME, ".cookbook", 'ui')}"`);
139
+ }
140
+ if (process.platform === "darwin") {
141
+ if (existsSync(join(process.env.HOME, ".cookbook", 'ui'))) await utils.executeBash(`rm -rf "${join(process.env.HOME, ".cookbook", 'ui')}";`);
142
+ await utils.executeBash(`mv "${join(tempspace)}" "${join(process.env.HOME, ".cookbook", 'ui')}"`);
143
+ }
144
+ },
145
+ tempspaceClean: async (tempspace) => {
146
+ if (process.platform === "win32") {
147
+ if (existsSync(join(tempspace))) await utils.executePowershell(`Remove-Item -Recurse -Force "${join(tempspace)}";`);
148
+ return;
149
+ }
150
+ if (process.platform === "linux") {
151
+ if (existsSync(join(tempspace))) await utils.executeBash(`rm -rf "${join(tempspace)}"`);
152
+ }
153
+ if (process.platform === "darwin") {
154
+ if (existsSync(join(tempspace))) await utils.executeBash(`rm -rf "${join(tempspace)}"`);
155
+ }
156
+ },
157
+ mvToPathAndInstall: async (workspace, filename, tempspace) => {
82
158
  if (process.platform === "win32") {
83
159
  await new Promise((resolve) => setTimeout(resolve, 500));
84
160
  if (!(process.env.PATH.includes(`${join(process.env.USERPROFILE, ".cookbook")};`) || process.env.PATH.includes(`;${join(process.env.USERPROFILE, ".cookbook")}`) || process.env.PATH === `${join(process.env.USERPROFILE, ".cookbook")}`)) {
@@ -87,7 +163,6 @@ const utils = {
87
163
  if (!existsSync(process.env.USERPROFILE, ".cookbook")) mkdirSync(process.env.USERPROFILE, ".cookbook");
88
164
  if (existsSync(join(process.env.USERPROFILE, ".cookbook", filename))) rmSync(join(process.env.USERPROFILE, ".cookbook", filename));
89
165
  await utils.executePowershell(`Move-Item -Path "${join(workspace, filename)}" -Destination "${join(process.env.USERPROFILE, ".cookbook")}";`);
90
- await utils.executePowershell(`Remove-Item -Recurse -Force "${join(tempspace)}";`);
91
166
  return;
92
167
  }
93
168
  if (process.platform === "linux") {
@@ -108,8 +183,8 @@ const utils = {
108
183
  if (pathChecked.startsWith("/home")) await utils.executeBash(`rm -f ${join(pathChecked, filename)}`);
109
184
  else await utils.executeBash(`sudo rm -f ${join(pathChecked, filename)}`);
110
185
  }
111
- if (pathChecked.startsWith("/home")) await utils.executeBash(`mv ${join(workspace, filename)} ${pathChecked} && chmod +x ${join(pathChecked, filename)} && rm -rf ${join(tempspace)}`);
112
- else await utils.executeBash(`sudo mv ${join(workspace, filename)} ${pathChecked} && sudo chmod +x ${join(pathChecked, filename)} && sudo rm -rf ${join(tempspace)}`);
186
+ if (pathChecked.startsWith("/home")) await utils.executeBash(`mv ${join(workspace, filename)} ${pathChecked} && chmod +x ${join(pathChecked, filename)}`);
187
+ else await utils.executeBash(`sudo mv ${join(workspace, filename)} ${pathChecked} && sudo chmod +x ${join(pathChecked, filename)}`);
113
188
  }
114
189
  if (process.platform === "darwin") {
115
190
  const paths = [join(process.env.HOME, "bin"), join(process.env.HOME, ".bin"), join(process.env.HOME, ".local", "bin"), "/usr/local/bin"];
@@ -129,8 +204,8 @@ const utils = {
129
204
  if (pathChecked.startsWith("/Users")) await utils.executeBash(`rm -f ${join(pathChecked, filename)}`);
130
205
  else await utils.executeBash(`sudo rm -f ${join(pathChecked, filename)}`);
131
206
  }
132
- if (pathChecked.startsWith("/Users")) await utils.executeBash(`mv ${join(workspace, filename)} ${pathChecked} && chmod +x ${join(pathChecked, filename)} && rm -rf ${join(tempspace)}`);
133
- else await utils.executeBash(`sudo mv ${join(workspace, filename)} ${pathChecked} && sudo chmod +x ${join(pathChecked, filename)} && sudo rm -rf ${join(tempspace)}`);
207
+ if (pathChecked.startsWith("/Users")) await utils.executeBash(`mv ${join(workspace, filename)} ${pathChecked} && chmod +x ${join(pathChecked, filename)}`);
208
+ else await utils.executeBash(`sudo mv ${join(workspace, filename)} ${pathChecked} && sudo chmod +x ${join(pathChecked, filename)}`);
134
209
  }
135
210
  },
136
211
  executePowershell: async (script) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-cookbook",
3
- "version": "1.0.0-alpha.76",
3
+ "version": "1.0.0-alpha.77",
4
4
  "main": "index.mjs",
5
5
  "bin": {
6
6
  "create-cookbook": "./index.mjs"
@@ -9,6 +9,7 @@
9
9
  "create-cookbook": "./index.mjs"
10
10
  },
11
11
  "dependencies": {
12
+ "compressing": "^1.10.1",
12
13
  "consola": "^3.2.3",
13
14
  "fs-extra": "^11.2.0",
14
15
  "gradient-string": "^3.0.0",