arango-migrate
Version:
Migration tools for ArangoDB
1 lines • 35 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../src/ArangoMigrate.ts"],"sourcesContent":["import { Config } from 'arangojs/connection'\nimport glob from 'glob'\nimport path from 'path'\nimport { aql, Database } from 'arangojs'\nimport { CollectionType, CreateCollectionOptions, DocumentCollection, EdgeCollection } from 'arangojs/collection'\nimport fs from 'fs'\nimport slugify from 'slugify'\nimport { TransactionOptions } from 'arangojs/database'\nimport { pathToFileURL } from 'url'\n\ntype Collection = DocumentCollection<any> & EdgeCollection<any>\n\nexport interface CollectionOptions {\n collectionName: string\n options?: CreateCollectionOptions & {\n type?: CollectionType\n }\n}\n\nexport type Collections = Array<string | CollectionOptions>\n\nexport type StepFunction = (callback) => Promise<any>\n\nexport interface Migration {\n /**\n * Optional function that will be called after the migration's `down` function is executed.\n * @param {Database} db - Database instance.\n * @param {*} data - Optional value received from the `beforeDown` function.\n * @returns {Promise<*>} - Value returned will be passed to the `afterDown` function.\n */\n afterDown?: (db: Database, data?: any) => Promise<any>,\n /**\n * Optional function that will be called after the migration's `up` function is executed.\n * @param {Database} db - Database instance.\n * @param {*} data - Value returned from the `up` function.\n * @returns {Promise<*>} - Value returned will be passed to the `afterUp` function.\n */\n afterUp?: (db: Database, data?: any) => Promise<void>,\n /**\n * Optional function that will be called before the migration's `down` function is executed.\n * @param {Database} db - Database instance.\n * @returns {Promise<*>} - Value returned will be passed to the `down` function.\n */\n beforeDown?: (db: Database) => Promise<any>,\n /**\n * Optional function that will be called before the migration's `up` function is executed.\n * @param {Database} db - Database instance.\n * @returns {Promise<*>} - Value returned will be passed to the `up` function.\n */\n beforeUp?: (db: Database) => Promise<any>\n /**\n * Defines all the collections that will be used as part of this migration.\n * @returns {Promise<Collections>} An array of collection names or an array of collection options.\n */\n collections(): Promise<Collections>;\n /**\n * Optional description of what the migration does. This value will be stored in the migration log.\n */\n description?: string,\n /**\n * Function that will be called to perform the `down` migration.\n * @param {Database} db - Database instance.\n * @param {StepFunction} - step The `step` function is used to add valid ArangoDB operations to the transaction.\n * @param {*} data - Optional value received from the `beforeDown` function.\n */\n down?: (db: Database, step: StepFunction, data?: any) => Promise<any>;\n /**\n * Optional function that configures how the transaction will be executed. See ArangoDB documentation for more information.\n * @returns {Promise<TransactionOptions>} - The transaction options.\n */\n transactionOptions?: () => Promise<TransactionOptions>;\n /**\n * Function that will be called to perform the `up` migration.\n * @param {Database} - db Database instance.\n * @param {StepFunction} - step The `step` function is used to add valid ArangoDB operations to the transaction.\n * @param {*} data Optional value received from the `beforeUp` function.\n */\n up: (db: Database, step: StepFunction, data?: any) => Promise<any>;\n}\n\nexport interface MigrationHistory {\n _id: string;\n _key: string;\n counter: number;\n createdAt: string;\n description?: string;\n direction: 'up' | 'down';\n name: string;\n version: number;\n}\n\nexport interface ArangoMigrateOptions {\n /**\n * Automatically create referenced collections if they do not exist. Defaults to `true`.\n */\n autoCreateNewCollections?: boolean,\n /**\n * ArangoDB connection options.\n */\n dbConfig: Config,\n /**\n * The collection in which the migration history will be stored. Defaults to `migration_history`.\n */\n migrationHistoryCollection?: string,\n /**\n * Path to the directory containing the migration files.\n */\n migrationsPath: string\n}\n\nconst isString = (s): boolean => {\n return typeof (s) === 'string' || s instanceof String\n}\n\nconst MIGRATION_TEMPLATE_JS = `/**\n * @typedef { import(\"arango-migrate\").Migration } Migration\n */\n\n/**\n * @type { Migration }\n */\nconst migration = {\n async collections () {\n return []\n },\n async up (db, step) {\n }\n}\n\nexport default migration\n`\n\nconst MIGRATION_TEMPLATE_TS = `import { Collections, Migration, StepFunction } from 'arango-migrate'\nimport { Database } from 'arangojs'\n\nconst migration: Migration = {\n async collections (): Promise<Collections> {\n return []\n },\n async up (db: Database, step: StepFunction) {}\n}\n\nexport default migration\n`\n\nexport const DEFAULT_CONFIG_PATH = './config.migrate.js'\nexport const DEFAULT_MIGRATIONS_PATH = './migrations'\nexport const DEFAULT_MIGRATION_HISTORY_COLLECTION = 'migration_history'\n\nexport class ArangoMigrate {\n private readonly options: ArangoMigrateOptions\n private readonly migrationHistoryCollection: string\n private db: Database\n private readonly migrationPaths: string[]\n private readonly migrationsPath: string\n\n constructor (options: ArangoMigrateOptions) {\n this.options = options\n this.migrationsPath = this.options.migrationsPath || DEFAULT_MIGRATIONS_PATH\n this.migrationHistoryCollection = this.options.migrationHistoryCollection || DEFAULT_MIGRATION_HISTORY_COLLECTION\n this.migrationPaths = this.loadMigrationPaths(this.migrationsPath)\n }\n\n public static async loadConfig (configPath: string = DEFAULT_CONFIG_PATH): Promise<ArangoMigrateOptions> {\n const p = path.resolve(configPath)\n if (!fs.existsSync((p))) {\n throw new Error(`Config file ${p} not found.`)\n }\n\n const importedConfig = await import(pathToFileURL(p).href)\n\n const config: ArangoMigrateOptions = importedConfig.default\n\n if (!config.dbConfig) {\n throw new Error('Config object must contain a dbConfig property.')\n }\n\n return config\n }\n\n public loadMigrationPaths (migrationsPath: string) {\n return glob.sync(migrationsPath + '/*').reduce((acc, filePath) => {\n return [\n ...acc,\n path.resolve(filePath)\n ]\n }, []).sort((a, b) => a.localeCompare(b))\n }\n\n public getMigrationPaths (): string[] {\n return this.migrationPaths\n }\n\n public async initialize (): Promise<void> {\n const name = this.options.dbConfig.databaseName\n\n try {\n this.db = new Database({ ...this.options.dbConfig, databaseName: undefined })\n this.db = await this.db.createDatabase(name)\n } catch (err) {\n this.db = new Database(this.options.dbConfig)\n this.db = this.db.database(name)\n }\n }\n\n public migrationExists (version: number): boolean {\n return this.getMigrationPathFromVersion(version) !== undefined\n }\n\n public getMigrationPathFromVersion (version: number): string {\n return this.migrationPaths.find(x => {\n const basename = path.basename(x)\n return version === Number(basename.split('_')[0])\n })\n }\n\n public async getMigrationFromVersion (version: number): Promise<Migration> {\n const migrationPath = this.migrationPaths.find(x => {\n const basename = path.basename(x)\n\n return version === Number(basename.split('_')[0]) && fs.existsSync(path.resolve(x))\n })\n\n const importedMigration = await import(pathToFileURL(migrationPath).href)\n return importedMigration.default\n }\n\n public async getMigrationHistoryCollection () {\n let collection: DocumentCollection\n try {\n collection = await this.db.createCollection(this.migrationHistoryCollection)\n } catch {\n collection = this.db.collection(this.migrationHistoryCollection)\n }\n return collection\n }\n\n public async getMigrationHistory (direction: 'ASC' | 'DESC' = 'ASC'): Promise<MigrationHistory[]> {\n const collection = await this.getMigrationHistoryCollection()\n\n return await (await this.db.query(aql`\n FOR x IN ${collection}\n SORT x.counter ${direction}\n RETURN x`)).all()\n }\n\n public async getLatestMigration (): Promise<MigrationHistory | null> {\n const collection = await this.getMigrationHistoryCollection()\n\n return await (await this.db.query(aql`\n FOR x IN ${collection}\n SORT x.counter DESC\n LIMIT 1\n RETURN x`)).next()\n }\n\n public async writeMigrationHistory (direction: 'up' | 'down', name: string, description: string, version: number) {\n const collection = await this.getMigrationHistoryCollection()\n\n const latest = await this.getLatestMigration()\n\n await collection.save({\n name,\n description,\n version,\n direction,\n counter: latest ? latest.counter + 1 : 1,\n createdAt: new Date()\n })\n }\n\n public async initializeTransactionCollections (collections: Collections) {\n const newCollections = new Set<Collection>()\n const allCollectionNames = new Set<string>()\n\n const transactionCollections = []\n\n let createdCollectionCount = 0\n\n for (const collectionData of collections) {\n const data = (isString(collectionData)\n ? {\n collectionName: collectionData\n }\n : collectionData) as CollectionOptions\n allCollectionNames.add(data.collectionName)\n let collection\n try {\n if (this.options.autoCreateNewCollections !== false) {\n /**\n * NOTE: arangojs *.d.ts invites user to pass \"literal\" options object\n * to infer typeof collection. Thus there is no another way to support\n * collections() API but using this ugly \"as any\" cast\n */\n collection = await this.db.createCollection(data.collectionName, data.options as any)\n createdCollectionCount++\n newCollections.add(collection)\n }\n } catch {\n collection = this.db.collection(data.collectionName)\n if (!collection) {\n throw new Error(`Collection ${data.collectionName} not found.`)\n }\n }\n if (collection) {\n transactionCollections.push(collection)\n }\n }\n\n return {\n transactionCollections,\n newCollections,\n allCollectionNames,\n createdCollectionCount\n }\n }\n\n public async runUpMigrations (to?: number, dryRun?: boolean, noHistory?: boolean): Promise<{\n appliedMigrations: number\n createdCollections: number\n }> {\n const versions = this.getVersionsFromMigrationPaths()\n\n if (!to) {\n to = versions[versions.length - 1]\n }\n\n const history = await this.getMigrationHistory('DESC')\n\n const versionsToRun = versions.filter((version) => {\n const migration = history.find((migration) => migration.version === version)\n return (migration?.direction !== 'up') && version <= to\n })\n\n let appliedMigrations = 0\n let createdCollections = 0\n\n for (const i of versionsToRun) {\n let migration: Migration\n try {\n migration = await this.getMigrationFromVersion(i)\n } catch (err) {\n console.log(err)\n return\n }\n\n const name = path.basename(this.getMigrationPathFromVersion(i))\n\n const collectionNames = migration.collections ? await migration.collections() : []\n\n const { transactionCollections, newCollections, createdCollectionCount } = await this.initializeTransactionCollections(collectionNames)\n createdCollections += createdCollectionCount\n\n let beforeUpData\n if (migration.beforeUp) {\n beforeUpData = await migration.beforeUp(this.db)\n }\n\n const transactionOptions = await migration.transactionOptions?.()\n\n const transaction = await this.db.beginTransaction(transactionCollections, transactionOptions)\n\n let error\n let upResult\n\n if (migration.up) {\n try {\n upResult = await migration.up(this.db, (callback: () => Promise<any>) => transaction.step(callback), beforeUpData)\n } catch (err) {\n console.log(err)\n error = new Error(`Running up failed for migration ${i}.`)\n }\n }\n\n if (!dryRun) {\n try {\n const transactionStatus = await transaction.commit()\n\n if (transactionStatus.status !== 'committed') {\n error = new Error(`Transaction failed with status ${transactionStatus.status} for migration ${name}.`)\n }\n } catch (err) {\n error = new Error('Transaction failed.')\n }\n }\n\n try {\n if (migration.afterUp) {\n await migration.afterUp(this.db, upResult)\n }\n } catch (err) {\n error = new Error(`afterUp threw an error ${err}.`)\n }\n\n if (error) {\n for (const collection of Array.from(newCollections)) {\n await collection.drop()\n }\n }\n\n if (!error) {\n if (!dryRun && noHistory !== true) {\n await this.writeMigrationHistory('up', name, migration.description, i)\n }\n }\n\n if (error) {\n throw error\n }\n appliedMigrations += 1\n }\n return { appliedMigrations, createdCollections }\n }\n\n public async runDownMigrations (to?: number, dryRun?: boolean, noHistory?: boolean, disallowMissingVersions?: boolean): Promise<{ appliedMigrations: number, createdCollections: number; }> {\n const latestMigration = await this.getLatestMigration()\n\n if (!latestMigration) {\n throw new Error('No migrations have been applied.')\n }\n\n if (!to) {\n to = 1\n }\n\n let appliedMigrations = 0\n let createdCollections = 0\n\n let version = latestMigration.version\n while (version >= to) {\n if (!this.migrationExists(version) && !disallowMissingVersions) {\n version--\n continue\n }\n\n let migration: Migration\n try {\n migration = await this.getMigrationFromVersion(version)\n } catch (err) {\n console.log(err)\n return\n }\n\n const name = path.basename(this.getMigrationPathFromVersion(version))\n\n const collectionNames = migration.collections ? await migration.collections() : []\n\n const { transactionCollections, newCollections, createdCollectionCount } = await this.initializeTransactionCollections(collectionNames)\n\n createdCollections += createdCollectionCount\n\n let error\n\n let beforeDownData\n\n if (migration.beforeDown) {\n beforeDownData = await migration.beforeDown(this.db)\n }\n\n const transaction = await this.db.beginTransaction(transactionCollections)\n\n let downResult\n\n if (migration.down) {\n try {\n downResult = await migration.down(this.db, (callback: () => Promise<any>) => transaction.step(callback), beforeDownData)\n } catch (err) {\n console.log(err)\n error = new Error(`Running up failed for migration ${version}.`)\n }\n }\n\n if (!dryRun) {\n try {\n const transactionStatus = await transaction.commit()\n\n if (transactionStatus.status !== 'committed') {\n error = new Error(`Transaction failed with status ${transactionStatus.status} for migration ${name}.`)\n }\n } catch (err) {\n error = new Error('Transaction failed.')\n }\n }\n\n try {\n if (migration.afterDown) {\n await migration.afterDown(this.db, downResult)\n }\n } catch (err) {\n error = new Error(`afterDown threw an error ${err}.`)\n }\n\n if (error) {\n for (const collection of Array.from(newCollections)) {\n await collection.drop()\n }\n }\n\n if (!error) {\n if (!dryRun && noHistory !== true) {\n await this.writeMigrationHistory('down', name, migration.description, version)\n }\n }\n\n if (error) {\n throw error\n }\n appliedMigrations += 1\n version--\n }\n return { appliedMigrations, createdCollections }\n }\n\n public getVersionsFromMigrationPaths (): number[] {\n return this.migrationPaths.map(migrationPath => {\n return Number(path.basename(migrationPath).split('_')[0])\n }).sort((a, b) => a - b)\n }\n\n public validateMigrationFolderNotEmpty () {\n if (this.migrationPaths.length === 0) {\n throw new Error('No migrations.')\n }\n }\n\n public validateMigrationVersions () {\n const versions = this.getVersionsFromMigrationPaths()\n\n if (!versions || versions.length !== new Set(versions).size) {\n throw new Error('Migration versions must be unique.')\n }\n }\n\n public async validateMigrationVersion (version: number) {\n const latestMigration = await this.getLatestMigration()\n\n if (!latestMigration && version > 1) {\n throw new Error(`Migration sequence must start with 1, not ${version}.`)\n }\n\n if (latestMigration && version > Number(latestMigration.version) + 1) {\n throw new Error(`Migration must be ran in sequence. ${version} must immediately follow ${latestMigration.version}.`)\n }\n\n if (latestMigration && version <= Number(latestMigration.version)) {\n const name = this.getMigrationPathFromVersion((version))\n\n throw new Error(`Cannot run up migration ${name} because migration has already been applied.`)\n }\n }\n\n public writeNewMigration (name: string, typescript: boolean): string {\n name = slugify(name, '_')\n const version = Date.now()\n\n if (!fs.existsSync(path.resolve(this.migrationsPath))) {\n fs.mkdirSync(path.resolve(this.migrationsPath))\n }\n\n const res = path.resolve(`${this.migrationsPath}/${version}_${name}${typescript ? '.ts' : '.js'}`)\n\n fs.writeFileSync(res, typescript ? MIGRATION_TEMPLATE_TS : MIGRATION_TEMPLATE_JS)\n\n return res\n }\n\n public async hasNewMigrations (): Promise<boolean> {\n const history = await this.getMigrationHistory('DESC')\n if (!history.length) {\n return true\n }\n\n const versions = this.getVersionsFromMigrationPaths()\n\n return versions.filter((version) => {\n const migration = history.find((migration) => migration.version === version)\n return (migration?.direction !== 'up')\n }).length !== 0\n }\n}\n"],"names":["isString","s","String","MIGRATION_TEMPLATE_JS","MIGRATION_TEMPLATE_TS","DEFAULT_CONFIG_PATH","DEFAULT_MIGRATIONS_PATH","DEFAULT_MIGRATION_HISTORY_COLLECTION","ArangoMigrate","constructor","options","migrationHistoryCollection","db","migrationPaths","migrationsPath","loadMigrationPaths","loadConfig","configPath","p","path","resolve","fs","existsSync","Error","importedConfig","pathToFileURL","href","config","default","dbConfig","glob","sync","reduce","acc","filePath","sort","a","b","localeCompare","getMigrationPaths","initialize","name","databaseName","Database","undefined","createDatabase","err","database","migrationExists","version","getMigrationPathFromVersion","find","x","basename","Number","split","getMigrationFromVersion","migrationPath","importedMigration","getMigrationHistoryCollection","collection","createCollection","getMigrationHistory","direction","query","aql","all","getLatestMigration","next","writeMigrationHistory","description","latest","save","counter","createdAt","Date","initializeTransactionCollections","collections","newCollections","Set","allCollectionNames","transactionCollections","createdCollectionCount","collectionData","data","collectionName","add","autoCreateNewCollections","push","runUpMigrations","to","dryRun","noHistory","versions","getVersionsFromMigrationPaths","length","history","versionsToRun","filter","migration","appliedMigrations","createdCollections","i","console","log","collectionNames","beforeUpData","beforeUp","transactionOptions","transaction","beginTransaction","error","upResult","up","callback","step","transactionStatus","commit","status","afterUp","Array","from","drop","runDownMigrations","disallowMissingVersions","latestMigration","beforeDownData","beforeDown","downResult","down","afterDown","map","validateMigrationFolderNotEmpty","validateMigrationVersions","size","validateMigrationVersion","writeNewMigration","typescript","slugify","now","mkdirSync","res","writeFileSync","hasNewMigrations"],"mappings":"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"}