@fold-run/cli 0.1.2 → 0.2.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/dist/commands/completions.d.ts +1 -0
- package/dist/commands/completions.js +195 -0
- package/dist/commands/completions.js.map +1 -0
- package/dist/commands/config.d.ts +4 -0
- package/dist/commands/config.js +75 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/delete.d.ts +1 -0
- package/dist/commands/delete.js +8 -0
- package/dist/commands/delete.js.map +1 -1
- package/dist/commands/deploy.d.ts +1 -0
- package/dist/commands/deploy.js +59 -17
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev.d.ts +1 -0
- package/dist/commands/dev.js +53 -34
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/doctor.d.ts +1 -0
- package/dist/commands/doctor.js +138 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/domains.d.ts +11 -0
- package/dist/commands/domains.js +111 -0
- package/dist/commands/domains.js.map +1 -0
- package/dist/commands/env-vars.d.ts +1 -0
- package/dist/commands/env-vars.js +8 -1
- package/dist/commands/env-vars.js.map +1 -1
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +104 -6
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/invoke.d.ts +9 -0
- package/dist/commands/invoke.js +89 -0
- package/dist/commands/invoke.js.map +1 -0
- package/dist/commands/link.d.ts +4 -0
- package/dist/commands/link.js +77 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/login.js +8 -6
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logs.js +31 -1
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/schedules.d.ts +3 -1
- package/dist/commands/schedules.js +41 -21
- package/dist/commands/schedules.js.map +1 -1
- package/dist/commands/secrets.d.ts +3 -1
- package/dist/commands/secrets.js +9 -2
- package/dist/commands/secrets.js.map +1 -1
- package/dist/commands/status.js +48 -28
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/templates.js +24 -17
- package/dist/commands/templates.js.map +1 -1
- package/dist/commands/tenant.d.ts +4 -0
- package/dist/commands/tenant.js +82 -0
- package/dist/commands/tenant.js.map +1 -0
- package/dist/commands/webhooks.d.ts +3 -1
- package/dist/commands/webhooks.js +31 -18
- package/dist/commands/webhooks.js.map +1 -1
- package/dist/commands/whoami.d.ts +1 -0
- package/dist/commands/whoami.js +39 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/index.js +107 -34
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +1 -0
- package/dist/lib/api.js +30 -0
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/bundler.js +124 -18
- package/dist/lib/bundler.js.map +1 -1
- package/dist/lib/colorize.d.ts +5 -0
- package/dist/lib/colorize.js +28 -0
- package/dist/lib/colorize.js.map +1 -0
- package/dist/lib/cron.d.ts +13 -0
- package/dist/lib/cron.js +107 -0
- package/dist/lib/cron.js.map +1 -0
- package/dist/lib/manifest.d.ts +31 -0
- package/dist/lib/manifest.js +195 -0
- package/dist/lib/manifest.js.map +1 -0
- package/dist/lib/prompt.d.ts +27 -0
- package/dist/lib/prompt.js +160 -0
- package/dist/lib/prompt.js.map +1 -1
- package/dist/lib/spinner.d.ts +14 -0
- package/dist/lib/spinner.js +52 -0
- package/dist/lib/spinner.js.map +1 -0
- package/dist/lib/version-check.d.ts +9 -0
- package/dist/lib/version-check.js +54 -0
- package/dist/lib/version-check.js.map +1 -0
- package/package.json +10 -11
package/dist/lib/prompt.js
CHANGED
|
@@ -1,4 +1,164 @@
|
|
|
1
1
|
import { stdin, stdout } from 'node:process';
|
|
2
|
+
import { createInterface } from 'node:readline';
|
|
3
|
+
/**
|
|
4
|
+
* Prompt for yes/no confirmation. Returns true if user confirms.
|
|
5
|
+
* Defaults to 'no' if user just presses enter.
|
|
6
|
+
*/
|
|
7
|
+
export async function confirm(message) {
|
|
8
|
+
const rl = createInterface({ input: stdin, output: stdout });
|
|
9
|
+
return new Promise((resolve) => {
|
|
10
|
+
rl.question(`${message} [y/N] `, (answer) => {
|
|
11
|
+
rl.close();
|
|
12
|
+
resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Prompt for a single line of text input.
|
|
18
|
+
* Returns the trimmed input, or defaultValue if the user presses Enter.
|
|
19
|
+
*/
|
|
20
|
+
export async function ask(message, defaultValue) {
|
|
21
|
+
const rl = createInterface({ input: stdin, output: stdout });
|
|
22
|
+
const suffix = defaultValue ? ` [${defaultValue}]` : '';
|
|
23
|
+
return new Promise((resolve) => {
|
|
24
|
+
rl.question(`${message}${suffix}: `, (answer) => {
|
|
25
|
+
rl.close();
|
|
26
|
+
const trimmed = answer.trim();
|
|
27
|
+
resolve(trimmed || defaultValue || '');
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Prompt the user to select from a list of options using arrow keys.
|
|
33
|
+
* Returns the selected option value. Falls back to numbered list on non-TTY.
|
|
34
|
+
*/
|
|
35
|
+
export async function select(message, options) {
|
|
36
|
+
// Non-TTY fallback: numbered list
|
|
37
|
+
if (!stdout.isTTY) {
|
|
38
|
+
const rl = createInterface({ input: stdin, output: stdout });
|
|
39
|
+
console.log(message);
|
|
40
|
+
for (let i = 0; i < options.length; i++) {
|
|
41
|
+
console.log(` ${i + 1}. ${options[i].label}`);
|
|
42
|
+
}
|
|
43
|
+
return new Promise((resolve) => {
|
|
44
|
+
rl.question('Enter number: ', (answer) => {
|
|
45
|
+
rl.close();
|
|
46
|
+
const idx = Number.parseInt(answer, 10) - 1;
|
|
47
|
+
resolve(options[Math.max(0, Math.min(idx, options.length - 1))].value);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return new Promise((resolve) => {
|
|
52
|
+
let selected = 0;
|
|
53
|
+
const render = () => {
|
|
54
|
+
// Move cursor up to re-render (skip first render)
|
|
55
|
+
stdout.write(`\x1b[${options.length + 1}A\x1b[J`);
|
|
56
|
+
draw();
|
|
57
|
+
};
|
|
58
|
+
const draw = () => {
|
|
59
|
+
console.log(message);
|
|
60
|
+
for (let i = 0; i < options.length; i++) {
|
|
61
|
+
const cursor = i === selected ? '\x1b[36m❯\x1b[0m' : ' ';
|
|
62
|
+
const label = i === selected ? `\x1b[1m${options[i].label}\x1b[0m` : options[i].label;
|
|
63
|
+
console.log(` ${cursor} ${label}`);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
draw();
|
|
67
|
+
stdin.setRawMode(true);
|
|
68
|
+
stdin.resume();
|
|
69
|
+
stdin.setEncoding('utf-8');
|
|
70
|
+
const onData = (ch) => {
|
|
71
|
+
if (ch === '\r' || ch === '\n') {
|
|
72
|
+
stdin.setRawMode(false);
|
|
73
|
+
stdin.pause();
|
|
74
|
+
stdin.removeListener('data', onData);
|
|
75
|
+
resolve(options[selected].value);
|
|
76
|
+
}
|
|
77
|
+
else if (ch === '\u0003') {
|
|
78
|
+
stdin.setRawMode(false);
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
else if (ch === '\x1b[A' || ch === 'k') {
|
|
82
|
+
// Up
|
|
83
|
+
selected = (selected - 1 + options.length) % options.length;
|
|
84
|
+
render();
|
|
85
|
+
}
|
|
86
|
+
else if (ch === '\x1b[B' || ch === 'j') {
|
|
87
|
+
// Down
|
|
88
|
+
selected = (selected + 1) % options.length;
|
|
89
|
+
render();
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
stdin.on('data', onData);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Prompt for toggling multiple options on/off. Returns selected values.
|
|
97
|
+
* Space to toggle, Enter to confirm.
|
|
98
|
+
*/
|
|
99
|
+
export async function multiSelect(message, options) {
|
|
100
|
+
const toggled = options.map((o) => o.default ?? false);
|
|
101
|
+
// Non-TTY fallback
|
|
102
|
+
if (!stdout.isTTY) {
|
|
103
|
+
const rl = createInterface({ input: stdin, output: stdout });
|
|
104
|
+
console.log(message);
|
|
105
|
+
for (let i = 0; i < options.length; i++) {
|
|
106
|
+
console.log(` ${i + 1}. ${options[i].label}${toggled[i] ? ' (selected)' : ''}`);
|
|
107
|
+
}
|
|
108
|
+
return new Promise((resolve) => {
|
|
109
|
+
rl.question('Enter numbers (comma-separated): ', (answer) => {
|
|
110
|
+
rl.close();
|
|
111
|
+
const nums = answer.split(',').map((s) => Number.parseInt(s.trim(), 10) - 1);
|
|
112
|
+
resolve(nums.filter((n) => n >= 0 && n < options.length).map((n) => options[n].value));
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return new Promise((resolve) => {
|
|
117
|
+
let cursor = 0;
|
|
118
|
+
const render = () => {
|
|
119
|
+
stdout.write(`\x1b[${options.length + 1}A\x1b[J`);
|
|
120
|
+
draw();
|
|
121
|
+
};
|
|
122
|
+
const draw = () => {
|
|
123
|
+
console.log(`${message} (space to toggle, enter to confirm)`);
|
|
124
|
+
for (let i = 0; i < options.length; i++) {
|
|
125
|
+
const pointer = i === cursor ? '\x1b[36m❯\x1b[0m' : ' ';
|
|
126
|
+
const check = toggled[i] ? '\x1b[32m■\x1b[0m' : '□';
|
|
127
|
+
const label = i === cursor ? `\x1b[1m${options[i].label}\x1b[0m` : options[i].label;
|
|
128
|
+
console.log(` ${pointer} ${check} ${label}`);
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
draw();
|
|
132
|
+
stdin.setRawMode(true);
|
|
133
|
+
stdin.resume();
|
|
134
|
+
stdin.setEncoding('utf-8');
|
|
135
|
+
const onData = (ch) => {
|
|
136
|
+
if (ch === '\r' || ch === '\n') {
|
|
137
|
+
stdin.setRawMode(false);
|
|
138
|
+
stdin.pause();
|
|
139
|
+
stdin.removeListener('data', onData);
|
|
140
|
+
resolve(options.filter((_, i) => toggled[i]).map((o) => o.value));
|
|
141
|
+
}
|
|
142
|
+
else if (ch === '\u0003') {
|
|
143
|
+
stdin.setRawMode(false);
|
|
144
|
+
process.exit(1);
|
|
145
|
+
}
|
|
146
|
+
else if (ch === ' ') {
|
|
147
|
+
toggled[cursor] = !toggled[cursor];
|
|
148
|
+
render();
|
|
149
|
+
}
|
|
150
|
+
else if (ch === '\x1b[A' || ch === 'k') {
|
|
151
|
+
cursor = (cursor - 1 + options.length) % options.length;
|
|
152
|
+
render();
|
|
153
|
+
}
|
|
154
|
+
else if (ch === '\x1b[B' || ch === 'j') {
|
|
155
|
+
cursor = (cursor + 1) % options.length;
|
|
156
|
+
render();
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
stdin.on('data', onData);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
2
162
|
/**
|
|
3
163
|
* Read a line of input with masked output (shows * for each character).
|
|
4
164
|
* Handles backspace and Ctrl+C.
|
package/dist/lib/prompt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/lib/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/lib/prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface Spinner {
|
|
2
|
+
/** Update the spinner message */
|
|
3
|
+
update(message: string): void;
|
|
4
|
+
/** Stop spinner with success checkmark */
|
|
5
|
+
success(message?: string): void;
|
|
6
|
+
/** Stop spinner with failure X */
|
|
7
|
+
fail(message?: string): void;
|
|
8
|
+
/** Stop spinner without status icon */
|
|
9
|
+
stop(): void;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Create a terminal spinner. Returns no-op spinner if in JSON mode or non-TTY.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createSpinner(message: string): Spinner;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// Simple terminal spinner without external dependencies
|
|
2
|
+
import { isJsonMode } from './output.js';
|
|
3
|
+
const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
4
|
+
const FRAME_INTERVAL_MS = 80;
|
|
5
|
+
/**
|
|
6
|
+
* Create a terminal spinner. Returns no-op spinner if in JSON mode or non-TTY.
|
|
7
|
+
*/
|
|
8
|
+
export function createSpinner(message) {
|
|
9
|
+
// Skip spinner in JSON mode or non-TTY environments
|
|
10
|
+
if (isJsonMode() || !process.stdout.isTTY) {
|
|
11
|
+
return {
|
|
12
|
+
update: () => { },
|
|
13
|
+
success: (msg) => msg && console.log(msg),
|
|
14
|
+
fail: (msg) => msg && console.error(msg),
|
|
15
|
+
stop: () => { },
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
let frameIndex = 0;
|
|
19
|
+
let currentMessage = message;
|
|
20
|
+
let stopped = false;
|
|
21
|
+
const render = () => {
|
|
22
|
+
if (stopped)
|
|
23
|
+
return;
|
|
24
|
+
const frame = SPINNER_FRAMES[frameIndex % SPINNER_FRAMES.length];
|
|
25
|
+
process.stdout.write(`\r\x1b[K${frame} ${currentMessage}`);
|
|
26
|
+
frameIndex++;
|
|
27
|
+
};
|
|
28
|
+
const interval = setInterval(render, FRAME_INTERVAL_MS);
|
|
29
|
+
render();
|
|
30
|
+
const clear = () => {
|
|
31
|
+
stopped = true;
|
|
32
|
+
clearInterval(interval);
|
|
33
|
+
process.stdout.write('\r\x1b[K');
|
|
34
|
+
};
|
|
35
|
+
return {
|
|
36
|
+
update(msg) {
|
|
37
|
+
currentMessage = msg;
|
|
38
|
+
},
|
|
39
|
+
success(msg) {
|
|
40
|
+
clear();
|
|
41
|
+
console.log(`\x1b[32m✓\x1b[0m ${msg ?? currentMessage}`);
|
|
42
|
+
},
|
|
43
|
+
fail(msg) {
|
|
44
|
+
clear();
|
|
45
|
+
console.log(`\x1b[31m✗\x1b[0m ${msg ?? currentMessage}`);
|
|
46
|
+
},
|
|
47
|
+
stop() {
|
|
48
|
+
clear();
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAExD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAC1E,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAa7B;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,oDAAoD;IACpD,IAAI,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC1C,OAAO;YACL,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC;YAChB,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YACzC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;YACxC,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;SACf,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,cAAc,GAAG,OAAO,CAAC;IAC7B,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,IAAI,OAAO;YAAE,OAAO;QACpB,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,KAAK,IAAI,cAAc,EAAE,CAAC,CAAC;QAC3D,UAAU,EAAE,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACxD,MAAM,EAAE,CAAC;IAET,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,OAAO,GAAG,IAAI,CAAC;QACf,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC,CAAC;IAEF,OAAO;QACL,MAAM,CAAC,GAAW;YAChB,cAAc,GAAG,GAAG,CAAC;QACvB,CAAC;QACD,OAAO,CAAC,GAAY;YAClB,KAAK,EAAE,CAAC;YACR,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,IAAI,cAAc,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,CAAC,GAAY;YACf,KAAK,EAAE,CAAC;YACR,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,IAAI,cAAc,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI;YACF,KAAK,EAAE,CAAC;QACV,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check npm registry for newer version. Returns update message or null.
|
|
3
|
+
* Never throws - fails silently on network errors.
|
|
4
|
+
*/
|
|
5
|
+
export declare function checkForUpdate(): Promise<string | null>;
|
|
6
|
+
/**
|
|
7
|
+
* Print update notice if available. Non-blocking.
|
|
8
|
+
*/
|
|
9
|
+
export declare function printUpdateNotice(notice: string | null): void;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Version check utility - checks npm for newer CLI version
|
|
2
|
+
// Runs asynchronously and never blocks or throws
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
const { version: currentVersion } = require('../../package.json');
|
|
6
|
+
const NPM_REGISTRY = 'https://registry.npmjs.org/@fold-run/cli/latest';
|
|
7
|
+
const CHECK_TIMEOUT_MS = 2000;
|
|
8
|
+
function compareVersions(current, latest) {
|
|
9
|
+
const c = current.split('.').map(Number);
|
|
10
|
+
const l = latest.split('.').map(Number);
|
|
11
|
+
for (let i = 0; i < 3; i++) {
|
|
12
|
+
if ((l[i] ?? 0) > (c[i] ?? 0))
|
|
13
|
+
return 1;
|
|
14
|
+
if ((l[i] ?? 0) < (c[i] ?? 0))
|
|
15
|
+
return -1;
|
|
16
|
+
}
|
|
17
|
+
return 0;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Check npm registry for newer version. Returns update message or null.
|
|
21
|
+
* Never throws - fails silently on network errors.
|
|
22
|
+
*/
|
|
23
|
+
export async function checkForUpdate() {
|
|
24
|
+
try {
|
|
25
|
+
const controller = new AbortController();
|
|
26
|
+
const timeout = setTimeout(() => controller.abort(), CHECK_TIMEOUT_MS);
|
|
27
|
+
const res = await fetch(NPM_REGISTRY, {
|
|
28
|
+
signal: controller.signal,
|
|
29
|
+
headers: { Accept: 'application/json' },
|
|
30
|
+
});
|
|
31
|
+
clearTimeout(timeout);
|
|
32
|
+
if (!res.ok)
|
|
33
|
+
return null;
|
|
34
|
+
const data = (await res.json());
|
|
35
|
+
const latestVersion = data.version;
|
|
36
|
+
if (compareVersions(currentVersion, latestVersion) > 0) {
|
|
37
|
+
return `\x1b[33mUpdate available:\x1b[0m ${currentVersion} → \x1b[32m${latestVersion}\x1b[0m\n Run \x1b[36mnpm i -g @fold-run/cli\x1b[0m to update`;
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Network error, timeout, etc - fail silently
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Print update notice if available. Non-blocking.
|
|
48
|
+
*/
|
|
49
|
+
export function printUpdateNotice(notice) {
|
|
50
|
+
if (notice) {
|
|
51
|
+
console.log(`\n${notice}\n`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=version-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/lib/version-check.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,iDAAiD;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;AAEzF,MAAM,YAAY,GAAG,iDAAiD,CAAC;AACvE,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAM9B,SAAS,eAAe,CAAC,OAAe,EAAE,MAAc;IACtD,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAEvE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE;YACpC,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;SACxC,CAAC,CAAC;QACH,YAAY,CAAC,OAAO,CAAC,CAAC;QAEtB,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAEzB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAe,CAAC;QAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC;QAEnC,IAAI,eAAe,CAAC,cAAc,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YACvD,OAAO,oCAAoC,cAAc,cAAc,aAAa,gEAAgE,CAAC;QACvJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,8CAA8C;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fold-run/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "CLI for fold.run — deploy serverless functions with TypeScript bundling, secrets, and AI-powered code generation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -28,15 +28,6 @@
|
|
|
28
28
|
"files": [
|
|
29
29
|
"dist"
|
|
30
30
|
],
|
|
31
|
-
"scripts": {
|
|
32
|
-
"build": "tsc",
|
|
33
|
-
"dev": "tsc --watch",
|
|
34
|
-
"start": "node dist/index.js",
|
|
35
|
-
"test": "vitest run",
|
|
36
|
-
"test:watch": "vitest",
|
|
37
|
-
"typecheck": "tsc --noEmit",
|
|
38
|
-
"prepublishOnly": "tsc"
|
|
39
|
-
},
|
|
40
31
|
"dependencies": {
|
|
41
32
|
"commander": "^14.0.3",
|
|
42
33
|
"esbuild": "^0.27.4"
|
|
@@ -46,5 +37,13 @@
|
|
|
46
37
|
"@vitest/coverage-v8": "^3.2.4",
|
|
47
38
|
"typescript": "^5.9.3",
|
|
48
39
|
"vitest": "^3.2.4"
|
|
40
|
+
},
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsc",
|
|
43
|
+
"dev": "tsc --watch",
|
|
44
|
+
"start": "node dist/index.js",
|
|
45
|
+
"test": "vitest run",
|
|
46
|
+
"test:watch": "vitest",
|
|
47
|
+
"typecheck": "tsc --noEmit"
|
|
49
48
|
}
|
|
50
|
-
}
|
|
49
|
+
}
|