pooshit 0.1.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/api.d.ts +15 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +66 -0
- package/dist/api.js.map +1 -0
- package/dist/commands.d.ts +17 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +187 -0
- package/dist/commands.js.map +1 -0
- package/dist/config.d.ts +25 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -0
- package/dist/detect.d.ts +8 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +51 -0
- package/dist/detect.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/pack.d.ts +9 -0
- package/dist/pack.d.ts.map +1 -0
- package/dist/pack.js +100 -0
- package/dist/pack.js.map +1 -0
- package/dist/state.d.ts +6 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +46 -0
- package/dist/state.js.map +1 -0
- package/dist/ui.d.ts +13 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +70 -0
- package/dist/ui.js.map +1 -0
- package/package.json +45 -0
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { DeployStatus } from "./config.js";
|
|
2
|
+
export declare function uploadDeploy(options: {
|
|
3
|
+
buffer: Buffer;
|
|
4
|
+
stack: string;
|
|
5
|
+
deployToken?: string;
|
|
6
|
+
}): Promise<DeployStatus>;
|
|
7
|
+
export declare function pollDeployStatus(deployId: string, onTick?: (status: DeployStatus) => void): Promise<DeployStatus>;
|
|
8
|
+
export declare function fetchDeployLogs(options: {
|
|
9
|
+
deployId: string;
|
|
10
|
+
lines?: number;
|
|
11
|
+
}): Promise<{
|
|
12
|
+
logs: string;
|
|
13
|
+
serviceName: string | null;
|
|
14
|
+
}>;
|
|
15
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,YAAY,CAAC,CAiCxB;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,GACtC,OAAO,CAAC,YAAY,CAAC,CA2BvB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAqBxD"}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { getCliConfig } from "./config.js";
|
|
2
|
+
export async function uploadDeploy(options) {
|
|
3
|
+
const { apiUrl } = getCliConfig();
|
|
4
|
+
const formData = new FormData();
|
|
5
|
+
formData.append("archive", new Blob([new Uint8Array(options.buffer)], { type: "application/gzip" }), "project.tar.gz");
|
|
6
|
+
formData.append("stack", options.stack);
|
|
7
|
+
if (options.deployToken) {
|
|
8
|
+
formData.append("deployToken", options.deployToken);
|
|
9
|
+
}
|
|
10
|
+
const response = await fetch(`${apiUrl}/v1/deploy`, {
|
|
11
|
+
method: "POST",
|
|
12
|
+
body: formData,
|
|
13
|
+
});
|
|
14
|
+
const text = await response.text();
|
|
15
|
+
let body;
|
|
16
|
+
try {
|
|
17
|
+
body = JSON.parse(text);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
throw new Error(text.slice(0, 200) || `Upload failed (${response.status})`);
|
|
21
|
+
}
|
|
22
|
+
if (!response.ok) {
|
|
23
|
+
throw new Error(body.error ?? `Upload failed (${response.status})`);
|
|
24
|
+
}
|
|
25
|
+
return body;
|
|
26
|
+
}
|
|
27
|
+
export async function pollDeployStatus(deployId, onTick) {
|
|
28
|
+
const { apiUrl } = getCliConfig();
|
|
29
|
+
const maxAttempts = 120;
|
|
30
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
31
|
+
const response = await fetch(`${apiUrl}/v1/deploy/${deployId}/status`);
|
|
32
|
+
if (!response.ok) {
|
|
33
|
+
throw new Error("Failed to poll deploy status");
|
|
34
|
+
}
|
|
35
|
+
const status = (await response.json());
|
|
36
|
+
onTick?.(status);
|
|
37
|
+
if (status.status === "live") {
|
|
38
|
+
return status;
|
|
39
|
+
}
|
|
40
|
+
if (status.status === "failed") {
|
|
41
|
+
throw new Error(status.errorMessage ?? "Deploy failed");
|
|
42
|
+
}
|
|
43
|
+
if (status.status === "expired") {
|
|
44
|
+
throw new Error("Deploy expired before going live");
|
|
45
|
+
}
|
|
46
|
+
await sleep(2000);
|
|
47
|
+
}
|
|
48
|
+
throw new Error("Deploy timed out — check status later with: pooshit status");
|
|
49
|
+
}
|
|
50
|
+
export async function fetchDeployLogs(options) {
|
|
51
|
+
const { apiUrl } = getCliConfig();
|
|
52
|
+
const lines = options.lines ?? 100;
|
|
53
|
+
const response = await fetch(`${apiUrl}/v1/deploy/${options.deployId}/logs?lines=${lines}`);
|
|
54
|
+
const body = (await response.json());
|
|
55
|
+
if (!response.ok) {
|
|
56
|
+
throw new Error(body.error ?? `Failed to fetch logs (${response.status})`);
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
logs: body.logs ?? "",
|
|
60
|
+
serviceName: body.serviceName ?? null,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function sleep(ms) {
|
|
64
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface DeployOptions {
|
|
2
|
+
token?: string;
|
|
3
|
+
json?: boolean;
|
|
4
|
+
}
|
|
5
|
+
export declare function runDeploy(options: DeployOptions): Promise<void>;
|
|
6
|
+
export declare function runStatus(options: {
|
|
7
|
+
json?: boolean;
|
|
8
|
+
}): Promise<void>;
|
|
9
|
+
export declare function runOpen(): Promise<void>;
|
|
10
|
+
export declare function runUpgrade(): void;
|
|
11
|
+
export declare function runLogin(): void;
|
|
12
|
+
export declare function runLogs(options: {
|
|
13
|
+
lines?: number;
|
|
14
|
+
json?: boolean;
|
|
15
|
+
}): Promise<void>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAgBA,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA6FrE;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B1E;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAQ7C;AAED,wBAAgB,UAAU,IAAI,IAAI,CAYjC;AAED,wBAAgB,QAAQ,IAAI,IAAI,CAK/B;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDxF"}
|
package/dist/commands.js
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import open from "open";
|
|
2
|
+
import ora from "ora";
|
|
3
|
+
import { fetchDeployLogs, pollDeployStatus, uploadDeploy } from "./api.js";
|
|
4
|
+
import { detectProject } from "./detect.js";
|
|
5
|
+
import { formatBytes, packProject, preflight } from "./pack.js";
|
|
6
|
+
import { loadDeployForCwd, saveDeployState } from "./state.js";
|
|
7
|
+
import { formatTimeRemaining, getStatusLine, printBanner, printError, printJson, printSuccess, printWarnings, } from "./ui.js";
|
|
8
|
+
export async function runDeploy(options) {
|
|
9
|
+
const cwd = process.cwd();
|
|
10
|
+
preflight(cwd);
|
|
11
|
+
if (!options.json) {
|
|
12
|
+
printBanner();
|
|
13
|
+
}
|
|
14
|
+
const detected = detectProject(cwd);
|
|
15
|
+
if (!options.json) {
|
|
16
|
+
printWarnings(detected.warnings);
|
|
17
|
+
}
|
|
18
|
+
const existing = await loadDeployForCwd(cwd);
|
|
19
|
+
const deployToken = options.token ?? existing?.deployToken;
|
|
20
|
+
let statusIndex = 0;
|
|
21
|
+
const packSpinner = options.json
|
|
22
|
+
? null
|
|
23
|
+
: ora({ text: getStatusLine(statusIndex++), color: "cyan" }).start();
|
|
24
|
+
try {
|
|
25
|
+
const packed = await packProject(cwd);
|
|
26
|
+
if (packSpinner) {
|
|
27
|
+
packSpinner.text = getStatusLine(statusIndex++);
|
|
28
|
+
}
|
|
29
|
+
if (packed.sizeBytes > 50 * 1024 * 1024) {
|
|
30
|
+
if (packSpinner) {
|
|
31
|
+
packSpinner.info(`Uploading ${formatBytes(packed.sizeBytes)} — free limit is 50 MB`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
else if (packSpinner) {
|
|
35
|
+
packSpinner.text = `${getStatusLine(statusIndex++)} (${formatBytes(packed.sizeBytes)})`;
|
|
36
|
+
}
|
|
37
|
+
const uploaded = await uploadDeploy({
|
|
38
|
+
buffer: packed.buffer,
|
|
39
|
+
stack: detected.stack,
|
|
40
|
+
deployToken,
|
|
41
|
+
});
|
|
42
|
+
if (packSpinner) {
|
|
43
|
+
packSpinner.text = getStatusLine(statusIndex++);
|
|
44
|
+
}
|
|
45
|
+
const final = await pollDeployStatus(uploaded.id, (status) => {
|
|
46
|
+
if (packSpinner && status.status === "building") {
|
|
47
|
+
packSpinner.text = getStatusLine(statusIndex++);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
packSpinner?.stopAndPersist({
|
|
51
|
+
symbol: "✓",
|
|
52
|
+
text: "deployed",
|
|
53
|
+
});
|
|
54
|
+
await saveDeployState({
|
|
55
|
+
id: final.id,
|
|
56
|
+
slug: final.slug,
|
|
57
|
+
url: final.url ?? "",
|
|
58
|
+
deployToken: final.deployToken,
|
|
59
|
+
expiresAt: final.expiresAt,
|
|
60
|
+
cwd,
|
|
61
|
+
updatedAt: new Date().toISOString(),
|
|
62
|
+
});
|
|
63
|
+
if (options.json) {
|
|
64
|
+
printJson(final);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (!final.url) {
|
|
68
|
+
throw new Error("Deploy succeeded but no URL returned");
|
|
69
|
+
}
|
|
70
|
+
printSuccess({
|
|
71
|
+
url: final.url,
|
|
72
|
+
expiresAt: final.expiresAt,
|
|
73
|
+
deployToken: final.deployToken,
|
|
74
|
+
plan: final.plan,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
packSpinner?.fail("deploy failed");
|
|
79
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
80
|
+
if (options.json) {
|
|
81
|
+
printJson({ error: message });
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
printError(message);
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export async function runStatus(options) {
|
|
89
|
+
const cwd = process.cwd();
|
|
90
|
+
const state = await loadDeployForCwd(cwd);
|
|
91
|
+
if (!state) {
|
|
92
|
+
if (options.json) {
|
|
93
|
+
printJson({ error: "No deploy found for this directory" });
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
printError("No deploy found for this directory. Run npx pooshit first.");
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
if (options.json) {
|
|
100
|
+
printJson(state);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
printBanner();
|
|
104
|
+
console.log(` url: ${state.url}`);
|
|
105
|
+
console.log(` token: ${state.deployToken}`);
|
|
106
|
+
if (state.expiresAt) {
|
|
107
|
+
console.log(` expiry: ${formatTimeRemaining(state.expiresAt)}`);
|
|
108
|
+
console.log();
|
|
109
|
+
console.log(" upgrade → npx pooshit upgrade ($9.99/mo)");
|
|
110
|
+
}
|
|
111
|
+
console.log();
|
|
112
|
+
}
|
|
113
|
+
export async function runOpen() {
|
|
114
|
+
const cwd = process.cwd();
|
|
115
|
+
const state = await loadDeployForCwd(cwd);
|
|
116
|
+
if (!state?.url) {
|
|
117
|
+
printError("No live URL found. Run npx pooshit first.");
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
await open(state.url);
|
|
121
|
+
}
|
|
122
|
+
export function runUpgrade() {
|
|
123
|
+
printBanner();
|
|
124
|
+
console.log(" Pooshit Pro — $9.99/mo");
|
|
125
|
+
console.log();
|
|
126
|
+
console.log(" • stays live forever (free: 24h)");
|
|
127
|
+
console.log(" • 500 MB uploads (free: 50 MB)");
|
|
128
|
+
console.log(" • pick your subdomain");
|
|
129
|
+
console.log(" • custom domain");
|
|
130
|
+
console.log(" • 10 concurrent projects");
|
|
131
|
+
console.log();
|
|
132
|
+
console.log(" Coming soon — run npx pooshit upgrade when billing is live");
|
|
133
|
+
console.log();
|
|
134
|
+
}
|
|
135
|
+
export function runLogin() {
|
|
136
|
+
printBanner();
|
|
137
|
+
console.log(" GitHub login coming soon.");
|
|
138
|
+
console.log(" For now, deploy free without an account: npx pooshit");
|
|
139
|
+
console.log();
|
|
140
|
+
}
|
|
141
|
+
export async function runLogs(options) {
|
|
142
|
+
const cwd = process.cwd();
|
|
143
|
+
const state = await loadDeployForCwd(cwd);
|
|
144
|
+
if (!state) {
|
|
145
|
+
if (options.json) {
|
|
146
|
+
printJson({ error: "No deploy found for this directory" });
|
|
147
|
+
process.exit(1);
|
|
148
|
+
}
|
|
149
|
+
printError("No deploy found for this directory. Run npx pooshit first.");
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
const spinner = options.json ? null : ora({ text: "fetching logs…", color: "cyan" }).start();
|
|
153
|
+
try {
|
|
154
|
+
const result = await fetchDeployLogs({
|
|
155
|
+
deployId: state.id,
|
|
156
|
+
lines: options.lines ?? 100,
|
|
157
|
+
});
|
|
158
|
+
spinner?.stop();
|
|
159
|
+
if (options.json) {
|
|
160
|
+
printJson(result);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
printBanner();
|
|
164
|
+
if (result.serviceName) {
|
|
165
|
+
console.log(` service: ${result.serviceName}`);
|
|
166
|
+
}
|
|
167
|
+
console.log();
|
|
168
|
+
if (!result.logs) {
|
|
169
|
+
console.log(" (no logs yet — deploy may still be building)");
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
console.log(result.logs);
|
|
173
|
+
}
|
|
174
|
+
console.log();
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
spinner?.fail("failed to fetch logs");
|
|
178
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
179
|
+
if (options.json) {
|
|
180
|
+
printJson({ error: message });
|
|
181
|
+
process.exit(1);
|
|
182
|
+
}
|
|
183
|
+
printError(message);
|
|
184
|
+
process.exit(1);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface PooshitCliConfig {
|
|
2
|
+
apiUrl: string;
|
|
3
|
+
}
|
|
4
|
+
export declare function getCliConfig(): PooshitCliConfig;
|
|
5
|
+
export interface DeployStatus {
|
|
6
|
+
id: string;
|
|
7
|
+
slug: string;
|
|
8
|
+
status: "pending" | "building" | "live" | "failed" | "expired";
|
|
9
|
+
url: string | null;
|
|
10
|
+
deployToken: string;
|
|
11
|
+
expiresAt: string | null;
|
|
12
|
+
plan: "free" | "pro";
|
|
13
|
+
errorMessage: string | null;
|
|
14
|
+
stack: string;
|
|
15
|
+
}
|
|
16
|
+
export interface LocalDeployState {
|
|
17
|
+
id: string;
|
|
18
|
+
slug: string;
|
|
19
|
+
url: string;
|
|
20
|
+
deployToken: string;
|
|
21
|
+
expiresAt: string | null;
|
|
22
|
+
cwd: string;
|
|
23
|
+
updatedAt: string;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,YAAY,IAAI,gBAAgB,CAM/C;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC/D,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,YAAY;IAC1B,OAAO;QACL,MAAM,EAAE,CACN,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,4CAA4C,CAC5E,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;KACrB,CAAC;AACJ,CAAC"}
|
package/dist/detect.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type StackType = "static" | "node" | "docker" | "generic";
|
|
2
|
+
export interface DetectResult {
|
|
3
|
+
stack: StackType;
|
|
4
|
+
name: string;
|
|
5
|
+
warnings: string[];
|
|
6
|
+
}
|
|
7
|
+
export declare function detectProject(cwd: string): DetectResult;
|
|
8
|
+
//# sourceMappingURL=detect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEjE,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAuCvD"}
|
package/dist/detect.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
export function detectProject(cwd) {
|
|
4
|
+
const warnings = [];
|
|
5
|
+
let name = cwd.split("/").pop() ?? "project";
|
|
6
|
+
const packageJsonPath = join(cwd, "package.json");
|
|
7
|
+
const indexHtmlPath = join(cwd, "index.html");
|
|
8
|
+
const dockerfilePath = join(cwd, "Dockerfile");
|
|
9
|
+
if (existsSync(packageJsonPath)) {
|
|
10
|
+
try {
|
|
11
|
+
const pkg = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
|
|
12
|
+
if (pkg.name) {
|
|
13
|
+
name = pkg.name.replace(/^@.*\//, "");
|
|
14
|
+
}
|
|
15
|
+
if (!pkg.scripts?.start && !pkg.scripts?.build) {
|
|
16
|
+
warnings.push("No start or build script in package.json — deploy may fail");
|
|
17
|
+
}
|
|
18
|
+
checkNodePortUsage(cwd, warnings);
|
|
19
|
+
return { stack: "node", name, warnings };
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return { stack: "node", name, warnings };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (existsSync(dockerfilePath)) {
|
|
26
|
+
return { stack: "docker", name, warnings };
|
|
27
|
+
}
|
|
28
|
+
if (existsSync(indexHtmlPath)) {
|
|
29
|
+
return { stack: "static", name, warnings };
|
|
30
|
+
}
|
|
31
|
+
warnings.push("Could not detect project type — trying generic deploy");
|
|
32
|
+
return { stack: "generic", name, warnings };
|
|
33
|
+
}
|
|
34
|
+
function checkNodePortUsage(cwd, warnings) {
|
|
35
|
+
const entryFiles = ["server.js", "server.ts", "index.js", "index.ts", "src/index.ts"];
|
|
36
|
+
for (const file of entryFiles) {
|
|
37
|
+
const path = join(cwd, file);
|
|
38
|
+
if (!existsSync(path)) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const content = readFileSync(path, "utf-8");
|
|
42
|
+
if (content.includes("listen(3000") || content.includes("localhost")) {
|
|
43
|
+
warnings.push(`Use process.env.PORT and 0.0.0.0 in ${file} — hardcoded ports fail on Railway`);
|
|
44
|
+
}
|
|
45
|
+
if (!content.includes("process.env.PORT")) {
|
|
46
|
+
warnings.push(`${file} should use process.env.PORT for cloud hosting`);
|
|
47
|
+
}
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAUjC,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC;IAE7C,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAE/C,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAG5D,CAAC;YACF,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gBACb,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACxC,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;gBAC/C,QAAQ,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;YAC9E,CAAC;YAED,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAClC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC7C,CAAC;IAED,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC7C,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;IACvE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW,EAAE,QAAkB;IACzD,MAAM,UAAU,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;IACtF,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACrE,QAAQ,CAAC,IAAI,CACX,uCAAuC,IAAI,oCAAoC,CAChF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,gDAAgD,CAAC,CAAC;QACzE,CAAC;QACD,MAAM;IACR,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -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,42 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { runDeploy, runLogin, runLogs, runOpen, runStatus, runUpgrade, } from "./commands.js";
|
|
4
|
+
const program = new Command();
|
|
5
|
+
program
|
|
6
|
+
.name("pooshit")
|
|
7
|
+
.description("Ship anything with one command. Zero config.")
|
|
8
|
+
.version("0.1.0");
|
|
9
|
+
program
|
|
10
|
+
.command("deploy", { isDefault: true })
|
|
11
|
+
.description("Deploy the current directory")
|
|
12
|
+
.option("--token <token>", "Redeploy using an existing deploy token")
|
|
13
|
+
.option("--json", "Output JSON")
|
|
14
|
+
.action(async (options) => {
|
|
15
|
+
await runDeploy(options);
|
|
16
|
+
});
|
|
17
|
+
program
|
|
18
|
+
.command("status")
|
|
19
|
+
.description("Show deploy status for this directory")
|
|
20
|
+
.option("--json", "Output JSON")
|
|
21
|
+
.action(async (options) => {
|
|
22
|
+
await runStatus(options);
|
|
23
|
+
});
|
|
24
|
+
program.command("open").description("Open the live URL in your browser").action(runOpen);
|
|
25
|
+
program.command("upgrade").description("Upgrade to Pooshit Pro").action(runUpgrade);
|
|
26
|
+
program.command("login").description("Log in with GitHub").action(runLogin);
|
|
27
|
+
program
|
|
28
|
+
.command("logs")
|
|
29
|
+
.description("Fetch deploy logs")
|
|
30
|
+
.option("--lines <n>", "Number of log lines", "100")
|
|
31
|
+
.option("--json", "Output JSON")
|
|
32
|
+
.action(async (options) => {
|
|
33
|
+
await runLogs({
|
|
34
|
+
lines: options.lines ? Number(options.lines) : 100,
|
|
35
|
+
json: options.json,
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
program.parseAsync(process.argv).catch((error) => {
|
|
39
|
+
console.error(error instanceof Error ? error.message : error);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
});
|
|
42
|
+
//# 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,EACL,SAAS,EACT,QAAQ,EACR,OAAO,EACP,OAAO,EACP,SAAS,EACT,UAAU,GACX,MAAM,eAAe,CAAC;AAEvB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,8CAA8C,CAAC;KAC3D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;KACtC,WAAW,CAAC,8BAA8B,CAAC;KAC3C,MAAM,CAAC,iBAAiB,EAAE,yCAAyC,CAAC;KACpE,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;KAC/B,MAAM,CAAC,KAAK,EAAE,OAA2C,EAAE,EAAE;IAC5D,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;KAC/B,MAAM,CAAC,KAAK,EAAE,OAA2B,EAAE,EAAE;IAC5C,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,mCAAmC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAEzF,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAEpF,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAE5E,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,mBAAmB,CAAC;KAChC,MAAM,CAAC,aAAa,EAAE,qBAAqB,EAAE,KAAK,CAAC;KACnD,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;KAC/B,MAAM,CAAC,KAAK,EAAE,OAA2C,EAAE,EAAE;IAC5D,MAAM,OAAO,CAAC;QACZ,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG;QAClD,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IACxD,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/pack.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface PackResult {
|
|
2
|
+
buffer: Buffer;
|
|
3
|
+
sizeBytes: number;
|
|
4
|
+
fileCount: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function packProject(cwd: string): Promise<PackResult>;
|
|
7
|
+
export declare function formatBytes(bytes: number): string;
|
|
8
|
+
export declare function preflight(cwd: string): void;
|
|
9
|
+
//# sourceMappingURL=pack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack.d.ts","sourceRoot":"","sources":["../src/pack.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAclE;AAyDD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAc3C"}
|
package/dist/pack.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import archiver from "archiver";
|
|
2
|
+
import ignore from "ignore";
|
|
3
|
+
import { createReadStream, existsSync, readFileSync, statSync, } from "node:fs";
|
|
4
|
+
import { readdir } from "node:fs/promises";
|
|
5
|
+
import { join, relative } from "node:path";
|
|
6
|
+
import { readPooshitIgnore } from "./state.js";
|
|
7
|
+
const DEFAULT_IGNORE = [
|
|
8
|
+
"node_modules",
|
|
9
|
+
".git",
|
|
10
|
+
"dist",
|
|
11
|
+
"build",
|
|
12
|
+
".next",
|
|
13
|
+
"coverage",
|
|
14
|
+
".turbo",
|
|
15
|
+
"tmp",
|
|
16
|
+
"uploads",
|
|
17
|
+
".pooshit",
|
|
18
|
+
".railway",
|
|
19
|
+
"*.log",
|
|
20
|
+
".env",
|
|
21
|
+
".env.local",
|
|
22
|
+
];
|
|
23
|
+
export async function packProject(cwd) {
|
|
24
|
+
const ig = buildIgnore(cwd);
|
|
25
|
+
const files = await collectFiles(cwd, cwd, ig);
|
|
26
|
+
if (files.length === 0) {
|
|
27
|
+
throw new Error("Nothing to deploy — add an index.html or package.json");
|
|
28
|
+
}
|
|
29
|
+
const buffer = await createTarBuffer(cwd, files);
|
|
30
|
+
return {
|
|
31
|
+
buffer,
|
|
32
|
+
sizeBytes: buffer.length,
|
|
33
|
+
fileCount: files.length,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function buildIgnore(cwd) {
|
|
37
|
+
const ig = ignore().add(DEFAULT_IGNORE).add(readPooshitIgnore(cwd));
|
|
38
|
+
const gitignorePath = join(cwd, ".gitignore");
|
|
39
|
+
if (existsSync(gitignorePath)) {
|
|
40
|
+
ig.add(readFileSync(gitignorePath, "utf-8"));
|
|
41
|
+
}
|
|
42
|
+
return ig;
|
|
43
|
+
}
|
|
44
|
+
async function collectFiles(root, dir, ig) {
|
|
45
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
46
|
+
const files = [];
|
|
47
|
+
for (const entry of entries) {
|
|
48
|
+
const fullPath = join(dir, entry.name);
|
|
49
|
+
const relPath = relative(root, fullPath);
|
|
50
|
+
if (ig.ignores(relPath)) {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (entry.isDirectory()) {
|
|
54
|
+
files.push(...(await collectFiles(root, fullPath, ig)));
|
|
55
|
+
}
|
|
56
|
+
else if (entry.isFile()) {
|
|
57
|
+
files.push(relPath);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return files;
|
|
61
|
+
}
|
|
62
|
+
async function createTarBuffer(cwd, files) {
|
|
63
|
+
return new Promise((resolve, reject) => {
|
|
64
|
+
const chunks = [];
|
|
65
|
+
const archive = archiver("tar", { gzip: true, gzipOptions: { level: 6 } });
|
|
66
|
+
archive.on("data", (chunk) => chunks.push(chunk));
|
|
67
|
+
archive.on("error", reject);
|
|
68
|
+
archive.on("end", () => resolve(Buffer.concat(chunks)));
|
|
69
|
+
for (const file of files) {
|
|
70
|
+
const fullPath = join(cwd, file);
|
|
71
|
+
archive.append(createReadStream(fullPath), { name: file });
|
|
72
|
+
}
|
|
73
|
+
void archive.finalize();
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
export function formatBytes(bytes) {
|
|
77
|
+
if (bytes < 1024) {
|
|
78
|
+
return `${bytes} B`;
|
|
79
|
+
}
|
|
80
|
+
if (bytes < 1024 * 1024) {
|
|
81
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
82
|
+
}
|
|
83
|
+
return `${(bytes / 1024 / 1024).toFixed(1)} MB`;
|
|
84
|
+
}
|
|
85
|
+
export function preflight(cwd) {
|
|
86
|
+
const home = process.env.HOME ?? process.env.USERPROFILE;
|
|
87
|
+
if (home && cwd === home) {
|
|
88
|
+
throw new Error("Refusing to deploy your home directory");
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
const stat = statSync(cwd);
|
|
92
|
+
if (!stat.isDirectory()) {
|
|
93
|
+
throw new Error("Not a directory");
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
throw new Error("Invalid directory");
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=pack.js.map
|
package/dist/pack.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack.js","sourceRoot":"","sources":["../src/pack.ts"],"names":[],"mappings":"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"}
|
package/dist/state.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { LocalDeployState } from "./config.js";
|
|
2
|
+
export declare function saveDeployState(state: LocalDeployState): Promise<void>;
|
|
3
|
+
export declare function loadDeployForCwd(cwd: string): Promise<LocalDeployState | null>;
|
|
4
|
+
export declare function loadLatestDeploy(): Promise<LocalDeployState | null>;
|
|
5
|
+
export declare function readPooshitIgnore(cwd: string): string[];
|
|
6
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AASpD,wBAAsB,eAAe,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAO5E;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAGpF;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAGzE;AAeD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CASvD"}
|
package/dist/state.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
const POOSHIT_DIR = join(homedir(), ".pooshit");
|
|
6
|
+
const STATE_FILE = join(POOSHIT_DIR, "deploys.json");
|
|
7
|
+
export async function saveDeployState(state) {
|
|
8
|
+
await mkdir(POOSHIT_DIR, { recursive: true });
|
|
9
|
+
const existing = await loadAllStates();
|
|
10
|
+
const filtered = existing.filter((d) => d.cwd !== state.cwd);
|
|
11
|
+
filtered.unshift(state);
|
|
12
|
+
const payload = { deploys: filtered.slice(0, 20) };
|
|
13
|
+
await writeFile(STATE_FILE, JSON.stringify(payload, null, 2), "utf-8");
|
|
14
|
+
}
|
|
15
|
+
export async function loadDeployForCwd(cwd) {
|
|
16
|
+
const all = await loadAllStates();
|
|
17
|
+
return all.find((d) => d.cwd === cwd) ?? null;
|
|
18
|
+
}
|
|
19
|
+
export async function loadLatestDeploy() {
|
|
20
|
+
const all = await loadAllStates();
|
|
21
|
+
return all[0] ?? null;
|
|
22
|
+
}
|
|
23
|
+
async function loadAllStates() {
|
|
24
|
+
try {
|
|
25
|
+
if (!existsSync(STATE_FILE)) {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
const raw = await readFile(STATE_FILE, "utf-8");
|
|
29
|
+
const parsed = JSON.parse(raw);
|
|
30
|
+
return parsed.deploys ?? [];
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function readPooshitIgnore(cwd) {
|
|
37
|
+
const path = join(cwd, ".pooshitignore");
|
|
38
|
+
if (!existsSync(path)) {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
return readFileSync(path, "utf-8")
|
|
42
|
+
.split("\n")
|
|
43
|
+
.map((line) => line.trim())
|
|
44
|
+
.filter((line) => line && !line.startsWith("#"));
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAChD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;AAMrD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAuB;IAC3D,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,MAAM,aAAa,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7D,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACxB,MAAM,OAAO,GAAc,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IAC9D,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW;IAChD,MAAM,GAAG,GAAG,MAAM,aAAa,EAAE,CAAC;IAClC,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,GAAG,GAAG,MAAM,aAAa,EAAE,CAAC;IAClC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,aAAa;IAC1B,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;QAC5C,OAAO,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC;SAC/B,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,CAAC"}
|
package/dist/ui.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare function printBanner(): void;
|
|
2
|
+
export declare function getStatusLine(index: number): string;
|
|
3
|
+
export declare function printWarnings(warnings: string[]): void;
|
|
4
|
+
export declare function printSuccess(options: {
|
|
5
|
+
url: string;
|
|
6
|
+
expiresAt: string | null;
|
|
7
|
+
deployToken: string;
|
|
8
|
+
plan: "free" | "pro";
|
|
9
|
+
}): void;
|
|
10
|
+
export declare function printJson(data: unknown): void;
|
|
11
|
+
export declare function formatTimeRemaining(expiresAt: string): string;
|
|
12
|
+
export declare function printError(message: string): void;
|
|
13
|
+
//# sourceMappingURL=ui.d.ts.map
|
package/dist/ui.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,IAAI,IAAI,CAIlC;AAYD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAOtD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;CACtB,GAAG,IAAI,CA8BP;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAE7C;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAW7D;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAIhD"}
|
package/dist/ui.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import pc from "picocolors";
|
|
2
|
+
export function printBanner() {
|
|
3
|
+
console.log();
|
|
4
|
+
console.log(pc.cyan(" pooshit") + pc.dim(" · ship anything"));
|
|
5
|
+
console.log();
|
|
6
|
+
}
|
|
7
|
+
const STATUS_LINES = [
|
|
8
|
+
"packing your project…",
|
|
9
|
+
"uploading to the cloud…",
|
|
10
|
+
"building on the cloud…",
|
|
11
|
+
"negotiating with the cloud…",
|
|
12
|
+
"almost there…",
|
|
13
|
+
"teaching Node about PORT…",
|
|
14
|
+
"summoning containers…",
|
|
15
|
+
];
|
|
16
|
+
export function getStatusLine(index) {
|
|
17
|
+
return STATUS_LINES[index % STATUS_LINES.length];
|
|
18
|
+
}
|
|
19
|
+
export function printWarnings(warnings) {
|
|
20
|
+
for (const warning of warnings) {
|
|
21
|
+
console.log(pc.yellow(` ⚠ ${warning}`));
|
|
22
|
+
}
|
|
23
|
+
if (warnings.length > 0) {
|
|
24
|
+
console.log();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function printSuccess(options) {
|
|
28
|
+
console.log();
|
|
29
|
+
console.log(pc.bold(" Hey! Your project is live:"));
|
|
30
|
+
console.log();
|
|
31
|
+
console.log(pc.green(` → ${options.url}`));
|
|
32
|
+
console.log();
|
|
33
|
+
if (options.plan === "free" && options.expiresAt) {
|
|
34
|
+
const hours = Math.max(1, Math.round((new Date(options.expiresAt).getTime() - Date.now()) / (1000 * 60 * 60)));
|
|
35
|
+
console.log(pc.dim(` ⏱ expires in ${hours} hours`));
|
|
36
|
+
console.log();
|
|
37
|
+
console.log(pc.dim(" like it? ") +
|
|
38
|
+
pc.white("npx pooshit upgrade") +
|
|
39
|
+
pc.dim(" ($9.99/mo — keep it forever)"));
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
console.log(pc.dim(" ✓ pro — stays live forever"));
|
|
43
|
+
}
|
|
44
|
+
console.log();
|
|
45
|
+
console.log(pc.dim(` redeploy token: ${options.deployToken}`));
|
|
46
|
+
console.log();
|
|
47
|
+
console.log(pc.dim(" shipped with pooshit"));
|
|
48
|
+
console.log();
|
|
49
|
+
}
|
|
50
|
+
export function printJson(data) {
|
|
51
|
+
console.log(JSON.stringify(data, null, 2));
|
|
52
|
+
}
|
|
53
|
+
export function formatTimeRemaining(expiresAt) {
|
|
54
|
+
const ms = new Date(expiresAt).getTime() - Date.now();
|
|
55
|
+
if (ms <= 0) {
|
|
56
|
+
return "expired";
|
|
57
|
+
}
|
|
58
|
+
const hours = Math.floor(ms / (1000 * 60 * 60));
|
|
59
|
+
const minutes = Math.floor((ms % (1000 * 60 * 60)) / (1000 * 60));
|
|
60
|
+
if (hours > 0) {
|
|
61
|
+
return `${hours}h ${minutes}m remaining`;
|
|
62
|
+
}
|
|
63
|
+
return `${minutes}m remaining`;
|
|
64
|
+
}
|
|
65
|
+
export function printError(message) {
|
|
66
|
+
console.error();
|
|
67
|
+
console.error(pc.red(` ✗ ${message}`));
|
|
68
|
+
console.error();
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=ui.js.map
|
package/dist/ui.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,YAAY,GAAG;IACnB,uBAAuB;IACvB,yBAAyB;IACzB,wBAAwB;IACxB,6BAA6B;IAC7B,eAAe;IACf,2BAA2B;IAC3B,uBAAuB;CACxB,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,YAAY,CAAC,KAAK,GAAG,YAAY,CAAC,MAAM,CAAE,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAkB;IAC9C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAK5B;IACC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,CAAC,EACD,IAAI,CAAC,KAAK,CACR,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CACxE,CACF,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,mBAAmB,KAAK,QAAQ,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CACT,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC;YACpB,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC;YAC/B,EAAE,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAC3C,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACnD,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtD,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;IAClE,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,GAAG,KAAK,KAAK,OAAO,aAAa,CAAC;IAC3C,CAAC;IACD,OAAO,GAAG,OAAO,aAAa,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pooshit",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Ship anything with one command. Zero config.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"pooshit": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc",
|
|
14
|
+
"dev": "tsx src/index.ts",
|
|
15
|
+
"typecheck": "tsc --noEmit",
|
|
16
|
+
"prepublishOnly": "npm run build"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"hosting",
|
|
20
|
+
"deploy",
|
|
21
|
+
"cli",
|
|
22
|
+
"railway"
|
|
23
|
+
],
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"archiver": "^7.0.1",
|
|
27
|
+
"commander": "^13.1.0",
|
|
28
|
+
"ignore": "^7.0.4",
|
|
29
|
+
"open": "^10.1.2",
|
|
30
|
+
"ora": "^8.2.0",
|
|
31
|
+
"picocolors": "^1.1.1"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/archiver": "^6.0.3",
|
|
35
|
+
"@types/node": "^22.15.3",
|
|
36
|
+
"tsx": "^4.19.4",
|
|
37
|
+
"typescript": "^5.8.3"
|
|
38
|
+
},
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=18"
|
|
41
|
+
},
|
|
42
|
+
"publishConfig": {
|
|
43
|
+
"access": "public"
|
|
44
|
+
}
|
|
45
|
+
}
|