Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

appwrite-utils

Package Overview
Dependencies
Maintainers
1
Versions
134
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

appwrite-utils

Appwrite Utility Functions to help with database management, data conversion, data import, migrations, and much more.

  • 0.9.90
  • Source
  • npm
  • Socket score

Version published
Weekly downloads
108
decreased by-50.91%
Maintainers
1
Weekly downloads
 
Created
Source

AppwriteUtils Package

The AppwriteUtils package simplifies the process of managing data migrations and schema updates for Appwrite projects. It provides a comprehensive toolset for database setup, data conversion, and schema management, all accessible through a simple command-line interface. This package is designed to be easily integrated into your development workflow, requiring minimal setup to get started.

Getting Started

To use AppwriteUtils, first, install the package via npm:

npm install appwrite-utils

Once installed, you should first run the setup command to generate the config, then you can run migration commands directly using npx (or bunx, whatever):

npx appwrite-utils-setup

You may generate an example config using (or look in the examples folder)

npx appwrite-utils-setup --example
npx appwrite-utils-migrate --args

Replace --args with specific arguments for your migration task. For example, to run migrations in a development environment, you might use:

npx appwrite-utils-migrate --dev

Key Features

  • Simplified Setup: Quickly set up and configure your Appwrite project for migrations with minimal manual intervention.
  • Automated Database Migrations: Effortlessly create, update, and manage collections and attributes in your Appwrite database.
  • Data Conversion and Import: Convert data from various formats and seamlessly import it into your Appwrite project, adhering to new schema definitions.
  • Schema Generation: Automatically generate TypeScript types from your Appwrite schemas, ensuring type safety and consistency across your application.
  • Comprehensive Utility Functions: Access a wide range of utility functions for file operations, string manipulation, and more, designed to streamline the migration process.
  • String Templating System: Need to update a field with a File ID? There's a post-import function for that (including uploading it). Need to reference an item in your import data's JSON fields to update later? Go for it. "{$id}" for instance gets replaced with the created documents ID. If it has one, "{id}" would be replaced by the JSON items id field, "{dbId}" the current dataase, "{createdDoc}" the created document in this import iteration, and more!
  • Enhanced Data Management: Handle complex migrations with ease, including managing relationships between collections and converting data for various entities.

This package leverages TypeScript for type safety and is configured to work seamlessly with Appwrite. It's built to support complex migration scenarios, making it an essential tool for developers working with Appwrite projects.

Usage

After installing the package, you can run various migration-related tasks using the command line. Here are some examples of commands you might use, reflecting the capabilities as defined in index.ts:

  • Initialize a New Migration: Set up your database and prepare it for new migrations. This will also generate schemas but will not import data.

    npx appwrite-utils-migrate --init
    
  • Run Migrations in Production: Apply migrations to your production database.

    npx appwrite-utils-migrate --prod
    
  • Run Migrations in Staging: Apply migrations to your staging database.

    npx appwrite-utils-migrate --staging
    
  • Run Migrations in Development: Apply migrations to your development database.

    npx appwrite-utils-migrate --dev
    
  • Wipe Databases: Wipe your databases. Use with caution.

    npx appwrite-utils-migrate --wipe
    
  • Generate Schemas: Generate TypeScript schemas from your Appwrite database collections.

    npx appwrite-utils-migrate --generate
    
  • Import Data: Import data into your Appwrite project from external sources.

    npx appwrite-utils-migrate --import
    
  • Backup Data: Backup your database data.

    npx appwrite-utils-migrate --backup
    

Each command can be combined with others as needed, except for --init which runs a specific initialization routine including schema generation but not data import. For example, to run migrations in a development environment and import data, you might use:

npx appwrite-utils-migrate --dev --import

By simplifying the migration process, AppwriteUtils enables developers to focus on building their applications, knowing that their data management and schema updates are handled efficiently.

Complete List of Converters, afterImportActions, and Validation Rules

Converters

Converters take a value (in the import data) and convert it, before validating it or processing it

  • anyToString(value: any): string | null
  • anyToNumber(value: any): number | null
  • anyToBoolean(value: any): boolean | null
  • anyToAnyArray(value: any, separator?: string): any[]
  • anyToStringArray(value: any): string[]
  • trySplitByDifferentSeparators(value: string): string[]
  • pickFirstElement(value: any[]): any
  • pickLastElement(value: any[]): any
  • stringifyObject(object: any): string
  • parseObject(jsonString: string): any
  • safeParseDate(input: string | number): DateTime | null
  • removeInvalidElements(input: any[]): any[]

Validation Rules

Validation Rules are run after converters, and are there to make sure invalid data doesn't get added to your database

  • isNumber(value: any): boolean
  • isString(value: any): boolean
  • isBoolean(value: any): boolean
  • isArray(value: any): boolean
  • isObject(value: any): boolean
  • isNull(value: any): boolean
  • isUndefined(value: any): boolean
  • isDefined(value: any): boolean
  • isDate(value: any): boolean
  • isEmpty(value: any): boolean
  • isInteger(value: any): boolean
  • isFloat(value: any): boolean
  • isArrayLike(value: any): boolean
  • isArrayLikeObject(value: any): boolean
  • isFunction(value: any): boolean
  • isLength(value: any): boolean
  • isMap(value: any): boolean
  • isSet(value: any): boolean
  • isRegExp(value: any): boolean
  • isSymbol(value: any): boolean
  • isObjectLike(value: any): boolean
  • isPlainObject(value: any): boolean
  • isSafeInteger(value: any): boolean
  • isTypedArray(value: any): boolean
  • isEqual(value: any, other: any): boolean
  • isMatch(object: any, source: any): boolean
  • has(object: any, path: string): boolean
  • get(object: any, path: string, defaultValue: any): any

After Import Actions

After Import Actions run after the import and do something with the old data, new data, or something else entirely

  • Provided Fields:

    • {dbId} - Current database ID
    • {collId} - Current collection ID
    • {docId} - Created document ID
    • {createdDoc} - Created document object
    • any_string - You can use any string or thing as a value too! (like for data)
    • {some_template_string} - The templating system allows you to reference anything in the context of the current data you're working with. So for instance, if your imported item has {ownerId} and you use {ownerId}, it'll reference that old JSON item data in the import.
  • updateCreatedDocument(dbId: string, collId: string, docId: string, data: any): Promise<any>

  • checkAndUpdateFieldInDocument(dbId: string, collId: string, docId: string, fieldName: string, oldFieldValue: any, newFieldValue: any): Promise<any>

  • setFieldFromOtherCollectionDocument(dbId: string, collIdOrName: string, docId: string, fieldName: string, otherCollIdOrName: string, otherDocId: string, otherFieldName: string): Promise<any>

  • createOrGetBucket(bucketName: string, bucketId?: string, permissions?: string[], fileSecurity?: boolean, enabled?: boolean, maxFileSize?: number, allowedExtensions?: string[], compression?: string, encryption?: boolean, antivirus?: boolean): Promise<any>

  • createFileAndUpdateField(dbId: string, collId: string, docId: string, fieldName: string, bucketId: string, filePath: string, fileName: string): Promise<any>

Roadmap

  • Automatic function creation for backups
  • Import database schema from Appwrite Server to appwriteConfig.yaml (this week)
  • Promise batching to improve speed
  • Deduplication checking
  • File based migrations
  • Fix custom functions, JS is unable to import TS, so need to find the best way to define those
  • Add the ability to import between two appwrite projects

Changelog

  • 0.9.90: Rewrote the import process entirely to make it more modular and batched
  • 0.9.87 - 0.9.89: Ignore these I was messing up the deployment whooooops
  • 0.9.86: I was accidentally including all the code in the NPM package, package size reduced from 2.5 MB -> 53 kB lmao
  • 0.9.85: Forgot to make basePath optional in importDefs, if it's just an array of objects or somethin you don't need it!
  • 0.9.84: jk I use targetKey a lot, so set it you lazy nerds! (myself included)
  • 0.9.83: Made targetKey optional too, whoops
  • 0.9.82: Fixed schema to allow oldKey or oldKeys
  • 0.9.81: Added the ability to match a nested objects properties using [any] in your template string. So if you have a nested object
"RECORDS": [
  {
    "someObject": {
      "someValue": {
        "id": 3,
      },
      "anotherValue": {
        "id": 4,
      }
    }
  }
]

You can resolve the ID's by getting the first one using "oldKey": "someObject.[any].id" with a converter of converters: ["pickFirstElement"] or get all of them by using "oldKeys": "someObject.[any].id" -- this also works in fileData

  • 0.9.8: Resolved an issue that would have arisen from not checking for the url in the fileData before y'all used it (if y'all is anyone) -- also made sure to fix the type defs in CustomDefinitions
  • 0.9.7: Added the ability for the path field in the fileData of the importDefs to be a URL, for laziness!
  • 0.9.69422: Added type and updateMapping optionally to importDefs so you can run a second file to update the first one, if needed
  • 0.9.6942: Added removeInvalidElements converter
  • 0.9.69: Added oldKeys to importDefs so you can concatenate multiple keys to one for an array. Also added five new converter functions, anyToStringArray, pickFirstElement, pickLastElement, stringifyObject, parseObject, and a new validator, isDefined for when you just need to know if something is, well, defined (!undefined, !null, and !empty). I also fixed the exports for the types for the custom definitions, my bad!
  • 0.9.6: Fixed schema error in enum
  • 0.9.5: oops I named it setup and migrate lmao, now it's appwrite-utils-setup & appwrite-utils-migrate
  • 0.9.4: Turns out you gotta import js files in modules, whoops
  • 0.9.3: Added bin section to package.json and "shebang" to top of main.ts and setup.ts to enable npx
  • 0.9.2: I forget what I did here
  • 0.9.1: Ignore this one
  • 0.9.1: Added roadmap 😍
  • 0.9.0: Initial refactor into AppwriteUtils package for ease of use

Keywords

FAQs

Package last updated on 12 Apr 2024

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc