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/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;
@@ -1,6 +1,6 @@
1
1
  import { readFile, writeFile, mkdir } from "node:fs/promises";
2
2
  import path from "node:path";
3
- import * as p from "@clack/prompts";
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
- p.log.error("Could not check for updates right now.");
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
- p.log.success(`You're on the latest version (${currentVersion}).`);
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
- p.note(
162
+ ui.note(
159
163
  [
160
164
  `A new version of Tiendu CLI is available! 🎉`,
161
165
  ``,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tiendu",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "CLI para desarrollar y publicar temas en Tiendu",
5
5
  "type": "module",
6
6
  "bin": {