Skip to content

Commit b58bf7f

Browse files
authored
Merge pull request #199 from appwrite/fix-deno-overall-improvements
fix(deno): overall improvements
2 parents 490cd43 + a1c8611 commit b58bf7f

File tree

4 files changed

+57
-45
lines changed

4 files changed

+57
-45
lines changed

src/SDK/Language/Deno.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,10 @@ public function getTypeName($type)
9595
return 'boolean';
9696
break;
9797
case self::TYPE_ARRAY:
98-
return 'Array<any>';
99-
case self::TYPE_OBJECT:
100-
return 'DocumentData';
98+
return 'string[]';
99+
break;
100+
case self::TYPE_OBJECT:
101+
return 'object';
101102
break;
102103
}
103104

templates/deno/src/client.ts.twig

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import { {{ spec.title | caseUcfirst}}Exception } from './exception.ts';
22

3-
export interface DocumentData {
3+
export interface Payload {
44
[key: string]: any;
55
}
66

77
export class Client {
8-
98
endpoint: string = 'https://appwrite.io/v1';
10-
headers: DocumentData = {
9+
headers: Payload = {
1110
'content-type': '',
1211
'x-sdk-version': '{{spec.title | caseDash}}:{{ language.name | caseLower }}:{{ sdk.version }}',
1312
{% for key,header in spec.global.defaultHeaders %}
@@ -55,32 +54,32 @@ export class Client {
5554
return this;
5655
}
5756

58-
withoutHeader(key: string, headers: DocumentData): DocumentData {
59-
return Object.keys(headers).reduce((acc: DocumentData, cv) => {
60-
if (cv == 'content-type') return acc
61-
acc[cv] = headers[cv]
62-
return acc
57+
withoutHeader(key: string, headers: Payload): Payload {
58+
return Object.keys(headers).reduce((acc: Payload, cv) => {
59+
if (cv == 'content-type') return acc;
60+
acc[cv] = headers[cv];
61+
return acc;
6362
}, {})
6463
}
6564

66-
async call(method: string, path: string = '', headers: DocumentData = {}, params: DocumentData = {}) {
67-
headers = Object.assign(this.headers, headers);
65+
async call(method: string, path: string = '', headers: Payload = {}, params: Payload = {}) {
66+
headers = { ...this.headers, ...headers };
6867

6968
let body;
70-
const url = new URL(this.endpoint + path)
69+
const url = new URL(this.endpoint + path);
7170
if (method.toUpperCase() === 'GET') {
72-
url.search = new URLSearchParams(this.flatten(params)).toString()
73-
body = null
71+
url.search = new URLSearchParams(this.flatten(params)).toString();
72+
body = null;
7473
} else if (headers['content-type'].toLowerCase().startsWith('multipart/form-data')) {
75-
headers = this.withoutHeader('content-type', headers)
76-
const formData = new FormData()
77-
const flatParams = this.flatten(params)
74+
headers = this.withoutHeader('content-type', headers);
75+
const formData = new FormData();
76+
const flatParams = this.flatten(params);
7877
for (const key in flatParams) {
7978
formData.append(key, flatParams[key]);
8079
}
81-
body = formData
80+
body = formData;
8281
} else {
83-
body = JSON.stringify(params)
82+
body = JSON.stringify(params);
8483
}
8584

8685
const options = {
@@ -99,7 +98,7 @@ export class Client {
9998
throw new {{ spec.title | caseUcfirst}}Exception(res.message, res.status, res);
10099
}
101100

102-
return response.json()
101+
return response.json();
103102
} else {
104103
if(response.status >= 400) {
105104
let res = await response.text();
@@ -112,15 +111,15 @@ export class Client {
112111
}
113112
}
114113

115-
flatten(data: DocumentData, prefix = '') {
116-
let output: DocumentData = {};
114+
flatten(data: Payload, prefix = '') {
115+
let output: Payload = {};
117116

118117
for (const key in data) {
119118
let value = data[key];
120119
let finalKey = prefix ? prefix + '[' + key +']' : key;
121120

122121
if (Array.isArray(value)) {
123-
output = Object.assign(output, this.flatten(value, finalKey)); // @todo: handle name collision here if needed
122+
output = { ...output, ...this.flatten(value, finalKey) }; // @todo: handle name collision here if needed
124123
}
125124
else {
126125
output[finalKey] = value;

templates/deno/src/exception.ts.twig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ export class {{ spec.title | caseUcfirst}}Exception {
33
code: Number;
44
response: any;
55

6-
constructor(message: String, code: Number, response: any) {
6+
constructor(message: String, code: Number = 0, response: any = "") {
77
this.message = message;
88
this.code = code;
99
this.response = response;
Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { Service } from "../service.ts";
2-
import { DocumentData } from '../client.ts'
1+
import { Service } from '../service.ts';
2+
import { Payload } from '../client.ts';
3+
import { AppwriteException } from '../exception.ts';
34

45
export class {{ service.name | caseUcfirst }} extends Service {
56
{% for method in service.methods %}
@@ -12,32 +13,43 @@ export class {{ service.name | caseUcfirst }} extends Service {
1213
*
1314
{% endif %}
1415
{% for parameter in method.parameters.all %}
15-
* @param {{ parameter.type | typeName }} {{ parameter.name | caseCamel }}
16+
* @param {{ '{' }}{{ parameter.type | typeName }}{{ '}' }} {{ parameter.name | caseCamel }}
1617
{% endfor %}
17-
* @throws Exception
18-
* @return Promise<string>
18+
* @throws {AppwriteException}
19+
* @returns {Promise}
1920
*/
20-
async {{ method.name | caseCamel }}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel }}: {{ parameter.type | typeName }}{{ parameter | paramDefault }}{% if not loop.last %}, {% endif %}{% endfor %}): Promise<string> {
21-
let path = '{{ method.path }}'{% for parameter in method.parameters.path %}.replace(new RegExp('{{ '{' }}{{ parameter.name | caseCamel }}{{ '}' }}', 'g'), {{ parameter.name | caseCamel }}){% endfor %};
22-
23-
return await this.client.call('{{ method.method | caseLower }}', path, {
24-
{% for parameter in method.parameters.header %}
25-
'{{ parameter.name }}': ${{ parameter.name | caseCamel }},
26-
{% endfor %}
27-
{% for key, header in method.headers %}
28-
'{{ key }}': '{{ header }}',
21+
async {{ 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 %}: {{ parameter.type | typeName }}{% if not loop.last %}, {% endif %}{% endfor %}): Promise<{% if method.type == 'location' %}Response{% else %}T{% endif %}> {
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 %}
2929
{% endfor %}
30-
},
31-
{
30+
let path = '{{ method.path }}'{% for parameter in method.parameters.path %}.replace('{{ '{' }}{{ parameter.name | caseCamel }}{{ '}' }}', {{ parameter.name | caseCamel }}){% endfor %};
31+
let payload: Payload = {};
32+
3233
{% for parameter in method.parameters.query %}
33-
'{{ parameter.name }}': {{ parameter.name | caseCamel }}{% if not loop.last %},{% endif %}
34+
if (typeof {{ parameter.name | caseCamel }} !== 'undefined') {
35+
payload['{{ parameter.name }}'] = {{ parameter.name | caseCamel }};
36+
}
3437

3538
{% endfor %}
3639
{% for parameter in method.parameters.body %}
37-
'{{ parameter.name }}': {{ parameter.name | caseCamel }}{% if not loop.last %},{% endif %}
40+
if (typeof {{ parameter.name | caseCamel }} !== 'undefined') {
41+
payload['{{ parameter.name }}'] = {{ parameter.name | caseCamel }};
42+
}
3843

3944
{% endfor %}
40-
});
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 }}',
51+
{% endfor %}
52+
}, payload);
4153
}
4254
{% endfor %}
4355
}

0 commit comments

Comments
 (0)