nport 2.1.0 โ 2.1.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/CHANGELOG.md +17 -0
- package/dist/analytics.d.ts +59 -0
- package/dist/analytics.js +193 -0
- package/dist/analytics.js.map +1 -0
- package/dist/api.d.ts +20 -0
- package/dist/api.js +85 -0
- package/dist/api.js.map +1 -0
- package/dist/args.d.ts +44 -0
- package/dist/args.js +127 -0
- package/dist/args.js.map +1 -0
- package/dist/bin-manager.d.ts +1 -0
- package/dist/bin-manager.js +209 -0
- package/dist/bin-manager.js.map +1 -0
- package/dist/binary.d.ts +42 -0
- package/dist/binary.js +119 -0
- package/dist/binary.js.map +1 -0
- package/dist/config-manager.d.ts +54 -0
- package/dist/config-manager.js +129 -0
- package/dist/config-manager.js.map +1 -0
- package/dist/config.d.ts +25 -0
- package/dist/config.js +59 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +61 -0
- package/dist/constants.js +86 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +92 -0
- package/dist/index.js.map +1 -0
- package/dist/lang.d.ts +38 -0
- package/dist/lang.js +217 -0
- package/dist/lang.js.map +1 -0
- package/dist/state.d.ts +82 -0
- package/dist/state.js +139 -0
- package/dist/state.js.map +1 -0
- package/dist/tunnel.d.ts +16 -0
- package/dist/tunnel.js +101 -0
- package/dist/tunnel.js.map +1 -0
- package/dist/types/analytics.d.ts +91 -0
- package/dist/types/analytics.js +8 -0
- package/dist/types/analytics.js.map +1 -0
- package/dist/types/config.d.ts +89 -0
- package/dist/types/config.js +8 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/i18n.d.ts +75 -0
- package/dist/types/i18n.js +5 -0
- package/dist/types/i18n.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/tunnel.d.ts +74 -0
- package/dist/types/tunnel.js +8 -0
- package/dist/types/tunnel.js.map +1 -0
- package/dist/types/version.d.ts +25 -0
- package/dist/types/version.js +5 -0
- package/dist/types/version.js.map +1 -0
- package/dist/ui.d.ts +54 -0
- package/dist/ui.js +120 -0
- package/dist/ui.js.map +1 -0
- package/dist/version.d.ts +16 -0
- package/dist/version.js +49 -0
- package/dist/version.js.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,23 @@ All notable changes to NPort will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [2.1.1] - 2026-01-27
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
- ๐ **NPM Package Build**: Fixed missing `dist/` folder in published package
|
|
12
|
+
- Added build step to npm-publish workflow before publishing
|
|
13
|
+
- Package now includes compiled JavaScript files correctly
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
- ๐ **CI/CD Workflows**: Added GitHub Actions for automated deployments
|
|
17
|
+
- `ci.yml`: Runs tests on push to main and pull requests
|
|
18
|
+
- `deploy-server.yml`: Auto-deploys Cloudflare Worker on server changes
|
|
19
|
+
- `deploy-website.yml`: Auto-deploys website to Cloudflare Pages on changes
|
|
20
|
+
- ๐งช **Server Test Configuration**: Fixed Vitest config for CI environment
|
|
21
|
+
- Added miniflare bindings for test environment variables
|
|
22
|
+
- Tests now pass in CI without `.dev.vars` file
|
|
23
|
+
- โ๏ธ **Wrangler Configuration**: Added `preview_urls` setting to suppress warnings
|
|
24
|
+
|
|
8
25
|
## [2.1.0] - 2026-01-27
|
|
9
26
|
|
|
10
27
|
### Added
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics Manager
|
|
3
|
+
*/
|
|
4
|
+
declare class AnalyticsManager {
|
|
5
|
+
private userId;
|
|
6
|
+
private sessionId;
|
|
7
|
+
private disabled;
|
|
8
|
+
constructor();
|
|
9
|
+
/**
|
|
10
|
+
* Initializes analytics.
|
|
11
|
+
*/
|
|
12
|
+
initialize(): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Gets or creates a persistent user ID.
|
|
15
|
+
*/
|
|
16
|
+
private getUserId;
|
|
17
|
+
/**
|
|
18
|
+
* Generates an anonymous user ID.
|
|
19
|
+
*/
|
|
20
|
+
private generateAnonymousId;
|
|
21
|
+
/**
|
|
22
|
+
* Generates a session ID.
|
|
23
|
+
*/
|
|
24
|
+
private generateSessionId;
|
|
25
|
+
/**
|
|
26
|
+
* Tracks an event.
|
|
27
|
+
*/
|
|
28
|
+
private trackEvent;
|
|
29
|
+
/**
|
|
30
|
+
* Builds GA4 payload.
|
|
31
|
+
*/
|
|
32
|
+
private buildPayload;
|
|
33
|
+
/**
|
|
34
|
+
* Gets system information.
|
|
35
|
+
*/
|
|
36
|
+
private getSystemInfo;
|
|
37
|
+
/**
|
|
38
|
+
* Tracks CLI start.
|
|
39
|
+
*/
|
|
40
|
+
trackCliStart(port: number, subdomain: string, version: string): void;
|
|
41
|
+
/**
|
|
42
|
+
* Tracks tunnel creation.
|
|
43
|
+
*/
|
|
44
|
+
trackTunnelCreated(subdomain: string, port: number): void;
|
|
45
|
+
/**
|
|
46
|
+
* Tracks tunnel error.
|
|
47
|
+
*/
|
|
48
|
+
trackTunnelError(errorType: string, errorMessage: string): void;
|
|
49
|
+
/**
|
|
50
|
+
* Tracks tunnel shutdown.
|
|
51
|
+
*/
|
|
52
|
+
trackTunnelShutdown(reason: string, durationSeconds: number): void;
|
|
53
|
+
/**
|
|
54
|
+
* Tracks update available.
|
|
55
|
+
*/
|
|
56
|
+
trackUpdateAvailable(currentVersion: string, latestVersion: string): void;
|
|
57
|
+
}
|
|
58
|
+
export declare const analytics: AnalyticsManager;
|
|
59
|
+
export {};
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import { createHash, randomUUID } from 'crypto';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import { ANALYTICS_TIMEOUT } from './constants.js';
|
|
7
|
+
/**
|
|
8
|
+
* Firebase/GA4 Configuration
|
|
9
|
+
*/
|
|
10
|
+
const FIREBASE_CONFIG = {
|
|
11
|
+
measurementId: 'G-8MYXZL6PGD',
|
|
12
|
+
apiSecret: process.env.NPORT_ANALYTICS_SECRET || 'YOUR_API_SECRET_HERE',
|
|
13
|
+
};
|
|
14
|
+
const ANALYTICS_CONFIG = {
|
|
15
|
+
enabled: true,
|
|
16
|
+
debug: process.env.NPORT_DEBUG === 'true',
|
|
17
|
+
timeout: ANALYTICS_TIMEOUT,
|
|
18
|
+
userIdFile: path.join(os.homedir(), '.nport', 'analytics-id'),
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Analytics Manager
|
|
22
|
+
*/
|
|
23
|
+
class AnalyticsManager {
|
|
24
|
+
userId = null;
|
|
25
|
+
sessionId = null;
|
|
26
|
+
disabled = false;
|
|
27
|
+
constructor() {
|
|
28
|
+
if (process.env.NPORT_ANALYTICS === 'false') {
|
|
29
|
+
this.disabled = true;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Initializes analytics.
|
|
34
|
+
*/
|
|
35
|
+
async initialize() {
|
|
36
|
+
if (this.disabled)
|
|
37
|
+
return;
|
|
38
|
+
if (!FIREBASE_CONFIG.apiSecret || FIREBASE_CONFIG.apiSecret === 'YOUR_API_SECRET_HERE') {
|
|
39
|
+
if (ANALYTICS_CONFIG.debug) {
|
|
40
|
+
console.warn('[Analytics] API secret not configured. Analytics disabled.');
|
|
41
|
+
}
|
|
42
|
+
this.disabled = true;
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
this.userId = await this.getUserId();
|
|
47
|
+
this.sessionId = this.generateSessionId();
|
|
48
|
+
if (ANALYTICS_CONFIG.debug) {
|
|
49
|
+
console.log('[Analytics] Initialized successfully');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
this.disabled = true;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Gets or creates a persistent user ID.
|
|
58
|
+
*/
|
|
59
|
+
async getUserId() {
|
|
60
|
+
try {
|
|
61
|
+
const configDir = path.join(os.homedir(), '.nport');
|
|
62
|
+
if (!fs.existsSync(configDir)) {
|
|
63
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
64
|
+
}
|
|
65
|
+
if (fs.existsSync(ANALYTICS_CONFIG.userIdFile)) {
|
|
66
|
+
const userId = fs.readFileSync(ANALYTICS_CONFIG.userIdFile, 'utf8').trim();
|
|
67
|
+
if (userId)
|
|
68
|
+
return userId;
|
|
69
|
+
}
|
|
70
|
+
const userId = this.generateAnonymousId();
|
|
71
|
+
fs.writeFileSync(ANALYTICS_CONFIG.userIdFile, userId, 'utf8');
|
|
72
|
+
return userId;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return this.generateAnonymousId();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Generates an anonymous user ID.
|
|
80
|
+
*/
|
|
81
|
+
generateAnonymousId() {
|
|
82
|
+
const machineId = [
|
|
83
|
+
os.hostname(),
|
|
84
|
+
os.platform(),
|
|
85
|
+
os.arch(),
|
|
86
|
+
os.homedir(),
|
|
87
|
+
].join('-');
|
|
88
|
+
return createHash('sha256').update(machineId).digest('hex').substring(0, 32);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Generates a session ID.
|
|
92
|
+
*/
|
|
93
|
+
generateSessionId() {
|
|
94
|
+
return randomUUID();
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Tracks an event.
|
|
98
|
+
*/
|
|
99
|
+
async trackEvent(eventName, params = {}) {
|
|
100
|
+
if (this.disabled || !ANALYTICS_CONFIG.enabled || !this.userId)
|
|
101
|
+
return;
|
|
102
|
+
try {
|
|
103
|
+
const payload = this.buildPayload(eventName, params);
|
|
104
|
+
axios.post(`https://www.google-analytics.com/mp/collect?measurement_id=${FIREBASE_CONFIG.measurementId}&api_secret=${FIREBASE_CONFIG.apiSecret}`, payload, {
|
|
105
|
+
timeout: ANALYTICS_CONFIG.timeout,
|
|
106
|
+
headers: { 'Content-Type': 'application/json' },
|
|
107
|
+
}).catch(() => {
|
|
108
|
+
// Silently fail
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// Silently fail
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Builds GA4 payload.
|
|
117
|
+
*/
|
|
118
|
+
buildPayload(eventName, params) {
|
|
119
|
+
return {
|
|
120
|
+
client_id: this.userId,
|
|
121
|
+
events: [
|
|
122
|
+
{
|
|
123
|
+
name: eventName,
|
|
124
|
+
params: {
|
|
125
|
+
session_id: this.sessionId,
|
|
126
|
+
engagement_time_msec: '100',
|
|
127
|
+
...this.getSystemInfo(),
|
|
128
|
+
...params,
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Gets system information.
|
|
136
|
+
*/
|
|
137
|
+
getSystemInfo() {
|
|
138
|
+
return {
|
|
139
|
+
os_platform: os.platform(),
|
|
140
|
+
os_version: os.release(),
|
|
141
|
+
os_arch: os.arch(),
|
|
142
|
+
node_version: process.version,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Tracks CLI start.
|
|
147
|
+
*/
|
|
148
|
+
trackCliStart(port, subdomain, version) {
|
|
149
|
+
this.trackEvent('cli_start', {
|
|
150
|
+
port: String(port),
|
|
151
|
+
has_custom_subdomain: subdomain && !subdomain.startsWith('user-'),
|
|
152
|
+
cli_version: version,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Tracks tunnel creation.
|
|
157
|
+
*/
|
|
158
|
+
trackTunnelCreated(subdomain, port) {
|
|
159
|
+
this.trackEvent('tunnel_created', {
|
|
160
|
+
subdomain_type: subdomain.startsWith('user-') ? 'random' : 'custom',
|
|
161
|
+
port: String(port),
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Tracks tunnel error.
|
|
166
|
+
*/
|
|
167
|
+
trackTunnelError(errorType, errorMessage) {
|
|
168
|
+
this.trackEvent('tunnel_error', {
|
|
169
|
+
error_type: errorType,
|
|
170
|
+
error_message: errorMessage.substring(0, 100),
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Tracks tunnel shutdown.
|
|
175
|
+
*/
|
|
176
|
+
trackTunnelShutdown(reason, durationSeconds) {
|
|
177
|
+
this.trackEvent('tunnel_shutdown', {
|
|
178
|
+
shutdown_reason: reason,
|
|
179
|
+
duration_seconds: String(Math.floor(durationSeconds)),
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Tracks update available.
|
|
184
|
+
*/
|
|
185
|
+
trackUpdateAvailable(currentVersion, latestVersion) {
|
|
186
|
+
this.trackEvent('update_available', {
|
|
187
|
+
current_version: currentVersion,
|
|
188
|
+
latest_version: latestVersion,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
export const analytics = new AnalyticsManager();
|
|
193
|
+
//# sourceMappingURL=analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"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"}
|
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { TunnelResponse } from './types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* API Client
|
|
4
|
+
*
|
|
5
|
+
* Handles all communication with the NPort backend service.
|
|
6
|
+
*/
|
|
7
|
+
export declare class APIClient {
|
|
8
|
+
/**
|
|
9
|
+
* Creates a new Cloudflare tunnel via the backend API.
|
|
10
|
+
*/
|
|
11
|
+
static createTunnel(subdomain: string, backendUrl?: string | null): Promise<TunnelResponse>;
|
|
12
|
+
/**
|
|
13
|
+
* Deletes an existing tunnel.
|
|
14
|
+
*/
|
|
15
|
+
static deleteTunnel(subdomain: string, tunnelId: string, backendUrl?: string | null): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Transforms API errors into user-friendly messages.
|
|
18
|
+
*/
|
|
19
|
+
private static handleError;
|
|
20
|
+
}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { CONFIG } from './config.js';
|
|
4
|
+
import { state } from './state.js';
|
|
5
|
+
/**
|
|
6
|
+
* API Client
|
|
7
|
+
*
|
|
8
|
+
* Handles all communication with the NPort backend service.
|
|
9
|
+
*/
|
|
10
|
+
export class APIClient {
|
|
11
|
+
/**
|
|
12
|
+
* Creates a new Cloudflare tunnel via the backend API.
|
|
13
|
+
*/
|
|
14
|
+
static async createTunnel(subdomain, backendUrl = null) {
|
|
15
|
+
const url = backendUrl || CONFIG.BACKEND_URL;
|
|
16
|
+
try {
|
|
17
|
+
const { data } = await axios.post(url, { subdomain });
|
|
18
|
+
if (!data.success) {
|
|
19
|
+
throw new Error(data.error || 'Unknown error from backend');
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
tunnelId: data.tunnelId,
|
|
23
|
+
tunnelToken: data.tunnelToken,
|
|
24
|
+
url: data.url,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
throw this.handleError(error, subdomain);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Deletes an existing tunnel.
|
|
33
|
+
*/
|
|
34
|
+
static async deleteTunnel(subdomain, tunnelId, backendUrl = null) {
|
|
35
|
+
const url = backendUrl || CONFIG.BACKEND_URL;
|
|
36
|
+
await axios.delete(url, {
|
|
37
|
+
data: { subdomain, tunnelId },
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Transforms API errors into user-friendly messages.
|
|
42
|
+
*/
|
|
43
|
+
static handleError(error, subdomain) {
|
|
44
|
+
const errorMsg = error.response?.data?.error;
|
|
45
|
+
if (errorMsg) {
|
|
46
|
+
if (errorMsg.includes('SUBDOMAIN_PROTECTED:')) {
|
|
47
|
+
return new Error(`Subdomain "${subdomain}" is already taken or in use.\n\n` +
|
|
48
|
+
chalk.yellow('๐ก Try one of these options:\n') +
|
|
49
|
+
chalk.gray(' 1. Choose a different subdomain: ') +
|
|
50
|
+
chalk.cyan(`nport ${state.port || CONFIG.DEFAULT_PORT} -s ${subdomain}-v2\n`) +
|
|
51
|
+
chalk.gray(' 2. Use a random subdomain: ') +
|
|
52
|
+
chalk.cyan(`nport ${state.port || CONFIG.DEFAULT_PORT}\n`) +
|
|
53
|
+
chalk.gray(' 3. Wait a few minutes and retry if you just stopped a tunnel with this name'));
|
|
54
|
+
}
|
|
55
|
+
if (errorMsg.includes('SUBDOMAIN_IN_USE:') ||
|
|
56
|
+
errorMsg.includes('currently in use') ||
|
|
57
|
+
errorMsg.includes('already exists and is currently active')) {
|
|
58
|
+
return new Error(chalk.red(`โ Subdomain "${subdomain}" is already in use!\n\n`) +
|
|
59
|
+
chalk.yellow('๐ก This subdomain is currently being used by another active tunnel.\n\n') +
|
|
60
|
+
chalk.white('Choose a different subdomain:\n') +
|
|
61
|
+
chalk.gray(' 1. Add a suffix: ') +
|
|
62
|
+
chalk.cyan(`nport ${state.port || CONFIG.DEFAULT_PORT} -s ${subdomain}-2\n`) +
|
|
63
|
+
chalk.gray(' 2. Try a variation: ') +
|
|
64
|
+
chalk.cyan(`nport ${state.port || CONFIG.DEFAULT_PORT} -s my-${subdomain}\n`) +
|
|
65
|
+
chalk.gray(' 3. Use random name: ') +
|
|
66
|
+
chalk.cyan(`nport ${state.port || CONFIG.DEFAULT_PORT}\n`));
|
|
67
|
+
}
|
|
68
|
+
if (errorMsg.includes('already have a tunnel') || errorMsg.includes('[1013]')) {
|
|
69
|
+
return new Error(`Subdomain "${subdomain}" is already taken or in use.\n\n` +
|
|
70
|
+
chalk.yellow('๐ก Try one of these options:\n') +
|
|
71
|
+
chalk.gray(' 1. Choose a different subdomain: ') +
|
|
72
|
+
chalk.cyan(`nport ${state.port || CONFIG.DEFAULT_PORT} -s ${subdomain}-v2\n`) +
|
|
73
|
+
chalk.gray(' 2. Use a random subdomain: ') +
|
|
74
|
+
chalk.cyan(`nport ${state.port || CONFIG.DEFAULT_PORT}\n`) +
|
|
75
|
+
chalk.gray(' 3. Wait a few minutes and retry if you just stopped a tunnel with this name'));
|
|
76
|
+
}
|
|
77
|
+
return new Error(`Backend Error: ${errorMsg}`);
|
|
78
|
+
}
|
|
79
|
+
if (error.response) {
|
|
80
|
+
return new Error(`Backend Error: ${JSON.stringify(error.response.data, null, 2)}`);
|
|
81
|
+
}
|
|
82
|
+
return error;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# 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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"}
|
package/dist/args.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ParsedArguments } from './types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Command Line Argument Parser
|
|
4
|
+
*
|
|
5
|
+
* Handles parsing of CLI arguments for the NPort command.
|
|
6
|
+
*/
|
|
7
|
+
export declare class ArgumentParser {
|
|
8
|
+
/**
|
|
9
|
+
* Parses command-line arguments into a configuration object.
|
|
10
|
+
*/
|
|
11
|
+
static parse(argv: string[]): ParsedArguments;
|
|
12
|
+
/**
|
|
13
|
+
* Extracts the port number from arguments.
|
|
14
|
+
*/
|
|
15
|
+
static parsePort(argv: string[]): number;
|
|
16
|
+
/**
|
|
17
|
+
* Extracts the subdomain from arguments.
|
|
18
|
+
*/
|
|
19
|
+
static parseSubdomain(argv: string[]): string;
|
|
20
|
+
/**
|
|
21
|
+
* Extracts the language setting from arguments.
|
|
22
|
+
*/
|
|
23
|
+
static parseLanguage(argv: string[]): string | null;
|
|
24
|
+
/**
|
|
25
|
+
* Extracts the backend URL from arguments.
|
|
26
|
+
*/
|
|
27
|
+
static parseBackendUrl(argv: string[]): string | null;
|
|
28
|
+
/**
|
|
29
|
+
* Extracts the set-backend command from arguments.
|
|
30
|
+
*/
|
|
31
|
+
static parseSetBackend(argv: string[]): string | null;
|
|
32
|
+
/**
|
|
33
|
+
* Finds a flag with value in --flag=value format.
|
|
34
|
+
*/
|
|
35
|
+
private static findFlagWithEquals;
|
|
36
|
+
/**
|
|
37
|
+
* Finds a flag with value in --flag value format.
|
|
38
|
+
*/
|
|
39
|
+
private static findFlagWithValue;
|
|
40
|
+
/**
|
|
41
|
+
* Generates a random subdomain.
|
|
42
|
+
*/
|
|
43
|
+
private static generateRandomSubdomain;
|
|
44
|
+
}
|
package/dist/args.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { CONFIG } from './config.js';
|
|
2
|
+
/**
|
|
3
|
+
* Command Line Argument Parser
|
|
4
|
+
*
|
|
5
|
+
* Handles parsing of CLI arguments for the NPort command.
|
|
6
|
+
*/
|
|
7
|
+
export class ArgumentParser {
|
|
8
|
+
/**
|
|
9
|
+
* Parses command-line arguments into a configuration object.
|
|
10
|
+
*/
|
|
11
|
+
static parse(argv) {
|
|
12
|
+
const port = this.parsePort(argv);
|
|
13
|
+
const subdomain = this.parseSubdomain(argv);
|
|
14
|
+
const language = this.parseLanguage(argv);
|
|
15
|
+
const backendUrl = this.parseBackendUrl(argv);
|
|
16
|
+
const setBackend = this.parseSetBackend(argv);
|
|
17
|
+
return { port, subdomain, language, backendUrl, setBackend };
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Extracts the port number from arguments.
|
|
21
|
+
*/
|
|
22
|
+
static parsePort(argv) {
|
|
23
|
+
const portArg = parseInt(argv[0], 10);
|
|
24
|
+
return portArg || CONFIG.DEFAULT_PORT;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Extracts the subdomain from arguments.
|
|
28
|
+
*/
|
|
29
|
+
static parseSubdomain(argv) {
|
|
30
|
+
const formats = [
|
|
31
|
+
() => this.findFlagWithEquals(argv, '--subdomain='),
|
|
32
|
+
() => this.findFlagWithEquals(argv, '-s='),
|
|
33
|
+
() => this.findFlagWithValue(argv, '--subdomain'),
|
|
34
|
+
() => this.findFlagWithValue(argv, '-s'),
|
|
35
|
+
];
|
|
36
|
+
for (const format of formats) {
|
|
37
|
+
const subdomain = format();
|
|
38
|
+
if (subdomain)
|
|
39
|
+
return subdomain;
|
|
40
|
+
}
|
|
41
|
+
return this.generateRandomSubdomain();
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Extracts the language setting from arguments.
|
|
45
|
+
*/
|
|
46
|
+
static parseLanguage(argv) {
|
|
47
|
+
if (argv.includes('--language') || argv.includes('--lang') || argv.includes('-l')) {
|
|
48
|
+
const langIndex = argv.indexOf('--language') !== -1 ? argv.indexOf('--language') :
|
|
49
|
+
argv.indexOf('--lang') !== -1 ? argv.indexOf('--lang') :
|
|
50
|
+
argv.indexOf('-l');
|
|
51
|
+
const nextArg = argv[langIndex + 1];
|
|
52
|
+
if (!nextArg || nextArg.startsWith('-')) {
|
|
53
|
+
return 'prompt';
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const formats = [
|
|
57
|
+
() => this.findFlagWithEquals(argv, '--language='),
|
|
58
|
+
() => this.findFlagWithEquals(argv, '--lang='),
|
|
59
|
+
() => this.findFlagWithEquals(argv, '-l='),
|
|
60
|
+
() => this.findFlagWithValue(argv, '--language'),
|
|
61
|
+
() => this.findFlagWithValue(argv, '--lang'),
|
|
62
|
+
() => this.findFlagWithValue(argv, '-l'),
|
|
63
|
+
];
|
|
64
|
+
for (const format of formats) {
|
|
65
|
+
const language = format();
|
|
66
|
+
if (language)
|
|
67
|
+
return language;
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Extracts the backend URL from arguments.
|
|
73
|
+
*/
|
|
74
|
+
static parseBackendUrl(argv) {
|
|
75
|
+
const formats = [
|
|
76
|
+
() => this.findFlagWithEquals(argv, '--backend='),
|
|
77
|
+
() => this.findFlagWithEquals(argv, '-b='),
|
|
78
|
+
() => this.findFlagWithValue(argv, '--backend'),
|
|
79
|
+
() => this.findFlagWithValue(argv, '-b'),
|
|
80
|
+
];
|
|
81
|
+
for (const format of formats) {
|
|
82
|
+
const url = format();
|
|
83
|
+
if (url)
|
|
84
|
+
return url;
|
|
85
|
+
}
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Extracts the set-backend command from arguments.
|
|
90
|
+
*/
|
|
91
|
+
static parseSetBackend(argv) {
|
|
92
|
+
const formats = [
|
|
93
|
+
() => this.findFlagWithEquals(argv, '--set-backend='),
|
|
94
|
+
() => this.findFlagWithValue(argv, '--set-backend'),
|
|
95
|
+
];
|
|
96
|
+
for (const format of formats) {
|
|
97
|
+
const url = format();
|
|
98
|
+
if (url)
|
|
99
|
+
return url;
|
|
100
|
+
}
|
|
101
|
+
if (argv.includes('--set-backend')) {
|
|
102
|
+
return 'clear';
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Finds a flag with value in --flag=value format.
|
|
108
|
+
*/
|
|
109
|
+
static findFlagWithEquals(argv, flag) {
|
|
110
|
+
const arg = argv.find((a) => a.startsWith(flag));
|
|
111
|
+
return arg ? arg.split('=')[1] : null;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Finds a flag with value in --flag value format.
|
|
115
|
+
*/
|
|
116
|
+
static findFlagWithValue(argv, flag) {
|
|
117
|
+
const index = argv.indexOf(flag);
|
|
118
|
+
return index !== -1 && argv[index + 1] ? argv[index + 1] : null;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Generates a random subdomain.
|
|
122
|
+
*/
|
|
123
|
+
static generateRandomSubdomain() {
|
|
124
|
+
return `${CONFIG.SUBDOMAIN_PREFIX}${Math.floor(Math.random() * 10000)}`;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=args.js.map
|
package/dist/args.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function ensureCloudflared(): Promise<string>;
|