umzug-hyper-storage
Version:
A zero-dependency Storage Adapter for Umzug that uses a Hyper Data Service to track migrations
1 lines • 7.57 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../src/HyperStorage.ts"],"sourcesContent":["import type { Hyper, NotOkResult } from 'hyper-connect'\nimport type { MigrationParams, UmzugStorage } from 'umzug'\n\nimport type { HyperStorageArgs, HyperStorageDoc } from './types'\n\nexport class FromHyperError extends Error {\n constructor ({ msg }: { msg?: string }, _default = 'An Error Occurred') {\n super(msg || _default)\n }\n}\n\nexport class HyperStorage implements UmzugStorage {\n private readonly hyper: Hyper\n\n private readonly docId: string\n private readonly docType: string\n private readonly docTypeField: string\n private readonly createdField: string\n private readonly updatedField: string\n\n constructor (args: HyperStorageArgs) {\n // This is covered, but c8 isn't catching it *shrugs*\n /* c8 ignore start */\n if (!args.hyper) {\n throw new Error('hyper is a required option and must be an instance of hyper-connect')\n }\n /* c8 ignore stop */\n\n args.doc = args.doc ?? {}\n const { hyper, doc: { id, type, typeField, createdField, updatedField } = {} } = args\n\n // hyper connect instance\n this.hyper = hyper\n\n this.docType = type ?? '__scripts'\n this.docId = id ?? 'hyper-scripts-meta'\n this.docTypeField = typeField ?? 'type'\n this.updatedField = updatedField ?? 'updatedAt'\n this.createdField = createdField ?? 'createdAt'\n }\n\n /**\n * Logs migration to be considered as executed.\n */\n async logMigration ({ name }: MigrationParams<unknown>) {\n try {\n const doc = await this._findOrCreateMigrationDoc()\n doc.migrations = [...doc.migrations, name]\n await this._updateMigrationDoc(doc)\n } catch (err) {\n throw new Error(`Could not log migration ${name}: ${(err as Error).message}`)\n }\n }\n\n /**\n * Unlogs migration (makes it to be considered as pending).\n */\n async unlogMigration ({ name }: MigrationParams<unknown>) {\n try {\n const doc = await this._findOrCreateMigrationDoc()\n // remove migration from array of executed migrations\n const idx = doc.migrations.indexOf(name)\n doc.migrations = [...doc.migrations]\n doc.migrations.splice(idx, 1)\n await this._updateMigrationDoc(doc)\n } catch (err) {\n throw new Error(`Could not unlog migration ${name}: ${(err as Error).message}`)\n }\n }\n\n /**\n * Gets list of executed migrations.\n */\n async executed () {\n const doc = await this._findOrCreateMigrationDoc()\n return doc.migrations\n }\n\n private async _findOrCreateMigrationDoc (): Promise<HyperStorageDoc> {\n const res = await this.hyper.data.get(this.docId)\n\n let doc: HyperStorageDoc | undefined\n // check for strict equality since could be actual doc or { ok: false, ... }\n if (res.ok === false) {\n if (res.status !== 404) {\n throw new FromHyperError(res, 'Could not retrieve migration doc')\n }\n doc = undefined\n } else {\n /**\n * support both hyper-connect <0.6.0 && >=0.6.0\n * by grabbing 'doc' or the response itself as the doc (legacy get)\n */\n doc = (res.doc || res) as HyperStorageDoc\n }\n\n // Found\n if (doc) {\n return doc\n }\n\n // #### Create Migration Doc ####\n const newDoc: HyperStorageDoc = {\n _id: this.docId,\n [this.docTypeField]: this.docType,\n migrations: [],\n [this.createdField]: new Date(),\n [this.updatedField]: new Date()\n }\n\n let newDocRes = await this.hyper.data.add(newDoc)\n\n if (!newDocRes.ok) {\n newDocRes = newDocRes as NotOkResult\n if (newDocRes.status && newDocRes.status >= 400) {\n throw new FromHyperError(newDocRes, 'Could not create migration doc')\n }\n }\n\n return newDoc\n }\n\n private async _updateMigrationDoc (doc: HyperStorageDoc): Promise<HyperStorageDoc> {\n const update = {\n ...doc,\n [this.updatedField]: new Date()\n }\n const res = await this.hyper.data.update(doc._id, update)\n\n if (!res.ok) {\n throw new FromHyperError(res, 'Could not update migration doc')\n }\n\n return update\n }\n}\n"],"names":["FromHyperError","_Error","_ref","_default","msg","this","_wrapNativeSuper","Error","HyperStorage","args","hyper","docId","docType","docTypeField","createdField","updatedField","doc","_args$doc","id","_args$doc2","type","typeField","_proto","prototype","logMigration","_ref2","name","_this2","Promise","resolve","_catch","_findOrCreateMigrationDoc","migrations","_updateMigrationDoc","then","err","message","e","reject","unlogMigration","_ref3","_this4","idx","indexOf","concat","splice","executed","_this8","data","get","res","_newDoc","ok","status","undefined","newDoc","_id","Date","add","newDocRes","_extends2","update"],"mappings":"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"}