@clerc/core 1.0.0-beta.1 → 1.0.0-beta.2
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/index.d.ts +17 -10
- package/dist/index.js +17 -15
- package/package.json +3 -3
package/dist/index.d.ts
CHANGED
|
@@ -10,11 +10,13 @@ type UnknownArray = readonly unknown[];
|
|
|
10
10
|
type MapsSetsOrArrays = ReadonlyMap<unknown, unknown> | WeakMap<WeakKey, unknown> | ReadonlySet<unknown> | WeakSet<WeakKey> | UnknownArray;
|
|
11
11
|
type ConditionalDeepPrettify<T, E = never, I$1 = unknown> = T extends E ? T : T extends I$1 ? { [TypeKey in keyof T]: ConditionalDeepPrettify<T[TypeKey], E, I$1> } : T;
|
|
12
12
|
type DeepPrettify<T, E = never> = ConditionalDeepPrettify<T, E | NonRecursiveType | MapsSetsOrArrays, object>;
|
|
13
|
+
type IsAny<T> = 0 extends 1 & T ? true : false;
|
|
13
14
|
//#endregion
|
|
14
15
|
//#region ../utils/src/types/index.d.ts
|
|
15
16
|
type MaybeArray<T> = T | T[];
|
|
16
17
|
type PartialRequired<T, K$1 extends keyof T> = T & { [P in K$1]-?: T[P] };
|
|
17
18
|
type UnionToIntersection<U$1> = (U$1 extends any ? (k: U$1) => void : never) extends ((k: infer I) => void) ? I : never;
|
|
19
|
+
type CamelCase<S extends string> = S extends `${infer Head} ${infer Tail}` ? `${Head}${Capitalize<CamelCase<Tail>>}` : S extends `${infer Head}-${infer Tail}` ? `${Head}${Capitalize<CamelCase<Tail>>}` : S;
|
|
18
20
|
//#endregion
|
|
19
21
|
//#region ../parser/src/types.d.ts
|
|
20
22
|
type FlagDefaultValue<T = unknown> = T | (() => T);
|
|
@@ -88,7 +90,10 @@ interface ParsedResult<TFlags extends Record<string, any>> {
|
|
|
88
90
|
type InferFlagDefault<T extends FlagDefinitionValue, Fallback> = T extends {
|
|
89
91
|
default: FlagDefaultValue<infer DefaultType>;
|
|
90
92
|
} ? DefaultType : Fallback;
|
|
91
|
-
type
|
|
93
|
+
type IsTypeAny<T extends FlagDefinitionValue> = IsAny<T> extends true ? true : T extends {
|
|
94
|
+
type: infer Type;
|
|
95
|
+
} ? IsAny<Type> extends true ? true : false : false;
|
|
96
|
+
type _InferFlags<T extends FlagsDefinition> = { [K in keyof T]: IsTypeAny<T[K]> extends true ? any : T[K] extends readonly [BooleanConstructor] | {
|
|
92
97
|
type: readonly [BooleanConstructor];
|
|
93
98
|
} ? number : T[K] extends ObjectConstructor | {
|
|
94
99
|
type: ObjectConstructor;
|
|
@@ -110,6 +115,9 @@ declare const KNOWN_FLAG = "known-flag";
|
|
|
110
115
|
declare const UNKNOWN_FLAG = "unknown-flag";
|
|
111
116
|
declare const PARAMETER = "parameter";
|
|
112
117
|
//#endregion
|
|
118
|
+
//#region ../parser/src/parse.d.ts
|
|
119
|
+
declare const DOUBLE_DASH = "--";
|
|
120
|
+
//#endregion
|
|
113
121
|
//#region src/types/clerc.d.ts
|
|
114
122
|
type ErrorHandler = (error: unknown) => void;
|
|
115
123
|
//#endregion
|
|
@@ -120,7 +128,7 @@ type ClercFlagOptions = FlagOptions & {
|
|
|
120
128
|
type ClercFlagsDefinition = Record<string, ClercFlagOptions>;
|
|
121
129
|
//#endregion
|
|
122
130
|
//#region src/types/parameters.d.ts
|
|
123
|
-
type InferParameter<T extends string> = T extends `<${infer Name extends string}...>` | `[${infer Name extends string}...]` ? Record<Name
|
|
131
|
+
type InferParameter<T extends string> = T extends `<${infer Name extends string}...>` | `[${infer Name extends string}...]` ? Record<CamelCase<Name>, string[]> : T extends `<${infer Name extends string}>` ? Record<CamelCase<Name>, string> : T extends `[${infer Name extends string}]` ? Record<CamelCase<Name>, string | undefined> : never;
|
|
124
132
|
type InferParameters<T extends string[]> = T extends (infer U extends string)[] ? Prettify<UnionToIntersection<InferParameter<U>>> : never;
|
|
125
133
|
//#endregion
|
|
126
134
|
//#region src/types/context.d.ts
|
|
@@ -134,7 +142,7 @@ interface BaseContext<C extends Command = Command, GF extends ClercFlagsDefiniti
|
|
|
134
142
|
flags: InferFlagsWithGlobal<C, GF>;
|
|
135
143
|
ignored: string[];
|
|
136
144
|
rawParsed: ParsedResult<InferFlagsWithGlobal<C, GF>>;
|
|
137
|
-
|
|
145
|
+
missingParameters: boolean;
|
|
138
146
|
}
|
|
139
147
|
//#endregion
|
|
140
148
|
//#region src/types/command.d.ts
|
|
@@ -190,6 +198,7 @@ interface CreateOptions {
|
|
|
190
198
|
version?: string;
|
|
191
199
|
}
|
|
192
200
|
interface ParseOptions {
|
|
201
|
+
argv?: string[];
|
|
193
202
|
run?: boolean;
|
|
194
203
|
}
|
|
195
204
|
declare class Clerc<Commands extends CommandsRecord = {}, GlobalFlags extends ClercFlagsDefinition = {}> {
|
|
@@ -214,9 +223,7 @@ declare class Clerc<Commands extends CommandsRecord = {}, GlobalFlags extends Cl
|
|
|
214
223
|
interceptor(interceptor: Interceptor<Command, GlobalFlags>): this;
|
|
215
224
|
on<Name$1 extends LiteralUnion<keyof Commands, string>>(name: Name$1, handler: CommandHandler<Commands[Name$1], GlobalFlags>): this;
|
|
216
225
|
run(): void;
|
|
217
|
-
parse(
|
|
218
|
-
run
|
|
219
|
-
}?: ParseOptions): this;
|
|
226
|
+
parse(argvOrOptions?: string[] | ParseOptions): this;
|
|
220
227
|
}
|
|
221
228
|
//#endregion
|
|
222
229
|
//#region src/commands.d.ts
|
|
@@ -225,10 +232,10 @@ declare function resolveCommand(commandsMap: CommandsMap, parameters: string[]):
|
|
|
225
232
|
//#region src/errors.d.ts
|
|
226
233
|
declare class NoSuchCommandError extends Error {
|
|
227
234
|
commandName: string;
|
|
228
|
-
constructor(commandName: string);
|
|
235
|
+
constructor(commandName: string, text?: string);
|
|
229
236
|
}
|
|
230
|
-
declare class
|
|
231
|
-
constructor();
|
|
237
|
+
declare class NoCommandSpecifiedError extends Error {
|
|
238
|
+
constructor(text?: string);
|
|
232
239
|
}
|
|
233
240
|
declare class InvalidCommandError extends Error {
|
|
234
241
|
constructor(message: string);
|
|
@@ -249,4 +256,4 @@ declare function createStopAtFirstParameter(): IgnoreFunction;
|
|
|
249
256
|
//#region src/plugin.d.ts
|
|
250
257
|
declare const definePlugin: (plugin: Plugin) => Plugin;
|
|
251
258
|
//#endregion
|
|
252
|
-
export { BaseContext, Clerc, ClercFlagOptions, ClercFlagsDefinition, Command, CommandCustomOptions, CommandHandler, CommandHandlerContext, CommandOptions, CommandWithHandler, CommandsMap, CommandsRecord, ErrorHandler, InferParameters, Interceptor, InterceptorContext, InterceptorHandler, InterceptorNext, InterceptorObject, InvalidCommandError, InvalidParametersError, MakeEmitterEvents, MissingRequiredMetadataError,
|
|
259
|
+
export { BaseContext, Clerc, ClercFlagOptions, ClercFlagsDefinition, Command, CommandCustomOptions, CommandHandler, CommandHandlerContext, CommandOptions, CommandWithHandler, CommandsMap, CommandsRecord, DOUBLE_DASH, ErrorHandler, InferParameters, Interceptor, InterceptorContext, InterceptorHandler, InterceptorNext, InterceptorObject, InvalidCommandError, InvalidParametersError, KNOWN_FLAG, MakeEmitterEvents, MissingRequiredMetadataError, NoCommandSpecifiedError, NoSuchCommandError, PARAMETER, Plugin, UNKNOWN_FLAG, createStopAtFirstParameter, defineCommand, definePlugin, resolveCommand };
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { DOUBLE_DASH, PARAMETER, parse } from "@clerc/parser";
|
|
2
|
-
import { toArray } from "@clerc/utils";
|
|
1
|
+
import { DOUBLE_DASH, DOUBLE_DASH as DOUBLE_DASH$1, KNOWN_FLAG, PARAMETER, PARAMETER as PARAMETER$1, UNKNOWN_FLAG, parse } from "@clerc/parser";
|
|
2
|
+
import { camelCase, toArray } from "@clerc/utils";
|
|
3
3
|
import { LiteEmit } from "lite-emit";
|
|
4
4
|
|
|
5
5
|
//#region src/commands.ts
|
|
@@ -14,14 +14,14 @@ function resolveCommand(commandsMap, parameters) {
|
|
|
14
14
|
//#endregion
|
|
15
15
|
//#region src/errors.ts
|
|
16
16
|
var NoSuchCommandError = class extends Error {
|
|
17
|
-
constructor(commandName) {
|
|
18
|
-
super(
|
|
17
|
+
constructor(commandName, text = `No such command: "${commandName}".`) {
|
|
18
|
+
super(text);
|
|
19
19
|
this.commandName = commandName;
|
|
20
20
|
}
|
|
21
21
|
};
|
|
22
|
-
var
|
|
23
|
-
constructor() {
|
|
24
|
-
super(
|
|
22
|
+
var NoCommandSpecifiedError = class extends Error {
|
|
23
|
+
constructor(text = "No command specified.") {
|
|
24
|
+
super(text);
|
|
25
25
|
}
|
|
26
26
|
};
|
|
27
27
|
var InvalidCommandError = class extends Error {
|
|
@@ -82,7 +82,7 @@ function getParametersToResolve(argv) {
|
|
|
82
82
|
}
|
|
83
83
|
return parameters;
|
|
84
84
|
}
|
|
85
|
-
const PARAMETER_REGEX = /^(<|\[)(\w+)(\.\.\.)?(\]|>)$/;
|
|
85
|
+
const PARAMETER_REGEX = /^(<|\[)([\w ]+)(\.\.\.)?(\]|>)$/;
|
|
86
86
|
const isParameterDefinitionBracketsValid = (definition) => definition.startsWith("<") && definition.endsWith(">") || definition.startsWith("[") && definition.endsWith("]");
|
|
87
87
|
function _parseParameters(definitions, parameters) {
|
|
88
88
|
const result = {};
|
|
@@ -90,7 +90,7 @@ function _parseParameters(definitions, parameters) {
|
|
|
90
90
|
for (const [i, definition] of definitions.entries()) {
|
|
91
91
|
const match = definition.match(PARAMETER_REGEX);
|
|
92
92
|
if (!match || !isParameterDefinitionBracketsValid(definition)) throw new InvalidParametersError(`Invalid parameter definition: ${definition}`);
|
|
93
|
-
const name = match[2];
|
|
93
|
+
const name = camelCase(match[2]);
|
|
94
94
|
const isVariadic = !!match[3];
|
|
95
95
|
const isRequired = definition.startsWith("<");
|
|
96
96
|
if (name in result) throw new InvalidParametersError(`Duplicate parameter name: ${name}`);
|
|
@@ -105,7 +105,7 @@ function _parseParameters(definitions, parameters) {
|
|
|
105
105
|
return result;
|
|
106
106
|
}
|
|
107
107
|
function parseParameters(definitions, parameters, doubleDashParameters) {
|
|
108
|
-
const doubleDashIndex = definitions.indexOf(DOUBLE_DASH);
|
|
108
|
+
const doubleDashIndex = definitions.indexOf(DOUBLE_DASH$1);
|
|
109
109
|
if (doubleDashIndex === -1) return _parseParameters(definitions, parameters);
|
|
110
110
|
else {
|
|
111
111
|
const definitionBeforeDoubleDash = definitions.slice(0, doubleDashIndex);
|
|
@@ -277,21 +277,23 @@ var Clerc = class Clerc {
|
|
|
277
277
|
flags: parsed.flags,
|
|
278
278
|
ignored: parsed.ignored,
|
|
279
279
|
rawParsed: parsed,
|
|
280
|
-
|
|
280
|
+
missingParameters: !!parametersError
|
|
281
281
|
};
|
|
282
282
|
const emitInterceptor = {
|
|
283
283
|
enforce: "post",
|
|
284
284
|
handler: (ctx) => {
|
|
285
285
|
if (parametersError) throw parametersError;
|
|
286
286
|
if (command) this.#emitter.emit(command.name, ctx);
|
|
287
|
-
else throw parametersToResolve.length > 0 ? new NoSuchCommandError(parametersToResolve.join(" ")) : new
|
|
287
|
+
else throw parametersToResolve.length > 0 ? new NoSuchCommandError(parametersToResolve.join(" ")) : new NoCommandSpecifiedError();
|
|
288
288
|
}
|
|
289
289
|
};
|
|
290
290
|
const composedInterceptor = compose([...this.#interceptors, emitInterceptor]);
|
|
291
291
|
this.#callWithErrorHandler(() => composedInterceptor(context));
|
|
292
292
|
}
|
|
293
|
-
parse(
|
|
293
|
+
parse(argvOrOptions = platformArgv) {
|
|
294
294
|
this.#callWithErrorHandler(() => this.#validate());
|
|
295
|
+
if (Array.isArray(argvOrOptions)) argvOrOptions = { argv: argvOrOptions };
|
|
296
|
+
const { argv = platformArgv, run = true } = argvOrOptions;
|
|
295
297
|
this.#argv = argv;
|
|
296
298
|
if (run) this.run();
|
|
297
299
|
return this;
|
|
@@ -307,7 +309,7 @@ const defineCommand = (command) => command;
|
|
|
307
309
|
function createStopAtFirstParameter() {
|
|
308
310
|
let encounteredParameter = false;
|
|
309
311
|
return (type) => {
|
|
310
|
-
if (type === PARAMETER && !encounteredParameter) {
|
|
312
|
+
if (type === PARAMETER$1 && !encounteredParameter) {
|
|
311
313
|
encounteredParameter = true;
|
|
312
314
|
return false;
|
|
313
315
|
}
|
|
@@ -320,4 +322,4 @@ function createStopAtFirstParameter() {
|
|
|
320
322
|
const definePlugin = (plugin) => plugin;
|
|
321
323
|
|
|
322
324
|
//#endregion
|
|
323
|
-
export { Clerc, InvalidCommandError, InvalidParametersError, MissingRequiredMetadataError,
|
|
325
|
+
export { Clerc, DOUBLE_DASH, InvalidCommandError, InvalidParametersError, KNOWN_FLAG, MissingRequiredMetadataError, NoCommandSpecifiedError, NoSuchCommandError, PARAMETER, UNKNOWN_FLAG, createStopAtFirstParameter, defineCommand, definePlugin, resolveCommand };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clerc/core",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.2",
|
|
4
4
|
"author": "Ray <i@mk1.io> (https://github.com/so1ve)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Clerc core",
|
|
@@ -45,8 +45,8 @@
|
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"lite-emit": "^3.1.0",
|
|
48
|
-
"@clerc/parser": "^1.0.0-beta.
|
|
49
|
-
"@clerc/utils": "1.0.0-beta.
|
|
48
|
+
"@clerc/parser": "^1.0.0-beta.2",
|
|
49
|
+
"@clerc/utils": "1.0.0-beta.2"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"is-platform": "^1.0.0"
|