appwrite-cli 12.0.0 → 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.
Files changed (283) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +2 -2
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +145 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/lib/client.d.ts +89 -0
  8. package/dist/lib/client.d.ts.map +1 -0
  9. package/dist/lib/client.js +227 -0
  10. package/dist/lib/client.js.map +1 -0
  11. package/dist/lib/commands/account.d.ts +379 -0
  12. package/dist/lib/commands/account.d.ts.map +1 -0
  13. package/dist/lib/commands/account.js +1228 -0
  14. package/dist/lib/commands/account.js.map +1 -0
  15. package/dist/lib/commands/console.d.ts +20 -0
  16. package/dist/lib/commands/console.d.ts.map +1 -0
  17. package/dist/lib/commands/console.js +78 -0
  18. package/dist/lib/commands/console.js.map +1 -0
  19. package/dist/lib/commands/databases.d.ts +732 -0
  20. package/dist/lib/commands/databases.d.ts.map +1 -0
  21. package/dist/lib/commands/databases.js +2196 -0
  22. package/dist/lib/commands/databases.js.map +1 -0
  23. package/dist/lib/commands/functions.d.ts +310 -0
  24. package/dist/lib/commands/functions.d.ts.map +1 -0
  25. package/dist/lib/commands/functions.js +1100 -0
  26. package/dist/lib/commands/functions.js.map +1 -0
  27. package/dist/lib/commands/generic.d.ts +17 -0
  28. package/dist/lib/commands/generic.d.ts.map +1 -0
  29. package/dist/lib/commands/generic.js +279 -0
  30. package/dist/lib/commands/generic.js.map +1 -0
  31. package/dist/lib/commands/graphql.d.ts +19 -0
  32. package/dist/lib/commands/graphql.d.ts.map +1 -0
  33. package/dist/lib/commands/graphql.js +77 -0
  34. package/dist/lib/commands/graphql.js.map +1 -0
  35. package/dist/lib/commands/health.d.ts +153 -0
  36. package/dist/lib/commands/health.d.ts.map +1 -0
  37. package/dist/lib/commands/health.js +464 -0
  38. package/dist/lib/commands/health.js.map +1 -0
  39. package/dist/lib/commands/init.d.ts +3 -0
  40. package/dist/lib/commands/init.d.ts.map +1 -0
  41. package/dist/lib/commands/init.js +518 -0
  42. package/dist/lib/commands/init.js.map +1 -0
  43. package/dist/lib/commands/locale.d.ts +53 -0
  44. package/dist/lib/commands/locale.d.ts.map +1 -0
  45. package/dist/lib/commands/locale.js +165 -0
  46. package/dist/lib/commands/locale.js.map +1 -0
  47. package/dist/lib/commands/messaging.d.ts +588 -0
  48. package/dist/lib/commands/messaging.d.ts.map +1 -0
  49. package/dist/lib/commands/messaging.js +2042 -0
  50. package/dist/lib/commands/messaging.js.map +1 -0
  51. package/dist/lib/commands/migrations.d.ts +150 -0
  52. package/dist/lib/commands/migrations.d.ts.map +1 -0
  53. package/dist/lib/commands/migrations.js +524 -0
  54. package/dist/lib/commands/migrations.js.map +1 -0
  55. package/dist/lib/commands/organizations.d.ts +11 -0
  56. package/dist/lib/commands/organizations.d.ts.map +1 -0
  57. package/dist/lib/commands/organizations.js +31 -0
  58. package/dist/lib/commands/organizations.js.map +1 -0
  59. package/dist/lib/commands/project.d.ts +53 -0
  60. package/dist/lib/commands/project.d.ts.map +1 -0
  61. package/dist/lib/commands/project.js +176 -0
  62. package/dist/lib/commands/project.js.map +1 -0
  63. package/dist/lib/commands/projects.d.ts +516 -0
  64. package/dist/lib/commands/projects.d.ts.map +1 -0
  65. package/dist/lib/commands/projects.js +1590 -0
  66. package/dist/lib/commands/projects.js.map +1 -0
  67. package/dist/lib/commands/proxy.d.ts +71 -0
  68. package/dist/lib/commands/proxy.d.ts.map +1 -0
  69. package/dist/lib/commands/proxy.js +240 -0
  70. package/dist/lib/commands/proxy.js.map +1 -0
  71. package/dist/lib/commands/pull.d.ts +8 -0
  72. package/dist/lib/commands/pull.d.ts.map +1 -0
  73. package/dist/lib/commands/pull.js +455 -0
  74. package/dist/lib/commands/pull.js.map +1 -0
  75. package/dist/lib/commands/push.d.ts +4 -0
  76. package/dist/lib/commands/push.d.ts.map +1 -0
  77. package/dist/lib/commands/push.js +2154 -0
  78. package/dist/lib/commands/push.js.map +1 -0
  79. package/dist/lib/commands/run.d.ts +3 -0
  80. package/dist/lib/commands/run.d.ts.map +1 -0
  81. package/dist/lib/commands/run.js +287 -0
  82. package/dist/lib/commands/run.js.map +1 -0
  83. package/dist/lib/commands/sites.d.ts +296 -0
  84. package/dist/lib/commands/sites.d.ts.map +1 -0
  85. package/dist/lib/commands/sites.js +1046 -0
  86. package/dist/lib/commands/sites.js.map +1 -0
  87. package/dist/lib/commands/storage.d.ts +170 -0
  88. package/dist/lib/commands/storage.d.ts.map +1 -0
  89. package/dist/lib/commands/storage.js +651 -0
  90. package/dist/lib/commands/storage.js.map +1 -0
  91. package/dist/lib/commands/tables-db.d.ts +728 -0
  92. package/dist/lib/commands/tables-db.d.ts.map +1 -0
  93. package/dist/lib/commands/tables-db.js +2198 -0
  94. package/dist/lib/commands/tables-db.js.map +1 -0
  95. package/dist/lib/commands/teams.d.ts +129 -0
  96. package/dist/lib/commands/teams.d.ts.map +1 -0
  97. package/dist/lib/commands/teams.js +403 -0
  98. package/dist/lib/commands/teams.js.map +1 -0
  99. package/dist/lib/commands/tokens.d.ts +48 -0
  100. package/dist/lib/commands/tokens.d.ts.map +1 -0
  101. package/dist/lib/commands/tokens.js +156 -0
  102. package/dist/lib/commands/tokens.js.map +1 -0
  103. package/dist/lib/commands/types.d.ts +3 -0
  104. package/dist/lib/commands/types.d.ts.map +1 -0
  105. package/dist/lib/commands/types.js +155 -0
  106. package/dist/lib/commands/types.js.map +1 -0
  107. package/dist/lib/commands/update.d.ts +3 -0
  108. package/dist/lib/commands/update.d.ts.map +1 -0
  109. package/dist/lib/commands/update.js +202 -0
  110. package/dist/lib/commands/update.js.map +1 -0
  111. package/dist/lib/commands/users.d.ts +382 -0
  112. package/dist/lib/commands/users.d.ts.map +1 -0
  113. package/dist/lib/commands/users.js +1195 -0
  114. package/dist/lib/commands/users.js.map +1 -0
  115. package/dist/lib/commands/vcs.d.ts +92 -0
  116. package/dist/lib/commands/vcs.d.ts.map +1 -0
  117. package/dist/lib/commands/vcs.js +276 -0
  118. package/dist/lib/commands/vcs.js.map +1 -0
  119. package/dist/lib/config.d.ts +118 -0
  120. package/dist/lib/config.d.ts.map +1 -0
  121. package/{lib → dist/lib}/config.js +204 -325
  122. package/dist/lib/config.js.map +1 -0
  123. package/dist/lib/emulation/docker.d.ts +15 -0
  124. package/dist/lib/emulation/docker.d.ts.map +1 -0
  125. package/dist/lib/emulation/docker.js +220 -0
  126. package/dist/lib/emulation/docker.js.map +1 -0
  127. package/dist/lib/emulation/utils.d.ts +29 -0
  128. package/dist/lib/emulation/utils.d.ts.map +1 -0
  129. package/dist/lib/emulation/utils.js +168 -0
  130. package/dist/lib/emulation/utils.js.map +1 -0
  131. package/dist/lib/exception.d.ts +8 -0
  132. package/dist/lib/exception.d.ts.map +1 -0
  133. package/dist/lib/exception.js +16 -0
  134. package/dist/lib/exception.js.map +1 -0
  135. package/dist/lib/id.d.ts +7 -0
  136. package/dist/lib/id.d.ts.map +1 -0
  137. package/dist/lib/id.js +32 -0
  138. package/dist/lib/id.js.map +1 -0
  139. package/dist/lib/paginate.d.ts +10 -0
  140. package/dist/lib/paginate.d.ts.map +1 -0
  141. package/{lib → dist/lib}/paginate.js +9 -15
  142. package/dist/lib/paginate.js.map +1 -0
  143. package/dist/lib/parser.d.ts +18 -0
  144. package/dist/lib/parser.d.ts.map +1 -0
  145. package/dist/lib/parser.js +237 -0
  146. package/dist/lib/parser.js.map +1 -0
  147. package/dist/lib/questions.d.ts +59 -0
  148. package/dist/lib/questions.d.ts.map +1 -0
  149. package/dist/lib/questions.js +995 -0
  150. package/dist/lib/questions.js.map +1 -0
  151. package/dist/lib/sdks.d.ts +4 -0
  152. package/dist/lib/sdks.d.ts.map +1 -0
  153. package/dist/lib/sdks.js +51 -0
  154. package/dist/lib/sdks.js.map +1 -0
  155. package/dist/lib/spinner.d.ts +28 -0
  156. package/dist/lib/spinner.d.ts.map +1 -0
  157. package/{lib → dist/lib}/spinner.js +34 -45
  158. package/dist/lib/spinner.js.map +1 -0
  159. package/dist/lib/type-generation/attribute.d.ts +17 -0
  160. package/dist/lib/type-generation/attribute.d.ts.map +1 -0
  161. package/dist/lib/type-generation/attribute.js +19 -0
  162. package/dist/lib/type-generation/attribute.js.map +1 -0
  163. package/dist/lib/type-generation/languages/csharp.d.ts +7 -0
  164. package/dist/lib/type-generation/languages/csharp.d.ts.map +1 -0
  165. package/dist/lib/type-generation/languages/csharp.js +180 -0
  166. package/dist/lib/type-generation/languages/csharp.js.map +1 -0
  167. package/dist/lib/type-generation/languages/dart.d.ts +8 -0
  168. package/dist/lib/type-generation/languages/dart.d.ts.map +1 -0
  169. package/dist/lib/type-generation/languages/dart.js +197 -0
  170. package/dist/lib/type-generation/languages/dart.js.map +1 -0
  171. package/dist/lib/type-generation/languages/java.d.ts +7 -0
  172. package/dist/lib/type-generation/languages/java.d.ts.map +1 -0
  173. package/dist/lib/type-generation/languages/java.js +140 -0
  174. package/dist/lib/type-generation/languages/java.js.map +1 -0
  175. package/dist/lib/type-generation/languages/javascript.d.ts +9 -0
  176. package/dist/lib/type-generation/languages/javascript.d.ts.map +1 -0
  177. package/dist/lib/type-generation/languages/javascript.js +108 -0
  178. package/dist/lib/type-generation/languages/javascript.js.map +1 -0
  179. package/dist/lib/type-generation/languages/kotlin.d.ts +7 -0
  180. package/dist/lib/type-generation/languages/kotlin.d.ts.map +1 -0
  181. package/dist/lib/type-generation/languages/kotlin.js +95 -0
  182. package/dist/lib/type-generation/languages/kotlin.js.map +1 -0
  183. package/dist/lib/type-generation/languages/language.d.ts +43 -0
  184. package/dist/lib/type-generation/languages/language.d.ts.map +1 -0
  185. package/dist/lib/type-generation/languages/language.js +82 -0
  186. package/dist/lib/type-generation/languages/language.js.map +1 -0
  187. package/dist/lib/type-generation/languages/php.d.ts +7 -0
  188. package/dist/lib/type-generation/languages/php.d.ts.map +1 -0
  189. package/dist/lib/type-generation/languages/php.js +116 -0
  190. package/dist/lib/type-generation/languages/php.js.map +1 -0
  191. package/dist/lib/type-generation/languages/swift.d.ts +7 -0
  192. package/dist/lib/type-generation/languages/swift.d.ts.map +1 -0
  193. package/dist/lib/type-generation/languages/swift.js +179 -0
  194. package/dist/lib/type-generation/languages/swift.js.map +1 -0
  195. package/dist/lib/type-generation/languages/typescript.d.ts +9 -0
  196. package/dist/lib/type-generation/languages/typescript.d.ts.map +1 -0
  197. package/dist/lib/type-generation/languages/typescript.js +112 -0
  198. package/dist/lib/type-generation/languages/typescript.js.map +1 -0
  199. package/dist/lib/types.d.ts +133 -0
  200. package/dist/lib/types.d.ts.map +1 -0
  201. package/dist/lib/types.js +3 -0
  202. package/dist/lib/types.js.map +1 -0
  203. package/dist/lib/utils.d.ts +15 -0
  204. package/dist/lib/utils.d.ts.map +1 -0
  205. package/{lib → dist/lib}/utils.js +74 -120
  206. package/dist/lib/utils.js.map +1 -0
  207. package/dist/lib/validations.d.ts +2 -0
  208. package/dist/lib/validations.d.ts.map +1 -0
  209. package/dist/lib/validations.js +20 -0
  210. package/dist/lib/validations.js.map +1 -0
  211. package/docs/examples/databases/upsert-document.md +1 -2
  212. package/index.ts +152 -0
  213. package/install.ps1 +2 -5
  214. package/install.sh +1 -2
  215. package/lib/client.ts +259 -0
  216. package/lib/commands/{account.js → account.ts} +410 -664
  217. package/lib/commands/console.ts +112 -0
  218. package/lib/commands/{databases.js → databases.ts} +818 -1136
  219. package/lib/commands/{functions.js → functions.ts} +381 -526
  220. package/lib/commands/{generic.js → generic.ts} +47 -39
  221. package/lib/commands/graphql.ts +110 -0
  222. package/lib/commands/{health.js → health.ts} +168 -284
  223. package/lib/commands/{init.js → init.ts} +68 -66
  224. package/lib/commands/{locale.js → locale.ts} +75 -121
  225. package/lib/commands/{messaging.js → messaging.ts} +699 -937
  226. package/lib/commands/{migrations.js → migrations.ts} +182 -258
  227. package/lib/commands/organizations.ts +46 -0
  228. package/lib/commands/{project.js → project.ts} +75 -111
  229. package/lib/commands/{projects.js → projects.ts} +587 -843
  230. package/lib/commands/{proxy.js → proxy.ts} +94 -140
  231. package/lib/commands/{pull.js → pull.ts} +54 -44
  232. package/lib/commands/{push.js → push.ts} +235 -191
  233. package/lib/commands/{run.js → run.ts} +61 -55
  234. package/lib/commands/{sites.js → sites.ts} +364 -504
  235. package/lib/commands/{storage.js → storage.ts} +216 -292
  236. package/lib/commands/{tables-db.js → tables-db.ts} +817 -1126
  237. package/lib/commands/{teams.js → teams.ts} +162 -236
  238. package/lib/commands/{tokens.js → tokens.ts} +70 -99
  239. package/lib/commands/{types.js → types.ts} +37 -35
  240. package/lib/commands/{update.js → update.ts} +25 -27
  241. package/lib/commands/{users.js → users.ts} +426 -644
  242. package/lib/commands/{vcs.js → vcs.ts} +122 -173
  243. package/lib/config.ts +854 -0
  244. package/lib/emulation/{docker.js → docker.ts} +39 -38
  245. package/lib/emulation/utils.ts +193 -0
  246. package/lib/exception.ts +20 -0
  247. package/lib/{id.js → id.ts} +5 -5
  248. package/lib/paginate.ts +63 -0
  249. package/lib/parser.ts +238 -0
  250. package/lib/{questions.js → questions.ts} +148 -156
  251. package/lib/sdks.ts +55 -0
  252. package/lib/spinner.ts +118 -0
  253. package/lib/type-generation/attribute.ts +17 -0
  254. package/lib/type-generation/languages/{csharp.js → csharp.ts} +59 -48
  255. package/lib/type-generation/languages/{dart.js → dart.ts} +91 -80
  256. package/lib/type-generation/languages/{java.js → java.ts} +58 -47
  257. package/lib/type-generation/languages/javascript.ts +111 -0
  258. package/lib/type-generation/languages/kotlin.ts +96 -0
  259. package/lib/type-generation/languages/language.ts +119 -0
  260. package/lib/type-generation/languages/{php.js → php.ts} +55 -48
  261. package/lib/type-generation/languages/{swift.js → swift.ts} +59 -48
  262. package/lib/type-generation/languages/typescript.ts +116 -0
  263. package/lib/types.ts +150 -0
  264. package/lib/utils.ts +322 -0
  265. package/lib/validations.ts +17 -0
  266. package/package.json +21 -12
  267. package/scoop/appwrite.config.json +3 -3
  268. package/tsconfig.json +30 -0
  269. package/index.js +0 -147
  270. package/lib/client.js +0 -254
  271. package/lib/commands/console.js +0 -127
  272. package/lib/commands/graphql.js +0 -126
  273. package/lib/commands/organizations.js +0 -48
  274. package/lib/emulation/utils.js +0 -186
  275. package/lib/exception.js +0 -9
  276. package/lib/parser.js +0 -250
  277. package/lib/sdks.js +0 -60
  278. package/lib/type-generation/attribute.js +0 -16
  279. package/lib/type-generation/languages/javascript.js +0 -102
  280. package/lib/type-generation/languages/kotlin.js +0 -85
  281. package/lib/type-generation/languages/language.js +0 -125
  282. package/lib/type-generation/languages/typescript.js +0 -107
  283. 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,52 +1,60 @@
1
- /** @typedef {import('../attribute').Attribute} Attribute */
2
- const { AttributeType } = require('../attribute');
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
- getType(attribute, collections, collectionName) {
7
- if (attribute.array) {
8
- return "array";
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
- break;
20
- case AttributeType.INTEGER:
21
- type = "int";
22
- break;
23
- case AttributeType.FLOAT:
24
- type = "float";
25
- break;
26
- case AttributeType.BOOLEAN:
27
- type = "bool";
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.`);
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
- type = LanguageMeta.toPascalCase(relatedCollection.name);
35
- if ((attribute.relationType === 'oneToMany' && attribute.side === 'parent') || (attribute.relationType === 'manyToOne' && attribute.side === 'child') || attribute.relationType === 'manyToMany') {
36
- type = "array";
50
+ if (!attribute.required && attribute.default === null) {
51
+ type += '|null';
37
52
  }
38
- break;
39
- default:
40
- throw new Error(`Unknown attribute type: ${attribute.type}`);
41
- }
42
- if (!attribute.required && attribute.default === null) {
43
- type += "|null";
53
+ return type;
44
54
  }
45
- return type;
46
- }
47
55
 
48
- getTemplate() {
49
- return `<?php
56
+ getTemplate(): string {
57
+ return `<?php
50
58
  namespace Appwrite\\Models;
51
59
 
52
60
  // This file is auto-generated by the Appwrite CLI.
@@ -100,11 +108,10 @@ class <%- toPascalCase(collection.name) %> {
100
108
  <% } -%>
101
109
  }
102
110
  `;
103
- }
111
+ }
104
112
 
105
- getFileName(collection) {
106
- return LanguageMeta.toPascalCase(collection.name) + ".php";
107
- }
113
+ getFileName(collection: Collection): string {
114
+ return LanguageMeta.toPascalCase(collection.name) + '.php';
115
+ }
108
116
  }
109
117
 
110
- module.exports = { PHP };
@@ -1,52 +1,64 @@
1
- /** @typedef {import('../attribute').Attribute} Attribute */
2
- const { AttributeType } = require('../attribute');
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
- getType(attribute, collections, collectionName) {
7
- let type = "";
8
- switch (attribute.type) {
9
- case AttributeType.STRING:
10
- case AttributeType.EMAIL:
11
- case AttributeType.DATETIME:
12
- type = "String";
13
- if (attribute.format === AttributeType.ENUM) {
14
- type = LanguageMeta.toPascalCase(collectionName) + LanguageMeta.toPascalCase(attribute.key);
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
- break;
17
- case AttributeType.INTEGER:
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
- type = LanguageMeta.toPascalCase(relatedCollection.name);
32
- if ((attribute.relationType === 'oneToMany' && attribute.side === 'parent') || (attribute.relationType === 'manyToOne' && attribute.side === 'child') || attribute.relationType === 'manyToMany') {
33
- type = `[${type}]`;
54
+ if (!attribute.required && attribute.default === null) {
55
+ type += '?';
34
56
  }
35
- break;
36
- default:
37
- throw new Error(`Unknown attribute type: ${attribute.type}`);
57
+ return type;
38
58
  }
39
- if (attribute.array) {
40
- type = "[" + type + "]";
41
- }
42
- if (!attribute.required && attribute.default === null) {
43
- type += "?";
44
- }
45
- return type;
46
- }
47
59
 
48
- getTemplate() {
49
- return `import Foundation
60
+ getTemplate(): string {
61
+ return `import Foundation
50
62
 
51
63
  /// This file is auto-generated by the Appwrite CLI.
52
64
  /// You can regenerate it by running \`appwrite ${process.argv.slice(2).join(' ')}\`.
@@ -159,11 +171,10 @@ public class <%- toPascalCase(collection.name) %>: Codable {
159
171
  )
160
172
  }
161
173
  }`;
162
- }
174
+ }
163
175
 
164
- getFileName(collection) {
165
- return LanguageMeta.toPascalCase(collection.name) + ".swift";
166
- }
176
+ getFileName(collection: Collection): string {
177
+ return LanguageMeta.toPascalCase(collection.name) + '.swift';
178
+ }
167
179
  }
168
180
 
169
- module.exports = { Swift };