33import { Project } from 'ts-morph' ;
44import { createClient } from '@/lib/supabase/server' ;
55import type { Database } from '@/app/__generated__/supabase.types' ;
6+ import { ActionResponse } from '@/types/action-response' ;
7+ import { createErrorResponse , createSuccessResponse } from '@/utils/action-helpers' ;
68
7- export async function generateTypes ( ) {
9+ export async function generateTypes ( ) : Promise <
10+ ActionResponse < { content : string ; filename : string } >
11+ > {
812 // Initialize project and create source file
913 const project = new Project ( ) ;
1014 const sourceFile = project . createSourceFile ( 'agentsmith.types.ts' , '' , {
@@ -20,126 +24,111 @@ export async function generateTypes() {
2024
2125 // Fetch prompts from Supabase
2226 const supabase = await createClient ( ) ;
23- const { data : prompts , error } = await supabase
24- . from ( 'prompts' )
25- . select (
26- `
27+ try {
28+ const { data : prompts , error } = await supabase
29+ . from ( 'prompts' )
30+ . select (
31+ `
2732 *,
2833 prompt_versions(*, prompt_variables(*))
29- `
30- )
31- . order ( 'created_at' , { ascending : false } ) ;
34+ ` ,
35+ )
36+ . order ( 'created_at' , { ascending : false } ) ;
3237
33- if ( error ) {
34- console . error ( 'Error fetching prompts:' , error ) ;
35- return {
36- content : '// Error generating types: ' + error . message ,
37- filename : 'agentsmith.types.ts' ,
38- } ;
39- }
38+ if ( error ) {
39+ console . error ( 'Error fetching prompts:' , error ) ;
40+ return createErrorResponse ( 'Error generating types: ' + error . message ) ;
41+ }
4042
41- // Process prompts to get the latest version and variables
42- const processedPrompts = prompts . map ( ( prompt ) => {
43- const versions = prompt . prompt_versions || [ ] ;
44- // Sort versions by created_at in descending order
45- const sortedVersions = [ ...versions ] . sort (
46- ( a , b ) =>
47- new Date ( b . created_at ) . getTime ( ) - new Date ( a . created_at ) . getTime ( )
48- ) ;
43+ // Process prompts to get the latest version and variables
44+ const processedPrompts = prompts . map ( ( prompt ) => {
45+ const versions = prompt . prompt_versions || [ ] ;
46+ // Sort versions by created_at in descending order
47+ const sortedVersions = [ ...versions ] . sort (
48+ ( a , b ) => new Date ( b . created_at ) . getTime ( ) - new Date ( a . created_at ) . getTime ( ) ,
49+ ) ;
4950
50- const latestVersion = sortedVersions . length > 0 ? sortedVersions [ 0 ] : null ;
51- const variables = latestVersion ?. prompt_variables || [ ] ;
51+ const latestVersion = sortedVersions . length > 0 ? sortedVersions [ 0 ] : null ;
52+ const variables = latestVersion ?. prompt_variables || [ ] ;
5253
53- return {
54- id : prompt . id ,
55- name : prompt . name ,
56- slug : prompt . uuid ,
57- content : latestVersion ?. content || '' ,
58- version : latestVersion ?. version || '1.0.0' ,
59- variables : variables . map ( ( v ) => ( {
60- name : v . name ,
61- type : v . type ,
62- required : v . required ,
63- } ) ) ,
64- } ;
65- } ) ;
54+ return {
55+ id : prompt . id ,
56+ name : prompt . name ,
57+ slug : prompt . uuid ,
58+ content : latestVersion ?. content || '' ,
59+ version : latestVersion ?. version || '1.0.0' ,
60+ variables : variables . map ( ( v ) => ( {
61+ name : v . name ,
62+ type : v . type ,
63+ required : v . required ,
64+ } ) ) ,
65+ } ;
66+ } ) ;
6667
67- // Add PromptSlug type
68- const promptSlugs =
69- processedPrompts . map ( ( p ) => `'${ p . slug } '` ) . join ( ' | ' ) ||
70- "'no_prompts_found'" ;
68+ // Add PromptSlug type
69+ const promptSlugs =
70+ processedPrompts . map ( ( p ) => `'${ p . slug } '` ) . join ( ' | ' ) || "'no_prompts_found'" ;
7171
72- sourceFile . addTypeAlias ( {
73- name : 'PromptSlug' ,
74- isExported : true ,
75- type : promptSlugs ,
76- } ) ;
72+ sourceFile . addTypeAlias ( {
73+ name : 'PromptSlug' ,
74+ isExported : true ,
75+ type : promptSlugs ,
76+ } ) ;
7777
78- // Add Prompt type
79- sourceFile . addTypeAlias ( {
80- name : 'Prompt' ,
81- isExported : true ,
82- type : `{
83- id: number;
84- name: string;
85- content: string;
86- version: string;
87- variables: PromptVariable[];
88- slug: PromptSlug;
89- }` ,
90- } ) ;
78+ // Add Prompt type
79+ sourceFile . addTypeAlias ( {
80+ name : 'Prompt' ,
81+ isExported : true ,
82+ type : `{\n id: number;\n name: string;\n content: string;\n version: string;\n variables: PromptVariable[];\n slug: PromptSlug;\n }` ,
83+ } ) ;
9184
92- // Add PromptVariable type
93- sourceFile . addTypeAlias ( {
94- name : 'PromptVariable' ,
95- isExported : true ,
96- type : `{
97- name: string;
98- type: string;
99- required: boolean;
100- }` ,
101- } ) ;
85+ // Add PromptVariable type
86+ sourceFile . addTypeAlias ( {
87+ name : 'PromptVariable' ,
88+ isExported : true ,
89+ type : `{\n name: string;\n type: string;\n required: boolean;\n }` ,
90+ } ) ;
10291
103- // Add Agency type with strict typing based on actual prompts
104- sourceFile . addTypeAlias ( {
105- name : 'Agency' ,
106- isExported : true ,
107- type : ( writer ) => {
108- writer . block ( ( ) => {
109- writer
110- . write ( 'prompts: ' )
111- . block ( ( ) => {
112- processedPrompts . forEach ( ( prompt ) => {
113- writer . write (
114- `'${ prompt . slug } ': Prompt & {
115- id: ${ prompt . id } ;
116- name: '${ prompt . name } ';
117- content: string;
118- version: '${ prompt . version } ';
119- variables: [${ prompt . variables
92+ // Add Agency type with strict typing based on actual prompts
93+ sourceFile . addTypeAlias ( {
94+ name : 'Agency' ,
95+ isExported : true ,
96+ type : ( writer ) => {
97+ writer . block ( ( ) => {
98+ writer
99+ . write ( 'prompts: ' )
100+ . block ( ( ) => {
101+ processedPrompts . forEach ( ( prompt ) => {
102+ writer . write (
103+ `'${ prompt . slug } ': Prompt & { \n id: ${ prompt . id } ; \n name: '${ prompt . name } '; \n content: string;\n version: '${ prompt . version } ';\n variables: [${ prompt . variables
120104 . map (
121- ( v ) => `{
122- name: '${ v . name } ',
123- type: '${ v . type } ',
124- required: ${ v . required }
125- }`
105+ (
106+ v ,
107+ ) => `{ \n name: '${ v . name } ', \n type: '${ v . type } ',
108+ required: ${ v . required } \n }` ,
126109 )
127- . join ( ', ' ) } ];
128- slug: ' ${ prompt . slug } ';
129- } ;\n`
130- ) ;
131- } ) ;
132- } )
133- . write ( ';\n' ) ;
134- } ) ;
135- } ,
136- } ) ;
110+ . join (
111+ ', ' ,
112+ ) } ] ;\n slug: ' ${ prompt . slug } ';\n };\n` ,
113+ ) ;
114+ } ) ;
115+ } )
116+ . write ( ';\n' ) ;
117+ } ) ;
118+ } ,
119+ } ) ;
137120
138- // Format the source file
139- sourceFile . formatText ( ) ;
121+ // Format the source file
122+ sourceFile . formatText ( ) ;
140123
141- return {
142- content : sourceFile . getFullText ( ) ,
143- filename : 'agentsmith.types.ts' ,
144- } ;
124+ return createSuccessResponse (
125+ {
126+ content : sourceFile . getFullText ( ) ,
127+ filename : 'agentsmith.types.ts' ,
128+ } ,
129+ 'Types generated successfully.' ,
130+ ) ;
131+ } catch ( error ) {
132+ return createErrorResponse ( error instanceof Error ? error . message : 'Type generation failed' ) ;
133+ }
145134}
0 commit comments