1- import {
2- Project ,
3- PropertySignature ,
4- SourceFile ,
5- CodeBlockWriter ,
6- IndentationText ,
7- } from "ts-morph" ;
1+ import { file_fig as file } from "@aws/amazon-q-developer-cli-proto/fig" ;
2+ import { CodeBlockWriter , IndentationText , Project } from "ts-morph" ;
83import { readFileSync } from "node:fs" ;
94import { join , dirname } from "node:path" ;
105import { fileURLToPath } from "node:url" ;
@@ -30,21 +25,13 @@ const normalize = (type: string): string => {
3025 return capitalizeFirstLetter ( normalized ) ;
3126} ;
3227
33- const getSubmessageTypes = ( bindings : SourceFile , interfaceName : string ) => {
34- const interfaceRef = bindings . getInterface ( interfaceName ) ! ;
35- const submessage = interfaceRef . getProperties ( ) [ 1 ] ;
36-
37- const submessageUnion = submessage
38- . getChildren ( )
39- . filter ( ( elm ) => elm . getKindName ( ) === "UnionType" ) [ 0 ] ;
40- const literals = submessageUnion
41- . getChildren ( ) [ 0 ]
42- . getChildren ( )
43- . filter ( ( elm ) => elm . getKindName ( ) === "TypeLiteral" ) ;
44- const types = literals
45- . map ( ( elm ) => elm . getChildren ( ) [ 1 ] )
46- . map ( ( elm ) => elm . getChildren ( ) [ 1 ] ) ;
47- return types . map ( ( prop ) => ( prop as PropertySignature ) . getName ( ) ) ;
28+ const getSubmessageTypes = ( interfaceName : string ) => {
29+ const message = file . messages . find (
30+ ( message ) => message . name === interfaceName ,
31+ ) ;
32+ return (
33+ message ?. fields . map ( ( type ) => type . message ?. name ! ) . filter ( Boolean ) ?? [ ]
34+ ) ;
4835} ;
4936
5037const writeGenericSendRequestWithResponseFunction = (
@@ -54,23 +41,23 @@ const writeGenericSendRequestWithResponseFunction = (
5441 const lowercasedEndpoint = lowercaseFirstLetter ( endpoint ) ;
5542
5643 const template = `export async function send${ endpoint } Request(
57- request: ${ endpoint } Request
44+ request: Omit< ${ endpoint } Request, "$typeName" | "$unknown">
5845): Promise<${ endpoint } Response> {
5946 return new Promise((resolve, reject) => {
6047 sendMessage(
61- { $ case: "${ lowercasedEndpoint } Request", ${ lowercasedEndpoint } Request: request },
48+ { case: "${ lowercasedEndpoint } Request", value: create( ${ endpoint } RequestSchema, request) },
6249 (response) => {
63- switch (response?.$ case) {
50+ switch (response?.case) {
6451 case "${ lowercasedEndpoint } Response":
65- resolve(response.${ lowercasedEndpoint } Response );
52+ resolve(response.value );
6653 break;
6754 case "error":
68- reject(Error(response.error ));
55+ reject(Error(response.value ));
6956 break;
7057 default:
7158 reject(
7259 Error(
73- \`Invalid response '\${response?.$ case}' for '${ endpoint } Request'\`
60+ \`Invalid response '\${response?.case}' for '${ endpoint } Request'\`
7461 )
7562 );
7663 }
@@ -89,23 +76,23 @@ const writeGenericSendRequestFunction = (
8976 const lowercasedEndpoint = lowercaseFirstLetter ( endpoint ) ;
9077
9178 const template = `export async function send${ endpoint } Request(
92- request: ${ endpoint } Request
79+ request: Omit< ${ endpoint } Request, "$typeName" | "$unknown">
9380): Promise<void> {
9481 return new Promise((resolve, reject) => {
9582 sendMessage(
96- { $ case: "${ lowercasedEndpoint } Request", ${ lowercasedEndpoint } Request: request },
83+ { case: "${ lowercasedEndpoint } Request", value: create( ${ endpoint } RequestSchema, request) },
9784 (response) => {
98- switch (response?.$ case) {
85+ switch (response?.case) {
9986 case "success":
10087 resolve();
10188 break;
10289 case "error":
103- reject(Error(response.error ));
90+ reject(Error(response.value ));
10491 break;
10592 default:
10693 reject(
10794 Error(
108- \`Invalid response '\${response?.$ case}' for '${ endpoint } Request'\`
95+ \`Invalid response '\${response?.case}' for '${ endpoint } Request'\`
10996 )
11097 );
11198 }
@@ -124,28 +111,20 @@ const project = new Project({
124111
125112project . addSourceFilesAtPaths ( join ( __dirname , "../src/*.ts" ) ) ;
126113
127- const text = readFileSync (
128- "node_modules/@aws/amazon-q-developer-cli-proto/dist/fig.pb.ts" ,
129- "utf8" ,
130- ) ;
131- const protobufBindings = project . createSourceFile ( "fig.pb.ts" , text ) ;
132-
133- const requestTypes = getSubmessageTypes (
134- protobufBindings ,
135- "ClientOriginatedMessage" ,
114+ const requestTypes = getSubmessageTypes ( "ClientOriginatedMessage" ) ;
115+ const responseTypes = getSubmessageTypes ( "ServerOriginatedMessage" ) . filter (
116+ ( type ) => type . includes ( "Response" ) ,
136117) ;
137- const responseTypes = getSubmessageTypes (
138- protobufBindings ,
139- "ServerOriginatedMessage" ,
140- ) . filter ( ( type ) => type . includes ( "Response" ) ) ;
141118
142119const [ requestsWithMatchingResponses , otherRequests ] = requestTypes
143120 . filter ( ( request ) => request !== "notificationRequest" )
144121 . reduce (
145122 ( result , request ) => {
146123 const [ matchingResponse , other ] = result ;
147124
148- const endpoint = lowercaseFirstLetter ( normalize ( request ) ) ;
125+ const endpoint = normalize ( request ) ;
126+
127+ console . log ( endpoint , requestTypes ) ;
149128
150129 if ( responseTypes . indexOf ( `${ endpoint } Response` ) !== - 1 ) {
151130 return [ matchingResponse . concat ( [ request ] ) , other ] ;
@@ -175,15 +154,31 @@ const sourceFile = project.createSourceFile(
175154 const responses = requestsWithMatchingResponses . map ( ( request ) =>
176155 request . replace ( "Request" , "Response" ) ,
177156 ) ;
178- const imports = requestsWithMatchingResponses
179- . concat ( responses )
180- . concat ( otherRequests )
157+ const requestSchemas = requestsWithMatchingResponses . map (
158+ ( s ) => `${ s } Schema` ,
159+ ) ;
160+ const otherRequestSchemas = otherRequests . map ( ( s ) => `${ s } Schema` ) ;
161+ const imports = [
162+ requestsWithMatchingResponses ,
163+ responses ,
164+ otherRequests ,
165+ requestSchemas ,
166+ otherRequestSchemas ,
167+ ]
168+ . flat ( )
181169 . sort ( )
182170 . map ( capitalizeFirstLetter ) ;
183171 writer . writeLine (
184172 `import { \n${ imports . join ( ",\n" ) } \n } from "@aws/amazon-q-developer-cli-proto/fig";` ,
185173 ) ;
186- writer . writeLine ( `import { sendMessage } from "./core.js";` ) . blankLine ( ) ;
174+ writer
175+ . writeLine (
176+ [
177+ 'import { sendMessage } from "./core.js";' ,
178+ 'import { create } from "@bufbuild/protobuf";' ,
179+ ] . join ( "\n" ) ,
180+ )
181+ . blankLine ( ) ;
187182
188183 requestsWithMatchingResponses . forEach ( ( request ) =>
189184 writeGenericSendRequestWithResponseFunction ( writer , normalize ( request ) ) ,
0 commit comments