@@ -70,3 +70,77 @@ describe('dispatchSubcommand', () => {
7070 expect ( await dispatchExists ( join ( dispatchTmpDir , 'src/app-extensions/panel/index.ts' ) ) ) . toBe ( true ) ;
7171 } ) ;
7272} ) ;
73+
74+ describe ( 'parseFlags' , ( ) => {
75+ it ( 'returns empty partial when no flags are present' , async ( ) => {
76+ const { parseFlags } = await import ( './cli.js' ) ;
77+ expect ( parseFlags ( [ 'node' , 'cli.js' ] ) ) . toEqual ( { } ) ;
78+ } ) ;
79+
80+ it ( 'parses --project-name' , async ( ) => {
81+ const { parseFlags } = await import ( './cli.js' ) ;
82+ expect ( parseFlags ( [ 'node' , 'cli.js' , '--project-name' , 'my-app' ] ) ) . toMatchObject ( { nameOrPath : 'my-app' } ) ;
83+ } ) ;
84+
85+ it ( 'parses --database postgres' , async ( ) => {
86+ const { parseFlags } = await import ( './cli.js' ) ;
87+ expect ( parseFlags ( [ 'node' , 'cli.js' , '--database' , 'postgres' ] ) ) . toMatchObject ( { database : 'postgres' } ) ;
88+ } ) ;
89+
90+ it ( 'parses --database mysql' , async ( ) => {
91+ const { parseFlags } = await import ( './cli.js' ) ;
92+ expect ( parseFlags ( [ 'node' , 'cli.js' , '--database' , 'mysql' ] ) ) . toMatchObject ( { database : 'mysql' } ) ;
93+ } ) ;
94+
95+ it ( 'parses --database sqlite' , async ( ) => {
96+ const { parseFlags } = await import ( './cli.js' ) ;
97+ expect ( parseFlags ( [ 'node' , 'cli.js' , '--database' , 'sqlite' ] ) ) . toMatchObject ( { database : 'sqlite' } ) ;
98+ } ) ;
99+
100+ it ( 'throws on invalid --database' , async ( ) => {
101+ const { parseFlags } = await import ( './cli.js' ) ;
102+ expect ( ( ) => parseFlags ( [ 'node' , 'cli.js' , '--database' , 'oracle' ] ) ) . toThrow (
103+ 'Invalid database "oracle". Choose one of: postgres, mysql, sqlite.' ,
104+ ) ;
105+ } ) ;
106+
107+ it ( 'parses --app-extensions none as empty array' , async ( ) => {
108+ const { parseFlags } = await import ( './cli.js' ) ;
109+ expect ( parseFlags ( [ 'node' , 'cli.js' , '--app-extensions' , 'none' ] ) ) . toMatchObject ( { appExtensions : [ ] } ) ;
110+ } ) ;
111+
112+ it ( 'parses --app-extensions custom-panel' , async ( ) => {
113+ const { parseFlags } = await import ( './cli.js' ) ;
114+ expect ( parseFlags ( [ 'node' , 'cli.js' , '--app-extensions' , 'custom-panel' ] ) ) . toMatchObject ( {
115+ appExtensions : [ 'custom-panel' ] ,
116+ } ) ;
117+ } ) ;
118+
119+ it ( 'parses --app-extensions custom-panel,custom-modal' , async ( ) => {
120+ const { parseFlags } = await import ( './cli.js' ) ;
121+ expect ( parseFlags ( [ 'node' , 'cli.js' , '--app-extensions' , 'custom-panel,custom-modal' ] ) ) . toMatchObject ( {
122+ appExtensions : [ 'custom-panel' , 'custom-modal' ] ,
123+ } ) ;
124+ } ) ;
125+
126+ it ( 'throws on invalid --app-extensions value' , async ( ) => {
127+ const { parseFlags } = await import ( './cli.js' ) ;
128+ expect ( ( ) => parseFlags ( [ 'node' , 'cli.js' , '--app-extensions' , 'custom-widget' ] ) ) . toThrow (
129+ 'Invalid app extension type "custom-widget". Choose from: custom-panel, custom-modal.' ,
130+ ) ;
131+ } ) ;
132+
133+ it ( 'throws on --project-name with empty value' , async ( ) => {
134+ const { parseFlags } = await import ( './cli.js' ) ;
135+ expect ( ( ) => parseFlags ( [ 'node' , 'cli.js' , '--project-name' , ' ' ] ) ) . toThrow (
136+ '--project-name cannot be empty.' ,
137+ ) ;
138+ } ) ;
139+
140+ it ( 'parses all three flags together' , async ( ) => {
141+ const { parseFlags } = await import ( './cli.js' ) ;
142+ expect (
143+ parseFlags ( [ 'node' , 'cli.js' , '--project-name' , 'my-app' , '--database' , 'sqlite' , '--app-extensions' , 'none' ] ) ,
144+ ) . toEqual ( { nameOrPath : 'my-app' , database : 'sqlite' , appExtensions : [ ] } ) ;
145+ } ) ;
146+ } ) ;
0 commit comments