appwrite-utils-cli
Version:
Appwrite Utility Functions to help with database management, data conversion, data import, migrations, and much more. Meant to be used as a CLI tool, I do not recommend installing this in frontend environments.
1,048 lines (836 loc) • 57.2 kB
Markdown
# appwrite-utils-cli
## Overview
`appwrite-utils-cli` is a powerful, YAML-first command-line interface tool designed for Appwrite developers who need to manage database migrations, schema generation, data import, and comprehensive project management. Built on a modular architecture with enhanced performance, this CLI tool facilitates complex tasks like setting up databases, running migrations, generating schemas, and managing backups efficiently.
Highlights:
- Adapter-first database orchestration (no legacy attribute fall-through)
- Safe diff-based updates for attributes and indexes (no duplicate creations)
- Manual push selections (no auto-push of all DBs)
- Multi-database targeting per table/collection via `databaseIds`
- Per-function configuration via `.fnconfig.yaml` (discovered anywhere in repo)
## Features
### Core Capabilities
- **YAML-First Configuration**: Modern YAML-based configuration with JSON Schema support for IntelliSense
- **Interactive Mode**: Professional guided CLI experience with rich visual feedback and progress tracking
- **Modular Import System**: Completely refactored import architecture with 50%+ complexity reduction
- **Enhanced Performance**: Configurable rate limiting and batch processing for optimal performance
- **Safety First**: Smart confirmation dialogs for destructive operations with explicit confirmations
### Dual API Support (Collections & TablesDB)
- **Collections API**: Traditional Appwrite database operations with document-based terminology
- **TablesDB API**: New high-performance table API with column-based terminology
- **Automatic Detection**: Smart API mode detection (fetch-based detection; no extra packages required)
- **Seamless Migration**: Zero-downtime migration between Collections and TablesDB APIs
- **Terminology Flexibility**: Support for both `collections/documents/attributes` and `tables/rows/columns`
### Data Management
- **Advanced Data Import**: YAML-configured imports with sophisticated file handling, URL support, and user deduplication
- **Relationship Resolution**: Intelligent cross-collection relationship mapping and ID resolution
- **User Management**: Advanced user deduplication with email/phone matching and merge capabilities
- **File Operations**: Complete file handling with URL downloads, local file search, and afterImportActions
- **Backup Management**: Comprehensive backup system with progress tracking and detailed reporting
### Development Tools
- **Database Migrations**: Full migration control with progress tracking and operation summaries
- **Schema Generation**: Generate TypeScript (Zod), JSON, and Python (Pydantic) schemas/models from database configurations
- **Constants Generation**: Generate cross-language constants files (TypeScript, Python, PHP, Dart, JSON, Env) for database, collection, bucket, and function IDs
- **Data Transfer**: Transfer data between databases, collections, and instances with real-time progress
- **Configuration Sync**: Bidirectional synchronization between local YAML configs and Appwrite projects
- **Function Management**: Deploy and manage Appwrite Functions with specification updates
## Installation
To use `appwrite-utils-cli`, you can install it globally via npm to make it accessible from anywhere in your command line:
```bash
npm install -g appwrite-utils-cli
```
However, due to the rapid development of this project, it's recommended to use the following command:
```bash
npx --package=appwrite-utils-cli@latest appwrite-migrate [options]
```
**Note: Do not install this locally into your project. It is meant to be used as a command-line tool only.**
## TablesDB Support
`appwrite-utils-cli` provides comprehensive support for both traditional Appwrite Collections API and the new TablesDB API, enabling high-performance database operations with modern terminology.
### API Mode Detection
The CLI automatically selects Collections or TablesDB using fetch-based server detection (health/version and endpoint probes). No additional SDK packages are required.
### Configuration Comparison
#### Collections API (Traditional)
```yaml
# .appwrite/config.yaml
databases:
- name: "main"
id: "main"
collections: # Collections terminology
- name: "Users"
id: "users"
attributes:
- key: "email"
type: "string"
required: true
```
#### TablesDB API (New)
```yaml
# .appwrite/config.yaml
databases:
- name: "main"
id: "main"
tables: # TablesDB terminology
- name: "Users"
id: "users"
attributes: # Internally consistent
- key: "email"
type: "string"
required: true
```
### Performance Benefits
TablesDB provides significant performance improvements:
- **Bulk Operations**: Native support for bulk inserts, updates, and deletes
- **Advanced Queries**: Enhanced query capabilities with better optimization
- **Reduced Latency**: Direct table operations without document overhead
- **Scalability**: Better performance with large datasets
### Migration Commands
The CLI provides seamless migration between APIs:
```bash
# Migrate Collections config to TablesDB format
npx appwrite-utils-cli appwrite-migrate --migrate-to-tablesdb
# Convert existing Collections to Tables (when TablesDB is available)
npx appwrite-utils-cli appwrite-migrate --sync --use-tablesdb
# Generate schemas for TablesDB
npx appwrite-utils-cli appwrite-migrate --generate --api-mode=tablesdb
```
## YAML-First Configuration
Version 1.0.0 introduces a YAML-first approach for better cross-platform compatibility and enhanced developer experience.
### Configuration Structure
The CLI automatically detects configuration files in this order:
1. `.appwrite/config.yaml` (recommended)
2. `appwrite.yaml`
3. `appwriteConfig.ts` (legacy, still supported)
### YAML Configuration Examples
#### Collections API Configuration
```yaml
# .appwrite/config.yaml with JSON Schema support
# yaml-language-server: $schema=./.yaml_schemas/appwrite-config.schema.json
appwriteEndpoint: "https://cloud.appwrite.io/v1"
appwriteProject: "your-project-id"
appwriteKey: "your-api-key"
databases:
- name: "main"
id: "main"
collections: # Collections terminology
- name: "Users"
id: "users"
attributes:
- key: "email"
type: "string"
required: true
format: "email"
- key: "name"
type: "string"
required: true
buckets:
- name: "documents"
id: "documents"
permissions:
- target: "any"
permission: "read"
logging:
enabled: false # Disabled by default
level: "info"
console: true
```
#### TablesDB API Configuration
```yaml
# .appwrite/config.yaml for TablesDB
# yaml-language-server: $schema=./.yaml_schemas/appwrite-config.schema.json
appwriteEndpoint: "https://cloud.appwrite.io/v1"
appwriteProject: "your-project-id"
appwriteKey: "your-api-key"
databases:
- name: "main"
id: "main"
tables: # TablesDB terminology
- name: "Users"
id: "users"
attributes: # Internal compatibility
- key: "email"
type: "string"
required: true
format: "email"
- key: "name"
type: "string"
required: true
buckets:
- name: "documents"
id: "documents"
permissions:
- target: "any"
permission: "read"
logging:
enabled: false # Disabled by default
level: "info"
console: true
```
## Usage
After installation, you can access the tool directly from your command line using the provided commands.
### Interactive Mode
Run the CLI in interactive mode with enhanced visual feedback:
```bash
npx --package=appwrite-utils-cli@latest appwrite-migrate --it
```
This provides a professional guided experience with:
- Rich visual feedback and progress tracking
- Smart confirmation dialogs for destructive operations
- Operation summaries with detailed statistics
- Real-time progress bars with ETA calculations
### Generate Schemas (Zod / JSON / Pydantic)
Interactive schema generation lets you pick the format and output directory:
```bash
npx appwrite-utils-cli appwrite-migrate --it
# Choose: Generate schemas
# Select: TypeScript (Zod), JSON, Python (Pydantic), or All
# Enter output directory (absolute path respected)
```
- Pydantic models use modern typing (str | None, list[str]) and alias mapping for Appwrite system fields:
- Base model (written as `base.py`) defines aliases for `$id`, `$createdAt`, `$updatedAt`, `$permissions`, `$databaseId`, `$collectionId`, `$sequence`.
- Each collection/table generates a model extending `BaseAppwriteModel`.
- Serialize with aliases via `model_dump(by_alias=True)` and validate from Appwrite docs via `model_validate(...)`.
- Output directory is selectable; files are written directly to your chosen path (no extra subfolder).
### Push (manual selection)
Pushing local schema is now an explicit, manual selection flow to avoid unintended changes:
```bash
npx appwrite-utils-cli appwrite-migrate --push
```
- Select databases from the remote project (no default auto-selection)
- Select tables/collections to push per selected database
- Summary confirmation is shown before applying changes
Flags:
- `--dbIds=id1,id2` pre-selects databases by ID (skips DB prompt)
- `--collectionIds=c1,c2` pre-selects tables/collections by ID for the selected DB(s)
Eligibility per DB:
- A table/collection is considered eligible for a database if:
- `databaseIds` includes the database ID, or
- `databaseId` equals the database ID, or
- neither field is set (eligible everywhere)
Attribute/Index behavior:
- Attributes and indexes are compared and only created/updated when changed
- Unchanged definitions are skipped
- Status is monitored until available (with sensible timeouts)
### Non-Interactive Mode
You can also use specific flags to run tasks without the interactive prompt:
```bash
npx --package=appwrite-utils-cli@latest appwrite-migrate [options]
```
## YAML Import Configuration System
Version 1.0.0 introduces a powerful YAML-based import system with sophisticated data handling capabilities.
### Import Configuration Examples
#### Collections API Import
```yaml
# .appwrite/import/users-import.yaml
# yaml-language-server: $schema=../.yaml_schemas/import-config.schema.json
source:
file: "importData/users.json"
basePath: "RECORDS"
type: "json"
target:
collection: "Users" # Collections terminology
type: "create"
primaryKey: "user_id"
createUsers: true
mapping:
attributes:
- oldKey: "user_id"
targetKey: "userId"
converters: ["anyToString"]
validation:
- rule: "required"
params: ["{userId}"]
- oldKey: "profile_image_url"
targetKey: "avatar"
fileData:
path: "{profile_image_url}"
name: "{user_id}_avatar"
afterImport:
- action: "createFileAndUpdateField"
params: ["{dbId}", "{collId}", "{docId}", "avatar", "{bucketId}", "{filePath}", "{fileName}"]
relationships:
- sourceField: "department_id"
targetField: "departmentId"
targetCollection: "Departments"
options:
batchSize: 50
continueOnError: true
```
#### TablesDB API Import
```yaml
# .appwrite/import/users-tablesdb-import.yaml
# yaml-language-server: $schema=../.yaml_schemas/import-config.schema.json
source:
file: "importData/users.json"
basePath: "RECORDS"
type: "json"
target:
table: "Users" # TablesDB terminology (alternatively: collection: "Users" works too)
type: "create"
primaryKey: "user_id"
createUsers: true
mapping:
attributes: # Note: Still uses 'attributes' for compatibility
- oldKey: "user_id"
targetKey: "userId"
converters: ["anyToString"]
validation:
- rule: "required"
params: ["{userId}"]
- oldKey: "profile_image_url"
targetKey: "avatar"
fileData:
path: "{profile_image_url}"
name: "{user_id}_avatar"
afterImport:
- action: "createFileAndUpdateRowField" # TablesDB-specific action
params: ["{dbId}", "{tableId}", "{rowId}", "avatar", "{bucketId}", "{filePath}", "{fileName}"]
relationships:
- sourceField: "department_id"
targetField: "departmentId"
targetTable: "Departments" # TablesDB terminology
options:
batchSize: 100 # TablesDB supports larger batches
continueOnError: true
useBulkOperations: true # Enable TablesDB bulk operations
```
### Import System Features
- **File Handling**: Complete support for URL downloads and local file search
- **User Deduplication**: Sophisticated email/phone matching with merge capabilities
- **Rate Limiting**: Configurable p-limit for optimal performance (5 concurrent by default)
- **Relationship Resolution**: Intelligent cross-collection ID mapping
- **Validation**: Pre-import validation with detailed error reporting
- **Progress Tracking**: Real-time progress bars with batch processing statistics
- **AfterImportActions**: Complete post-import action system for file uploads and field updates
## Command-Line Options
Available options:
### Core Operations
- `--it`: Run in interactive mode with enhanced visual feedback
- `--setup`: Create setup files (supports both YAML and TypeScript)
- `--generate`: Generate TypeScript and JSON schemas from database configurations
- `--import`: Import data using YAML configurations with advanced processing
- `--backup`: Comprehensive backup with progress tracking and detailed reporting
### Data Management
- `--dbIds`: Comma-separated list of database IDs to operate on
- `--collectionIds`: Comma-separated list of collection IDs to operate on (also accepts `--tableIds`)
- `--bucketIds`: Comma-separated list of bucket IDs to operate on
- `--wipe`: Wipe data with smart confirmation (all: everything, docs: only documents, users: only user data)
- `--wipeCollections`: Non-destructively wipe specified collections (also `--wipeTables`)
- `--writeData`: Write converted imported data to file for validation
### TablesDB-Specific Options
- `--api-mode`: Force API mode (`collections` or `tablesdb`)
- `--use-tablesdb`: Force TablesDB API usage when available
- `--migrate-to-tablesdb`: Convert Collections configuration to TablesDB format
- `--bulk-operations`: Enable bulk operations for TablesDB (default: true when available)
- `--tableIds`: Comma-separated list of table IDs (alias for `--collectionIds`)
### Configuration & Synchronization
- `--push`: Push local YAML/TypeScript config to Appwrite project
- `--sync`: Synchronize by pulling config from Appwrite project
- `--endpoint`: Set the Appwrite endpoint
- `--projectId`: Set the Appwrite project ID
- `--apiKey`: Set the Appwrite API key
### Transfer Operations
- `--transfer`: Transfer data between databases or collections with progress tracking
- `--transfer-users`: Transfer users between instances (will not overwrite)
- `--fromDbId` / `--sourceDbId`: Source database ID for transfer
- `--toDbId` / `--targetDbId`: Destination database ID for transfer
- `--fromCollectionId`: Source collection ID for transfer
- `--toCollectionId`: Destination collection ID for transfer
- `--fromBucketId`: Source bucket ID for transfer
- `--toBucketId`: Destination bucket ID for transfer
- `--remoteEndpoint`: Remote Appwrite endpoint for transfers
- `--remoteProjectId`: Remote Appwrite project ID for transfers
- `--remoteApiKey`: Remote Appwrite API key for transfers
### Function Management
- `--updateFunctionSpec`: Update function specifications
- `--functionId`: Function ID to update
- `--specification`: New function specification (s-0.5vcpu-512mb to s-8vcpu-8gb)
### Constants Generation
- `--generateConstants` / `--constants`: Generate cross-language constants files with database, collection, bucket, and function IDs
- `--constantsLanguages`: Comma-separated list of languages for constants generation (default: typescript)
- Available languages: `typescript`, `javascript`, `python`, `php`, `dart`, `json`, `env`
- `--constantsOutput`: Output directory for generated constants files (default: config-folder/constants)
## Examples
### Generate Constants
Generate cross-language constants files for all your Appwrite resource IDs:
```bash
# Generate TypeScript constants (default)
npx appwrite-utils-cli appwrite-migrate --generateConstants
# Generate multiple language formats
npx appwrite-utils-cli appwrite-migrate --generateConstants --constantsLanguages="typescript,python,php,json"
# Generate all available formats
npx appwrite-utils-cli appwrite-migrate --generateConstants --constantsLanguages="typescript,javascript,python,php,dart,json,env"
# Generate with custom output directory
npx appwrite-utils-cli appwrite-migrate --generateConstants --constantsOutput="./my-constants"
```
This generates constants files in your configuration directory (e.g., `.appwrite/constants/`) containing:
- Database IDs
- Collection IDs
- Bucket IDs
- Function IDs
**Example TypeScript output:**
```typescript
export const DATABASE_IDS = {
MAIN_DATABASE: "main"
} as const;
export const COLLECTION_IDS = {
USERS: "01JYDBQTB5W8SCBAYB654CCADQ",
POSTS: "01JYDBQTB5W8SCBAYB654POSTS"
} as const;
// Type helpers and utility arrays included
export type DatabaseId = typeof DATABASE_IDS[keyof typeof DATABASE_IDS];
```
### Transfer Databases
Transfer databases within the same project or from a local to a remote project:
```bash
npx appwrite-utils-cli appwrite-migrate --transfer --fromDbId sourceDbId --toDbId targetDbId --remoteEndpoint https://appwrite.otherserver.com --remoteProjectId yourProjectId --remoteApiKey yourApiKey
```
### Transfer Specific Collections
Transfer specific collections from one place to another, with all of their data:
```bash
npx appwrite-utils-cli appwrite-migrate --transfer --fromDbId sourceDbId --toDbId targetDbId --fromCollectionId sourceCollectionId --toCollectionId targetCollectionId --remoteEndpoint https://appwrite.otherserver.com --remoteProjectId yourProjectId --remoteApiKey yourApiKey
```
### TablesDB Examples
#### Enable TablesDB Mode
```bash
# Force TablesDB API usage
npx appwrite-utils-cli appwrite-migrate --sync --use-tablesdb
# Generate schemas with TablesDB terminology
npx appwrite-utils-cli appwrite-migrate --generate --api-mode=tablesdb
```
#### Migration from Collections to TablesDB
```bash
# Convert Collections configuration to TablesDB format
npx appwrite-utils-cli appwrite-migrate --migrate-to-tablesdb
# Sync with TablesDB API (requires node-appwrite-tablesdb)
npx --package=node-appwrite-tablesdb appwrite-utils-cli appwrite-migrate --sync --use-tablesdb
```
#### Bulk Operations with TablesDB
```bash
# Import with bulk operations enabled
npx appwrite-utils-cli appwrite-migrate --import --bulk-operations
# Transfer tables with high-performance bulk operations
npx appwrite-utils-cli appwrite-migrate --transfer --fromDbId sourceDb --toDbId targetDb --tableIds table1,table2 --use-tablesdb
```
#### Working with Tables (TablesDB terminology)
```bash
# Wipe specific tables
npx appwrite-utils-cli appwrite-migrate --wipeTables --tableIds users,posts
# Generate constants with table terminology
npx appwrite-utils-cli appwrite-migrate --generateConstants --api-mode=tablesdb
```
### Transfer Buckets
Transfer files between buckets:
```bash
npx appwrite-utils-cli appwrite-migrate --transfer --fromBucketId sourceBucketId --toBucketId targetBucketId --remoteEndpoint https://appwrite.otherserver.com --remoteProjectId yourProjectId --remoteApiKey yourApiKey
```
### Update Function Specifications
**NOTE: IF IT DOES NOT WORK AND YOU ARE SELF-HOSTED, PLEASE SET MAX CPU_PER_FUNCTION AND RAM_PER_FUNCTION IN YOUR ENV VARS TO > 0, THIS IS A BUG IN 1.6.0 -- YOU SET THE FUNCTION RAM IN MB**
Update the CPU and RAM specifications for a function:
```bash
npx appwrite-utils-cli appwrite-migrate --updateFunctionSpec --functionId yourFunctionId --specification s-1vcpu-1gb
```
Available specifications:
- s-0.5vcpu-512mb: 0.5 vCPU, 512MB RAM
- s-1vcpu-1gb: 1 vCPU, 1GB RAM
- s-2vcpu-2gb: 2 vCPU, 2GB RAM
- s-2vcpu-4gb: 2 vCPU, 4GB RAM
- s-4vcpu-4gb: 4 vCPU, 4GB RAM
- s-4vcpu-8gb: 4 vCPU, 8GB RAM
- s-8vcpu-4gb: 8 vCPU, 4GB RAM
- s-8vcpu-8gb: 8 vCPU, 8GB RAM
## Additional Notes
- If you run out of RAM during large data imports, you can increase Node's memory allocation:
```bash
export NODE_OPTIONS="--max-old-space-size=16384"
```
This sets the allocation to 16GB. For most cases, 8GB (`8192`) should be sufficient.
- The CLI now supports OpenAPI generation for each attribute in the schema. Add a `description` to any attribute or collection, and it will export that schema to the `appwrite/openapi` folder.
This updated CLI ensures that developers have robust tools at their fingertips to manage complex Appwrite projects effectively from the command line, with both interactive and non-interactive modes available for flexibility.
## Changelog
### 1.5.0 - Recursive Zod v4 Schemas + One‑Way Relationship Support
Highlights
- Recursive getters: Generated schemas now use Zod v4 recursive getters (no `z.lazy`, no `BaseSchema` layering). Cleaner types and fully inferred mutual recursion.
- One‑way relationships: Relationship attributes are now included even when `twoWay: false`. Related imports resolve collection IDs to names.
- Required semantics: Relationship getters respect `required` and `array`:
- required scalar → `RelatedSchema`
- optional scalar → `RelatedSchema.nullish()`
- required array → `RelatedSchema.array()`
- optional array → `RelatedSchema.array().nullish()`
- JSON Schemas: `$ref` definitions use resolved collection names when YAML provides IDs.
Validation changes
- Relationship schema: `twoWayKey` and `side` are now required only when `twoWay` is `true`.
- Helpful errors: Keeps strong validation but removes false negatives for one‑way relationships.
Developer notes
- Imports: Schema generators import only `...Schema` from related collections (no type imports needed).
- Example YAML: `Posts.yaml` demonstrates a required `manyToMany` (`categories`) and a one‑way `manyToOne` (`author`).
### 1.3.0 - Zod v4 Upgrade & Collection Management Fixes
**🎉 Major Release - Zod v4 Compatibility & Reliability Improvements**
#### Breaking Changes
- **Zod v4 Upgrade**: Updated to Zod v4.0.0 for enhanced schema validation
- ⚠️ **Potential Breaking Change**: Some schema validations may behave differently
- Function event types are now more flexible to accommodate Zod v4 changes
- Review your validation schemas if you experience issues
#### Major Bug Fixes
- **Fixed Duplicate Attribute Creation**: Resolved issue where attributes were being created multiple times
- Implemented intelligent filtering to only process new or changed attributes
- Enhanced status monitoring and error handling
- Significantly improved sync performance and reliability
- **Fixed Index Creation Issues**: Resolved indexes not being created from collection configurations
- Added proper null checks for index arrays from different collection sources
- Enhanced index creation with comprehensive status monitoring
- Improved error handling and retry logic for stuck indexes
#### Enhanced Collection Management
- **Smart Attribute Processing**: Attributes are now only created/updated when needed
- Compares existing vs. config attributes before processing
- Skips unchanged attributes with clear logging
- Better handling of edge cases and error conditions
- **Improved Index Handling**: More robust index creation from collection configs
- Proper fallback logic when indexes are undefined
- Enhanced compatibility with different collection sources
- Better error reporting and debugging information
#### Performance Improvements
- **Optimized Sync Operations**: Collections now process only necessary changes
- **Enhanced Status Monitoring**: Real-time feedback for attribute and index operations
- **Better Resource Management**: Reduced API calls through intelligent filtering
#### Developer Experience
- **Build Stability**: Resolved TypeScript compilation issues with function schemas
- **Type Safety**: Maintained strict typing while accommodating Zod v4 changes
- **Enhanced Logging**: Better progress reporting and error messages
#### Migration Guide
1. **Update Dependencies**: Ensure compatibility with Zod v4.0.0
2. **Test Collection Operations**: Verify that attribute and index creation works as expected
3. **Review Validations**: Check any custom validation schemas for potential breaking changes
4. **Function Events**: Function event arrays are now `string[]` for enhanced flexibility
**Integration Note**: This version significantly improves collection management reliability and provides full Zod v4 compatibility. The fixes address core synchronization issues that could cause duplicate resources or missing indexes.
---
### 1.1.0 - Enhanced Transfer System with Fault Tolerance
**🔧 Robust Transfer Operations with Status Monitoring**
#### Enhanced Attribute Creation with Fault Tolerance
- **Exponential Backoff**: Intelligent retry strategy starting at 2 seconds, doubling each retry (2s, 4s, 8s, 16s, 30s max)
- **Status Monitoring**: Real-time monitoring of attribute states ('available', 'processing', 'stuck', 'failed', 'deleting')
- **Retry Logic**: Collection deletion/recreation for stuck attributes with up to 5 retry attempts
- **Sequential Processing**: Attributes processed one-by-one to prevent overwhelming the server
- **Enhanced Logging**: Comprehensive console feedback with color-coded status messages
#### Enhanced Index Creation with Status Monitoring
- **Similar Fault Tolerance**: Index creation now includes the same robust monitoring and retry logic
- **Status Checking**: Real-time monitoring of index creation states with proper error handling
- **Collection Recreation**: Automatic collection deletion/recreation for stuck index operations
- **Sequential Processing**: Prevents rate limiting by processing indexes individually
#### Document Transfer Reliability Improvements
- **Enhanced Error Handling**: Improved document transfer with exponential backoff retry logic
- **Smaller Batch Sizes**: Reduced batch sizes (10 documents) to prevent server overload
- **Better Progress Reporting**: Enhanced progress tracking with success/failure counts
- **Fault Tolerance**: Graceful handling of duplicate documents and API errors
#### Remote Database Transfer Enhancements
- **Integrated Enhanced Methods**: Updated `transferDatabaseLocalToRemote` to use new attribute and index creation
- **Proper Wait Logic**: System now properly waits for attributes/indexes to be fully created before proceeding
- **Status Validation**: Comprehensive status checking throughout the transfer process
- **Continued Operation**: Transfer continues even if some attributes/indexes fail (with warnings)
#### AppwriteConfig Integration for Comprehensive Transfer
- **Smart Configuration Detection**: Automatically detects existing appwriteConfig for reuse
- **Source/Target Options**: Users can select their appwriteConfig for either source or target endpoints
- **Streamlined Setup**: Enhanced user experience with clear configuration prompts
#### Technical Implementation
- **Rate Limiting Respect**: Enhanced operations respect existing rate limiting while adding reliability
- **Memory Efficiency**: Optimized processing to handle large operations without overwhelming system resources
- **Error Resilience**: Comprehensive error handling with detailed user feedback and recovery options
- **Status Persistence**: Operations maintain state information for better debugging and monitoring
#### Usage Benefits
- **Reliability**: Transfer operations no longer fail due to timing issues or stuck operations
- **Visibility**: Clear progress indicators and status messages throughout all operations
- **Recovery**: Automatic retry and recovery mechanisms prevent data loss
- **Performance**: Optimized timing prevents API throttling while maintaining speed
**Breaking Change**: None - fully backward compatible with significantly enhanced reliability.
### 1.0.9 - Enhanced User Transfer with Password Preservation
**🔐 Complete Password Hash Preservation During User Transfers**
#### Password Hash Support
- **Universal Hash Support**: Support for all Appwrite password hash types:
- **Argon2**: Modern default hashing (preserved)
- **Bcrypt**: Industry standard (preserved)
- **Scrypt**: Memory-hard function with custom parameters (preserved)
- **Scrypt Modified**: Firebase-style with salt/separator/signer (preserved)
- **MD5**: Legacy support (preserved)
- **SHA variants**: SHA1, SHA256, SHA512 (preserved)
- **PHPass**: WordPress-style hashing (preserved)
- **Dynamic Hash Detection**: Automatically detects and uses correct hash creation method
- **Parameter Preservation**: Maintains hash-specific parameters (salt, iterations, memory cost, etc.)
#### Enhanced User Transfer Logic
- **Smart Password Recreation**: Uses appropriate `create*User` method based on detected hash type
- **Fallback Mechanism**: Graceful fallback to temporary passwords if hash recreation fails
- **Hash Options Support**: Preserves algorithm-specific configuration from `hashOptions`
- **Detailed Logging**: Clear success/failure messages with hash type information
#### User Experience Improvements
- **Accurate Information**: Updated CLI messaging to reflect actual password preservation capabilities
- **Clear Expectations**: Distinguishes between users who keep passwords vs. those who need reset
- **Success Feedback**: Detailed reporting of password preservation success rate
- **Risk Assessment**: Proper warnings only for users who will lose passwords
#### Technical Implementation
- **Hash Type Detection**: `user.hash` field determines creation method
- **Configuration Parsing**: `user.hashOptions` provides algorithm parameters
- **Error Resilience**: Comprehensive try-catch with fallback to temporary passwords
- **Type Safety**: Proper handling of hash option types and parameters
#### Migration Benefits
- **Seamless Login**: Users with preserved hashes can immediately log in with original passwords
- **Reduced Support**: Dramatically fewer password reset requests after migration
- **Complete Fidelity**: Maintains original security posture and hash strength
- **Production Ready**: Safe for live user base migrations
#### Usage Examples
```bash
# Users will now preserve passwords during comprehensive transfer
npx appwrite-utils-cli@latest appwrite-migrate --it
# Select: 🚀 Comprehensive transfer (users → databases → buckets → functions)
# Example output:
# ✅ User 123 created with preserved argon2 password
# ✅ User 456 created with preserved bcrypt password
# ⚠️ User 789 created with temporary password - password reset required
```
**Breaking Change**: None - fully backward compatible with enhanced capabilities.
### 1.0.8 - Comprehensive Transfer System with Enhanced Rate Limiting
**🚀 Complete Cross-Instance Transfer Solution**
#### Comprehensive Transfer System
- **New CLI Option**: `🚀 Comprehensive transfer (users → databases → buckets → functions)` in interactive mode
- **Orchestrated Transfer Flow**: Proper execution order (users → databases → buckets → functions) for dependency management
- **Cross-Instance Support**: Transfer entire Appwrite configurations between different instances/projects
- **Selective Transfer**: Choose which components to transfer (users, databases, buckets, functions)
- **Dry Run Mode**: Test transfers without making actual changes
#### Enhanced Rate Limiting Strategy
- **Configurable Limits**: 5 to 100 concurrent operations in steps of 5
- **Differentiated Rates**: Smart rate limiting based on operation type:
- **General Operations**: Full rate (databases, functions)
- **User Operations**: Half rate (more sensitive operations)
- **File Operations**: Quarter rate (most bandwidth intensive)
- **Visual Feedback**: Real-time rate limit display during transfers
- **Intelligent Scaling**: Automatic calculation of optimal rates for different operations
#### File Transfer Enhancements
- **File Validation**: Comprehensive integrity checking (empty files, size limits)
- **Retry Logic**: Exponential backoff for failed file transfers
- **Error Handling**: Graceful handling of corrupt/invalid files
- **Progress Tracking**: Real-time progress for large file transfers
#### Function Transfer Integration
- **Automated Function Migration**: Download from source, redeploy to target
- **Temporary Management**: Automatic cleanup of downloaded function code
- **Existing Code Integration**: Leverages existing deployment infrastructure
- **Configuration Preservation**: Maintains function settings and variables
#### User Experience Improvements
- **Password Reset Warnings**: Clear notifications about Appwrite password limitations
- **Interactive Configuration**: Step-by-step prompts for source/target setup
- **Comprehensive Reporting**: Detailed transfer summaries with statistics
- **Smart Confirmations**: Risk-based confirmations for destructive operations
#### Technical Implementation
- **Rate Limiting**: Uses p-limit for concurrent operation control
- **Error Resilience**: Robust error handling with detailed user feedback
- **Memory Management**: Efficient processing of large datasets
- **Progress Tracking**: Real-time progress bars with ETA calculations
#### Usage Examples
```bash
# Interactive mode - select comprehensive transfer
npx appwrite-utils-cli@latest appwrite-migrate --it
# Example rate limiting at 20 concurrent:
# - General operations: 20 concurrent
# - User operations: 10 concurrent
# - File operations: 5 concurrent
```
**Benefits**:
- Complete Appwrite instance migration capability
- Intelligent rate limiting prevents API throttling
- Enhanced file transfer reliability
- Comprehensive progress tracking and reporting
- Maintains data integrity across transfers
### 1.0.7 - Forgot to remove debug logs
### 1.0.6 - Cross-Language Constants Generation
**🚀 Enhanced Developer Experience with Multi-Language Constants**
#### Constants Generation System
- **Cross-Language Support**: Generate constants in 7 languages for seamless multi-platform development
- **TypeScript**: Type-safe constants with `as const` and helper types
- **JavaScript**: ES6 modules with utility arrays
- **Python**: Class-based constants with snake_case dictionaries
- **PHP**: Static class methods and associative arrays
- **Dart**: Maps with individual getter methods (camelCase)
- **JSON**: Structured data with metadata for cross-platform integration
- **Environment Variables**: Prefixed environment variables for deployment
- **Smart Directory Structure**: Constants generated in `{config-folder}/constants/` by default
- **CLI Integration**: Both command-line and interactive mode support
- **Custom Output**: Support for custom output directories when needed
#### Resource ID Extraction
- **Database IDs**: Extract all configured database identifiers
- **Collection IDs**: Generate constants for all collection ULIDs/names
- **Bucket IDs**: Include storage bucket identifiers
- **Function IDs**: Support for Appwrite Function identifiers
- **Naming Conventions**: Language-appropriate naming (UPPER_CASE, camelCase, snake_case)
#### Developer Experience Improvements
- **Interactive Mode**: Checkbox selection for languages with smart defaults
- **CLI Commands**: Simple `--generateConstants` with language and output options
- **Type Safety**: Full TypeScript support with generated types and helpers
- **Cross-Platform Compatibility**: Enable seamless development across different tech stacks
#### Usage Examples
```bash
# Default TypeScript generation
npx appwrite-utils-cli appwrite-migrate --generateConstants
# Multi-language generation
npx appwrite-utils-cli appwrite-migrate --generateConstants --constantsLanguages="typescript,python,php,json"
# All formats with custom output
npx appwrite-utils-cli appwrite-migrate --generateConstants --constantsLanguages="typescript,javascript,python,php,dart,json,env" --constantsOutput="./constants"
```
**Migration Benefits**:
- Eliminates hardcoded resource IDs across codebases
- Enables type-safe resource access in TypeScript projects
- Supports multi-language development workflows
- Maintains constants alongside configuration for easy maintenance
### 1.0.1 - Function Templates & Attribute Type Improvements
**🚀 Enhanced Function Management & Type System Fixes**
#### Function Template System Improvements
- **ES Module Compatibility**: Fixed `__dirname is not defined` error when creating function templates
- **Template-Specific Defaults**: Added pre-configured settings for all function templates:
- `typescript-node`: Node.js 21.0, TypeScript build setup, 0.5vCPU/512MB
- `uv`: Python 3.12, UV package manager, 0.5vCPU/512MB
- `count-docs-in-collection`: Node.js 21.0, specialized counting function, 1vCPU/512MB
- **YAML Config Integration**: Functions now automatically added to YAML config with generated ULIDs
- **Interactive Enhancement**: Improved template selection with descriptive names and smart defaults
#### YAML Collections Loading Fix
- **Path Resolution**: Fixed collections directory resolution for YAML configurations
- **Cross-Platform Support**: Collections now properly detected in `.appwrite/collections/` regardless of config location
- **Backwards Compatibility**: Both TypeScript and YAML collection structures fully supported
#### Attribute Type System Overhaul
- **Double/Float Compatibility**: Resolved Zod discriminated union errors with proper schema separation
- **Backwards Compatibility**: Full support for both "double" and "float" attribute types
- **Schema Architecture**: Clean separation with shared base schema for numeric attributes
- **Type Safety**: Enhanced TypeScript support with proper type inference
#### Developer Experience Improvements
- **Error Resolution**: Eliminated all TypeScript compilation errors
- **Template Updates**: Updated function template references from deprecated "poetry" to "uv"
- **Schema Validation**: Improved attribute validation with better error messages
- **Clean Architecture**: Removed deprecated relationship attributes for better performance
#### Bug Fixes
- Fixed YAML collection path resolution in nested directory structures
- Resolved ES module compatibility issues in function template creation
- Eliminated Zod discriminated union conflicts for numeric attribute types
- Updated outdated template references and improved template selection UX
**Migration Notes**:
- Function templates now automatically integrate with YAML configs
- Existing collections continue to work; deprecated relationship attributes converted to manual references
- All numeric attributes now use consistent "double" type with "float" backwards compatibility
### 1.0.0 - YAML-First Architecture & Import System Revolution
**🎉 Major Release - Comprehensive Architecture Overhaul**
#### YAML-First Configuration System
- **Complete YAML support** with JSON Schema validation for IntelliSense
- **Automatic discovery**: `.appwrite/config.yaml`, `appwrite.yaml`, or `appwriteConfig.ts`
- **Cross-platform compatibility**: No TypeScript runner required
- **Better organization**: Clean `.appwrite` directory structure
- **Backward compatibility**: Existing TypeScript configs continue to work
#### Import System Revolution (50%+ Complexity Reduction)
- **Modular architecture**: Extracted DataLoader (1,688 lines) into focused services
- `DataTransformationService` - Pure data transformation logic
- `FileHandlerService` - URL downloads and local file handling
- `UserMappingService` - Sophisticated email/phone deduplication
- `ValidationService` - Centralized validation with detailed reporting
- `RelationshipResolver` - Cross-collection ID mapping
- `ImportOrchestrator` - High-level coordination
- **Enhanced rate limiting**: Configurable p-limit for different operations
- `dataInsertion: 5` (concurrent document creation)
- `fileUpload: 2` (conservative for large files)
- `validation: 10` (pre-import validation)
- `dataQuery: 25` (relationship resolution)
#### YAML Import Configuration System
- **Complete YAML import definitions** with JSON Schema support
- **Advanced file handling**: URL downloads with local file search fallback
- **Sophisticated validation**: Pre-import validation with detailed error reporting
- **Template generation**: Easy creation of new import configurations
- **Relationship mapping**: Intelligent cross-collection ID resolution
- **User deduplication**: Advanced email/phone matching with merge capabilities
- **AfterImportActions**: Complete post-import action system
#### Enhanced User Experience
- **Rich visual feedback**: Progress bars with ETA and speed indicators
- **Smart confirmation dialogs**: Risk-based confirmations for destructive operations
- **Operation summaries**: Detailed post-operation reports with statistics
- **Professional messaging**: Unified MessageFormatter with consistent styling
- **Configurable logging**: Disabled by default, full configuration support
#### Performance & Safety Improvements
- **Batch processing**: Enhanced with progress tracking and memory efficiency
- **Error resilience**: Improved error handling and recovery mechanisms
- **Transaction safety**: Better handling of partial failures
- **Memory optimization**: Efficient processing of large datasets
#### Developer Experience
- **JSON Schema generation**: Full IntelliSense support for YAML files
- **Example configurations**: Comprehensive templates and examples
- **Better error messages**: Clear validation and error reporting
- **Type safety**: Full TypeScript support for all new features
### Changelog
- 1.2.18: Fix users transfer comparison not counting email or phone validation as a reason
- 1.2.17: Fixed users transfer not keeping validation of email / phone, temporarily disable bulk transfer to see if permissions aren't being updated by it
- 1.2.15: Fixed various transfer and sync functionalities
- 1.0.5: Fixed `.` directories being ignored. Normally a good thing
- 1.0.4: Fixed `appwriteConfig.yaml` being the name for the converted config, instead of `config.yaml`
- 1.0.3: Fixed appwriteConfig detection for `--it` so it detects when you can migrate your config
- 1.0.2: Fixed migrations, sorry about that!
**Migration Note**: While fully backward compatible, we recommend migrating to YAML configuration for the best experience. Use `--setup` to generate new YAML configurations.
- 0.10.86: Fixed `selectCollections` not always filtering by `databaseId`
- 0.10.85: Added logging to `wipeCollection`
- 0.10.83: Actually fixed the import oops
- 0.10.82: Fixed the `lodash` import, replaced with `es-toolkit`
- 0.10.81: Fixed `wipeCollection` -- it wasn't properly deleting all files in a loop
- 0.10.80: Updated `appwrite-utils` req
- 0.10.78: Fixed `attributesSame` so it will properly update attributes that have changed
- 0.10.77: Added disclaimer to update function specifications for bug
- 0.10.76: Updated CLI commands to not require an `appwriteConfig.ts` if you set API Key, ProjectId, and Endpoint
- 0.10.75: Fixed slight issue writing ZOD Schema for collection without any attributes
- 0.10.74: Fix moving users, should update Labels now
- 0.10.73: Fix moving users, passwords should work now (from Appwrite, Argon2)
- 0.10.71: Fix create template function `__dirname`
- 0.10.70: Fixed `--transfer-users` phones
- 0.10.67: Added `--transfer-users` boolean flag to also transfer users between projects
- 0.10.66: Fixed `ignore` always being an empty array, if not set, so it properly ignores the defaults
- 0.10.65: Fixed the stupid local functions not caring about the ignore string, and added `__pycache__` and `.venv` to default ignores
- 0.10.64: Fixed `Deploy Function(s)` not ignoring things properly
- 0.10.63: My `collectLocalFunctions` function was failing to add the `scopes` and a few others to the function, accidentally, fixed now
- 0.10.62: Made `Deploy Function(s)` also update the functions, as not all things (timeout, specification, etc.) are updated via deploy
- 0.10.61: Fixed ignore haha, also added `ignore` to the `Functions` config, to specify what to ignore when creating the `.tar.gz` file
- 0.10.051: Added `node_modules` and a few others to the ignore
- 0.10.05: Made deploy function into deploy function(s) -- so you can do more than one at a time
- 0.10.04: Fixed stupid progress bar not updating -- also fixed double text
- 0.10.03: Fixed `syncDb` to push the configurations properly, accidentally hurt it during `synchronizeConfigurations`
- 0.10.02: Updated `wipeCollection` to handle errors gracefully
- 0.10.01: Fixed `predeployCommands` to work
- 0.10.001: Updated `deployFunction` to not updateConfig if it's already present
- 0.10.0: Fixed `synchronize configurations` for functions, now you do not need to deploy the function first
- 0.9.999: Fixed Functions, looks for `./functions` in addition to `appwriteConfigFolder/functions`
- 0.9.998: Fixed transfer finally, added `--targetDbId` and `--sourceDbId` as aliases
- 0.9.994: Added function deployment management, in BETA, and fixed document transfer between databases
- 0.9.993: Fixed `updateFunctionSpecifications` resetting functions to default with undefined values (oops)
- 0.9.992: Added `updateFunctionSpecifications` which lists functions and specifications to allow you to update your functions max CPU and RAM usage per-function
- 0.9.990: Fixed `transferFilesLocalToLocal` and `remote` if a document exists with that `$id`, also fixed wipe `"all"` option also wiping the associated buckets
- 0.9.983: Fixed `afterImportActions` not resolving
- 0.9.981: Try fixing `tryAwaitWithRetry` to catch `522` errors from Cloudflare, they were appearing for some users, also added a 1000ms delay to `tryAwaitWithRetry`
- 0.9.98: Fixing some import errors reported by users
- 0.9.95: Updated to include new version of `appwrite-utils`
- 0.9.93: Updated `selectDatabases` and `selectCollections` from the interactive CLI to prefer local collections or databases when synchronizing the databases
- 0.9.92: Fixed `createOrUpdateAttributes` so it deletes attributes that don't exist in local config when you are running `syncDb`. Also updated the database and collection selection, so it won't try and fetch the collections and databases that don't exist (ones you picked from local config) and error
- 0.9.91: Fixed another webpack error, screw you react (but you're supported now so I guess not-screw-you)
- 0.9.90: Fixed Webpack errors (why tf does webpack add an extra `default`...???)
- 0.9.80: Fixed collections not being unique between local and remote
- 0.9.79: Fixed local collections not being considered for the synchronization unless all de-selected
- 0.9.78: Added colored text! And also added a lot more customization options as to what to wipe, update, etc.
- 0.9.75: Fixed attribute bug
- 0.9.72: Fixed my own null bug
- 0.9.71: Reverted `node-appwrite` to 14, this seems to fix the xdefault error
- 0.9.70: I think I stopped it from deleting attributes, my bad on that
- 0.9.68: Temporarily disabled updating Attributes until `updateStringAttribute` is fixed -- it just deletes them now
- 0.9.65: Temporary fix for Appwrite's `updateStringAttribute` bug
- 0.9.64: Fixed string attribute requiring xdefault
- 0.9.61: Remove fileURLToPath -- should hopefully fix windows
- 0.9.60: Fix init command to repository URL
- 0.9.59: Fix to Windows path names for loading config
- 0.9.58: The same as before, I just missed it hah
- 0.9.57: Changed generated schema type of `$createdAt` and `$updatedAt` to string from `string | Date` cause honestly if you want a date just parse it
- 0.9.56: Changed the updateAttribute so it doesn't always update attributes and hopefully fixed the required error
- 0.9.55: Updated to use `node-appwrite@14` for appwrite 1.6.0
- 0.9.54: Added small delay (`100ms`) between collection deletions, reduced other delays from `1000` to `500/250ms`
- 0.9.53: Reduced delay, went too far
- 0.9.52: Add delay after creating indexes, attributes, and others to prevent `fetch failed` errors during large-scale collection creation
- 0.9.51: Fix transfer databases, remove "ensure duplicates" check
- 0.9.5: Fixed not checking for storage bucket for each database (checking the creation status) when importing data
- 0.9.4: Fixed migrations database ensuring it has the required collections
- 0.9.3: Fixed deployment error && fix lack of existing `appwriteConfig.ts` file from causing error (you want to be able to setup yeah? haha)
- 0.9.2: Added changelog back, whoops
- 0.0.90: Updated README with new command-line options and fixed alias issues
- 0.0.74: Added `--backup` support, even if only one database
- 0.0.73: Fixed weird `workspace` issue
- 0.0.72: Remove