appwrite-utils-cli 1.5.2 → 1.6.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 (233) hide show
  1. package/CHANGELOG.md +199 -0
  2. package/README.md +251 -29
  3. package/dist/adapters/AdapterFactory.d.ts +10 -3
  4. package/dist/adapters/AdapterFactory.js +213 -17
  5. package/dist/adapters/TablesDBAdapter.js +60 -17
  6. package/dist/backups/operations/bucketBackup.d.ts +19 -0
  7. package/dist/backups/operations/bucketBackup.js +197 -0
  8. package/dist/backups/operations/collectionBackup.d.ts +30 -0
  9. package/dist/backups/operations/collectionBackup.js +201 -0
  10. package/dist/backups/operations/comprehensiveBackup.d.ts +25 -0
  11. package/dist/backups/operations/comprehensiveBackup.js +238 -0
  12. package/dist/backups/schemas/bucketManifest.d.ts +93 -0
  13. package/dist/backups/schemas/bucketManifest.js +33 -0
  14. package/dist/backups/schemas/comprehensiveManifest.d.ts +108 -0
  15. package/dist/backups/schemas/comprehensiveManifest.js +32 -0
  16. package/dist/backups/tracking/centralizedTracking.d.ts +34 -0
  17. package/dist/backups/tracking/centralizedTracking.js +274 -0
  18. package/dist/cli/commands/configCommands.d.ts +8 -0
  19. package/dist/cli/commands/configCommands.js +160 -0
  20. package/dist/cli/commands/databaseCommands.d.ts +13 -0
  21. package/dist/cli/commands/databaseCommands.js +479 -0
  22. package/dist/cli/commands/functionCommands.d.ts +7 -0
  23. package/dist/cli/commands/functionCommands.js +289 -0
  24. package/dist/cli/commands/schemaCommands.d.ts +7 -0
  25. package/dist/cli/commands/schemaCommands.js +134 -0
  26. package/dist/cli/commands/transferCommands.d.ts +5 -0
  27. package/dist/cli/commands/transferCommands.js +384 -0
  28. package/dist/collections/attributes.d.ts +5 -4
  29. package/dist/collections/attributes.js +539 -246
  30. package/dist/collections/indexes.js +39 -37
  31. package/dist/collections/methods.d.ts +2 -16
  32. package/dist/collections/methods.js +90 -538
  33. package/dist/collections/transferOperations.d.ts +7 -0
  34. package/dist/collections/transferOperations.js +331 -0
  35. package/dist/collections/wipeOperations.d.ts +16 -0
  36. package/dist/collections/wipeOperations.js +328 -0
  37. package/dist/config/configMigration.d.ts +87 -0
  38. package/dist/config/configMigration.js +390 -0
  39. package/dist/config/configValidation.d.ts +66 -0
  40. package/dist/config/configValidation.js +358 -0
  41. package/dist/config/yamlConfig.d.ts +455 -1
  42. package/dist/config/yamlConfig.js +145 -52
  43. package/dist/databases/methods.js +3 -2
  44. package/dist/databases/setup.d.ts +1 -2
  45. package/dist/databases/setup.js +9 -87
  46. package/dist/examples/yamlTerminologyExample.d.ts +42 -0
  47. package/dist/examples/yamlTerminologyExample.js +269 -0
  48. package/dist/functions/deployments.js +11 -10
  49. package/dist/functions/methods.d.ts +1 -1
  50. package/dist/functions/methods.js +5 -4
  51. package/dist/init.js +9 -9
  52. package/dist/interactiveCLI.d.ts +8 -17
  53. package/dist/interactiveCLI.js +209 -1172
  54. package/dist/main.js +364 -21
  55. package/dist/migrations/afterImportActions.js +22 -30
  56. package/dist/migrations/appwriteToX.js +71 -25
  57. package/dist/migrations/dataLoader.js +35 -26
  58. package/dist/migrations/importController.js +29 -30
  59. package/dist/migrations/relationships.js +13 -12
  60. package/dist/migrations/services/ImportOrchestrator.js +16 -19
  61. package/dist/migrations/transfer.js +46 -46
  62. package/dist/migrations/yaml/YamlImportConfigLoader.d.ts +3 -1
  63. package/dist/migrations/yaml/YamlImportConfigLoader.js +6 -3
  64. package/dist/migrations/yaml/YamlImportIntegration.d.ts +9 -3
  65. package/dist/migrations/yaml/YamlImportIntegration.js +22 -11
  66. package/dist/migrations/yaml/generateImportSchemas.d.ts +14 -1
  67. package/dist/migrations/yaml/generateImportSchemas.js +736 -7
  68. package/dist/schemas/authUser.d.ts +1 -1
  69. package/dist/setupController.js +3 -2
  70. package/dist/shared/backupMetadataSchema.d.ts +94 -0
  71. package/dist/shared/backupMetadataSchema.js +38 -0
  72. package/dist/shared/backupTracking.d.ts +18 -0
  73. package/dist/shared/backupTracking.js +176 -0
  74. package/dist/shared/confirmationDialogs.js +15 -15
  75. package/dist/shared/errorUtils.d.ts +54 -0
  76. package/dist/shared/errorUtils.js +95 -0
  77. package/dist/shared/functionManager.js +20 -19
  78. package/dist/shared/indexManager.js +12 -11
  79. package/dist/shared/jsonSchemaGenerator.js +10 -26
  80. package/dist/shared/logging.d.ts +51 -0
  81. package/dist/shared/logging.js +70 -0
  82. package/dist/shared/messageFormatter.d.ts +2 -0
  83. package/dist/shared/messageFormatter.js +10 -0
  84. package/dist/shared/migrationHelpers.d.ts +6 -16
  85. package/dist/shared/migrationHelpers.js +24 -21
  86. package/dist/shared/operationLogger.d.ts +8 -1
  87. package/dist/shared/operationLogger.js +11 -24
  88. package/dist/shared/operationQueue.d.ts +28 -1
  89. package/dist/shared/operationQueue.js +268 -66
  90. package/dist/shared/operationsTable.d.ts +26 -0
  91. package/dist/shared/operationsTable.js +286 -0
  92. package/dist/shared/operationsTableSchema.d.ts +48 -0
  93. package/dist/shared/operationsTableSchema.js +35 -0
  94. package/dist/shared/relationshipExtractor.d.ts +56 -0
  95. package/dist/shared/relationshipExtractor.js +138 -0
  96. package/dist/shared/schemaGenerator.d.ts +19 -1
  97. package/dist/shared/schemaGenerator.js +56 -75
  98. package/dist/storage/backupCompression.d.ts +20 -0
  99. package/dist/storage/backupCompression.js +67 -0
  100. package/dist/storage/methods.d.ts +16 -2
  101. package/dist/storage/methods.js +98 -14
  102. package/dist/users/methods.js +9 -8
  103. package/dist/utils/configDiscovery.d.ts +78 -0
  104. package/dist/utils/configDiscovery.js +430 -0
  105. package/dist/utils/directoryUtils.d.ts +22 -0
  106. package/dist/utils/directoryUtils.js +59 -0
  107. package/dist/utils/getClientFromConfig.d.ts +17 -8
  108. package/dist/utils/getClientFromConfig.js +162 -17
  109. package/dist/utils/helperFunctions.d.ts +16 -2
  110. package/dist/utils/helperFunctions.js +19 -5
  111. package/dist/utils/loadConfigs.d.ts +34 -9
  112. package/dist/utils/loadConfigs.js +236 -316
  113. package/dist/utils/pathResolvers.d.ts +53 -0
  114. package/dist/utils/pathResolvers.js +72 -0
  115. package/dist/utils/projectConfig.d.ts +119 -0
  116. package/dist/utils/projectConfig.js +171 -0
  117. package/dist/utils/retryFailedPromises.js +4 -2
  118. package/dist/utils/sessionAuth.d.ts +48 -0
  119. package/dist/utils/sessionAuth.js +164 -0
  120. package/dist/utils/sessionPreservationExample.d.ts +1666 -0
  121. package/dist/utils/sessionPreservationExample.js +101 -0
  122. package/dist/utils/setupFiles.js +301 -41
  123. package/dist/utils/typeGuards.d.ts +35 -0
  124. package/dist/utils/typeGuards.js +57 -0
  125. package/dist/utils/versionDetection.js +145 -9
  126. package/dist/utils/yamlConverter.d.ts +53 -3
  127. package/dist/utils/yamlConverter.js +232 -13
  128. package/dist/utils/yamlLoader.d.ts +70 -0
  129. package/dist/utils/yamlLoader.js +263 -0
  130. package/dist/utilsController.d.ts +36 -3
  131. package/dist/utilsController.js +186 -56
  132. package/package.json +12 -2
  133. package/src/adapters/AdapterFactory.ts +263 -35
  134. package/src/adapters/TablesDBAdapter.ts +225 -36
  135. package/src/backups/operations/bucketBackup.ts +277 -0
  136. package/src/backups/operations/collectionBackup.ts +310 -0
  137. package/src/backups/operations/comprehensiveBackup.ts +342 -0
  138. package/src/backups/schemas/bucketManifest.ts +78 -0
  139. package/src/backups/schemas/comprehensiveManifest.ts +76 -0
  140. package/src/backups/tracking/centralizedTracking.ts +352 -0
  141. package/src/cli/commands/configCommands.ts +194 -0
  142. package/src/cli/commands/databaseCommands.ts +635 -0
  143. package/src/cli/commands/functionCommands.ts +379 -0
  144. package/src/cli/commands/schemaCommands.ts +163 -0
  145. package/src/cli/commands/transferCommands.ts +457 -0
  146. package/src/collections/attributes.ts +900 -621
  147. package/src/collections/attributes.ts.backup +1555 -0
  148. package/src/collections/indexes.ts +116 -114
  149. package/src/collections/methods.ts +295 -968
  150. package/src/collections/transferOperations.ts +516 -0
  151. package/src/collections/wipeOperations.ts +501 -0
  152. package/src/config/README.md +274 -0
  153. package/src/config/configMigration.ts +575 -0
  154. package/src/config/configValidation.ts +445 -0
  155. package/src/config/yamlConfig.ts +168 -55
  156. package/src/databases/methods.ts +3 -2
  157. package/src/databases/setup.ts +11 -138
  158. package/src/examples/yamlTerminologyExample.ts +341 -0
  159. package/src/functions/deployments.ts +14 -12
  160. package/src/functions/methods.ts +11 -11
  161. package/src/functions/templates/hono-typescript/README.md +286 -0
  162. package/src/functions/templates/hono-typescript/package.json +26 -0
  163. package/src/functions/templates/hono-typescript/src/adapters/request.ts +74 -0
  164. package/src/functions/templates/hono-typescript/src/adapters/response.ts +106 -0
  165. package/src/functions/templates/hono-typescript/src/app.ts +180 -0
  166. package/src/functions/templates/hono-typescript/src/context.ts +103 -0
  167. package/src/functions/templates/hono-typescript/src/index.ts +54 -0
  168. package/src/functions/templates/hono-typescript/src/middleware/appwrite.ts +119 -0
  169. package/src/functions/templates/hono-typescript/tsconfig.json +20 -0
  170. package/src/functions/templates/typescript-node/package.json +2 -1
  171. package/src/functions/templates/typescript-node/src/context.ts +103 -0
  172. package/src/functions/templates/typescript-node/src/index.ts +18 -12
  173. package/src/functions/templates/uv/pyproject.toml +1 -0
  174. package/src/functions/templates/uv/src/context.py +125 -0
  175. package/src/functions/templates/uv/src/index.py +35 -5
  176. package/src/init.ts +9 -11
  177. package/src/interactiveCLI.ts +274 -1563
  178. package/src/main.ts +418 -24
  179. package/src/migrations/afterImportActions.ts +71 -44
  180. package/src/migrations/appwriteToX.ts +100 -34
  181. package/src/migrations/dataLoader.ts +48 -34
  182. package/src/migrations/importController.ts +44 -39
  183. package/src/migrations/relationships.ts +28 -18
  184. package/src/migrations/services/ImportOrchestrator.ts +24 -27
  185. package/src/migrations/transfer.ts +159 -121
  186. package/src/migrations/yaml/YamlImportConfigLoader.ts +11 -4
  187. package/src/migrations/yaml/YamlImportIntegration.ts +47 -20
  188. package/src/migrations/yaml/generateImportSchemas.ts +751 -12
  189. package/src/setupController.ts +3 -2
  190. package/src/shared/backupMetadataSchema.ts +93 -0
  191. package/src/shared/backupTracking.ts +211 -0
  192. package/src/shared/confirmationDialogs.ts +19 -19
  193. package/src/shared/errorUtils.ts +110 -0
  194. package/src/shared/functionManager.ts +21 -20
  195. package/src/shared/indexManager.ts +12 -11
  196. package/src/shared/jsonSchemaGenerator.ts +38 -52
  197. package/src/shared/logging.ts +75 -0
  198. package/src/shared/messageFormatter.ts +14 -1
  199. package/src/shared/migrationHelpers.ts +45 -38
  200. package/src/shared/operationLogger.ts +11 -36
  201. package/src/shared/operationQueue.ts +322 -93
  202. package/src/shared/operationsTable.ts +338 -0
  203. package/src/shared/operationsTableSchema.ts +60 -0
  204. package/src/shared/relationshipExtractor.ts +214 -0
  205. package/src/shared/schemaGenerator.ts +179 -219
  206. package/src/storage/backupCompression.ts +88 -0
  207. package/src/storage/methods.ts +131 -34
  208. package/src/users/methods.ts +11 -9
  209. package/src/utils/configDiscovery.ts +502 -0
  210. package/src/utils/directoryUtils.ts +61 -0
  211. package/src/utils/getClientFromConfig.ts +205 -22
  212. package/src/utils/helperFunctions.ts +23 -5
  213. package/src/utils/loadConfigs.ts +313 -345
  214. package/src/utils/pathResolvers.ts +81 -0
  215. package/src/utils/projectConfig.ts +299 -0
  216. package/src/utils/retryFailedPromises.ts +4 -2
  217. package/src/utils/sessionAuth.ts +230 -0
  218. package/src/utils/setupFiles.ts +322 -54
  219. package/src/utils/typeGuards.ts +65 -0
  220. package/src/utils/versionDetection.ts +218 -64
  221. package/src/utils/yamlConverter.ts +296 -13
  222. package/src/utils/yamlLoader.ts +364 -0
  223. package/src/utilsController.ts +314 -110
  224. package/tests/README.md +497 -0
  225. package/tests/adapters/AdapterFactory.test.ts +277 -0
  226. package/tests/integration/syncOperations.test.ts +463 -0
  227. package/tests/jest.config.js +25 -0
  228. package/tests/migration/configMigration.test.ts +546 -0
  229. package/tests/setup.ts +62 -0
  230. package/tests/testUtils.ts +340 -0
  231. package/tests/utils/loadConfigs.test.ts +350 -0
  232. package/tests/validation/configValidation.test.ts +412 -0
  233. package/src/utils/schemaStrings.ts +0 -517
@@ -27,19 +27,56 @@ export interface YamlCollectionData {
27
27
  onDelete?: string;
28
28
  side?: string;
29
29
  }>;
30
+ // Table terminology support (columns is an alias for attributes)
31
+ columns?: Array<{
32
+ key: string;
33
+ type: string;
34
+ size?: number;
35
+ required?: boolean;
36
+ array?: boolean;
37
+ default?: any;
38
+ min?: number;
39
+ max?: number;
40
+ elements?: string[];
41
+ relatedTable?: string;
42
+ relationType?: string;
43
+ twoWay?: boolean;
44
+ twoWayKey?: string;
45
+ onDelete?: string;
46
+ side?: string;
47
+ }>;
30
48
  indexes?: Array<{
31
49
  key: string;
32
50
  type: string;
33
51
  attributes: string[];
52
+ columns?: string[]; // Support both terminologies
34
53
  orders?: string[];
35
54
  }>;
36
55
  importDefs?: any[];
37
56
  }
38
57
 
58
+ /**
59
+ * Configuration for terminology selection
60
+ */
61
+ export interface YamlTerminologyConfig {
62
+ useTableTerminology: boolean;
63
+ entityType: 'collection' | 'table';
64
+ schemaPath?: string;
65
+ }
66
+
39
67
  /**
40
68
  * Converts a Collection object to YAML format with proper schema reference
69
+ * Supports both collection and table terminology based on configuration
41
70
  */
42
- export function collectionToYaml(collection: Collection | CollectionCreate, schemaPath = "../.yaml_schemas/collection.schema.json"): string {
71
+ export function collectionToYaml(
72
+ collection: Collection | CollectionCreate,
73
+ config: YamlTerminologyConfig = {
74
+ useTableTerminology: false,
75
+ entityType: 'collection',
76
+ schemaPath: "../.yaml_schemas/collection.schema.json"
77
+ }
78
+ ): string {
79
+ const schemaPath = config.schemaPath || (config.useTableTerminology ? "../.yaml_schemas/table.schema.json" : "../.yaml_schemas/collection.schema.json");
43
80
  // Convert Collection to YamlCollectionData format
44
81
  const yamlData: YamlCollectionData = {
45
82
  name: collection.name,
@@ -56,9 +93,9 @@ export function collectionToYaml(collection: Collection | CollectionCreate, sche
56
93
  }));
57
94
  }
58
95
 
59
- // Convert attributes
96
+ // Convert attributes/columns based on terminology
60
97
  if (collection.attributes && collection.attributes.length > 0) {
61
- yamlData.attributes = collection.attributes.map(attr => {
98
+ const attributeArray = collection.attributes.map(attr => {
62
99
  const yamlAttr: any = {
63
100
  key: attr.key,
64
101
  type: attr.type,
@@ -81,16 +118,33 @@ export function collectionToYaml(collection: Collection | CollectionCreate, sche
81
118
 
82
119
  return yamlAttr;
83
120
  });
121
+
122
+ // Use appropriate terminology
123
+ if (config.useTableTerminology) {
124
+ yamlData.columns = attributeArray;
125
+ } else {
126
+ yamlData.attributes = attributeArray;
127
+ }
84
128
  }
85
129
 
86
- // Convert indexes
130
+ // Convert indexes with appropriate field references
87
131
  if (collection.indexes && collection.indexes.length > 0) {
88
- yamlData.indexes = collection.indexes.map(idx => ({
89
- key: idx.key,
90
- type: idx.type,
91
- attributes: idx.attributes,
92
- ...(idx.orders && idx.orders.length > 0 ? { orders: idx.orders } : {})
93
- }));
132
+ yamlData.indexes = collection.indexes.map(idx => {
133
+ const indexData: any = {
134
+ key: idx.key,
135
+ type: idx.type,
136
+ ...(idx.orders && idx.orders.length > 0 ? { orders: idx.orders } : {})
137
+ };
138
+
139
+ // Use appropriate field terminology for index references
140
+ if (config.useTableTerminology) {
141
+ indexData.columns = idx.attributes;
142
+ } else {
143
+ indexData.attributes = idx.attributes;
144
+ }
145
+
146
+ return indexData;
147
+ });
94
148
  }
95
149
 
96
150
  // Add import definitions if they exist
@@ -109,8 +163,11 @@ export function collectionToYaml(collection: Collection | CollectionCreate, sche
109
163
  forceQuotes: false,
110
164
  });
111
165
 
166
+ // Determine the appropriate schema comment based on configuration
167
+ const entityType = config.useTableTerminology ? 'Table' : 'Collection';
168
+
112
169
  return `# yaml-language-server: $schema=${schemaPath}
113
- # Collection Definition: ${collection.name}
170
+ # ${entityType} Definition: ${collection.name}
114
171
  ${yamlContent}`;
115
172
  }
116
173
 
@@ -122,9 +179,235 @@ export function sanitizeFilename(name: string): string {
122
179
  }
123
180
 
124
181
  /**
125
- * Generates the filename for a collection YAML file
182
+ * Generates the filename for a collection/table YAML file
126
183
  */
127
- export function getCollectionYamlFilename(collection: Collection | CollectionCreate): string {
184
+ export function getCollectionYamlFilename(
185
+ collection: Collection | CollectionCreate,
186
+ useTableTerminology = false
187
+ ): string {
128
188
  return `${sanitizeFilename(collection.name)}.yaml`;
129
189
  }
130
190
 
191
+ /**
192
+ * Converts column terminology back to attribute terminology for loading
193
+ */
194
+ export function normalizeYamlData(yamlData: YamlCollectionData): YamlCollectionData {
195
+ const normalized = { ...yamlData };
196
+
197
+ // Convert columns to attributes if present
198
+ if (yamlData.columns && !yamlData.attributes) {
199
+ normalized.attributes = yamlData.columns.map(col => ({
200
+ ...col,
201
+ // Convert table-specific fields back to collection terminology
202
+ relatedCollection: (col as any).relatedTable || (col as any).relatedCollection,
203
+ }));
204
+ delete normalized.columns;
205
+ }
206
+
207
+ // Normalize index field references
208
+ if (normalized.indexes) {
209
+ normalized.indexes = normalized.indexes.map(idx => ({
210
+ ...idx,
211
+ attributes: idx.columns || idx.attributes,
212
+ // Remove columns field after normalization
213
+ columns: undefined
214
+ }));
215
+ }
216
+
217
+ return normalized;
218
+ }
219
+
220
+ /**
221
+ * Determines if YAML data uses table terminology
222
+ */
223
+ export function usesTableTerminology(yamlData: YamlCollectionData): boolean {
224
+ return !!(yamlData.columns && yamlData.columns.length > 0) ||
225
+ !!(yamlData.indexes?.some(idx => !!(idx as any).columns));
226
+ }
227
+
228
+ /**
229
+ * Converts between attribute and column terminology
230
+ */
231
+ export function convertTerminology(
232
+ yamlData: YamlCollectionData,
233
+ toTableTerminology: boolean
234
+ ): YamlCollectionData {
235
+ if (toTableTerminology) {
236
+ // Convert attributes to columns
237
+ const converted = { ...yamlData };
238
+ if (yamlData.attributes) {
239
+ converted.columns = yamlData.attributes.map(attr => ({
240
+ ...attr,
241
+ relatedTable: attr.relatedCollection,
242
+ relatedCollection: undefined
243
+ }));
244
+ delete converted.attributes;
245
+ }
246
+
247
+ // Convert index references
248
+ if (converted.indexes) {
249
+ converted.indexes = converted.indexes.map(idx => ({
250
+ ...idx,
251
+ columns: idx.attributes,
252
+ attributes: idx.attributes // Keep both for compatibility
253
+ }));
254
+ }
255
+
256
+ return converted;
257
+ } else {
258
+ // Convert columns to attributes (normalize)
259
+ return normalizeYamlData(yamlData);
260
+ }
261
+ }
262
+
263
+ /**
264
+ * Generates a template YAML file for collections or tables
265
+ */
266
+ export function generateYamlTemplate(
267
+ entityName: string,
268
+ config: YamlTerminologyConfig
269
+ ): string {
270
+ const entityType = config.useTableTerminology ? 'table' : 'collection';
271
+ const fieldsKey = config.useTableTerminology ? 'columns' : 'attributes';
272
+ const relationKey = config.useTableTerminology ? 'relatedTable' : 'relatedCollection';
273
+ const indexFieldsKey = config.useTableTerminology ? 'columns' : 'attributes';
274
+
275
+ // Build template dynamically to handle computed property names
276
+ const fieldsArray = [
277
+ {
278
+ key: "id",
279
+ type: "string",
280
+ required: true,
281
+ size: 36
282
+ },
283
+ {
284
+ key: "name",
285
+ type: "string",
286
+ required: true,
287
+ size: 255
288
+ },
289
+ {
290
+ key: "description",
291
+ type: "string",
292
+ required: false,
293
+ size: 1000
294
+ },
295
+ {
296
+ key: "isActive",
297
+ type: "boolean",
298
+ required: true,
299
+ default: true
300
+ },
301
+ {
302
+ key: "createdAt",
303
+ type: "datetime",
304
+ required: true
305
+ },
306
+ {
307
+ key: "tags",
308
+ type: "string",
309
+ array: true,
310
+ required: false
311
+ },
312
+ {
313
+ key: "categoryId",
314
+ type: "relationship",
315
+ relationType: "manyToOne",
316
+ [relationKey]: "Categories",
317
+ required: false,
318
+ onDelete: "setNull"
319
+ }
320
+ ];
321
+
322
+ const indexesArray = [
323
+ {
324
+ key: "name_index",
325
+ type: "key",
326
+ [indexFieldsKey]: ["name"]
327
+ },
328
+ {
329
+ key: "active_created_index",
330
+ type: "key",
331
+ [indexFieldsKey]: ["isActive", "createdAt"],
332
+ orders: ["asc", "desc"]
333
+ },
334
+ {
335
+ key: "name_fulltext",
336
+ type: "fulltext",
337
+ [indexFieldsKey]: ["name", "description"]
338
+ }
339
+ ];
340
+
341
+ const template: YamlCollectionData = {
342
+ name: entityName,
343
+ id: entityName.toLowerCase().replace(/\s+/g, '_'),
344
+ documentSecurity: false,
345
+ enabled: true,
346
+ permissions: [
347
+ {
348
+ permission: "read",
349
+ target: "users"
350
+ },
351
+ {
352
+ permission: "create",
353
+ target: "users"
354
+ },
355
+ {
356
+ permission: "update",
357
+ target: "users"
358
+ },
359
+ {
360
+ permission: "delete",
361
+ target: "users"
362
+ }
363
+ ],
364
+ importDefs: []
365
+ };
366
+
367
+ // Assign fields with correct property name
368
+ (template as any)[fieldsKey] = fieldsArray;
369
+ template.indexes = indexesArray as any;
370
+
371
+ // Generate YAML content
372
+ const yamlContent = yaml.dump(template, {
373
+ indent: 2,
374
+ lineWidth: 120,
375
+ sortKeys: false,
376
+ quotingType: '"',
377
+ forceQuotes: false,
378
+ });
379
+
380
+ // Add schema reference and documentation
381
+ const schemaPath = config.schemaPath ||
382
+ (config.useTableTerminology ? "../.yaml_schemas/table.schema.json" : "../.yaml_schemas/collection.schema.json");
383
+
384
+ const documentation = config.useTableTerminology
385
+ ? `# Table Definition: ${entityName}\n# This file defines a table for the new TablesDB API\n#\n# Key differences from Collections:\n# - Uses 'columns' instead of 'attributes'\n# - Uses 'relatedTable' instead of 'relatedCollection'\n# - Indexes reference 'columns' instead of 'attributes'\n#\n`
386
+ : `# Collection Definition: ${entityName}\n# This file defines a collection for the legacy Databases API\n#\n# Note: For new projects, consider using TablesDB API with table definitions\n#\n`;
387
+
388
+ return `# yaml-language-server: $schema=${schemaPath}\n${documentation}${yamlContent}`;
389
+ }
390
+
391
+ /**
392
+ * Generates example YAML files for both collection and table formats
393
+ */
394
+ export function generateExampleYamls(entityName: string): {
395
+ collection: string;
396
+ table: string;
397
+ } {
398
+ const collectionYaml = generateYamlTemplate(entityName, {
399
+ useTableTerminology: false,
400
+ entityType: 'collection'
401
+ });
402
+
403
+ const tableYaml = generateYamlTemplate(entityName, {
404
+ useTableTerminology: true,
405
+ entityType: 'table'
406
+ });
407
+
408
+ return {
409
+ collection: collectionYaml,
410
+ table: tableYaml
411
+ };
412
+ }
413
+