@danubedata/cli 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/README.md +138 -0
- package/bin/danube +2 -0
- package/dist/commands/deploy.d.ts +4 -0
- package/dist/commands/deploy.js +72 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/deployments.d.ts +2 -0
- package/dist/commands/deployments.js +52 -0
- package/dist/commands/deployments.js.map +1 -0
- package/dist/commands/domains.d.ts +2 -0
- package/dist/commands/domains.js +89 -0
- package/dist/commands/domains.js.map +1 -0
- package/dist/commands/link.d.ts +2 -0
- package/dist/commands/link.js +58 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.js +50 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +2 -0
- package/dist/commands/logout.js +10 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/whoami.d.ts +2 -0
- package/dist/commands/whoami.js +16 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +81 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api-client.d.ts +11 -0
- package/dist/lib/api-client.js +63 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/config.d.ts +9 -0
- package/dist/lib/config.js +38 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/errors.d.ts +11 -0
- package/dist/lib/errors.js +23 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/output.d.ts +4 -0
- package/dist/lib/output.js +36 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/packager.d.ts +5 -0
- package/dist/lib/packager.js +85 -0
- package/dist/lib/packager.js.map +1 -0
- package/dist/lib/project.d.ts +13 -0
- package/dist/lib/project.js +39 -0
- package/dist/lib/project.js.map +1 -0
- package/dist/lib/sleep.d.ts +1 -0
- package/dist/lib/sleep.js +4 -0
- package/dist/lib/sleep.js.map +1 -0
- package/dist/lib/version.d.ts +9 -0
- package/dist/lib/version.js +80 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/types/api.d.ts +89 -0
- package/dist/types/api.js +2 -0
- package/dist/types/api.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare class ApiClient {
|
|
2
|
+
private token;
|
|
3
|
+
private baseUrl;
|
|
4
|
+
constructor(token: string, baseUrl?: string);
|
|
5
|
+
static create(): Promise<ApiClient>;
|
|
6
|
+
private request;
|
|
7
|
+
get<T>(path: string): Promise<T>;
|
|
8
|
+
post<T>(path: string, body?: unknown): Promise<T>;
|
|
9
|
+
delete<T>(path: string): Promise<T>;
|
|
10
|
+
upload<T>(path: string, file: Uint8Array, filename: string): Promise<T>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { getApiBase, readConfig, getToken } from './config.js';
|
|
2
|
+
import { ApiError, NotAuthenticatedError } from './errors.js';
|
|
3
|
+
export class ApiClient {
|
|
4
|
+
token;
|
|
5
|
+
baseUrl;
|
|
6
|
+
constructor(token, baseUrl) {
|
|
7
|
+
this.token = token;
|
|
8
|
+
this.baseUrl = baseUrl || getApiBase();
|
|
9
|
+
}
|
|
10
|
+
static async create() {
|
|
11
|
+
const config = await readConfig();
|
|
12
|
+
const token = getToken(config);
|
|
13
|
+
if (!token) {
|
|
14
|
+
throw new NotAuthenticatedError();
|
|
15
|
+
}
|
|
16
|
+
return new ApiClient(token, config?.apiBase);
|
|
17
|
+
}
|
|
18
|
+
async request(method, path, body) {
|
|
19
|
+
const url = `${this.baseUrl}${path}`;
|
|
20
|
+
const headers = {
|
|
21
|
+
'Accept': 'application/json',
|
|
22
|
+
'Authorization': `Bearer ${this.token}`,
|
|
23
|
+
};
|
|
24
|
+
const init = { method, headers };
|
|
25
|
+
if (body !== undefined) {
|
|
26
|
+
if (body instanceof FormData) {
|
|
27
|
+
init.body = body;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
headers['Content-Type'] = 'application/json';
|
|
31
|
+
init.body = JSON.stringify(body);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const res = await fetch(url, init);
|
|
35
|
+
if (res.status === 204) {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
const json = await res.json().catch(() => null);
|
|
39
|
+
if (!res.ok) {
|
|
40
|
+
if (res.status === 401) {
|
|
41
|
+
throw new NotAuthenticatedError();
|
|
42
|
+
}
|
|
43
|
+
const message = json?.message || `Request failed with status ${res.status}`;
|
|
44
|
+
throw new ApiError(res.status, message, json?.errors);
|
|
45
|
+
}
|
|
46
|
+
return json;
|
|
47
|
+
}
|
|
48
|
+
get(path) {
|
|
49
|
+
return this.request('GET', path);
|
|
50
|
+
}
|
|
51
|
+
post(path, body) {
|
|
52
|
+
return this.request('POST', path, body);
|
|
53
|
+
}
|
|
54
|
+
delete(path) {
|
|
55
|
+
return this.request('DELETE', path);
|
|
56
|
+
}
|
|
57
|
+
async upload(path, file, filename) {
|
|
58
|
+
const formData = new FormData();
|
|
59
|
+
formData.append('file', new Blob([file]), filename);
|
|
60
|
+
return this.request('POST', path, formData);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface DanubeConfig {
|
|
2
|
+
token: string;
|
|
3
|
+
apiBase?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function getApiBase(): string;
|
|
6
|
+
export declare function readConfig(): Promise<DanubeConfig | null>;
|
|
7
|
+
export declare function writeConfig(config: DanubeConfig): Promise<void>;
|
|
8
|
+
export declare function deleteConfig(): Promise<void>;
|
|
9
|
+
export declare function getToken(config: DanubeConfig | null): string | null;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir, rm } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
const CONFIG_DIR = join(homedir(), '.danube');
|
|
5
|
+
const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
|
|
6
|
+
export function getApiBase() {
|
|
7
|
+
return process.env.DANUBE_API_BASE || 'https://danubedata.ro';
|
|
8
|
+
}
|
|
9
|
+
export async function readConfig() {
|
|
10
|
+
// Env var takes precedence
|
|
11
|
+
const envToken = process.env.DANUBE_TOKEN;
|
|
12
|
+
if (envToken) {
|
|
13
|
+
return { token: envToken, apiBase: getApiBase() };
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const raw = await readFile(CONFIG_FILE, 'utf-8');
|
|
17
|
+
return JSON.parse(raw);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export async function writeConfig(config) {
|
|
24
|
+
await mkdir(CONFIG_DIR, { recursive: true });
|
|
25
|
+
await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2) + '\n', { mode: 0o600 });
|
|
26
|
+
}
|
|
27
|
+
export async function deleteConfig() {
|
|
28
|
+
try {
|
|
29
|
+
await rm(CONFIG_FILE);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Ignore if file doesn't exist
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export function getToken(config) {
|
|
36
|
+
return process.env.DANUBE_TOKEN || config?.token || null;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAOlC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,MAAM,UAAU,UAAU;IACxB,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,uBAAuB,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAC1C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC;IACpD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAoB;IACpD,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,WAAW,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAA2B;IAClD,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare class NotAuthenticatedError extends Error {
|
|
2
|
+
constructor();
|
|
3
|
+
}
|
|
4
|
+
export declare class NotLinkedError extends Error {
|
|
5
|
+
constructor();
|
|
6
|
+
}
|
|
7
|
+
export declare class ApiError extends Error {
|
|
8
|
+
statusCode: number;
|
|
9
|
+
errors?: Record<string, string[]> | undefined;
|
|
10
|
+
constructor(statusCode: number, message: string, errors?: Record<string, string[]> | undefined);
|
|
11
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export class NotAuthenticatedError extends Error {
|
|
2
|
+
constructor() {
|
|
3
|
+
super('Not authenticated. Run `danube login` first.');
|
|
4
|
+
this.name = 'NotAuthenticatedError';
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export class NotLinkedError extends Error {
|
|
8
|
+
constructor() {
|
|
9
|
+
super('No project linked. Run `danube pages link` first.');
|
|
10
|
+
this.name = 'NotLinkedError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class ApiError extends Error {
|
|
14
|
+
statusCode;
|
|
15
|
+
errors;
|
|
16
|
+
constructor(statusCode, message, errors) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.statusCode = statusCode;
|
|
19
|
+
this.errors = errors;
|
|
20
|
+
this.name = 'ApiError';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C;QACE,KAAK,CAAC,8CAA8C,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC;QACE,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,QAAS,SAAQ,KAAK;IAExB;IAEA;IAHT,YACS,UAAkB,EACzB,OAAe,EACR,MAAiC;QAExC,KAAK,CAAC,OAAO,CAAC,CAAC;QAJR,eAAU,GAAV,UAAU,CAAQ;QAElB,WAAM,GAAN,MAAM,CAA2B;QAGxC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export function formatTable(headers, rows) {
|
|
3
|
+
const widths = headers.map((h, i) => Math.max(h.length, ...rows.map(r => (r[i] || '').length)));
|
|
4
|
+
const sep = widths.map(w => '-'.repeat(w)).join(' ');
|
|
5
|
+
const headerLine = headers.map((h, i) => h.padEnd(widths[i])).join(' ');
|
|
6
|
+
const bodyLines = rows.map(row => row.map((cell, i) => cell.padEnd(widths[i])).join(' '));
|
|
7
|
+
return [headerLine, sep, ...bodyLines].join('\n');
|
|
8
|
+
}
|
|
9
|
+
export function statusColor(status) {
|
|
10
|
+
switch (status) {
|
|
11
|
+
case 'live':
|
|
12
|
+
case 'active':
|
|
13
|
+
case 'verified':
|
|
14
|
+
return chalk.green(status);
|
|
15
|
+
case 'pending':
|
|
16
|
+
case 'uploading':
|
|
17
|
+
case 'processing':
|
|
18
|
+
case 'deploying':
|
|
19
|
+
return chalk.yellow(status);
|
|
20
|
+
case 'failed':
|
|
21
|
+
return chalk.red(status);
|
|
22
|
+
default:
|
|
23
|
+
return status;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export function formatBytes(bytes) {
|
|
27
|
+
if (bytes === 0)
|
|
28
|
+
return '0 B';
|
|
29
|
+
const units = ['B', 'KB', 'MB', 'GB'];
|
|
30
|
+
const i = Math.floor(Math.log(bytes) / Math.log(1024));
|
|
31
|
+
return `${(bytes / Math.pow(1024, i)).toFixed(i > 0 ? 1 : 0)} ${units[i]}`;
|
|
32
|
+
}
|
|
33
|
+
export function formatDate(iso) {
|
|
34
|
+
return new Date(iso).toLocaleString();
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,WAAW,CAAC,OAAiB,EAAE,IAAgB;IAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAClC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAC1D,CAAC;IAEF,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAC/B,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACzD,CAAC;IAEF,OAAO,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,UAAU;YACb,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,KAAK,SAAS,CAAC;QACf,KAAK,WAAW,CAAC;QACjB,KAAK,YAAY,CAAC;QAClB,KAAK,WAAW;YACd,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9B,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3B;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9B,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { readFile, readdir, stat } from 'node:fs/promises';
|
|
2
|
+
import { join, relative } from 'node:path';
|
|
3
|
+
import ignore from 'ignore';
|
|
4
|
+
import archiver from 'archiver';
|
|
5
|
+
async function collectFiles(dir, ig, base) {
|
|
6
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
7
|
+
const files = [];
|
|
8
|
+
for (const entry of entries) {
|
|
9
|
+
const fullPath = join(dir, entry.name);
|
|
10
|
+
const relPath = relative(base, fullPath);
|
|
11
|
+
if (ig.ignores(relPath))
|
|
12
|
+
continue;
|
|
13
|
+
if (entry.isDirectory()) {
|
|
14
|
+
// Also check if directory itself is ignored (with trailing slash)
|
|
15
|
+
if (ig.ignores(relPath + '/'))
|
|
16
|
+
continue;
|
|
17
|
+
files.push(...await collectFiles(fullPath, ig, base));
|
|
18
|
+
}
|
|
19
|
+
else if (entry.isFile() || entry.isSymbolicLink()) {
|
|
20
|
+
files.push(relPath);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return files;
|
|
24
|
+
}
|
|
25
|
+
export async function packageDirectory(dir, extraIgnore) {
|
|
26
|
+
const ig = ignore();
|
|
27
|
+
// Always ignore these
|
|
28
|
+
ig.add(['.git', 'node_modules', '.danube']);
|
|
29
|
+
// Read .gitignore
|
|
30
|
+
try {
|
|
31
|
+
const gitignore = await readFile(join(dir, '.gitignore'), 'utf-8');
|
|
32
|
+
ig.add(gitignore);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// No .gitignore
|
|
36
|
+
}
|
|
37
|
+
// Read .daubeignore
|
|
38
|
+
try {
|
|
39
|
+
const daubeignore = await readFile(join(dir, '.daubeignore'), 'utf-8');
|
|
40
|
+
ig.add(daubeignore);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// No .daubeignore
|
|
44
|
+
}
|
|
45
|
+
// Extra ignore patterns from danube.json
|
|
46
|
+
if (extraIgnore?.length) {
|
|
47
|
+
ig.add(extraIgnore);
|
|
48
|
+
}
|
|
49
|
+
const files = await collectFiles(dir, ig, dir);
|
|
50
|
+
if (files.length === 0) {
|
|
51
|
+
throw new Error('No files to deploy. Check your output directory and ignore patterns.');
|
|
52
|
+
}
|
|
53
|
+
// Create ZIP as buffer
|
|
54
|
+
const chunks = [];
|
|
55
|
+
await new Promise((resolve, reject) => {
|
|
56
|
+
const archive = archiver('zip', { zlib: { level: 9 } });
|
|
57
|
+
archive.on('data', (chunk) => chunks.push(chunk));
|
|
58
|
+
archive.on('end', resolve);
|
|
59
|
+
archive.on('error', reject);
|
|
60
|
+
for (const file of files) {
|
|
61
|
+
archive.file(join(dir, file), { name: file });
|
|
62
|
+
}
|
|
63
|
+
archive.finalize();
|
|
64
|
+
});
|
|
65
|
+
return {
|
|
66
|
+
buffer: Buffer.concat(chunks),
|
|
67
|
+
fileCount: files.length,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export async function getDirectorySize(dir) {
|
|
71
|
+
let size = 0;
|
|
72
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
73
|
+
for (const entry of entries) {
|
|
74
|
+
const fullPath = join(dir, entry.name);
|
|
75
|
+
if (entry.isFile()) {
|
|
76
|
+
const s = await stat(fullPath);
|
|
77
|
+
size += s.size;
|
|
78
|
+
}
|
|
79
|
+
else if (entry.isDirectory()) {
|
|
80
|
+
size += await getDirectorySize(fullPath);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return size;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=packager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packager.js","sourceRoot":"","sources":["../../src/lib/packager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface ProjectConfig {
|
|
2
|
+
siteId: number;
|
|
3
|
+
teamId: number;
|
|
4
|
+
siteName: string;
|
|
5
|
+
defaultDomain?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface DanubeJson {
|
|
8
|
+
outputDir?: string;
|
|
9
|
+
ignore?: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare function readProjectConfig(cwd?: string): Promise<ProjectConfig | null>;
|
|
12
|
+
export declare function writeProjectConfig(config: ProjectConfig, cwd?: string): Promise<void>;
|
|
13
|
+
export declare function readDanubeJson(cwd?: string): Promise<DanubeJson | null>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
const PROJECT_DIR = '.danube';
|
|
4
|
+
const PROJECT_FILE = 'project.json';
|
|
5
|
+
const DANUBE_JSON = 'danube.json';
|
|
6
|
+
export async function readProjectConfig(cwd = process.cwd()) {
|
|
7
|
+
// Env var fallback for CI
|
|
8
|
+
const envSiteId = process.env.DANUBE_SITE_ID;
|
|
9
|
+
const envTeamId = process.env.DANUBE_TEAM_ID;
|
|
10
|
+
if (envSiteId && envTeamId) {
|
|
11
|
+
return {
|
|
12
|
+
siteId: Number(envSiteId),
|
|
13
|
+
teamId: Number(envTeamId),
|
|
14
|
+
siteName: process.env.DANUBE_SITE_NAME || 'unknown',
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const raw = await readFile(join(cwd, PROJECT_DIR, PROJECT_FILE), 'utf-8');
|
|
19
|
+
return JSON.parse(raw);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export async function writeProjectConfig(config, cwd = process.cwd()) {
|
|
26
|
+
const dir = join(cwd, PROJECT_DIR);
|
|
27
|
+
await mkdir(dir, { recursive: true });
|
|
28
|
+
await writeFile(join(dir, PROJECT_FILE), JSON.stringify(config, null, 2) + '\n');
|
|
29
|
+
}
|
|
30
|
+
export async function readDanubeJson(cwd = process.cwd()) {
|
|
31
|
+
try {
|
|
32
|
+
const raw = await readFile(join(cwd, DANUBE_JSON), 'utf-8');
|
|
33
|
+
return JSON.parse(raw);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAcjC,MAAM,WAAW,GAAG,SAAS,CAAC;AAC9B,MAAM,YAAY,GAAG,cAAc,CAAC;AACpC,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACjE,0BAA0B;IAC1B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC7C,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;QAC3B,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC;YACzB,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC;YACzB,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,SAAS;SACpD,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAqB,EAAE,MAAc,OAAO,CAAC,GAAG,EAAE;IACzF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACnC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC9D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function sleep(ms: number): Promise<void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sleep.js","sourceRoot":"","sources":["../../src/lib/sleep.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,KAAK,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const PACKAGE_NAME = "@danubedata/cli";
|
|
2
|
+
export interface UpdateCheckResult {
|
|
3
|
+
current: string;
|
|
4
|
+
latest: string;
|
|
5
|
+
updateAvailable: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function getCurrentVersion(): string;
|
|
8
|
+
export declare function checkForUpdate(): Promise<UpdateCheckResult | null>;
|
|
9
|
+
export declare function printUpdateNotification(current: string, latest: string): void;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
3
|
+
import { join, dirname } from 'node:path';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
export const PACKAGE_NAME = '@danubedata/cli';
|
|
8
|
+
const CACHE_FILE = join(homedir(), '.danube', 'update-check.json');
|
|
9
|
+
const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
10
|
+
export function getCurrentVersion() {
|
|
11
|
+
const pkgPath = join(dirname(fileURLToPath(import.meta.url)), '..', '..', 'package.json');
|
|
12
|
+
const raw = readFileSync(pkgPath, 'utf-8');
|
|
13
|
+
const pkg = JSON.parse(raw);
|
|
14
|
+
return pkg.version;
|
|
15
|
+
}
|
|
16
|
+
function compareSemver(a, b) {
|
|
17
|
+
const pa = a.split('.').map(Number);
|
|
18
|
+
const pb = b.split('.').map(Number);
|
|
19
|
+
for (let i = 0; i < 3; i++) {
|
|
20
|
+
const diff = (pa[i] ?? 0) - (pb[i] ?? 0);
|
|
21
|
+
if (diff !== 0)
|
|
22
|
+
return diff;
|
|
23
|
+
}
|
|
24
|
+
return 0;
|
|
25
|
+
}
|
|
26
|
+
async function readCache() {
|
|
27
|
+
try {
|
|
28
|
+
const raw = await readFile(CACHE_FILE, 'utf-8');
|
|
29
|
+
return JSON.parse(raw);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function writeCache(cache) {
|
|
36
|
+
try {
|
|
37
|
+
await mkdir(dirname(CACHE_FILE), { recursive: true });
|
|
38
|
+
await writeFile(CACHE_FILE, JSON.stringify(cache, null, 2) + '\n');
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Silently ignore write errors
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export async function checkForUpdate() {
|
|
45
|
+
try {
|
|
46
|
+
if (process.env.CI || process.env.DANUBE_NO_UPDATE_CHECK) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
const current = getCurrentVersion();
|
|
50
|
+
const cache = await readCache();
|
|
51
|
+
if (cache && (Date.now() - cache.checkedAt) < CACHE_TTL_MS) {
|
|
52
|
+
return {
|
|
53
|
+
current,
|
|
54
|
+
latest: cache.latest,
|
|
55
|
+
updateAvailable: compareSemver(cache.latest, current) > 0,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const response = await fetch(`https://registry.npmjs.org/${PACKAGE_NAME}/latest`);
|
|
59
|
+
if (!response.ok)
|
|
60
|
+
return null;
|
|
61
|
+
const data = await response.json();
|
|
62
|
+
const latest = data.version;
|
|
63
|
+
await writeCache({ latest, checkedAt: Date.now() });
|
|
64
|
+
return {
|
|
65
|
+
current,
|
|
66
|
+
latest,
|
|
67
|
+
updateAvailable: compareSemver(latest, current) > 0,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export function printUpdateNotification(current, latest) {
|
|
75
|
+
console.log();
|
|
76
|
+
console.log(chalk.yellow(` Update available: ${chalk.dim(current)} → ${chalk.green(latest)}`));
|
|
77
|
+
console.log(chalk.yellow(` Run ${chalk.cyan(`npm install -g ${PACKAGE_NAME}`)} to update`));
|
|
78
|
+
console.log();
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
export interface User {
|
|
2
|
+
id: number;
|
|
3
|
+
name: string;
|
|
4
|
+
email: string;
|
|
5
|
+
}
|
|
6
|
+
export interface Team {
|
|
7
|
+
id: number;
|
|
8
|
+
name: string;
|
|
9
|
+
personal_team: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface TeamsResponse {
|
|
12
|
+
data: Team[];
|
|
13
|
+
current_team_id: number;
|
|
14
|
+
}
|
|
15
|
+
export interface StaticSite {
|
|
16
|
+
id: number;
|
|
17
|
+
team_id: number;
|
|
18
|
+
name: string;
|
|
19
|
+
slug: string;
|
|
20
|
+
default_domain: string;
|
|
21
|
+
output_directory: string | null;
|
|
22
|
+
status: string;
|
|
23
|
+
current_deployment_id: number | null;
|
|
24
|
+
created_at: string;
|
|
25
|
+
updated_at: string;
|
|
26
|
+
}
|
|
27
|
+
export interface StaticSiteBuild {
|
|
28
|
+
id: string;
|
|
29
|
+
build_number: number;
|
|
30
|
+
status: 'pending' | 'processing' | 'building_image' | 'pushing' | 'succeeded' | 'failed' | 'cancelled';
|
|
31
|
+
source_type: string;
|
|
32
|
+
trigger_type: string;
|
|
33
|
+
file_count: number | null;
|
|
34
|
+
source_size_bytes: number | null;
|
|
35
|
+
duration_seconds: number | null;
|
|
36
|
+
error_message: string | null;
|
|
37
|
+
commit_sha: string | null;
|
|
38
|
+
commit_message: string | null;
|
|
39
|
+
created_at: string;
|
|
40
|
+
updated_at: string;
|
|
41
|
+
}
|
|
42
|
+
export interface StaticSiteDeployment {
|
|
43
|
+
id: number;
|
|
44
|
+
revision_number: number;
|
|
45
|
+
status: 'pending' | 'building' | 'deploying' | 'active' | 'failed' | 'inactive';
|
|
46
|
+
image_ref: string | null;
|
|
47
|
+
trigger_type: string;
|
|
48
|
+
is_current: boolean;
|
|
49
|
+
file_count: number | null;
|
|
50
|
+
file_size_bytes: number | null;
|
|
51
|
+
build_duration_seconds: number | null;
|
|
52
|
+
commit_sha: string | null;
|
|
53
|
+
commit_message: string | null;
|
|
54
|
+
deployed_at: string | null;
|
|
55
|
+
created_at: string;
|
|
56
|
+
}
|
|
57
|
+
export interface StaticSiteDomain {
|
|
58
|
+
id: number;
|
|
59
|
+
static_site_id: number;
|
|
60
|
+
domain: string;
|
|
61
|
+
type: 'default' | 'custom';
|
|
62
|
+
status: 'pending' | 'active' | 'failed';
|
|
63
|
+
verification_record: string | null;
|
|
64
|
+
verified_at: string | null;
|
|
65
|
+
created_at: string;
|
|
66
|
+
updated_at: string;
|
|
67
|
+
}
|
|
68
|
+
export interface Pagination {
|
|
69
|
+
current_page: number;
|
|
70
|
+
last_page: number;
|
|
71
|
+
per_page: number;
|
|
72
|
+
total: number;
|
|
73
|
+
}
|
|
74
|
+
export interface PaginatedResponse<T> {
|
|
75
|
+
data: T[];
|
|
76
|
+
pagination: Pagination;
|
|
77
|
+
}
|
|
78
|
+
export interface MessageResponse {
|
|
79
|
+
message: string;
|
|
80
|
+
}
|
|
81
|
+
export interface MessageWithDataResponse<T> {
|
|
82
|
+
message: string;
|
|
83
|
+
data: T;
|
|
84
|
+
}
|
|
85
|
+
export interface DeployResponse {
|
|
86
|
+
message: string;
|
|
87
|
+
site_id: number;
|
|
88
|
+
status: string;
|
|
89
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/types/api.ts"],"names":[],"mappings":""}
|