@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.
Files changed (82) hide show
  1. package/dist/commands/completions.d.ts +1 -0
  2. package/dist/commands/completions.js +195 -0
  3. package/dist/commands/completions.js.map +1 -0
  4. package/dist/commands/config.d.ts +4 -0
  5. package/dist/commands/config.js +75 -0
  6. package/dist/commands/config.js.map +1 -0
  7. package/dist/commands/delete.d.ts +1 -0
  8. package/dist/commands/delete.js +8 -0
  9. package/dist/commands/delete.js.map +1 -1
  10. package/dist/commands/deploy.d.ts +1 -0
  11. package/dist/commands/deploy.js +59 -17
  12. package/dist/commands/deploy.js.map +1 -1
  13. package/dist/commands/dev.d.ts +1 -0
  14. package/dist/commands/dev.js +53 -34
  15. package/dist/commands/dev.js.map +1 -1
  16. package/dist/commands/doctor.d.ts +1 -0
  17. package/dist/commands/doctor.js +138 -0
  18. package/dist/commands/doctor.js.map +1 -0
  19. package/dist/commands/domains.d.ts +11 -0
  20. package/dist/commands/domains.js +111 -0
  21. package/dist/commands/domains.js.map +1 -0
  22. package/dist/commands/env-vars.d.ts +1 -0
  23. package/dist/commands/env-vars.js +8 -1
  24. package/dist/commands/env-vars.js.map +1 -1
  25. package/dist/commands/init.d.ts +1 -0
  26. package/dist/commands/init.js +104 -6
  27. package/dist/commands/init.js.map +1 -1
  28. package/dist/commands/invoke.d.ts +9 -0
  29. package/dist/commands/invoke.js +89 -0
  30. package/dist/commands/invoke.js.map +1 -0
  31. package/dist/commands/link.d.ts +4 -0
  32. package/dist/commands/link.js +77 -0
  33. package/dist/commands/link.js.map +1 -0
  34. package/dist/commands/login.js +8 -6
  35. package/dist/commands/login.js.map +1 -1
  36. package/dist/commands/logs.js +31 -1
  37. package/dist/commands/logs.js.map +1 -1
  38. package/dist/commands/schedules.d.ts +3 -1
  39. package/dist/commands/schedules.js +41 -21
  40. package/dist/commands/schedules.js.map +1 -1
  41. package/dist/commands/secrets.d.ts +3 -1
  42. package/dist/commands/secrets.js +9 -2
  43. package/dist/commands/secrets.js.map +1 -1
  44. package/dist/commands/status.js +48 -28
  45. package/dist/commands/status.js.map +1 -1
  46. package/dist/commands/templates.js +24 -17
  47. package/dist/commands/templates.js.map +1 -1
  48. package/dist/commands/tenant.d.ts +4 -0
  49. package/dist/commands/tenant.js +82 -0
  50. package/dist/commands/tenant.js.map +1 -0
  51. package/dist/commands/webhooks.d.ts +3 -1
  52. package/dist/commands/webhooks.js +31 -18
  53. package/dist/commands/webhooks.js.map +1 -1
  54. package/dist/commands/whoami.d.ts +1 -0
  55. package/dist/commands/whoami.js +39 -0
  56. package/dist/commands/whoami.js.map +1 -0
  57. package/dist/index.js +107 -34
  58. package/dist/index.js.map +1 -1
  59. package/dist/lib/api.d.ts +1 -0
  60. package/dist/lib/api.js +30 -0
  61. package/dist/lib/api.js.map +1 -1
  62. package/dist/lib/bundler.js +124 -18
  63. package/dist/lib/bundler.js.map +1 -1
  64. package/dist/lib/colorize.d.ts +5 -0
  65. package/dist/lib/colorize.js +28 -0
  66. package/dist/lib/colorize.js.map +1 -0
  67. package/dist/lib/cron.d.ts +13 -0
  68. package/dist/lib/cron.js +107 -0
  69. package/dist/lib/cron.js.map +1 -0
  70. package/dist/lib/manifest.d.ts +31 -0
  71. package/dist/lib/manifest.js +195 -0
  72. package/dist/lib/manifest.js.map +1 -0
  73. package/dist/lib/prompt.d.ts +27 -0
  74. package/dist/lib/prompt.js +160 -0
  75. package/dist/lib/prompt.js.map +1 -1
  76. package/dist/lib/spinner.d.ts +14 -0
  77. package/dist/lib/spinner.js +52 -0
  78. package/dist/lib/spinner.js.map +1 -0
  79. package/dist/lib/version-check.d.ts +9 -0
  80. package/dist/lib/version-check.js +54 -0
  81. package/dist/lib/version-check.js.map +1 -0
  82. package/package.json +10 -11
@@ -0,0 +1,138 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { loadConfig } from '../lib/config.js';
4
+ import { loadManifest } from '../lib/manifest.js';
5
+ import { output } from '../lib/output.js';
6
+ export async function doctorCommand() {
7
+ const checks = [];
8
+ // 1. Node.js version
9
+ const nodeVersion = process.versions.node;
10
+ const major = Number.parseInt(nodeVersion.split('.')[0], 10);
11
+ if (major >= 20) {
12
+ checks.push({ name: 'Node.js', status: 'ok', message: `v${nodeVersion}` });
13
+ }
14
+ else {
15
+ checks.push({ name: 'Node.js', status: 'fail', message: `v${nodeVersion} (requires >=20)` });
16
+ }
17
+ // 2. Authentication
18
+ const config = loadConfig();
19
+ if (!config) {
20
+ checks.push({ name: 'Auth', status: 'fail', message: 'Not logged in. Run `fold login`.' });
21
+ }
22
+ else {
23
+ // Check JWT expiry
24
+ let expired = false;
25
+ let daysLeft = null;
26
+ try {
27
+ const payload = JSON.parse(Buffer.from(config.token.split('.')[1], 'base64url').toString());
28
+ if (payload.exp) {
29
+ const msLeft = payload.exp * 1000 - Date.now();
30
+ if (msLeft < 0) {
31
+ expired = true;
32
+ }
33
+ else {
34
+ daysLeft = Math.ceil(msLeft / (1000 * 60 * 60 * 24));
35
+ }
36
+ }
37
+ }
38
+ catch {
39
+ // Not a JWT — that's fine
40
+ }
41
+ if (expired) {
42
+ checks.push({ name: 'Auth', status: 'fail', message: 'Token expired. Run `fold login`.' });
43
+ }
44
+ else if (daysLeft !== null && daysLeft <= 7) {
45
+ checks.push({
46
+ name: 'Auth',
47
+ status: 'warn',
48
+ message: `Token expires in ${daysLeft} day${daysLeft === 1 ? '' : 's'}`,
49
+ });
50
+ }
51
+ else {
52
+ checks.push({ name: 'Auth', status: 'ok', message: `Authenticated (${config.apiUrl})` });
53
+ }
54
+ // Check tenant
55
+ if (config.tenantId) {
56
+ checks.push({ name: 'Tenant', status: 'ok', message: config.tenantId });
57
+ }
58
+ else {
59
+ checks.push({ name: 'Tenant', status: 'warn', message: 'No default tenant set. Use `fold tenant set <id>`.' });
60
+ }
61
+ }
62
+ // 3. API connectivity
63
+ if (config) {
64
+ try {
65
+ const res = await fetch(`${config.apiUrl}/health`, {
66
+ signal: AbortSignal.timeout(5_000),
67
+ });
68
+ if (res.ok) {
69
+ checks.push({ name: 'API', status: 'ok', message: `${config.apiUrl} reachable` });
70
+ }
71
+ else {
72
+ checks.push({ name: 'API', status: 'fail', message: `${config.apiUrl} returned ${res.status}` });
73
+ }
74
+ }
75
+ catch (err) {
76
+ checks.push({ name: 'API', status: 'fail', message: `Cannot reach ${config.apiUrl}: ${err}` });
77
+ }
78
+ }
79
+ // 4. esbuild availability
80
+ try {
81
+ await import('esbuild');
82
+ checks.push({ name: 'esbuild', status: 'ok', message: 'Available' });
83
+ }
84
+ catch {
85
+ checks.push({ name: 'esbuild', status: 'warn', message: 'Not installed. TypeScript bundling will fail.' });
86
+ }
87
+ // 5. fold.json validation
88
+ const manifestPath = resolve('fold.json');
89
+ if (existsSync(manifestPath)) {
90
+ const { manifest, errors, warnings } = loadManifest();
91
+ if (errors.length > 0) {
92
+ checks.push({
93
+ name: 'fold.json',
94
+ status: 'fail',
95
+ message: errors.map((e) => e.message).join('; '),
96
+ });
97
+ }
98
+ else if (warnings.length > 0) {
99
+ checks.push({
100
+ name: 'fold.json',
101
+ status: 'warn',
102
+ message: warnings.join('; '),
103
+ });
104
+ }
105
+ else if (manifest) {
106
+ const parts = [manifest.name, manifest.entrypoint].filter(Boolean);
107
+ checks.push({ name: 'fold.json', status: 'ok', message: parts.join(' → ') || 'Valid' });
108
+ }
109
+ }
110
+ else {
111
+ checks.push({ name: 'fold.json', status: 'warn', message: 'Not found in current directory' });
112
+ }
113
+ // Output
114
+ const hasFailures = checks.some((c) => c.status === 'fail');
115
+ output(checks, () => {
116
+ console.log('fold doctor\n');
117
+ for (const check of checks) {
118
+ const icon = check.status === 'ok' ? '\x1b[32m✓\x1b[0m' : check.status === 'warn' ? '\x1b[33m!\x1b[0m' : '\x1b[31m✗\x1b[0m';
119
+ console.log(` ${icon} ${check.name}: ${check.message}`);
120
+ }
121
+ const okCount = checks.filter((c) => c.status === 'ok').length;
122
+ const warnCount = checks.filter((c) => c.status === 'warn').length;
123
+ const failCount = checks.filter((c) => c.status === 'fail').length;
124
+ console.log('');
125
+ if (failCount > 0) {
126
+ console.log(`\x1b[31m${failCount} issue${failCount > 1 ? 's' : ''} found.\x1b[0m`);
127
+ }
128
+ else if (warnCount > 0) {
129
+ console.log(`All clear with ${warnCount} warning${warnCount > 1 ? 's' : ''}.`);
130
+ }
131
+ else {
132
+ console.log(`\x1b[32mAll ${okCount} checks passed.\x1b[0m`);
133
+ }
134
+ });
135
+ if (hasFailures)
136
+ process.exit(1);
137
+ }
138
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare function domainsListCommand(opts: {
2
+ tenant?: string;
3
+ }): Promise<void>;
4
+ export declare function domainsAddCommand(hostname: string, opts: {
5
+ tenant?: string;
6
+ functionId?: string;
7
+ }): Promise<void>;
8
+ export declare function domainsRemoveCommand(domainId: string, opts: {
9
+ yes?: boolean;
10
+ }): Promise<void>;
11
+ export declare function domainsVerifyCommand(domainId: string): Promise<void>;
@@ -0,0 +1,111 @@
1
+ import { apiFetch } from '../lib/api.js';
2
+ import { requireConfig } from '../lib/config.js';
3
+ import { output } from '../lib/output.js';
4
+ import { confirm } from '../lib/prompt.js';
5
+ import { createSpinner } from '../lib/spinner.js';
6
+ export async function domainsListCommand(opts) {
7
+ const config = requireConfig();
8
+ const tenantId = opts.tenant ?? config.tenantId;
9
+ if (!tenantId) {
10
+ console.error('No tenant ID. Use --tenant or set one during `fold login`.');
11
+ process.exit(1);
12
+ }
13
+ const result = (await apiFetch(config, `/domains?tenant_id=${tenantId}`));
14
+ output(result.domains, () => {
15
+ if (!result.domains.length) {
16
+ console.log('No custom domains configured.');
17
+ return;
18
+ }
19
+ console.log(`Domains for ${tenantId}:\n`);
20
+ for (const d of result.domains) {
21
+ const statusIcon = d.verified ? '\x1b[32m✓\x1b[0m' : '\x1b[33m●\x1b[0m';
22
+ const target = d.function_name ? ` → ${d.function_name}` : '';
23
+ console.log(` ${statusIcon} ${d.hostname}${target}`);
24
+ console.log(` ID: ${d.id}`);
25
+ console.log(` Status: ${d.status}`);
26
+ console.log(` Verified: ${d.verified ? 'yes' : 'no'}`);
27
+ console.log('');
28
+ }
29
+ });
30
+ }
31
+ export async function domainsAddCommand(hostname, opts) {
32
+ const config = requireConfig();
33
+ const tenantId = opts.tenant ?? config.tenantId;
34
+ if (!tenantId) {
35
+ console.error('No tenant ID. Use --tenant or set one during `fold login`.');
36
+ process.exit(1);
37
+ }
38
+ const spinner = createSpinner(`Adding ${hostname}...`);
39
+ try {
40
+ const body = { tenant_id: tenantId, hostname };
41
+ if (opts.functionId)
42
+ body.function_id = opts.functionId;
43
+ const result = (await apiFetch(config, '/domains', { body }));
44
+ spinner.success(`Added ${hostname}`);
45
+ output(result, () => {
46
+ console.log(`\nDomain added: ${result.hostname}`);
47
+ console.log(` ID: ${result.id}`);
48
+ console.log(` Status: ${result.status}`);
49
+ if (!result.verified) {
50
+ console.log(`\nTo verify ownership, add this DNS record:\n`);
51
+ console.log(` Type: CNAME`);
52
+ console.log(` Name: ${hostname}`);
53
+ console.log(` Value: ${tenantId}.fold.run`);
54
+ if (result.txt_record) {
55
+ console.log(`\n Or TXT verification:`);
56
+ console.log(` Type: TXT`);
57
+ console.log(` Name: _fold-verify.${hostname}`);
58
+ console.log(` Value: ${result.txt_record}`);
59
+ }
60
+ console.log(`\nThen run: fold domains verify ${result.id}`);
61
+ }
62
+ });
63
+ }
64
+ catch (err) {
65
+ spinner.fail(`Failed to add domain: ${err}`);
66
+ process.exit(1);
67
+ }
68
+ }
69
+ export async function domainsRemoveCommand(domainId, opts) {
70
+ const config = requireConfig();
71
+ if (!opts.yes) {
72
+ const ok = await confirm(`Remove domain ${domainId}?`);
73
+ if (!ok) {
74
+ console.log('Aborted.');
75
+ return;
76
+ }
77
+ }
78
+ const spinner = createSpinner('Removing domain...');
79
+ try {
80
+ await apiFetch(config, `/domains/${domainId}`, { method: 'DELETE' });
81
+ spinner.success('Domain removed');
82
+ }
83
+ catch (err) {
84
+ spinner.fail(`Failed to remove domain: ${err}`);
85
+ process.exit(1);
86
+ }
87
+ }
88
+ export async function domainsVerifyCommand(domainId) {
89
+ const config = requireConfig();
90
+ const spinner = createSpinner('Checking DNS records...');
91
+ try {
92
+ const result = (await apiFetch(config, `/domains/${domainId}/verify`, {
93
+ method: 'POST',
94
+ }));
95
+ if (result.verified) {
96
+ spinner.success(`Domain verified: ${result.hostname}`);
97
+ }
98
+ else {
99
+ spinner.fail(`DNS not yet propagated for ${result.hostname}`);
100
+ console.log('\nMake sure you have the correct DNS records:');
101
+ console.log(` CNAME ${result.hostname} → *.fold.run`);
102
+ console.log('\nDNS propagation can take up to 24 hours. Try again later.');
103
+ }
104
+ output(result, () => { });
105
+ }
106
+ catch (err) {
107
+ spinner.fail(`Verification failed: ${err}`);
108
+ process.exit(1);
109
+ }
110
+ }
111
+ //# sourceMappingURL=domains.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domains.js","sourceRoot":"","sources":["../../src/commands/domains.ts"],"names":[],"mappings":"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"}
@@ -9,4 +9,5 @@ export declare function envListCommand(opts: {
9
9
  }): Promise<void>;
10
10
  export declare function envDeleteCommand(name: string, opts: {
11
11
  functionId: string;
12
+ yes?: boolean;
12
13
  }): Promise<void>;
@@ -1,7 +1,7 @@
1
1
  import { apiFetch } from '../lib/api.js';
2
2
  import { requireConfig } from '../lib/config.js';
3
3
  import { output } from '../lib/output.js';
4
- import { readSecret } from '../lib/prompt.js';
4
+ import { confirm, readSecret } from '../lib/prompt.js';
5
5
  export async function envSetCommand(name, opts) {
6
6
  const config = requireConfig();
7
7
  let value = opts.value;
@@ -34,6 +34,13 @@ export async function envListCommand(opts) {
34
34
  }
35
35
  export async function envDeleteCommand(name, opts) {
36
36
  const config = requireConfig();
37
+ if (!opts.yes) {
38
+ const confirmed = await confirm(`Delete env var "${name}"?`);
39
+ if (!confirmed) {
40
+ console.log('Aborted.');
41
+ return;
42
+ }
43
+ }
37
44
  await apiFetch(config, `/env-vars/${opts.functionId}/${name}`, { method: 'DELETE' });
38
45
  console.log(`Env var "${name}" deleted.`);
39
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"env-vars.js","sourceRoot":"","sources":["../../src/commands/env-vars.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAU9C,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,IAA6D;IAE7D,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAE/B,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACvB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,GAAG,CAAC,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE;QAClC,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE;KACpD,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,sBAAsB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAA6C;IAChF,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAE/B,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,aAAa,IAAI,CAAC,UAAU,EAAE,CAAC,CAA2B,CAAC;IAElG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE;QAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,UAAU,KAAK,CAAC,CAAC;QAClD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,aAAa,MAAM,OAAO,GAAG,CAAC,CAAC;QAChE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,IAA4B;IAC/E,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAE/B,MAAM,QAAQ,CAAC,MAAM,EAAE,aAAa,IAAI,CAAC,UAAU,IAAI,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,YAAY,CAAC,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"env-vars.js","sourceRoot":"","sources":["../../src/commands/env-vars.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAUvD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,IAA6D;IAE7D,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAE/B,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACvB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,GAAG,CAAC,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE;QAClC,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE;KACpD,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,sBAAsB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAA6C;IAChF,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAE/B,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,aAAa,IAAI,CAAC,UAAU,EAAE,CAAC,CAA2B,CAAC;IAElG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE;QAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,UAAU,KAAK,CAAC,CAAC;QAClD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,aAAa,MAAM,OAAO,GAAG,CAAC,CAAC;QAChE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,IAA2C;IAC9F,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAE/B,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,mBAAmB,IAAI,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,CAAC,MAAM,EAAE,aAAa,IAAI,CAAC,UAAU,IAAI,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,YAAY,CAAC,CAAC;AAC5C,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export declare function initCommand(opts: {
2
2
  name?: string;
3
+ yes?: boolean;
3
4
  }): Promise<void>;
@@ -1,7 +1,56 @@
1
1
  import { execSync } from 'node:child_process';
2
2
  import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
3
3
  import { join, resolve } from 'node:path';
4
- const FUNCTION_TEMPLATE = `import { defineHandler } from '@fold-run/runtime';
4
+ import { loadConfig } from '../lib/config.js';
5
+ import { ask, multiSelect, select } from '../lib/prompt.js';
6
+ // ── Templates per trigger type ────────────────────────────────────
7
+ const TEMPLATES = {
8
+ http: `import { defineHandler } from '@fold-run/runtime';
9
+
10
+ export default defineHandler(async (ctx) => {
11
+ const url = new URL(ctx.request.url);
12
+
13
+ if (url.pathname === '/') {
14
+ return ctx.json({ message: 'Hello from fold.run!' });
15
+ }
16
+
17
+ return ctx.json({ error: 'Not found' }, 404);
18
+ });
19
+ `,
20
+ cron: `import { defineHandler } from '@fold-run/runtime';
21
+
22
+ export default defineHandler(async (ctx) => {
23
+ // This function runs on a schedule (fold schedules create <id> "*/5 * * * *")
24
+ console.log('Scheduled run at', new Date().toISOString());
25
+
26
+ return ctx.json({ ok: true });
27
+ });
28
+ `,
29
+ webhook: `import { defineHandler } from '@fold-run/runtime';
30
+
31
+ export default defineHandler(async (ctx) => {
32
+ // Parse the incoming webhook payload
33
+ const payload = await ctx.request.json();
34
+ console.log('Webhook received:', JSON.stringify(payload));
35
+
36
+ // Process the webhook here...
37
+
38
+ return ctx.json({ received: true });
39
+ });
40
+ `,
41
+ queue: `import { defineHandler } from '@fold-run/runtime';
42
+
43
+ export default defineHandler(async (ctx) => {
44
+ // Process queue messages
45
+ const message = await ctx.request.json();
46
+ console.log('Queue message:', JSON.stringify(message));
47
+
48
+ return ctx.json({ processed: true });
49
+ });
50
+ `,
51
+ };
52
+ // Default template with KV demo
53
+ const DEFAULT_TEMPLATE = `import { defineHandler } from '@fold-run/runtime';
5
54
 
6
55
  export default defineHandler(async (ctx) => {
7
56
  const url = new URL(ctx.request.url);
@@ -65,7 +114,7 @@ function detectPackageManager(dir) {
65
114
  }
66
115
  export async function initCommand(opts) {
67
116
  const dir = resolve(opts.name ?? '.');
68
- const name = opts.name ?? dir.split('/').pop() ?? 'my-function';
117
+ let name = opts.name ?? dir.split('/').pop() ?? 'my-function';
69
118
  if (opts.name && !existsSync(dir)) {
70
119
  mkdirSync(dir, { recursive: true });
71
120
  }
@@ -77,9 +126,53 @@ export async function initCommand(opts) {
77
126
  console.error(`${functionPath} already exists. Aborting.`);
78
127
  process.exit(1);
79
128
  }
129
+ // Interactive mode: prompt for project settings
130
+ const interactive = !opts.yes && process.stdout.isTTY;
131
+ let trigger = 'http';
132
+ let bindings = [];
133
+ let tenantId;
134
+ if (interactive) {
135
+ console.log('\n\x1b[1mfold init\x1b[0m — Create a new fold.run project\n');
136
+ // Project name
137
+ name = await ask('Project name', name);
138
+ // Trigger type
139
+ trigger = await select('Trigger type:', [
140
+ { label: 'HTTP — respond to HTTP requests (default)', value: 'http' },
141
+ { label: 'Cron — run on a schedule', value: 'cron' },
142
+ { label: 'Webhook — process incoming webhooks', value: 'webhook' },
143
+ { label: 'Queue — consume queue messages', value: 'queue' },
144
+ ]);
145
+ // Bindings
146
+ bindings = await multiSelect('Bindings (platform resources to use):', [
147
+ { label: 'KV — key-value store', value: 'kv' },
148
+ { label: 'Storage — file/blob storage', value: 'storage' },
149
+ { label: 'DB — SQL database', value: 'db' },
150
+ { label: 'AI — inference models', value: 'ai' },
151
+ { label: 'Queue — message queue', value: 'queue' },
152
+ ]);
153
+ // Tenant ID
154
+ const config = loadConfig();
155
+ const defaultTenant = config?.tenantId;
156
+ const tenantAnswer = await ask('Tenant ID (optional)', defaultTenant);
157
+ if (tenantAnswer)
158
+ tenantId = tenantAnswer;
159
+ console.log('');
160
+ }
161
+ // Select template based on trigger
162
+ const template = TEMPLATES[trigger] ?? DEFAULT_TEMPLATE;
80
163
  // Write source files
81
- writeFileSync(functionPath, FUNCTION_TEMPLATE);
82
- writeFileSync(configPath, `${JSON.stringify({ name, entrypoint: 'function.ts', intent: { bindings: [] } }, null, 2)}\n`);
164
+ writeFileSync(functionPath, template);
165
+ const manifest = {
166
+ name,
167
+ entrypoint: 'function.ts',
168
+ intent: {
169
+ trigger,
170
+ bindings,
171
+ },
172
+ };
173
+ if (tenantId)
174
+ manifest.tenant_id = tenantId;
175
+ writeFileSync(configPath, `${JSON.stringify(manifest, null, 2)}\n`);
83
176
  // Scaffold package.json if none exists
84
177
  if (!existsSync(pkgPath)) {
85
178
  writeFileSync(pkgPath, `${JSON.stringify({
@@ -112,12 +205,17 @@ export async function initCommand(opts) {
112
205
  catch {
113
206
  console.warn(`\nCould not run '${installCmd}'. Run it manually to get type hints.`);
114
207
  }
115
- console.log(`\nInitialized ${name}:`);
208
+ console.log(`\nInitialized \x1b[1m${name}\x1b[0m:`);
116
209
  console.log(` ${functionPath}`);
117
210
  console.log(` ${configPath}`);
118
211
  console.log(` ${gitignorePath}`);
212
+ if (bindings.length > 0) {
213
+ console.log(` Bindings: ${bindings.join(', ')}`);
214
+ }
119
215
  console.log(`\nNext steps:`);
120
- console.log(` fold login`);
216
+ if (!tenantId) {
217
+ console.log(` fold login`);
218
+ }
121
219
  console.log(` fold dev # local dev server`);
122
220
  console.log(` fold deploy # deploy to fold.run`);
123
221
  }
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function invokeCommand(functionName: string, opts: {
2
+ tenant?: string;
3
+ data?: string;
4
+ file?: string;
5
+ method?: string;
6
+ path?: string;
7
+ header?: string[];
8
+ stream?: boolean;
9
+ }): Promise<void>;
@@ -0,0 +1,89 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { apiFetch } from '../lib/api.js';
3
+ import { requireConfig } from '../lib/config.js';
4
+ import { output } from '../lib/output.js';
5
+ import { createSpinner } from '../lib/spinner.js';
6
+ export async function invokeCommand(functionName, opts) {
7
+ const config = requireConfig();
8
+ const tenantId = opts.tenant ?? config.tenantId;
9
+ if (!tenantId) {
10
+ console.error('No tenant ID. Use --tenant or set one during `fold login`.');
11
+ process.exit(1);
12
+ }
13
+ // Resolve request body
14
+ let body;
15
+ if (opts.file) {
16
+ try {
17
+ body = readFileSync(opts.file, 'utf-8');
18
+ }
19
+ catch {
20
+ console.error(`Could not read file: ${opts.file}`);
21
+ process.exit(1);
22
+ }
23
+ }
24
+ else if (opts.data) {
25
+ body = opts.data;
26
+ }
27
+ // Build custom headers
28
+ const headers = {};
29
+ if (opts.header) {
30
+ for (const h of opts.header) {
31
+ const sep = h.indexOf(':');
32
+ if (sep === -1) {
33
+ console.error(`Invalid header format: "${h}" (expected "Key: Value")`);
34
+ process.exit(1);
35
+ }
36
+ headers[h.slice(0, sep).trim()] = h.slice(sep + 1).trim();
37
+ }
38
+ }
39
+ const subpath = opts.path ? (opts.path.startsWith('/') ? opts.path : `/${opts.path}`) : '/';
40
+ const method = opts.method?.toUpperCase() ?? (body ? 'POST' : 'GET');
41
+ const spinner = createSpinner(`Invoking ${functionName}${subpath}...`);
42
+ try {
43
+ const result = (await apiFetch(config, '/invoke', {
44
+ body: {
45
+ tenant_id: tenantId,
46
+ function_name: functionName,
47
+ method,
48
+ path: subpath,
49
+ headers,
50
+ body,
51
+ },
52
+ timeout: 60_000,
53
+ }));
54
+ spinner.success(`${method} ${functionName}${subpath} → ${result.status}`);
55
+ // Stream mode: print body line by line
56
+ if (opts.stream && typeof result.body === 'string') {
57
+ output(result, () => {
58
+ process.stdout.write(result.body);
59
+ if (result.activation_id) {
60
+ console.log(`\n\x1b[90mactivation: ${result.activation_id}${result.duration_ms ? ` (${result.duration_ms}ms)` : ''}\x1b[0m`);
61
+ }
62
+ });
63
+ return;
64
+ }
65
+ output(result, () => {
66
+ // Print response body
67
+ if (typeof result.body === 'object' && result.body !== null) {
68
+ console.log(JSON.stringify(result.body, null, 2));
69
+ }
70
+ else if (result.body !== undefined && result.body !== null) {
71
+ console.log(String(result.body));
72
+ }
73
+ // Print metadata footer
74
+ if (result.activation_id || result.duration_ms) {
75
+ const parts = [];
76
+ if (result.activation_id)
77
+ parts.push(`activation: ${result.activation_id}`);
78
+ if (result.duration_ms)
79
+ parts.push(`${result.duration_ms}ms`);
80
+ console.log(`\x1b[90m${parts.join(' · ')}\x1b[0m`);
81
+ }
82
+ });
83
+ }
84
+ catch (err) {
85
+ spinner.fail(`Invoke failed: ${err}`);
86
+ process.exit(1);
87
+ }
88
+ }
89
+ //# sourceMappingURL=invoke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../src/commands/invoke.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function linkCommand(opts: {
2
+ tenant?: string;
3
+ yes?: boolean;
4
+ }): Promise<void>;