Skip to content

Commit ba8f87c

Browse files
Merge pull request #306 from appwrite/feat-deno-response-models
feat(deno): response models
2 parents 8f8a013 + d50de18 commit ba8f87c

File tree

8 files changed

+100
-11
lines changed

8 files changed

+100
-11
lines changed

example.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ function getSSLPage($url) {
3939
// $spec = getSSLPage('https://appwrite.io/v1/open-api-2.json?extensions=1'); // Enable only with Appwrite local server running on port 80
4040
// $spec = getSSLPage('https://appwrite.io/v1/open-api-2.json?extensions=1&platform=console'); // Enable only with Appwrite local server running on port 80
4141
// $spec = file_get_contents('https://appwrite.io/specs/swagger2?platform=client');
42-
$spec = file_get_contents('./specs/swagger-appwrite.0.10.0.json');
42+
$spec = file_get_contents('./specs/swagger-appwrite.0.11.0.json');
4343

4444
if(empty($spec)) {
4545
throw new Exception('Failed to fetch spec from Appwrite server');

specs/swagger-appwrite.0.11.0.json

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

src/SDK/Language/Deno.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ public function getFiles()
3636
'template' => 'deno/src/service.ts.twig',
3737
'minify' => false,
3838
],
39+
[
40+
'scope' => 'default',
41+
'destination' => '/src/models.d.ts',
42+
'template' => 'deno/src/models.d.ts.twig',
43+
'minify' => false,
44+
],
3945
[
4046
'scope' => 'default',
4147
'destination' => '/src/exception.ts',

templates/deno/mod.ts.twig

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,6 @@ export {
1010
{% for service in spec.services %}
1111
{{service.name | caseUcfirst}},
1212
{% endfor %}
13-
};
13+
};
14+
15+
export type { Models } from "./src/models.d.ts";

templates/deno/src/client.ts.twig

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export class Client {
1313
'{{key}}':'{{header}}',
1414
{% endfor %}
1515
};
16-
16+
1717
{% for header in spec.global.headers %}
1818
/**
1919
* Set {{header.key | caseUcfirst}}
@@ -50,7 +50,7 @@ export class Client {
5050
*/
5151
addHeader(key: string, value: string): this {
5252
this.headers[key.toLowerCase()] = value;
53-
53+
5454
return this;
5555
}
5656

@@ -81,7 +81,7 @@ export class Client {
8181
} else {
8282
body = JSON.stringify(params);
8383
}
84-
84+
8585
const options = {
8686
method: method.toUpperCase(),
8787
headers: headers,
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
{% macro sub_schema(property, definition, spec) %}
2+
{% spaceless %}
3+
{% if property.sub_schema %}
4+
{% if _self.get_generics_sub(definition, spec) %}
5+
{{property.sub_schema | caseUcfirst}}<{{ _self.get_generics_sub(definition, spec) }}>{% if property.type == 'array' %}[]{% endif %}
6+
{% else %}
7+
{{property.sub_schema | caseUcfirst}}{% if property.type == 'array' %}[]{% endif %}
8+
{% endif %}
9+
{% else %}
10+
{{property.type | typeName}}
11+
{% endif %}
12+
{% endspaceless %}
13+
{% endmacro %}
14+
{% macro get_generics(definition, spec) %}
15+
{% spaceless %}
16+
{% for property in definition.properties %}
17+
{% if spec.definitions[property.sub_schema].additionalProperties %}
18+
{{property.sub_schema | caseUcfirst}} extends Models.{{property.sub_schema | caseUcfirst}}
19+
{% endif %}
20+
{% if spec.definitions[property.sub_schema] %}
21+
{{_self.get_generics(spec.definitions[property.sub_schema], spec)}}
22+
{% endif %}
23+
{% endfor %}
24+
{% endspaceless %}
25+
{% endmacro %}
26+
{% macro get_generics_sub(definition, spec, output = false) %}
27+
{% spaceless %}
28+
{% for property in definition.properties %}
29+
{% if spec.definitions[property.sub_schema].additionalProperties and output %}
30+
{{property.sub_schema | caseUcfirst}}
31+
{% endif %}
32+
{% if spec.definitions[property.sub_schema] %}
33+
{{_self.get_generics_sub(spec.definitions[property.sub_schema], spec, true)}}
34+
{% endif %}
35+
{% endfor %}
36+
{% endspaceless %}
37+
{% endmacro %}
38+
export namespace Models {
39+
{% for definition in spec.definitions %}
40+
/**
41+
* {{ definition.description }}
42+
*/
43+
export type {{ definition.name | caseUcfirst }}{% if _self.get_generics(definition, spec) %}<{{_self.get_generics(definition, spec)}}>{% endif %} = {
44+
{% for property in definition.properties %}
45+
/**
46+
* {{ property.description }}
47+
*/
48+
{{ property.name | escapeKeyword }}{% if not property.required %}?{% endif %}: {{_self.sub_schema(property, definition, spec)}};
49+
{% endfor %}
50+
}
51+
{% endfor %}
52+
}

templates/deno/src/service.ts.twig

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { Client } from "./client.ts";
22

33
export abstract class Service {
4-
54
client: Client;
65

76
/**

templates/deno/src/services/service.ts.twig

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,39 @@
1+
{% macro get_generics(definition, spec, output = false, first = false) %}
2+
{% spaceless %}
3+
{% if first and definition.additionalProperties %}
4+
{{definition.name | caseUcfirst}} extends Models.{{definition.name | caseUcfirst}}
5+
{% endif %}
6+
{% for property in definition.properties %}
7+
{% if spec.definitions[property.sub_schema].additionalProperties and output %}
8+
{{property.sub_schema | caseUcfirst}} extends Models.{{property.sub_schema | caseUcfirst}}
9+
{% endif %}
10+
{% if spec.definitions[property.sub_schema] %}
11+
{{_self.get_generics(spec.definitions[property.sub_schema], spec, true)}}
12+
{% endif %}
13+
{% endfor %}
14+
{% endspaceless %}
15+
{% endmacro %}
16+
{% macro get_generics_return(definition, spec) %}
17+
{% spaceless %}
18+
{% for property in definition.properties %}
19+
{% if spec.definitions[property.sub_schema].additionalProperties %}
20+
{{property.sub_schema | caseUcfirst}}
21+
{% endif %}
22+
{% if spec.definitions[property.sub_schema] %}
23+
{{_self.get_generics_return(spec.definitions[property.sub_schema], spec)}}
24+
{% endif %}
25+
{% endfor %}
26+
{% endspaceless %}
27+
{% endmacro %}
128
import { Service } from '../service.ts';
229
import { Payload } from '../client.ts';
330
import { AppwriteException } from '../exception.ts';
31+
import type { Models } from '../models.d.ts'
432

533
export class {{ service.name | caseUcfirst }} extends Service {
634
{% for method in service.methods %}
7-
35+
{% set generics = _self.get_generics(spec.definitions[method.responseModel], spec, true, true) %}
36+
{% set generics_return = _self.get_generics_return(spec.definitions[method.responseModel], spec) %}
837
/**
938
* {{ method.title }}
1039
*
@@ -18,7 +47,7 @@ export class {{ service.name | caseUcfirst }} extends Service {
1847
* @throws {AppwriteException}
1948
* @returns {Promise}
2049
*/
21-
async {{ method.name | caseCamel }}{% if method.type != "location" %}<T extends unknown>{% endif %}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required%}?{% endif %}: {{ parameter.type | typeName }}{% if not loop.last %}, {% endif %}{% endfor %}): Promise<{% if method.type == 'location' %}Response{% else %}T{% endif %}> {
50+
async {{ method.name | caseCamel }}{% if generics %}<{{generics}}>{% endif %}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required %}?{% endif %}: {{ parameter.type | typeName }}{% if not loop.last %}, {% endif %}{% endfor %}): Promise<{% if method.type == 'webAuth' %}Response{% elseif method.type == 'location' %}Response{% else %}{% if method.responseModel and method.responseModel != 'any' %}{% if not spec.definitions[method.responseModel].additionalProperties %}Models.{% endif %}{{method.responseModel | caseUcfirst}}{% if generics_return %}<{{generics_return}}>{% endif %}{% else %}Response{% endif %}{% endif %}> {
2251
{% for parameter in method.parameters.all %}
2352
{% if parameter.required %}
2453
if (typeof {{ parameter.name | caseCamel | escapeKeyword }} === 'undefined') {
@@ -44,12 +73,12 @@ export class {{ service.name | caseUcfirst }} extends Service {
4473
{% endfor %}
4574
return await this.client.call('{{ method.method | caseLower }}', path, {
4675
{% for parameter in method.parameters.header %}
47-
'{{ parameter.name }}': ${{ parameter.name | caseCamel | escapeKeyword }},
76+
'{{ parameter.name }}': ${{ parameter.name | caseCamel | escapeKeyword }},
4877
{% endfor %}
4978
{% for key, header in method.headers %}
50-
'{{ key }}': '{{ header }}',
79+
'{{ key }}': '{{ header }}',
5180
{% endfor %}
52-
}, payload);
81+
}, payload);
5382
}
5483
{% endfor %}
5584
}

0 commit comments

Comments
 (0)