Skip to content
2 changes: 1 addition & 1 deletion specs/swagger-appwrite.0.8.0.json

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions src/SDK/Language/Node.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,12 @@ public function getFiles()
'template' => 'node/index.js.twig',
'minify' => false,
],
[
'scope' => 'default',
'destination' => 'index.d.ts',
'template' => 'node/index.d.ts.twig',
'minify' => false,
],
[
'scope' => 'default',
'destination' => 'lib/client.js',
Expand Down
4 changes: 3 additions & 1 deletion src/Spec/Swagger2.php
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,9 @@ public function getMethods($service)
$param['required'] = (in_array($key, $bodyRequired));
$param['default'] = $value['default'] ?? null;
$param['example'] = $value['x-example'] ?? null;

$param['array'] = [
'type' => $value['items']['type'] ?? '',
];
if($value['type'] === 'object' && is_array($value['default'])) {
$value['default'] = (empty($value['default'])) ? new stdClass() : $value['default'];
}
Expand Down
70 changes: 70 additions & 0 deletions templates/node/index.d.ts.twig
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
declare module "{{ language.params.npmPackage|caseDash }}" {
export class Client {
/**
* Set endpoint.
*
* @param {string} endpoint
*
* @return {this}
*/
setEndpoint(endpoint: string): Client;

/**
* Set self signed.
*
* @param {bool} status
*
* @return {this}
*/
setSelfSigned(status?: boolean): Client;
{% for header in spec.global.headers %}

/**
* Set {{header.key | caseUcfirst}}
*
{% if header.description %}
* {{header.description}}
*
{% endif %}
* @param {string} value
*
* @returns {this}
*/
set{{header.key | caseUcfirst}}({{header.key | caseLower}}: string): Client;
{% endfor %}
}

export class AppwriteException extends Error {
public code: number | null;
public response: string | null;
constructor(message: string, code?: number, response?: string);
}

export class Service {
public client: Client;
constructor(client: Client);
}

{% for service in spec.services %}
export class {{ service.name | caseUcfirst }} extends Service {
{% for method in service.methods %}

/**
* {{ method.title }}
*
{% if method.description %}
{{ method.description|comment1 }}
*
{% endif %}
{% for parameter in method.parameters.all %}
* @param {{ '{' }}{{ parameter.type | typeName }}{{ '}' }} {{ parameter.name | caseCamel }}
{% endfor %}
* @throws {{ '{' }}{{ spec.title | caseUcfirst}}Exception}
* @returns {% if method.type == 'location' %}{string}{% else %}{Promise}{% endif %}

*/
{{ method.name | caseCamel }}{% if method.type != 'location' %}<T extends unknown>{% endif %}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel }}{% if not parameter.required %}?{% endif %}: {% if parameter.type == 'array' %}{{attribute(parameter, 'array').type}}[]{% else %}{{ parameter.type | typeName }}{% endif %}{% if not loop.last %}, {% endif %}{% endfor %}): {% if method.type == 'location' %}string{% else %}Promise<T>{% endif %};
{% endfor %}
}
{% endfor %}
}
24 changes: 15 additions & 9 deletions templates/node/lib/client.js.twig
Original file line number Diff line number Diff line change
Expand Up @@ -25,19 +25,22 @@ class Client {
* {{header.description}}
*
{% endif %}
* @param string value
* @param {string} {{header.key | caseLower}}
*
* @return self
*/
set{{header.key | caseUcfirst}}(value) {
this.addHeader('{{header.name}}', value);
set{{header.key | caseUcfirst}}({{header.key | caseLower}}) {
this.addHeader('{{header.name}}', {{header.key | caseLower}});

return this;
}

{% endfor %}
/***
* @param bool status
/**
* Set self signed.
*
* @param {bool} status
*
* @return this
*/
setSelfSigned(status = true) {
Expand All @@ -46,8 +49,11 @@ class Client {
return this;
}

/***
* @param endpoint
/**
* Set endpoint.
*
* @param {string} endpoint
*
* @return this
*/
setEndpoint(endpoint)
Expand All @@ -58,8 +64,8 @@ class Client {
}

/**
* @param key string
* @param value string
* @param {string} key
* @param {string} value
*/
addHeader(key, value) {
this.headers[key.toLowerCase()] = value;
Expand Down
47 changes: 30 additions & 17 deletions templates/node/lib/services/service.js.twig
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
const Service = require('../service.js');
const {{spec.title | caseUcfirst}}Exception = require('../exception.js');

class {{ service.name | caseUcfirst }} extends Service {
{% for method in service.methods %}
Expand All @@ -11,32 +12,44 @@ class {{ service.name | caseUcfirst }} extends Service {
*
{% endif %}
{% for parameter in method.parameters.all %}
* @param {{ parameter.type | typeName }} {{ parameter.name | caseCamel }}
* @param {{ '{' }}{{ parameter.type | typeName }}{{ '}' }} {{ parameter.name | caseCamel }}
{% endfor %}
* @throws Exception
* @return {}
* @throws {{ '{' }}{{ spec.title | caseUcfirst}}Exception}
* @returns {% if method.type == 'location' %}{string}{% else %}{Promise}{% endif %}

*/
async {{ method.name | caseCamel }}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel }}{{ parameter | paramDefault }}{% if not loop.last %}, {% endif %}{% endfor %}) {
let path = '{{ method.path }}'{% for parameter in method.parameters.path %}.replace(new RegExp('{{ '{' }}{{ parameter.name | caseCamel }}{{ '}' }}', 'g'), {{ parameter.name | caseCamel }}){% endfor %};

return await this.client.call('{{ method.method | caseLower }}', path, {
{% for parameter in method.parameters.header %}
'{{ parameter.name }}': ${{ parameter.name | caseCamel }},
{% endfor %}
{% for key, header in method.headers %}
'{{ key }}': '{{ header }}',
async {{ method.name | caseCamel }}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel }}{% if not loop.last %}, {% endif %}{% endfor %}) {
{% for parameter in method.parameters.all %}
{% if parameter.required %}
if (typeof {{ parameter.name | caseCamel }} === undefined) {
throw new {{spec.title | caseUcfirst}}Exception('Missing required parameter: "{{ parameter.name | caseCamel }}"');
}

{% endif %}
{% endfor %}
},
{
let path = '{{ method.path }}'{% for parameter in method.parameters.path %}.replace('{{ '{' }}{{ parameter.name | caseCamel }}{{ '}' }}', {{ parameter.name | caseCamel }}){% endfor %};
let payload = {};
{% for parameter in method.parameters.query %}
'{{ parameter.name }}': {{ parameter.name | caseCamel }}{% if not loop.last %},{% endif %}

if (typeof {{ parameter.name | caseCamel }} !== undefined) {
payload['{{ parameter.name }}'] = {{ parameter.name | caseCamel }};
}
{% endfor %}
{% for parameter in method.parameters.body %}
'{{ parameter.name }}': {{ parameter.name | caseCamel }}{% if not loop.last %},{% endif %}

if (typeof {{ parameter.name | caseCamel }} !== undefined) {
payload['{{ parameter.name }}'] = {{ parameter.name | caseCamel }};
}
{% endfor %}

return await this.client.call('{{ method.method | caseLower }}', path, {
{% for parameter in method.parameters.header %}
'{{ parameter.name }}': ${{ parameter.name | caseCamel }},
{% endfor %}
{% for key, header in method.headers %}
'{{ key }}': '{{ header }}',
{% endfor %}
}{% if method.type == 'location' %}, 'arraybuffer'{% endif %});
}, payload{% if method.type == 'location' %}, 'arraybuffer'{% endif %});
}
{% endfor %}
}
Expand Down
3 changes: 2 additions & 1 deletion templates/node/package.json.twig
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
"description": "{{ sdk.shortDescription }}",
"version": "{{ sdk.version }}",
"license": "{{ sdk.license }}",
"main": "index.js",
"main": "./index.js",
"types": "./index.d.ts",
"repository": {
"type": "git",
"url": "{{ sdk.gitURL }}"
Expand Down
2 changes: 1 addition & 1 deletion templates/web/src/sdk.ts.twig
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class {{ spec.title | caseUcfirst }} {
/**
* Set Endpoint
*
* Your project ID
* Your project endpoint
*
* @param {string} endpoint
*
Expand Down