@powerhousedao/shared 6.0.0-dev.228 → 6.0.0-dev.230
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/clis/args/access-token.d.mts +18 -0
- package/dist/clis/args/access-token.d.mts.map +1 -0
- package/dist/clis/args/access-token.mjs +22 -0
- package/dist/clis/args/access-token.mjs.map +1 -0
- package/dist/clis/args/code.d.mts +12 -0
- package/dist/clis/args/code.d.mts.map +1 -0
- package/dist/clis/args/code.mjs +11 -0
- package/dist/clis/args/code.mjs.map +1 -0
- package/dist/clis/args/common-BQ2pvhCr.d.mts +177 -0
- package/dist/clis/args/common-BQ2pvhCr.d.mts.map +1 -0
- package/dist/clis/args/common-Bc8EcW9w.mjs +269 -0
- package/dist/clis/args/common-Bc8EcW9w.mjs.map +1 -0
- package/dist/clis/args/common.d.mts +2 -0
- package/dist/clis/args/common.mjs +2 -0
- package/dist/clis/args/connect.d.mts +204 -0
- package/dist/clis/args/connect.d.mts.map +1 -0
- package/dist/clis/args/connect.mjs +51 -0
- package/dist/clis/args/connect.mjs.map +1 -0
- package/dist/clis/args/generate-DNGRYRdp.mjs +153 -0
- package/dist/clis/args/generate-DNGRYRdp.mjs.map +1 -0
- package/dist/clis/args/generate.d.mts +87 -0
- package/dist/clis/args/generate.d.mts.map +1 -0
- package/dist/clis/args/generate.mjs +2 -0
- package/dist/clis/args/help-CGUFDMjQ.d.mts +205 -0
- package/dist/clis/args/help-CGUFDMjQ.d.mts.map +1 -0
- package/dist/clis/args/help-MdisTzrz.mjs +160 -0
- package/dist/clis/args/help-MdisTzrz.mjs.map +1 -0
- package/dist/clis/args/help.d.mts +2 -0
- package/dist/clis/args/help.mjs +15 -0
- package/dist/clis/args/index.d.mts +20 -0
- package/dist/clis/args/index.mjs +20 -0
- package/dist/clis/args/init.d.mts +49 -0
- package/dist/clis/args/init.d.mts.map +1 -0
- package/dist/clis/args/init.mjs +56 -0
- package/dist/clis/args/init.mjs.map +1 -0
- package/dist/clis/args/inspect.d.mts +15 -0
- package/dist/clis/args/inspect.d.mts.map +1 -0
- package/dist/clis/args/inspect.mjs +15 -0
- package/dist/clis/args/inspect.mjs.map +1 -0
- package/dist/clis/args/install.d.mts +37 -0
- package/dist/clis/args/install.d.mts.map +1 -0
- package/dist/clis/args/install.mjs +26 -0
- package/dist/clis/args/install.mjs.map +1 -0
- package/dist/clis/args/list.d.mts +12 -0
- package/dist/clis/args/list.d.mts.map +1 -0
- package/dist/clis/args/list.mjs +7 -0
- package/dist/clis/args/list.mjs.map +1 -0
- package/dist/clis/args/login.d.mts +27 -0
- package/dist/clis/args/login.d.mts.map +1 -0
- package/dist/clis/args/login.mjs +40 -0
- package/dist/clis/args/login.mjs.map +1 -0
- package/dist/clis/args/migrate.d.mts +21 -0
- package/dist/clis/args/migrate.d.mts.map +1 -0
- package/dist/clis/args/migrate.mjs +29 -0
- package/dist/clis/args/migrate.mjs.map +1 -0
- package/dist/clis/args/publish.d.mts +18 -0
- package/dist/clis/args/publish.d.mts.map +1 -0
- package/dist/clis/args/publish.mjs +19 -0
- package/dist/clis/args/publish.mjs.map +1 -0
- package/dist/clis/args/registry.d.mts +19 -0
- package/dist/clis/args/registry.d.mts.map +1 -0
- package/dist/clis/args/registry.mjs +23 -0
- package/dist/clis/args/registry.mjs.map +1 -0
- package/dist/clis/args/service-C88bN_g_.d.mts +22 -0
- package/dist/clis/args/service-C88bN_g_.d.mts.map +1 -0
- package/dist/clis/args/service.d.mts +2 -0
- package/dist/clis/args/service.mjs +11 -0
- package/dist/clis/args/service.mjs.map +1 -0
- package/dist/clis/args/switchboard.d.mts +66 -0
- package/dist/clis/args/switchboard.d.mts.map +1 -0
- package/dist/clis/args/switchboard.mjs +74 -0
- package/dist/clis/args/switchboard.mjs.map +1 -0
- package/dist/clis/args/uninstall.d.mts +31 -0
- package/dist/clis/args/uninstall.d.mts.map +1 -0
- package/dist/clis/args/uninstall.mjs +16 -0
- package/dist/clis/args/uninstall.mjs.map +1 -0
- package/dist/clis/args/unpublish.d.mts +24 -0
- package/dist/clis/args/unpublish.d.mts.map +1 -0
- package/dist/clis/args/unpublish.mjs +30 -0
- package/dist/clis/args/unpublish.mjs.map +1 -0
- package/dist/clis/args/vetra.d.mts +93 -0
- package/dist/clis/args/vetra.d.mts.map +1 -0
- package/dist/clis/args/vetra.mjs +64 -0
- package/dist/clis/args/vetra.mjs.map +1 -0
- package/dist/clis/command-names.d.mts +5 -0
- package/dist/clis/command-names.d.mts.map +1 -0
- package/dist/clis/command-names.mjs +29 -0
- package/dist/clis/command-names.mjs.map +1 -0
- package/dist/clis/constants.d.mts +86 -0
- package/dist/clis/constants.d.mts.map +1 -0
- package/dist/clis/constants.mjs +64 -0
- package/dist/clis/constants.mjs.map +1 -0
- package/dist/clis/index.d.mts +232 -423
- package/dist/clis/index.d.mts.map +1 -1
- package/dist/clis/index.mjs +61 -23
- package/dist/clis/index.mjs.map +1 -1
- package/dist/clis/services/telemetry.d.mts +40 -0
- package/dist/clis/services/telemetry.d.mts.map +1 -0
- package/dist/clis/services/telemetry.mjs +185 -0
- package/dist/clis/services/telemetry.mjs.map +1 -0
- package/dist/clis/utils.d.mts +9 -0
- package/dist/clis/utils.d.mts.map +1 -0
- package/dist/clis/utils.mjs +373 -0
- package/dist/clis/utils.mjs.map +1 -0
- package/dist/document-drive/index.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/registry/index.d.ts +1 -1
- package/dist/{types-BBG1wGRP.d.ts → types-DyMP31mD.d.ts} +6 -6
- package/dist/{types-BBG1wGRP.d.ts.map → types-DyMP31mD.d.ts.map} +1 -1
- package/package.json +25 -1
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
//#region clis/services/telemetry.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Prompts the user once, caches the answer. Must be called before init.
|
|
4
|
+
* Returns `true` if telemetry should be enabled, `false` otherwise.
|
|
5
|
+
*/
|
|
6
|
+
declare function resolveTelemetryConsent(): Promise<boolean>;
|
|
7
|
+
/**
|
|
8
|
+
* Initializes Sentry for CLI error reporting if telemetry is enabled.
|
|
9
|
+
* Safe to call multiple times; only the first call takes effect.
|
|
10
|
+
*/
|
|
11
|
+
declare function initCliTelemetry(opts: {
|
|
12
|
+
cliName: "ph-cli" | "ph-cmd";
|
|
13
|
+
release?: string;
|
|
14
|
+
}): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Captures an error (if telemetry is initialized) and flushes before the
|
|
17
|
+
* caller calls process.exit(). Safe no-op when telemetry is disabled.
|
|
18
|
+
*/
|
|
19
|
+
declare function captureCliError(err: unknown): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Explicitly set telemetry consent (used by `ph telemetry on|off`).
|
|
22
|
+
*/
|
|
23
|
+
declare function setTelemetryConsent(enabled: boolean): void;
|
|
24
|
+
/**
|
|
25
|
+
* Returns the current telemetry state — useful for `ph telemetry status`.
|
|
26
|
+
*/
|
|
27
|
+
declare function getTelemetryStatus(): {
|
|
28
|
+
source: "env";
|
|
29
|
+
enabled: boolean;
|
|
30
|
+
} | {
|
|
31
|
+
source: "config";
|
|
32
|
+
enabled: boolean;
|
|
33
|
+
askedAt: string;
|
|
34
|
+
} | {
|
|
35
|
+
source: "default";
|
|
36
|
+
enabled: false;
|
|
37
|
+
};
|
|
38
|
+
//#endregion
|
|
39
|
+
export { captureCliError, getTelemetryStatus, initCliTelemetry, resolveTelemetryConsent, setTelemetryConsent };
|
|
40
|
+
//# sourceMappingURL=telemetry.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.mts","names":[],"sources":["../../../clis/services/telemetry.ts"],"mappings":";;AA8EA;;;iBAAsB,uBAAA,CAAA,GAA2B,OAAA;;AAkHjD;;;iBAAsB,gBAAA,CAAiB,IAAA;EACrC,OAAA;EACA,OAAA;AAAA,IACE,OAAA;;;;AAkCJ;iBAAsB,eAAA,CAAgB,GAAA,YAAe,OAAA;;;;iBAcrC,mBAAA,CAAoB,OAAA;;;;iBAOpB,kBAAA,CAAA;EACV,MAAA;EAAe,OAAA;AAAA;EACf,MAAA;EAAkB,OAAA;EAAkB,OAAA;AAAA;EACpC,MAAA;EAAmB,OAAA;AAAA"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
4
|
+
//#region clis/services/telemetry.ts
|
|
5
|
+
/**
|
|
6
|
+
* CLI telemetry (error reporting via Sentry).
|
|
7
|
+
*
|
|
8
|
+
* Design:
|
|
9
|
+
* - Opt-out by default, asked once on first interactive run.
|
|
10
|
+
* - Stores consent in ~/.ph/telemetry.json so we never ask twice.
|
|
11
|
+
* - Respects PH_NO_TELEMETRY=1 and DO_NOT_TRACK=1 as immediate kill switches.
|
|
12
|
+
* - Non-interactive (TTY missing, CI, piped) defaults to DISABLED — we don't
|
|
13
|
+
* want to hang a CI pipeline on an unanswered prompt, and we don't want to
|
|
14
|
+
* capture errors without informed consent.
|
|
15
|
+
* - DSN is published in the CLI binary; Sentry DSNs accept events but grant
|
|
16
|
+
* no read access, so this is safe. Hardcoded so users can't accidentally
|
|
17
|
+
* misroute events.
|
|
18
|
+
*
|
|
19
|
+
* PII scrubbing in beforeSend hook:
|
|
20
|
+
* - Home-directory paths collapsed to ~
|
|
21
|
+
* - Flag/arg values that look like secrets (tokens, keys) stripped
|
|
22
|
+
* - No source-context from user files
|
|
23
|
+
*/
|
|
24
|
+
const SENTRY_DSN = "https://0e7793802288589b4923896118374462@sentry.monitoring.vetra.io/3";
|
|
25
|
+
const TELEMETRY_FILE = join(homedir(), ".ph", "telemetry.json");
|
|
26
|
+
function isExplicitlyDisabled() {
|
|
27
|
+
return process.env.PH_NO_TELEMETRY === "1" || process.env.PH_NO_TELEMETRY === "true" || process.env.DO_NOT_TRACK === "1" || process.env.DO_NOT_TRACK === "true";
|
|
28
|
+
}
|
|
29
|
+
function isExplicitlyEnabled() {
|
|
30
|
+
return process.env.PH_TELEMETRY === "1" || process.env.PH_TELEMETRY === "true";
|
|
31
|
+
}
|
|
32
|
+
function isInteractive() {
|
|
33
|
+
return Boolean(process.stdin.isTTY) && !process.env.CI;
|
|
34
|
+
}
|
|
35
|
+
function readConfig() {
|
|
36
|
+
try {
|
|
37
|
+
if (!existsSync(TELEMETRY_FILE)) return null;
|
|
38
|
+
return JSON.parse(readFileSync(TELEMETRY_FILE, "utf8"));
|
|
39
|
+
} catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function writeConfig(cfg) {
|
|
44
|
+
try {
|
|
45
|
+
mkdirSync(join(homedir(), ".ph"), { recursive: true });
|
|
46
|
+
writeFileSync(TELEMETRY_FILE, JSON.stringify(cfg, null, 2));
|
|
47
|
+
} catch {}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Prompts the user once, caches the answer. Must be called before init.
|
|
51
|
+
* Returns `true` if telemetry should be enabled, `false` otherwise.
|
|
52
|
+
*/
|
|
53
|
+
async function resolveTelemetryConsent() {
|
|
54
|
+
if (isExplicitlyDisabled()) return false;
|
|
55
|
+
if (isExplicitlyEnabled()) return true;
|
|
56
|
+
const cached = readConfig();
|
|
57
|
+
if (cached) return cached.enabled;
|
|
58
|
+
if (!isInteractive()) return false;
|
|
59
|
+
const enquirer = await import("enquirer");
|
|
60
|
+
try {
|
|
61
|
+
const { enabled } = await enquirer.default.prompt({
|
|
62
|
+
type: "confirm",
|
|
63
|
+
name: "enabled",
|
|
64
|
+
message: "Help improve Powerhouse by sending anonymous error reports? (stack traces only, paths and secrets are scrubbed)",
|
|
65
|
+
initial: true
|
|
66
|
+
});
|
|
67
|
+
writeConfig({
|
|
68
|
+
enabled,
|
|
69
|
+
askedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
70
|
+
});
|
|
71
|
+
return enabled;
|
|
72
|
+
} catch {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function scrubString(input) {
|
|
77
|
+
if (!input) return input;
|
|
78
|
+
const home = homedir();
|
|
79
|
+
let out = input;
|
|
80
|
+
if (home && out.includes(home)) out = out.split(home).join("~");
|
|
81
|
+
out = out.replace(/(--?(?:token|api[-_]?key|password|secret|auth)[=\s])([^\s]+)/gi, "$1<redacted>");
|
|
82
|
+
return out;
|
|
83
|
+
}
|
|
84
|
+
function scrubEvent(event) {
|
|
85
|
+
const e = event;
|
|
86
|
+
try {
|
|
87
|
+
if (e.message) e.message = scrubString(e.message);
|
|
88
|
+
if (e.logentry?.message) e.logentry.message = scrubString(e.logentry.message);
|
|
89
|
+
const values = e.exception?.values;
|
|
90
|
+
if (Array.isArray(values)) for (const ex of values) {
|
|
91
|
+
if (ex.value) ex.value = scrubString(ex.value);
|
|
92
|
+
const frames = ex.stacktrace?.frames;
|
|
93
|
+
if (Array.isArray(frames)) for (const f of frames) {
|
|
94
|
+
if (f.filename) f.filename = scrubString(f.filename);
|
|
95
|
+
if (f.abs_path) f.abs_path = scrubString(f.abs_path);
|
|
96
|
+
delete f.pre_context;
|
|
97
|
+
delete f.context_line;
|
|
98
|
+
delete f.post_context;
|
|
99
|
+
delete f.vars;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
delete e.server_name;
|
|
103
|
+
if (e.extra) {
|
|
104
|
+
delete e.extra.argv;
|
|
105
|
+
delete e.extra.env;
|
|
106
|
+
}
|
|
107
|
+
} catch {}
|
|
108
|
+
return event;
|
|
109
|
+
}
|
|
110
|
+
let initialized = false;
|
|
111
|
+
/**
|
|
112
|
+
* Initializes Sentry for CLI error reporting if telemetry is enabled.
|
|
113
|
+
* Safe to call multiple times; only the first call takes effect.
|
|
114
|
+
*/
|
|
115
|
+
async function initCliTelemetry(opts) {
|
|
116
|
+
if (initialized) return;
|
|
117
|
+
if (!await resolveTelemetryConsent()) return;
|
|
118
|
+
const Sentry = await import("@sentry/node");
|
|
119
|
+
Sentry.init({
|
|
120
|
+
dsn: SENTRY_DSN,
|
|
121
|
+
release: opts.release,
|
|
122
|
+
environment: process.env.NODE_ENV || "production",
|
|
123
|
+
sendDefaultPii: false,
|
|
124
|
+
defaultIntegrations: false,
|
|
125
|
+
integrations: [],
|
|
126
|
+
beforeSend(event) {
|
|
127
|
+
return scrubEvent(event);
|
|
128
|
+
},
|
|
129
|
+
beforeBreadcrumb(breadcrumb) {
|
|
130
|
+
if (breadcrumb.message) breadcrumb.message = scrubString(breadcrumb.message);
|
|
131
|
+
return breadcrumb;
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
Sentry.setTag("cli_name", opts.cliName);
|
|
135
|
+
if (opts.release) Sentry.setTag("cli_version", opts.release);
|
|
136
|
+
initialized = true;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Captures an error (if telemetry is initialized) and flushes before the
|
|
140
|
+
* caller calls process.exit(). Safe no-op when telemetry is disabled.
|
|
141
|
+
*/
|
|
142
|
+
async function captureCliError(err) {
|
|
143
|
+
if (!initialized) return;
|
|
144
|
+
try {
|
|
145
|
+
const Sentry = await import("@sentry/node");
|
|
146
|
+
Sentry.captureException(err);
|
|
147
|
+
await Sentry.flush(2e3);
|
|
148
|
+
} catch {}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Explicitly set telemetry consent (used by `ph telemetry on|off`).
|
|
152
|
+
*/
|
|
153
|
+
function setTelemetryConsent(enabled) {
|
|
154
|
+
writeConfig({
|
|
155
|
+
enabled,
|
|
156
|
+
askedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Returns the current telemetry state — useful for `ph telemetry status`.
|
|
161
|
+
*/
|
|
162
|
+
function getTelemetryStatus() {
|
|
163
|
+
if (isExplicitlyDisabled()) return {
|
|
164
|
+
source: "env",
|
|
165
|
+
enabled: false
|
|
166
|
+
};
|
|
167
|
+
if (isExplicitlyEnabled()) return {
|
|
168
|
+
source: "env",
|
|
169
|
+
enabled: true
|
|
170
|
+
};
|
|
171
|
+
const cached = readConfig();
|
|
172
|
+
if (cached) return {
|
|
173
|
+
source: "config",
|
|
174
|
+
enabled: cached.enabled,
|
|
175
|
+
askedAt: cached.askedAt
|
|
176
|
+
};
|
|
177
|
+
return {
|
|
178
|
+
source: "default",
|
|
179
|
+
enabled: false
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
//#endregion
|
|
183
|
+
export { captureCliError, getTelemetryStatus, initCliTelemetry, resolveTelemetryConsent, setTelemetryConsent };
|
|
184
|
+
|
|
185
|
+
//# sourceMappingURL=telemetry.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.mjs","names":[],"sources":["../../../clis/services/telemetry.ts"],"sourcesContent":["/**\n * CLI telemetry (error reporting via Sentry).\n *\n * Design:\n * - Opt-out by default, asked once on first interactive run.\n * - Stores consent in ~/.ph/telemetry.json so we never ask twice.\n * - Respects PH_NO_TELEMETRY=1 and DO_NOT_TRACK=1 as immediate kill switches.\n * - Non-interactive (TTY missing, CI, piped) defaults to DISABLED — we don't\n * want to hang a CI pipeline on an unanswered prompt, and we don't want to\n * capture errors without informed consent.\n * - DSN is published in the CLI binary; Sentry DSNs accept events but grant\n * no read access, so this is safe. Hardcoded so users can't accidentally\n * misroute events.\n *\n * PII scrubbing in beforeSend hook:\n * - Home-directory paths collapsed to ~\n * - Flag/arg values that look like secrets (tokens, keys) stripped\n * - No source-context from user files\n */\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\n// Sentry project \"ph-cli\" on the powerhouse-hosted Sentry instance.\n// Public DSNs are safe to ship — they grant write-only ingest access.\nconst SENTRY_DSN =\n \"https://0e7793802288589b4923896118374462@sentry.monitoring.vetra.io/3\";\n\nconst TELEMETRY_FILE = join(homedir(), \".ph\", \"telemetry.json\");\n\ntype TelemetryConfig = {\n enabled: boolean;\n askedAt: string;\n};\n\nfunction isExplicitlyDisabled(): boolean {\n // Standard opt-out signals respected by most OSS CLIs.\n return (\n process.env.PH_NO_TELEMETRY === \"1\" ||\n process.env.PH_NO_TELEMETRY === \"true\" ||\n process.env.DO_NOT_TRACK === \"1\" ||\n process.env.DO_NOT_TRACK === \"true\"\n );\n}\n\nfunction isExplicitlyEnabled(): boolean {\n return (\n process.env.PH_TELEMETRY === \"1\" || process.env.PH_TELEMETRY === \"true\"\n );\n}\n\nfunction isInteractive(): boolean {\n // Only ask if stdin is a TTY and CI env isn't set.\n return Boolean(process.stdin.isTTY) && !process.env.CI;\n}\n\nfunction readConfig(): TelemetryConfig | null {\n try {\n if (!existsSync(TELEMETRY_FILE)) return null;\n return JSON.parse(readFileSync(TELEMETRY_FILE, \"utf8\")) as TelemetryConfig;\n } catch {\n return null;\n }\n}\n\nfunction writeConfig(cfg: TelemetryConfig): void {\n try {\n mkdirSync(join(homedir(), \".ph\"), { recursive: true });\n writeFileSync(TELEMETRY_FILE, JSON.stringify(cfg, null, 2));\n } catch {\n // non-fatal; we'll just ask again next time\n }\n}\n\n/**\n * Prompts the user once, caches the answer. Must be called before init.\n * Returns `true` if telemetry should be enabled, `false` otherwise.\n */\nexport async function resolveTelemetryConsent(): Promise<boolean> {\n if (isExplicitlyDisabled()) return false;\n if (isExplicitlyEnabled()) return true;\n\n const cached = readConfig();\n if (cached) return cached.enabled;\n\n if (!isInteractive()) {\n // Non-interactive first run: stay silent, don't ask, don't send. User can\n // opt in later with `ph telemetry on` or PH_TELEMETRY=1.\n return false;\n }\n\n const enquirer = await import(\"enquirer\");\n try {\n const { enabled } = await enquirer.default.prompt<{ enabled: boolean }>({\n type: \"confirm\",\n name: \"enabled\",\n message:\n \"Help improve Powerhouse by sending anonymous error reports? \" +\n \"(stack traces only, paths and secrets are scrubbed)\",\n initial: true,\n });\n writeConfig({ enabled, askedAt: new Date().toISOString() });\n return enabled;\n } catch {\n // user hit Ctrl-C during prompt — treat as no, but don't persist so we\n // ask again next time\n return false;\n }\n}\n\nfunction scrubString(input: string): string {\n if (!input) return input;\n const home = homedir();\n let out = input;\n // Collapse home dir to ~\n if (home && out.includes(home)) {\n out = out.split(home).join(\"~\");\n }\n // Strip common secret-shaped flag values: --token=XYZ, --api-key XYZ, etc.\n out = out.replace(\n /(--?(?:token|api[-_]?key|password|secret|auth)[=\\s])([^\\s]+)/gi,\n \"$1<redacted>\",\n );\n return out;\n}\n\ntype ScrubbableFrame = {\n filename?: string;\n abs_path?: string;\n pre_context?: unknown;\n context_line?: unknown;\n post_context?: unknown;\n vars?: unknown;\n};\n\ntype ScrubbableException = {\n value?: string;\n stacktrace?: { frames?: ScrubbableFrame[] };\n};\n\ntype ScrubbableEvent = {\n message?: string;\n logentry?: { message?: string };\n exception?: { values?: ScrubbableException[] };\n server_name?: string;\n extra?: Record<string, unknown>;\n};\n\nfunction scrubEvent<T>(event: T): T {\n const e = event as ScrubbableEvent;\n try {\n if (e.message) e.message = scrubString(e.message);\n if (e.logentry?.message) {\n e.logentry.message = scrubString(e.logentry.message);\n }\n const values = e.exception?.values;\n if (Array.isArray(values)) {\n for (const ex of values) {\n if (ex.value) ex.value = scrubString(ex.value);\n const frames = ex.stacktrace?.frames;\n if (Array.isArray(frames)) {\n for (const f of frames) {\n if (f.filename) f.filename = scrubString(f.filename);\n if (f.abs_path) f.abs_path = scrubString(f.abs_path);\n // Drop captured source context from user machines — privacy.\n delete f.pre_context;\n delete f.context_line;\n delete f.post_context;\n delete f.vars;\n }\n }\n }\n }\n // Server name can leak the user's machine hostname; drop it.\n delete e.server_name;\n // Strip raw argv from extra context.\n if (e.extra) {\n delete e.extra.argv;\n delete e.extra.env;\n }\n } catch {\n // Never let scrubbing throw — worst case we drop the event below.\n }\n return event;\n}\n\nlet initialized = false;\n\n/**\n * Initializes Sentry for CLI error reporting if telemetry is enabled.\n * Safe to call multiple times; only the first call takes effect.\n */\nexport async function initCliTelemetry(opts: {\n cliName: \"ph-cli\" | \"ph-cmd\";\n release?: string;\n}): Promise<void> {\n if (initialized) return;\n const enabled = await resolveTelemetryConsent();\n if (!enabled) return;\n\n const Sentry = await import(\"@sentry/node\");\n Sentry.init({\n dsn: SENTRY_DSN,\n release: opts.release,\n environment: process.env.NODE_ENV || \"production\",\n sendDefaultPii: false,\n defaultIntegrations: false,\n integrations: [\n // Only the bare minimum — no automatic HTTP/FS instrumentation.\n ],\n beforeSend(event) {\n return scrubEvent(event);\n },\n beforeBreadcrumb(breadcrumb) {\n if (breadcrumb.message) {\n breadcrumb.message = scrubString(breadcrumb.message);\n }\n return breadcrumb;\n },\n });\n Sentry.setTag(\"cli_name\", opts.cliName);\n if (opts.release) Sentry.setTag(\"cli_version\", opts.release);\n initialized = true;\n}\n\n/**\n * Captures an error (if telemetry is initialized) and flushes before the\n * caller calls process.exit(). Safe no-op when telemetry is disabled.\n */\nexport async function captureCliError(err: unknown): Promise<void> {\n if (!initialized) return;\n try {\n const Sentry = await import(\"@sentry/node\");\n Sentry.captureException(err);\n await Sentry.flush(2000);\n } catch {\n // Reporting must never mask the real error.\n }\n}\n\n/**\n * Explicitly set telemetry consent (used by `ph telemetry on|off`).\n */\nexport function setTelemetryConsent(enabled: boolean): void {\n writeConfig({ enabled, askedAt: new Date().toISOString() });\n}\n\n/**\n * Returns the current telemetry state — useful for `ph telemetry status`.\n */\nexport function getTelemetryStatus():\n | { source: \"env\"; enabled: boolean }\n | { source: \"config\"; enabled: boolean; askedAt: string }\n | { source: \"default\"; enabled: false } {\n if (isExplicitlyDisabled()) return { source: \"env\", enabled: false };\n if (isExplicitlyEnabled()) return { source: \"env\", enabled: true };\n const cached = readConfig();\n if (cached)\n return {\n source: \"config\",\n enabled: cached.enabled,\n askedAt: cached.askedAt,\n };\n return { source: \"default\", enabled: false };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//#region clis/utils.d.ts
|
|
2
|
+
declare class NodeVersionError extends Error {
|
|
3
|
+
constructor(currentVersion: string, minimumVersion: string);
|
|
4
|
+
static isError(error: unknown): error is NodeVersionError;
|
|
5
|
+
}
|
|
6
|
+
declare function assertNodeVersion(nodeVersion?: string): void;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { NodeVersionError, assertNodeVersion };
|
|
9
|
+
//# sourceMappingURL=utils.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.mts","names":[],"sources":["../../clis/utils.ts"],"mappings":";cAIa,gBAAA,SAAyB,KAAA;cACxB,cAAA,UAAwB,cAAA;EAAA,OAO7B,OAAA,CAAQ,KAAA,YAAiB,KAAA,IAAS,gBAAA;AAAA;AAAA,iBAK3B,iBAAA,CAAkB,WAAA"}
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
import { MINIMUM_NODE_VERSION } from "./constants.mjs";
|
|
2
|
+
//#region \0rolldown/runtime.js
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
12
|
+
key = keys[i];
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
14
|
+
get: ((k) => from[k]).bind(null, key),
|
|
15
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
21
|
+
value: mod,
|
|
22
|
+
enumerable: true
|
|
23
|
+
}) : target, mod));
|
|
24
|
+
//#endregion
|
|
25
|
+
//#region ../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/internal/debug.js
|
|
26
|
+
var require_debug = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
27
|
+
module.exports = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => {};
|
|
28
|
+
}));
|
|
29
|
+
//#endregion
|
|
30
|
+
//#region ../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/internal/constants.js
|
|
31
|
+
var require_constants = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
32
|
+
const SEMVER_SPEC_VERSION = "2.0.0";
|
|
33
|
+
const MAX_LENGTH = 256;
|
|
34
|
+
const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
|
|
35
|
+
module.exports = {
|
|
36
|
+
MAX_LENGTH,
|
|
37
|
+
MAX_SAFE_COMPONENT_LENGTH: 16,
|
|
38
|
+
MAX_SAFE_BUILD_LENGTH: MAX_LENGTH - 6,
|
|
39
|
+
MAX_SAFE_INTEGER,
|
|
40
|
+
RELEASE_TYPES: [
|
|
41
|
+
"major",
|
|
42
|
+
"premajor",
|
|
43
|
+
"minor",
|
|
44
|
+
"preminor",
|
|
45
|
+
"patch",
|
|
46
|
+
"prepatch",
|
|
47
|
+
"prerelease"
|
|
48
|
+
],
|
|
49
|
+
SEMVER_SPEC_VERSION,
|
|
50
|
+
FLAG_INCLUDE_PRERELEASE: 1,
|
|
51
|
+
FLAG_LOOSE: 2
|
|
52
|
+
};
|
|
53
|
+
}));
|
|
54
|
+
//#endregion
|
|
55
|
+
//#region ../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/internal/re.js
|
|
56
|
+
var require_re = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
57
|
+
const { MAX_SAFE_COMPONENT_LENGTH, MAX_SAFE_BUILD_LENGTH, MAX_LENGTH } = require_constants();
|
|
58
|
+
const debug = require_debug();
|
|
59
|
+
exports = module.exports = {};
|
|
60
|
+
const re = exports.re = [];
|
|
61
|
+
const safeRe = exports.safeRe = [];
|
|
62
|
+
const src = exports.src = [];
|
|
63
|
+
const safeSrc = exports.safeSrc = [];
|
|
64
|
+
const t = exports.t = {};
|
|
65
|
+
let R = 0;
|
|
66
|
+
const LETTERDASHNUMBER = "[a-zA-Z0-9-]";
|
|
67
|
+
const safeRegexReplacements = [
|
|
68
|
+
["\\s", 1],
|
|
69
|
+
["\\d", MAX_LENGTH],
|
|
70
|
+
[LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH]
|
|
71
|
+
];
|
|
72
|
+
const makeSafeRegex = (value) => {
|
|
73
|
+
for (const [token, max] of safeRegexReplacements) value = value.split(`${token}*`).join(`${token}{0,${max}}`).split(`${token}+`).join(`${token}{1,${max}}`);
|
|
74
|
+
return value;
|
|
75
|
+
};
|
|
76
|
+
const createToken = (name, value, isGlobal) => {
|
|
77
|
+
const safe = makeSafeRegex(value);
|
|
78
|
+
const index = R++;
|
|
79
|
+
debug(name, index, value);
|
|
80
|
+
t[name] = index;
|
|
81
|
+
src[index] = value;
|
|
82
|
+
safeSrc[index] = safe;
|
|
83
|
+
re[index] = new RegExp(value, isGlobal ? "g" : void 0);
|
|
84
|
+
safeRe[index] = new RegExp(safe, isGlobal ? "g" : void 0);
|
|
85
|
+
};
|
|
86
|
+
createToken("NUMERICIDENTIFIER", "0|[1-9]\\d*");
|
|
87
|
+
createToken("NUMERICIDENTIFIERLOOSE", "\\d+");
|
|
88
|
+
createToken("NONNUMERICIDENTIFIER", `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);
|
|
89
|
+
createToken("MAINVERSION", `(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})`);
|
|
90
|
+
createToken("MAINVERSIONLOOSE", `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})`);
|
|
91
|
+
createToken("PRERELEASEIDENTIFIER", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIER]})`);
|
|
92
|
+
createToken("PRERELEASEIDENTIFIERLOOSE", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIERLOOSE]})`);
|
|
93
|
+
createToken("PRERELEASE", `(?:-(${src[t.PRERELEASEIDENTIFIER]}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`);
|
|
94
|
+
createToken("PRERELEASELOOSE", `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`);
|
|
95
|
+
createToken("BUILDIDENTIFIER", `${LETTERDASHNUMBER}+`);
|
|
96
|
+
createToken("BUILD", `(?:\\+(${src[t.BUILDIDENTIFIER]}(?:\\.${src[t.BUILDIDENTIFIER]})*))`);
|
|
97
|
+
createToken("FULLPLAIN", `v?${src[t.MAINVERSION]}${src[t.PRERELEASE]}?${src[t.BUILD]}?`);
|
|
98
|
+
createToken("FULL", `^${src[t.FULLPLAIN]}$`);
|
|
99
|
+
createToken("LOOSEPLAIN", `[v=\\s]*${src[t.MAINVERSIONLOOSE]}${src[t.PRERELEASELOOSE]}?${src[t.BUILD]}?`);
|
|
100
|
+
createToken("LOOSE", `^${src[t.LOOSEPLAIN]}$`);
|
|
101
|
+
createToken("GTLT", "((?:<|>)?=?)");
|
|
102
|
+
createToken("XRANGEIDENTIFIERLOOSE", `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);
|
|
103
|
+
createToken("XRANGEIDENTIFIER", `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`);
|
|
104
|
+
createToken("XRANGEPLAIN", `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:${src[t.PRERELEASE]})?${src[t.BUILD]}?)?)?`);
|
|
105
|
+
createToken("XRANGEPLAINLOOSE", `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:${src[t.PRERELEASELOOSE]})?${src[t.BUILD]}?)?)?`);
|
|
106
|
+
createToken("XRANGE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`);
|
|
107
|
+
createToken("XRANGELOOSE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`);
|
|
108
|
+
createToken("COERCEPLAIN", `(^|[^\\d])(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}})(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`);
|
|
109
|
+
createToken("COERCE", `${src[t.COERCEPLAIN]}(?:$|[^\\d])`);
|
|
110
|
+
createToken("COERCEFULL", src[t.COERCEPLAIN] + `(?:${src[t.PRERELEASE]})?(?:${src[t.BUILD]})?(?:$|[^\\d])`);
|
|
111
|
+
createToken("COERCERTL", src[t.COERCE], true);
|
|
112
|
+
createToken("COERCERTLFULL", src[t.COERCEFULL], true);
|
|
113
|
+
createToken("LONETILDE", "(?:~>?)");
|
|
114
|
+
createToken("TILDETRIM", `(\\s*)${src[t.LONETILDE]}\\s+`, true);
|
|
115
|
+
exports.tildeTrimReplace = "$1~";
|
|
116
|
+
createToken("TILDE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);
|
|
117
|
+
createToken("TILDELOOSE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);
|
|
118
|
+
createToken("LONECARET", "(?:\\^)");
|
|
119
|
+
createToken("CARETTRIM", `(\\s*)${src[t.LONECARET]}\\s+`, true);
|
|
120
|
+
exports.caretTrimReplace = "$1^";
|
|
121
|
+
createToken("CARET", `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);
|
|
122
|
+
createToken("CARETLOOSE", `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);
|
|
123
|
+
createToken("COMPARATORLOOSE", `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);
|
|
124
|
+
createToken("COMPARATOR", `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);
|
|
125
|
+
createToken("COMPARATORTRIM", `(\\s*)${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true);
|
|
126
|
+
exports.comparatorTrimReplace = "$1$2$3";
|
|
127
|
+
createToken("HYPHENRANGE", `^\\s*(${src[t.XRANGEPLAIN]})\\s+-\\s+(${src[t.XRANGEPLAIN]})\\s*$`);
|
|
128
|
+
createToken("HYPHENRANGELOOSE", `^\\s*(${src[t.XRANGEPLAINLOOSE]})\\s+-\\s+(${src[t.XRANGEPLAINLOOSE]})\\s*$`);
|
|
129
|
+
createToken("STAR", "(<|>)?=?\\s*\\*");
|
|
130
|
+
createToken("GTE0", "^\\s*>=\\s*0\\.0\\.0\\s*$");
|
|
131
|
+
createToken("GTE0PRE", "^\\s*>=\\s*0\\.0\\.0-0\\s*$");
|
|
132
|
+
}));
|
|
133
|
+
//#endregion
|
|
134
|
+
//#region ../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/internal/parse-options.js
|
|
135
|
+
var require_parse_options = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
136
|
+
const looseOption = Object.freeze({ loose: true });
|
|
137
|
+
const emptyOpts = Object.freeze({});
|
|
138
|
+
const parseOptions = (options) => {
|
|
139
|
+
if (!options) return emptyOpts;
|
|
140
|
+
if (typeof options !== "object") return looseOption;
|
|
141
|
+
return options;
|
|
142
|
+
};
|
|
143
|
+
module.exports = parseOptions;
|
|
144
|
+
}));
|
|
145
|
+
//#endregion
|
|
146
|
+
//#region ../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/internal/identifiers.js
|
|
147
|
+
var require_identifiers = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
148
|
+
const numeric = /^[0-9]+$/;
|
|
149
|
+
const compareIdentifiers = (a, b) => {
|
|
150
|
+
if (typeof a === "number" && typeof b === "number") return a === b ? 0 : a < b ? -1 : 1;
|
|
151
|
+
const anum = numeric.test(a);
|
|
152
|
+
const bnum = numeric.test(b);
|
|
153
|
+
if (anum && bnum) {
|
|
154
|
+
a = +a;
|
|
155
|
+
b = +b;
|
|
156
|
+
}
|
|
157
|
+
return a === b ? 0 : anum && !bnum ? -1 : bnum && !anum ? 1 : a < b ? -1 : 1;
|
|
158
|
+
};
|
|
159
|
+
const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a);
|
|
160
|
+
module.exports = {
|
|
161
|
+
compareIdentifiers,
|
|
162
|
+
rcompareIdentifiers
|
|
163
|
+
};
|
|
164
|
+
}));
|
|
165
|
+
//#endregion
|
|
166
|
+
//#region ../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/classes/semver.js
|
|
167
|
+
var require_semver = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
168
|
+
const debug = require_debug();
|
|
169
|
+
const { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants();
|
|
170
|
+
const { safeRe: re, t } = require_re();
|
|
171
|
+
const parseOptions = require_parse_options();
|
|
172
|
+
const { compareIdentifiers } = require_identifiers();
|
|
173
|
+
module.exports = class SemVer {
|
|
174
|
+
constructor(version, options) {
|
|
175
|
+
options = parseOptions(options);
|
|
176
|
+
if (version instanceof SemVer) if (version.loose === !!options.loose && version.includePrerelease === !!options.includePrerelease) return version;
|
|
177
|
+
else version = version.version;
|
|
178
|
+
else if (typeof version !== "string") throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`);
|
|
179
|
+
if (version.length > MAX_LENGTH) throw new TypeError(`version is longer than ${MAX_LENGTH} characters`);
|
|
180
|
+
debug("SemVer", version, options);
|
|
181
|
+
this.options = options;
|
|
182
|
+
this.loose = !!options.loose;
|
|
183
|
+
this.includePrerelease = !!options.includePrerelease;
|
|
184
|
+
const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]);
|
|
185
|
+
if (!m) throw new TypeError(`Invalid Version: ${version}`);
|
|
186
|
+
this.raw = version;
|
|
187
|
+
this.major = +m[1];
|
|
188
|
+
this.minor = +m[2];
|
|
189
|
+
this.patch = +m[3];
|
|
190
|
+
if (this.major > MAX_SAFE_INTEGER || this.major < 0) throw new TypeError("Invalid major version");
|
|
191
|
+
if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) throw new TypeError("Invalid minor version");
|
|
192
|
+
if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) throw new TypeError("Invalid patch version");
|
|
193
|
+
if (!m[4]) this.prerelease = [];
|
|
194
|
+
else this.prerelease = m[4].split(".").map((id) => {
|
|
195
|
+
if (/^[0-9]+$/.test(id)) {
|
|
196
|
+
const num = +id;
|
|
197
|
+
if (num >= 0 && num < MAX_SAFE_INTEGER) return num;
|
|
198
|
+
}
|
|
199
|
+
return id;
|
|
200
|
+
});
|
|
201
|
+
this.build = m[5] ? m[5].split(".") : [];
|
|
202
|
+
this.format();
|
|
203
|
+
}
|
|
204
|
+
format() {
|
|
205
|
+
this.version = `${this.major}.${this.minor}.${this.patch}`;
|
|
206
|
+
if (this.prerelease.length) this.version += `-${this.prerelease.join(".")}`;
|
|
207
|
+
return this.version;
|
|
208
|
+
}
|
|
209
|
+
toString() {
|
|
210
|
+
return this.version;
|
|
211
|
+
}
|
|
212
|
+
compare(other) {
|
|
213
|
+
debug("SemVer.compare", this.version, this.options, other);
|
|
214
|
+
if (!(other instanceof SemVer)) {
|
|
215
|
+
if (typeof other === "string" && other === this.version) return 0;
|
|
216
|
+
other = new SemVer(other, this.options);
|
|
217
|
+
}
|
|
218
|
+
if (other.version === this.version) return 0;
|
|
219
|
+
return this.compareMain(other) || this.comparePre(other);
|
|
220
|
+
}
|
|
221
|
+
compareMain(other) {
|
|
222
|
+
if (!(other instanceof SemVer)) other = new SemVer(other, this.options);
|
|
223
|
+
if (this.major < other.major) return -1;
|
|
224
|
+
if (this.major > other.major) return 1;
|
|
225
|
+
if (this.minor < other.minor) return -1;
|
|
226
|
+
if (this.minor > other.minor) return 1;
|
|
227
|
+
if (this.patch < other.patch) return -1;
|
|
228
|
+
if (this.patch > other.patch) return 1;
|
|
229
|
+
return 0;
|
|
230
|
+
}
|
|
231
|
+
comparePre(other) {
|
|
232
|
+
if (!(other instanceof SemVer)) other = new SemVer(other, this.options);
|
|
233
|
+
if (this.prerelease.length && !other.prerelease.length) return -1;
|
|
234
|
+
else if (!this.prerelease.length && other.prerelease.length) return 1;
|
|
235
|
+
else if (!this.prerelease.length && !other.prerelease.length) return 0;
|
|
236
|
+
let i = 0;
|
|
237
|
+
do {
|
|
238
|
+
const a = this.prerelease[i];
|
|
239
|
+
const b = other.prerelease[i];
|
|
240
|
+
debug("prerelease compare", i, a, b);
|
|
241
|
+
if (a === void 0 && b === void 0) return 0;
|
|
242
|
+
else if (b === void 0) return 1;
|
|
243
|
+
else if (a === void 0) return -1;
|
|
244
|
+
else if (a === b) continue;
|
|
245
|
+
else return compareIdentifiers(a, b);
|
|
246
|
+
} while (++i);
|
|
247
|
+
}
|
|
248
|
+
compareBuild(other) {
|
|
249
|
+
if (!(other instanceof SemVer)) other = new SemVer(other, this.options);
|
|
250
|
+
let i = 0;
|
|
251
|
+
do {
|
|
252
|
+
const a = this.build[i];
|
|
253
|
+
const b = other.build[i];
|
|
254
|
+
debug("build compare", i, a, b);
|
|
255
|
+
if (a === void 0 && b === void 0) return 0;
|
|
256
|
+
else if (b === void 0) return 1;
|
|
257
|
+
else if (a === void 0) return -1;
|
|
258
|
+
else if (a === b) continue;
|
|
259
|
+
else return compareIdentifiers(a, b);
|
|
260
|
+
} while (++i);
|
|
261
|
+
}
|
|
262
|
+
inc(release, identifier, identifierBase) {
|
|
263
|
+
if (release.startsWith("pre")) {
|
|
264
|
+
if (!identifier && identifierBase === false) throw new Error("invalid increment argument: identifier is empty");
|
|
265
|
+
if (identifier) {
|
|
266
|
+
const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE]);
|
|
267
|
+
if (!match || match[1] !== identifier) throw new Error(`invalid identifier: ${identifier}`);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
switch (release) {
|
|
271
|
+
case "premajor":
|
|
272
|
+
this.prerelease.length = 0;
|
|
273
|
+
this.patch = 0;
|
|
274
|
+
this.minor = 0;
|
|
275
|
+
this.major++;
|
|
276
|
+
this.inc("pre", identifier, identifierBase);
|
|
277
|
+
break;
|
|
278
|
+
case "preminor":
|
|
279
|
+
this.prerelease.length = 0;
|
|
280
|
+
this.patch = 0;
|
|
281
|
+
this.minor++;
|
|
282
|
+
this.inc("pre", identifier, identifierBase);
|
|
283
|
+
break;
|
|
284
|
+
case "prepatch":
|
|
285
|
+
this.prerelease.length = 0;
|
|
286
|
+
this.inc("patch", identifier, identifierBase);
|
|
287
|
+
this.inc("pre", identifier, identifierBase);
|
|
288
|
+
break;
|
|
289
|
+
case "prerelease":
|
|
290
|
+
if (this.prerelease.length === 0) this.inc("patch", identifier, identifierBase);
|
|
291
|
+
this.inc("pre", identifier, identifierBase);
|
|
292
|
+
break;
|
|
293
|
+
case "release":
|
|
294
|
+
if (this.prerelease.length === 0) throw new Error(`version ${this.raw} is not a prerelease`);
|
|
295
|
+
this.prerelease.length = 0;
|
|
296
|
+
break;
|
|
297
|
+
case "major":
|
|
298
|
+
if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) this.major++;
|
|
299
|
+
this.minor = 0;
|
|
300
|
+
this.patch = 0;
|
|
301
|
+
this.prerelease = [];
|
|
302
|
+
break;
|
|
303
|
+
case "minor":
|
|
304
|
+
if (this.patch !== 0 || this.prerelease.length === 0) this.minor++;
|
|
305
|
+
this.patch = 0;
|
|
306
|
+
this.prerelease = [];
|
|
307
|
+
break;
|
|
308
|
+
case "patch":
|
|
309
|
+
if (this.prerelease.length === 0) this.patch++;
|
|
310
|
+
this.prerelease = [];
|
|
311
|
+
break;
|
|
312
|
+
case "pre": {
|
|
313
|
+
const base = Number(identifierBase) ? 1 : 0;
|
|
314
|
+
if (this.prerelease.length === 0) this.prerelease = [base];
|
|
315
|
+
else {
|
|
316
|
+
let i = this.prerelease.length;
|
|
317
|
+
while (--i >= 0) if (typeof this.prerelease[i] === "number") {
|
|
318
|
+
this.prerelease[i]++;
|
|
319
|
+
i = -2;
|
|
320
|
+
}
|
|
321
|
+
if (i === -1) {
|
|
322
|
+
if (identifier === this.prerelease.join(".") && identifierBase === false) throw new Error("invalid increment argument: identifier already exists");
|
|
323
|
+
this.prerelease.push(base);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
if (identifier) {
|
|
327
|
+
let prerelease = [identifier, base];
|
|
328
|
+
if (identifierBase === false) prerelease = [identifier];
|
|
329
|
+
if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
|
|
330
|
+
if (isNaN(this.prerelease[1])) this.prerelease = prerelease;
|
|
331
|
+
} else this.prerelease = prerelease;
|
|
332
|
+
}
|
|
333
|
+
break;
|
|
334
|
+
}
|
|
335
|
+
default: throw new Error(`invalid increment argument: ${release}`);
|
|
336
|
+
}
|
|
337
|
+
this.raw = this.format();
|
|
338
|
+
if (this.build.length) this.raw += `+${this.build.join(".")}`;
|
|
339
|
+
return this;
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
}));
|
|
343
|
+
//#endregion
|
|
344
|
+
//#region ../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/compare.js
|
|
345
|
+
var require_compare = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
346
|
+
const SemVer = require_semver();
|
|
347
|
+
const compare = (a, b, loose) => new SemVer(a, loose).compare(new SemVer(b, loose));
|
|
348
|
+
module.exports = compare;
|
|
349
|
+
}));
|
|
350
|
+
//#endregion
|
|
351
|
+
//#region clis/utils.ts
|
|
352
|
+
var import_lt = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
353
|
+
const compare = require_compare();
|
|
354
|
+
const lt = (a, b, loose) => compare(a, b, loose) < 0;
|
|
355
|
+
module.exports = lt;
|
|
356
|
+
})))(), 1);
|
|
357
|
+
var NodeVersionError = class extends Error {
|
|
358
|
+
constructor(currentVersion, minimumVersion) {
|
|
359
|
+
super(`Node version ${minimumVersion} or higher is required. Current version: ${currentVersion}`);
|
|
360
|
+
this.name = "NodeVersionError";
|
|
361
|
+
}
|
|
362
|
+
static isError(error) {
|
|
363
|
+
return error instanceof Error && error.name === "NodeVersionError";
|
|
364
|
+
}
|
|
365
|
+
};
|
|
366
|
+
function assertNodeVersion(nodeVersion = process.versions.node) {
|
|
367
|
+
if (!nodeVersion) return;
|
|
368
|
+
if ((0, import_lt.default)(nodeVersion, "24.0.0")) throw new NodeVersionError(nodeVersion, MINIMUM_NODE_VERSION);
|
|
369
|
+
}
|
|
370
|
+
//#endregion
|
|
371
|
+
export { NodeVersionError, assertNodeVersion };
|
|
372
|
+
|
|
373
|
+
//# sourceMappingURL=utils.mjs.map
|