@42ws/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.
package/dist/index.js ADDED
@@ -0,0 +1,114 @@
1
+ import { login } from './commands/login.js';
2
+ import { whoami } from './commands/whoami.js';
3
+ import { publish } from './commands/publish.js';
4
+ import { setJsonMode } from './lib/output.js';
5
+ const VERSION = '0.1.0';
6
+ const HELP = `
7
+ 42ws — Publish static sites in one command
8
+
9
+ Usage:
10
+ 42ws <command> [options]
11
+
12
+ Commands:
13
+ login Authenticate with your 42ws token
14
+ publish Publish a static site
15
+ whoami Show currently logged-in user
16
+
17
+ Options:
18
+ --help, -h Show this help message
19
+ --version, -v Show CLI version
20
+ --json Output results as JSON
21
+
22
+ Examples:
23
+ 42ws login --token ws_xxx
24
+ 42ws publish --site my-site --dir dist
25
+ 42ws publish --site my-site --build "npm run build"
26
+ 42ws whoami
27
+ `.trim();
28
+ function parseArgs(argv) {
29
+ const flags = {};
30
+ const positional = [];
31
+ let command;
32
+ for (let i = 0; i < argv.length; i++) {
33
+ const arg = argv[i];
34
+ if (arg.startsWith('--')) {
35
+ const eqIdx = arg.indexOf('=');
36
+ if (eqIdx !== -1) {
37
+ const key = arg.slice(2, eqIdx);
38
+ const val = arg.slice(eqIdx + 1);
39
+ flags[key] = val;
40
+ }
41
+ else {
42
+ const key = arg.slice(2);
43
+ const next = argv[i + 1];
44
+ if (next !== undefined && !next.startsWith('-')) {
45
+ flags[key] = next;
46
+ i++;
47
+ }
48
+ else {
49
+ flags[key] = true;
50
+ }
51
+ }
52
+ }
53
+ else if (arg.startsWith('-') && arg.length === 2) {
54
+ flags[arg.slice(1)] = true;
55
+ }
56
+ else if (!command) {
57
+ command = arg;
58
+ }
59
+ else {
60
+ positional.push(arg);
61
+ }
62
+ }
63
+ return { command, flags, positional };
64
+ }
65
+ export async function main() {
66
+ const argv = process.argv.slice(2);
67
+ const { command, flags } = parseArgs(argv);
68
+ // Global flags
69
+ if (flags['json'] === true) {
70
+ setJsonMode(true);
71
+ }
72
+ if (flags['version'] === true || flags['v'] === true) {
73
+ process.stdout.write(VERSION + '\n');
74
+ return;
75
+ }
76
+ if (!command || flags['help'] === true || flags['h'] === true) {
77
+ process.stdout.write(HELP + '\n');
78
+ return;
79
+ }
80
+ switch (command) {
81
+ case '--help':
82
+ case '-h':
83
+ process.stdout.write(HELP + '\n');
84
+ break;
85
+ case '--version':
86
+ case '-v':
87
+ process.stdout.write(VERSION + '\n');
88
+ break;
89
+ case 'login':
90
+ await login({
91
+ token: flags['token'],
92
+ apiUrl: flags['api-url'],
93
+ });
94
+ break;
95
+ case 'whoami':
96
+ await whoami();
97
+ break;
98
+ case 'publish':
99
+ await publish({
100
+ site: flags['site'],
101
+ dir: flags['dir'],
102
+ message: flags['message'],
103
+ yes: flags['yes'] === true,
104
+ json: flags['json'] === true,
105
+ build: flags['build'],
106
+ noBuild: flags['no-build'] === true,
107
+ });
108
+ break;
109
+ default:
110
+ process.stderr.write(`Unknown command: ${command}\n\n${HELP}\n`);
111
+ process.exit(1);
112
+ }
113
+ }
114
+ //# sourceMappingURL=index.js.map
@@ -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
+ import type { Config } from './config.js';
2
+ export declare class ApiError extends Error {
3
+ readonly code: string;
4
+ readonly suggestedFix?: string | undefined;
5
+ constructor(code: string, message: string, suggestedFix?: string | undefined);
6
+ }
7
+ type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
8
+ export declare function apiRequest<T = unknown>(config: Config, method: HttpMethod, path: string, body?: unknown): Promise<T>;
9
+ export declare function uploadFile(url: string, content: Buffer, contentType: string): Promise<void>;
10
+ export {};
11
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,qBAAa,QAAS,SAAQ,KAAK;aAEf,IAAI,EAAE,MAAM;aAEZ,YAAY,CAAC,EAAE,MAAM;gBAFrB,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,EACC,YAAY,CAAC,EAAE,MAAM,YAAA;CAKxC;AAED,KAAK,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE9D,wBAAsB,UAAU,CAAC,CAAC,GAAG,OAAO,EAC1C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,CAAC,CAAC,CAkDZ;AAED,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAwBf"}
@@ -0,0 +1,104 @@
1
+ export class ApiError extends Error {
2
+ code;
3
+ suggestedFix;
4
+ constructor(code, message, suggestedFix) {
5
+ super(message);
6
+ this.code = code;
7
+ this.suggestedFix = suggestedFix;
8
+ this.name = 'ApiError';
9
+ }
10
+ }
11
+ export async function apiRequest(config, method, path, body) {
12
+ const url = `${config.apiUrl}${path}`;
13
+ const headers = {
14
+ 'Content-Type': 'application/json',
15
+ 'User-Agent': '42ws-cli/0.1.0',
16
+ };
17
+ if (config.token) {
18
+ headers['Authorization'] = `Bearer ${config.token}`;
19
+ }
20
+ let response;
21
+ try {
22
+ response = await fetch(url, {
23
+ method,
24
+ headers,
25
+ body: body !== undefined ? JSON.stringify(body) : undefined,
26
+ });
27
+ }
28
+ catch (e) {
29
+ const msg = e instanceof Error ? e.message : String(e);
30
+ throw new ApiError('NETWORK_ERROR', `Network error: ${msg}`, 'Check your internet connection and try again.');
31
+ }
32
+ if (!response.ok) {
33
+ let errorBody = {};
34
+ try {
35
+ errorBody = (await response.json());
36
+ }
37
+ catch {
38
+ // not JSON
39
+ }
40
+ const code = errorBody.code ?? httpStatusToCode(response.status);
41
+ const message = errorBody.message ?? `HTTP ${response.status} ${response.statusText}`;
42
+ const suggestedFix = errorBody.suggestedFix ?? suggestFixForCode(code);
43
+ throw new ApiError(code, message, suggestedFix);
44
+ }
45
+ const text = await response.text();
46
+ if (!text)
47
+ return undefined;
48
+ try {
49
+ return JSON.parse(text);
50
+ }
51
+ catch {
52
+ return text;
53
+ }
54
+ }
55
+ export async function uploadFile(url, content, contentType) {
56
+ let response;
57
+ try {
58
+ response = await fetch(url, {
59
+ method: 'PUT',
60
+ headers: { 'Content-Type': contentType },
61
+ body: content,
62
+ });
63
+ }
64
+ catch (e) {
65
+ const msg = e instanceof Error ? e.message : String(e);
66
+ throw new ApiError('NETWORK_ERROR', `Network error during upload: ${msg}`, 'Check your internet connection and try again.');
67
+ }
68
+ if (!response.ok) {
69
+ throw new ApiError('UPLOAD_FAILED', `Upload failed with HTTP ${response.status}`, 'Try running publish again. If the issue persists, check your network connection.');
70
+ }
71
+ }
72
+ function httpStatusToCode(status) {
73
+ switch (status) {
74
+ case 401: return 'LOGIN_EXPIRED';
75
+ case 403: return 'FORBIDDEN';
76
+ case 404: return 'NOT_FOUND';
77
+ case 409: return 'CONFLICT';
78
+ case 422: return 'INVALID_REQUEST';
79
+ default: return status >= 500 ? 'PUBLISH_FAILED' : 'REQUEST_FAILED';
80
+ }
81
+ }
82
+ function suggestFixForCode(code) {
83
+ const fixes = {
84
+ LOGIN_EXPIRED: 'Run `42ws login` to re-authenticate.',
85
+ FORBIDDEN: 'You do not have permission to perform this action.',
86
+ NOT_LOGGED_IN: 'Run `42ws login --token <your-token>` to authenticate.',
87
+ INVALID_TOKEN: 'The token you provided is invalid. Get a new token from your dashboard.',
88
+ SITE_NAME_TAKEN: 'Choose a different site name with --site <name>.',
89
+ RESERVED_SITE_NAME: 'This site name is reserved. Choose a different name.',
90
+ INVALID_SITE_NAME: 'Site names must be lowercase alphanumeric with hyphens (e.g. my-site).',
91
+ BUILD_FAILED: 'Fix the build errors shown above and try again.',
92
+ OUTPUT_DIR_NOT_FOUND: 'Run your build command first, or specify the correct directory with --dir.',
93
+ NO_FILES_FOUND: 'Make sure your output directory contains files to publish.',
94
+ FILE_TOO_LARGE: 'Individual files must be under 50 MB.',
95
+ TOO_MANY_FILES: 'Reduce the number of files to publish (max 5000).',
96
+ BLOCKED_FILE: 'Remove sensitive files from your output directory before publishing.',
97
+ UPLOAD_FAILED: 'Try running publish again. If the issue persists, check your network.',
98
+ PUBLISH_FAILED: 'The publish request failed. Try again.',
99
+ NETWORK_ERROR: 'Check your internet connection and try again.',
100
+ CONFLICT: 'The resource already exists.',
101
+ };
102
+ return fixes[code] ?? 'Try again or contact support.';
103
+ }
104
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface Config {
2
+ token?: string;
3
+ apiUrl: string;
4
+ }
5
+ export declare function loadConfig(): Config;
6
+ export declare function saveConfig(config: Partial<Config>): void;
7
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD,wBAAgB,UAAU,IAAI,MAAM,CAkBnC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAYxD"}
@@ -0,0 +1,36 @@
1
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join, dirname } from 'node:path';
4
+ const CONFIG_DIR = join(homedir(), '.42ws');
5
+ const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
6
+ const DEFAULT_API_URL = 'https://api.dev.42ws.com';
7
+ export function loadConfig() {
8
+ const apiUrl = process.env['FORTYTWO_WS_API_URL'] ?? DEFAULT_API_URL;
9
+ const token = process.env['FORTYTWO_WS_TOKEN'];
10
+ let fileConfig = {};
11
+ if (existsSync(CONFIG_FILE)) {
12
+ try {
13
+ const raw = readFileSync(CONFIG_FILE, 'utf-8');
14
+ fileConfig = JSON.parse(raw);
15
+ }
16
+ catch {
17
+ // config file is malformed, ignore
18
+ }
19
+ }
20
+ return {
21
+ token: token ?? fileConfig.token,
22
+ apiUrl: process.env['FORTYTWO_WS_API_URL'] ?? fileConfig.apiUrl ?? DEFAULT_API_URL,
23
+ };
24
+ }
25
+ export function saveConfig(config) {
26
+ const existing = loadConfig();
27
+ const merged = {
28
+ token: config.token ?? existing.token,
29
+ apiUrl: config.apiUrl ?? existing.apiUrl,
30
+ };
31
+ if (!existsSync(dirname(CONFIG_FILE))) {
32
+ mkdirSync(dirname(CONFIG_FILE), { recursive: true });
33
+ }
34
+ writeFileSync(CONFIG_FILE, JSON.stringify(merged, null, 2) + '\n', { mode: 0o600 });
35
+ }
36
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAO1C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AACpD,MAAM,eAAe,GAAG,0BAA0B,CAAC;AAEnD,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,eAAe,CAAC;IACrE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAE/C,IAAI,UAAU,GAAoB,EAAE,CAAC;IACrC,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC/C,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK,IAAI,UAAU,CAAC,KAAK;QAChC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,UAAU,CAAC,MAAM,IAAI,eAAe;KACnF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAuB;IAChD,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAW;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK;QACrC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM;KACzC,CAAC;IAEF,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QACtC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACtF,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface DetectionResult {
2
+ framework: 'vite' | 'astro' | 'next-static' | 'sveltekit-static' | 'plain-html' | 'unknown';
3
+ build?: string;
4
+ output?: string;
5
+ spa?: boolean;
6
+ confidence: 'high' | 'medium' | 'low';
7
+ }
8
+ export declare function detectFramework(cwd: string): DetectionResult;
9
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/lib/detect.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,aAAa,GAAG,kBAAkB,GAAG,YAAY,GAAG,SAAS,CAAC;IAC5F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvC;AA8CD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CA6E5D"}
@@ -0,0 +1,112 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ function readPackageJson(cwd) {
4
+ const pkgPath = join(cwd, 'package.json');
5
+ if (!existsSync(pkgPath))
6
+ return null;
7
+ try {
8
+ return JSON.parse(readFileSync(pkgPath, 'utf-8'));
9
+ }
10
+ catch {
11
+ return null;
12
+ }
13
+ }
14
+ function hasDep(pkg, name) {
15
+ return !!(pkg.dependencies?.[name] ?? pkg.devDependencies?.[name]);
16
+ }
17
+ function hasNextStaticExport(cwd, pkg) {
18
+ // Check next.config.{js,mjs,ts} for output: 'export'
19
+ const configFiles = ['next.config.js', 'next.config.mjs', 'next.config.ts'];
20
+ for (const file of configFiles) {
21
+ const configPath = join(cwd, file);
22
+ if (existsSync(configPath)) {
23
+ try {
24
+ const content = readFileSync(configPath, 'utf-8');
25
+ if (content.includes("output: 'export'") || content.includes('output: "export"')) {
26
+ return true;
27
+ }
28
+ }
29
+ catch {
30
+ // ignore
31
+ }
32
+ }
33
+ }
34
+ // Check scripts.build for next export
35
+ const buildScript = pkg.scripts?.['build'] ?? '';
36
+ if (buildScript.includes('next export')) {
37
+ return true;
38
+ }
39
+ return false;
40
+ }
41
+ export function detectFramework(cwd) {
42
+ const pkg = readPackageJson(cwd);
43
+ if (pkg) {
44
+ // Vite
45
+ if (hasDep(pkg, 'vite')) {
46
+ return {
47
+ framework: 'vite',
48
+ build: 'npm run build',
49
+ output: 'dist',
50
+ spa: true,
51
+ confidence: 'high',
52
+ };
53
+ }
54
+ // Astro
55
+ if (hasDep(pkg, 'astro')) {
56
+ return {
57
+ framework: 'astro',
58
+ build: 'npm run build',
59
+ output: 'dist',
60
+ spa: false,
61
+ confidence: 'high',
62
+ };
63
+ }
64
+ // Next static export
65
+ if (hasDep(pkg, 'next') && hasNextStaticExport(cwd, pkg)) {
66
+ return {
67
+ framework: 'next-static',
68
+ build: 'npm run build',
69
+ output: 'out',
70
+ spa: false,
71
+ confidence: 'high',
72
+ };
73
+ }
74
+ // SvelteKit static
75
+ if (hasDep(pkg, '@sveltejs/adapter-static')) {
76
+ return {
77
+ framework: 'sveltekit-static',
78
+ build: 'npm run build',
79
+ output: 'build',
80
+ spa: true,
81
+ confidence: 'medium',
82
+ };
83
+ }
84
+ }
85
+ // Plain HTML in current directory
86
+ if (existsSync(join(cwd, 'index.html'))) {
87
+ return {
88
+ framework: 'plain-html',
89
+ build: undefined,
90
+ output: '.',
91
+ spa: false,
92
+ confidence: 'high',
93
+ };
94
+ }
95
+ // Pre-built output directory
96
+ for (const dir of ['dist', 'build', 'out']) {
97
+ if (existsSync(join(cwd, dir, 'index.html'))) {
98
+ return {
99
+ framework: 'unknown',
100
+ build: undefined,
101
+ output: dir,
102
+ spa: false,
103
+ confidence: 'medium',
104
+ };
105
+ }
106
+ }
107
+ return {
108
+ framework: 'unknown',
109
+ confidence: 'low',
110
+ };
111
+ }
112
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/lib/detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface FileEntry {
2
+ path: string;
3
+ absolutePath: string;
4
+ contentType: string;
5
+ size: number;
6
+ sha256: string;
7
+ content: Buffer;
8
+ }
9
+ export declare function collectFiles(dir: string): FileEntry[];
10
+ export declare function formatBytes(bytes: number): string;
11
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/lib/files.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AA4DD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,CA2ErD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIjD"}
@@ -0,0 +1,118 @@
1
+ import { readdirSync, lstatSync, readFileSync } from 'node:fs';
2
+ import { join, relative, extname } from 'node:path';
3
+ import { createHash } from 'node:crypto';
4
+ import { ApiError } from './api.js';
5
+ const BLOCKED_PATTERNS = [
6
+ /^\.env$/,
7
+ /^\.env\..+$/,
8
+ /^\.git$/,
9
+ /^\.git\//,
10
+ /^node_modules$/,
11
+ /^node_modules\//,
12
+ /\.pem$/,
13
+ /\.key$/,
14
+ /^id_rsa$/,
15
+ /^id_ed25519$/,
16
+ ];
17
+ const SILENT_EXCLUDE_PATTERNS = [
18
+ /^\.DS_Store$/,
19
+ /^npm-debug\.log$/,
20
+ /^yarn-error\.log$/,
21
+ /^pnpm-debug\.log$/,
22
+ ];
23
+ const CONTENT_TYPE_MAP = {
24
+ '.html': 'text/html; charset=utf-8',
25
+ '.css': 'text/css; charset=utf-8',
26
+ '.js': 'application/javascript',
27
+ '.mjs': 'application/javascript',
28
+ '.json': 'application/json',
29
+ '.png': 'image/png',
30
+ '.jpg': 'image/jpeg',
31
+ '.jpeg': 'image/jpeg',
32
+ '.webp': 'image/webp',
33
+ '.svg': 'image/svg+xml',
34
+ '.ico': 'image/x-icon',
35
+ '.woff': 'font/woff',
36
+ '.woff2': 'font/woff2',
37
+ '.txt': 'text/plain; charset=utf-8',
38
+ '.xml': 'application/xml',
39
+ '.pdf': 'application/pdf',
40
+ '.mp4': 'video/mp4',
41
+ '.mp3': 'audio/mpeg',
42
+ };
43
+ const MAX_FILE_SIZE = 50 * 1024 * 1024; // 50 MB
44
+ const MAX_FILES = 5000;
45
+ function getContentType(filePath) {
46
+ const ext = extname(filePath).toLowerCase();
47
+ return CONTENT_TYPE_MAP[ext] ?? 'application/octet-stream';
48
+ }
49
+ function isBlocked(relPath) {
50
+ const normalized = relPath.replace(/\\/g, '/');
51
+ return BLOCKED_PATTERNS.some(p => p.test(normalized));
52
+ }
53
+ function isSilentExcluded(name) {
54
+ return SILENT_EXCLUDE_PATTERNS.some(p => p.test(name));
55
+ }
56
+ export function collectFiles(dir) {
57
+ const entries = [];
58
+ function walk(current) {
59
+ let items;
60
+ try {
61
+ items = readdirSync(current);
62
+ }
63
+ catch {
64
+ return;
65
+ }
66
+ for (const name of items) {
67
+ const absolutePath = join(current, name);
68
+ const relPath = relative(dir, absolutePath).replace(/\\/g, '/');
69
+ if (isSilentExcluded(name))
70
+ continue;
71
+ if (isBlocked(relPath)) {
72
+ throw new ApiError('BLOCKED_FILE', `Refusing to publish sensitive file: ${relPath}`, 'Remove sensitive files from your output directory before publishing.');
73
+ }
74
+ // lstat to detect symlinks without following them
75
+ let lstats;
76
+ try {
77
+ lstats = lstatSync(absolutePath);
78
+ }
79
+ catch {
80
+ continue;
81
+ }
82
+ if (lstats.isSymbolicLink())
83
+ continue;
84
+ if (lstats.isDirectory()) {
85
+ walk(absolutePath);
86
+ continue;
87
+ }
88
+ if (!lstats.isFile())
89
+ continue;
90
+ if (lstats.size > MAX_FILE_SIZE) {
91
+ throw new ApiError('FILE_TOO_LARGE', `File too large (${(lstats.size / 1024 / 1024).toFixed(1)} MB): ${relPath}`, 'Individual files must be under 50 MB.');
92
+ }
93
+ const content = readFileSync(absolutePath);
94
+ const sha256 = createHash('sha256').update(content).digest('hex');
95
+ entries.push({
96
+ path: relPath,
97
+ absolutePath,
98
+ contentType: getContentType(absolutePath),
99
+ size: lstats.size,
100
+ sha256,
101
+ content,
102
+ });
103
+ }
104
+ }
105
+ walk(dir);
106
+ if (entries.length > MAX_FILES) {
107
+ throw new ApiError('TOO_MANY_FILES', `Too many files: ${entries.length} (max ${MAX_FILES})`, 'Reduce the number of files to publish (max 5000).');
108
+ }
109
+ return entries;
110
+ }
111
+ export function formatBytes(bytes) {
112
+ if (bytes < 1024)
113
+ return `${bytes} B`;
114
+ if (bytes < 1024 * 1024)
115
+ return `${(bytes / 1024).toFixed(1)} KB`;
116
+ return `${(bytes / 1024 / 1024).toFixed(1)} MB`;
117
+ }
118
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/lib/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface OutputOptions {
2
+ json?: boolean;
3
+ }
4
+ export declare function setJsonMode(enabled: boolean): void;
5
+ export declare function isJsonMode(): boolean;
6
+ export declare function info(msg: string): void;
7
+ export declare function success(data: Record<string, unknown>): void;
8
+ export declare function successMessage(msg: string): void;
9
+ export declare function error(code: string, message: string, suggestedFix?: string): void;
10
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAID,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAElD;AAED,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAItC;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAI3D;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAIhD;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAWhF"}
@@ -0,0 +1,37 @@
1
+ let jsonMode = false;
2
+ export function setJsonMode(enabled) {
3
+ jsonMode = enabled;
4
+ }
5
+ export function isJsonMode() {
6
+ return jsonMode;
7
+ }
8
+ export function info(msg) {
9
+ if (!jsonMode) {
10
+ process.stderr.write(msg + '\n');
11
+ }
12
+ }
13
+ export function success(data) {
14
+ if (jsonMode) {
15
+ process.stdout.write(JSON.stringify({ ok: true, ...data }) + '\n');
16
+ }
17
+ }
18
+ export function successMessage(msg) {
19
+ if (!jsonMode) {
20
+ process.stdout.write(msg + '\n');
21
+ }
22
+ }
23
+ export function error(code, message, suggestedFix) {
24
+ if (jsonMode) {
25
+ const obj = { code, message };
26
+ if (suggestedFix)
27
+ obj['suggestedFix'] = suggestedFix;
28
+ process.stdout.write(JSON.stringify({ ok: false, error: obj }) + '\n');
29
+ }
30
+ else {
31
+ process.stderr.write(`Error [${code}]: ${message}\n`);
32
+ if (suggestedFix) {
33
+ process.stderr.write(` Fix: ${suggestedFix}\n`);
34
+ }
35
+ }
36
+ }
37
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAIA,IAAI,QAAQ,GAAG,KAAK,CAAC;AAErB,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,QAAQ,GAAG,OAAO,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAW;IAC9B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAA6B;IACnD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,IAAY,EAAE,OAAe,EAAE,YAAqB;IACxE,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,GAA4B,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACvD,IAAI,YAAY;YAAE,GAAG,CAAC,cAAc,CAAC,GAAG,YAAY,CAAC;QACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACzE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,MAAM,OAAO,IAAI,CAAC,CAAC;QACtD,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,YAAY,IAAI,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;AACH,CAAC"}