Skip to content

Commit d0c455e

Browse files
authored
Merge pull request #193 from appwrite/fix-node-overall-improvements
fix(node): overall improvements
2 parents f47263e + 528ef56 commit d0c455e

File tree

8 files changed

+128
-30
lines changed

8 files changed

+128
-30
lines changed

specs/swagger-appwrite.0.8.0.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

src/SDK/Language/Node.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ public function getFiles()
2424
'template' => 'node/index.js.twig',
2525
'minify' => false,
2626
],
27+
[
28+
'scope' => 'default',
29+
'destination' => 'index.d.ts',
30+
'template' => 'node/index.d.ts.twig',
31+
'minify' => false,
32+
],
2733
[
2834
'scope' => 'default',
2935
'destination' => 'lib/client.js',

src/Spec/Swagger2.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,9 @@ public function getMethods($service)
219219
$param['required'] = (in_array($key, $bodyRequired));
220220
$param['default'] = $value['default'] ?? null;
221221
$param['example'] = $value['x-example'] ?? null;
222-
222+
$param['array'] = [
223+
'type' => $value['items']['type'] ?? '',
224+
];
223225
if($value['type'] === 'object' && is_array($value['default'])) {
224226
$value['default'] = (empty($value['default'])) ? new stdClass() : $value['default'];
225227
}

templates/node/index.d.ts.twig

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
declare module "{{ language.params.npmPackage|caseDash }}" {
2+
export class Client {
3+
/**
4+
* Set endpoint.
5+
*
6+
* @param {string} endpoint
7+
*
8+
* @return {this}
9+
*/
10+
setEndpoint(endpoint: string): Client;
11+
12+
/**
13+
* Set self signed.
14+
*
15+
* @param {bool} status
16+
*
17+
* @return {this}
18+
*/
19+
setSelfSigned(status?: boolean): Client;
20+
{% for header in spec.global.headers %}
21+
22+
/**
23+
* Set {{header.key | caseUcfirst}}
24+
*
25+
{% if header.description %}
26+
* {{header.description}}
27+
*
28+
{% endif %}
29+
* @param {string} value
30+
*
31+
* @returns {this}
32+
*/
33+
set{{header.key | caseUcfirst}}({{header.key | caseLower}}: string): Client;
34+
{% endfor %}
35+
}
36+
37+
export class AppwriteException extends Error {
38+
public code: number | null;
39+
public response: string | null;
40+
constructor(message: string, code?: number, response?: string);
41+
}
42+
43+
export class Service {
44+
public client: Client;
45+
constructor(client: Client);
46+
}
47+
48+
{% for service in spec.services %}
49+
export class {{ service.name | caseUcfirst }} extends Service {
50+
{% for method in service.methods %}
51+
52+
/**
53+
* {{ method.title }}
54+
*
55+
{% if method.description %}
56+
{{ method.description|comment1 }}
57+
*
58+
{% endif %}
59+
{% for parameter in method.parameters.all %}
60+
* @param {{ '{' }}{{ parameter.type | typeName }}{{ '}' }} {{ parameter.name | caseCamel }}
61+
{% endfor %}
62+
* @throws {{ '{' }}{{ spec.title | caseUcfirst}}Exception}
63+
* @returns {% if method.type == 'location' %}{string}{% else %}{Promise}{% endif %}
64+
65+
*/
66+
{{ 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 %};
67+
{% endfor %}
68+
}
69+
{% endfor %}
70+
}

templates/node/lib/client.js.twig

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,22 @@ class Client {
2525
* {{header.description}}
2626
*
2727
{% endif %}
28-
* @param string value
28+
* @param {string} {{header.key | caseLower}}
2929
*
3030
* @return self
3131
*/
32-
set{{header.key | caseUcfirst}}(value) {
33-
this.addHeader('{{header.name}}', value);
32+
set{{header.key | caseUcfirst}}({{header.key | caseLower}}) {
33+
this.addHeader('{{header.name}}', {{header.key | caseLower}});
3434

3535
return this;
3636
}
3737

3838
{% endfor %}
39-
/***
40-
* @param bool status
39+
/**
40+
* Set self signed.
41+
*
42+
* @param {bool} status
43+
*
4144
* @return this
4245
*/
4346
setSelfSigned(status = true) {
@@ -46,8 +49,11 @@ class Client {
4649
return this;
4750
}
4851

49-
/***
50-
* @param endpoint
52+
/**
53+
* Set endpoint.
54+
*
55+
* @param {string} endpoint
56+
*
5157
* @return this
5258
*/
5359
setEndpoint(endpoint)
@@ -58,8 +64,8 @@ class Client {
5864
}
5965

6066
/**
61-
* @param key string
62-
* @param value string
67+
* @param {string} key
68+
* @param {string} value
6369
*/
6470
addHeader(key, value) {
6571
this.headers[key.toLowerCase()] = value;

templates/node/lib/services/service.js.twig

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const Service = require('../service.js');
2+
const {{spec.title | caseUcfirst}}Exception = require('../exception.js');
23

34
class {{ service.name | caseUcfirst }} extends Service {
45
{% for method in service.methods %}
@@ -11,32 +12,44 @@ class {{ service.name | caseUcfirst }} extends Service {
1112
*
1213
{% endif %}
1314
{% for parameter in method.parameters.all %}
14-
* @param {{ parameter.type | typeName }} {{ parameter.name | caseCamel }}
15+
* @param {{ '{' }}{{ parameter.type | typeName }}{{ '}' }} {{ parameter.name | caseCamel }}
1516
{% endfor %}
16-
* @throws Exception
17-
* @return {}
17+
* @throws {{ '{' }}{{ spec.title | caseUcfirst}}Exception}
18+
* @returns {% if method.type == 'location' %}{string}{% else %}{Promise}{% endif %}
19+
1820
*/
19-
async {{ method.name | caseCamel }}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel }}{{ parameter | paramDefault }}{% if not loop.last %}, {% endif %}{% endfor %}) {
20-
let path = '{{ method.path }}'{% for parameter in method.parameters.path %}.replace(new RegExp('{{ '{' }}{{ parameter.name | caseCamel }}{{ '}' }}', 'g'), {{ parameter.name | caseCamel }}){% endfor %};
21-
22-
return await this.client.call('{{ method.method | caseLower }}', path, {
23-
{% for parameter in method.parameters.header %}
24-
'{{ parameter.name }}': ${{ parameter.name | caseCamel }},
25-
{% endfor %}
26-
{% for key, header in method.headers %}
27-
'{{ key }}': '{{ header }}',
21+
async {{ method.name | caseCamel }}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel }}{% if not loop.last %}, {% endif %}{% endfor %}) {
22+
{% for parameter in method.parameters.all %}
23+
{% if parameter.required %}
24+
if (typeof {{ parameter.name | caseCamel }} === undefined) {
25+
throw new {{spec.title | caseUcfirst}}Exception('Missing required parameter: "{{ parameter.name | caseCamel }}"');
26+
}
27+
28+
{% endif %}
2829
{% endfor %}
29-
},
30-
{
30+
let path = '{{ method.path }}'{% for parameter in method.parameters.path %}.replace('{{ '{' }}{{ parameter.name | caseCamel }}{{ '}' }}', {{ parameter.name | caseCamel }}){% endfor %};
31+
let payload = {};
3132
{% for parameter in method.parameters.query %}
32-
'{{ parameter.name }}': {{ parameter.name | caseCamel }}{% if not loop.last %},{% endif %}
3333

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

40+
if (typeof {{ parameter.name | caseCamel }} !== undefined) {
41+
payload['{{ parameter.name }}'] = {{ parameter.name | caseCamel }};
42+
}
43+
{% endfor %}
44+
45+
return await this.client.call('{{ method.method | caseLower }}', path, {
46+
{% for parameter in method.parameters.header %}
47+
'{{ parameter.name }}': ${{ parameter.name | caseCamel }},
48+
{% endfor %}
49+
{% for key, header in method.headers %}
50+
'{{ key }}': '{{ header }}',
3851
{% endfor %}
39-
}{% if method.type == 'location' %}, 'arraybuffer'{% endif %});
52+
}, payload{% if method.type == 'location' %}, 'arraybuffer'{% endif %});
4053
}
4154
{% endfor %}
4255
}

templates/node/package.json.twig

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
"description": "{{ sdk.shortDescription }}",
55
"version": "{{ sdk.version }}",
66
"license": "{{ sdk.license }}",
7-
"main": "index.js",
7+
"main": "./index.js",
8+
"types": "./index.d.ts",
89
"repository": {
910
"type": "git",
1011
"url": "{{ sdk.gitURL }}"

templates/web/src/sdk.ts.twig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class {{ spec.title | caseUcfirst }} {
3838
/**
3939
* Set Endpoint
4040
*
41-
* Your project ID
41+
* Your project endpoint
4242
*
4343
* @param {string} endpoint
4444
*

0 commit comments

Comments
 (0)