appwrite-cli 12.0.1 → 13.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/README.md +2 -2
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +145 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/client.d.ts +89 -0
- package/dist/lib/client.d.ts.map +1 -0
- package/dist/lib/client.js +227 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/commands/account.d.ts +379 -0
- package/dist/lib/commands/account.d.ts.map +1 -0
- package/dist/lib/commands/account.js +1228 -0
- package/dist/lib/commands/account.js.map +1 -0
- package/dist/lib/commands/console.d.ts +20 -0
- package/dist/lib/commands/console.d.ts.map +1 -0
- package/dist/lib/commands/console.js +78 -0
- package/dist/lib/commands/console.js.map +1 -0
- package/dist/lib/commands/databases.d.ts +732 -0
- package/dist/lib/commands/databases.d.ts.map +1 -0
- package/dist/lib/commands/databases.js +2196 -0
- package/dist/lib/commands/databases.js.map +1 -0
- package/dist/lib/commands/functions.d.ts +310 -0
- package/dist/lib/commands/functions.d.ts.map +1 -0
- package/dist/lib/commands/functions.js +1100 -0
- package/dist/lib/commands/functions.js.map +1 -0
- package/dist/lib/commands/generic.d.ts +17 -0
- package/dist/lib/commands/generic.d.ts.map +1 -0
- package/dist/lib/commands/generic.js +279 -0
- package/dist/lib/commands/generic.js.map +1 -0
- package/dist/lib/commands/graphql.d.ts +19 -0
- package/dist/lib/commands/graphql.d.ts.map +1 -0
- package/dist/lib/commands/graphql.js +77 -0
- package/dist/lib/commands/graphql.js.map +1 -0
- package/dist/lib/commands/health.d.ts +153 -0
- package/dist/lib/commands/health.d.ts.map +1 -0
- package/dist/lib/commands/health.js +464 -0
- package/dist/lib/commands/health.js.map +1 -0
- package/dist/lib/commands/init.d.ts +3 -0
- package/dist/lib/commands/init.d.ts.map +1 -0
- package/dist/lib/commands/init.js +518 -0
- package/dist/lib/commands/init.js.map +1 -0
- package/dist/lib/commands/locale.d.ts +53 -0
- package/dist/lib/commands/locale.d.ts.map +1 -0
- package/dist/lib/commands/locale.js +165 -0
- package/dist/lib/commands/locale.js.map +1 -0
- package/dist/lib/commands/messaging.d.ts +588 -0
- package/dist/lib/commands/messaging.d.ts.map +1 -0
- package/dist/lib/commands/messaging.js +2042 -0
- package/dist/lib/commands/messaging.js.map +1 -0
- package/dist/lib/commands/migrations.d.ts +150 -0
- package/dist/lib/commands/migrations.d.ts.map +1 -0
- package/dist/lib/commands/migrations.js +524 -0
- package/dist/lib/commands/migrations.js.map +1 -0
- package/dist/lib/commands/organizations.d.ts +11 -0
- package/dist/lib/commands/organizations.d.ts.map +1 -0
- package/dist/lib/commands/organizations.js +31 -0
- package/dist/lib/commands/organizations.js.map +1 -0
- package/dist/lib/commands/project.d.ts +53 -0
- package/dist/lib/commands/project.d.ts.map +1 -0
- package/dist/lib/commands/project.js +176 -0
- package/dist/lib/commands/project.js.map +1 -0
- package/dist/lib/commands/projects.d.ts +516 -0
- package/dist/lib/commands/projects.d.ts.map +1 -0
- package/dist/lib/commands/projects.js +1590 -0
- package/dist/lib/commands/projects.js.map +1 -0
- package/dist/lib/commands/proxy.d.ts +71 -0
- package/dist/lib/commands/proxy.d.ts.map +1 -0
- package/dist/lib/commands/proxy.js +240 -0
- package/dist/lib/commands/proxy.js.map +1 -0
- package/dist/lib/commands/pull.d.ts +8 -0
- package/dist/lib/commands/pull.d.ts.map +1 -0
- package/dist/lib/commands/pull.js +455 -0
- package/dist/lib/commands/pull.js.map +1 -0
- package/dist/lib/commands/push.d.ts +4 -0
- package/dist/lib/commands/push.d.ts.map +1 -0
- package/dist/lib/commands/push.js +2154 -0
- package/dist/lib/commands/push.js.map +1 -0
- package/dist/lib/commands/run.d.ts +3 -0
- package/dist/lib/commands/run.d.ts.map +1 -0
- package/dist/lib/commands/run.js +287 -0
- package/dist/lib/commands/run.js.map +1 -0
- package/dist/lib/commands/sites.d.ts +296 -0
- package/dist/lib/commands/sites.d.ts.map +1 -0
- package/dist/lib/commands/sites.js +1046 -0
- package/dist/lib/commands/sites.js.map +1 -0
- package/dist/lib/commands/storage.d.ts +170 -0
- package/dist/lib/commands/storage.d.ts.map +1 -0
- package/dist/lib/commands/storage.js +651 -0
- package/dist/lib/commands/storage.js.map +1 -0
- package/dist/lib/commands/tables-db.d.ts +728 -0
- package/dist/lib/commands/tables-db.d.ts.map +1 -0
- package/dist/lib/commands/tables-db.js +2198 -0
- package/dist/lib/commands/tables-db.js.map +1 -0
- package/dist/lib/commands/teams.d.ts +129 -0
- package/dist/lib/commands/teams.d.ts.map +1 -0
- package/dist/lib/commands/teams.js +403 -0
- package/dist/lib/commands/teams.js.map +1 -0
- package/dist/lib/commands/tokens.d.ts +48 -0
- package/dist/lib/commands/tokens.d.ts.map +1 -0
- package/dist/lib/commands/tokens.js +156 -0
- package/dist/lib/commands/tokens.js.map +1 -0
- package/dist/lib/commands/types.d.ts +3 -0
- package/dist/lib/commands/types.d.ts.map +1 -0
- package/dist/lib/commands/types.js +155 -0
- package/dist/lib/commands/types.js.map +1 -0
- package/dist/lib/commands/update.d.ts +3 -0
- package/dist/lib/commands/update.d.ts.map +1 -0
- package/dist/lib/commands/update.js +202 -0
- package/dist/lib/commands/update.js.map +1 -0
- package/dist/lib/commands/users.d.ts +382 -0
- package/dist/lib/commands/users.d.ts.map +1 -0
- package/dist/lib/commands/users.js +1195 -0
- package/dist/lib/commands/users.js.map +1 -0
- package/dist/lib/commands/vcs.d.ts +92 -0
- package/dist/lib/commands/vcs.d.ts.map +1 -0
- package/dist/lib/commands/vcs.js +276 -0
- package/dist/lib/commands/vcs.js.map +1 -0
- package/dist/lib/config.d.ts +118 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/{lib → dist/lib}/config.js +204 -325
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/emulation/docker.d.ts +15 -0
- package/dist/lib/emulation/docker.d.ts.map +1 -0
- package/dist/lib/emulation/docker.js +220 -0
- package/dist/lib/emulation/docker.js.map +1 -0
- package/dist/lib/emulation/utils.d.ts +29 -0
- package/dist/lib/emulation/utils.d.ts.map +1 -0
- package/dist/lib/emulation/utils.js +168 -0
- package/dist/lib/emulation/utils.js.map +1 -0
- package/dist/lib/exception.d.ts +8 -0
- package/dist/lib/exception.d.ts.map +1 -0
- package/dist/lib/exception.js +16 -0
- package/dist/lib/exception.js.map +1 -0
- package/dist/lib/id.d.ts +7 -0
- package/dist/lib/id.d.ts.map +1 -0
- package/dist/lib/id.js +32 -0
- package/dist/lib/id.js.map +1 -0
- package/dist/lib/paginate.d.ts +10 -0
- package/dist/lib/paginate.d.ts.map +1 -0
- package/{lib → dist/lib}/paginate.js +9 -15
- package/dist/lib/paginate.js.map +1 -0
- package/dist/lib/parser.d.ts +18 -0
- package/dist/lib/parser.d.ts.map +1 -0
- package/dist/lib/parser.js +237 -0
- package/dist/lib/parser.js.map +1 -0
- package/dist/lib/questions.d.ts +59 -0
- package/dist/lib/questions.d.ts.map +1 -0
- package/dist/lib/questions.js +995 -0
- package/dist/lib/questions.js.map +1 -0
- package/dist/lib/sdks.d.ts +4 -0
- package/dist/lib/sdks.d.ts.map +1 -0
- package/dist/lib/sdks.js +51 -0
- package/dist/lib/sdks.js.map +1 -0
- package/dist/lib/spinner.d.ts +28 -0
- package/dist/lib/spinner.d.ts.map +1 -0
- package/{lib → dist/lib}/spinner.js +34 -45
- package/dist/lib/spinner.js.map +1 -0
- package/dist/lib/type-generation/attribute.d.ts +17 -0
- package/dist/lib/type-generation/attribute.d.ts.map +1 -0
- package/dist/lib/type-generation/attribute.js +19 -0
- package/dist/lib/type-generation/attribute.js.map +1 -0
- package/dist/lib/type-generation/languages/csharp.d.ts +7 -0
- package/dist/lib/type-generation/languages/csharp.d.ts.map +1 -0
- package/dist/lib/type-generation/languages/csharp.js +180 -0
- package/dist/lib/type-generation/languages/csharp.js.map +1 -0
- package/dist/lib/type-generation/languages/dart.d.ts +8 -0
- package/dist/lib/type-generation/languages/dart.d.ts.map +1 -0
- package/dist/lib/type-generation/languages/dart.js +197 -0
- package/dist/lib/type-generation/languages/dart.js.map +1 -0
- package/dist/lib/type-generation/languages/java.d.ts +7 -0
- package/dist/lib/type-generation/languages/java.d.ts.map +1 -0
- package/dist/lib/type-generation/languages/java.js +140 -0
- package/dist/lib/type-generation/languages/java.js.map +1 -0
- package/dist/lib/type-generation/languages/javascript.d.ts +9 -0
- package/dist/lib/type-generation/languages/javascript.d.ts.map +1 -0
- package/dist/lib/type-generation/languages/javascript.js +108 -0
- package/dist/lib/type-generation/languages/javascript.js.map +1 -0
- package/dist/lib/type-generation/languages/kotlin.d.ts +7 -0
- package/dist/lib/type-generation/languages/kotlin.d.ts.map +1 -0
- package/dist/lib/type-generation/languages/kotlin.js +95 -0
- package/dist/lib/type-generation/languages/kotlin.js.map +1 -0
- package/dist/lib/type-generation/languages/language.d.ts +43 -0
- package/dist/lib/type-generation/languages/language.d.ts.map +1 -0
- package/dist/lib/type-generation/languages/language.js +82 -0
- package/dist/lib/type-generation/languages/language.js.map +1 -0
- package/dist/lib/type-generation/languages/php.d.ts +7 -0
- package/dist/lib/type-generation/languages/php.d.ts.map +1 -0
- package/dist/lib/type-generation/languages/php.js +116 -0
- package/dist/lib/type-generation/languages/php.js.map +1 -0
- package/dist/lib/type-generation/languages/swift.d.ts +7 -0
- package/dist/lib/type-generation/languages/swift.d.ts.map +1 -0
- package/dist/lib/type-generation/languages/swift.js +179 -0
- package/dist/lib/type-generation/languages/swift.js.map +1 -0
- package/dist/lib/type-generation/languages/typescript.d.ts +9 -0
- package/dist/lib/type-generation/languages/typescript.d.ts.map +1 -0
- package/dist/lib/type-generation/languages/typescript.js +112 -0
- package/dist/lib/type-generation/languages/typescript.js.map +1 -0
- package/dist/lib/types.d.ts +133 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +3 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/utils.d.ts +15 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/{lib → dist/lib}/utils.js +74 -120
- package/dist/lib/utils.js.map +1 -0
- package/dist/lib/validations.d.ts +2 -0
- package/dist/lib/validations.d.ts.map +1 -0
- package/dist/lib/validations.js +20 -0
- package/dist/lib/validations.js.map +1 -0
- package/docs/examples/databases/upsert-document.md +1 -2
- package/index.ts +152 -0
- package/install.ps1 +2 -5
- package/install.sh +1 -2
- package/lib/client.ts +259 -0
- package/lib/commands/{account.js → account.ts} +408 -662
- package/lib/commands/console.ts +112 -0
- package/lib/commands/{databases.js → databases.ts} +818 -1136
- package/lib/commands/{functions.js → functions.ts} +381 -526
- package/lib/commands/{generic.js → generic.ts} +47 -39
- package/lib/commands/graphql.ts +110 -0
- package/lib/commands/{health.js → health.ts} +168 -284
- package/lib/commands/{init.js → init.ts} +68 -66
- package/lib/commands/{locale.js → locale.ts} +75 -121
- package/lib/commands/{messaging.js → messaging.ts} +699 -937
- package/lib/commands/{migrations.js → migrations.ts} +182 -258
- package/lib/commands/organizations.ts +46 -0
- package/lib/commands/{project.js → project.ts} +75 -111
- package/lib/commands/{projects.js → projects.ts} +587 -843
- package/lib/commands/{proxy.js → proxy.ts} +94 -140
- package/lib/commands/{pull.js → pull.ts} +54 -44
- package/lib/commands/{push.js → push.ts} +235 -191
- package/lib/commands/{run.js → run.ts} +61 -55
- package/lib/commands/{sites.js → sites.ts} +364 -504
- package/lib/commands/{storage.js → storage.ts} +216 -292
- package/lib/commands/{tables-db.js → tables-db.ts} +817 -1126
- package/lib/commands/{teams.js → teams.ts} +162 -236
- package/lib/commands/{tokens.js → tokens.ts} +70 -99
- package/lib/commands/{types.js → types.ts} +37 -35
- package/lib/commands/{update.js → update.ts} +25 -27
- package/lib/commands/{users.js → users.ts} +426 -644
- package/lib/commands/{vcs.js → vcs.ts} +118 -174
- package/lib/config.ts +854 -0
- package/lib/emulation/{docker.js → docker.ts} +39 -38
- package/lib/emulation/utils.ts +193 -0
- package/lib/exception.ts +20 -0
- package/lib/{id.js → id.ts} +5 -5
- package/lib/paginate.ts +63 -0
- package/lib/parser.ts +238 -0
- package/lib/{questions.js → questions.ts} +148 -156
- package/lib/sdks.ts +55 -0
- package/lib/spinner.ts +118 -0
- package/lib/type-generation/attribute.ts +17 -0
- package/lib/type-generation/languages/{csharp.js → csharp.ts} +59 -57
- package/lib/type-generation/languages/{dart.js → dart.ts} +91 -89
- package/lib/type-generation/languages/{java.js → java.ts} +58 -56
- package/lib/type-generation/languages/javascript.ts +111 -0
- package/lib/type-generation/languages/kotlin.ts +96 -0
- package/lib/type-generation/languages/language.ts +119 -0
- package/lib/type-generation/languages/{php.js → php.ts} +55 -53
- package/lib/type-generation/languages/{swift.js → swift.ts} +59 -57
- package/lib/type-generation/languages/typescript.ts +116 -0
- package/lib/types.ts +150 -0
- package/lib/utils.ts +322 -0
- package/lib/validations.ts +17 -0
- package/package.json +21 -12
- package/scoop/appwrite.config.json +3 -3
- package/tsconfig.json +30 -0
- package/index.js +0 -147
- package/lib/client.js +0 -254
- package/lib/commands/console.js +0 -127
- package/lib/commands/graphql.js +0 -126
- package/lib/commands/organizations.js +0 -48
- package/lib/emulation/utils.js +0 -186
- package/lib/exception.js +0 -9
- package/lib/parser.js +0 -250
- package/lib/sdks.js +0 -60
- package/lib/type-generation/attribute.js +0 -19
- package/lib/type-generation/languages/javascript.js +0 -111
- package/lib/type-generation/languages/kotlin.js +0 -94
- package/lib/type-generation/languages/language.js +0 -125
- package/lib/type-generation/languages/typescript.js +0 -116
- package/lib/validations.js +0 -17
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import fs = require('fs');
|
|
2
|
+
import path = require('path');
|
|
3
|
+
import { AttributeType } from '../attribute';
|
|
4
|
+
import { LanguageMeta, Attribute, Collection } from './language';
|
|
5
|
+
|
|
6
|
+
export class JavaScript extends LanguageMeta {
|
|
7
|
+
getType(attribute: Attribute, collections?: Collection[]): string {
|
|
8
|
+
let type = '';
|
|
9
|
+
switch (attribute.type) {
|
|
10
|
+
case AttributeType.STRING:
|
|
11
|
+
case AttributeType.EMAIL:
|
|
12
|
+
case AttributeType.DATETIME:
|
|
13
|
+
case AttributeType.IP:
|
|
14
|
+
case AttributeType.URL:
|
|
15
|
+
type = 'string';
|
|
16
|
+
if (attribute.format === AttributeType.ENUM) {
|
|
17
|
+
type = LanguageMeta.toPascalCase(attribute.key);
|
|
18
|
+
}
|
|
19
|
+
break;
|
|
20
|
+
case AttributeType.INTEGER:
|
|
21
|
+
type = 'number';
|
|
22
|
+
break;
|
|
23
|
+
case AttributeType.FLOAT:
|
|
24
|
+
type = 'number';
|
|
25
|
+
break;
|
|
26
|
+
case AttributeType.BOOLEAN:
|
|
27
|
+
type = 'boolean';
|
|
28
|
+
break;
|
|
29
|
+
case AttributeType.RELATIONSHIP:
|
|
30
|
+
const relatedCollection = collections?.find((c) => c.$id === attribute.relatedCollection);
|
|
31
|
+
if (!relatedCollection) {
|
|
32
|
+
throw new Error(`Related collection with ID '${attribute.relatedCollection}' not found.`);
|
|
33
|
+
}
|
|
34
|
+
type = LanguageMeta.toPascalCase(relatedCollection.name);
|
|
35
|
+
if (
|
|
36
|
+
(attribute.relationType === 'oneToMany' && attribute.side === 'parent') ||
|
|
37
|
+
(attribute.relationType === 'manyToOne' && attribute.side === 'child') ||
|
|
38
|
+
attribute.relationType === 'manyToMany'
|
|
39
|
+
) {
|
|
40
|
+
type = `${type}[]`;
|
|
41
|
+
}
|
|
42
|
+
break;
|
|
43
|
+
case AttributeType.POINT:
|
|
44
|
+
type = 'number[]';
|
|
45
|
+
break;
|
|
46
|
+
case AttributeType.LINESTRING:
|
|
47
|
+
type = 'number[][]';
|
|
48
|
+
break;
|
|
49
|
+
case AttributeType.POLYGON:
|
|
50
|
+
type = 'number[][][]';
|
|
51
|
+
break;
|
|
52
|
+
default:
|
|
53
|
+
throw new Error(`Unknown attribute type: ${attribute.type}`);
|
|
54
|
+
}
|
|
55
|
+
if (attribute.array) {
|
|
56
|
+
type += '[]';
|
|
57
|
+
}
|
|
58
|
+
if (!attribute.required && attribute.default === null) {
|
|
59
|
+
type += ' | null';
|
|
60
|
+
}
|
|
61
|
+
return type;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
isSingleFile(): boolean {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
private _getAppwriteDependency(): string {
|
|
69
|
+
if (fs.existsSync(path.resolve(process.cwd(), 'package.json'))) {
|
|
70
|
+
const packageJsonRaw = fs.readFileSync(path.resolve(process.cwd(), 'package.json'));
|
|
71
|
+
const packageJson = JSON.parse(packageJsonRaw.toString('utf-8'));
|
|
72
|
+
return packageJson.dependencies && packageJson.dependencies['node-appwrite'] ? 'node-appwrite' : 'appwrite';
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return 'appwrite';
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
getTemplate(): string {
|
|
79
|
+
return `/**
|
|
80
|
+
* @typedef {import('${this._getAppwriteDependency()}').Models.Row} Row
|
|
81
|
+
*/
|
|
82
|
+
|
|
83
|
+
// This file is auto-generated by the Appwrite CLI.
|
|
84
|
+
// You can regenerate it by running \`appwrite ${process.argv.slice(2).join(' ')}\`.
|
|
85
|
+
|
|
86
|
+
<% for (const collection of collections) { -%>
|
|
87
|
+
<% for (const attribute of collection.attributes) { -%>
|
|
88
|
+
<% if (attribute.format === 'enum') { -%>
|
|
89
|
+
/**
|
|
90
|
+
* @typedef {"<%- attribute.elements.join('"|"') %>"} <%- toPascalCase(attribute.key) %>
|
|
91
|
+
*/
|
|
92
|
+
|
|
93
|
+
<% } -%>
|
|
94
|
+
<% } -%>
|
|
95
|
+
<% } -%>
|
|
96
|
+
<% for (const [index, collection] of Object.entries(collections)) { %>/**
|
|
97
|
+
* @typedef {Row & {
|
|
98
|
+
<% for (const attribute of collection.attributes) { -%>
|
|
99
|
+
* <%- strict ? toCamelCase(attribute.key) : attribute.key %>: <%- getType(attribute, collections) %>;
|
|
100
|
+
<% } -%>
|
|
101
|
+
* }} <%- toPascalCase(collection.name) %>
|
|
102
|
+
*/
|
|
103
|
+
<% if (index < collections.length - 1) { %>
|
|
104
|
+
<% } -%>
|
|
105
|
+
<% } %>`;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
getFileName(_: Collection | undefined): string {
|
|
109
|
+
return 'appwrite-types.js';
|
|
110
|
+
}
|
|
111
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { AttributeType } from '../attribute';
|
|
2
|
+
import { LanguageMeta, Attribute, Collection } from './language';
|
|
3
|
+
|
|
4
|
+
export class Kotlin extends LanguageMeta {
|
|
5
|
+
getType(attribute: Attribute, collections?: Collection[], collectionName?: string): string {
|
|
6
|
+
let type = '';
|
|
7
|
+
switch (attribute.type) {
|
|
8
|
+
case AttributeType.STRING:
|
|
9
|
+
case AttributeType.EMAIL:
|
|
10
|
+
case AttributeType.DATETIME:
|
|
11
|
+
type = 'String';
|
|
12
|
+
if (attribute.format === AttributeType.ENUM) {
|
|
13
|
+
type = LanguageMeta.toPascalCase(collectionName!) + LanguageMeta.toPascalCase(attribute.key);
|
|
14
|
+
}
|
|
15
|
+
break;
|
|
16
|
+
case AttributeType.INTEGER:
|
|
17
|
+
type = 'Int';
|
|
18
|
+
break;
|
|
19
|
+
case AttributeType.FLOAT:
|
|
20
|
+
type = 'Float';
|
|
21
|
+
break;
|
|
22
|
+
case AttributeType.BOOLEAN:
|
|
23
|
+
type = 'Boolean';
|
|
24
|
+
break;
|
|
25
|
+
case AttributeType.RELATIONSHIP:
|
|
26
|
+
const relatedCollection = collections?.find((c) => c.$id === attribute.relatedCollection);
|
|
27
|
+
if (!relatedCollection) {
|
|
28
|
+
throw new Error(`Related collection with ID '${attribute.relatedCollection}' not found.`);
|
|
29
|
+
}
|
|
30
|
+
type = LanguageMeta.toPascalCase(relatedCollection.name);
|
|
31
|
+
if (
|
|
32
|
+
(attribute.relationType === 'oneToMany' && attribute.side === 'parent') ||
|
|
33
|
+
(attribute.relationType === 'manyToOne' && attribute.side === 'child') ||
|
|
34
|
+
attribute.relationType === 'manyToMany'
|
|
35
|
+
) {
|
|
36
|
+
type = `List<${type}>`;
|
|
37
|
+
}
|
|
38
|
+
break;
|
|
39
|
+
case AttributeType.POINT:
|
|
40
|
+
type = 'List<Double>';
|
|
41
|
+
break;
|
|
42
|
+
case AttributeType.LINESTRING:
|
|
43
|
+
type = 'List<List<Double>>';
|
|
44
|
+
break;
|
|
45
|
+
case AttributeType.POLYGON:
|
|
46
|
+
type = 'List<List<List<Double>>>';
|
|
47
|
+
break;
|
|
48
|
+
default:
|
|
49
|
+
throw new Error(`Unknown attribute type: ${attribute.type}`);
|
|
50
|
+
}
|
|
51
|
+
if (attribute.array) {
|
|
52
|
+
type = 'List<' + type + '>';
|
|
53
|
+
}
|
|
54
|
+
if (!attribute.required && attribute.default === null) {
|
|
55
|
+
type += '?';
|
|
56
|
+
}
|
|
57
|
+
return type;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
getTemplate(): string {
|
|
61
|
+
return `package io.appwrite.models
|
|
62
|
+
|
|
63
|
+
<% for (const attribute of collection.attributes) { -%>
|
|
64
|
+
<% if (attribute.type === 'relationship') { -%>
|
|
65
|
+
import <%- toPascalCase(collections.find(c => c.$id === attribute.relatedCollection).name) %>
|
|
66
|
+
|
|
67
|
+
<% } -%>
|
|
68
|
+
<% } -%>
|
|
69
|
+
/**
|
|
70
|
+
* This file is auto-generated by the Appwrite CLI.
|
|
71
|
+
* You can regenerate it by running \`appwrite ${process.argv.slice(2).join(' ')}\`.
|
|
72
|
+
*/
|
|
73
|
+
|
|
74
|
+
<% for (const attribute of collection.attributes) { -%>
|
|
75
|
+
<% if (attribute.format === 'enum') { -%>
|
|
76
|
+
enum class <%- toPascalCase(collection.name) %><%- toPascalCase(attribute.key) %> {
|
|
77
|
+
<% for (const [index, element] of Object.entries(attribute.elements)) { -%>
|
|
78
|
+
<%- strict ? toUpperSnakeCase(element) : element %><%- index < attribute.elements.length - 1 ? ',' : '' %>
|
|
79
|
+
<% } -%>
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
<% } -%>
|
|
83
|
+
<% } -%>
|
|
84
|
+
data class <%- toPascalCase(collection.name) %>(
|
|
85
|
+
<% for (const [index, attribute] of Object.entries(collection.attributes)) { -%>
|
|
86
|
+
val <%- strict ? toCamelCase(attribute.key) : attribute.key %>: <%- getType(attribute, collections, collection.name) %><% if (index < collection.attributes.length - 1) { %>,<% } %>
|
|
87
|
+
<% } -%>
|
|
88
|
+
)
|
|
89
|
+
`;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
getFileName(collection: Collection): string {
|
|
93
|
+
return LanguageMeta.toPascalCase(collection.name) + '.kt';
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import fs = require('fs');
|
|
2
|
+
import path = require('path');
|
|
3
|
+
|
|
4
|
+
export interface Attribute {
|
|
5
|
+
key: string;
|
|
6
|
+
type: string;
|
|
7
|
+
required?: boolean;
|
|
8
|
+
array?: boolean;
|
|
9
|
+
default?: any;
|
|
10
|
+
format?: string;
|
|
11
|
+
elements?: string[];
|
|
12
|
+
relatedCollection?: string;
|
|
13
|
+
relationType?: string;
|
|
14
|
+
side?: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface Collection {
|
|
18
|
+
$id: string;
|
|
19
|
+
name: string;
|
|
20
|
+
attributes: Attribute[];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export abstract class LanguageMeta {
|
|
24
|
+
constructor() {
|
|
25
|
+
if (new.target === LanguageMeta) {
|
|
26
|
+
throw new TypeError("Abstract classes can't be instantiated.");
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
static toKebabCase(string: string): string {
|
|
31
|
+
return string
|
|
32
|
+
.replace(/[^a-zA-Z0-9\s-_]/g, '') // Remove invalid characters
|
|
33
|
+
.replace(/([a-z])([A-Z])/g, '$1-$2') // Add hyphen between camelCase
|
|
34
|
+
.replace(/([A-Z])([A-Z][a-z])/g, '$1-$2') // Add hyphen between PascalCase
|
|
35
|
+
.replace(/[_\s]+/g, '-') // Replace spaces and underscores with hyphens
|
|
36
|
+
.replace(/^-+|-+$/g, '') // Remove leading and trailing hyphens
|
|
37
|
+
.replace(/--+/g, '-') // Replace multiple hyphens with a single hyphen
|
|
38
|
+
.toLowerCase();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
static toSnakeCase(string: string): string {
|
|
42
|
+
return this.toKebabCase(string).replace(/-/g, '_');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
static toUpperSnakeCase(string: string): string {
|
|
46
|
+
return this.toSnakeCase(string).toUpperCase();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
static toCamelCase(string: string): string {
|
|
50
|
+
return this.toKebabCase(string).replace(/-([a-z0-9])/g, (g) => g[1].toUpperCase());
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
static toPascalCase(string: string): string {
|
|
54
|
+
return this.toCamelCase(string).replace(/^./, (g) => g.toUpperCase());
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Get the type literal of the given attribute.
|
|
59
|
+
*/
|
|
60
|
+
abstract getType(attribute: Attribute, collections?: Collection[], collectionName?: string): string;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Returns true if the language uses a single file for all types.
|
|
64
|
+
*/
|
|
65
|
+
isSingleFile(): boolean {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Get the EJS template used to generate the types for this language.
|
|
71
|
+
*/
|
|
72
|
+
abstract getTemplate(): string;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Get the file extension used by files of this language.
|
|
76
|
+
*/
|
|
77
|
+
abstract getFileName(collection?: Collection): string;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const existsFiles = (...files: string[]): boolean =>
|
|
81
|
+
files.some((file) => fs.existsSync(path.join(process.cwd(), file)));
|
|
82
|
+
|
|
83
|
+
export function detectLanguage(): string {
|
|
84
|
+
if (existsFiles('tsconfig.json', 'deno.json')) {
|
|
85
|
+
return 'ts';
|
|
86
|
+
}
|
|
87
|
+
if (existsFiles('package.json')) {
|
|
88
|
+
return 'js';
|
|
89
|
+
}
|
|
90
|
+
if (existsFiles('composer.json')) {
|
|
91
|
+
return 'php';
|
|
92
|
+
}
|
|
93
|
+
if (existsFiles('requirements.txt', 'Pipfile', 'pyproject.toml')) {
|
|
94
|
+
return 'python';
|
|
95
|
+
}
|
|
96
|
+
if (existsFiles('Gemfile', 'Rakefile')) {
|
|
97
|
+
return 'ruby';
|
|
98
|
+
}
|
|
99
|
+
if (existsFiles('build.gradle.kts')) {
|
|
100
|
+
return 'kotlin';
|
|
101
|
+
}
|
|
102
|
+
if (existsFiles('build.gradle', 'pom.xml')) {
|
|
103
|
+
return 'java';
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
if (fs.readdirSync(process.cwd()).some((file) => file.endsWith('.csproj'))) {
|
|
107
|
+
return 'dotnet';
|
|
108
|
+
}
|
|
109
|
+
} catch {
|
|
110
|
+
// Directory not readable, skip .csproj detection
|
|
111
|
+
}
|
|
112
|
+
if (existsFiles('Package.swift')) {
|
|
113
|
+
return 'swift';
|
|
114
|
+
}
|
|
115
|
+
if (existsFiles('pubspec.yaml')) {
|
|
116
|
+
return 'dart';
|
|
117
|
+
}
|
|
118
|
+
throw new Error('Could not detect language, please specify with -l');
|
|
119
|
+
}
|
|
@@ -1,57 +1,60 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const { LanguageMeta } = require("./language");
|
|
1
|
+
import { AttributeType } from '../attribute';
|
|
2
|
+
import { LanguageMeta, Attribute, Collection } from './language';
|
|
4
3
|
|
|
5
|
-
class PHP extends LanguageMeta {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
let type = ""
|
|
11
|
-
switch (attribute.type) {
|
|
12
|
-
case AttributeType.STRING:
|
|
13
|
-
case AttributeType.EMAIL:
|
|
14
|
-
case AttributeType.DATETIME:
|
|
15
|
-
type = "string";
|
|
16
|
-
if (attribute.format === AttributeType.ENUM) {
|
|
17
|
-
type = LanguageMeta.toPascalCase(collectionName) + LanguageMeta.toPascalCase(attribute.key);
|
|
4
|
+
export class PHP extends LanguageMeta {
|
|
5
|
+
getType(attribute: Attribute, collections?: Collection[], collectionName?: string): string {
|
|
6
|
+
if (attribute.array) {
|
|
7
|
+
return 'array';
|
|
18
8
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
9
|
+
let type = '';
|
|
10
|
+
switch (attribute.type) {
|
|
11
|
+
case AttributeType.STRING:
|
|
12
|
+
case AttributeType.EMAIL:
|
|
13
|
+
case AttributeType.DATETIME:
|
|
14
|
+
type = 'string';
|
|
15
|
+
if (attribute.format === AttributeType.ENUM) {
|
|
16
|
+
type = LanguageMeta.toPascalCase(collectionName!) + LanguageMeta.toPascalCase(attribute.key);
|
|
17
|
+
}
|
|
18
|
+
break;
|
|
19
|
+
case AttributeType.INTEGER:
|
|
20
|
+
type = 'int';
|
|
21
|
+
break;
|
|
22
|
+
case AttributeType.FLOAT:
|
|
23
|
+
type = 'float';
|
|
24
|
+
break;
|
|
25
|
+
case AttributeType.BOOLEAN:
|
|
26
|
+
type = 'bool';
|
|
27
|
+
break;
|
|
28
|
+
case AttributeType.RELATIONSHIP:
|
|
29
|
+
const relatedCollection = collections?.find((c) => c.$id === attribute.relatedCollection);
|
|
30
|
+
if (!relatedCollection) {
|
|
31
|
+
throw new Error(`Related collection with ID '${attribute.relatedCollection}' not found.`);
|
|
32
|
+
}
|
|
33
|
+
type = LanguageMeta.toPascalCase(relatedCollection.name);
|
|
34
|
+
if (
|
|
35
|
+
(attribute.relationType === 'oneToMany' && attribute.side === 'parent') ||
|
|
36
|
+
(attribute.relationType === 'manyToOne' && attribute.side === 'child') ||
|
|
37
|
+
attribute.relationType === 'manyToMany'
|
|
38
|
+
) {
|
|
39
|
+
type = 'array';
|
|
40
|
+
}
|
|
41
|
+
break;
|
|
42
|
+
case AttributeType.POINT:
|
|
43
|
+
case AttributeType.LINESTRING:
|
|
44
|
+
case AttributeType.POLYGON:
|
|
45
|
+
type = 'array';
|
|
46
|
+
break;
|
|
47
|
+
default:
|
|
48
|
+
throw new Error(`Unknown attribute type: ${attribute.type}`);
|
|
33
49
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
type = "array";
|
|
50
|
+
if (!attribute.required && attribute.default === null) {
|
|
51
|
+
type += '|null';
|
|
37
52
|
}
|
|
38
|
-
|
|
39
|
-
case AttributeType.POINT:
|
|
40
|
-
case AttributeType.LINESTRING:
|
|
41
|
-
case AttributeType.POLYGON:
|
|
42
|
-
type = "array";
|
|
43
|
-
break;
|
|
44
|
-
default:
|
|
45
|
-
throw new Error(`Unknown attribute type: ${attribute.type}`);
|
|
46
|
-
}
|
|
47
|
-
if (!attribute.required && attribute.default === null) {
|
|
48
|
-
type += "|null";
|
|
53
|
+
return type;
|
|
49
54
|
}
|
|
50
|
-
return type;
|
|
51
|
-
}
|
|
52
55
|
|
|
53
|
-
|
|
54
|
-
|
|
56
|
+
getTemplate(): string {
|
|
57
|
+
return `<?php
|
|
55
58
|
namespace Appwrite\\Models;
|
|
56
59
|
|
|
57
60
|
// This file is auto-generated by the Appwrite CLI.
|
|
@@ -105,11 +108,10 @@ class <%- toPascalCase(collection.name) %> {
|
|
|
105
108
|
<% } -%>
|
|
106
109
|
}
|
|
107
110
|
`;
|
|
108
|
-
|
|
111
|
+
}
|
|
109
112
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
+
getFileName(collection: Collection): string {
|
|
114
|
+
return LanguageMeta.toPascalCase(collection.name) + '.php';
|
|
115
|
+
}
|
|
113
116
|
}
|
|
114
117
|
|
|
115
|
-
module.exports = { PHP };
|
|
@@ -1,61 +1,64 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const { LanguageMeta } = require("./language");
|
|
1
|
+
import { AttributeType } from '../attribute';
|
|
2
|
+
import { LanguageMeta, Attribute, Collection } from './language';
|
|
4
3
|
|
|
5
|
-
class Swift extends LanguageMeta {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
4
|
+
export class Swift extends LanguageMeta {
|
|
5
|
+
getType(attribute: Attribute, collections?: Collection[], collectionName?: string): string {
|
|
6
|
+
let type = '';
|
|
7
|
+
switch (attribute.type) {
|
|
8
|
+
case AttributeType.STRING:
|
|
9
|
+
case AttributeType.EMAIL:
|
|
10
|
+
case AttributeType.DATETIME:
|
|
11
|
+
type = 'String';
|
|
12
|
+
if (attribute.format === AttributeType.ENUM) {
|
|
13
|
+
type = LanguageMeta.toPascalCase(collectionName!) + LanguageMeta.toPascalCase(attribute.key);
|
|
14
|
+
}
|
|
15
|
+
break;
|
|
16
|
+
case AttributeType.INTEGER:
|
|
17
|
+
type = 'Int';
|
|
18
|
+
break;
|
|
19
|
+
case AttributeType.FLOAT:
|
|
20
|
+
type = 'Double';
|
|
21
|
+
break;
|
|
22
|
+
case AttributeType.BOOLEAN:
|
|
23
|
+
type = 'Bool';
|
|
24
|
+
break;
|
|
25
|
+
case AttributeType.RELATIONSHIP:
|
|
26
|
+
const relatedCollection = collections?.find((c) => c.$id === attribute.relatedCollection);
|
|
27
|
+
if (!relatedCollection) {
|
|
28
|
+
throw new Error(`Related collection with ID '${attribute.relatedCollection}' not found.`);
|
|
29
|
+
}
|
|
30
|
+
type = LanguageMeta.toPascalCase(relatedCollection.name);
|
|
31
|
+
if (
|
|
32
|
+
(attribute.relationType === 'oneToMany' && attribute.side === 'parent') ||
|
|
33
|
+
(attribute.relationType === 'manyToOne' && attribute.side === 'child') ||
|
|
34
|
+
attribute.relationType === 'manyToMany'
|
|
35
|
+
) {
|
|
36
|
+
type = `[${type}]`;
|
|
37
|
+
}
|
|
38
|
+
break;
|
|
39
|
+
case AttributeType.POINT:
|
|
40
|
+
type = '[Double]';
|
|
41
|
+
break;
|
|
42
|
+
case AttributeType.LINESTRING:
|
|
43
|
+
type = '[[Double]]';
|
|
44
|
+
break;
|
|
45
|
+
case AttributeType.POLYGON:
|
|
46
|
+
type = '[[[Double]]]';
|
|
47
|
+
break;
|
|
48
|
+
default:
|
|
49
|
+
throw new Error(`Unknown attribute type: ${attribute.type}`);
|
|
15
50
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
type = "Int";
|
|
19
|
-
break;
|
|
20
|
-
case AttributeType.FLOAT:
|
|
21
|
-
type = "Double";
|
|
22
|
-
break;
|
|
23
|
-
case AttributeType.BOOLEAN:
|
|
24
|
-
type = "Bool";
|
|
25
|
-
break;
|
|
26
|
-
case AttributeType.RELATIONSHIP:
|
|
27
|
-
const relatedCollection = collections.find(c => c.$id === attribute.relatedCollection);
|
|
28
|
-
if (!relatedCollection) {
|
|
29
|
-
throw new Error(`Related collection with ID '${attribute.relatedCollection}' not found.`);
|
|
51
|
+
if (attribute.array) {
|
|
52
|
+
type = '[' + type + ']';
|
|
30
53
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
type = `[${type}]`;
|
|
54
|
+
if (!attribute.required && attribute.default === null) {
|
|
55
|
+
type += '?';
|
|
34
56
|
}
|
|
35
|
-
|
|
36
|
-
case AttributeType.POINT:
|
|
37
|
-
type = "[Double]";
|
|
38
|
-
break;
|
|
39
|
-
case AttributeType.LINESTRING:
|
|
40
|
-
type = "[[Double]]";
|
|
41
|
-
break;
|
|
42
|
-
case AttributeType.POLYGON:
|
|
43
|
-
type = "[[[Double]]]";
|
|
44
|
-
break;
|
|
45
|
-
default:
|
|
46
|
-
throw new Error(`Unknown attribute type: ${attribute.type}`);
|
|
57
|
+
return type;
|
|
47
58
|
}
|
|
48
|
-
if (attribute.array) {
|
|
49
|
-
type = "[" + type + "]";
|
|
50
|
-
}
|
|
51
|
-
if (!attribute.required && attribute.default === null) {
|
|
52
|
-
type += "?";
|
|
53
|
-
}
|
|
54
|
-
return type;
|
|
55
|
-
}
|
|
56
59
|
|
|
57
|
-
|
|
58
|
-
|
|
60
|
+
getTemplate(): string {
|
|
61
|
+
return `import Foundation
|
|
59
62
|
|
|
60
63
|
/// This file is auto-generated by the Appwrite CLI.
|
|
61
64
|
/// You can regenerate it by running \`appwrite ${process.argv.slice(2).join(' ')}\`.
|
|
@@ -168,11 +171,10 @@ public class <%- toPascalCase(collection.name) %>: Codable {
|
|
|
168
171
|
)
|
|
169
172
|
}
|
|
170
173
|
}`;
|
|
171
|
-
|
|
174
|
+
}
|
|
172
175
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
+
getFileName(collection: Collection): string {
|
|
177
|
+
return LanguageMeta.toPascalCase(collection.name) + '.swift';
|
|
178
|
+
}
|
|
176
179
|
}
|
|
177
180
|
|
|
178
|
-
module.exports = { Swift };
|