@@ -113,27 +113,27 @@ private void generateEndpointParameters() {
113113 writer -> {
114114 writer .addImport ("EndpointParameters" , "__EndpointParameters" , TypeScriptDependency .SMITHY_TYPES );
115115 writer .addImport ("Provider" , null , TypeScriptDependency .SMITHY_TYPES );
116+ Map <String , String > clientContextParams =
117+ ruleSetParameterFinder .getClientContextParams ();
118+ Map <String , String > builtInParams = ruleSetParameterFinder .getBuiltInParams ();
119+ builtInParams .keySet ().removeIf (OmitEndpointParams ::isOmitted );
120+ Set <String > knownConfigKeys = Set .of (
121+ "apiKey" , "retryStrategy" , "requestHandler" );
122+ // Generate clientContextParams with all params excluding built-ins
123+ Map <String , String > customerContextParams = new HashMap <>();
124+ for (Map .Entry <String , String > entry : clientContextParams .entrySet ()) {
125+ if (!builtInParams .containsKey (entry .getKey ())) {
126+ customerContextParams .put (entry .getKey (), entry .getValue ());
127+ }
128+ }
116129
117130 writer .writeDocs ("@public" );
118131 writer .openBlock (
119132 "export interface ClientInputEndpointParameters {" ,
120133 "}" ,
121134 () -> {
122- Map <String , String > clientContextParams =
123- ruleSetParameterFinder .getClientContextParams ();
124- Map <String , String > builtInParams = ruleSetParameterFinder .getBuiltInParams ();
125- builtInParams .keySet ().removeIf (OmitEndpointParams ::isOmitted );
126- Set <String > knownConfigKeys = Set .of (
127- "apiKey" , "retryStrategy" , "requestHandler" );
128- // Generate clientContextParams with all params excluding built-ins
129- Map <String , String > customerContextParams = new HashMap <>();
130- for (Map .Entry <String , String > entry : clientContextParams .entrySet ()) {
131- if (!builtInParams .containsKey (entry .getKey ())) {
132- customerContextParams .put (entry .getKey (), entry .getValue ());
133- }
134- }
135135 if (!customerContextParams .isEmpty ()) {
136- writer .write ("clientContextParams: {" );
136+ writer .write ("clientContextParams? : {" );
137137 writer .indent ();
138138 ObjectNode ruleSet = endpointRuleSetTrait .getRuleSet ().expectObjectNode ();
139139 ruleSet .getObjectMember ("parameters" ).ifPresent (parameters -> {
@@ -160,44 +160,31 @@ private void generateEndpointParameters() {
160160 );
161161
162162 writer .write ("" );
163- writer .openBlock (
164- """
165- export type ClientResolvedEndpointParameters = Omit<ClientInputEndpointParameters, "endpoint"> & {
166- """ ,
163+ // Build Omit type - omit endpoint, and clientContextParams if exists
164+ String omitFields = customerContextParams .isEmpty ()
165+ ? "\" endpoint\" "
166+ : "\" endpoint\" | \" clientContextParams\" " ;
167+ writer .openBlock (
168+ "export type ClientResolvedEndpointParameters = "
169+ + "Omit<ClientInputEndpointParameters, " + omitFields + "> & {" ,
167170 "};" ,
168171 () -> {
169172 writer .write ("defaultSigningName: string;" );
170- // Add clientContextParams with same structure as input
171- Map <String , String > clientContextParams = ruleSetParameterFinder .getClientContextParams ();
172- Map <String , String > customerContextParams = new HashMap <>();
173- Map <String , String > builtInParams = ruleSetParameterFinder .getBuiltInParams ();
174- for (Map .Entry <String , String > entry : clientContextParams .entrySet ()) {
175- if (!builtInParams .containsKey (entry .getKey ())) {
176- customerContextParams .put (entry .getKey (), entry .getValue ());
177- }
178- }
173+ // Add clientContextParams with same types as input
179174 if (!customerContextParams .isEmpty ()) {
180175 writer .write ("clientContextParams: {" );
181176 writer .indent ();
182177 ObjectNode ruleSet = endpointRuleSetTrait .getRuleSet ().expectObjectNode ();
183178 ruleSet .getObjectMember ("parameters" ).ifPresent (parameters -> {
184179 parameters .accept (new RuleSetParametersVisitor (
185- writer , customerContextParams , false ));
180+ writer , customerContextParams , true ));
186181 });
187182 writer .dedent ();
188183 writer .write ("};" );
189184 }
190185 }
191186 );
192187 // Generate clientContextParamDefaults only if there are customer context params
193- Map <String , String > clientContextParams = ruleSetParameterFinder .getClientContextParams ();
194- Map <String , String > builtInParams = ruleSetParameterFinder .getBuiltInParams ();
195- Map <String , String > customerContextParams = new HashMap <>();
196- for (Map .Entry <String , String > entry : clientContextParams .entrySet ()) {
197- if (!builtInParams .containsKey (entry .getKey ())) {
198- customerContextParams .put (entry .getKey (), entry .getValue ());
199- }
200- }
201188 if (!customerContextParams .isEmpty ()) {
202189 // Check if any parameters have default values
203190 boolean hasDefaults = false ;
@@ -253,6 +240,34 @@ private void generateEndpointParameters() {
253240 "defaultSigningName: \" $L\" ," ,
254241 settings .getDefaultSigningName ()
255242 );
243+ // Only generate clientContextParams if there are customer context params
244+ if (!customerContextParams .isEmpty ()) {
245+ // Initialize clientContextParams if undefined to satisfy type requirements
246+ // Check if we have defaults to merge
247+ boolean hasDefaultsForResolve = false ;
248+ if (ruleSet .getObjectMember ("parameters" ).isPresent ()) {
249+ ObjectNode parameters = ruleSet .getObjectMember ("parameters" )
250+ .get ().expectObjectNode ();
251+ for (Map .Entry <String , String > entry : customerContextParams .entrySet ()) {
252+ String paramName = entry .getKey ();
253+ ObjectNode paramNode = parameters .getObjectMember (paramName ).orElse (null );
254+ if (paramNode != null && paramNode .containsMember ("default" )) {
255+ hasDefaultsForResolve = true ;
256+ break ;
257+ }
258+ }
259+ }
260+ if (hasDefaultsForResolve ) {
261+ writer .write (
262+ "clientContextParams: Object.assign(clientContextParamDefaults, "
263+ + "options.clientContextParams ?? {}),"
264+ );
265+ } else {
266+ writer .write (
267+ "clientContextParams: options.clientContextParams ?? {},"
268+ );
269+ }
270+ }
256271 });
257272 }
258273 );
0 commit comments