tiendu 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +106 -42
- package/bin/tiendu.js +130 -55
- package/lib/build.mjs +240 -131
- package/lib/config.mjs +68 -12
- package/lib/dev.mjs +26 -30
- package/lib/init.mjs +116 -106
- package/lib/preview.mjs +63 -42
- package/lib/publish.mjs +14 -16
- package/lib/pull.mjs +9 -6
- package/lib/push.mjs +8 -10
- package/lib/stores.mjs +91 -0
- package/lib/ui.mjs +138 -0
- package/lib/update-check.mjs +8 -4
- package/package.json +1 -1
package/lib/ui.mjs
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
|
|
3
|
+
let forcedNonInteractive = false;
|
|
4
|
+
|
|
5
|
+
const canUseInteractiveUi = () =>
|
|
6
|
+
!forcedNonInteractive && Boolean(process.stdin.isTTY) && Boolean(process.stdout.isTTY);
|
|
7
|
+
|
|
8
|
+
const writePlain = (message, { error = false } = {}) => {
|
|
9
|
+
const text = String(message ?? "");
|
|
10
|
+
if (error) {
|
|
11
|
+
console.error(text);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
console.log(text);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export const configureUi = ({ nonInteractive = false } = {}) => {
|
|
18
|
+
forcedNonInteractive = nonInteractive;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export const isInteractive = () => canUseInteractiveUi();
|
|
22
|
+
|
|
23
|
+
export const intro = (message) => {
|
|
24
|
+
if (canUseInteractiveUi()) {
|
|
25
|
+
p.intro(message);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
writePlain(message);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export const outro = (message) => {
|
|
32
|
+
if (canUseInteractiveUi()) {
|
|
33
|
+
p.outro(message);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
writePlain(message);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const cancel = (message) => {
|
|
40
|
+
if (canUseInteractiveUi()) {
|
|
41
|
+
p.cancel(message);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
writePlain(message, { error: true });
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export const note = (message, title) => {
|
|
48
|
+
if (canUseInteractiveUi()) {
|
|
49
|
+
p.note(message, title);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (title) writePlain(`${title}:`);
|
|
54
|
+
for (const line of String(message ?? "").split("\n")) {
|
|
55
|
+
writePlain(line);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export const log = {
|
|
60
|
+
info(message) {
|
|
61
|
+
if (canUseInteractiveUi()) return p.log.info(message);
|
|
62
|
+
writePlain(message);
|
|
63
|
+
},
|
|
64
|
+
warn(message) {
|
|
65
|
+
if (canUseInteractiveUi()) return p.log.warn(message);
|
|
66
|
+
writePlain(message, { error: true });
|
|
67
|
+
},
|
|
68
|
+
error(message) {
|
|
69
|
+
if (canUseInteractiveUi()) return p.log.error(message);
|
|
70
|
+
writePlain(message, { error: true });
|
|
71
|
+
},
|
|
72
|
+
success(message) {
|
|
73
|
+
if (canUseInteractiveUi()) return p.log.success(message);
|
|
74
|
+
writePlain(message);
|
|
75
|
+
},
|
|
76
|
+
message(message) {
|
|
77
|
+
if (canUseInteractiveUi()) return p.log.message(message);
|
|
78
|
+
writePlain(message);
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
export const spinner = () => {
|
|
83
|
+
if (canUseInteractiveUi()) {
|
|
84
|
+
return p.spinner();
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
let lastMessage = "";
|
|
88
|
+
return {
|
|
89
|
+
start(message) {
|
|
90
|
+
lastMessage = message ?? "";
|
|
91
|
+
if (lastMessage) writePlain(lastMessage);
|
|
92
|
+
},
|
|
93
|
+
message(message) {
|
|
94
|
+
if (!message || message === lastMessage) return;
|
|
95
|
+
lastMessage = message;
|
|
96
|
+
writePlain(message);
|
|
97
|
+
},
|
|
98
|
+
stop(message, code = 0) {
|
|
99
|
+
const finalMessage = message ?? lastMessage;
|
|
100
|
+
if (!finalMessage) return;
|
|
101
|
+
writePlain(finalMessage, { error: code !== 0 });
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
export const confirm = async (options) => {
|
|
107
|
+
if (canUseInteractiveUi()) {
|
|
108
|
+
return p.confirm(options);
|
|
109
|
+
}
|
|
110
|
+
return true;
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
const failForPrompt = (message) => {
|
|
114
|
+
throw new Error(message);
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
export const select = async (options) => {
|
|
118
|
+
if (canUseInteractiveUi()) {
|
|
119
|
+
return p.select(options);
|
|
120
|
+
}
|
|
121
|
+
return failForPrompt(`Cannot prompt for selection in non-interactive mode: ${options.message}`);
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
export const text = async (options) => {
|
|
125
|
+
if (canUseInteractiveUi()) {
|
|
126
|
+
return p.text(options);
|
|
127
|
+
}
|
|
128
|
+
return failForPrompt(`Cannot prompt for text input in non-interactive mode: ${options.message}`);
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
export const password = async (options) => {
|
|
132
|
+
if (canUseInteractiveUi()) {
|
|
133
|
+
return p.password(options);
|
|
134
|
+
}
|
|
135
|
+
return failForPrompt(`Cannot prompt for password input in non-interactive mode: ${options.message}`);
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
export const isCancel = p.isCancel;
|
package/lib/update-check.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import * as
|
|
3
|
+
import * as ui from "./ui.mjs";
|
|
4
4
|
|
|
5
5
|
const CONFIG_DIR = ".cli";
|
|
6
6
|
const UPDATE_CHECK_FILE = "update-check.json";
|
|
@@ -91,6 +91,10 @@ try {
|
|
|
91
91
|
* Does nothing if check fails — never blocks the user.
|
|
92
92
|
*/
|
|
93
93
|
export const checkForUpdates = async () => {
|
|
94
|
+
if (!ui.isInteractive()) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
|
|
94
98
|
const now = Date.now();
|
|
95
99
|
const state = await readUpdateCheckState();
|
|
96
100
|
|
|
@@ -132,14 +136,14 @@ export const checkForUpdatesNow = async () => {
|
|
|
132
136
|
});
|
|
133
137
|
|
|
134
138
|
if (!latestVersion) {
|
|
135
|
-
|
|
139
|
+
ui.log.error("Could not check for updates right now.");
|
|
136
140
|
return { ok: false };
|
|
137
141
|
}
|
|
138
142
|
|
|
139
143
|
if (isOlderVersion(currentVersion, latestVersion)) {
|
|
140
144
|
showUpdateNote(currentVersion, latestVersion);
|
|
141
145
|
} else {
|
|
142
|
-
|
|
146
|
+
ui.log.success(`You're on the latest version (${currentVersion}).`);
|
|
143
147
|
}
|
|
144
148
|
|
|
145
149
|
return {
|
|
@@ -155,7 +159,7 @@ export const checkForUpdatesNow = async () => {
|
|
|
155
159
|
* @param {string} latest
|
|
156
160
|
*/
|
|
157
161
|
const showUpdateNote = (current, latest) => {
|
|
158
|
-
|
|
162
|
+
ui.note(
|
|
159
163
|
[
|
|
160
164
|
`A new version of Tiendu CLI is available! 🎉`,
|
|
161
165
|
``,
|