@pushto/cli 0.0.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.
Files changed (54) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/bin/pushto.js +2 -0
  3. package/dist/commands/deploy.d.ts +2 -0
  4. package/dist/commands/deploy.d.ts.map +1 -0
  5. package/dist/commands/deploy.js +46 -0
  6. package/dist/commands/deploy.js.map +1 -0
  7. package/dist/commands/init.d.ts +2 -0
  8. package/dist/commands/init.d.ts.map +1 -0
  9. package/dist/commands/init.js +50 -0
  10. package/dist/commands/init.js.map +1 -0
  11. package/dist/commands/login.d.ts +2 -0
  12. package/dist/commands/login.d.ts.map +1 -0
  13. package/dist/commands/login.js +87 -0
  14. package/dist/commands/login.js.map +1 -0
  15. package/dist/commands/logs.d.ts +2 -0
  16. package/dist/commands/logs.d.ts.map +1 -0
  17. package/dist/commands/logs.js +21 -0
  18. package/dist/commands/logs.js.map +1 -0
  19. package/dist/commands/status.d.ts +2 -0
  20. package/dist/commands/status.d.ts.map +1 -0
  21. package/dist/commands/status.js +48 -0
  22. package/dist/commands/status.js.map +1 -0
  23. package/dist/index.d.ts +3 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +43 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/lib/api.d.ts +2 -0
  28. package/dist/lib/api.d.ts.map +1 -0
  29. package/dist/lib/api.js +17 -0
  30. package/dist/lib/api.js.map +1 -0
  31. package/dist/lib/config.d.ts +14 -0
  32. package/dist/lib/config.d.ts.map +1 -0
  33. package/dist/lib/config.js +19 -0
  34. package/dist/lib/config.js.map +1 -0
  35. package/dist/lib/resolve-slug.d.ts +7 -0
  36. package/dist/lib/resolve-slug.d.ts.map +1 -0
  37. package/dist/lib/resolve-slug.js +24 -0
  38. package/dist/lib/resolve-slug.js.map +1 -0
  39. package/package.json +28 -0
  40. package/src/commands/deploy.ts +125 -0
  41. package/src/commands/doctor.ts +160 -0
  42. package/src/commands/domain.ts +54 -0
  43. package/src/commands/env.ts +128 -0
  44. package/src/commands/init.ts +65 -0
  45. package/src/commands/login.ts +97 -0
  46. package/src/commands/logs.ts +24 -0
  47. package/src/commands/open.ts +27 -0
  48. package/src/commands/rollback.ts +43 -0
  49. package/src/commands/status.ts +58 -0
  50. package/src/index.ts +88 -0
  51. package/src/lib/api.ts +20 -0
  52. package/src/lib/config.ts +30 -0
  53. package/src/lib/resolve-slug.ts +23 -0
  54. package/tsconfig.json +8 -0
@@ -0,0 +1,4 @@
1
+
2
+ > @pushto/cli@0.0.1 build /Users/scottmccarthy/pushto/apps/cli
3
+ > tsc
4
+
package/bin/pushto.js ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node --import tsx
2
+ import '../src/index.ts';
@@ -0,0 +1,2 @@
1
+ export declare const deploy: () => Promise<void>;
2
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,MAAM,QAAa,OAAO,CAAC,IAAI,CAoD3C,CAAC"}
@@ -0,0 +1,46 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { getToken } from '../lib/config';
4
+ import { api } from '../lib/api';
5
+ import { resolveSlug } from '../lib/resolve-slug';
6
+ export const deploy = async () => {
7
+ const token = getToken();
8
+ if (!token) {
9
+ console.log(chalk.red('> not logged in.'));
10
+ console.log(chalk.dim(' run ') + chalk.cyan('pushto login') + chalk.dim(' first.'));
11
+ process.exit(1);
12
+ }
13
+ const slug = resolveSlug();
14
+ if (!slug) {
15
+ console.log(chalk.red('> no project here.'));
16
+ console.log(chalk.dim(' run ') + chalk.cyan('pushto init <name>') + chalk.dim(' to get started.'));
17
+ process.exit(1);
18
+ }
19
+ const spinner = ora('connecting...').start();
20
+ try {
21
+ // Verify the project exists
22
+ const res = await api(`/cli/projects/${slug}`);
23
+ if (!res.ok) {
24
+ const data = (await res.json());
25
+ spinner.fail(chalk.red(`> ${data.error ?? "can't find that project."}`));
26
+ process.exit(1);
27
+ }
28
+ const project = (await res.json());
29
+ spinner.text = `deploying ${project.name}...`;
30
+ // TODO: Phase 2 — zip project files, upload to build service,
31
+ // stream build logs via SSE, update status to LIVE
32
+ // For now: acknowledge the project is linked and ready
33
+ spinner.info(chalk.yellow(`> ${project.name} is linked and ready.`));
34
+ console.log();
35
+ console.log(chalk.dim(' the build engine is coming soon. when it lands,'));
36
+ console.log(chalk.dim(' this exact command will deploy your project to'));
37
+ console.log(chalk.cyan(` ${slug}.pushto.host`));
38
+ console.log();
39
+ console.log(chalk.dim(' you\'re early. that\'s a good thing.'));
40
+ }
41
+ catch {
42
+ spinner.fail(chalk.red('> could not reach pushto.host. check your internet.'));
43
+ process.exit(1);
44
+ }
45
+ };
46
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,IAAmB,EAAE;IAC9C,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACpG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC,KAAK,EAAE,CAAC;IAE7C,IAAI,CAAC;QACH,4BAA4B;QAC5B,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuB,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,IAAI,0BAA0B,EAAE,CAAC,CAAC,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAqB,CAAC;QACvD,OAAO,CAAC,IAAI,GAAG,aAAa,OAAO,CAAC,IAAI,KAAK,CAAC;QAE9C,8DAA8D;QAC9D,mDAAmD;QAEnD,uDAAuD;QACvD,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,IAAI,uBAAuB,CAAC,CACvD,CAAC;QACF,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAC/D,CAAC;QACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAC9D,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,cAAc,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,CACpD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const init: (name: string) => Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,IAAI,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAyDrD,CAAC"}
@@ -0,0 +1,50 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import { getToken, setProjectSlug } from '../lib/config';
6
+ import { api } from '../lib/api';
7
+ export const init = async (name) => {
8
+ const token = getToken();
9
+ if (!token) {
10
+ console.log(chalk.red('> not logged in.'));
11
+ console.log(chalk.dim(' run ') + chalk.cyan('pushto login') + chalk.dim(' first.'));
12
+ process.exit(1);
13
+ }
14
+ const slug = name
15
+ .toLowerCase()
16
+ .replace(/[^a-z0-9-]/g, '-')
17
+ .replace(/-+/g, '-')
18
+ .replace(/^-|-$/g, '');
19
+ if (slug.length < 3) {
20
+ console.log(chalk.red('> name too short. needs at least 3 characters.'));
21
+ process.exit(1);
22
+ }
23
+ const spinner = ora('creating project...').start();
24
+ try {
25
+ const res = await api('/cli/projects', {
26
+ method: 'POST',
27
+ body: JSON.stringify({ name, slug }),
28
+ });
29
+ const data = (await res.json());
30
+ if (!res.ok) {
31
+ spinner.fail(chalk.red(`> ${data.error ?? 'something went wrong.'}`));
32
+ process.exit(1);
33
+ }
34
+ // Write .pushto file in current directory
35
+ const pushtoConfig = { slug, projectId: data.project?.id };
36
+ fs.writeFileSync(path.join(process.cwd(), '.pushto'), JSON.stringify(pushtoConfig, null, 2) + '\n');
37
+ // Also store globally so bare `pushto` works from this dir
38
+ setProjectSlug(slug);
39
+ spinner.succeed(chalk.green(`> ${slug} is ready.`));
40
+ console.log(chalk.dim(` ${data.message ?? 'project created.'}`));
41
+ console.log();
42
+ console.log(chalk.dim(' deploy anytime with just: ') + chalk.cyan('pushto'));
43
+ console.log(chalk.dim(' your url will be: ') + chalk.cyan(`${slug}.pushto.host`));
44
+ }
45
+ catch (err) {
46
+ spinner.fail(chalk.red('> could not reach pushto.host. check your internet.'));
47
+ process.exit(1);
48
+ }
49
+ };
50
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const login: () => Promise<void>;
2
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,KAAK,QAAa,OAAO,CAAC,IAAI,CA2F1C,CAAC"}
@@ -0,0 +1,87 @@
1
+ import chalk from 'chalk';
2
+ import http from 'node:http';
3
+ import { setToken, config } from '../lib/config';
4
+ import { api } from '../lib/api';
5
+ export const login = async () => {
6
+ const baseUrl = config.get('apiUrl');
7
+ // Start a local server to receive the callback
8
+ const server = http.createServer((req, res) => {
9
+ // Handle CORS preflight
10
+ if (req.method === 'OPTIONS') {
11
+ res.writeHead(200, {
12
+ 'Access-Control-Allow-Origin': '*',
13
+ 'Access-Control-Allow-Methods': 'POST, OPTIONS',
14
+ 'Access-Control-Allow-Headers': 'Content-Type',
15
+ });
16
+ res.end();
17
+ return;
18
+ }
19
+ if (req.method === 'POST' && req.url === '/callback') {
20
+ let body = '';
21
+ req.on('data', (chunk) => (body += chunk));
22
+ req.on('end', async () => {
23
+ res.writeHead(200, {
24
+ 'Content-Type': 'application/json',
25
+ 'Access-Control-Allow-Origin': '*',
26
+ });
27
+ res.end(JSON.stringify({ ok: true }));
28
+ try {
29
+ const { access_token } = JSON.parse(body);
30
+ if (!access_token) {
31
+ console.log(chalk.red('\n> auth failed. no token received.'));
32
+ process.exit(1);
33
+ }
34
+ setToken(access_token);
35
+ // Verify the token
36
+ const meRes = await api('/cli/me');
37
+ if (meRes.ok) {
38
+ const me = (await meRes.json());
39
+ console.log(chalk.green(`\n> logged in as ${me.email}`));
40
+ console.log(chalk.dim(` tier: ${me.tier.toLowerCase()}`));
41
+ }
42
+ else {
43
+ console.log(chalk.green('\n> logged in.'));
44
+ }
45
+ }
46
+ catch {
47
+ console.log(chalk.green('\n> logged in.'));
48
+ }
49
+ server.close();
50
+ process.exit(0);
51
+ });
52
+ return;
53
+ }
54
+ res.writeHead(404);
55
+ res.end();
56
+ });
57
+ // Listen on a random available port
58
+ server.listen(0, () => {
59
+ const port = server.address().port;
60
+ const authUrl = `${baseUrl}/cli/auth?port=${port}`;
61
+ console.log(chalk.dim('> opening browser to log you in...'));
62
+ console.log(chalk.dim(` if it doesn't open, go to: `) + chalk.cyan(authUrl));
63
+ // Open browser
64
+ const open = (url) => {
65
+ const { execSync } = require('node:child_process');
66
+ const cmd = process.platform === 'darwin'
67
+ ? `open "${url}"`
68
+ : process.platform === 'win32'
69
+ ? `start "${url}"`
70
+ : `xdg-open "${url}"`;
71
+ try {
72
+ execSync(cmd, { stdio: 'ignore' });
73
+ }
74
+ catch {
75
+ // User will see the URL in the console
76
+ }
77
+ };
78
+ open(authUrl);
79
+ // Timeout after 2 minutes
80
+ setTimeout(() => {
81
+ console.log(chalk.red('\n> login timed out. try again.'));
82
+ server.close();
83
+ process.exit(1);
84
+ }, 120_000);
85
+ });
86
+ };
87
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const logs: () => Promise<void>;
2
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,IAAI,QAAa,OAAO,CAAC,IAAI,CAmBzC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import chalk from 'chalk';
2
+ import { getToken } from '../lib/config';
3
+ import { resolveSlug } from '../lib/resolve-slug';
4
+ export const logs = async () => {
5
+ const token = getToken();
6
+ if (!token) {
7
+ console.log(chalk.red('> not logged in.'));
8
+ console.log(chalk.dim(' run ') + chalk.cyan('pushto login') + chalk.dim(' first.'));
9
+ process.exit(1);
10
+ }
11
+ const slug = resolveSlug();
12
+ if (!slug) {
13
+ console.log(chalk.red('> no project here. run pushto init first.'));
14
+ process.exit(1);
15
+ }
16
+ console.log(chalk.dim(`> streaming logs for ${slug}...`));
17
+ console.log(chalk.dim(' (ctrl+c to stop)\n'));
18
+ // TODO: Phase 3 — SSE connection to log stream API
19
+ console.log(chalk.yellow('> log streaming coming soon. deploy first, then we\'ll show you everything.'));
20
+ };
21
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;IAC5C,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,IAAI,KAAK,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAE/C,mDAAmD;IACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6EAA6E,CAAC,CAAC,CAAC;AAC3G,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const status: () => Promise<void>;
2
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,MAAM,QAAa,OAAO,CAAC,IAAI,CA0C3C,CAAC"}
@@ -0,0 +1,48 @@
1
+ import chalk from 'chalk';
2
+ import { getToken } from '../lib/config';
3
+ import { api } from '../lib/api';
4
+ import { resolveSlug } from '../lib/resolve-slug';
5
+ const STATUS_COLORS = {
6
+ CREATED: chalk.dim,
7
+ BUILDING: chalk.yellow,
8
+ DEPLOYING: chalk.yellow,
9
+ LIVE: chalk.green,
10
+ SLEEPING: chalk.cyan,
11
+ FAILED: chalk.red,
12
+ SUSPENDED: chalk.red,
13
+ };
14
+ export const status = async () => {
15
+ const token = getToken();
16
+ if (!token) {
17
+ console.log(chalk.red('> not logged in.'));
18
+ console.log(chalk.dim(' run ') + chalk.cyan('pushto login') + chalk.dim(' first.'));
19
+ process.exit(1);
20
+ }
21
+ const slug = resolveSlug();
22
+ if (!slug) {
23
+ console.log(chalk.red('> no project here.'));
24
+ console.log(chalk.dim(' run ') + chalk.cyan('pushto init <name>') + chalk.dim(' first.'));
25
+ process.exit(1);
26
+ }
27
+ try {
28
+ const res = await api(`/cli/projects/${slug}`);
29
+ if (!res.ok) {
30
+ const data = (await res.json());
31
+ console.log(chalk.red(`> ${data.error ?? 'something went wrong.'}`));
32
+ process.exit(1);
33
+ }
34
+ const project = (await res.json());
35
+ const colorFn = STATUS_COLORS[project.status] ?? chalk.dim;
36
+ console.log(chalk.green(`> ${project.name}`));
37
+ console.log(chalk.dim(' status: ') + colorFn(project.status.toLowerCase()));
38
+ console.log(chalk.dim(' url: ') + chalk.cyan(`${project.subdomain}.pushto.host`));
39
+ if (project.customDomain) {
40
+ console.log(chalk.dim(' domain: ') + chalk.cyan(project.customDomain));
41
+ }
42
+ }
43
+ catch {
44
+ console.log(chalk.red('> could not reach pushto.host. check your internet.'));
45
+ process.exit(1);
46
+ }
47
+ };
48
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import chalk from 'chalk';
4
+ import { init } from './commands/init';
5
+ import { deploy } from './commands/deploy';
6
+ import { login } from './commands/login';
7
+ import { logs } from './commands/logs';
8
+ import { status } from './commands/status';
9
+ const program = new Command();
10
+ program
11
+ .name('pushto')
12
+ .description(chalk.green('pushto') + chalk.dim(' — deploy from your terminal. no yaml. no drama.'))
13
+ .version('0.0.1')
14
+ .action(async () => {
15
+ // bare `pushto` command = deploy
16
+ await deploy();
17
+ });
18
+ program
19
+ .command('init <name>')
20
+ .description('create a new project')
21
+ .action(async (name) => {
22
+ await init(name);
23
+ });
24
+ program
25
+ .command('login')
26
+ .description('authenticate with pushto.host')
27
+ .action(async () => {
28
+ await login();
29
+ });
30
+ program
31
+ .command('logs')
32
+ .description('stream logs from your project')
33
+ .action(async () => {
34
+ await logs();
35
+ });
36
+ program
37
+ .command('status')
38
+ .description('check your project status')
39
+ .action(async () => {
40
+ await status();
41
+ });
42
+ program.parse();
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;KAClG,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,iCAAiC;IACjC,MAAM,MAAM,EAAE,CAAC;AACjB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;IAC7B,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;AACnB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,KAAK,EAAE,CAAC;AAChB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,IAAI,EAAE,CAAC;AACf,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,2BAA2B,CAAC;KACxC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,MAAM,EAAE,CAAC;AACjB,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const api: (path: string, options?: RequestInit) => Promise<Response>;
2
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,GAAG,GAAU,MAAM,MAAM,EAAE,UAAS,WAAgB,KAAG,OAAO,CAAC,QAAQ,CAiBnF,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { config, getToken } from './config';
2
+ export const api = async (path, options = {}) => {
3
+ const baseUrl = config.get('apiUrl');
4
+ const token = getToken();
5
+ const headers = {
6
+ 'Content-Type': 'application/json',
7
+ ...(options.headers ?? {}),
8
+ };
9
+ if (token) {
10
+ headers['Authorization'] = `Bearer ${token}`;
11
+ }
12
+ return fetch(`${baseUrl}/api${path}`, {
13
+ ...options,
14
+ headers,
15
+ });
16
+ };
17
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,IAAY,EAAE,UAAuB,EAAE,EAAqB,EAAE;IACtF,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IAEzB,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,GAAG,CAAE,OAAO,CAAC,OAAkC,IAAI,EAAE,CAAC;KACvD,CAAC;IAEF,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;IAC/C,CAAC;IAED,OAAO,KAAK,CAAC,GAAG,OAAO,OAAO,IAAI,EAAE,EAAE;QACpC,GAAG,OAAO;QACV,OAAO;KACR,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import Conf from 'conf';
2
+ interface PushtoConfig {
3
+ token?: string;
4
+ apiUrl: string;
5
+ projectSlug?: string;
6
+ }
7
+ export declare const config: Conf<PushtoConfig>;
8
+ export declare const getToken: () => string | undefined;
9
+ export declare const setToken: (token: string) => void;
10
+ export declare const clearToken: () => void;
11
+ export declare const getProjectSlug: () => string | undefined;
12
+ export declare const setProjectSlug: (slug: string) => void;
13
+ export {};
14
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,MAAM,oBAKjB,CAAC;AAEH,eAAO,MAAM,QAAQ,QAAO,MAAM,GAAG,SAAgC,CAAC;AAEtE,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,KAAG,IAExC,CAAC;AAEF,eAAO,MAAM,UAAU,QAAO,IAE7B,CAAC;AAEF,eAAO,MAAM,cAAc,QAAO,MAAM,GAAG,SAAsC,CAAC;AAElF,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,KAAG,IAE7C,CAAC"}
@@ -0,0 +1,19 @@
1
+ import Conf from 'conf';
2
+ export const config = new Conf({
3
+ projectName: 'pushto',
4
+ defaults: {
5
+ apiUrl: 'https://pushto.host',
6
+ },
7
+ });
8
+ export const getToken = () => config.get('token');
9
+ export const setToken = (token) => {
10
+ config.set('token', token);
11
+ };
12
+ export const clearToken = () => {
13
+ config.delete('token');
14
+ };
15
+ export const getProjectSlug = () => config.get('projectSlug');
16
+ export const setProjectSlug = (slug) => {
17
+ config.set('projectSlug', slug);
18
+ };
19
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAQxB,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAe;IAC3C,WAAW,EAAE,QAAQ;IACrB,QAAQ,EAAE;QACR,MAAM,EAAE,qBAAqB;KAC9B;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAuB,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAEtE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAQ,EAAE;IAC9C,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC7B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,GAAS,EAAE;IACnC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAuB,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAElF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAQ,EAAE;IACnD,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;AAClC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Resolve the project slug from:
3
+ * 1. .pushto file in the current directory
4
+ * 2. Global config (last `pushto init`)
5
+ */
6
+ export declare const resolveSlug: () => string | undefined;
7
+ //# sourceMappingURL=resolve-slug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-slug.d.ts","sourceRoot":"","sources":["../../src/lib/resolve-slug.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,eAAO,MAAM,WAAW,QAAO,MAAM,GAAG,SAavC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { getProjectSlug } from './config';
4
+ /**
5
+ * Resolve the project slug from:
6
+ * 1. .pushto file in the current directory
7
+ * 2. Global config (last `pushto init`)
8
+ */
9
+ export const resolveSlug = () => {
10
+ // Check for .pushto file in cwd
11
+ const pushtoFile = path.join(process.cwd(), '.pushto');
12
+ try {
13
+ const content = fs.readFileSync(pushtoFile, 'utf-8');
14
+ const parsed = JSON.parse(content);
15
+ if (parsed.slug)
16
+ return parsed.slug;
17
+ }
18
+ catch {
19
+ // No .pushto file or invalid JSON — fall through
20
+ }
21
+ // Fall back to global config
22
+ return getProjectSlug();
23
+ };
24
+ //# sourceMappingURL=resolve-slug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-slug.js","sourceRoot":"","sources":["../../src/lib/resolve-slug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,GAAuB,EAAE;IAClD,gCAAgC;IAChC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,IAAI;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,iDAAiD;IACnD,CAAC;IAED,6BAA6B;IAC7B,OAAO,cAAc,EAAE,CAAC;AAC1B,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@pushto/cli",
3
+ "version": "0.0.1",
4
+ "description": "Deploy to pushto.host from your terminal",
5
+ "type": "module",
6
+ "bin": {
7
+ "pushto": "./bin/pushto.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc --noEmit",
11
+ "dev": "tsx src/index.ts",
12
+ "lint": "tsc --noEmit"
13
+ },
14
+ "dependencies": {
15
+ "@pushto/shared": "workspace:*",
16
+ "archiver": "^7.0.1",
17
+ "chalk": "^5.4.0",
18
+ "commander": "^13.0.0",
19
+ "conf": "^13.0.0",
20
+ "ora": "^8.1.0"
21
+ },
22
+ "devDependencies": {
23
+ "@types/archiver": "^7.0.0",
24
+ "@types/node": "^22.10.0",
25
+ "tsx": "^4.19.0",
26
+ "typescript": "^5.7.0"
27
+ }
28
+ }