appwrite-utils-cli 0.10.85 → 1.0.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/.appwrite/.yaml_schemas/appwrite-config.schema.json +380 -0
- package/.appwrite/.yaml_schemas/collection.schema.json +255 -0
- package/.appwrite/collections/Categories.yaml +182 -0
- package/.appwrite/collections/ExampleCollection.yaml +36 -0
- package/.appwrite/collections/Posts.yaml +227 -0
- package/.appwrite/collections/Users.yaml +149 -0
- package/.appwrite/config.yaml +109 -0
- package/.appwrite/import/README.md +148 -0
- package/.appwrite/import/categories-import.yaml +129 -0
- package/.appwrite/import/posts-import.yaml +208 -0
- package/.appwrite/import/users-import.yaml +130 -0
- package/.appwrite/importData/categories.json +194 -0
- package/.appwrite/importData/posts.json +270 -0
- package/.appwrite/importData/users.json +220 -0
- package/.appwrite/schemas/categories.json +128 -0
- package/.appwrite/schemas/exampleCollection.json +52 -0
- package/.appwrite/schemas/posts.json +173 -0
- package/.appwrite/schemas/users.json +125 -0
- package/README.md +261 -33
- package/dist/collections/attributes.js +3 -2
- package/dist/collections/methods.js +56 -38
- package/dist/config/yamlConfig.d.ts +501 -0
- package/dist/config/yamlConfig.js +452 -0
- package/dist/databases/setup.d.ts +6 -0
- package/dist/databases/setup.js +119 -0
- package/dist/functions/methods.d.ts +1 -1
- package/dist/functions/methods.js +5 -2
- package/dist/functions/openapi.d.ts +4 -0
- package/dist/functions/openapi.js +60 -0
- package/dist/interactiveCLI.d.ts +5 -0
- package/dist/interactiveCLI.js +196 -52
- package/dist/main.js +91 -30
- package/dist/migrations/afterImportActions.js +2 -2
- package/dist/migrations/appwriteToX.d.ts +10 -0
- package/dist/migrations/appwriteToX.js +15 -4
- package/dist/migrations/backup.d.ts +16 -16
- package/dist/migrations/dataLoader.d.ts +83 -1
- package/dist/migrations/dataLoader.js +4 -4
- package/dist/migrations/importController.js +25 -18
- package/dist/migrations/importDataActions.js +2 -2
- package/dist/migrations/logging.d.ts +9 -1
- package/dist/migrations/logging.js +41 -22
- package/dist/migrations/migrationHelper.d.ts +4 -4
- package/dist/migrations/relationships.js +1 -1
- package/dist/migrations/services/DataTransformationService.d.ts +55 -0
- package/dist/migrations/services/DataTransformationService.js +158 -0
- package/dist/migrations/services/FileHandlerService.d.ts +75 -0
- package/dist/migrations/services/FileHandlerService.js +236 -0
- package/dist/migrations/services/ImportOrchestrator.d.ts +97 -0
- package/dist/migrations/services/ImportOrchestrator.js +488 -0
- package/dist/migrations/services/RateLimitManager.d.ts +138 -0
- package/dist/migrations/services/RateLimitManager.js +279 -0
- package/dist/migrations/services/RelationshipResolver.d.ts +120 -0
- package/dist/migrations/services/RelationshipResolver.js +332 -0
- package/dist/migrations/services/UserMappingService.d.ts +109 -0
- package/dist/migrations/services/UserMappingService.js +277 -0
- package/dist/migrations/services/ValidationService.d.ts +74 -0
- package/dist/migrations/services/ValidationService.js +260 -0
- package/dist/migrations/transfer.d.ts +0 -6
- package/dist/migrations/transfer.js +16 -132
- package/dist/migrations/yaml/YamlImportConfigLoader.d.ts +384 -0
- package/dist/migrations/yaml/YamlImportConfigLoader.js +375 -0
- package/dist/migrations/yaml/YamlImportIntegration.d.ts +87 -0
- package/dist/migrations/yaml/YamlImportIntegration.js +330 -0
- package/dist/migrations/yaml/generateImportSchemas.d.ts +17 -0
- package/dist/migrations/yaml/generateImportSchemas.js +575 -0
- package/dist/schemas/authUser.d.ts +9 -9
- package/dist/shared/attributeManager.d.ts +17 -0
- package/dist/shared/attributeManager.js +273 -0
- package/dist/shared/confirmationDialogs.d.ts +75 -0
- package/dist/shared/confirmationDialogs.js +236 -0
- package/dist/shared/functionManager.d.ts +48 -0
- package/dist/shared/functionManager.js +322 -0
- package/dist/shared/indexManager.d.ts +24 -0
- package/dist/shared/indexManager.js +150 -0
- package/dist/shared/jsonSchemaGenerator.d.ts +51 -0
- package/dist/shared/jsonSchemaGenerator.js +313 -0
- package/dist/shared/logging.d.ts +10 -0
- package/dist/shared/logging.js +46 -0
- package/dist/shared/messageFormatter.d.ts +37 -0
- package/dist/shared/messageFormatter.js +152 -0
- package/dist/shared/migrationHelpers.d.ts +173 -0
- package/dist/shared/migrationHelpers.js +142 -0
- package/dist/shared/operationLogger.d.ts +3 -0
- package/dist/shared/operationLogger.js +25 -0
- package/dist/shared/operationQueue.d.ts +13 -0
- package/dist/shared/operationQueue.js +79 -0
- package/dist/shared/progressManager.d.ts +62 -0
- package/dist/shared/progressManager.js +215 -0
- package/dist/shared/schemaGenerator.d.ts +18 -0
- package/dist/shared/schemaGenerator.js +523 -0
- package/dist/storage/methods.d.ts +3 -1
- package/dist/storage/methods.js +144 -55
- package/dist/storage/schemas.d.ts +56 -16
- package/dist/types.d.ts +2 -2
- package/dist/types.js +1 -1
- package/dist/users/methods.d.ts +16 -0
- package/dist/users/methods.js +276 -0
- package/dist/utils/configMigration.d.ts +1 -0
- package/dist/utils/configMigration.js +156 -0
- package/dist/utils/dataConverters.d.ts +46 -0
- package/dist/utils/dataConverters.js +139 -0
- package/dist/utils/loadConfigs.d.ts +15 -4
- package/dist/utils/loadConfigs.js +377 -51
- package/dist/utils/schemaStrings.js +2 -1
- package/dist/utils/setupFiles.d.ts +2 -1
- package/dist/utils/setupFiles.js +723 -28
- package/dist/utils/validationRules.d.ts +43 -0
- package/dist/utils/validationRules.js +42 -0
- package/dist/utils/yamlConverter.d.ts +48 -0
- package/dist/utils/yamlConverter.js +98 -0
- package/dist/utilsController.js +65 -43
- package/package.json +19 -15
- package/src/collections/attributes.ts +3 -2
- package/src/collections/methods.ts +85 -51
- package/src/config/yamlConfig.ts +488 -0
- package/src/{migrations/setupDatabase.ts → databases/setup.ts} +11 -5
- package/src/functions/methods.ts +8 -4
- package/src/functions/templates/count-docs-in-collection/package.json +25 -0
- package/src/functions/templates/count-docs-in-collection/tsconfig.json +28 -0
- package/src/functions/templates/typescript-node/package.json +24 -0
- package/src/functions/templates/typescript-node/tsconfig.json +28 -0
- package/src/functions/templates/uv/README.md +31 -0
- package/src/functions/templates/uv/pyproject.toml +29 -0
- package/src/interactiveCLI.ts +230 -63
- package/src/main.ts +111 -37
- package/src/migrations/afterImportActions.ts +2 -2
- package/src/migrations/appwriteToX.ts +17 -4
- package/src/migrations/dataLoader.ts +4 -4
- package/src/migrations/importController.ts +30 -22
- package/src/migrations/importDataActions.ts +2 -2
- package/src/migrations/relationships.ts +1 -1
- package/src/migrations/services/DataTransformationService.ts +196 -0
- package/src/migrations/services/FileHandlerService.ts +311 -0
- package/src/migrations/services/ImportOrchestrator.ts +669 -0
- package/src/migrations/services/RateLimitManager.ts +363 -0
- package/src/migrations/services/RelationshipResolver.ts +461 -0
- package/src/migrations/services/UserMappingService.ts +345 -0
- package/src/migrations/services/ValidationService.ts +349 -0
- package/src/migrations/transfer.ts +22 -228
- package/src/migrations/yaml/YamlImportConfigLoader.ts +427 -0
- package/src/migrations/yaml/YamlImportIntegration.ts +419 -0
- package/src/migrations/yaml/generateImportSchemas.ts +589 -0
- package/src/shared/attributeManager.ts +429 -0
- package/src/shared/confirmationDialogs.ts +327 -0
- package/src/shared/functionManager.ts +515 -0
- package/src/shared/indexManager.ts +253 -0
- package/src/shared/jsonSchemaGenerator.ts +403 -0
- package/src/shared/logging.ts +74 -0
- package/src/shared/messageFormatter.ts +195 -0
- package/src/{migrations/migrationHelper.ts → shared/migrationHelpers.ts} +22 -4
- package/src/{migrations/helper.ts → shared/operationLogger.ts} +7 -2
- package/src/{migrations/queue.ts → shared/operationQueue.ts} +1 -1
- package/src/shared/progressManager.ts +278 -0
- package/src/{migrations/schemaStrings.ts → shared/schemaGenerator.ts} +71 -17
- package/src/storage/methods.ts +199 -78
- package/src/types.ts +2 -2
- package/src/{migrations/users.ts → users/methods.ts} +2 -2
- package/src/utils/configMigration.ts +212 -0
- package/src/utils/loadConfigs.ts +414 -52
- package/src/utils/schemaStrings.ts +2 -1
- package/src/utils/setupFiles.ts +742 -40
- package/src/{migrations → utils}/validationRules.ts +1 -1
- package/src/utils/yamlConverter.ts +131 -0
- package/src/utilsController.ts +75 -54
- package/src/functions/templates/poetry/README.md +0 -30
- package/src/functions/templates/poetry/pyproject.toml +0 -16
- package/src/migrations/attributes.ts +0 -561
- package/src/migrations/backup.ts +0 -205
- package/src/migrations/databases.ts +0 -39
- package/src/migrations/dbHelpers.ts +0 -92
- package/src/migrations/indexes.ts +0 -40
- package/src/migrations/logging.ts +0 -29
- package/src/migrations/storage.ts +0 -538
- /package/src/{migrations → functions}/openapi.ts +0 -0
- /package/src/functions/templates/{poetry → uv}/src/__init__.py +0 -0
- /package/src/functions/templates/{poetry → uv}/src/index.py +0 -0
- /package/src/{migrations/converters.ts → utils/dataConverters.ts} +0 -0
@@ -0,0 +1,212 @@
|
|
1
|
+
import { promises as fs } from "fs";
|
2
|
+
import path from "path";
|
3
|
+
import { existsSync } from "fs";
|
4
|
+
import { MessageFormatter } from "../shared/messageFormatter.js";
|
5
|
+
import { ConfirmationDialogs } from "../shared/confirmationDialogs.js";
|
6
|
+
import yaml from "js-yaml";
|
7
|
+
|
8
|
+
interface AppwriteConfigTS {
|
9
|
+
appwriteEndpoint: string;
|
10
|
+
appwriteProject: string;
|
11
|
+
appwriteKey: string;
|
12
|
+
enableBackups?: boolean;
|
13
|
+
backupInterval?: number;
|
14
|
+
backupRetention?: number;
|
15
|
+
enableBackupCleanup?: boolean;
|
16
|
+
enableMockData?: boolean;
|
17
|
+
documentBucketId?: string;
|
18
|
+
usersCollectionName?: string;
|
19
|
+
databases: Array<{ $id: string; name: string }>;
|
20
|
+
buckets: Array<any>;
|
21
|
+
[key: string]: any;
|
22
|
+
}
|
23
|
+
|
24
|
+
interface AppwriteConfigYAML {
|
25
|
+
appwriteEndpoint: string;
|
26
|
+
appwriteProject: string;
|
27
|
+
appwriteKey: string;
|
28
|
+
enableBackups?: boolean;
|
29
|
+
backupInterval?: number;
|
30
|
+
backupRetention?: number;
|
31
|
+
enableBackupCleanup?: boolean;
|
32
|
+
enableMockData?: boolean;
|
33
|
+
documentBucketId?: string;
|
34
|
+
usersCollectionName?: string;
|
35
|
+
databases: Array<{ $id: string; name: string }>;
|
36
|
+
buckets: Array<any>;
|
37
|
+
[key: string]: any;
|
38
|
+
}
|
39
|
+
|
40
|
+
export async function migrateConfig(workingDir: string): Promise<void> {
|
41
|
+
try {
|
42
|
+
// Look for appwriteConfig.ts files in the working directory and subdirectories
|
43
|
+
const configFiles = await findAppwriteConfigFiles(workingDir);
|
44
|
+
|
45
|
+
if (configFiles.length === 0) {
|
46
|
+
MessageFormatter.info("No appwriteConfig.ts files found to migrate", { prefix: "Migration" });
|
47
|
+
return;
|
48
|
+
}
|
49
|
+
|
50
|
+
MessageFormatter.info(`Found ${configFiles.length} appwriteConfig.ts file(s) to migrate`, { prefix: "Migration" });
|
51
|
+
|
52
|
+
for (const configFile of configFiles) {
|
53
|
+
await migrateConfigFile(configFile, workingDir);
|
54
|
+
}
|
55
|
+
|
56
|
+
MessageFormatter.success("Migration completed successfully", { prefix: "Migration" });
|
57
|
+
} catch (error) {
|
58
|
+
MessageFormatter.error("Migration failed", error instanceof Error ? error : new Error(String(error)), { prefix: "Migration" });
|
59
|
+
throw error;
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
63
|
+
async function findAppwriteConfigFiles(dir: string): Promise<string[]> {
|
64
|
+
const configFiles: string[] = [];
|
65
|
+
|
66
|
+
const checkDir = async (currentDir: string) => {
|
67
|
+
try {
|
68
|
+
const entries = await fs.readdir(currentDir, { withFileTypes: true });
|
69
|
+
|
70
|
+
for (const entry of entries) {
|
71
|
+
const fullPath = path.join(currentDir, entry.name);
|
72
|
+
|
73
|
+
if (entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== 'node_modules') {
|
74
|
+
await checkDir(fullPath);
|
75
|
+
} else if (entry.isFile() && entry.name === 'appwriteConfig.ts') {
|
76
|
+
configFiles.push(fullPath);
|
77
|
+
}
|
78
|
+
}
|
79
|
+
} catch (error) {
|
80
|
+
// Ignore directory access errors
|
81
|
+
}
|
82
|
+
};
|
83
|
+
|
84
|
+
await checkDir(dir);
|
85
|
+
return configFiles;
|
86
|
+
}
|
87
|
+
|
88
|
+
async function migrateConfigFile(configFilePath: string, workingDir: string): Promise<void> {
|
89
|
+
const configDir = path.dirname(configFilePath);
|
90
|
+
const appwriteDir = path.join(configDir, '.appwrite');
|
91
|
+
|
92
|
+
MessageFormatter.info(`Migrating ${path.relative(workingDir, configFilePath)}`, { prefix: "Migration" });
|
93
|
+
|
94
|
+
// Check if .appwrite directory already exists
|
95
|
+
if (existsSync(appwriteDir)) {
|
96
|
+
const shouldOverwrite = await ConfirmationDialogs.confirmOverwrite(
|
97
|
+
`.appwrite directory already exists at ${path.relative(workingDir, appwriteDir)}`
|
98
|
+
);
|
99
|
+
if (!shouldOverwrite) {
|
100
|
+
MessageFormatter.info("Skipping migration for this config", { prefix: "Migration" });
|
101
|
+
return;
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
// Read and parse the TypeScript config
|
106
|
+
const configContent = await fs.readFile(configFilePath, 'utf8');
|
107
|
+
const config = await parseTypeScriptConfig(configContent);
|
108
|
+
|
109
|
+
// Create .appwrite directory
|
110
|
+
await fs.mkdir(appwriteDir, { recursive: true });
|
111
|
+
|
112
|
+
// Convert config to YAML and save
|
113
|
+
const yamlConfig = convertToYAMLConfig(config);
|
114
|
+
const yamlContent = yaml.dump(yamlConfig, {
|
115
|
+
indent: 2,
|
116
|
+
lineWidth: 120,
|
117
|
+
noRefs: true
|
118
|
+
});
|
119
|
+
await fs.writeFile(path.join(appwriteDir, 'appwriteConfig.yaml'), yamlContent);
|
120
|
+
|
121
|
+
// Move related directories
|
122
|
+
const foldersToMove = ['collections', 'schemas', 'importData', 'functions'];
|
123
|
+
for (const folder of foldersToMove) {
|
124
|
+
const sourcePath = path.join(configDir, folder);
|
125
|
+
const targetPath = path.join(appwriteDir, folder);
|
126
|
+
|
127
|
+
if (existsSync(sourcePath)) {
|
128
|
+
await fs.rename(sourcePath, targetPath);
|
129
|
+
MessageFormatter.info(`Moved ${folder}/ to .appwrite/${folder}/`, { prefix: "Migration" });
|
130
|
+
}
|
131
|
+
}
|
132
|
+
|
133
|
+
// Backup original config file
|
134
|
+
const backupPath = configFilePath + '.backup';
|
135
|
+
await fs.copyFile(configFilePath, backupPath);
|
136
|
+
MessageFormatter.info(`Created backup at ${path.relative(workingDir, backupPath)}`, { prefix: "Migration" });
|
137
|
+
|
138
|
+
// Optionally remove original config file
|
139
|
+
const shouldRemoveOriginal = await ConfirmationDialogs.confirmRemoval(
|
140
|
+
`Remove original ${path.relative(workingDir, configFilePath)}?`
|
141
|
+
);
|
142
|
+
if (shouldRemoveOriginal) {
|
143
|
+
await fs.unlink(configFilePath);
|
144
|
+
MessageFormatter.info(`Removed original ${path.relative(workingDir, configFilePath)}`, { prefix: "Migration" });
|
145
|
+
}
|
146
|
+
|
147
|
+
MessageFormatter.success(`Migration completed for ${path.relative(workingDir, configFilePath)}`, { prefix: "Migration" });
|
148
|
+
}
|
149
|
+
|
150
|
+
async function parseTypeScriptConfig(content: string): Promise<AppwriteConfigTS> {
|
151
|
+
// This is a simplified parser - in a real implementation, you might want to use a proper TypeScript parser
|
152
|
+
// For now, we'll use a regex-based approach to extract the config object
|
153
|
+
|
154
|
+
try {
|
155
|
+
// Remove comments and imports
|
156
|
+
const cleanContent = content
|
157
|
+
.replace(/\/\*[\s\S]*?\*\//g, '') // Remove block comments
|
158
|
+
.replace(/\/\/.*$/gm, '') // Remove line comments
|
159
|
+
.replace(/^import.*$/gm, '') // Remove imports
|
160
|
+
.replace(/^export.*$/gm, ''); // Remove exports
|
161
|
+
|
162
|
+
// Find the config object
|
163
|
+
const configMatch = cleanContent.match(/const\s+\w+\s*:\s*\w+\s*=\s*({[\s\S]*?});/);
|
164
|
+
if (!configMatch) {
|
165
|
+
throw new Error('Could not find config object in TypeScript file');
|
166
|
+
}
|
167
|
+
|
168
|
+
// Convert to JSON-like format and parse
|
169
|
+
let configStr = configMatch[1];
|
170
|
+
|
171
|
+
// Replace TypeScript-specific syntax
|
172
|
+
configStr = configStr
|
173
|
+
.replace(/(\w+):/g, '"$1":') // Quote property names
|
174
|
+
.replace(/'/g, '"') // Convert single quotes to double quotes
|
175
|
+
.replace(/,(\s*[}\]])/g, '$1'); // Remove trailing commas
|
176
|
+
|
177
|
+
const config = JSON.parse(configStr);
|
178
|
+
return config as AppwriteConfigTS;
|
179
|
+
} catch (error) {
|
180
|
+
MessageFormatter.error("Could not parse TypeScript config", error instanceof Error ? error : new Error(String(error)), { prefix: "Migration" });
|
181
|
+
throw new Error('Failed to parse TypeScript configuration file. Please ensure it follows standard format.');
|
182
|
+
}
|
183
|
+
}
|
184
|
+
|
185
|
+
function convertToYAMLConfig(config: AppwriteConfigTS): AppwriteConfigYAML {
|
186
|
+
// Convert the config to YAML-friendly format
|
187
|
+
const yamlConfig: AppwriteConfigYAML = {
|
188
|
+
appwriteEndpoint: config.appwriteEndpoint,
|
189
|
+
appwriteProject: config.appwriteProject,
|
190
|
+
appwriteKey: config.appwriteKey,
|
191
|
+
databases: config.databases || [],
|
192
|
+
buckets: config.buckets || [],
|
193
|
+
};
|
194
|
+
|
195
|
+
// Add optional properties if they exist
|
196
|
+
if (config.enableBackups !== undefined) yamlConfig.enableBackups = config.enableBackups;
|
197
|
+
if (config.backupInterval !== undefined) yamlConfig.backupInterval = config.backupInterval;
|
198
|
+
if (config.backupRetention !== undefined) yamlConfig.backupRetention = config.backupRetention;
|
199
|
+
if (config.enableBackupCleanup !== undefined) yamlConfig.enableBackupCleanup = config.enableBackupCleanup;
|
200
|
+
if (config.enableMockData !== undefined) yamlConfig.enableMockData = config.enableMockData;
|
201
|
+
if (config.documentBucketId !== undefined) yamlConfig.documentBucketId = config.documentBucketId;
|
202
|
+
if (config.usersCollectionName !== undefined) yamlConfig.usersCollectionName = config.usersCollectionName;
|
203
|
+
|
204
|
+
// Copy any additional properties
|
205
|
+
for (const [key, value] of Object.entries(config)) {
|
206
|
+
if (!(key in yamlConfig)) {
|
207
|
+
yamlConfig[key] = value;
|
208
|
+
}
|
209
|
+
}
|
210
|
+
|
211
|
+
return yamlConfig;
|
212
|
+
}
|