@boneskull/bargs 0.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/LICENSE +55 -0
- package/README.md +483 -0
- package/dist/bargs.cjs +167 -0
- package/dist/bargs.cjs.map +1 -0
- package/dist/bargs.d.cts +31 -0
- package/dist/bargs.d.cts.map +1 -0
- package/dist/bargs.d.ts +31 -0
- package/dist/bargs.d.ts.map +1 -0
- package/dist/bargs.js +163 -0
- package/dist/bargs.js.map +1 -0
- package/dist/errors.cjs +57 -0
- package/dist/errors.cjs.map +1 -0
- package/dist/errors.d.cts +40 -0
- package/dist/errors.d.cts.map +1 -0
- package/dist/errors.d.ts +40 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +51 -0
- package/dist/errors.js.map +1 -0
- package/dist/help.cjs +309 -0
- package/dist/help.cjs.map +1 -0
- package/dist/help.d.cts +21 -0
- package/dist/help.d.cts.map +1 -0
- package/dist/help.d.ts +21 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +304 -0
- package/dist/help.js.map +1 -0
- package/dist/index.cjs +63 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +96 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +96 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/opt.cjs +205 -0
- package/dist/opt.cjs.map +1 -0
- package/dist/opt.d.cts +145 -0
- package/dist/opt.d.cts.map +1 -0
- package/dist/opt.d.ts +145 -0
- package/dist/opt.d.ts.map +1 -0
- package/dist/opt.js +202 -0
- package/dist/opt.js.map +1 -0
- package/dist/osc.cjs +190 -0
- package/dist/osc.cjs.map +1 -0
- package/dist/osc.d.cts +30 -0
- package/dist/osc.d.cts.map +1 -0
- package/dist/osc.d.ts +30 -0
- package/dist/osc.d.ts.map +1 -0
- package/dist/osc.js +181 -0
- package/dist/osc.js.map +1 -0
- package/dist/parser.cjs +293 -0
- package/dist/parser.cjs.map +1 -0
- package/dist/parser.d.cts +47 -0
- package/dist/parser.d.cts.map +1 -0
- package/dist/parser.d.ts +47 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +285 -0
- package/dist/parser.js.map +1 -0
- package/dist/theme.cjs +203 -0
- package/dist/theme.cjs.map +1 -0
- package/dist/theme.d.cts +227 -0
- package/dist/theme.d.cts.map +1 -0
- package/dist/theme.d.ts +227 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +198 -0
- package/dist/theme.js.map +1 -0
- package/dist/types.cjs +18 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +244 -0
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.ts +244 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +17 -0
- package/dist/types.js.map +1 -0
- package/dist/validate.cjs +452 -0
- package/dist/validate.cjs.map +1 -0
- package/dist/validate.d.cts +28 -0
- package/dist/validate.d.cts.map +1 -0
- package/dist/validate.d.ts +28 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +448 -0
- package/dist/validate.js.map +1 -0
- package/dist/version.cjs +134 -0
- package/dist/version.cjs.map +1 -0
- package/dist/version.d.cts +27 -0
- package/dist/version.d.cts.map +1 -0
- package/dist/version.d.ts +27 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +129 -0
- package/dist/version.js.map +1 -0
- package/package.json +149 -0
package/dist/opt.js
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builder functions for defining CLI options, positionals, and commands.
|
|
3
|
+
*
|
|
4
|
+
* Provides ergonomic helpers with full TypeScript type inference for
|
|
5
|
+
* constructing option schemas (`opt.string()`, `opt.boolean()`, `opt.enum()`,
|
|
6
|
+
* etc.), positional schemas (`opt.stringPos()`, `opt.numberPos()`,
|
|
7
|
+
* `opt.variadic()`), and command definitions (`opt.command()`). Includes
|
|
8
|
+
* composition utilities for merging schemas (`opt.options()`,
|
|
9
|
+
* `opt.positionals()`).
|
|
10
|
+
*
|
|
11
|
+
* @packageDocumentation
|
|
12
|
+
*/
|
|
13
|
+
import { BargsError } from "./errors.js";
|
|
14
|
+
/**
|
|
15
|
+
* Validate that no alias conflicts exist in a merged options schema. Throws
|
|
16
|
+
* BargsError if the same alias is used by multiple options.
|
|
17
|
+
*/
|
|
18
|
+
const validateAliasConflicts = (schema) => {
|
|
19
|
+
const aliasToOption = new Map();
|
|
20
|
+
for (const [optionName, def] of Object.entries(schema)) {
|
|
21
|
+
if (!def.aliases) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
for (const alias of def.aliases) {
|
|
25
|
+
const existing = aliasToOption.get(alias);
|
|
26
|
+
if (existing && existing !== optionName) {
|
|
27
|
+
throw new BargsError(`Alias conflict: "-${alias}" is used by both "--${existing}" and "--${optionName}"`);
|
|
28
|
+
}
|
|
29
|
+
aliasToOption.set(alias, optionName);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Compose multiple option schemas into one.
|
|
35
|
+
*/
|
|
36
|
+
const optionsImpl = (...schemas) => {
|
|
37
|
+
const merged = Object.assign({}, ...schemas);
|
|
38
|
+
validateAliasConflicts(merged);
|
|
39
|
+
return merged;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Create a positionals schema from positional definitions.
|
|
43
|
+
*/
|
|
44
|
+
const positionalsImpl = (...positionals) => positionals;
|
|
45
|
+
/**
|
|
46
|
+
* Namespaced option builders.
|
|
47
|
+
*
|
|
48
|
+
* Provides ergonomic helpers for defining CLI options, positionals, and
|
|
49
|
+
* commands with full TypeScript type inference.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
*
|
|
53
|
+
* ```typescript
|
|
54
|
+
* import { opt } from 'bargs';
|
|
55
|
+
*
|
|
56
|
+
* const options = opt.options({
|
|
57
|
+
* verbose: opt.boolean({ aliases: ['v'] }),
|
|
58
|
+
* name: opt.string({ default: 'world' }),
|
|
59
|
+
* level: opt.enum(['low', 'medium', 'high'] as const),
|
|
60
|
+
* });
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export const opt = {
|
|
64
|
+
// ─── Option Builders ───────────────────────────────────────────────
|
|
65
|
+
/**
|
|
66
|
+
* Define an array option (--flag value --flag value2).
|
|
67
|
+
*/
|
|
68
|
+
array: (items, props = {}) => ({
|
|
69
|
+
items,
|
|
70
|
+
type: 'array',
|
|
71
|
+
...props,
|
|
72
|
+
}),
|
|
73
|
+
/**
|
|
74
|
+
* Define a boolean option. Props type is preserved to enable default
|
|
75
|
+
* inference.
|
|
76
|
+
*/
|
|
77
|
+
boolean: (props = {}) => ({
|
|
78
|
+
type: 'boolean',
|
|
79
|
+
...props,
|
|
80
|
+
}),
|
|
81
|
+
/**
|
|
82
|
+
* Define a command with proper type inference.
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
*
|
|
86
|
+
* ```typescript
|
|
87
|
+
* const greetCmd = opt.command({
|
|
88
|
+
* description: 'Greet someone',
|
|
89
|
+
* options: opt.options({
|
|
90
|
+
* name: opt.string({ default: 'world' }),
|
|
91
|
+
* }),
|
|
92
|
+
* handler: ({ values }) => {
|
|
93
|
+
* console.log(`Hello, ${values.name}!`);
|
|
94
|
+
* },
|
|
95
|
+
* });
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
command: (config) => config,
|
|
99
|
+
/**
|
|
100
|
+
* Define a count option (--verbose --verbose = 2).
|
|
101
|
+
*/
|
|
102
|
+
count: (props = {}) => ({
|
|
103
|
+
type: 'count',
|
|
104
|
+
...props,
|
|
105
|
+
}),
|
|
106
|
+
/**
|
|
107
|
+
* Define an enum option with string choices. The choices array is inferred as
|
|
108
|
+
* a tuple of literal types automatically. Props type is preserved to enable
|
|
109
|
+
* default inference.
|
|
110
|
+
*/
|
|
111
|
+
enum: (choices, props = {}) => ({
|
|
112
|
+
choices,
|
|
113
|
+
type: 'enum',
|
|
114
|
+
...props,
|
|
115
|
+
}),
|
|
116
|
+
/**
|
|
117
|
+
* Define an enum positional argument with string choices. The choices array
|
|
118
|
+
* is inferred as a tuple of literal types automatically.
|
|
119
|
+
*/
|
|
120
|
+
enumPos: (choices, props = {}) => ({
|
|
121
|
+
choices,
|
|
122
|
+
type: 'enum',
|
|
123
|
+
...props,
|
|
124
|
+
}),
|
|
125
|
+
/**
|
|
126
|
+
* Define a number option. Props type is preserved to enable default
|
|
127
|
+
* inference.
|
|
128
|
+
*/
|
|
129
|
+
number: (props = {}) => ({
|
|
130
|
+
type: 'number',
|
|
131
|
+
...props,
|
|
132
|
+
}),
|
|
133
|
+
// ─── Positional Builders ───────────────────────────────────────────
|
|
134
|
+
/**
|
|
135
|
+
* Define a number positional argument.
|
|
136
|
+
*/
|
|
137
|
+
numberPos: (props = {}) => ({
|
|
138
|
+
type: 'number',
|
|
139
|
+
...props,
|
|
140
|
+
}),
|
|
141
|
+
/**
|
|
142
|
+
* Compose multiple option schemas into one. Later schemas override earlier
|
|
143
|
+
* ones for duplicate option names. Validates that no alias conflicts exist.
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
*
|
|
147
|
+
* ```typescript
|
|
148
|
+
* // Single schema (identity, enables reuse)
|
|
149
|
+
* const loggingOpts = opt.options({
|
|
150
|
+
* verbose: opt.boolean({ aliases: ['v'] }),
|
|
151
|
+
* quiet: opt.boolean({ aliases: ['q'] }),
|
|
152
|
+
* });
|
|
153
|
+
*
|
|
154
|
+
* // Merge multiple schemas
|
|
155
|
+
* const allOpts = opt.options(loggingOpts, ioOpts, {
|
|
156
|
+
* format: opt.enum(['json', 'yaml'] as const),
|
|
157
|
+
* });
|
|
158
|
+
* ```
|
|
159
|
+
*
|
|
160
|
+
* @throws BargsError if multiple options use the same alias
|
|
161
|
+
*/
|
|
162
|
+
options: optionsImpl,
|
|
163
|
+
/**
|
|
164
|
+
* Create a positionals schema with proper tuple type inference.
|
|
165
|
+
*
|
|
166
|
+
* @example
|
|
167
|
+
*
|
|
168
|
+
* ```typescript
|
|
169
|
+
* const positionals = opt.positionals(
|
|
170
|
+
* opt.stringPos({ description: 'Input file', required: true }),
|
|
171
|
+
* opt.stringPos({ description: 'Output file' }),
|
|
172
|
+
* );
|
|
173
|
+
* ```
|
|
174
|
+
*/
|
|
175
|
+
positionals: positionalsImpl,
|
|
176
|
+
/**
|
|
177
|
+
* Define a string option. Props type is preserved to enable default
|
|
178
|
+
* inference.
|
|
179
|
+
*/
|
|
180
|
+
string: (props = {}) => ({
|
|
181
|
+
type: 'string',
|
|
182
|
+
...props,
|
|
183
|
+
}),
|
|
184
|
+
// ─── Composition ───────────────────────────────────────────────────
|
|
185
|
+
/**
|
|
186
|
+
* Define a string positional argument.
|
|
187
|
+
*/
|
|
188
|
+
stringPos: (props = {}) => ({
|
|
189
|
+
type: 'string',
|
|
190
|
+
...props,
|
|
191
|
+
}),
|
|
192
|
+
// ─── Command Builder ───────────────────────────────────────────────
|
|
193
|
+
/**
|
|
194
|
+
* Define a variadic positional (rest args).
|
|
195
|
+
*/
|
|
196
|
+
variadic: (items, props = {}) => ({
|
|
197
|
+
items,
|
|
198
|
+
type: 'variadic',
|
|
199
|
+
...props,
|
|
200
|
+
}),
|
|
201
|
+
};
|
|
202
|
+
//# sourceMappingURL=opt.js.map
|
package/dist/opt.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opt.js","sourceRoot":"","sources":["../src/opt.ts"],"names":[],"mappings":"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"}
|
package/dist/osc.cjs
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OSC (Operating System Command) escape sequences for terminal features.
|
|
4
|
+
*
|
|
5
|
+
* Provides utilities for creating clickable hyperlinks in terminal output using
|
|
6
|
+
* OSC 8 sequences, detecting terminal hyperlink support across various terminal
|
|
7
|
+
* emulators, and auto-linkifying URLs in text.
|
|
8
|
+
*
|
|
9
|
+
* The hyperlink detection logic is adapted from supports-hyperlinks by Sindre
|
|
10
|
+
* Sorhus, used under the MIT License.
|
|
11
|
+
*
|
|
12
|
+
* @license MIT (supports-hyperlinks portions)
|
|
13
|
+
* @packageDocumentation
|
|
14
|
+
* @see {@link https://github.com/chalk/supports-hyperlinks}
|
|
15
|
+
*/
|
|
16
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.linkifyUrls = exports.link = exports.supportsHyperlinks = void 0;
|
|
21
|
+
const node_process_1 = __importDefault(require("node:process"));
|
|
22
|
+
/**
|
|
23
|
+
* OSC escape sequence start.
|
|
24
|
+
*/
|
|
25
|
+
const OSC = '\x1b]';
|
|
26
|
+
/**
|
|
27
|
+
* Bell character - terminates OSC sequence.
|
|
28
|
+
*/
|
|
29
|
+
const BEL = '\x07';
|
|
30
|
+
/**
|
|
31
|
+
* Separator for OSC parameters.
|
|
32
|
+
*/
|
|
33
|
+
const SEP = ';';
|
|
34
|
+
/**
|
|
35
|
+
* Check if running inside tmux.
|
|
36
|
+
*/
|
|
37
|
+
const isTmux = () => 'TMUX' in node_process_1.default.env;
|
|
38
|
+
/**
|
|
39
|
+
* Wrap an OSC sequence for tmux compatibility. Tmux requires OSC sequences to
|
|
40
|
+
* be wrapped with DCS tmux; <sequence> ST and all ESCs in <sequence> to be
|
|
41
|
+
* replaced with ESC ESC.
|
|
42
|
+
*/
|
|
43
|
+
const wrapOsc = (sequence) => {
|
|
44
|
+
if (isTmux()) {
|
|
45
|
+
return '\x1BPtmux;' + sequence.replaceAll('\x1B', '\x1B\x1B') + '\x1B\\';
|
|
46
|
+
}
|
|
47
|
+
return sequence;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Parse a version string into major/minor/patch components. Handles both dotted
|
|
51
|
+
* versions (1.72.0) and compact versions (4601 -> 46.1.0).
|
|
52
|
+
*/
|
|
53
|
+
const parseVersion = (versionString = '') => {
|
|
54
|
+
// Handle compact version format (e.g., 4601 => 46.1.0)
|
|
55
|
+
if (/^\d{3,4}$/.test(versionString)) {
|
|
56
|
+
const match = /(\d{1,2})(\d{2})/.exec(versionString) ?? [];
|
|
57
|
+
return {
|
|
58
|
+
major: 0,
|
|
59
|
+
minor: Number.parseInt(match[1] ?? '0', 10),
|
|
60
|
+
patch: Number.parseInt(match[2] ?? '0', 10),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const versions = (versionString ?? '')
|
|
64
|
+
.split('.')
|
|
65
|
+
.map((n) => Number.parseInt(n, 10));
|
|
66
|
+
return {
|
|
67
|
+
major: versions[0] ?? 0,
|
|
68
|
+
minor: versions[1] ?? 0,
|
|
69
|
+
patch: versions[2] ?? 0,
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Detect if the terminal supports hyperlinks (OSC 8). Based on the logic from
|
|
74
|
+
* supports-hyperlinks package but implemented inline without dependencies.
|
|
75
|
+
*/
|
|
76
|
+
const supportsHyperlinks = (stream = node_process_1.default.stdout) => {
|
|
77
|
+
const { CI, CURSOR_TRACE_ID, FORCE_HYPERLINK, NETLIFY, TEAMCITY_VERSION, TERM, TERM_PROGRAM, TERM_PROGRAM_VERSION, VTE_VERSION, } = node_process_1.default.env;
|
|
78
|
+
// Explicit force flag
|
|
79
|
+
if (FORCE_HYPERLINK) {
|
|
80
|
+
return !(FORCE_HYPERLINK.length > 0 && Number.parseInt(FORCE_HYPERLINK, 10) === 0);
|
|
81
|
+
}
|
|
82
|
+
// Netlify always supports hyperlinks (no TTY needed)
|
|
83
|
+
if (NETLIFY) {
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
// No TTY, no hyperlinks
|
|
87
|
+
if (!stream.isTTY) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
// Windows Terminal supports hyperlinks
|
|
91
|
+
if ('WT_SESSION' in node_process_1.default.env) {
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
// Windows (non-Windows Terminal) doesn't support hyperlinks
|
|
95
|
+
if (node_process_1.default.platform === 'win32') {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
// CI environments generally don't support hyperlinks
|
|
99
|
+
if (CI) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
// TeamCity doesn't support hyperlinks
|
|
103
|
+
if (TEAMCITY_VERSION) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
// Check terminal program
|
|
107
|
+
if (TERM_PROGRAM) {
|
|
108
|
+
const version = parseVersion(TERM_PROGRAM_VERSION);
|
|
109
|
+
switch (TERM_PROGRAM) {
|
|
110
|
+
case 'ghostty':
|
|
111
|
+
case 'zed': {
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
case 'iTerm.app': {
|
|
115
|
+
// iTerm 3.1+ supports hyperlinks
|
|
116
|
+
if (version.major === 3) {
|
|
117
|
+
return version.minor >= 1;
|
|
118
|
+
}
|
|
119
|
+
return version.major > 3;
|
|
120
|
+
}
|
|
121
|
+
case 'vscode': {
|
|
122
|
+
// Cursor (VS Code fork) supports hyperlinks
|
|
123
|
+
if (CURSOR_TRACE_ID) {
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
// VS Code 1.72+ supports hyperlinks
|
|
127
|
+
return (version.major > 1 || (version.major === 1 && version.minor >= 72));
|
|
128
|
+
}
|
|
129
|
+
case 'WezTerm': {
|
|
130
|
+
// WezTerm packaged by Nix uses their own version scheme
|
|
131
|
+
if (/^0-unstable-\d{4}-\d{2}-\d{2}$/.test(TERM_PROGRAM_VERSION ?? '')) {
|
|
132
|
+
const date = (TERM_PROGRAM_VERSION ?? '').slice('0-unstable-'.length);
|
|
133
|
+
return date >= '2020-06-20';
|
|
134
|
+
}
|
|
135
|
+
// WezTerm version is a date (YYYYMMDD)
|
|
136
|
+
return version.major >= 20200620;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// VTE-based terminals (GNOME Terminal, etc.)
|
|
141
|
+
if (VTE_VERSION) {
|
|
142
|
+
// VTE 0.50.0 was supposed to support hyperlinks but segfaults.
|
|
143
|
+
// Check both string format ("0.50.0") and parsed version to catch
|
|
144
|
+
// compact format ("5000") which parseVersion converts to { 0, 50, 0 }.
|
|
145
|
+
if (VTE_VERSION === '0.50.0') {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
const version = parseVersion(VTE_VERSION);
|
|
149
|
+
if (version.major === 0 && version.minor === 50 && version.patch === 0) {
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
return version.major > 0 || version.minor >= 50;
|
|
153
|
+
}
|
|
154
|
+
// Check TERM variable
|
|
155
|
+
switch (TERM) {
|
|
156
|
+
case 'alacritty':
|
|
157
|
+
case 'xterm-kitty': {
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return false;
|
|
162
|
+
};
|
|
163
|
+
exports.supportsHyperlinks = supportsHyperlinks;
|
|
164
|
+
/**
|
|
165
|
+
* Create an OSC 8 hyperlink. The link text is displayed, and clicking it opens
|
|
166
|
+
* the URL in supported terminals.
|
|
167
|
+
*/
|
|
168
|
+
const link = (text, url) => {
|
|
169
|
+
const openLink = wrapOsc(`${OSC}8${SEP}${SEP}${url}${BEL}`);
|
|
170
|
+
const closeLink = wrapOsc(`${OSC}8${SEP}${SEP}${BEL}`);
|
|
171
|
+
return openLink + text + closeLink;
|
|
172
|
+
};
|
|
173
|
+
exports.link = link;
|
|
174
|
+
/**
|
|
175
|
+
* URL regex pattern for matching URLs in text. Matches http:// and https://
|
|
176
|
+
* URLs.
|
|
177
|
+
*/
|
|
178
|
+
const URL_PATTERN = /https?:\/\/[^\s<>"\])}]+/g;
|
|
179
|
+
/**
|
|
180
|
+
* Auto-linkify URLs in text. If terminal supports hyperlinks, URLs become
|
|
181
|
+
* clickable. Otherwise, text is returned unchanged.
|
|
182
|
+
*/
|
|
183
|
+
const linkifyUrls = (text, stream = node_process_1.default.stdout) => {
|
|
184
|
+
if (!(0, exports.supportsHyperlinks)(stream)) {
|
|
185
|
+
return text;
|
|
186
|
+
}
|
|
187
|
+
return text.replace(URL_PATTERN, (url) => (0, exports.link)(url, url));
|
|
188
|
+
};
|
|
189
|
+
exports.linkifyUrls = linkifyUrls;
|
|
190
|
+
//# sourceMappingURL=osc.js.map
|
package/dist/osc.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"osc.js","sourceRoot":"","sources":["../src/osc.ts"],"names":[],"mappings":"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"}
|
package/dist/osc.d.cts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OSC (Operating System Command) escape sequences for terminal features.
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for creating clickable hyperlinks in terminal output using
|
|
5
|
+
* OSC 8 sequences, detecting terminal hyperlink support across various terminal
|
|
6
|
+
* emulators, and auto-linkifying URLs in text.
|
|
7
|
+
*
|
|
8
|
+
* The hyperlink detection logic is adapted from supports-hyperlinks by Sindre
|
|
9
|
+
* Sorhus, used under the MIT License.
|
|
10
|
+
*
|
|
11
|
+
* @license MIT (supports-hyperlinks portions)
|
|
12
|
+
* @packageDocumentation
|
|
13
|
+
* @see {@link https://github.com/chalk/supports-hyperlinks}
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Detect if the terminal supports hyperlinks (OSC 8). Based on the logic from
|
|
17
|
+
* supports-hyperlinks package but implemented inline without dependencies.
|
|
18
|
+
*/
|
|
19
|
+
export declare const supportsHyperlinks: (stream?: NodeJS.WriteStream) => boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Create an OSC 8 hyperlink. The link text is displayed, and clicking it opens
|
|
22
|
+
* the URL in supported terminals.
|
|
23
|
+
*/
|
|
24
|
+
export declare const link: (text: string, url: string) => string;
|
|
25
|
+
/**
|
|
26
|
+
* Auto-linkify URLs in text. If terminal supports hyperlinks, URLs become
|
|
27
|
+
* clickable. Otherwise, text is returned unchanged.
|
|
28
|
+
*/
|
|
29
|
+
export declare const linkifyUrls: (text: string, stream?: NodeJS.WriteStream) => string;
|
|
30
|
+
//# sourceMappingURL=osc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"osc.d.ts","sourceRoot":"","sources":["../src/osc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA+DH;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC7B,SAAQ,MAAM,CAAC,WAA4B,KAC1C,OAkHF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,IAAI,GAAI,MAAM,MAAM,EAAE,KAAK,MAAM,KAAG,MAIhD,CAAC;AAQF;;;GAGG;AACH,eAAO,MAAM,WAAW,GACtB,MAAM,MAAM,EACZ,SAAQ,MAAM,CAAC,WAA4B,KAC1C,MAMF,CAAC"}
|
package/dist/osc.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OSC (Operating System Command) escape sequences for terminal features.
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for creating clickable hyperlinks in terminal output using
|
|
5
|
+
* OSC 8 sequences, detecting terminal hyperlink support across various terminal
|
|
6
|
+
* emulators, and auto-linkifying URLs in text.
|
|
7
|
+
*
|
|
8
|
+
* The hyperlink detection logic is adapted from supports-hyperlinks by Sindre
|
|
9
|
+
* Sorhus, used under the MIT License.
|
|
10
|
+
*
|
|
11
|
+
* @license MIT (supports-hyperlinks portions)
|
|
12
|
+
* @packageDocumentation
|
|
13
|
+
* @see {@link https://github.com/chalk/supports-hyperlinks}
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Detect if the terminal supports hyperlinks (OSC 8). Based on the logic from
|
|
17
|
+
* supports-hyperlinks package but implemented inline without dependencies.
|
|
18
|
+
*/
|
|
19
|
+
export declare const supportsHyperlinks: (stream?: NodeJS.WriteStream) => boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Create an OSC 8 hyperlink. The link text is displayed, and clicking it opens
|
|
22
|
+
* the URL in supported terminals.
|
|
23
|
+
*/
|
|
24
|
+
export declare const link: (text: string, url: string) => string;
|
|
25
|
+
/**
|
|
26
|
+
* Auto-linkify URLs in text. If terminal supports hyperlinks, URLs become
|
|
27
|
+
* clickable. Otherwise, text is returned unchanged.
|
|
28
|
+
*/
|
|
29
|
+
export declare const linkifyUrls: (text: string, stream?: NodeJS.WriteStream) => string;
|
|
30
|
+
//# sourceMappingURL=osc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"osc.d.ts","sourceRoot":"","sources":["../src/osc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA+DH;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC7B,SAAQ,MAAM,CAAC,WAA4B,KAC1C,OAkHF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,IAAI,GAAI,MAAM,MAAM,EAAE,KAAK,MAAM,KAAG,MAIhD,CAAC;AAQF;;;GAGG;AACH,eAAO,MAAM,WAAW,GACtB,MAAM,MAAM,EACZ,SAAQ,MAAM,CAAC,WAA4B,KAC1C,MAMF,CAAC"}
|
package/dist/osc.js
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OSC (Operating System Command) escape sequences for terminal features.
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for creating clickable hyperlinks in terminal output using
|
|
5
|
+
* OSC 8 sequences, detecting terminal hyperlink support across various terminal
|
|
6
|
+
* emulators, and auto-linkifying URLs in text.
|
|
7
|
+
*
|
|
8
|
+
* The hyperlink detection logic is adapted from supports-hyperlinks by Sindre
|
|
9
|
+
* Sorhus, used under the MIT License.
|
|
10
|
+
*
|
|
11
|
+
* @license MIT (supports-hyperlinks portions)
|
|
12
|
+
* @packageDocumentation
|
|
13
|
+
* @see {@link https://github.com/chalk/supports-hyperlinks}
|
|
14
|
+
*/
|
|
15
|
+
import process from 'node:process';
|
|
16
|
+
/**
|
|
17
|
+
* OSC escape sequence start.
|
|
18
|
+
*/
|
|
19
|
+
const OSC = '\x1b]';
|
|
20
|
+
/**
|
|
21
|
+
* Bell character - terminates OSC sequence.
|
|
22
|
+
*/
|
|
23
|
+
const BEL = '\x07';
|
|
24
|
+
/**
|
|
25
|
+
* Separator for OSC parameters.
|
|
26
|
+
*/
|
|
27
|
+
const SEP = ';';
|
|
28
|
+
/**
|
|
29
|
+
* Check if running inside tmux.
|
|
30
|
+
*/
|
|
31
|
+
const isTmux = () => 'TMUX' in process.env;
|
|
32
|
+
/**
|
|
33
|
+
* Wrap an OSC sequence for tmux compatibility. Tmux requires OSC sequences to
|
|
34
|
+
* be wrapped with DCS tmux; <sequence> ST and all ESCs in <sequence> to be
|
|
35
|
+
* replaced with ESC ESC.
|
|
36
|
+
*/
|
|
37
|
+
const wrapOsc = (sequence) => {
|
|
38
|
+
if (isTmux()) {
|
|
39
|
+
return '\x1BPtmux;' + sequence.replaceAll('\x1B', '\x1B\x1B') + '\x1B\\';
|
|
40
|
+
}
|
|
41
|
+
return sequence;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Parse a version string into major/minor/patch components. Handles both dotted
|
|
45
|
+
* versions (1.72.0) and compact versions (4601 -> 46.1.0).
|
|
46
|
+
*/
|
|
47
|
+
const parseVersion = (versionString = '') => {
|
|
48
|
+
// Handle compact version format (e.g., 4601 => 46.1.0)
|
|
49
|
+
if (/^\d{3,4}$/.test(versionString)) {
|
|
50
|
+
const match = /(\d{1,2})(\d{2})/.exec(versionString) ?? [];
|
|
51
|
+
return {
|
|
52
|
+
major: 0,
|
|
53
|
+
minor: Number.parseInt(match[1] ?? '0', 10),
|
|
54
|
+
patch: Number.parseInt(match[2] ?? '0', 10),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const versions = (versionString ?? '')
|
|
58
|
+
.split('.')
|
|
59
|
+
.map((n) => Number.parseInt(n, 10));
|
|
60
|
+
return {
|
|
61
|
+
major: versions[0] ?? 0,
|
|
62
|
+
minor: versions[1] ?? 0,
|
|
63
|
+
patch: versions[2] ?? 0,
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Detect if the terminal supports hyperlinks (OSC 8). Based on the logic from
|
|
68
|
+
* supports-hyperlinks package but implemented inline without dependencies.
|
|
69
|
+
*/
|
|
70
|
+
export const supportsHyperlinks = (stream = process.stdout) => {
|
|
71
|
+
const { CI, CURSOR_TRACE_ID, FORCE_HYPERLINK, NETLIFY, TEAMCITY_VERSION, TERM, TERM_PROGRAM, TERM_PROGRAM_VERSION, VTE_VERSION, } = process.env;
|
|
72
|
+
// Explicit force flag
|
|
73
|
+
if (FORCE_HYPERLINK) {
|
|
74
|
+
return !(FORCE_HYPERLINK.length > 0 && Number.parseInt(FORCE_HYPERLINK, 10) === 0);
|
|
75
|
+
}
|
|
76
|
+
// Netlify always supports hyperlinks (no TTY needed)
|
|
77
|
+
if (NETLIFY) {
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
// No TTY, no hyperlinks
|
|
81
|
+
if (!stream.isTTY) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
// Windows Terminal supports hyperlinks
|
|
85
|
+
if ('WT_SESSION' in process.env) {
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
// Windows (non-Windows Terminal) doesn't support hyperlinks
|
|
89
|
+
if (process.platform === 'win32') {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
// CI environments generally don't support hyperlinks
|
|
93
|
+
if (CI) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
// TeamCity doesn't support hyperlinks
|
|
97
|
+
if (TEAMCITY_VERSION) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
// Check terminal program
|
|
101
|
+
if (TERM_PROGRAM) {
|
|
102
|
+
const version = parseVersion(TERM_PROGRAM_VERSION);
|
|
103
|
+
switch (TERM_PROGRAM) {
|
|
104
|
+
case 'ghostty':
|
|
105
|
+
case 'zed': {
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
case 'iTerm.app': {
|
|
109
|
+
// iTerm 3.1+ supports hyperlinks
|
|
110
|
+
if (version.major === 3) {
|
|
111
|
+
return version.minor >= 1;
|
|
112
|
+
}
|
|
113
|
+
return version.major > 3;
|
|
114
|
+
}
|
|
115
|
+
case 'vscode': {
|
|
116
|
+
// Cursor (VS Code fork) supports hyperlinks
|
|
117
|
+
if (CURSOR_TRACE_ID) {
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
// VS Code 1.72+ supports hyperlinks
|
|
121
|
+
return (version.major > 1 || (version.major === 1 && version.minor >= 72));
|
|
122
|
+
}
|
|
123
|
+
case 'WezTerm': {
|
|
124
|
+
// WezTerm packaged by Nix uses their own version scheme
|
|
125
|
+
if (/^0-unstable-\d{4}-\d{2}-\d{2}$/.test(TERM_PROGRAM_VERSION ?? '')) {
|
|
126
|
+
const date = (TERM_PROGRAM_VERSION ?? '').slice('0-unstable-'.length);
|
|
127
|
+
return date >= '2020-06-20';
|
|
128
|
+
}
|
|
129
|
+
// WezTerm version is a date (YYYYMMDD)
|
|
130
|
+
return version.major >= 20200620;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// VTE-based terminals (GNOME Terminal, etc.)
|
|
135
|
+
if (VTE_VERSION) {
|
|
136
|
+
// VTE 0.50.0 was supposed to support hyperlinks but segfaults.
|
|
137
|
+
// Check both string format ("0.50.0") and parsed version to catch
|
|
138
|
+
// compact format ("5000") which parseVersion converts to { 0, 50, 0 }.
|
|
139
|
+
if (VTE_VERSION === '0.50.0') {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
const version = parseVersion(VTE_VERSION);
|
|
143
|
+
if (version.major === 0 && version.minor === 50 && version.patch === 0) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
return version.major > 0 || version.minor >= 50;
|
|
147
|
+
}
|
|
148
|
+
// Check TERM variable
|
|
149
|
+
switch (TERM) {
|
|
150
|
+
case 'alacritty':
|
|
151
|
+
case 'xterm-kitty': {
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return false;
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* Create an OSC 8 hyperlink. The link text is displayed, and clicking it opens
|
|
159
|
+
* the URL in supported terminals.
|
|
160
|
+
*/
|
|
161
|
+
export const link = (text, url) => {
|
|
162
|
+
const openLink = wrapOsc(`${OSC}8${SEP}${SEP}${url}${BEL}`);
|
|
163
|
+
const closeLink = wrapOsc(`${OSC}8${SEP}${SEP}${BEL}`);
|
|
164
|
+
return openLink + text + closeLink;
|
|
165
|
+
};
|
|
166
|
+
/**
|
|
167
|
+
* URL regex pattern for matching URLs in text. Matches http:// and https://
|
|
168
|
+
* URLs.
|
|
169
|
+
*/
|
|
170
|
+
const URL_PATTERN = /https?:\/\/[^\s<>"\])}]+/g;
|
|
171
|
+
/**
|
|
172
|
+
* Auto-linkify URLs in text. If terminal supports hyperlinks, URLs become
|
|
173
|
+
* clickable. Otherwise, text is returned unchanged.
|
|
174
|
+
*/
|
|
175
|
+
export const linkifyUrls = (text, stream = process.stdout) => {
|
|
176
|
+
if (!supportsHyperlinks(stream)) {
|
|
177
|
+
return text;
|
|
178
|
+
}
|
|
179
|
+
return text.replace(URL_PATTERN, (url) => link(url, url));
|
|
180
|
+
};
|
|
181
|
+
//# sourceMappingURL=osc.js.map
|
package/dist/osc.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"osc.js","sourceRoot":"","sources":["../src/osc.ts"],"names":[],"mappings":"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"}
|