@fold-run/cli 0.1.1
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 +157 -0
- package/dist/commands/create-tool.d.ts +8 -0
- package/dist/commands/create-tool.js +76 -0
- package/dist/commands/create-tool.js.map +1 -0
- package/dist/commands/delete.d.ts +3 -0
- package/dist/commands/delete.js +17 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/deploy.d.ts +5 -0
- package/dist/commands/deploy.js +77 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/dev.d.ts +6 -0
- package/dist/commands/dev.js +178 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/env-vars.d.ts +12 -0
- package/dist/commands/env-vars.js +40 -0
- package/dist/commands/env-vars.js.map +1 -0
- package/dist/commands/functions.d.ts +3 -0
- package/dist/commands/functions.js +26 -0
- package/dist/commands/functions.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.js +94 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.js +125 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logs.d.ts +7 -0
- package/dist/commands/logs.js +81 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/open.d.ts +3 -0
- package/dist/commands/open.js +24 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/rollback.d.ts +1 -0
- package/dist/commands/rollback.js +13 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/schedules.d.ts +11 -0
- package/dist/commands/schedules.js +49 -0
- package/dist/commands/schedules.js.map +1 -0
- package/dist/commands/secrets.d.ts +7 -0
- package/dist/commands/secrets.js +47 -0
- package/dist/commands/secrets.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.js +62 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/tail.d.ts +4 -0
- package/dist/commands/tail.js +108 -0
- package/dist/commands/tail.js.map +1 -0
- package/dist/commands/templates.d.ts +8 -0
- package/dist/commands/templates.js +69 -0
- package/dist/commands/templates.js.map +1 -0
- package/dist/commands/webhooks.d.ts +8 -0
- package/dist/commands/webhooks.js +38 -0
- package/dist/commands/webhooks.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +259 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +12 -0
- package/dist/lib/api.js +31 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/bundler.d.ts +10 -0
- package/dist/lib/bundler.js +124 -0
- package/dist/lib/bundler.js.map +1 -0
- package/dist/lib/config.d.ts +9 -0
- package/dist/lib/config.js +56 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/output.d.ts +6 -0
- package/dist/lib/output.js +19 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/prompt.d.ts +5 -0
- package/dist/lib/prompt.js +40 -0
- package/dist/lib/prompt.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { build } from 'esbuild';
|
|
2
|
+
/**
|
|
3
|
+
* Dev shim for @fold-run/runtime — stubs all platform bindings for local development.
|
|
4
|
+
* Injected by the esbuild plugin when bundling for `fold dev`.
|
|
5
|
+
*/
|
|
6
|
+
const FOLD_RUNTIME_DEV_SHIM = `
|
|
7
|
+
class DevKV {
|
|
8
|
+
constructor() { this._store = new Map(); }
|
|
9
|
+
async get(key) { return this._store.get(key) ?? null; }
|
|
10
|
+
async put(key, value) { this._store.set(key, value); }
|
|
11
|
+
async delete(key) { this._store.delete(key); }
|
|
12
|
+
async list(opts) {
|
|
13
|
+
const keys = [...this._store.keys()].filter(k => !opts?.prefix || k.startsWith(opts.prefix));
|
|
14
|
+
return { keys: keys.slice(0, opts?.limit ?? 1000).map(name => ({ name })) };
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
class DevStorage {
|
|
18
|
+
async put() { console.warn('[fold dev] Storage binding not available locally'); }
|
|
19
|
+
async get() { return null; }
|
|
20
|
+
async delete() {}
|
|
21
|
+
async list() { return { objects: [] }; }
|
|
22
|
+
}
|
|
23
|
+
class DevDB {
|
|
24
|
+
prepare() {
|
|
25
|
+
const noop = { bind: () => noop, first: async () => null, all: async () => ({ results: [] }), run: async () => ({ success: true, meta: {} }) };
|
|
26
|
+
return noop;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
class DevAI {
|
|
30
|
+
async run(model) {
|
|
31
|
+
console.warn('[fold dev] AI.run("' + model + '") is not available locally');
|
|
32
|
+
return {};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
class DevQueue {
|
|
36
|
+
async send(body) { console.log('[fold dev] Queue.send:', body); }
|
|
37
|
+
async sendBatch(messages) { console.log('[fold dev] Queue.sendBatch:', messages.length, 'messages'); }
|
|
38
|
+
}
|
|
39
|
+
class FoldContext {
|
|
40
|
+
constructor(request, env) {
|
|
41
|
+
this.request = request;
|
|
42
|
+
this.kv = new DevKV();
|
|
43
|
+
this.storage = new DevStorage();
|
|
44
|
+
this.db = new DevDB();
|
|
45
|
+
this.ai = new DevAI();
|
|
46
|
+
this.queue = new DevQueue();
|
|
47
|
+
this.tenantId = undefined;
|
|
48
|
+
const managed = new Set(['AI', 'VECTORIZE', 'KV', 'DB', 'STORAGE', 'QUEUE', 'FOLD_TENANT_ID']);
|
|
49
|
+
this.env = Object.fromEntries(
|
|
50
|
+
Object.entries(env).filter(([k, v]) => !managed.has(k) && typeof v === 'string').map(([k, v]) => [k, v])
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
json(data, status = 200) { return Response.json(data, { status }); }
|
|
54
|
+
text(body, status = 200) { return new Response(body, { status, headers: { 'content-type': 'text/plain' } }); }
|
|
55
|
+
stream(generator) {
|
|
56
|
+
const { readable, writable } = new TransformStream();
|
|
57
|
+
const writer = writable.getWriter();
|
|
58
|
+
const enc = new TextEncoder();
|
|
59
|
+
(async () => {
|
|
60
|
+
try { for await (const chunk of generator()) await writer.write(enc.encode(chunk)); }
|
|
61
|
+
finally { await writer.close(); }
|
|
62
|
+
})();
|
|
63
|
+
return new Response(readable, { headers: { 'content-type': 'text/event-stream', 'cache-control': 'no-cache' } });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export function defineHandler(handlerOrOptions) {
|
|
67
|
+
const fetchFn = typeof handlerOrOptions === 'function' ? handlerOrOptions : handlerOrOptions.fetch;
|
|
68
|
+
return {
|
|
69
|
+
async fetch(request, env) {
|
|
70
|
+
const context = new FoldContext(request, env ?? {});
|
|
71
|
+
try { return await fetchFn(context); }
|
|
72
|
+
catch (err) { return Response.json({ error: err instanceof Error ? err.message : 'Internal error' }, { status: 500 }); }
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
export { FoldContext };
|
|
77
|
+
`;
|
|
78
|
+
/** esbuild plugin that resolves @fold-run/runtime to the dev shim */
|
|
79
|
+
const foldRuntimeDevPlugin = {
|
|
80
|
+
name: 'fold-runtime-dev',
|
|
81
|
+
setup(build) {
|
|
82
|
+
build.onResolve({ filter: /^@fold\/runtime$/ }, (args) => ({
|
|
83
|
+
path: args.path,
|
|
84
|
+
namespace: 'fold-runtime-dev',
|
|
85
|
+
}));
|
|
86
|
+
build.onLoad({ filter: /.*/, namespace: 'fold-runtime-dev' }, () => ({
|
|
87
|
+
contents: FOLD_RUNTIME_DEV_SHIM,
|
|
88
|
+
loader: 'js',
|
|
89
|
+
}));
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Bundle a TypeScript/JavaScript file into a single deployable script.
|
|
94
|
+
* Uses esbuild for fast compilation, tree-shaking, and minification.
|
|
95
|
+
*
|
|
96
|
+
* @param entryPoint - Path to the entry file
|
|
97
|
+
* @param opts.dev - When true, injects the @fold-run/runtime dev shim instead of treating it as external
|
|
98
|
+
*/
|
|
99
|
+
export async function bundleFile(entryPoint, opts = {}) {
|
|
100
|
+
const result = await build({
|
|
101
|
+
entryPoints: [entryPoint],
|
|
102
|
+
bundle: true,
|
|
103
|
+
write: false,
|
|
104
|
+
format: 'esm',
|
|
105
|
+
target: 'esnext',
|
|
106
|
+
platform: 'browser', // Workers runtime is closer to browser than node
|
|
107
|
+
minify: !opts.dev,
|
|
108
|
+
treeShaking: true,
|
|
109
|
+
conditions: ['worker', 'browser'],
|
|
110
|
+
// In dev mode, @fold-run/runtime is replaced with the dev shim via plugin.
|
|
111
|
+
// At deploy time it stays external — the platform injects the real shim.
|
|
112
|
+
external: opts.dev ? ['cloudflare:*'] : ['cloudflare:*', '@fold-run/runtime'],
|
|
113
|
+
plugins: opts.dev ? [foldRuntimeDevPlugin] : [],
|
|
114
|
+
});
|
|
115
|
+
if (result.errors.length > 0) {
|
|
116
|
+
throw new Error(result.errors.map((e) => e.text).join('\n'));
|
|
117
|
+
}
|
|
118
|
+
const output = result.outputFiles?.[0];
|
|
119
|
+
if (!output) {
|
|
120
|
+
throw new Error('esbuild produced no output');
|
|
121
|
+
}
|
|
122
|
+
return output.text;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=bundler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundler.js","sourceRoot":"","sources":["../../src/lib/bundler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAe,MAAM,SAAS,CAAC;AAE7C;;;GAGG;AACH,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuE7B,CAAC;AAEF,qEAAqE;AACrE,MAAM,oBAAoB,GAAW;IACnC,IAAI,EAAE,kBAAkB;IACxB,KAAK,CAAC,KAAK;QACT,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACzD,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,kBAAkB;SAC9B,CAAC,CAAC,CAAC;QACJ,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,kBAAkB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;YACnE,QAAQ,EAAE,qBAAqB;YAC/B,MAAM,EAAE,IAAI;SACb,CAAC,CAAC,CAAC;IACN,CAAC;CACF,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAkB,EAAE,OAA0B,EAAE;IAC/E,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC;QACzB,WAAW,EAAE,CAAC,UAAU,CAAC;QACzB,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,SAAS,EAAE,iDAAiD;QACtE,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG;QACjB,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC;QACjC,2EAA2E;QAC3E,yEAAyE;QACzE,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,mBAAmB,CAAC;QAC7E,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,EAAE;KAChD,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface FoldConfig {
|
|
2
|
+
apiUrl: string;
|
|
3
|
+
token: string;
|
|
4
|
+
tenantId?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function loadConfig(): FoldConfig | null;
|
|
7
|
+
export declare function saveConfig(config: FoldConfig): void;
|
|
8
|
+
export declare function requireConfig(): FoldConfig;
|
|
9
|
+
export declare function deleteConfig(): boolean;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { chmodSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
const CONFIG_DIR = join(homedir(), '.config', 'fold');
|
|
5
|
+
const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
|
|
6
|
+
export function loadConfig() {
|
|
7
|
+
// Environment variables take precedence over config file (for CI/CD)
|
|
8
|
+
if (process.env.FOLD_TOKEN) {
|
|
9
|
+
return {
|
|
10
|
+
apiUrl: process.env.FOLD_API_URL ?? 'https://api.fold.run',
|
|
11
|
+
token: process.env.FOLD_TOKEN,
|
|
12
|
+
tenantId: process.env.FOLD_TENANT_ID,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const raw = readFileSync(CONFIG_FILE, 'utf-8');
|
|
17
|
+
return JSON.parse(raw);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function saveConfig(config) {
|
|
24
|
+
mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
|
|
25
|
+
writeFileSync(CONFIG_FILE, `${JSON.stringify(config, null, 2)}\n`, { mode: 0o600 });
|
|
26
|
+
chmodSync(CONFIG_FILE, 0o600);
|
|
27
|
+
}
|
|
28
|
+
export function requireConfig() {
|
|
29
|
+
const config = loadConfig();
|
|
30
|
+
if (!config) {
|
|
31
|
+
console.error('Not logged in. Run `fold login` first, or set FOLD_TOKEN environment variable.');
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
// Warn if JWT is expired
|
|
35
|
+
try {
|
|
36
|
+
const payload = JSON.parse(Buffer.from(config.token.split('.')[1], 'base64url').toString());
|
|
37
|
+
if (payload.exp && payload.exp * 1000 < Date.now()) {
|
|
38
|
+
console.error('Token expired. Run `fold login` to re-authenticate.');
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Not a JWT or malformed — let the API handle it
|
|
44
|
+
}
|
|
45
|
+
return config;
|
|
46
|
+
}
|
|
47
|
+
export function deleteConfig() {
|
|
48
|
+
try {
|
|
49
|
+
unlinkSync(CONFIG_FILE);
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQjC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AACtD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,MAAM,UAAU,UAAU;IACxB,qEAAqE;IACrE,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAC3B,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,sBAAsB;YAC1D,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;YAC7B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;SACrC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAkB;IAC3C,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,aAAa,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACpF,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,gFAAgF,CAAC,CAAC;QAChG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,yBAAyB;IACzB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5F,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACnD,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iDAAiD;IACnD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC;QACH,UAAU,CAAC,WAAW,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function setJsonMode(enabled: boolean): void;
|
|
2
|
+
export declare function isJsonMode(): boolean;
|
|
3
|
+
/**
|
|
4
|
+
* Output data — as JSON if --json flag is set, otherwise call the human-readable formatter.
|
|
5
|
+
*/
|
|
6
|
+
export declare function output(data: unknown, humanFormat: () => void): void;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
let jsonMode = false;
|
|
2
|
+
export function setJsonMode(enabled) {
|
|
3
|
+
jsonMode = enabled;
|
|
4
|
+
}
|
|
5
|
+
export function isJsonMode() {
|
|
6
|
+
return jsonMode;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Output data — as JSON if --json flag is set, otherwise call the human-readable formatter.
|
|
10
|
+
*/
|
|
11
|
+
export function output(data, humanFormat) {
|
|
12
|
+
if (jsonMode) {
|
|
13
|
+
console.log(JSON.stringify(data, null, 2));
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
humanFormat();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA,IAAI,QAAQ,GAAG,KAAK,CAAC;AAErB,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,QAAQ,GAAG,OAAO,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,IAAa,EAAE,WAAuB;IAC3D,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,WAAW,EAAE,CAAC;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { stdin, stdout } from 'node:process';
|
|
2
|
+
/**
|
|
3
|
+
* Read a line of input with masked output (shows * for each character).
|
|
4
|
+
* Handles backspace and Ctrl+C.
|
|
5
|
+
*/
|
|
6
|
+
export function readSecret(prompt) {
|
|
7
|
+
return new Promise((resolve) => {
|
|
8
|
+
stdout.write(prompt);
|
|
9
|
+
const chars = [];
|
|
10
|
+
stdin.setRawMode(true);
|
|
11
|
+
stdin.resume();
|
|
12
|
+
stdin.setEncoding('utf-8');
|
|
13
|
+
const onData = (ch) => {
|
|
14
|
+
if (ch === '\r' || ch === '\n') {
|
|
15
|
+
stdin.setRawMode(false);
|
|
16
|
+
stdin.pause();
|
|
17
|
+
stdin.removeListener('data', onData);
|
|
18
|
+
stdout.write('\n');
|
|
19
|
+
resolve(chars.join(''));
|
|
20
|
+
}
|
|
21
|
+
else if (ch === '\u0003') {
|
|
22
|
+
// Ctrl+C
|
|
23
|
+
stdin.setRawMode(false);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
else if (ch === '\u007F' || ch === '\b') {
|
|
27
|
+
if (chars.length > 0) {
|
|
28
|
+
chars.pop();
|
|
29
|
+
stdout.write('\b \b');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
chars.push(ch);
|
|
34
|
+
stdout.write('*');
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
stdin.on('data', onData);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +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;AAE7C;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACvB,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAE3B,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,EAAE;YAC5B,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBAC/B,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACxB,KAAK,CAAC,KAAK,EAAE,CAAC;gBACd,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACrC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACnB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1B,CAAC;iBAAM,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;gBAC3B,SAAS;gBACT,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;iBAAM,IAAI,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBAC1C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrB,KAAK,CAAC,GAAG,EAAE,CAAC;oBACZ,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;QACH,CAAC,CAAC;QACF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@fold-run/cli",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "CLI for fold.run — deploy serverless functions with TypeScript bundling, secrets, and AI-powered code generation",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"homepage": "https://fold.run",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/fold-run/fold",
|
|
11
|
+
"directory": "packages/cli"
|
|
12
|
+
},
|
|
13
|
+
"keywords": [
|
|
14
|
+
"fold",
|
|
15
|
+
"deploy",
|
|
16
|
+
"serverless",
|
|
17
|
+
"cli"
|
|
18
|
+
],
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"engines": {
|
|
23
|
+
"node": ">=20"
|
|
24
|
+
},
|
|
25
|
+
"bin": {
|
|
26
|
+
"fold": "./dist/index.js"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist"
|
|
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
|
+
"dependencies": {
|
|
41
|
+
"commander": "^14.0.3",
|
|
42
|
+
"esbuild": "^0.27.4"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/node": "^25.5.0",
|
|
46
|
+
"@vitest/coverage-v8": "^3.2.4",
|
|
47
|
+
"typescript": "^5.9.3",
|
|
48
|
+
"vitest": "^3.2.4"
|
|
49
|
+
}
|
|
50
|
+
}
|