@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.
Files changed (91) hide show
  1. package/LICENSE +55 -0
  2. package/README.md +483 -0
  3. package/dist/bargs.cjs +167 -0
  4. package/dist/bargs.cjs.map +1 -0
  5. package/dist/bargs.d.cts +31 -0
  6. package/dist/bargs.d.cts.map +1 -0
  7. package/dist/bargs.d.ts +31 -0
  8. package/dist/bargs.d.ts.map +1 -0
  9. package/dist/bargs.js +163 -0
  10. package/dist/bargs.js.map +1 -0
  11. package/dist/errors.cjs +57 -0
  12. package/dist/errors.cjs.map +1 -0
  13. package/dist/errors.d.cts +40 -0
  14. package/dist/errors.d.cts.map +1 -0
  15. package/dist/errors.d.ts +40 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/errors.js +51 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/help.cjs +309 -0
  20. package/dist/help.cjs.map +1 -0
  21. package/dist/help.d.cts +21 -0
  22. package/dist/help.d.cts.map +1 -0
  23. package/dist/help.d.ts +21 -0
  24. package/dist/help.d.ts.map +1 -0
  25. package/dist/help.js +304 -0
  26. package/dist/help.js.map +1 -0
  27. package/dist/index.cjs +63 -0
  28. package/dist/index.cjs.map +1 -0
  29. package/dist/index.d.cts +96 -0
  30. package/dist/index.d.cts.map +1 -0
  31. package/dist/index.d.ts +96 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +47 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/opt.cjs +205 -0
  36. package/dist/opt.cjs.map +1 -0
  37. package/dist/opt.d.cts +145 -0
  38. package/dist/opt.d.cts.map +1 -0
  39. package/dist/opt.d.ts +145 -0
  40. package/dist/opt.d.ts.map +1 -0
  41. package/dist/opt.js +202 -0
  42. package/dist/opt.js.map +1 -0
  43. package/dist/osc.cjs +190 -0
  44. package/dist/osc.cjs.map +1 -0
  45. package/dist/osc.d.cts +30 -0
  46. package/dist/osc.d.cts.map +1 -0
  47. package/dist/osc.d.ts +30 -0
  48. package/dist/osc.d.ts.map +1 -0
  49. package/dist/osc.js +181 -0
  50. package/dist/osc.js.map +1 -0
  51. package/dist/parser.cjs +293 -0
  52. package/dist/parser.cjs.map +1 -0
  53. package/dist/parser.d.cts +47 -0
  54. package/dist/parser.d.cts.map +1 -0
  55. package/dist/parser.d.ts +47 -0
  56. package/dist/parser.d.ts.map +1 -0
  57. package/dist/parser.js +285 -0
  58. package/dist/parser.js.map +1 -0
  59. package/dist/theme.cjs +203 -0
  60. package/dist/theme.cjs.map +1 -0
  61. package/dist/theme.d.cts +227 -0
  62. package/dist/theme.d.cts.map +1 -0
  63. package/dist/theme.d.ts +227 -0
  64. package/dist/theme.d.ts.map +1 -0
  65. package/dist/theme.js +198 -0
  66. package/dist/theme.js.map +1 -0
  67. package/dist/types.cjs +18 -0
  68. package/dist/types.cjs.map +1 -0
  69. package/dist/types.d.cts +244 -0
  70. package/dist/types.d.cts.map +1 -0
  71. package/dist/types.d.ts +244 -0
  72. package/dist/types.d.ts.map +1 -0
  73. package/dist/types.js +17 -0
  74. package/dist/types.js.map +1 -0
  75. package/dist/validate.cjs +452 -0
  76. package/dist/validate.cjs.map +1 -0
  77. package/dist/validate.d.cts +28 -0
  78. package/dist/validate.d.cts.map +1 -0
  79. package/dist/validate.d.ts +28 -0
  80. package/dist/validate.d.ts.map +1 -0
  81. package/dist/validate.js +448 -0
  82. package/dist/validate.js.map +1 -0
  83. package/dist/version.cjs +134 -0
  84. package/dist/version.cjs.map +1 -0
  85. package/dist/version.d.cts +27 -0
  86. package/dist/version.d.cts.map +1 -0
  87. package/dist/version.d.ts +27 -0
  88. package/dist/version.d.ts.map +1 -0
  89. package/dist/version.js +129 -0
  90. package/dist/version.js.map +1 -0
  91. package/package.json +149 -0
@@ -0,0 +1,448 @@
1
+ /**
2
+ * Configuration validation for bargs.
3
+ *
4
+ * Validates bargs configuration objects at runtime before parsing, ensuring:
5
+ *
6
+ * - Required properties are present and correctly typed
7
+ * - Option definitions have valid type discriminators and defaults
8
+ * - Aliases are single characters with no conflicts
9
+ * - Positional schemas have variadic args last and required args before optional
10
+ * - Command handlers are properly defined
11
+ * - Command-based CLIs don't have top-level positionals or handlers
12
+ *
13
+ * Throws {@link ValidationError} with detailed path information when invalid.
14
+ *
15
+ * @packageDocumentation
16
+ */
17
+ import { ValidationError } from "./errors.js";
18
+ /** Valid option type discriminators */
19
+ const VALID_OPTION_TYPES = [
20
+ 'string',
21
+ 'boolean',
22
+ 'number',
23
+ 'enum',
24
+ 'array',
25
+ 'count',
26
+ ];
27
+ /** Valid positional type discriminators */
28
+ const VALID_POSITIONAL_TYPES = [
29
+ 'string',
30
+ 'number',
31
+ 'enum',
32
+ 'variadic',
33
+ ];
34
+ /** Valid array/variadic item types */
35
+ const VALID_ITEM_TYPES = ['string', 'number'];
36
+ // ─── Primitive Helpers ──────────────────────────────────────────────────────
37
+ const isObject = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
38
+ const isFunction = (value) => typeof value === 'function';
39
+ const isStringArray = (value) => Array.isArray(value) && value.every((v) => typeof v === 'string');
40
+ const isNumberArray = (value) => Array.isArray(value) && value.every((v) => typeof v === 'number');
41
+ // ─── Option Validation ──────────────────────────────────────────────────────
42
+ /**
43
+ * Validate a single option definition.
44
+ */
45
+ const validateOption = (name, opt, path, allAliases) => {
46
+ if (!isObject(opt)) {
47
+ throw new ValidationError(path, 'option must be an object');
48
+ }
49
+ // Validate type discriminator
50
+ const type = opt['type'];
51
+ if (typeof type !== 'string') {
52
+ throw new ValidationError(`${path}.type`, 'must be a string');
53
+ }
54
+ if (!VALID_OPTION_TYPES.includes(type)) {
55
+ throw new ValidationError(`${path}.type`, `must be one of: ${VALID_OPTION_TYPES.join(', ')}`);
56
+ }
57
+ // Validate optional description
58
+ if (opt['description'] !== undefined &&
59
+ typeof opt['description'] !== 'string') {
60
+ throw new ValidationError(`${path}.description`, 'must be a string');
61
+ }
62
+ // Validate optional group
63
+ if (opt['group'] !== undefined && typeof opt['group'] !== 'string') {
64
+ throw new ValidationError(`${path}.group`, 'must be a string');
65
+ }
66
+ // Validate optional hidden
67
+ if (opt['hidden'] !== undefined && typeof opt['hidden'] !== 'boolean') {
68
+ throw new ValidationError(`${path}.hidden`, 'must be a boolean');
69
+ }
70
+ // Validate optional required
71
+ if (opt['required'] !== undefined && typeof opt['required'] !== 'boolean') {
72
+ throw new ValidationError(`${path}.required`, 'must be a boolean');
73
+ }
74
+ // Validate aliases
75
+ if (opt['aliases'] !== undefined) {
76
+ if (!isStringArray(opt['aliases'])) {
77
+ throw new ValidationError(`${path}.aliases`, 'must be an array of strings');
78
+ }
79
+ for (let i = 0; i < opt['aliases'].length; i++) {
80
+ const alias = opt['aliases'][i];
81
+ if (alias.length !== 1) {
82
+ throw new ValidationError(`${path}.aliases[${i}]`, `alias must be a single character, got "${alias}"`);
83
+ }
84
+ // Check for duplicates
85
+ const existingOption = allAliases.get(alias);
86
+ if (existingOption !== undefined) {
87
+ throw new ValidationError(`${path}.aliases[${i}]`, `alias "${alias}" is already used by option "${existingOption}"`);
88
+ }
89
+ allAliases.set(alias, name);
90
+ }
91
+ }
92
+ // Type-specific validation
93
+ switch (type) {
94
+ case 'array': {
95
+ const items = opt['items'];
96
+ if (typeof items !== 'string') {
97
+ throw new ValidationError(`${path}.items`, 'must be "string" or "number"');
98
+ }
99
+ if (!VALID_ITEM_TYPES.includes(items)) {
100
+ throw new ValidationError(`${path}.items`, 'must be "string" or "number"');
101
+ }
102
+ if (opt['default'] !== undefined) {
103
+ if (items === 'string') {
104
+ if (!isStringArray(opt['default'])) {
105
+ throw new ValidationError(`${path}.default`, 'must be an array of strings');
106
+ }
107
+ }
108
+ else {
109
+ if (!isNumberArray(opt['default'])) {
110
+ throw new ValidationError(`${path}.default`, 'must be an array of numbers');
111
+ }
112
+ }
113
+ }
114
+ break;
115
+ }
116
+ case 'boolean':
117
+ if (opt['default'] !== undefined && typeof opt['default'] !== 'boolean') {
118
+ throw new ValidationError(`${path}.default`, 'must be a boolean');
119
+ }
120
+ break;
121
+ case 'count':
122
+ if (opt['default'] !== undefined && typeof opt['default'] !== 'number') {
123
+ throw new ValidationError(`${path}.default`, 'must be a number');
124
+ }
125
+ break;
126
+ case 'enum': {
127
+ const choices = opt['choices'];
128
+ if (!isStringArray(choices)) {
129
+ throw new ValidationError(`${path}.choices`, 'must be a non-empty array of strings');
130
+ }
131
+ if (choices.length === 0) {
132
+ throw new ValidationError(`${path}.choices`, 'must not be empty');
133
+ }
134
+ if (opt['default'] !== undefined) {
135
+ if (typeof opt['default'] !== 'string') {
136
+ throw new ValidationError(`${path}.default`, 'must be a string');
137
+ }
138
+ if (!choices.includes(opt['default'])) {
139
+ throw new ValidationError(`${path}.default`, `must be one of the choices: ${choices.join(', ')}`);
140
+ }
141
+ }
142
+ break;
143
+ }
144
+ case 'number':
145
+ if (opt['default'] !== undefined && typeof opt['default'] !== 'number') {
146
+ throw new ValidationError(`${path}.default`, 'must be a number');
147
+ }
148
+ break;
149
+ case 'string':
150
+ if (opt['default'] !== undefined && typeof opt['default'] !== 'string') {
151
+ throw new ValidationError(`${path}.default`, 'must be a string');
152
+ }
153
+ break;
154
+ }
155
+ };
156
+ /**
157
+ * Validate an options schema.
158
+ */
159
+ const validateOptionsSchema = (schema, path, allAliases = new Map()) => {
160
+ if (schema === undefined) {
161
+ return; // optional
162
+ }
163
+ if (!isObject(schema)) {
164
+ throw new ValidationError(path, 'must be an object');
165
+ }
166
+ for (const [name, opt] of Object.entries(schema)) {
167
+ validateOption(name, opt, `${path}.${name}`, allAliases);
168
+ }
169
+ };
170
+ // ─── Positional Validation ──────────────────────────────────────────────────
171
+ /**
172
+ * Validate a single positional definition.
173
+ */
174
+ const validatePositional = (index, pos, path) => {
175
+ if (!isObject(pos)) {
176
+ throw new ValidationError(path, 'positional must be an object');
177
+ }
178
+ // Validate type discriminator
179
+ const type = pos['type'];
180
+ if (typeof type !== 'string') {
181
+ throw new ValidationError(`${path}.type`, 'must be a string');
182
+ }
183
+ if (!VALID_POSITIONAL_TYPES.includes(type)) {
184
+ throw new ValidationError(`${path}.type`, `must be one of: ${VALID_POSITIONAL_TYPES.join(', ')}`);
185
+ }
186
+ // Validate optional description
187
+ if (pos['description'] !== undefined &&
188
+ typeof pos['description'] !== 'string') {
189
+ throw new ValidationError(`${path}.description`, 'must be a string');
190
+ }
191
+ // Validate optional name
192
+ if (pos['name'] !== undefined && typeof pos['name'] !== 'string') {
193
+ throw new ValidationError(`${path}.name`, 'must be a string');
194
+ }
195
+ // Validate optional required
196
+ if (pos['required'] !== undefined && typeof pos['required'] !== 'boolean') {
197
+ throw new ValidationError(`${path}.required`, 'must be a boolean');
198
+ }
199
+ // Type-specific validation
200
+ switch (type) {
201
+ case 'enum': {
202
+ const choices = pos['choices'];
203
+ if (!isStringArray(choices)) {
204
+ throw new ValidationError(`${path}.choices`, 'must be a non-empty array of strings');
205
+ }
206
+ if (choices.length === 0) {
207
+ throw new ValidationError(`${path}.choices`, 'must not be empty');
208
+ }
209
+ if (pos['default'] !== undefined) {
210
+ if (typeof pos['default'] !== 'string') {
211
+ throw new ValidationError(`${path}.default`, 'must be a string');
212
+ }
213
+ if (!choices.includes(pos['default'])) {
214
+ throw new ValidationError(`${path}.default`, `must be one of the choices: ${choices.join(', ')}`);
215
+ }
216
+ }
217
+ break;
218
+ }
219
+ case 'number':
220
+ if (pos['default'] !== undefined && typeof pos['default'] !== 'number') {
221
+ throw new ValidationError(`${path}.default`, 'must be a number');
222
+ }
223
+ break;
224
+ case 'string':
225
+ if (pos['default'] !== undefined && typeof pos['default'] !== 'string') {
226
+ throw new ValidationError(`${path}.default`, 'must be a string');
227
+ }
228
+ break;
229
+ case 'variadic': {
230
+ const items = pos['items'];
231
+ if (typeof items !== 'string') {
232
+ throw new ValidationError(`${path}.items`, 'must be "string" or "number"');
233
+ }
234
+ if (!VALID_ITEM_TYPES.includes(items)) {
235
+ throw new ValidationError(`${path}.items`, 'must be "string" or "number"');
236
+ }
237
+ break;
238
+ }
239
+ }
240
+ };
241
+ /**
242
+ * Validate a positionals schema. Checks:
243
+ *
244
+ * - Each positional has valid structure
245
+ * - Variadic positional (if present) is last
246
+ * - Required positionals don't follow optional ones
247
+ */
248
+ const validatePositionalsSchema = (schema, path) => {
249
+ if (schema === undefined) {
250
+ return; // optional
251
+ }
252
+ if (!Array.isArray(schema)) {
253
+ throw new ValidationError(path, 'must be an array');
254
+ }
255
+ // Validate each positional
256
+ for (let i = 0; i < schema.length; i++) {
257
+ validatePositional(i, schema[i], `${path}[${i}]`);
258
+ }
259
+ // Check variadic is last
260
+ const variadicIndex = schema.findIndex((p) => isObject(p) && p['type'] === 'variadic');
261
+ if (variadicIndex !== -1 && variadicIndex !== schema.length - 1) {
262
+ throw new ValidationError(`${path}[${variadicIndex}]`, 'variadic positional must be the last positional argument');
263
+ }
264
+ // Check required doesn't follow optional
265
+ let seenOptional = false;
266
+ for (let i = 0; i < schema.length; i++) {
267
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
268
+ const pos = schema[i];
269
+ if (!isObject(pos)) {
270
+ continue;
271
+ }
272
+ const isOptional = pos['required'] !== true &&
273
+ !('default' in pos && pos['default'] !== undefined);
274
+ const isVariadic = pos['type'] === 'variadic';
275
+ if (isOptional) {
276
+ seenOptional = true;
277
+ }
278
+ else if (seenOptional && !isVariadic) {
279
+ throw new ValidationError(`${path}[${i}]`, 'required positional cannot follow an optional positional');
280
+ }
281
+ }
282
+ };
283
+ // ─── Handler Validation ─────────────────────────────────────────────────────
284
+ /**
285
+ * Validate a handler (function or array of functions).
286
+ */
287
+ const validateHandler = (handler, path) => {
288
+ if (handler === undefined) {
289
+ return; // handlers are optional in some contexts
290
+ }
291
+ if (Array.isArray(handler)) {
292
+ if (handler.length === 0) {
293
+ throw new ValidationError(path, 'handler array must not be empty');
294
+ }
295
+ for (let i = 0; i < handler.length; i++) {
296
+ if (!isFunction(handler[i])) {
297
+ throw new ValidationError(`${path}[${i}]`, 'must be a function');
298
+ }
299
+ }
300
+ }
301
+ else if (!isFunction(handler)) {
302
+ throw new ValidationError(path, 'must be a function or array of functions');
303
+ }
304
+ };
305
+ // ─── Command Validation ─────────────────────────────────────────────────────
306
+ /**
307
+ * Validate a single command configuration.
308
+ */
309
+ const validateCommand = (name, cmd, path, globalAliases) => {
310
+ if (!isObject(cmd)) {
311
+ throw new ValidationError(path, 'command must be an object');
312
+ }
313
+ // description is required
314
+ if (typeof cmd['description'] !== 'string') {
315
+ throw new ValidationError(`${path}.description`, 'must be a string');
316
+ }
317
+ // handler is required for commands
318
+ if (cmd['handler'] === undefined) {
319
+ throw new ValidationError(`${path}.handler`, 'is required');
320
+ }
321
+ validateHandler(cmd['handler'], `${path}.handler`);
322
+ // Validate options (command-local aliases only, no collision with globals)
323
+ // Create a new alias map that includes global aliases for collision detection
324
+ const commandAliases = new Map(globalAliases);
325
+ validateOptionsSchema(cmd['options'], `${path}.options`, commandAliases);
326
+ // Validate positionals
327
+ validatePositionalsSchema(cmd['positionals'], `${path}.positionals`);
328
+ };
329
+ /**
330
+ * Validate commands record.
331
+ */
332
+ const validateCommands = (commands, path, globalAliases) => {
333
+ if (!isObject(commands)) {
334
+ throw new ValidationError(path, 'must be an object');
335
+ }
336
+ const commandNames = Object.keys(commands);
337
+ if (commandNames.length === 0) {
338
+ throw new ValidationError(path, 'must have at least one command');
339
+ }
340
+ for (const [name, cmd] of Object.entries(commands)) {
341
+ validateCommand(name, cmd, `${path}.${name}`, globalAliases);
342
+ }
343
+ return new Set(commandNames);
344
+ };
345
+ // ─── Main Config Validation ─────────────────────────────────────────────────
346
+ /**
347
+ * Validate base config properties common to both simple and command-based CLIs.
348
+ */
349
+ const validateBaseConfig = (config, path) => {
350
+ if (!isObject(config)) {
351
+ throw new ValidationError(path, 'config must be an object');
352
+ }
353
+ // name is required
354
+ if (typeof config['name'] !== 'string') {
355
+ throw new ValidationError(`${path}.name`, 'must be a string');
356
+ }
357
+ if (config['name'].length === 0) {
358
+ throw new ValidationError(`${path}.name`, 'must not be empty');
359
+ }
360
+ // description is optional
361
+ if (config['description'] !== undefined &&
362
+ typeof config['description'] !== 'string') {
363
+ throw new ValidationError(`${path}.description`, 'must be a string');
364
+ }
365
+ // version is optional
366
+ if (config['version'] !== undefined &&
367
+ typeof config['version'] !== 'string') {
368
+ throw new ValidationError(`${path}.version`, 'must be a string');
369
+ }
370
+ // args is optional
371
+ if (config['args'] !== undefined && !isStringArray(config['args'])) {
372
+ throw new ValidationError(`${path}.args`, 'must be an array of strings');
373
+ }
374
+ // Validate options
375
+ const aliases = new Map();
376
+ validateOptionsSchema(config['options'], `${path}.options`, aliases);
377
+ return { aliases, configObj: config };
378
+ };
379
+ /**
380
+ * Check if config appears to be a command-based CLI. Returns true if commands
381
+ * property exists (even if empty - validation will catch that).
382
+ */
383
+ const isCommandConfig = (config) => {
384
+ return config['commands'] !== undefined;
385
+ };
386
+ /**
387
+ * Validate a simple CLI config (no commands).
388
+ */
389
+ const validateSimpleConfig = (config, path, _aliases) => {
390
+ // Validate positionals
391
+ validatePositionalsSchema(config['positionals'], `${path}.positionals`);
392
+ // Validate handler (optional for simple CLI)
393
+ validateHandler(config['handler'], `${path}.handler`);
394
+ };
395
+ /**
396
+ * Validate a command-based CLI config.
397
+ */
398
+ const validateCommandConfig = (config, path, aliases) => {
399
+ // Commands must exist and have entries
400
+ const commandNames = validateCommands(config['commands'], `${path}.commands`, aliases);
401
+ // Positionals should not be present at top level
402
+ if (config['positionals'] !== undefined) {
403
+ const positionals = config['positionals'];
404
+ if (Array.isArray(positionals) && positionals.length > 0) {
405
+ throw new ValidationError(`${path}.positionals`, 'top-level positionals are not allowed in command-based CLIs (define them per-command)');
406
+ }
407
+ }
408
+ // handler should not be present (use defaultHandler instead)
409
+ if (config['handler'] !== undefined) {
410
+ throw new ValidationError(`${path}.handler`, 'use defaultHandler for command-based CLIs');
411
+ }
412
+ // Validate defaultHandler
413
+ const defaultHandler = config['defaultHandler'];
414
+ if (defaultHandler !== undefined) {
415
+ if (typeof defaultHandler === 'string') {
416
+ // Must reference an existing command
417
+ if (!commandNames.has(defaultHandler)) {
418
+ throw new ValidationError(`${path}.defaultHandler`, `must reference an existing command, got "${defaultHandler}"`);
419
+ }
420
+ }
421
+ else if (Array.isArray(defaultHandler)) {
422
+ // Array of handlers
423
+ validateHandler(defaultHandler, `${path}.defaultHandler`);
424
+ }
425
+ else if (!isFunction(defaultHandler)) {
426
+ throw new ValidationError(`${path}.defaultHandler`, 'must be a function, array of functions, or command name string');
427
+ }
428
+ }
429
+ };
430
+ /**
431
+ * Validate a bargs configuration object. Throws ValidationError if invalid.
432
+ *
433
+ * This validates both simple CLI configs (BargsConfig) and command-based CLI
434
+ * configs (BargsConfigWithCommands).
435
+ *
436
+ * @param config - The configuration to validate
437
+ * @throws ValidationError if the config is invalid
438
+ */
439
+ export const validateConfig = (config) => {
440
+ const { aliases, configObj } = validateBaseConfig(config, 'config');
441
+ if (isCommandConfig(configObj)) {
442
+ validateCommandConfig(configObj, 'config', aliases);
443
+ }
444
+ else {
445
+ validateSimpleConfig(configObj, 'config', aliases);
446
+ }
447
+ };
448
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ /**
3
+ * Package version and metadata detection utilities.
4
+ *
5
+ * Provides functions to locate and read `package.json` files by walking up the
6
+ * directory tree, extracting version strings, and gathering package metadata
7
+ * (homepage, repository URLs) for automatic epilog generation in help output.
8
+ *
9
+ * @packageDocumentation
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.readPackageInfoSync = exports.detectVersion = void 0;
13
+ const node_fs_1 = require("node:fs");
14
+ const promises_1 = require("node:fs/promises");
15
+ const node_path_1 = require("node:path");
16
+ /**
17
+ * Normalize a repository URL to clean HTTPS format. Strips leading `git+` and
18
+ * trailing `.git`.
19
+ */
20
+ const normalizeRepoUrl = (url) => {
21
+ return url.replace(/^git\+/, '').replace(/\.git$/, '');
22
+ };
23
+ /**
24
+ * Validate that a URL is HTTPS. Returns the URL if valid, undefined otherwise.
25
+ */
26
+ const validateHttpsUrl = (url) => {
27
+ if (!url) {
28
+ return undefined;
29
+ }
30
+ return url.startsWith('https://') ? url : undefined;
31
+ };
32
+ /**
33
+ * Extract repository URL from package.json repository field. Handles both
34
+ * string and object forms.
35
+ */
36
+ const extractRepoUrl = (repository) => {
37
+ if (!repository) {
38
+ return undefined;
39
+ }
40
+ const rawUrl = typeof repository === 'string' ? repository : repository.url;
41
+ if (!rawUrl) {
42
+ return undefined;
43
+ }
44
+ const normalized = normalizeRepoUrl(rawUrl);
45
+ return validateHttpsUrl(normalized);
46
+ };
47
+ /**
48
+ * Find package.json by walking up from startDir (async).
49
+ */
50
+ const findPackageJson = async (startDir) => {
51
+ let dir = startDir;
52
+ let prevDir = '';
53
+ while (dir !== prevDir) {
54
+ const pkgPath = (0, node_path_1.join)(dir, 'package.json');
55
+ try {
56
+ await (0, promises_1.readFile)(pkgPath, 'utf-8');
57
+ return pkgPath;
58
+ }
59
+ catch {
60
+ prevDir = dir;
61
+ dir = (0, node_path_1.dirname)(dir);
62
+ }
63
+ }
64
+ return undefined;
65
+ };
66
+ /**
67
+ * Find package.json by walking up from startDir (sync).
68
+ */
69
+ const findPackageJsonSync = (startDir) => {
70
+ let dir = startDir;
71
+ let prevDir = '';
72
+ while (dir !== prevDir) {
73
+ const pkgPath = (0, node_path_1.join)(dir, 'package.json');
74
+ try {
75
+ (0, node_fs_1.readFileSync)(pkgPath, 'utf-8');
76
+ return pkgPath;
77
+ }
78
+ catch {
79
+ prevDir = dir;
80
+ dir = (0, node_path_1.dirname)(dir);
81
+ }
82
+ }
83
+ return undefined;
84
+ };
85
+ /**
86
+ * Read version from package.json (async).
87
+ */
88
+ const readVersionFromPackageJson = async (pkgPath) => {
89
+ try {
90
+ const content = await (0, promises_1.readFile)(pkgPath, 'utf-8');
91
+ const pkg = JSON.parse(content);
92
+ return pkg.version;
93
+ }
94
+ catch {
95
+ return undefined;
96
+ }
97
+ };
98
+ /**
99
+ * Detect version: use provided version or read from nearest package.json.
100
+ */
101
+ const detectVersion = async (providedVersion, startDir = process.cwd()) => {
102
+ if (providedVersion) {
103
+ return providedVersion;
104
+ }
105
+ const pkgPath = await findPackageJson(startDir);
106
+ if (!pkgPath) {
107
+ return undefined;
108
+ }
109
+ return readVersionFromPackageJson(pkgPath);
110
+ };
111
+ exports.detectVersion = detectVersion;
112
+ /**
113
+ * Read package info (homepage, repository) from package.json synchronously.
114
+ * Returns only HTTPS URLs; other URL schemes are omitted.
115
+ */
116
+ const readPackageInfoSync = (startDir = process.cwd()) => {
117
+ const pkgPath = findPackageJsonSync(startDir);
118
+ if (!pkgPath) {
119
+ return {};
120
+ }
121
+ try {
122
+ const content = (0, node_fs_1.readFileSync)(pkgPath, 'utf-8');
123
+ const pkg = JSON.parse(content);
124
+ return {
125
+ homepage: validateHttpsUrl(pkg.homepage),
126
+ repository: extractRepoUrl(pkg.repository),
127
+ };
128
+ }
129
+ catch {
130
+ return {};
131
+ }
132
+ };
133
+ exports.readPackageInfoSync = readPackageInfoSync;
134
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Package version and metadata detection utilities.
3
+ *
4
+ * Provides functions to locate and read `package.json` files by walking up the
5
+ * directory tree, extracting version strings, and gathering package metadata
6
+ * (homepage, repository URLs) for automatic epilog generation in help output.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ /**
11
+ * Package info extracted from `package.json` for epilog generation.
12
+ */
13
+ interface PackageInfo {
14
+ homepage?: string;
15
+ repository?: string;
16
+ }
17
+ /**
18
+ * Detect version: use provided version or read from nearest package.json.
19
+ */
20
+ export declare const detectVersion: (providedVersion: string | undefined, startDir?: string) => Promise<string | undefined>;
21
+ /**
22
+ * Read package info (homepage, repository) from package.json synchronously.
23
+ * Returns only HTTPS URLs; other URL schemes are omitted.
24
+ */
25
+ export declare const readPackageInfoSync: (startDir?: string) => PackageInfo;
26
+ export {};
27
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH;;GAEG;AACH,UAAU,WAAW;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAqHD;;GAEG;AACH,eAAO,MAAM,aAAa,GACxB,iBAAiB,MAAM,GAAG,SAAS,EACnC,WAAU,MAAsB,KAC/B,OAAO,CAAC,MAAM,GAAG,SAAS,CAW5B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAC9B,WAAU,MAAsB,KAC/B,WAiBF,CAAC"}