Matey
Matey - ΠΌΠΎΠ΄ΡΠ»Ρ Π΄Π»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΠΊΠΎΠ½ΡΠΎΠ»ΡΠ½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ Ρ ΡΡΠ±ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ, Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ, ΠΎΠΏΡΠΈΡΠΌΠΈ ΠΈ ΡΠ»Π°Π³Π°ΠΌΠΈ.
Matey ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π΄Π²Π΅ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΡΡΠ½ΠΎΡΡΠΈ: Cli ΠΈ ComandBuilder. Cli - ΡΡΠΎ ΠΊΠ»Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΡΠ°Π½ΠΈΡ Π²ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅. CommandBuilder - ΡΡΠΎ ΠΊΠ»Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΈΡ Π² Cli ΠΈ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°ΡΡ ΠΈΡ (ΠΎΠΏΡΠΈΠΈ, ΡΠ»Π°Π³ΠΈ, Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ, ΡΡΠ±ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ Ρ.Π΄.).
ΠΠΎΠΌΠ°Π½Π΄Ρ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΌΠΈ, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ»ΡΠ½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΠ»Π°Π½ΠΈΡΡΠ΅ΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°.
ΠΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
Π‘Ρ Π΅ΠΌΠ°ΡΠΈΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ
π§ ΠΡΠ³ΡΠΌΠ΅Π½ΡΡ-ΠΎΠΏΡΠΈΠΈ(ΠΊΠΎΡΠΎΡΡΠ΅ Ρ ΡΠ°Π½ΡΡ ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅) ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π² Π²ΠΈΠ΄Π΅
const argA_1: ICommandArgument = {
name: 'argA_1',
description: 'argA_1 description',
type: ArgumentType.OPTION,
valueValidator: (val: string) => val.length > 0,
optionNameRequired: true,
required: true,
};
π© ΠΡΠ³ΡΠΌΠ΅Π½ΡΡ-ΡΠ»Π°Π³ΠΈ(Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΊΠΎΡΠΎΡΡΡ ΡΠ°ΠΌΠΎ ΠΏΠΎ ΡΠ΅Π±Π΅ Π²Π»ΠΈΡΠ΅Ρ Π½Π° Π»ΠΎΠ³ΠΈΠΊΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°) ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π² Π²ΠΈΠ΄Π΅
const argA_2: ICommandArgument = {
name: 'argA_2',
description: 'argA_2 description',
type: ArgumentType.FLAG,
required: false,
};
β‘ Π‘Π°ΠΌΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΡΡ ΡΠ°ΠΊ
const cmdA = new CliCommandBuilder()
.setName('cmdA')
.setDescription('cmdA description')
.addArgument(argA_1)
.addArgument(argA_2)
.addSubcommand(subA)
.setHandler(handlerA)
.build();
π‘οΈ ΠΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² Cli
ΠΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅ (middleware)
const cli = new Cli();
cli
.addCommand(cmdA)
.addCommand(cmdB)
.addCommand(cmdC)
.use(rexExpA, handlerA)
.use(rexExpB, handlerB);
π ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠ°ΠΊ
cli.execute`cmdA --argA_1 "Hello" --argA_2 150`;
ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ (ΠΎΡΠΏΡΠ°Π²ΠΊΠ° email)
ΠΠΎΠΌΠ°Π½Π΄Π° Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ email Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ²:
- email <email> <message>
- email βemail <email> βmsg <message>
ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π΄Π²Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°: βemail ΠΈ βmsg, Π·Π°ΡΠ΅ΠΌ Π±ΡΠ΄Π΅Ρ βΠΎΡΠΏΡΠ°Π²Π»ΡΡΡβ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡ Π°Π΄ΡΠ΅ΡΡ.
const emailHandler = (options: HandlerArgs) => {
console.log(
`Email sent to ${options['--email']} with message: ${
options['--msg']
}`,
);
};
ΠΠΎΠ±Π°Π²ΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ Π΅Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ CommandBuilder:
import {
ArgumentType,
Cli,
CliCommandBuilder,
HandlerArgs,
validateFunctions,
} from '../mod.ts';
const emailCommand = new CliCommandBuilder()
.setName('email')
.setDescription('Send an email to a specified email address')
.addArgument({
name: '--email',
description: 'The email address to send the email to',
type: ArgumentType.OPTION,
valueValidator: validateFunctions.emailValidate,
required: true,
})
.addArgument({
name: '--msg',
description: 'The message to include in the email',
type: ArgumentType.OPTION,
required: true,
})
.setHandler(emailHandler)
.build();
ΠΠΌΠ΅ΡΡΠΎ validateFunctions.emailValidate ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΡ ΡΡΠ½ΠΊΡΠΈΡ Π²ΠΈΠ΄Π° string => boolean
ΠΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Cli Ρ ΡΠ°Π½ΠΈΡ Π²ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅. ΠΠΎΠ±Π°Π²ΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π² Cli ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° addCommand, Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° execute:
const cli = new Cli();
cli.addCommand(emailCommand);
await cli.execute`email example@example.com "Hello, World!"`;
ΠΡΠΈΠΌΠ΅Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΊΠΎΠΌΠΌΠΈΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ OpenAI API.
Middleware
ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π΄ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π·Π°ΠΏΡΠΎΡ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ middleware-ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠ°Π½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ true/false. ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Π² ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ Π²ΡΠ΅ middleware-ΡΡΠ½ΠΊΡΠΈΠΈ Π²Π΅ΡΠ½ΡΠ»ΠΈ true. ΠΡΠ»ΠΈ Ρ ΠΎΡΡ Π±Ρ ΠΎΠ΄Π½Π° ΠΈΠ· Π½ΠΈΡ Π²Π΅ΡΠ½ΡΠ»Π° false, ΡΠ΅ΠΏΠΎΡΠΊΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΡΠ΅ΡΡΠ²Π°Π΅ΡΡΡ.
//middleware.ts
const helpMiddleware = {
pattern: / help /,
handler: (lexemes: ILexeme[]) => {
const toHelpCmds = lexemes.filter((lexeme) => {
return lexeme.type === LexemeType.COMMAND;
}).map((cmd) => cmd.content);
console.log(`Find commands ${toHelpCmds} `);
return false;
},
};