appwrite-utils-cli 1.11.0 → 1.12.0

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 (250) hide show
  1. package/{src/adapters/index.ts → dist/adapters/index.d.ts} +0 -1
  2. package/dist/adapters/index.js +10 -0
  3. package/dist/backups/operations/bucketBackup.d.ts +19 -0
  4. package/dist/backups/operations/bucketBackup.js +197 -0
  5. package/dist/backups/operations/collectionBackup.d.ts +30 -0
  6. package/dist/backups/operations/collectionBackup.js +201 -0
  7. package/dist/backups/operations/comprehensiveBackup.d.ts +25 -0
  8. package/dist/backups/operations/comprehensiveBackup.js +238 -0
  9. package/dist/backups/schemas/bucketManifest.d.ts +93 -0
  10. package/dist/backups/schemas/bucketManifest.js +33 -0
  11. package/dist/backups/schemas/comprehensiveManifest.d.ts +108 -0
  12. package/dist/backups/schemas/comprehensiveManifest.js +32 -0
  13. package/dist/backups/tracking/centralizedTracking.d.ts +34 -0
  14. package/dist/backups/tracking/centralizedTracking.js +274 -0
  15. package/dist/cli/commands/configCommands.d.ts +8 -0
  16. package/dist/cli/commands/configCommands.js +210 -0
  17. package/dist/cli/commands/databaseCommands.d.ts +14 -0
  18. package/dist/cli/commands/databaseCommands.js +696 -0
  19. package/dist/cli/commands/functionCommands.d.ts +7 -0
  20. package/dist/cli/commands/functionCommands.js +330 -0
  21. package/dist/cli/commands/importFileCommands.d.ts +7 -0
  22. package/dist/cli/commands/importFileCommands.js +674 -0
  23. package/dist/cli/commands/schemaCommands.d.ts +7 -0
  24. package/dist/cli/commands/schemaCommands.js +169 -0
  25. package/dist/cli/commands/storageCommands.d.ts +5 -0
  26. package/dist/cli/commands/storageCommands.js +142 -0
  27. package/dist/cli/commands/transferCommands.d.ts +5 -0
  28. package/dist/cli/commands/transferCommands.js +382 -0
  29. package/dist/collections/columns.d.ts +13 -0
  30. package/dist/collections/columns.js +1339 -0
  31. package/dist/collections/indexes.d.ts +12 -0
  32. package/dist/collections/indexes.js +215 -0
  33. package/dist/collections/methods.d.ts +19 -0
  34. package/dist/collections/methods.js +605 -0
  35. package/dist/collections/tableOperations.d.ts +87 -0
  36. package/dist/collections/tableOperations.js +466 -0
  37. package/dist/collections/transferOperations.d.ts +8 -0
  38. package/dist/collections/transferOperations.js +411 -0
  39. package/dist/collections/wipeOperations.d.ts +17 -0
  40. package/dist/collections/wipeOperations.js +306 -0
  41. package/dist/databases/methods.d.ts +6 -0
  42. package/dist/databases/methods.js +35 -0
  43. package/dist/databases/setup.d.ts +5 -0
  44. package/dist/databases/setup.js +45 -0
  45. package/dist/examples/yamlTerminologyExample.d.ts +42 -0
  46. package/dist/examples/yamlTerminologyExample.js +272 -0
  47. package/dist/functions/deployments.d.ts +4 -0
  48. package/dist/functions/deployments.js +146 -0
  49. package/dist/functions/fnConfigDiscovery.d.ts +3 -0
  50. package/dist/functions/fnConfigDiscovery.js +108 -0
  51. package/dist/functions/methods.d.ts +16 -0
  52. package/dist/functions/methods.js +174 -0
  53. package/dist/init.d.ts +2 -0
  54. package/dist/init.js +57 -0
  55. package/dist/interactiveCLI.d.ts +36 -0
  56. package/dist/interactiveCLI.js +952 -0
  57. package/dist/main.d.ts +2 -0
  58. package/dist/main.js +1125 -0
  59. package/dist/migrations/afterImportActions.d.ts +17 -0
  60. package/dist/migrations/afterImportActions.js +305 -0
  61. package/dist/migrations/appwriteToX.d.ts +211 -0
  62. package/dist/migrations/appwriteToX.js +493 -0
  63. package/dist/migrations/comprehensiveTransfer.d.ts +147 -0
  64. package/dist/migrations/comprehensiveTransfer.js +1315 -0
  65. package/dist/migrations/dataLoader.d.ts +755 -0
  66. package/dist/migrations/dataLoader.js +1272 -0
  67. package/dist/migrations/importController.d.ts +25 -0
  68. package/dist/migrations/importController.js +283 -0
  69. package/dist/migrations/importDataActions.d.ts +50 -0
  70. package/dist/migrations/importDataActions.js +230 -0
  71. package/dist/migrations/relationships.d.ts +29 -0
  72. package/dist/migrations/relationships.js +203 -0
  73. package/dist/migrations/services/DataTransformationService.d.ts +55 -0
  74. package/dist/migrations/services/DataTransformationService.js +158 -0
  75. package/dist/migrations/services/FileHandlerService.d.ts +75 -0
  76. package/dist/migrations/services/FileHandlerService.js +236 -0
  77. package/dist/migrations/services/ImportOrchestrator.d.ts +99 -0
  78. package/dist/migrations/services/ImportOrchestrator.js +493 -0
  79. package/dist/migrations/services/RateLimitManager.d.ts +138 -0
  80. package/dist/migrations/services/RateLimitManager.js +279 -0
  81. package/dist/migrations/services/RelationshipResolver.d.ts +120 -0
  82. package/dist/migrations/services/RelationshipResolver.js +332 -0
  83. package/dist/migrations/services/UserMappingService.d.ts +109 -0
  84. package/dist/migrations/services/UserMappingService.js +277 -0
  85. package/dist/migrations/services/ValidationService.d.ts +74 -0
  86. package/dist/migrations/services/ValidationService.js +260 -0
  87. package/dist/migrations/transfer.d.ts +30 -0
  88. package/dist/migrations/transfer.js +661 -0
  89. package/dist/migrations/yaml/YamlImportConfigLoader.d.ts +131 -0
  90. package/dist/migrations/yaml/YamlImportConfigLoader.js +383 -0
  91. package/dist/migrations/yaml/YamlImportIntegration.d.ts +93 -0
  92. package/dist/migrations/yaml/YamlImportIntegration.js +341 -0
  93. package/dist/migrations/yaml/generateImportSchemas.d.ts +30 -0
  94. package/dist/migrations/yaml/generateImportSchemas.js +1327 -0
  95. package/dist/schemas/authUser.d.ts +24 -0
  96. package/dist/schemas/authUser.js +17 -0
  97. package/dist/setup.d.ts +2 -0
  98. package/{src/setup.ts → dist/setup.js} +0 -3
  99. package/dist/setupCommands.d.ts +58 -0
  100. package/dist/setupCommands.js +489 -0
  101. package/dist/setupController.d.ts +9 -0
  102. package/dist/setupController.js +34 -0
  103. package/dist/shared/backupMetadataSchema.d.ts +94 -0
  104. package/dist/shared/backupMetadataSchema.js +38 -0
  105. package/dist/shared/backupTracking.d.ts +18 -0
  106. package/dist/shared/backupTracking.js +176 -0
  107. package/dist/shared/confirmationDialogs.d.ts +75 -0
  108. package/dist/shared/confirmationDialogs.js +236 -0
  109. package/dist/shared/migrationHelpers.d.ts +61 -0
  110. package/dist/shared/migrationHelpers.js +145 -0
  111. package/{src/shared/operationLogger.ts → dist/shared/operationLogger.d.ts} +1 -11
  112. package/dist/shared/operationLogger.js +12 -0
  113. package/dist/shared/operationQueue.d.ts +40 -0
  114. package/dist/shared/operationQueue.js +310 -0
  115. package/dist/shared/operationsTable.d.ts +26 -0
  116. package/dist/shared/operationsTable.js +287 -0
  117. package/dist/shared/operationsTableSchema.d.ts +48 -0
  118. package/dist/shared/operationsTableSchema.js +35 -0
  119. package/dist/shared/progressManager.d.ts +62 -0
  120. package/dist/shared/progressManager.js +215 -0
  121. package/dist/shared/relationshipExtractor.d.ts +56 -0
  122. package/dist/shared/relationshipExtractor.js +138 -0
  123. package/dist/shared/selectionDialogs.d.ts +220 -0
  124. package/dist/shared/selectionDialogs.js +588 -0
  125. package/dist/storage/backupCompression.d.ts +20 -0
  126. package/dist/storage/backupCompression.js +67 -0
  127. package/dist/storage/methods.d.ts +44 -0
  128. package/dist/storage/methods.js +475 -0
  129. package/dist/storage/schemas.d.ts +842 -0
  130. package/dist/storage/schemas.js +175 -0
  131. package/dist/tables/indexManager.d.ts +65 -0
  132. package/dist/tables/indexManager.js +294 -0
  133. package/{src/types.ts → dist/types.d.ts} +1 -6
  134. package/dist/types.js +3 -0
  135. package/dist/users/methods.d.ts +16 -0
  136. package/dist/users/methods.js +276 -0
  137. package/dist/utils/configMigration.d.ts +1 -0
  138. package/dist/utils/configMigration.js +261 -0
  139. package/dist/utils/index.js +2 -0
  140. package/dist/utils/loadConfigs.d.ts +50 -0
  141. package/dist/utils/loadConfigs.js +357 -0
  142. package/dist/utils/setupFiles.d.ts +4 -0
  143. package/dist/utils/setupFiles.js +1190 -0
  144. package/dist/utilsController.d.ts +114 -0
  145. package/dist/utilsController.js +898 -0
  146. package/package.json +6 -3
  147. package/CHANGELOG.md +0 -35
  148. package/CONFIG_TODO.md +0 -1189
  149. package/SELECTION_DIALOGS.md +0 -146
  150. package/SERVICE_IMPLEMENTATION_REPORT.md +0 -462
  151. package/scripts/copy-templates.ts +0 -23
  152. package/src/backups/operations/bucketBackup.ts +0 -277
  153. package/src/backups/operations/collectionBackup.ts +0 -310
  154. package/src/backups/operations/comprehensiveBackup.ts +0 -342
  155. package/src/backups/schemas/bucketManifest.ts +0 -78
  156. package/src/backups/schemas/comprehensiveManifest.ts +0 -76
  157. package/src/backups/tracking/centralizedTracking.ts +0 -352
  158. package/src/cli/commands/configCommands.ts +0 -265
  159. package/src/cli/commands/databaseCommands.ts +0 -931
  160. package/src/cli/commands/functionCommands.ts +0 -419
  161. package/src/cli/commands/importFileCommands.ts +0 -815
  162. package/src/cli/commands/schemaCommands.ts +0 -200
  163. package/src/cli/commands/storageCommands.ts +0 -151
  164. package/src/cli/commands/transferCommands.ts +0 -454
  165. package/src/collections/attributes.ts.backup +0 -1555
  166. package/src/collections/columns.ts +0 -2025
  167. package/src/collections/indexes.ts +0 -350
  168. package/src/collections/methods.ts +0 -714
  169. package/src/collections/tableOperations.ts +0 -542
  170. package/src/collections/transferOperations.ts +0 -589
  171. package/src/collections/wipeOperations.ts +0 -449
  172. package/src/databases/methods.ts +0 -49
  173. package/src/databases/setup.ts +0 -77
  174. package/src/examples/yamlTerminologyExample.ts +0 -346
  175. package/src/functions/deployments.ts +0 -221
  176. package/src/functions/fnConfigDiscovery.ts +0 -103
  177. package/src/functions/methods.ts +0 -284
  178. package/src/init.ts +0 -62
  179. package/src/interactiveCLI.ts +0 -1201
  180. package/src/main.ts +0 -1517
  181. package/src/migrations/afterImportActions.ts +0 -579
  182. package/src/migrations/appwriteToX.ts +0 -668
  183. package/src/migrations/comprehensiveTransfer.ts +0 -2285
  184. package/src/migrations/dataLoader.ts +0 -1729
  185. package/src/migrations/importController.ts +0 -440
  186. package/src/migrations/importDataActions.ts +0 -315
  187. package/src/migrations/relationships.ts +0 -333
  188. package/src/migrations/services/DataTransformationService.ts +0 -196
  189. package/src/migrations/services/FileHandlerService.ts +0 -311
  190. package/src/migrations/services/ImportOrchestrator.ts +0 -675
  191. package/src/migrations/services/RateLimitManager.ts +0 -363
  192. package/src/migrations/services/RelationshipResolver.ts +0 -461
  193. package/src/migrations/services/UserMappingService.ts +0 -345
  194. package/src/migrations/services/ValidationService.ts +0 -349
  195. package/src/migrations/transfer.ts +0 -1113
  196. package/src/migrations/yaml/YamlImportConfigLoader.ts +0 -439
  197. package/src/migrations/yaml/YamlImportIntegration.ts +0 -446
  198. package/src/migrations/yaml/generateImportSchemas.ts +0 -1354
  199. package/src/schemas/authUser.ts +0 -23
  200. package/src/setupCommands.ts +0 -602
  201. package/src/setupController.ts +0 -43
  202. package/src/shared/backupMetadataSchema.ts +0 -93
  203. package/src/shared/backupTracking.ts +0 -211
  204. package/src/shared/confirmationDialogs.ts +0 -327
  205. package/src/shared/migrationHelpers.ts +0 -232
  206. package/src/shared/operationQueue.ts +0 -376
  207. package/src/shared/operationsTable.ts +0 -338
  208. package/src/shared/operationsTableSchema.ts +0 -60
  209. package/src/shared/progressManager.ts +0 -278
  210. package/src/shared/relationshipExtractor.ts +0 -214
  211. package/src/shared/selectionDialogs.ts +0 -802
  212. package/src/storage/backupCompression.ts +0 -88
  213. package/src/storage/methods.ts +0 -711
  214. package/src/storage/schemas.ts +0 -205
  215. package/src/tables/indexManager.ts +0 -409
  216. package/src/types/node-appwrite-tablesdb.d.ts +0 -44
  217. package/src/users/methods.ts +0 -358
  218. package/src/utils/configMigration.ts +0 -348
  219. package/src/utils/loadConfigs.ts +0 -457
  220. package/src/utils/setupFiles.ts +0 -1236
  221. package/src/utilsController.ts +0 -1263
  222. package/tests/README.md +0 -497
  223. package/tests/adapters/AdapterFactory.test.ts +0 -277
  224. package/tests/integration/syncOperations.test.ts +0 -463
  225. package/tests/jest.config.js +0 -25
  226. package/tests/migration/configMigration.test.ts +0 -546
  227. package/tests/setup.ts +0 -62
  228. package/tests/testUtils.ts +0 -340
  229. package/tests/utils/loadConfigs.test.ts +0 -350
  230. package/tests/validation/configValidation.test.ts +0 -412
  231. package/tsconfig.json +0 -44
  232. /package/{src → dist}/functions/templates/count-docs-in-collection/README.md +0 -0
  233. /package/{src → dist}/functions/templates/count-docs-in-collection/src/main.ts +0 -0
  234. /package/{src → dist}/functions/templates/count-docs-in-collection/src/request.ts +0 -0
  235. /package/{src → dist}/functions/templates/hono-typescript/README.md +0 -0
  236. /package/{src → dist}/functions/templates/hono-typescript/src/adapters/request.ts +0 -0
  237. /package/{src → dist}/functions/templates/hono-typescript/src/adapters/response.ts +0 -0
  238. /package/{src → dist}/functions/templates/hono-typescript/src/app.ts +0 -0
  239. /package/{src → dist}/functions/templates/hono-typescript/src/context.ts +0 -0
  240. /package/{src → dist}/functions/templates/hono-typescript/src/main.ts +0 -0
  241. /package/{src → dist}/functions/templates/hono-typescript/src/middleware/appwrite.ts +0 -0
  242. /package/{src → dist}/functions/templates/typescript-node/README.md +0 -0
  243. /package/{src → dist}/functions/templates/typescript-node/src/context.ts +0 -0
  244. /package/{src → dist}/functions/templates/typescript-node/src/main.ts +0 -0
  245. /package/{src → dist}/functions/templates/uv/README.md +0 -0
  246. /package/{src → dist}/functions/templates/uv/pyproject.toml +0 -0
  247. /package/{src → dist}/functions/templates/uv/src/__init__.py +0 -0
  248. /package/{src → dist}/functions/templates/uv/src/context.py +0 -0
  249. /package/{src → dist}/functions/templates/uv/src/main.py +0 -0
  250. /package/{src/utils/index.ts → dist/utils/index.d.ts} +0 -0
@@ -1,463 +0,0 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- import { jest } from '@jest/globals';
4
- import { TestUtils } from '../testUtils';
5
- import { AdapterFactory } from '../../src/adapters/AdapterFactory';
6
- import { MessageFormatter } from '../../src/shared/messageFormatter';
7
-
8
- // Mock dependencies
9
- jest.mock('../../src/shared/messageFormatter');
10
- jest.mock('../../src/adapters/AdapterFactory');
11
- jest.mock('../../src/utils/versionDetection');
12
-
13
- // Import the actual modules we're testing
14
- import { loadConfig } from '../../src/utils/loadConfigs';
15
-
16
- describe('Sync Operations Integration Tests', () => {
17
- let testDir: string;
18
- let mockAdapter: any;
19
-
20
- beforeEach(() => {
21
- jest.clearAllMocks();
22
-
23
- // Create mock adapter with all required methods
24
- mockAdapter = {
25
- syncFromAppwrite: jest.fn(),
26
- syncToAppwrite: jest.fn(),
27
- validateConfiguration: jest.fn(),
28
- generateYamlConfig: jest.fn(),
29
- getDatabases: jest.fn(),
30
- getCollections: jest.fn(),
31
- createCollection: jest.fn(),
32
- updateCollection: jest.fn(),
33
- deleteCollection: jest.fn(),
34
- client: TestUtils.createMockAppwriteResponses(),
35
- };
36
-
37
- (AdapterFactory.createAdapter as jest.Mock).mockResolvedValue(mockAdapter);
38
- });
39
-
40
- afterEach(() => {
41
- TestUtils.cleanup();
42
- });
43
-
44
- describe('Sync from Appwrite to Local Configuration', () => {
45
- it('should sync collections to collections/ directory for database API', async () => {
46
- testDir = TestUtils.createTestProject({ hasCollections: true });
47
-
48
- // Mock Appwrite response for collections
49
- mockAdapter.getDatabases.mockResolvedValue([
50
- {
51
- $id: 'test-db-id',
52
- name: 'test-database',
53
- enabled: true,
54
- }
55
- ]);
56
-
57
- mockAdapter.getCollections.mockResolvedValue([
58
- {
59
- $id: 'synced-collection',
60
- name: 'SyncedCollection',
61
- documentSecurity: false,
62
- enabled: true,
63
- $permissions: [],
64
- attributes: [
65
- {
66
- key: 'title',
67
- type: 'string',
68
- size: 255,
69
- required: true,
70
- array: false,
71
- }
72
- ],
73
- indexes: [],
74
- $createdAt: new Date().toISOString(),
75
- $updatedAt: new Date().toISOString(),
76
- }
77
- ]);
78
-
79
- mockAdapter.generateYamlConfig.mockImplementation((collections, outputDir) => {
80
- const collectionsDir = path.join(outputDir, 'collections');
81
- fs.mkdirSync(collectionsDir, { recursive: true });
82
-
83
- collections.forEach((collection: any) => {
84
- const yamlContent = `
85
- name: ${collection.name}
86
- id: ${collection.$id}
87
- documentSecurity: ${collection.documentSecurity}
88
- enabled: ${collection.enabled}
89
- permissions: []
90
- attributes:
91
- - key: ${collection.attributes[0].key}
92
- type: ${collection.attributes[0].type}
93
- size: ${collection.attributes[0].size}
94
- required: ${collection.attributes[0].required}
95
- indexes: []
96
- `;
97
- fs.writeFileSync(
98
- path.join(collectionsDir, `${collection.name}.yaml`),
99
- yamlContent
100
- );
101
- });
102
- });
103
-
104
- await mockAdapter.syncFromAppwrite(testDir);
105
-
106
- // Verify collections were written to collections/ directory
107
- const collectionsDir = path.join(testDir, 'collections');
108
- expect(fs.existsSync(collectionsDir)).toBe(true);
109
-
110
- const collectionFiles = fs.readdirSync(collectionsDir);
111
- expect(collectionFiles).toContain('SyncedCollection.yaml');
112
-
113
- const collectionContent = fs.readFileSync(
114
- path.join(collectionsDir, 'SyncedCollection.yaml'),
115
- 'utf8'
116
- );
117
- expect(collectionContent).toContain('name: SyncedCollection');
118
- });
119
-
120
- it('should sync tables to tables/ directory for tablesdb API', async () => {
121
- testDir = TestUtils.createTestProject({ hasTables: true });
122
-
123
- // Mock TablesDB adapter
124
- mockAdapter.getDatabases.mockResolvedValue([
125
- {
126
- $id: 'test-db-id',
127
- name: 'test-database',
128
- enabled: true,
129
- }
130
- ]);
131
-
132
- mockAdapter.getCollections.mockResolvedValue([
133
- {
134
- tableId: 'synced-table',
135
- name: 'SyncedTable',
136
- databaseId: 'test-db-id',
137
- documentSecurity: false,
138
- enabled: true,
139
- $permissions: [],
140
- attributes: [
141
- {
142
- key: 'content',
143
- type: 'string',
144
- size: 1000,
145
- required: true,
146
- array: false,
147
- }
148
- ],
149
- indexes: [],
150
- $createdAt: new Date().toISOString(),
151
- $updatedAt: new Date().toISOString(),
152
- }
153
- ]);
154
-
155
- mockAdapter.generateYamlConfig.mockImplementation((tables, outputDir) => {
156
- const tablesDir = path.join(outputDir, 'tables');
157
- fs.mkdirSync(tablesDir, { recursive: true });
158
-
159
- tables.forEach((table: any) => {
160
- const yamlContent = `
161
- name: ${table.name}
162
- tableId: ${table.tableId}
163
- databaseId: ${table.databaseId}
164
- documentSecurity: ${table.documentSecurity}
165
- enabled: ${table.enabled}
166
- permissions: []
167
- attributes:
168
- - key: ${table.attributes[0].key}
169
- type: ${table.attributes[0].type}
170
- size: ${table.attributes[0].size}
171
- required: ${table.attributes[0].required}
172
- indexes: []
173
- `;
174
- fs.writeFileSync(
175
- path.join(tablesDir, `${table.name}.yaml`),
176
- yamlContent
177
- );
178
- });
179
- });
180
-
181
- await mockAdapter.syncFromAppwrite(testDir);
182
-
183
- // Verify tables were written to tables/ directory
184
- const tablesDir = path.join(testDir, 'tables');
185
- expect(fs.existsSync(tablesDir)).toBe(true);
186
-
187
- const tableFiles = fs.readdirSync(tablesDir);
188
- expect(tableFiles).toContain('SyncedTable.yaml');
189
-
190
- const tableContent = fs.readFileSync(
191
- path.join(tablesDir, 'SyncedTable.yaml'),
192
- 'utf8'
193
- );
194
- expect(tableContent).toContain('name: SyncedTable');
195
- expect(tableContent).toContain('tableId: synced-table');
196
- expect(tableContent).toContain('databaseId: test-db-id');
197
- });
198
-
199
- it('should preserve existing configurations during sync', async () => {
200
- testDir = TestUtils.createTestProject({
201
- hasCollections: true,
202
- hasTables: true,
203
- });
204
-
205
- // Add existing configurations
206
- const existingCollectionContent = fs.readFileSync(
207
- path.join(testDir, 'collections', 'TestCollection.ts'),
208
- 'utf8'
209
- );
210
-
211
- mockAdapter.getDatabases.mockResolvedValue([]);
212
- mockAdapter.getCollections.mockResolvedValue([]);
213
- mockAdapter.generateYamlConfig.mockImplementation(() => {
214
- // Don't overwrite existing files
215
- });
216
-
217
- await mockAdapter.syncFromAppwrite(testDir);
218
-
219
- // Verify existing files weren't overwritten
220
- const currentContent = fs.readFileSync(
221
- path.join(testDir, 'collections', 'TestCollection.ts'),
222
- 'utf8'
223
- );
224
- expect(currentContent).toBe(existingCollectionContent);
225
- });
226
- });
227
-
228
- describe('Database Configuration Sync', () => {
229
- it('should update main config.yaml with database information', async () => {
230
- testDir = TestUtils.createTestProject({ useYaml: true });
231
-
232
- mockAdapter.getDatabases.mockResolvedValue([
233
- {
234
- $id: 'db1',
235
- name: 'Database One',
236
- enabled: true,
237
- },
238
- {
239
- $id: 'db2',
240
- name: 'Database Two',
241
- enabled: false,
242
- }
243
- ]);
244
-
245
- mockAdapter.generateYamlConfig.mockImplementation((collections, outputDir) => {
246
- // Update the main config file
247
- const configPath = path.join(outputDir, '.appwrite', 'config.yaml');
248
- const currentConfig = fs.readFileSync(configPath, 'utf8');
249
- const updatedConfig = currentConfig + `
250
- # Synced databases
251
- syncedDatabases:
252
- - $id: db1
253
- name: Database One
254
- enabled: true
255
- - $id: db2
256
- name: Database Two
257
- enabled: false
258
- `;
259
- fs.writeFileSync(configPath, updatedConfig);
260
- });
261
-
262
- await mockAdapter.syncFromAppwrite(testDir);
263
-
264
- const configContent = fs.readFileSync(
265
- path.join(testDir, '.appwrite', 'config.yaml'),
266
- 'utf8'
267
- );
268
- expect(configContent).toContain('syncedDatabases:');
269
- expect(configContent).toContain('Database One');
270
- expect(configContent).toContain('Database Two');
271
- });
272
- });
273
-
274
- describe('Version-Aware Sync Operations', () => {
275
- it('should use appropriate directory based on detected API version', async () => {
276
- testDir = TestUtils.createTestProject();
277
-
278
- // Mock version detection for old version (should use collections/)
279
- const oldVersionAdapter = { ...mockAdapter };
280
- oldVersionAdapter.getCollections.mockResolvedValue([
281
- TestUtils.createTestCollection({ name: 'OldVersionCollection' })
282
- ]);
283
-
284
- await oldVersionAdapter.syncFromAppwrite(testDir);
285
-
286
- // For newer versions, should use tables/
287
- const newVersionAdapter = { ...mockAdapter };
288
- newVersionAdapter.getCollections.mockResolvedValue([
289
- TestUtils.createTestTable({ name: 'NewVersionTable' })
290
- ]);
291
-
292
- await newVersionAdapter.syncFromAppwrite(testDir);
293
-
294
- // Verify appropriate handling based on version
295
- expect(mockAdapter.syncFromAppwrite).toHaveBeenCalledTimes(2);
296
- });
297
-
298
- it('should handle mixed API environments gracefully', async () => {
299
- testDir = TestUtils.createTestProject({
300
- hasCollections: true,
301
- hasTables: true,
302
- });
303
-
304
- // Mock mixed response
305
- mockAdapter.getCollections.mockResolvedValue([
306
- TestUtils.createTestCollection({ name: 'MixedCollection' }),
307
- TestUtils.createTestTable({ name: 'MixedTable' }),
308
- ]);
309
-
310
- mockAdapter.generateYamlConfig.mockImplementation((items, outputDir) => {
311
- items.forEach((item: any) => {
312
- const isTable = item._isFromTablesDir || item.tableId;
313
- const dir = isTable ? 'tables' : 'collections';
314
- const dirPath = path.join(outputDir, dir);
315
- fs.mkdirSync(dirPath, { recursive: true });
316
-
317
- const yamlContent = `name: ${item.name}\n`;
318
- fs.writeFileSync(
319
- path.join(dirPath, `${item.name}.yaml`),
320
- yamlContent
321
- );
322
- });
323
- });
324
-
325
- await mockAdapter.syncFromAppwrite(testDir);
326
-
327
- // Should handle both types appropriately
328
- expect(mockAdapter.generateYamlConfig).toHaveBeenCalled();
329
- });
330
- });
331
-
332
- describe('Error Handling and Recovery', () => {
333
- it('should handle network errors during sync gracefully', async () => {
334
- testDir = TestUtils.createTestProject();
335
-
336
- mockAdapter.getDatabases.mockRejectedValue(new Error('Network timeout'));
337
-
338
- await expect(mockAdapter.syncFromAppwrite(testDir)).rejects.toThrow('Network timeout');
339
-
340
- // Verify that partial configurations are not left in inconsistent state
341
- const collectionsDir = path.join(testDir, 'collections');
342
- const tablesDir = path.join(testDir, 'tables');
343
-
344
- // Should not create partial directories on failure
345
- if (fs.existsSync(collectionsDir)) {
346
- const files = fs.readdirSync(collectionsDir);
347
- expect(files.length).toBe(0); // No partial files
348
- }
349
- });
350
-
351
- it('should validate synced configurations before writing', async () => {
352
- testDir = TestUtils.createTestProject();
353
-
354
- // Mock invalid configuration from Appwrite
355
- mockAdapter.getCollections.mockResolvedValue([
356
- {
357
- // Missing required fields
358
- name: '',
359
- $id: '',
360
- attributes: [],
361
- }
362
- ]);
363
-
364
- mockAdapter.validateConfiguration.mockReturnValue({
365
- isValid: false,
366
- errors: ['Collection name is required', 'Collection ID is required'],
367
- warnings: [],
368
- });
369
-
370
- await expect(mockAdapter.syncFromAppwrite(testDir)).rejects.toThrow();
371
-
372
- expect(mockAdapter.validateConfiguration).toHaveBeenCalled();
373
- });
374
-
375
- it('should provide rollback capability on sync failure', async () => {
376
- testDir = TestUtils.createTestProject({ hasCollections: true });
377
-
378
- // Backup existing state
379
- const originalFiles = fs.readdirSync(path.join(testDir, 'collections'));
380
-
381
- mockAdapter.getCollections.mockResolvedValue([
382
- TestUtils.createTestCollection({ name: 'NewCollection' })
383
- ]);
384
-
385
- // Simulate failure during write
386
- mockAdapter.generateYamlConfig.mockImplementation(() => {
387
- throw new Error('Write permission denied');
388
- });
389
-
390
- await expect(mockAdapter.syncFromAppwrite(testDir)).rejects.toThrow();
391
-
392
- // Verify original files are preserved
393
- const currentFiles = fs.readdirSync(path.join(testDir, 'collections'));
394
- expect(currentFiles).toEqual(originalFiles);
395
- });
396
- });
397
-
398
- describe('Performance Optimization', () => {
399
- it('should handle large numbers of collections efficiently', async () => {
400
- testDir = TestUtils.createTestProject();
401
-
402
- // Create large number of collections
403
- const largeCollectionSet = Array.from({ length: 1000 }, (_, i) =>
404
- TestUtils.createTestCollection({
405
- name: `Collection${i}`,
406
- $id: `collection-${i}`,
407
- })
408
- );
409
-
410
- mockAdapter.getCollections.mockResolvedValue(largeCollectionSet);
411
- mockAdapter.generateYamlConfig.mockImplementation((collections, outputDir) => {
412
- // Simulate efficient batch writing
413
- const collectionsDir = path.join(outputDir, 'collections');
414
- fs.mkdirSync(collectionsDir, { recursive: true });
415
-
416
- // Write files in batches to avoid memory issues
417
- const batchSize = 100;
418
- for (let i = 0; i < collections.length; i += batchSize) {
419
- const batch = collections.slice(i, i + batchSize);
420
- batch.forEach((collection: any) => {
421
- fs.writeFileSync(
422
- path.join(collectionsDir, `${collection.name}.yaml`),
423
- `name: ${collection.name}\n`
424
- );
425
- });
426
- }
427
- });
428
-
429
- const startTime = Date.now();
430
- await mockAdapter.syncFromAppwrite(testDir);
431
- const syncTime = Date.now() - startTime;
432
-
433
- expect(syncTime).toBeLessThan(10000); // Should complete within 10 seconds
434
-
435
- const collectionFiles = fs.readdirSync(path.join(testDir, 'collections'));
436
- expect(collectionFiles.length).toBe(1000);
437
- });
438
-
439
- it('should use incremental sync when possible', async () => {
440
- testDir = TestUtils.createTestProject({ hasCollections: true });
441
-
442
- // Mock last sync timestamp
443
- const lastSyncFile = path.join(testDir, '.appwrite', '.last-sync');
444
- fs.writeFileSync(lastSyncFile, new Date().toISOString());
445
-
446
- mockAdapter.getCollections.mockResolvedValue([
447
- TestUtils.createTestCollection({
448
- name: 'UpdatedCollection',
449
- $updatedAt: new Date().toISOString(),
450
- })
451
- ]);
452
-
453
- await mockAdapter.syncFromAppwrite(testDir);
454
-
455
- // Should only sync updated items
456
- expect(mockAdapter.getCollections).toHaveBeenCalledWith(
457
- expect.objectContaining({
458
- modifiedSince: expect.any(String),
459
- })
460
- );
461
- });
462
- });
463
- });
@@ -1,25 +0,0 @@
1
- /** @type {import('jest').Config} */
2
- module.exports = {
3
- preset: 'ts-jest',
4
- testEnvironment: 'node',
5
- roots: ['<rootDir>/src', '<rootDir>/tests'],
6
- testMatch: ['**/__tests__/**/*.ts', '**/?(*.)+(spec|test).ts'],
7
- transform: {
8
- '^.+\\.ts$': 'ts-jest',
9
- },
10
- collectCoverageFrom: [
11
- 'src/**/*.ts',
12
- '!src/**/*.d.ts',
13
- '!src/main.ts', // Exclude entry point
14
- '!src/functions/templates/**', // Exclude template files
15
- ],
16
- coverageDirectory: 'coverage',
17
- coverageReporters: ['text', 'lcov', 'html'],
18
- setupFilesAfterEnv: ['<rootDir>/tests/setup.ts'],
19
- testTimeout: 30000,
20
- moduleFileExtensions: ['ts', 'js', 'json'],
21
- testPathIgnorePatterns: ['/node_modules/', '/dist/'],
22
- clearMocks: true,
23
- restoreMocks: true,
24
- verbose: true,
25
- };