argv-flags 0.2.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/README.md +138 -27
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +319 -0
- package/dist/index.js.map +1 -0
- package/package.json +20 -8
- package/index.d.ts +0 -7
- package/index.js +0 -95
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 1.0.0 - 2026-01-30
|
|
4
|
+
|
|
5
|
+
- Adopt ESM-only packaging and require Node.js >=24.
|
|
6
|
+
- Replace ad-hoc flag parsing with a schema-driven API.
|
|
7
|
+
- Return structured parse results (`values`, `present`, `issues`, `rest`, `unknown`) instead of sentinel `false`.
|
|
8
|
+
- Add explicit issue codes for machine-handling.
|
|
9
|
+
- Document deterministic parsing rules and migration steps.
|
package/README.md
CHANGED
|
@@ -1,62 +1,173 @@
|
|
|
1
1
|
# argv-flags
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Schema-driven CLI flag parsing for Node.js 24+. Deterministic rules, typed output, and a machine-consumable result model.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Install
|
|
6
6
|
|
|
7
7
|
```sh
|
|
8
8
|
npm install argv-flags
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## Quick start
|
|
12
12
|
|
|
13
13
|
```js
|
|
14
|
-
|
|
14
|
+
import { defineSchema, parseArgs } from 'argv-flags';
|
|
15
15
|
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
const schema = defineSchema({
|
|
17
|
+
src: { type: 'string', flags: ['--src'], required: true },
|
|
18
|
+
dest: { type: 'string', flags: ['--dest'], required: true },
|
|
19
|
+
exclude: { type: 'array', flags: ['--exclude'], default: [] },
|
|
20
|
+
verbose: { type: 'boolean', flags: ['--verbose'], default: false }
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
const result = parseArgs(schema);
|
|
24
|
+
|
|
25
|
+
if (!result.ok) {
|
|
26
|
+
console.error(result.issues);
|
|
27
|
+
process.exitCode = 1;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
console.log(result.values.src, result.values.dest);
|
|
20
31
|
```
|
|
21
32
|
|
|
22
|
-
|
|
33
|
+
## API
|
|
23
34
|
|
|
24
|
-
|
|
35
|
+
```ts
|
|
36
|
+
defineSchema<T extends Schema>(schema: T): T
|
|
37
|
+
parseArgs<T extends Schema>(schema: T, options?: ParseOptions): ParseResult<T>
|
|
38
|
+
```
|
|
25
39
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
40
|
+
### Schema
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
type FlagType = 'string' | 'boolean' | 'number' | 'array';
|
|
44
|
+
|
|
45
|
+
interface FlagSpec<T extends FlagType = FlagType> {
|
|
46
|
+
type: T;
|
|
47
|
+
flags: readonly string[];
|
|
48
|
+
required?: boolean;
|
|
49
|
+
default?: FlagValue<T>;
|
|
50
|
+
allowEmpty?: boolean;
|
|
51
|
+
allowNo?: boolean;
|
|
52
|
+
}
|
|
30
53
|
```
|
|
31
54
|
|
|
32
|
-
|
|
55
|
+
Notes:
|
|
56
|
+
- `flags` must include at least one flag token (`-x` or `--long`).
|
|
57
|
+
- `default` is cloned for arrays to avoid shared references.
|
|
58
|
+
- `allowNo` enables `--no-<flag>` for boolean specs (default: `true`).
|
|
59
|
+
- `allowEmpty` allows empty string/array values (default: `false`).
|
|
33
60
|
|
|
34
|
-
|
|
61
|
+
### Parse options
|
|
35
62
|
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
|
|
63
|
+
```ts
|
|
64
|
+
interface ParseOptions {
|
|
65
|
+
argv?: readonly string[];
|
|
66
|
+
allowUnknown?: boolean;
|
|
67
|
+
stopAtDoubleDash?: boolean;
|
|
68
|
+
}
|
|
39
69
|
```
|
|
40
70
|
|
|
41
|
-
|
|
71
|
+
- `argv`: defaults to `process.argv.slice(2)`.
|
|
72
|
+
- `allowUnknown`: when `true`, unknown flags are collected instead of erroring.
|
|
73
|
+
- `stopAtDoubleDash`: when `true` (default), `--` stops flag parsing and the rest is returned as `rest`.
|
|
74
|
+
|
|
75
|
+
## Output contract (machine-readable)
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
interface ParseResult<S extends Schema> {
|
|
79
|
+
values: { [K in keyof S]: FlagValue<S[K]['type']> | undefined };
|
|
80
|
+
present: { [K in keyof S]: boolean };
|
|
81
|
+
rest: string[];
|
|
82
|
+
unknown: string[];
|
|
83
|
+
issues: ParseIssue[];
|
|
84
|
+
ok: boolean;
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### `issues`
|
|
89
|
+
|
|
90
|
+
Each issue is explicit and stable:
|
|
91
|
+
|
|
92
|
+
```ts
|
|
93
|
+
type IssueCode =
|
|
94
|
+
| 'UNKNOWN_FLAG'
|
|
95
|
+
| 'MISSING_VALUE'
|
|
96
|
+
| 'INVALID_VALUE'
|
|
97
|
+
| 'REQUIRED'
|
|
98
|
+
| 'DUPLICATE'
|
|
99
|
+
| 'EMPTY_VALUE';
|
|
100
|
+
|
|
101
|
+
interface ParseIssue {
|
|
102
|
+
code: IssueCode;
|
|
103
|
+
severity: 'error' | 'warning';
|
|
104
|
+
message: string;
|
|
105
|
+
flag?: string;
|
|
106
|
+
key?: string;
|
|
107
|
+
value?: string;
|
|
108
|
+
index?: number;
|
|
109
|
+
}
|
|
110
|
+
```
|
|
42
111
|
|
|
43
|
-
|
|
112
|
+
`ok` is `true` only when no `error`-severity issues exist.
|
|
44
113
|
|
|
45
|
-
|
|
114
|
+
## Parsing rules (deterministic)
|
|
115
|
+
|
|
116
|
+
Rules are applied in order:
|
|
117
|
+
1. `--` stops flag parsing (when enabled) and the rest becomes `rest`.
|
|
118
|
+
2. Non-flag tokens (`-` or plain values) become `rest`.
|
|
119
|
+
3. `--no-<flag>` maps to the matching boolean spec if present and `allowNo !== false`.
|
|
120
|
+
4. Inline values (`--flag=value`) are parsed before consuming the next argv token.
|
|
121
|
+
5. Arrays collect values until the next flag token or `--`.
|
|
122
|
+
6. Duplicate non-array flags are warnings; duplicate arrays append.
|
|
123
|
+
7. Required flags missing at the end produce `REQUIRED` errors.
|
|
124
|
+
|
|
125
|
+
## Value parsing
|
|
126
|
+
|
|
127
|
+
- `boolean`: `true|false|1|0|yes|no|on|off` (case-insensitive).
|
|
128
|
+
When no explicit value is provided, presence means `true`.
|
|
129
|
+
- `number`: `Number(value)` must be finite. Negative numbers are accepted.
|
|
130
|
+
- `string`: values are taken as-is; empty strings are rejected unless `allowEmpty`.
|
|
131
|
+
- `array`: collects tokens until the next flag token; empty arrays are rejected unless `allowEmpty`.
|
|
132
|
+
|
|
133
|
+
## Examples
|
|
46
134
|
|
|
47
135
|
```sh
|
|
136
|
+
--flag
|
|
137
|
+
--flag=true
|
|
138
|
+
--count=-3
|
|
48
139
|
--items a b c --other
|
|
140
|
+
-- --literal --values
|
|
141
|
+
--no-verbose
|
|
49
142
|
```
|
|
50
143
|
|
|
51
|
-
|
|
144
|
+
## Versioning and migration
|
|
52
145
|
|
|
53
|
-
|
|
146
|
+
### 1.0.0
|
|
54
147
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
148
|
+
This release is intentionally strict and schema-driven:
|
|
149
|
+
|
|
150
|
+
- ESM-only (Node.js >=24).
|
|
151
|
+
- Typed schema is the single source of truth.
|
|
152
|
+
- Parsing returns a structured result object rather than sentinel `false` values.
|
|
153
|
+
|
|
154
|
+
Migration from 0.x:
|
|
155
|
+
|
|
156
|
+
```diff
|
|
157
|
+
- const parseFlag = require('argv-flags');
|
|
158
|
+
- const name = parseFlag('--name', 'string');
|
|
159
|
+
+ import { defineSchema, parseArgs } from 'argv-flags';
|
|
160
|
+
+ const schema = defineSchema({ name: { type: 'string', flags: ['--name'] } });
|
|
161
|
+
+ const result = parseArgs(schema);
|
|
162
|
+
+ const name = result.values.name;
|
|
58
163
|
```
|
|
59
164
|
|
|
165
|
+
## Guarantees
|
|
166
|
+
|
|
167
|
+
- Deterministic output for a given `argv`.
|
|
168
|
+
- No mutation of the input `argv`.
|
|
169
|
+
- Stable issue codes for programmatic handling.
|
|
170
|
+
|
|
60
171
|
## License
|
|
61
172
|
|
|
62
173
|
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export type FlagType = 'string' | 'boolean' | 'number' | 'array';
|
|
2
|
+
export type FlagValue<T extends FlagType> = T extends 'string' ? string : T extends 'boolean' ? boolean : T extends 'number' ? number : T extends 'array' ? string[] : never;
|
|
3
|
+
export interface FlagSpec<T extends FlagType = FlagType> {
|
|
4
|
+
type: T;
|
|
5
|
+
flags: readonly string[];
|
|
6
|
+
required?: boolean;
|
|
7
|
+
default?: FlagValue<T>;
|
|
8
|
+
allowEmpty?: boolean;
|
|
9
|
+
allowNo?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export type Schema = Record<string, FlagSpec>;
|
|
12
|
+
export type IssueSeverity = 'error' | 'warning';
|
|
13
|
+
export type IssueCode = 'UNKNOWN_FLAG' | 'MISSING_VALUE' | 'INVALID_VALUE' | 'REQUIRED' | 'DUPLICATE' | 'EMPTY_VALUE';
|
|
14
|
+
export interface ParseIssue {
|
|
15
|
+
code: IssueCode;
|
|
16
|
+
severity: IssueSeverity;
|
|
17
|
+
message: string;
|
|
18
|
+
flag?: string;
|
|
19
|
+
key?: string;
|
|
20
|
+
value?: string;
|
|
21
|
+
index?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface ParseOptions {
|
|
24
|
+
argv?: readonly string[];
|
|
25
|
+
allowUnknown?: boolean;
|
|
26
|
+
stopAtDoubleDash?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export type ParsedValues<S extends Schema> = {
|
|
29
|
+
[K in keyof S]: FlagValue<S[K]['type']> | undefined;
|
|
30
|
+
};
|
|
31
|
+
export type ParsedPresent<S extends Schema> = {
|
|
32
|
+
[K in keyof S]: boolean;
|
|
33
|
+
};
|
|
34
|
+
export interface ParseResult<S extends Schema> {
|
|
35
|
+
values: ParsedValues<S>;
|
|
36
|
+
present: ParsedPresent<S>;
|
|
37
|
+
rest: string[];
|
|
38
|
+
unknown: string[];
|
|
39
|
+
issues: ParseIssue[];
|
|
40
|
+
ok: boolean;
|
|
41
|
+
}
|
|
42
|
+
export declare const defineSchema: <T extends Schema>(schema: T) => T;
|
|
43
|
+
export declare const parseArgs: <T extends Schema>(schema: T, options?: ParseOptions) => ParseResult<T>;
|
|
44
|
+
export default parseArgs;
|
|
45
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEjE,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,QAAQ,IAAI,CAAC,SAAS,QAAQ,GAC3D,MAAM,GACN,CAAC,SAAS,SAAS,GAClB,OAAO,GACP,CAAC,SAAS,QAAQ,GACjB,MAAM,GACN,CAAC,SAAS,OAAO,GAChB,MAAM,EAAE,GACR,KAAK,CAAC;AAEZ,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ;IACtD,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAE9C,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,CAAC;AAEhD,MAAM,MAAM,SAAS,GAClB,cAAc,GACd,eAAe,GACf,eAAe,GACf,UAAU,GACV,WAAW,GACX,aAAa,CAAC;AAEjB,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,IAAI;KAC3C,CAAC,IAAI,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS;CACnD,CAAC;AAEF,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,MAAM,IAAI;KAC5C,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO;CACvB,CAAC;AAEF,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,MAAM;IAC5C,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IACxB,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,EAAE,EAAE,OAAO,CAAC;CACZ;AAoFD,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,MAAM,EAAE,QAAQ,CAAC,KAAG,CAAW,CAAC;AAEvE,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,MAAM,EAAE,QAAQ,CAAC,EAAE,UAAS,YAAiB,KAAG,WAAW,CAAC,CAAC,CA8PhG,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
const BOOLEAN_TRUE = new Set(['true', '1', 'yes', 'y', 'on']);
|
|
2
|
+
const BOOLEAN_FALSE = new Set(['false', '0', 'no', 'n', 'off']);
|
|
3
|
+
const isFlagToken = (value) => typeof value === 'string' && value.startsWith('-') && value.length > 1;
|
|
4
|
+
const normalizeBoolean = (value) => {
|
|
5
|
+
if (typeof value !== 'string')
|
|
6
|
+
return undefined;
|
|
7
|
+
const normalized = value.toLowerCase();
|
|
8
|
+
if (BOOLEAN_TRUE.has(normalized))
|
|
9
|
+
return true;
|
|
10
|
+
if (BOOLEAN_FALSE.has(normalized))
|
|
11
|
+
return false;
|
|
12
|
+
return undefined;
|
|
13
|
+
};
|
|
14
|
+
const isNumericValue = (value) => {
|
|
15
|
+
if (typeof value !== 'string' || value.length === 0)
|
|
16
|
+
return false;
|
|
17
|
+
const parsed = Number(value);
|
|
18
|
+
return Number.isFinite(parsed);
|
|
19
|
+
};
|
|
20
|
+
const cloneDefault = (value, type) => {
|
|
21
|
+
if (type === 'array' && Array.isArray(value)) {
|
|
22
|
+
return [...value];
|
|
23
|
+
}
|
|
24
|
+
return value;
|
|
25
|
+
};
|
|
26
|
+
const splitInlineValue = (token) => {
|
|
27
|
+
const eqIndex = token.indexOf('=');
|
|
28
|
+
if (eqIndex <= 0)
|
|
29
|
+
return { flag: token };
|
|
30
|
+
return { flag: token.slice(0, eqIndex), value: token.slice(eqIndex + 1) };
|
|
31
|
+
};
|
|
32
|
+
const validateSchema = (schema) => {
|
|
33
|
+
if (!schema || typeof schema !== 'object' || Array.isArray(schema)) {
|
|
34
|
+
throw new TypeError('Schema must be an object.');
|
|
35
|
+
}
|
|
36
|
+
const flagToKey = new Map();
|
|
37
|
+
const normalized = new Map();
|
|
38
|
+
for (const [rawKey, rawSpec] of Object.entries(schema)) {
|
|
39
|
+
const key = rawKey;
|
|
40
|
+
const spec = rawSpec;
|
|
41
|
+
if (!spec || typeof spec !== 'object') {
|
|
42
|
+
throw new TypeError(`Schema entry for "${String(key)}" must be an object.`);
|
|
43
|
+
}
|
|
44
|
+
const type = spec.type;
|
|
45
|
+
if (!['string', 'boolean', 'number', 'array'].includes(type)) {
|
|
46
|
+
throw new TypeError(`Schema entry "${String(key)}" has invalid type "${String(type)}".`);
|
|
47
|
+
}
|
|
48
|
+
const flagsInput = spec.flags;
|
|
49
|
+
if (!Array.isArray(flagsInput) || flagsInput.length === 0) {
|
|
50
|
+
throw new TypeError(`Schema entry "${String(key)}" must define at least one flag.`);
|
|
51
|
+
}
|
|
52
|
+
const flags = [];
|
|
53
|
+
for (const flag of flagsInput) {
|
|
54
|
+
if (typeof flag !== 'string' || flag.length < 2 || !flag.startsWith('-')) {
|
|
55
|
+
throw new TypeError(`Schema entry "${String(key)}" has invalid flag "${String(flag)}".`);
|
|
56
|
+
}
|
|
57
|
+
if (flagToKey.has(flag)) {
|
|
58
|
+
const existing = flagToKey.get(flag);
|
|
59
|
+
throw new TypeError(`Flag "${flag}" is already assigned to "${String(existing)}".`);
|
|
60
|
+
}
|
|
61
|
+
flagToKey.set(flag, key);
|
|
62
|
+
flags.push(flag);
|
|
63
|
+
}
|
|
64
|
+
const longFlag = flags.find((flag) => flag.startsWith('--'));
|
|
65
|
+
const normalizedSpec = {
|
|
66
|
+
...spec,
|
|
67
|
+
type,
|
|
68
|
+
flags,
|
|
69
|
+
...(longFlag ? { longFlag } : {})
|
|
70
|
+
};
|
|
71
|
+
normalized.set(key, normalizedSpec);
|
|
72
|
+
}
|
|
73
|
+
return { flagToKey, normalized };
|
|
74
|
+
};
|
|
75
|
+
export const defineSchema = (schema) => schema;
|
|
76
|
+
export const parseArgs = (schema, options = {}) => {
|
|
77
|
+
const { flagToKey, normalized } = validateSchema(schema);
|
|
78
|
+
const argv = Array.isArray(options.argv) ? options.argv : process.argv.slice(2);
|
|
79
|
+
const allowUnknown = options.allowUnknown === true;
|
|
80
|
+
const stopAtDoubleDash = options.stopAtDoubleDash !== false;
|
|
81
|
+
const values = {};
|
|
82
|
+
const present = {};
|
|
83
|
+
const issues = [];
|
|
84
|
+
const unknown = [];
|
|
85
|
+
const rest = [];
|
|
86
|
+
for (const [key, spec] of normalized.entries()) {
|
|
87
|
+
present[key] = false;
|
|
88
|
+
values[key] = cloneDefault(spec.default, spec.type);
|
|
89
|
+
}
|
|
90
|
+
const pushIssue = (issue) => {
|
|
91
|
+
issues.push(issue);
|
|
92
|
+
};
|
|
93
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
94
|
+
const token = argv[i];
|
|
95
|
+
if (stopAtDoubleDash && token === '--') {
|
|
96
|
+
rest.push(...argv.slice(i + 1));
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
if (!isFlagToken(token)) {
|
|
100
|
+
rest.push(token);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const rawToken = token;
|
|
104
|
+
const { flag, value: inlineValue } = splitInlineValue(token);
|
|
105
|
+
if (flag.startsWith('--no-') && !flagToKey.has(flag)) {
|
|
106
|
+
const base = `--${flag.slice(5)}`;
|
|
107
|
+
const baseKey = flagToKey.get(base);
|
|
108
|
+
if (baseKey) {
|
|
109
|
+
const baseSpec = normalized.get(baseKey);
|
|
110
|
+
if (baseSpec?.type === 'boolean' && baseSpec.allowNo !== false) {
|
|
111
|
+
if (present[baseKey]) {
|
|
112
|
+
pushIssue({
|
|
113
|
+
code: 'DUPLICATE',
|
|
114
|
+
severity: 'warning',
|
|
115
|
+
message: `Duplicate flag ${base}.`,
|
|
116
|
+
flag: base,
|
|
117
|
+
key: String(baseKey),
|
|
118
|
+
index: i
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
present[baseKey] = true;
|
|
122
|
+
values[baseKey] = false;
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const key = flagToKey.get(flag);
|
|
128
|
+
if (!key) {
|
|
129
|
+
if (!allowUnknown) {
|
|
130
|
+
pushIssue({
|
|
131
|
+
code: 'UNKNOWN_FLAG',
|
|
132
|
+
severity: 'error',
|
|
133
|
+
message: `Unknown flag ${flag}.`,
|
|
134
|
+
flag,
|
|
135
|
+
index: i
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
unknown.push(rawToken);
|
|
140
|
+
}
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const spec = normalized.get(key);
|
|
144
|
+
if (!spec) {
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
const wasPresent = present[key];
|
|
148
|
+
if (wasPresent && spec.type !== 'array') {
|
|
149
|
+
pushIssue({
|
|
150
|
+
code: 'DUPLICATE',
|
|
151
|
+
severity: 'warning',
|
|
152
|
+
message: `Duplicate flag ${flag}.`,
|
|
153
|
+
flag,
|
|
154
|
+
key: String(key),
|
|
155
|
+
index: i
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
present[key] = true;
|
|
159
|
+
if (spec.type === 'boolean') {
|
|
160
|
+
let raw = inlineValue;
|
|
161
|
+
let consumedNext = false;
|
|
162
|
+
if (raw === undefined) {
|
|
163
|
+
const nextValue = argv[i + 1];
|
|
164
|
+
const normalizedValue = normalizeBoolean(nextValue);
|
|
165
|
+
if (normalizedValue !== undefined) {
|
|
166
|
+
raw = nextValue;
|
|
167
|
+
consumedNext = true;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (raw !== undefined) {
|
|
171
|
+
const normalizedValue = normalizeBoolean(raw);
|
|
172
|
+
if (normalizedValue === undefined) {
|
|
173
|
+
pushIssue({
|
|
174
|
+
code: 'INVALID_VALUE',
|
|
175
|
+
severity: 'error',
|
|
176
|
+
message: `Invalid boolean value for ${flag}: ${raw}.`,
|
|
177
|
+
flag,
|
|
178
|
+
key: String(key),
|
|
179
|
+
value: raw,
|
|
180
|
+
index: i
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
values[key] = normalizedValue;
|
|
185
|
+
if (consumedNext) {
|
|
186
|
+
i += 1;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
values[key] = true;
|
|
192
|
+
}
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
if (spec.type === 'string') {
|
|
196
|
+
let raw = inlineValue;
|
|
197
|
+
if (raw === undefined) {
|
|
198
|
+
const nextValue = argv[i + 1];
|
|
199
|
+
if (typeof nextValue !== 'string' || isFlagToken(nextValue)) {
|
|
200
|
+
pushIssue({
|
|
201
|
+
code: 'MISSING_VALUE',
|
|
202
|
+
severity: 'error',
|
|
203
|
+
message: `Missing value for ${flag}.`,
|
|
204
|
+
flag,
|
|
205
|
+
key: String(key),
|
|
206
|
+
index: i
|
|
207
|
+
});
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
raw = nextValue;
|
|
211
|
+
i += 1;
|
|
212
|
+
}
|
|
213
|
+
if (raw.length === 0 && spec.allowEmpty !== true) {
|
|
214
|
+
pushIssue({
|
|
215
|
+
code: 'EMPTY_VALUE',
|
|
216
|
+
severity: 'error',
|
|
217
|
+
message: `Empty value not allowed for ${flag}.`,
|
|
218
|
+
flag,
|
|
219
|
+
key: String(key),
|
|
220
|
+
index: i
|
|
221
|
+
});
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
values[key] = raw;
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
if (spec.type === 'number') {
|
|
228
|
+
let raw = inlineValue;
|
|
229
|
+
if (raw === undefined) {
|
|
230
|
+
const nextValue = argv[i + 1];
|
|
231
|
+
if (typeof nextValue !== 'string' || (!isNumericValue(nextValue) && isFlagToken(nextValue))) {
|
|
232
|
+
pushIssue({
|
|
233
|
+
code: 'MISSING_VALUE',
|
|
234
|
+
severity: 'error',
|
|
235
|
+
message: `Missing value for ${flag}.`,
|
|
236
|
+
flag,
|
|
237
|
+
key: String(key),
|
|
238
|
+
index: i
|
|
239
|
+
});
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
raw = nextValue;
|
|
243
|
+
i += 1;
|
|
244
|
+
}
|
|
245
|
+
if (!isNumericValue(raw)) {
|
|
246
|
+
pushIssue({
|
|
247
|
+
code: 'INVALID_VALUE',
|
|
248
|
+
severity: 'error',
|
|
249
|
+
message: `Invalid number value for ${flag}: ${raw}.`,
|
|
250
|
+
flag,
|
|
251
|
+
key: String(key),
|
|
252
|
+
value: raw,
|
|
253
|
+
index: i
|
|
254
|
+
});
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
values[key] = Number(raw);
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
if (spec.type === 'array') {
|
|
261
|
+
const collected = [];
|
|
262
|
+
if (inlineValue !== undefined && inlineValue.length > 0) {
|
|
263
|
+
collected.push(inlineValue);
|
|
264
|
+
}
|
|
265
|
+
let cursor = i + 1;
|
|
266
|
+
while (cursor < argv.length) {
|
|
267
|
+
const nextValue = argv[cursor];
|
|
268
|
+
if (stopAtDoubleDash && nextValue === '--') {
|
|
269
|
+
break;
|
|
270
|
+
}
|
|
271
|
+
if (isFlagToken(nextValue)) {
|
|
272
|
+
break;
|
|
273
|
+
}
|
|
274
|
+
collected.push(nextValue);
|
|
275
|
+
cursor += 1;
|
|
276
|
+
}
|
|
277
|
+
if (cursor > i + 1) {
|
|
278
|
+
i = cursor - 1;
|
|
279
|
+
}
|
|
280
|
+
if (collected.length === 0 && spec.allowEmpty !== true) {
|
|
281
|
+
pushIssue({
|
|
282
|
+
code: 'MISSING_VALUE',
|
|
283
|
+
severity: 'error',
|
|
284
|
+
message: `Missing value for ${flag}.`,
|
|
285
|
+
flag,
|
|
286
|
+
key: String(key),
|
|
287
|
+
index: i
|
|
288
|
+
});
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
291
|
+
const existing = Array.isArray(values[key]) ? values[key] : [];
|
|
292
|
+
values[key] = [...existing, ...collected];
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
for (const [key, spec] of normalized.entries()) {
|
|
297
|
+
if (spec.required && !present[key]) {
|
|
298
|
+
const primaryFlag = spec.flags[0];
|
|
299
|
+
pushIssue({
|
|
300
|
+
code: 'REQUIRED',
|
|
301
|
+
severity: 'error',
|
|
302
|
+
message: `Missing required flag ${primaryFlag ?? ''}.`,
|
|
303
|
+
...(primaryFlag ? { flag: primaryFlag } : {}),
|
|
304
|
+
key: String(key)
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
const ok = issues.every((issue) => issue.severity !== 'error');
|
|
309
|
+
return {
|
|
310
|
+
values,
|
|
311
|
+
present,
|
|
312
|
+
rest,
|
|
313
|
+
unknown,
|
|
314
|
+
issues,
|
|
315
|
+
ok
|
|
316
|
+
};
|
|
317
|
+
};
|
|
318
|
+
export default parseArgs;
|
|
319
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,17 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "argv-flags",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
5
|
-
"
|
|
6
|
-
"
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Schema-based CLI flag parser for Node.js.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
7
14
|
"files": [
|
|
15
|
+
"CHANGELOG.md",
|
|
8
16
|
"LICENSE",
|
|
9
17
|
"README.md",
|
|
10
|
-
"
|
|
11
|
-
"index.d.ts"
|
|
18
|
+
"dist"
|
|
12
19
|
],
|
|
13
20
|
"scripts": {
|
|
14
|
-
"
|
|
21
|
+
"build": "tsc -p tsconfig.json",
|
|
22
|
+
"test": "npm run build && node --test"
|
|
15
23
|
},
|
|
16
24
|
"repository": {
|
|
17
25
|
"type": "git",
|
|
@@ -30,6 +38,10 @@
|
|
|
30
38
|
},
|
|
31
39
|
"homepage": "https://github.com/Ismail-elkorchi/argv-flags#readme",
|
|
32
40
|
"engines": {
|
|
33
|
-
"node": ">=
|
|
41
|
+
"node": ">=24"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@types/node": "^24.0.0",
|
|
45
|
+
"typescript": "^5.5.4"
|
|
34
46
|
}
|
|
35
47
|
}
|
package/index.d.ts
DELETED
package/index.js
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const isLongFlag = ( value ) => typeof value === 'string' && value.startsWith( '--' );
|
|
4
|
-
|
|
5
|
-
const normalizeBooleanValue = ( value ) => {
|
|
6
|
-
if ( typeof value !== 'string' ) {
|
|
7
|
-
return undefined;
|
|
8
|
-
}
|
|
9
|
-
const normalized = value.toLowerCase();
|
|
10
|
-
if ( normalized === 'true' ) {
|
|
11
|
-
return true;
|
|
12
|
-
}
|
|
13
|
-
if ( normalized === 'false' ) {
|
|
14
|
-
return false;
|
|
15
|
-
}
|
|
16
|
-
return undefined;
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
const findFlagMatch = ( argv, targetArgument ) => {
|
|
20
|
-
const directIndex = argv.indexOf( targetArgument );
|
|
21
|
-
if ( directIndex !== -1 ) {
|
|
22
|
-
return { index: directIndex };
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const prefix = `${targetArgument}=`;
|
|
26
|
-
const inlineIndex = argv.findIndex( ( value ) => typeof value === 'string' && value.startsWith( prefix ) );
|
|
27
|
-
if ( inlineIndex === -1 ) {
|
|
28
|
-
return null;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return {
|
|
32
|
-
index: inlineIndex,
|
|
33
|
-
inlineValue: argv[ inlineIndex ].slice( prefix.length )
|
|
34
|
-
};
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
function parseFlag( targetArgument, argumentType, argv = process.argv ) {
|
|
38
|
-
const processArguments = Array.isArray( argv ) ? argv : process.argv;
|
|
39
|
-
const match = findFlagMatch( processArguments, targetArgument );
|
|
40
|
-
|
|
41
|
-
if ( ! match ) {
|
|
42
|
-
return false;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const inlineValue = Object.prototype.hasOwnProperty.call( match, 'inlineValue' )
|
|
46
|
-
? match.inlineValue
|
|
47
|
-
: undefined;
|
|
48
|
-
const nextValue = processArguments[ match.index + 1 ];
|
|
49
|
-
|
|
50
|
-
if ( argumentType === 'string' ) {
|
|
51
|
-
if ( typeof inlineValue === 'string' ) {
|
|
52
|
-
return inlineValue;
|
|
53
|
-
}
|
|
54
|
-
if ( typeof nextValue !== 'string' || isLongFlag( nextValue ) ) {
|
|
55
|
-
return false;
|
|
56
|
-
}
|
|
57
|
-
return nextValue;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
if ( argumentType === 'array' ) {
|
|
61
|
-
const values = [];
|
|
62
|
-
if ( typeof inlineValue === 'string' && inlineValue.length > 0 ) {
|
|
63
|
-
values.push( inlineValue );
|
|
64
|
-
}
|
|
65
|
-
for ( let i = match.index + 1; i < processArguments.length; i++ ) {
|
|
66
|
-
const value = processArguments[ i ];
|
|
67
|
-
if ( isLongFlag( value ) ) {
|
|
68
|
-
break;
|
|
69
|
-
}
|
|
70
|
-
values.push( value );
|
|
71
|
-
}
|
|
72
|
-
return values;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
if ( argumentType === 'boolean' ) {
|
|
76
|
-
const normalizedValue = normalizeBooleanValue( typeof inlineValue === 'string' ? inlineValue : nextValue );
|
|
77
|
-
if ( typeof normalizedValue === 'boolean' ) {
|
|
78
|
-
return normalizedValue;
|
|
79
|
-
}
|
|
80
|
-
return true;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
if ( argumentType === 'number' ) {
|
|
84
|
-
const candidate = typeof inlineValue === 'string' ? inlineValue : nextValue;
|
|
85
|
-
if ( typeof candidate !== 'string' || isLongFlag( candidate ) ) {
|
|
86
|
-
return false;
|
|
87
|
-
}
|
|
88
|
-
const parsed = Number( candidate );
|
|
89
|
-
return Number.isNaN( parsed ) ? false : parsed;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
return false;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
module.exports = parseFlag;
|