55 * @copyright : Copyright (c) 2022-present Qiubin Zheng
66 */
77
8- import { CompleteInput , SearchCheckbox , SearchList , style } from '@cz-git/inquirer'
8+ import { CompleteInput , SearchCheckbox , SearchList } from '@cz-git/inquirer'
99import { configLoader } from '@cz-git/loader'
1010import { editCommit , log , previewMessage } from './shared'
11- import { generateAIConfirmQuestions , generateAISubjects , generateAISubjectsQuestions , generateAITypesQuestions , generateMessage , generateOptions , generateQuestions , getAliasMessage } from './generator'
12- import type { CommitizenType } from './shared'
11+ import { generateAIPrompt , generateMessage , generateOptions , generateQuestions , getAliasMessage } from './generator'
12+ import type { Answers , CommitizenGitOptions , CommitizenType } from './shared'
1313
1414export * from './shared/types'
1515export * from '@cz-git/inquirer'
@@ -35,55 +35,86 @@ export const prompter = (
3535 cz . registerPrompt ( 'complete-input' , CompleteInput )
3636
3737 let answers
38- if ( options . useAI ) {
39- answers = await cz . prompt ( generateAITypesQuestions ( options ) )
40- console . log ( style . green ( 'ℹ' ) , style . bold ( options . messages ! . generatingByAI ) )
41- // Power By and Modified part of the code: https://github.com/Nutlope/aicommits
42- const subjects = await generateAISubjects ( answers , options )
43- if ( ! Array . isArray ( subjects ) )
44- throw new Error ( 'subjects fetch value failed' )
45-
46- if ( subjects . length === 1 ) {
47- answers . subject = subjects [ 0 ]
48- }
49- else {
50- const { subject } = await cz . prompt ( generateAISubjectsQuestions ( options , subjects ) )
51- answers . subject = subject
38+ if ( options . useAI )
39+ answers = await generateAIPrompt ( options , cz )
40+ else
41+ answers = await cz . prompt ( generateQuestions ( options , cz ) )
42+
43+ answers = await generateConfirmPrompt ( options , cz , answers )
44+
45+ await confirmMessage ( options , cz , answers , commit )
46+ } )
47+ }
48+
49+ async function generateConfirmPrompt ( options : CommitizenGitOptions , cz : CommitizenType , answers : Answers ) {
50+ const result = answers
51+ if ( options . skipQuestions ?. includes ( 'confirmCommit' ) ) {
52+ previewMessage (
53+ generateMessage ( answers , options , options . confirmColorize ) ,
54+ options . confirmColorize ,
55+ )
56+ result . confirmCommit = 'yes'
57+ }
58+ else {
59+ const question : any = [
60+ {
61+ type : 'expand' ,
62+ name : 'confirmCommit' ,
63+ choices : [
64+ { key : 'y' , name : 'Yes' , value : 'yes' } ,
65+ { key : 'n' , name : 'Abort commit' , value : 'no' } ,
66+ { key : 'e' , name : 'Edit message(wq: save, cq: exit)' , value : 'edit' } ,
67+ ] ,
68+ default : 0 ,
69+ message ( ) {
70+ previewMessage (
71+ generateMessage ( answers , options , options . confirmColorize ) ,
72+ options . confirmColorize ,
73+ )
74+ return options . messages ?. confirmCommit
75+ } ,
76+ } ,
77+ ]
78+ if ( options . useAI )
79+ question [ 0 ] . choices . push ( { key : 'm' , name : 'Modify and additional message with prompt' , value : 'ai-modify' } )
80+
81+ const { confirmCommit } = await cz . prompt ( question )
82+ result . confirmCommit = confirmCommit
83+ }
84+
85+ return result
86+ }
87+
88+ async function confirmMessage ( options : CommitizenGitOptions , cz : CommitizenType , answers : Answers , commit : ( message : string ) => void ) {
89+ switch ( answers . confirmCommit ) {
90+ case 'edit' :
91+ editCommit ( answers , options , commit )
92+ break
93+
94+ case 'ai-modify' : {
95+ options . defaultType = answers . type
96+ options . defaultSubject = answers . subject
97+ let question = generateQuestions ( options , cz )
98+ if ( question ) {
99+ question . shift ( )
100+ const scopeIdx = 2
101+ question = [ question [ scopeIdx ] , ...question . slice ( 0 , scopeIdx ) , ...question . slice ( scopeIdx + 1 ) ]
52102 }
103+ answers = await cz . prompt ( question )
53104
54- if ( options . defaultScope )
55- answers . scope = options . defaultScope
56- }
57- else {
58- const questions = generateQuestions ( options , cz )
59- answers = await cz . prompt ( questions )
105+ options . useAI = false
106+ answers . type = options . defaultType
107+ answers = await generateConfirmPrompt ( options , cz , answers )
108+ confirmMessage ( options , cz , answers , commit )
109+ break
60110 }
61111
62- if ( options . skipQuestions ?. includes ( 'confirmCommit' ) ) {
112+ case 'yes' :
63113 commit ( generateMessage ( answers , options ) )
64- previewMessage (
65- generateMessage ( answers , options , options . confirmColorize ) ,
66- options . confirmColorize ,
67- )
68- return 0
69- }
70- else {
71- // @ts -expect-error
72- const { confirmCommit } = await cz . prompt ( generateAIConfirmQuestions ( options , answers ) )
73- answers . confirmCommit = confirmCommit
74- }
75- switch ( answers . confirmCommit ) {
76- case 'edit' :
77- editCommit ( answers , options , commit )
78- break
79-
80- case 'yes' :
81- commit ( generateMessage ( answers , options ) )
82- break
83-
84- default :
85- log ( 'info' , 'Commit has been canceled.' )
86- break
87- }
88- } )
114+ break
115+
116+ default :
117+ log ( 'info' , 'Commit has been canceled.' )
118+ break
119+ }
89120}
0 commit comments