deno.land / x / yargs@v17.6.0-deno / lib / middleware.ts

نووسراو ببینە
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import {argsert} from './argsert.js';import {isPromise} from './utils/is-promise.js';import {YargsInstance, Arguments} from './yargs-factory.js';
export class GlobalMiddleware { globalMiddleware: Middleware[] = []; yargs: YargsInstance; frozens: Array<Middleware[]> = []; constructor(yargs: YargsInstance) { this.yargs = yargs; } addMiddleware( callback: MiddlewareCallback | MiddlewareCallback[], applyBeforeValidation: boolean, global = true, mutates = false ): YargsInstance { argsert( '<array|function> [boolean] [boolean] [boolean]', [callback, applyBeforeValidation, global], arguments.length ); if (Array.isArray(callback)) { for (let i = 0; i < callback.length; i++) { if (typeof callback[i] !== 'function') { throw Error('middleware must be a function'); } const m = callback[i] as Middleware; m.applyBeforeValidation = applyBeforeValidation; m.global = global; } Array.prototype.push.apply( this.globalMiddleware, callback as Middleware[] ); } else if (typeof callback === 'function') { const m = callback as Middleware; m.applyBeforeValidation = applyBeforeValidation; m.global = global; m.mutates = mutates; this.globalMiddleware.push(callback as Middleware); } return this.yargs; } // For "coerce" middleware, only one middleware instance can be registered // per option: addCoerceMiddleware( callback: MiddlewareCallback, option: string ): YargsInstance { const aliases = this.yargs.getAliases(); this.globalMiddleware = this.globalMiddleware.filter(m => { const toCheck = [...(aliases[option] || []), option]; if (!m.option) return true; else return !toCheck.includes(m.option); }); (callback as Middleware).option = option; return this.addMiddleware(callback, true, true, true); } getMiddleware() { return this.globalMiddleware; } freeze() { this.frozens.push([...this.globalMiddleware]); } unfreeze() { const frozen = this.frozens.pop(); if (frozen !== undefined) this.globalMiddleware = frozen; } reset() { this.globalMiddleware = this.globalMiddleware.filter(m => m.global); }}
export function commandMiddlewareFactory( commandMiddleware?: MiddlewareCallback[]): Middleware[] { if (!commandMiddleware) return []; return commandMiddleware.map(middleware => { (middleware as Middleware).applyBeforeValidation = false; return middleware; }) as Middleware[];}
export function applyMiddleware( argv: Arguments | Promise<Arguments>, yargs: YargsInstance, middlewares: Middleware[], beforeValidation: boolean) { return middlewares.reduce<Arguments | Promise<Arguments>>( (acc, middleware) => { if (middleware.applyBeforeValidation !== beforeValidation) { return acc; }
if (middleware.mutates) { if (middleware.applied) return acc; middleware.applied = true; }
if (isPromise(acc)) { return acc .then(initialObj => Promise.all([initialObj, middleware(initialObj, yargs)]) ) .then(([initialObj, middlewareObj]) => Object.assign(initialObj, middlewareObj) ); } else { const result = middleware(acc, yargs); return isPromise(result) ? result.then(middlewareObj => Object.assign(acc, middlewareObj)) : Object.assign(acc, result); } }, argv );}
export interface MiddlewareCallback { (argv: Arguments, yargs: YargsInstance): | Partial<Arguments> | Promise<Partial<Arguments>>;}
export interface Middleware extends MiddlewareCallback { applyBeforeValidation: boolean; global: boolean; option?: string; mutates?: boolean; applied?: boolean;}
yargs

Version Info

Tagged at
a year ago