AtsTypeScriptCodeGenerator.cs (528)
189WriteLine($"{indent}/** {lines[0]} */");
193WriteLine($"{indent}/**");
196WriteLine(line.Length == 0 ? $"{indent} *" : $"{indent} * {line}");
198WriteLine($"{indent} */");
446WriteLine("""
497WriteLine();
575WriteLine("// ============================================================================");
576WriteLine("// Handle Type Aliases (Internal - not exported to users)");
577WriteLine("// ============================================================================");
578WriteLine();
586WriteLine($"type {handleName} = Handle<'{typeId}'>;");
587WriteLine();
610WriteLine("// ============================================================================");
611WriteLine("// Enum Types");
612WriteLine("// ============================================================================");
613WriteLine();
618WriteLine($"export enum {enumType.Name} {{");
628WriteLine($" {value.Name} = \"{value.Name}\",");
631WriteLine("}");
632WriteLine();
650WriteLine("// ============================================================================");
651WriteLine("// DTO Interfaces");
652WriteLine("// ============================================================================");
653WriteLine();
660WriteLine($"export interface {interfaceName} {{");
671WriteLine($" {propName}?: {tsType};");
678WriteLine($" /** {clientOnly.Summary} */");
679WriteLine($" {clientOnly.Name}?: {clientOnly.Type};");
682WriteLine("}");
683WriteLine();
696WriteLine("// ============================================================================");
697WriteLine("// Exported Values");
698WriteLine("// ============================================================================");
699WriteLine();
703WriteLine(exportedNamespace.Content);
704WriteLine();
718WriteLine("// ============================================================================");
719WriteLine("// Options Interfaces");
720WriteLine("// ============================================================================");
721WriteLine();
725WriteLine($"export interface {interfaceName} {{");
730WriteLine($" {param.Name}?: {tsType};");
732WriteLine("}");
733WriteLine();
741WriteLine($" {propertyName}(): {returnType};");
759WriteLine($" readonly {propertyName}: AspireDict<{keyType}, {valueType}>;");
767WriteLine($" readonly {propertyName}: AspireList<{elementType}>;");
773WriteLine($" {propertyName}: {{");
779WriteLine($" get: () => {promiseInterfaceName};");
784WriteLine($" get: () => Promise<{returnTypeName}>;");
794WriteLine($" set: (value: {valueType}) => Promise<void>;");
798WriteLine(" };");
805WriteLine("// ============================================================================");
806WriteLine($"// {interfaceName}");
807WriteLine("// ============================================================================");
808WriteLine();
810WriteLine($"export interface {interfaceName} {{");
811WriteLine(" toJSON(): MarshalledHandle;");
836WriteLine($" {capability.MethodName}({signature.ParameterList}): {promiseInterfaceName};");
841WriteLine($" {capability.MethodName}({signature.ParameterList}): Promise<{returnType}>;");
846WriteLine($" {capability.MethodName}({signature.ParameterList}): {_projector.GetBuilderPromiseInterfaceForMethod(builder, capability)};");
850WriteLine("}");
851WriteLine();
873WriteLine($"export interface {promiseInterfaceName} extends PromiseLike<{interfaceName}> {{");
890WriteLine($" {capability.MethodName}({signature.ParameterList}): {returnPromiseInterfaceName};");
895WriteLine($" {capability.MethodName}({signature.ParameterList}): Promise<{returnType}>;");
900WriteLine($" {capability.MethodName}({signature.ParameterList}): {_projector.GetBuilderPromiseInterfaceForMethod(builder, capability)};");
904WriteLine("}");
905WriteLine();
916WriteLine($" {signature.MethodName}({signature.ParameterList}): {_projector.GetPublicPromiseInterfaceName(capability.ReturnType.TypeId)};");
920WriteLine($" {signature.MethodName}({signature.ParameterList}): {TypeScriptApiProjector.GetPromiseInterfaceName(className)};");
925WriteLine($" {signature.MethodName}({signature.ParameterList}): Promise<{returnType}>;");
934WriteLine("// ============================================================================");
935WriteLine($"// {interfaceName}");
936WriteLine("// ============================================================================");
937WriteLine();
939WriteLine($"export interface {interfaceName} {{");
940WriteLine(" toJSON(): MarshalledHandle;");
963WriteLine("}");
964WriteLine();
972WriteLine($"export interface {promiseInterfaceName} extends PromiseLike<{interfaceName}> {{");
981WriteLine("}");
982WriteLine();
992WriteLine("// ============================================================================");
993WriteLine($"// {implementationClassName}");
994WriteLine("// ============================================================================");
995WriteLine();
1001WriteLine($"class {implementationClassName} extends ResourceBuilderBase<{handleType}> implements {builder.BuilderClassName} {{");
1004WriteLine($" constructor(handle: {handleType}, client: AspireClientRpc) {{");
1005WriteLine($" super(handle, client);");
1006WriteLine(" }");
1007WriteLine();
1031WriteLine("}");
1032WriteLine();
1130WriteLine($"): {returnPromiseInterfaceName} {{");
1131WriteLine(" const promise = (async () => {");
1136WriteLine($" {(_projector.IsWidenedHandleType(param.Type) ? "let" : "const")} {localParameterName} = {publicOptionsParamName}?.{param.Name};");
1148WriteLine($" const handle = await this._client.invokeCapability<{returnHandleType}>(");
1149WriteLine($" '{capability.CapabilityId}',");
1150WriteLine(" rpcArgs");
1151WriteLine(" );");
1152WriteLine($" return new {returnImplementationClassNameForWrapper}(handle, this._client);");
1153WriteLine(" })();");
1154WriteLine($" return new {returnPromiseImplementationClassName}(promise, this._client);");
1155WriteLine(" }");
1156WriteLine();
1166WriteLine($"): Promise<{returnType}> {{");
1172WriteLine($" {(_projector.IsWidenedHandleType(param.Type) ? "let" : "const")} {localParameterName} = {publicOptionsParamName}?.{param.Name};");
1190WriteLine(" const result = await this._client.invokeCapability<string | null>(");
1191WriteLine($" '{capability.CapabilityId}',");
1192WriteLine(" rpcArgs");
1193WriteLine(" );");
1194WriteLine(" return CancellationToken.fromValue(result);");
1198WriteLine($" return await this._client.invokeCapability<{returnType}>(");
1199WriteLine($" '{capability.CapabilityId}',");
1200WriteLine($" rpcArgs");
1201WriteLine(" );");
1203WriteLine(" }");
1204WriteLine();
1209WriteLine($" /** @internal */");
1213WriteLine();
1230WriteLine($" const result = await this._client.invokeCapability<{returnHandle}>(");
1231WriteLine($" '{capability.CapabilityId}',");
1232WriteLine($" rpcArgs");
1233WriteLine(" );");
1234WriteLine($" return new {returnImplementationClassName}(result, this._client);");
1238WriteLine($" await this._client.invokeCapability<void>(");
1239WriteLine($" '{capability.CapabilityId}',");
1240WriteLine($" rpcArgs");
1241WriteLine(" );");
1242WriteLine($" return this;");
1244WriteLine(" }");
1245WriteLine();
1254WriteLine();
1260WriteLine($" {(_projector.IsWidenedHandleType(param.Type) ? "let" : "const")} {localParameterName} = {publicOptionsParamName}?.{param.Name};");
1273WriteLine($" const flushAndBuild = async () => {{ await this._client.flushPendingPromises(); return {internalCall}; }};");
1277WriteLine($" return new {promiseImplementationClass}(flushAndBuild(), this._client, false);");
1281WriteLine($" return new {promiseImplementationClass}({internalCall}, this._client);");
1283WriteLine(" }");
1284WriteLine();
1311WriteLine($"{indent}{param.Name} = isPromiseLike({param.Name}) ? await {param.Name} : {param.Name};");
1330WriteLine($"{indent}{paramName} = isPromiseLike({paramName}) ? await {paramName} : {paramName};");
1372WriteLine($"{indent}const rpcArgs: Record<string, unknown> = {{ {string.Join(", ", requiredArgs)} }};");
1379WriteLine($"{indent}if ({localParameterName} !== undefined) rpcArgs.{param.Name} = {rpcExpression};");
1405WriteLine($"{indent}const rpcArgs: Record<string, unknown> = {{ {string.Join(", ", requiredArgs)} }};");
1412WriteLine($"{indent}if ({localParameterName} !== undefined) rpcArgs.{param.Name} = {rpcExpression};");
1439WriteLine($"{indent}const {dtoRpcLocalName} = {localParameterName} === undefined || {localParameterName} === null ? {localParameterName} : {{ ...{localParameterName} }};");
1440WriteLine($"{indent}if ({dtoRpcLocalName} !== undefined && {dtoRpcLocalName} !== null) {{");
1442WriteLine($"{indent}}}");
1446WriteLine($"{indent}const {dtoRpcLocalName} = {localParameterName} === null ? {localParameterName} : {{ ...{localParameterName} }};");
1447WriteLine($"{indent}if ({dtoRpcLocalName} !== null) {{");
1449WriteLine($"{indent}}}");
1462WriteLine($"{indent}const {dtoDataLocalName} = {dtoRpcLocalName} as Record<string, unknown>;");
1470WriteLine($"{indent}const {callbackLocalName} = {dtoRpcLocalName}.{propertyName};");
1471WriteLine($"{indent}if ({callbackLocalName} !== undefined) {{");
1473WriteLine($"{indent} {dtoDataLocalName}[\"{propertyName}\"] = {callbackLocalName}Id;");
1474WriteLine($"{indent}}}");
1506WriteLine($"{indent}const {dtoPropertyLocalName} = {dtoRpcLocalName}.{propertyName};");
1507WriteLine($"{indent}if ({dtoPropertyLocalName} !== undefined && {dtoPropertyLocalName} !== null) {{");
1508WriteLine($"{indent} const {nestedDtoRpcLocalName} = {{ ...{dtoPropertyLocalName} }};");
1510WriteLine($"{indent} {dtoDataLocalName}[\"{propertyName}\"] = {nestedDtoRpcLocalName};");
1511WriteLine($"{indent}}}");
1572WriteLine($"/**");
1573WriteLine($" * Thenable wrapper for {builder.BuilderClassName} that enables fluent chaining.");
1574WriteLine($" * @example");
1575WriteLine($" * await builder.addSomething().withX().withY();");
1576WriteLine($" */");
1577WriteLine($"class {promiseImplementationClass} implements {promiseClass} {{");
1578WriteLine($" constructor(private _promise: Promise<{builder.BuilderClassName}>, private _client: AspireClientRpc, track = true) {{");
1579WriteLine($" if (track) {{ _client.trackPromise(_promise); }}");
1580WriteLine($" }}");
1581WriteLine();
1584WriteLine($" then<TResult1 = {builder.BuilderClassName}, TResult2 = never>(");
1585WriteLine($" onfulfilled?: ((value: {builder.BuilderClassName}) => TResult1 | PromiseLike<TResult1>) | null,");
1586WriteLine(" onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null");
1587WriteLine(" ): PromiseLike<TResult1 | TResult2> {");
1588WriteLine(" return this._promise.then(onfulfilled, onrejected);");
1589WriteLine(" }");
1590WriteLine();
1595WriteLine($" {prop.PropertyName}(): {returnType} {{");
1598WriteLine($" return new {promiseImplementationClassName}(this._promise.then(obj => obj.{prop.PropertyName}()), this._client, false);");
1602WriteLine($" return this._promise.then(obj => obj.{prop.PropertyName}());");
1604WriteLine(" }");
1605WriteLine();
1638WriteLine($"): {returnPromiseInterfaceName} {{");
1641WriteLine(")), this._client);");
1642WriteLine(" }");
1643WriteLine();
1651WriteLine($"): Promise<{returnType}> {{");
1654WriteLine("));");
1655WriteLine(" }");
1676WriteLine();
1680WriteLine($")), this._client);");
1681WriteLine(" }");
1683WriteLine();
1686WriteLine("}");
1687WriteLine();
1697WriteLine("// ============================================================================");
1698WriteLine("// Entry Point Functions");
1699WriteLine("// ============================================================================");
1700WriteLine();
1757WriteLine($"): {signature.ReturnType} {{");
1759WriteLine($" const promise = (async () => {{");
1765WriteLine($" {param.Name} = isPromiseLike({param.Name}) ? await {param.Name} : {param.Name};");
1772WriteLine($" const rpcArgs: Record<string, unknown> = {{ {string.Join(", ", requiredArgs)} }};");
1775WriteLine($" if ({param.Name} !== undefined) rpcArgs.{param.Name} = {GetRpcArgumentExpressionForParam(param, param.Name, useRegisteredCallback: false)};");
1777WriteLine($" const handle = await client.invokeCapability<{handleType}>(");
1778WriteLine($" '{capability.CapabilityId}',");
1779WriteLine(" rpcArgs");
1780WriteLine(" );");
1781WriteLine($" return new {returnWrapperImplementationClass}(handle, client);");
1782WriteLine($" }})();");
1783WriteLine($" return new {returnPromiseImplementationClass}(promise, client);");
1784WriteLine("}");
1795WriteLine($"): {signature.ReturnType} {{");
1801WriteLine($" {param.Name} = isPromiseLike({param.Name}) ? await {param.Name} : {param.Name};");
1808WriteLine($" const rpcArgs: Record<string, unknown> = {{ {string.Join(", ", requiredArgs)} }};");
1811WriteLine($" if ({param.Name} !== undefined) rpcArgs.{param.Name} = {GetRpcArgumentExpressionForParam(param, param.Name, useRegisteredCallback: false)};");
1815WriteLine($" await client.invokeCapability<void>(");
1819WriteLine(" const result = await client.invokeCapability<string | null>(");
1820WriteLine($" '{capability.CapabilityId}',");
1821WriteLine(" rpcArgs");
1822WriteLine(" );");
1823WriteLine(" return CancellationToken.fromValue(result);");
1824WriteLine("}");
1825WriteLine();
1830WriteLine($" return await client.invokeCapability<{returnType}>(");
1832WriteLine($" '{capability.CapabilityId}',");
1833WriteLine(" rpcArgs");
1834WriteLine(" );");
1835WriteLine("}");
1837WriteLine();
1864WriteLine($"{indent}const {callbackName}Id = {callbackName} ? registerCallback(async ({paramSignature}) => {{");
1868WriteLine($"{indent}const {callbackName}Id = registerCallback(async ({paramSignature}) => {{");
1877WriteLine(indent + "}) : undefined;");
1881WriteLine(indent + "});");
1901WriteLine($"{bodyIndent}{returnPrefix}await {callbackName}();");
1909WriteLine($"{bodyIndent}{returnPrefix}await {callbackName}({cbParam.Name});");
1923WriteLine($"{bodyIndent}{returnPrefix}await {callbackName}({string.Join(", ", callArgs)});");
1934WriteLine($"{indent}const {callbackParameter.Name} = CancellationToken.fromValue({callbackArgName});");
1942WriteLine($"{indent}const {callbackParameter.Name}Handle = wrapIfHandle({callbackArgName}) as {handleType};");
1943WriteLine($"{indent}const {callbackParameter.Name} = new AspireDict<{keyType}, {valueType}>({callbackParameter.Name}Handle, {clientExpression}, '{cbTypeId}');");
1948WriteLine($"{indent}const {callbackParameter.Name}Handle = wrapIfHandle({callbackArgName}) as {handleType};");
1949WriteLine($"{indent}const {callbackParameter.Name} = new {TypeScriptApiProjector.GetImplementationClassName(wrapperClassName)}({callbackParameter.Name}Handle, {clientExpression});");
1953WriteLine($"{indent}const {callbackParameter.Name} = wrapIfHandle({callbackArgName}) as {tsType};");
1961WriteLine($$"""
2037WriteLine();
2042WriteLine("""
2100WriteLine();
2101WriteLine("// ============================================================================");
2102WriteLine("// Handle Wrapper Registrations");
2103WriteLine("// ============================================================================");
2104WriteLine();
2105WriteLine("// Register wrapper factories for typed handle wrapping in callbacks");
2112WriteLine($"registerHandleWrapper('{typeClass.TypeId}', (handle, client) => new {TypeScriptApiProjector.GetImplementationClassName(className)}(handle as {handleType}, client));");
2120WriteLine($"registerHandleWrapper('{builder.TypeId}', (handle, client) => new {TypeScriptApiProjector.GetImplementationClassName(className)}(handle as {handleType}, client));");
2132WriteLine($"registerHandleWrapper('{aliasTypeId}', (handle, client) => new {TypeScriptApiProjector.GetImplementationClassName(className)}(handle as {handleType}, client));");
2135WriteLine();
2151WriteLine("// ============================================================================");
2152WriteLine($"// {implementationClassName}");
2153WriteLine("// ============================================================================");
2154WriteLine();
2165WriteLine($"class {implementationClassName} implements {className} {{");
2166WriteLine($" constructor(private _handle: {handleType}, private _client: AspireClientRpc) {{}}");
2167WriteLine();
2168WriteLine($" /** Serialize for JSON-RPC transport */");
2169WriteLine($" toJSON(): MarshalledHandle {{ return this._handle.toJSON(); }}");
2170WriteLine();
2205WriteLine("}");
2206WriteLine();
2277WriteLine($" {propertyName} = {{");
2282WriteLine($" get: async (): Promise<{returnType}> => {{");
2285WriteLine(" const result = await this._client.invokeCapability<string | null>(");
2286WriteLine($" '{getter.CapabilityId}',");
2287WriteLine(" { context: this._handle }");
2288WriteLine(" );");
2289WriteLine(" return CancellationToken.fromValue(result);");
2293WriteLine($" return await this._client.invokeCapability<{returnType}>(");
2294WriteLine($" '{getter.CapabilityId}',");
2295WriteLine($" {{ context: this._handle }}");
2296WriteLine(" );");
2298WriteLine(" },");
2308WriteLine($" set: async (value: {valueType}): Promise<void> => {{");
2310WriteLine($" await this._client.invokeCapability<void>(");
2311WriteLine($" '{setter.CapabilityId}',");
2312WriteLine($" {{ context: this._handle, {GetRpcArgumentEntry("value", valueParam.Type)} }}");
2313WriteLine(" );");
2314WriteLine(" }");
2318WriteLine(" };");
2319WriteLine();
2350WriteLine($" {propertyName}(): {promiseInterfaceName} {{");
2351WriteLine($" return new {promiseImplementationClassName}(this._client.invokeCapability<{collectionType}>(");
2352WriteLine($" '{getter.CapabilityId}',");
2353WriteLine(" { context: this._handle }");
2354WriteLine(" ), this._client, false);");
2355WriteLine(" }");
2356WriteLine();
2362WriteLine($" async {propertyName}(): Promise<{returnType}> {{");
2365WriteLine(" const result = await this._client.invokeCapability<string | null>(");
2366WriteLine($" '{getter.CapabilityId}',");
2367WriteLine(" { context: this._handle }");
2368WriteLine(" );");
2369WriteLine(" return CancellationToken.fromValue(result);");
2373WriteLine($" return await this._client.invokeCapability<{returnType}>(");
2374WriteLine($" '{getter.CapabilityId}',");
2375WriteLine(" { context: this._handle }");
2376WriteLine(" );");
2378WriteLine(" }");
2379WriteLine();
2389WriteLine($" {propertyName}(): {promiseInterfaceName} {{");
2390WriteLine(" const promise = (async () => {");
2391WriteLine($" const handle = await this._client.invokeCapability<{handleType}>(");
2392WriteLine($" '{getter.CapabilityId}',");
2393WriteLine(" { context: this._handle }");
2394WriteLine(" );");
2395WriteLine($" return new {wrapperImplementationClassName}(handle, this._client);");
2396WriteLine(" })();");
2397WriteLine($" return new {promiseImplementationClassName}(promise, this._client, false);");
2398WriteLine(" }");
2399WriteLine();
2403WriteLine($" async {propertyName}(): Promise<{wrapperClassName}> {{");
2404WriteLine($" const handle = await this._client.invokeCapability<{handleType}>(");
2405WriteLine($" '{getter.CapabilityId}',");
2406WriteLine(" { context: this._handle }");
2407WriteLine(" );");
2408WriteLine($" return new {wrapperImplementationClassName}(handle, this._client);");
2409WriteLine(" }");
2410WriteLine();
2441WriteLine($" {propertyName} = {{");
2444WriteLine($" get: (): {promiseInterfaceName} => {{");
2445WriteLine(" const promise = (async () => {");
2446WriteLine($" const handle = await this._client.invokeCapability<{handleType}>(");
2447WriteLine($" '{getter.CapabilityId}',");
2448WriteLine($" {{ context: this._handle }}");
2449WriteLine(" );");
2450WriteLine($" return new {wrapperImplementationClassName}(handle, this._client);");
2451WriteLine(" })();");
2452WriteLine($" return new {promiseImplementationClassName}(promise, this._client, false);");
2453WriteLine(" },");
2457WriteLine($" get: async (): Promise<{wrapperClassName}> => {{");
2458WriteLine($" const handle = await this._client.invokeCapability<{handleType}>(");
2459WriteLine($" '{getter.CapabilityId}',");
2460WriteLine($" {{ context: this._handle }}");
2461WriteLine(" );");
2462WriteLine($" return new {wrapperImplementationClassName}(handle, this._client);");
2463WriteLine(" },");
2472WriteLine($" set: async (value: {valueType}): Promise<void> => {{");
2474WriteLine($" await this._client.invokeCapability<void>(");
2475WriteLine($" '{setter.CapabilityId}',");
2476WriteLine($" {{ context: this._handle, {GetRpcArgumentEntry("value", valueParam.Type)} }}");
2477WriteLine(" );");
2478WriteLine(" }");
2482WriteLine(" };");
2483WriteLine();
2510WriteLine($" private _{propertyName}?: AspireDict<{keyType}, {valueType}>;");
2511WriteLine($" async {propertyName}(): Promise<AspireDict<{keyType}, {valueType}>> {{");
2512WriteLine($" if (!this._{propertyName}) {{");
2513WriteLine($" this._{propertyName} = new AspireDict<{keyType}, {valueType}>(");
2514WriteLine($" this._handle,");
2515WriteLine($" this._client,");
2516WriteLine($" {typeId},");
2517WriteLine($" {getterCapabilityId}");
2518WriteLine(" );");
2519WriteLine(" }");
2520WriteLine($" return this._{propertyName};");
2521WriteLine(" }");
2522WriteLine();
2543WriteLine($" private _{propertyName}?: AspireDict<{keyType}, {valueType}>;");
2544WriteLine($" get {propertyName}(): AspireDict<{keyType}, {valueType}> {{");
2545WriteLine($" if (!this._{propertyName}) {{");
2546WriteLine($" this._{propertyName} = new AspireDict<{keyType}, {valueType}>(");
2547WriteLine($" this._handle,");
2548WriteLine($" this._client,");
2549WriteLine($" {typeId},");
2550WriteLine($" {getterCapabilityId}");
2551WriteLine(" );");
2552WriteLine(" }");
2553WriteLine($" return this._{propertyName};");
2554WriteLine(" }");
2555WriteLine();
2575WriteLine($" private _{propertyName}?: AspireList<{elementType}>;");
2576WriteLine($" async {propertyName}(): Promise<AspireList<{elementType}>> {{");
2577WriteLine($" if (!this._{propertyName}) {{");
2578WriteLine($" this._{propertyName} = new AspireList<{elementType}>(");
2579WriteLine($" this._handle,");
2580WriteLine($" this._client,");
2581WriteLine($" {typeId},");
2582WriteLine($" {getterCapabilityId}");
2583WriteLine(" );");
2584WriteLine(" }");
2585WriteLine($" return this._{propertyName};");
2586WriteLine(" }");
2587WriteLine();
2602WriteLine($" private _{propertyName}?: AspireList<{elementType}>;");
2603WriteLine($" get {propertyName}(): AspireList<{elementType}> {{");
2604WriteLine($" if (!this._{propertyName}) {{");
2605WriteLine($" this._{propertyName} = new AspireList<{elementType}>(");
2606WriteLine($" this._handle,");
2607WriteLine($" this._client,");
2608WriteLine($" {typeId},");
2609WriteLine($" {getterCapabilityId}");
2610WriteLine(" );");
2611WriteLine(" }");
2612WriteLine($" return this._{propertyName};");
2613WriteLine(" }");
2614WriteLine();
2669WriteLine($"): {returnPromiseInterfaceName} {{");
2670WriteLine(" const promise = (async () => {");
2675WriteLine($" {(_projector.IsWidenedHandleType(param.Type) ? "let" : "const")} {localParameterName} = {publicOptionsParamName}?.{param.Name};");
2680WriteLine($" const handle = await this._client.invokeCapability<{returnHandleType}>(");
2681WriteLine($" '{method.CapabilityId}',");
2682WriteLine(" rpcArgs");
2683WriteLine(" );");
2684WriteLine($" return new {returnImplementationClassName}(handle, this._client);");
2685WriteLine(" })();");
2686WriteLine($" return new {returnPromiseImplementationClassName}(promise, this._client);");
2687WriteLine(" }");
2688WriteLine();
2696WriteLine($"): Promise<{returnType}> {{");
2702WriteLine($" {(_projector.IsWidenedHandleType(param.Type) ? "let" : "const")} {localParameterName} = {publicOptionsParamName}?.{param.Name};");
2710WriteLine($" await this._client.invokeCapability<void>(");
2714WriteLine(" const result = await this._client.invokeCapability<string | null>(");
2715WriteLine($" '{method.CapabilityId}',");
2716WriteLine(" rpcArgs");
2717WriteLine(" );");
2718WriteLine(" return CancellationToken.fromValue(result);");
2719WriteLine(" }");
2720WriteLine();
2725WriteLine($" return await this._client.invokeCapability<{returnType}>(");
2727WriteLine($" '{method.CapabilityId}',");
2728WriteLine($" rpcArgs");
2729WriteLine(" );");
2730WriteLine(" }");
2731WriteLine();
2782WriteLine($"): {returnPromiseInterfaceName} {{");
2783WriteLine(" const promise = (async () => {");
2788WriteLine($" {(_projector.IsWidenedHandleType(param.Type) ? "let" : "const")} {localParameterName} = {publicOptionsParamName}?.{param.Name};");
2793WriteLine($" const handle = await this._client.invokeCapability<{returnHandleType}>(");
2794WriteLine($" '{capability.CapabilityId}',");
2795WriteLine(" rpcArgs");
2796WriteLine(" );");
2797WriteLine($" return new {returnImplementationClassName}(handle, this._client);");
2798WriteLine(" })();");
2799WriteLine($" return new {returnPromiseImplementationClassName}(promise, this._client);");
2800WriteLine(" }");
2801WriteLine();
2809WriteLine($"): Promise<{returnType}> {{");
2815WriteLine($" {(_projector.IsWidenedHandleType(param.Type) ? "let" : "const")} {localParameterName} = {publicOptionsParamName}?.{param.Name};");
2823WriteLine($" await this._client.invokeCapability<void>(");
2827WriteLine($" return await this._client.invokeCapability<{returnType}>(");
2829WriteLine($" '{capability.CapabilityId}',");
2830WriteLine($" rpcArgs");
2831WriteLine(" );");
2832WriteLine(" }");
2833WriteLine();
2912WriteLine($" /** @internal */");
2915WriteLine($"): Promise<{returnWrapperClass}> {{");
2930WriteLine($" const result = await this._client.invokeCapability<{returnHandleType}>(");
2931WriteLine($" '{capability.CapabilityId}',");
2932WriteLine($" rpcArgs");
2933WriteLine(" );");
2934WriteLine($" return new {returnWrapperImplementationClass}(result, this._client);");
2935WriteLine(" }");
2936WriteLine();
2942WriteLine($"): {returnPromiseWrapper} {{");
2948WriteLine($" {(_projector.IsWidenedHandleType(param.Type) ? "let" : "const")} {localParameterName} = {publicOptionsParamName}?.{param.Name};");
2957WriteLine($" const flushAndBuild = async () => {{ await this._client.flushPendingPromises(); return {internalCall}; }};");
2958WriteLine($" return new {returnPromiseImplementationClass}(flushAndBuild(), this._client, false);");
2962WriteLine($" return new {returnPromiseImplementationClass}({internalCall}, this._client);");
2964WriteLine(" }");
2970WriteLine($" /** @internal */");
2973WriteLine($"): Promise<{className}> {{");
2988WriteLine($" await this._client.invokeCapability<void>(");
2989WriteLine($" '{capability.CapabilityId}',");
2990WriteLine($" rpcArgs");
2991WriteLine(" );");
2992WriteLine($" return this;");
2993WriteLine(" }");
2994WriteLine();
3000WriteLine($"): {promiseClass} {{");
3006WriteLine($" {(_projector.IsWidenedHandleType(param.Type) ? "let" : "const")} {localParameterName} = {publicOptionsParamName}?.{param.Name};");
3011WriteLine("), this._client);");
3012WriteLine(" }");
3020WriteLine($"): Promise<{returnType}> {{");
3026WriteLine($" {(_projector.IsWidenedHandleType(param.Type) ? "let" : "const")} {localParameterName} = {publicOptionsParamName}?.{param.Name};");
3044WriteLine(" const result = await this._client.invokeCapability<string | null>(");
3045WriteLine($" '{capability.CapabilityId}',");
3046WriteLine(" rpcArgs");
3047WriteLine(" );");
3048WriteLine(" return CancellationToken.fromValue(result);");
3052WriteLine($" return await this._client.invokeCapability<{returnType}>(");
3053WriteLine($" '{capability.CapabilityId}',");
3054WriteLine($" rpcArgs");
3055WriteLine(" );");
3057WriteLine(" }");
3059WriteLine();
3090WriteLine($"/**");
3091WriteLine($" * Thenable wrapper for {className} that enables fluent chaining.");
3092WriteLine($" */");
3093WriteLine($"class {promiseImplementationClass} implements {promiseClass} {{");
3094WriteLine($" constructor(private _promise: Promise<{className}>, private _client: AspireClientRpc, track = true) {{");
3095WriteLine($" if (track) {{ _client.trackPromise(_promise); }}");
3096WriteLine($" }}");
3097WriteLine();
3100WriteLine($" then<TResult1 = {className}, TResult2 = never>(");
3101WriteLine($" onfulfilled?: ((value: {className}) => TResult1 | PromiseLike<TResult1>) | null,");
3102WriteLine(" onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null");
3103WriteLine(" ): PromiseLike<TResult1 | TResult2> {");
3104WriteLine(" return this._promise.then(onfulfilled, onrejected);");
3105WriteLine(" }");
3106WriteLine();
3117WriteLine($" {prop.PropertyName}(): {returnType} {{");
3120WriteLine($" return new {propertyPromiseImplementationClassName}(this._promise.then(obj => obj.{prop.PropertyName}()), this._client, false);");
3124WriteLine($" return this._promise.then(obj => obj.{prop.PropertyName}());");
3126WriteLine(" }");
3127WriteLine();
3162WriteLine($"): {returnPromiseWrapper} {{");
3165WriteLine($")), this._client);");
3166WriteLine(" }");
3173WriteLine($"): {promiseClass} {{");
3176WriteLine($")), this._client);");
3177WriteLine(" }");
3184WriteLine($"): Promise<{returnType}> {{");
3187WriteLine("));");
3188WriteLine(" }");
3190WriteLine();
3193WriteLine("}");
3194WriteLine();