From 80968a1558a89224a575afe4c0b4d6f9a85c106d Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Sat, 9 Aug 2025 22:38:09 +0530 Subject: [PATCH] feat: object params in react native sdk --- example.php | 2 +- templates/node/src/services/template.ts.twig | 1 + .../src/services/template.ts.twig | 72 ++++++++++++++++--- templates/web/src/services/template.ts.twig | 1 + 4 files changed, 67 insertions(+), 9 deletions(-) diff --git a/example.php b/example.php index 9eafe7b9a..8d5b54b1b 100644 --- a/example.php +++ b/example.php @@ -42,7 +42,7 @@ function getSSLPage($url) { $platform = 'console'; // $platform = 'server'; - $version = '1.7.x'; + $version = '1.8.x'; $spec = getSSLPage("https://raw.githubusercontent.com/appwrite/appwrite/{$version}/app/config/specs/swagger2-{$version}-{$platform}.json"); if(empty($spec)) { diff --git a/templates/node/src/services/template.ts.twig b/templates/node/src/services/template.ts.twig index 3846f5853..8cb5e8c41 100644 --- a/templates/node/src/services/template.ts.twig +++ b/templates/node/src/services/template.ts.twig @@ -1,5 +1,6 @@ import { {{ spec.title | caseUcfirst}}Exception, Client, type Payload, UploadProgress } from '../client'; import type { Models } from '../models'; + {% set added = [] %} {% for method in service.methods %} {% for parameter in method.parameters.all %} diff --git a/templates/react-native/src/services/template.ts.twig b/templates/react-native/src/services/template.ts.twig index 2fb840d67..d5f6ed381 100644 --- a/templates/react-native/src/services/template.ts.twig +++ b/templates/react-native/src/services/template.ts.twig @@ -28,16 +28,16 @@ export class {{ service.name | caseUcfirst }} extends Service { { super(client); } -{% for method in service.methods %} + {%~ for method in service.methods %} /** -{% if method.description %} -{{ method.description|comment2 }} -{% endif %} + {%~ if method.description %} + * {{ method.description | replace({'\n': '\n * '}) | raw }} + {%~ endif %} * -{% for parameter in method.parameters.all %} - * @param {{ '{' }}{{ parameter | getPropertyType(method) | raw }}{{ '}' }} {{ parameter.name | caseCamel | escapeKeyword }} -{% endfor %} + {%~ for parameter in method.parameters.all %} + * @param {{ '{' }}{{ parameter | getPropertyType(method) | raw }}{{ '}' }} {{ parameter.name | caseCamel | escapeKeyword }} - {{ parameter.description | raw }} + {%~ endfor %} * @throws {{ '{' }}{{ spec.title | caseUcfirst}}Exception} * @returns {% if method.type == 'webAuth' %}{void|string}{% elseif method.type == 'location' %}{ArrayBuffer}{% else %}{Promise}{% endif %} @@ -49,7 +49,63 @@ export class {{ service.name | caseUcfirst }} extends Service { {%~ endif %} {%~ endif %} */ - {% if method.type == 'upload'%}async {% endif %}{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %}, onProgress = (progress: UploadProgress) => {}{% endif %}): {{ method | getReturn(spec) | raw }} { + {%~ if method.parameters.all|length > 0 %} + {% if method.type == 'upload'%}async {% endif %}{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}(params: { {% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %} {% if 'multipart/form-data' in method.consumes %}, onProgress?: (progress: UploadProgress) => {}{% endif %} }): {{ method | getReturn(spec) | raw }}; + /** + * @deprecated Parameter-based methods will be removed in the upcoming version. + * Please use the object based method instead for better developer experience. + * + * @example + * // Old (deprecated) + * {% if method.type == 'upload'%}async {% endif %}{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %}, onProgress?: (progress: UploadProgress) => {}{% endif %}): {{ method | getReturn(spec) | raw }}; + * + * // New (object based) + * {% if method.type == 'upload'%}async {% endif %}{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}(params: { {% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %} {% if 'multipart/form-data' in method.consumes %}, onProgress?: (progress: UploadProgress) => {}{% endif %} }): {{ method | getReturn(spec) | raw }}; + */ + {% if method.type == 'upload'%}async {% endif %}{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %}, onProgress?: (progress: UploadProgress) => {}{% endif %}): {{ method | getReturn(spec) | raw }}; + {% if method.type == 'upload'%}async {% endif %}{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}( + {% if method.parameters.all|length > 0 %}paramsOrFirst{% if not method.parameters.all[0].required or method.parameters.all[0].nullable %}?{% endif %}: { {% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %}, onProgress?: (progress: UploadProgress) => {} {% endif %} } | {{ method.parameters.all[0] | getPropertyType(method) | raw }}{% if method.parameters.all|length > 1 %}, + ...rest: [{% for parameter in method.parameters.all[1:] %}({{ parameter | getPropertyType(method) | raw }})?{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %},((progress: UploadProgress) => {})?{% endif %}]{% endif %}{% endif %} + + ): {{ method | getReturn(spec) | raw }} { + {%~ if method.parameters.all|length > 0 %} + let params: { {% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %} }; + {%~ if 'multipart/form-data' in method.consumes %} + let onProgress: ((progress: UploadProgress) => {}); + {%~ endif %} + + if (paramsOrFirst && typeof paramsOrFirst === 'object' && !Array.isArray(paramsOrFirst){% set firstParamType = method.parameters.all[0] | getPropertyType(method) | raw %}{% if not (firstParamType starts with 'string' or firstParamType starts with 'number' or firstParamType starts with 'boolean') %} && '{{ method.parameters.all[0].name | caseCamel | escapeKeyword }}' in paramsOrFirst{% endif %}) { + params = paramsOrFirst as { {% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %} }; + {%~ if 'multipart/form-data' in method.consumes %} + onProgress = paramsOrFirst.onProgress as ((progress: UploadProgress) => {}); + {%~ endif %} + } else { + params = { + {%~ for parameter in method.parameters.all %} + {{ parameter.name | caseCamel | escapeKeyword }}: {% if loop.index0 == 0 %}paramsOrFirst{% else %}rest[{{ loop.index0 - 1 }}]{% endif %} as {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, +{% endif %} + {%~ endfor %} + + }; + {%~ if 'multipart/form-data' in method.consumes %} + onProgress = rest[{{ method.parameters.all|length - 1 }}] as ((progress: UploadProgress) => {}); + {%~ endif %} + } + + {%~ for parameter in method.parameters.all %} + const {{ parameter.name | caseCamel | escapeKeyword }} = params.{{ parameter.name | caseCamel | escapeKeyword }}; + {%~ endfor %} + + {%~ else %} + {%~ if 'multipart/form-data' in method.consumes %} + if (typeof paramsOrFirst === 'function') { + onProgress = paramsOrFirst; + } + {%~ endif %} + {%~ endif %} + {%~ else %} + {{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %}, onProgress = (progress: UploadProgress) => {}{% endif %}): {{ method | getReturn(spec) | raw }} { + {%~ endif %} {% for parameter in method.parameters.all %} {% if parameter.required %} if (typeof {{ parameter.name | caseCamel | escapeKeyword }} === 'undefined') { diff --git a/templates/web/src/services/template.ts.twig b/templates/web/src/services/template.ts.twig index e9f685a4c..ae5a924b3 100644 --- a/templates/web/src/services/template.ts.twig +++ b/templates/web/src/services/template.ts.twig @@ -1,6 +1,7 @@ import { Service } from '../service'; import { {{ spec.title | caseUcfirst}}Exception, Client, type Payload, UploadProgress } from '../client'; import type { Models } from '../models'; + {% set added = [] %} {% for method in service.methods %} {% for parameter in method.parameters.all %}