From 467fe9c8b36f5630c2d257789bc7ba496f12235d Mon Sep 17 00:00:00 2001 From: Alessandro M Date: Fri, 10 Apr 2020 22:05:55 +0200 Subject: [PATCH] Add types declaration in JS SDK --- example.php | 3 +- src/SDK/Language/JS.php | 18 +++++++- templates/js/package.json.twig | 5 ++- templates/js/tsconfig.json.twig | 8 ++++ templates/js/types/index.d.ts.twig | 68 ++++++++++++++++++++++++++++++ 5 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 templates/js/tsconfig.json.twig create mode 100644 templates/js/types/index.d.ts.twig diff --git a/example.php b/example.php index 666b764ad..09d6c612a 100644 --- a/example.php +++ b/example.php @@ -32,7 +32,7 @@ function getSSLPage($url) { } //$spec = getSSLPage('https://appwrite.io/v1/open-api-2.json?extensions=1'); - $spec = getSSLPage('https://localhost:2444/v1/open-api-2.json?extensions=1'); // Enable only with Appwrite local server running on port 80 + $spec = getSSLPage('https://appwrite.io/v1/open-api-2.json?extensions=1'); // Enable only with Appwrite local server running on port 80 if(empty($spec)) { throw new Exception('Failed to fetch spec from Appwrite server'); @@ -80,6 +80,7 @@ function getSSLPage($url) { $sdk ->setDescription('Repo description goes here') ->setShortDescription('Repo short description goes here') + ->setVersion('0.0.0') ->setURL('https://example.com') ->setLogo('https://appwrite.io/v1/images/console.png') ->setLicenseContent('test test test') diff --git a/src/SDK/Language/JS.php b/src/SDK/Language/JS.php index 6eb47511e..a1cf6f11d 100644 --- a/src/SDK/Language/JS.php +++ b/src/SDK/Language/JS.php @@ -7,8 +7,8 @@ class JS extends Language { protected $params = [ - 'npmPackage' => 'packageName', - 'bowerPackage' => 'packageName', + 'npmPackage' => 'appwrite', + 'bowerPackage' => 'appwrite', ]; /** @@ -164,6 +164,18 @@ public function getFiles() 'template' => '/js/docs/example.md.twig', 'minify' => false, ], + [ + 'scope' => 'default', + 'destination' => 'types/index.d.ts', + 'template' => '/js/types/index.d.ts.twig', + 'minify' => false, + ], + [ + 'scope' => 'default', + 'destination' => 'tsconfig.json', + 'template' => '/js/tsconfig.json.swig', + 'minify' => false, + ], ]; } @@ -178,6 +190,8 @@ public function getTypeName($type) case self::TYPE_NUMBER: return 'number'; break; + case self::TYPE_ARRAY: + return 'string[]'; case self::TYPE_FILE: return 'File'; break; diff --git a/templates/js/package.json.twig b/templates/js/package.json.twig index 2c81ac0f9..bddd9452e 100644 --- a/templates/js/package.json.twig +++ b/templates/js/package.json.twig @@ -5,10 +5,13 @@ "version": "{{ sdk.version }}", "license": "{{ sdk.license }}", "main": "src/sdk.js", + "types": "types/index.d.ts", "repository": { "type": "git", "url": "{{ sdk.gitURL }}" }, - "devDependencies": {}, + "devDependencies": { + "typescript": "^3.6.4" + }, "dependencies": {} } \ No newline at end of file diff --git a/templates/js/tsconfig.json.twig b/templates/js/tsconfig.json.twig new file mode 100644 index 000000000..1e668ca62 --- /dev/null +++ b/templates/js/tsconfig.json.twig @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "target": "ES6", + "lib": ["ES2015", "ES6", "dom"], + "module": "commonjs", + "sourceMap": true + } +} \ No newline at end of file diff --git a/templates/js/types/index.d.ts.twig b/templates/js/types/index.d.ts.twig new file mode 100644 index 000000000..46580ae1a --- /dev/null +++ b/templates/js/types/index.d.ts.twig @@ -0,0 +1,68 @@ +// Type definitions for {{ language.params.npmPackage }} {{ sdk.version }} +// Project: {{ spec.title }} + + +/*~ This declaration specifies that the class constructor function + *~ is the exported object from the file + */ +export = {{ spec.title | caseUcfirst }}; + +/*~ Write your module's methods and properties in this class */ +declare class {{ spec.title | caseUcfirst }} { + constructor(); + + /** + * @param {string} endpoint + * @returns {this} + */ + setEndpoint(endpoint: string): this; + +{% for header in spec.global.headers %} + /** + * Set {{header.key | caseUcfirst}} + * +{% if header.description %} +{{header.description|comment2}} + * +{% endif %} + * @param value string + * + * @return this + */ + set{{header.key | caseUcfirst}}({{ header.key | caseCamel }}: string): this; +{% endfor %} + +{% for service in spec.services %} + {{ service.name }}:{{ spec.title | caseUcfirst }}.{{ service.name | caseUcfirst }}; +{% endfor %} + +} + +declare namespace {{ spec.title | caseUcfirst }} { + +{% for service in spec.services %} + export interface {{ service.name | caseUcfirst }} { + +{% for method in service.methods %} + /** + * {{ method.title }} + * +{% if method.description %} +{{ method.description|comment2 }} +{% endif %} + * +{% for parameter in method.parameters.all %} + * @param {{ '{' }}{{ parameter.type | typeName }}{{ '}' }} {{ parameter.name | caseCamel }} +{% endfor %} + * @throws {Error} + * @return {% if method.location %}{string}{% elseif method.cookies %}{null}{% else %}{Promise}{% endif %} + + */ + {{ method.name | caseCamel }}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel }}: {{ parameter.type | typeName }}{% if not loop.last %}, {% endif %}{% endfor %}): Promise; + +{% endfor %} + } + +{% endfor %} + +} \ No newline at end of file