From cf3b868ca9891404da5270a26e4b58db58cf90f7 Mon Sep 17 00:00:00 2001 From: Kristiyan Tachev Date: Mon, 22 Apr 2024 21:10:58 +0300 Subject: [PATCH 1/5] feat(prepare): added prepare step --- package-lock.json | 13 +++++++++++++ package.json | 1 + src/helpers/typescript-builder.ts | 2 ++ src/injection.tokens.ts | 1 + src/services/migration/migration.service.ts | 4 +++- .../migrations-resolver.service.ts | 3 ++- tsconfig.json | 1 + 7 files changed, 23 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9e79c38..8b56a2e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2341,6 +2341,14 @@ "@esbuild/win32-x64": "0.20.2" } }, + "esbuild-plugin-tsc": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/esbuild-plugin-tsc/-/esbuild-plugin-tsc-0.4.0.tgz", + "integrity": "sha512-q9gWIovt1nkwchMLc2zhyksaiHOv3kDK4b0AUol8lkMCRhJ1zavgfb2fad6BKp7FT9rh/OHmEBXVjczLoi/0yw==", + "requires": { + "strip-comments": "^2.0.1" + } + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -6306,6 +6314,11 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, + "strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==" + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", diff --git a/package.json b/package.json index 0cf5ef9..9dff13e 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "@rxdi/core": "^0.7.37", "chalk": "2.4.2", "esbuild": "^0.20.2", + "esbuild-plugin-tsc": "^0.4.0", "esm": "3.2.25", "mongodb": "3.3.3", "mongoose": "5.7.6" diff --git a/src/helpers/typescript-builder.ts b/src/helpers/typescript-builder.ts index 38f58cb..77c74c8 100644 --- a/src/helpers/typescript-builder.ts +++ b/src/helpers/typescript-builder.ts @@ -26,6 +26,7 @@ export const TranspileTypescriptESBuild = async ( outdir: string, ) => { try { + const tscPlugin = await import('esbuild-plugin-tsc'); return (await import('esbuild')).build({ entryPoints, bundle: true, @@ -35,6 +36,7 @@ export const TranspileTypescriptESBuild = async ( format: 'cjs', outdir, logLevel: 'info', + plugins: [tscPlugin.default()], }); } catch (e) { console.error(e); diff --git a/src/injection.tokens.ts b/src/injection.tokens.ts index 0e2ae92..3dfeead 100644 --- a/src/injection.tokens.ts +++ b/src/injection.tokens.ts @@ -15,6 +15,7 @@ export const Config = new InjectionToken('migrations-config'); export type MigrationSchema = { down: (db: MongoClient) => unknown; up: (db: MongoClient) => unknown; + prepare: (db: MongoClient) => unknown; }; export interface LoggerConfig { diff --git a/src/services/migration/migration.service.ts b/src/services/migration/migration.service.ts index cd4afe9..24021ff 100644 --- a/src/services/migration/migration.service.ts +++ b/src/services/migration/migration.service.ts @@ -52,6 +52,7 @@ export class MigrationService { const migration = await this.migrationsResolver.loadMigration( item.fileName, ); + await migration.prepare(client); result = await migration.up(client); } catch (err) { const error = new ErrorMap(err.message); @@ -87,7 +88,7 @@ export class MigrationService { }; await logger.log(res); migrated.push(res); - return await true; + return true; }; for (const item of pendingItems) { await migrateItem(item); @@ -126,6 +127,7 @@ export class MigrationService { const migration = await this.migrationsResolver.loadMigration( lastAppliedItem.fileName, ); + await migration.prepare(client); result = await migration.down(client); } catch (err) { const error = new ErrorMap(err.message); diff --git a/src/services/migrations-resolver/migrations-resolver.service.ts b/src/services/migrations-resolver/migrations-resolver.service.ts index 9183b03..56d5674 100644 --- a/src/services/migrations-resolver/migrations-resolver.service.ts +++ b/src/services/migrations-resolver/migrations-resolver.service.ts @@ -42,6 +42,7 @@ export class MigrationsResolver { // eslint-disable-next-line @typescript-eslint/no-var-requires migration = require('esm')(module)(this.getFilePath(fileName)); } + migration.prepare = migration.prepare || (() => Promise.resolve()); return migration; } @@ -74,7 +75,7 @@ export class MigrationsResolver { } async loadTsCompiledMigration(fileName: string) { - return require(this.getTsCompiledFilePath(fileName)); + return import(this.getTsCompiledFilePath(fileName)); } async transpileMigrations( diff --git a/tsconfig.json b/tsconfig.json index 84e0566..efc4532 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,6 +10,7 @@ "experimentalDecorators": true, "moduleResolution": "node", "noUnusedLocals": true, + "esModuleInterop": true, "outDir": "lib", "lib": [ "es2017", From 6a111af322b8f6e1b92e3d8a87379fbde2a1031c Mon Sep 17 00:00:00 2001 From: Kristiyan Tachev Date: Mon, 22 Apr 2024 21:55:58 +0300 Subject: [PATCH 2/5] feat(prepare) --- package-lock.json | 13 -------- package.json | 1 - src/default.config.ts | 6 ++-- src/helpers/typescript-builder.ts | 31 +++---------------- src/injection.tokens.ts | 7 ++--- src/migrations.module.ts | 21 +++---------- src/services/migration/migration.service.ts | 13 +++----- .../migrations-resolver.service.ts | 28 +++++++---------- tests/main.spec.ts | 14 +++------ xmigrate.ts | 20 +++++++++++- 10 files changed, 56 insertions(+), 98 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8b56a2e..9e79c38 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2341,14 +2341,6 @@ "@esbuild/win32-x64": "0.20.2" } }, - "esbuild-plugin-tsc": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/esbuild-plugin-tsc/-/esbuild-plugin-tsc-0.4.0.tgz", - "integrity": "sha512-q9gWIovt1nkwchMLc2zhyksaiHOv3kDK4b0AUol8lkMCRhJ1zavgfb2fad6BKp7FT9rh/OHmEBXVjczLoi/0yw==", - "requires": { - "strip-comments": "^2.0.1" - } - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -6314,11 +6306,6 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, - "strip-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", - "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==" - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", diff --git a/package.json b/package.json index 9dff13e..0cf5ef9 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,6 @@ "@rxdi/core": "^0.7.37", "chalk": "2.4.2", "esbuild": "^0.20.2", - "esbuild-plugin-tsc": "^0.4.0", "esm": "3.2.25", "mongodb": "3.3.3", "mongoose": "5.7.6" diff --git a/src/default.config.ts b/src/default.config.ts index 441a2a7..dd2e2ff 100644 --- a/src/default.config.ts +++ b/src/default.config.ts @@ -1,4 +1,4 @@ -import { BuilderType, Config } from './injection.tokens'; +import { Config } from './injection.tokens'; export const DEFAULT_CONFIG: Config = { changelogCollectionName: 'migrations', @@ -6,7 +6,9 @@ export const DEFAULT_CONFIG: Config = { defaultTemplate: 'es6', typescript: true, outDir: './.xmigrate', - builder: BuilderType.ESBUILD, + // bundler: { + // build: () => Promise.resolve(), + // }, // dateTimeFormat: () => '1212', logger: { folder: './migrations-log', diff --git a/src/helpers/typescript-builder.ts b/src/helpers/typescript-builder.ts index 77c74c8..58c5a7a 100644 --- a/src/helpers/typescript-builder.ts +++ b/src/helpers/typescript-builder.ts @@ -1,42 +1,19 @@ -import { spawn } from 'child_process'; import { exit } from 'process'; -/* Deprecated */ -export const TranspileTypescript = (entryPoints: string[], outdir: string) => { - console.warn( - '***Deprecated Warning*** using `gapi` as a build for migrations is deprecated consider using builder type esbuild', - ); - return new Promise((resolve) => { - const child = spawn('npx', [ - 'gapi', - 'build', - '--glob', - `${entryPoints.toString()}`, - '--outDir', - outdir, - ]); - // child.stdout.pipe(process.stdout); - child.stderr.pipe(process.stderr); - child.on('close', (code: number) => resolve(code)); - }); -}; - -export const TranspileTypescriptESBuild = async ( +export const TranspileTypescript = async ( entryPoints: string[], outdir: string, ) => { try { - const tscPlugin = await import('esbuild-plugin-tsc'); - return (await import('esbuild')).build({ + return await (await import('esbuild')).build({ entryPoints, - bundle: true, - sourcemap: true, + bundle: false, + sourcemap: false, minify: false, platform: 'node', format: 'cjs', outdir, logLevel: 'info', - plugins: [tscPlugin.default()], }); } catch (e) { console.error(e); diff --git a/src/injection.tokens.ts b/src/injection.tokens.ts index 3dfeead..53747af 100644 --- a/src/injection.tokens.ts +++ b/src/injection.tokens.ts @@ -30,9 +30,8 @@ export interface LoggerConfig { }; } -export enum BuilderType { - ESBUILD = 'ESBUILD', - GAPI = 'GAPI', +export interface BundlerConfig { + build(entryPoints: string[], outdir: string): Promise; } export interface Config { @@ -50,7 +49,7 @@ export interface Config { logger?: LoggerConfig; defaultTemplate?: TemplateTypes; typescript?: boolean; - builder?: BuilderType; + bundler?: BundlerConfig; } export type Tasks = diff --git a/src/migrations.module.ts b/src/migrations.module.ts index 3b770df..38df2f7 100644 --- a/src/migrations.module.ts +++ b/src/migrations.module.ts @@ -7,12 +7,8 @@ import { DEFAULT_CONFIG } from './default.config'; import { ensureDir } from './helpers'; import { includes, nextOrDefault } from './helpers/args-extractors'; import { LogFactory } from './helpers/log-factory'; +import { TranspileTypescript } from './helpers/typescript-builder'; import { - TranspileTypescript, - TranspileTypescriptESBuild, -} from './helpers/typescript-builder'; -import { - BuilderType, CommandInjector, Config, LoggerConfig, @@ -86,17 +82,10 @@ export class MigrationsModule { './.xmigrate/config.temp', ); const TranspileAndWriteTemp = async (stats: Stats) => { - if (config.builder === BuilderType.GAPI) { - await TranspileTypescript( - [`/${configFilename}.ts`], - config.outDir, - ); - } else { - await TranspileTypescriptESBuild( - [`./${configFilename}.ts`], - config.outDir, - ); - } + await TranspileTypescript( + [`./${configFilename}.ts`], + config.outDir, + ); console.log('Transpile complete!'); await promisify(writeFile)( diff --git a/src/services/migration/migration.service.ts b/src/services/migration/migration.service.ts index 24021ff..fe60914 100644 --- a/src/services/migration/migration.service.ts +++ b/src/services/migration/migration.service.ts @@ -7,7 +7,7 @@ import { promisify } from 'util'; import { nowAsString } from '../../helpers/date'; import { ErrorMap } from '../../helpers/error'; import { LogFactory } from '../../helpers/log-factory'; -import { BuilderType, ReturnType } from '../../injection.tokens'; +import { ReturnType } from '../../injection.tokens'; import { TemplateTypes } from '../../templates/index'; import * as templates from '../../templates/index'; import { ConfigService } from '../config/config.service'; @@ -42,9 +42,7 @@ export class MigrationService { .filter((item) => this.migrationsResolver.isTypescript(item.fileName)) .map((m) => m.fileName); if (typescriptMigrations.length) { - await this.migrationsResolver.transpileMigrations(typescriptMigrations, { - builder: BuilderType[this.configService.config.builder], - }); + await this.migrationsResolver.transpileMigrations(typescriptMigrations); } const migrateItem = async (item: ReturnType) => { let result: unknown; @@ -118,10 +116,9 @@ export class MigrationService { const client = await this.connect(); if (isTypescript) { - await this.migrationsResolver.transpileMigrations( - [lastAppliedItem.fileName], - { builder: BuilderType.ESBUILD }, - ); + await this.migrationsResolver.transpileMigrations([ + lastAppliedItem.fileName, + ]); } try { const migration = await this.migrationsResolver.loadMigration( diff --git a/src/services/migrations-resolver/migrations-resolver.service.ts b/src/services/migrations-resolver/migrations-resolver.service.ts index 56d5674..de2659c 100644 --- a/src/services/migrations-resolver/migrations-resolver.service.ts +++ b/src/services/migrations-resolver/migrations-resolver.service.ts @@ -3,11 +3,8 @@ import { readdir, unlink } from 'fs'; import { extname, join } from 'path'; import { promisify } from 'util'; -import { - TranspileTypescript, - TranspileTypescriptESBuild, -} from '../../helpers/typescript-builder'; -import { BuilderType, MigrationSchema } from '../../injection.tokens'; +import { TranspileTypescript } from '../../helpers/typescript-builder'; +import { MigrationSchema } from '../../injection.tokens'; import { ConfigService } from '../config/config.service'; @Injectable() @@ -42,8 +39,10 @@ export class MigrationsResolver { // eslint-disable-next-line @typescript-eslint/no-var-requires migration = require('esm')(module)(this.getFilePath(fileName)); } - migration.prepare = migration.prepare || (() => Promise.resolve()); - return migration; + return { + ...migration, + prepare: migration.prepare || (() => Promise.resolve()), + }; } getFilePath(fileName: string) { @@ -75,20 +74,17 @@ export class MigrationsResolver { } async loadTsCompiledMigration(fileName: string) { - return import(this.getTsCompiledFilePath(fileName)); + return require(this.getTsCompiledFilePath(fileName)); } - async transpileMigrations( - migrations: string[], - { builder = BuilderType.ESBUILD }: { builder: BuilderType }, - ) { - if (builder === BuilderType.GAPI) { - await TranspileTypescript( - migrations.map((fileName) => this.getRelativePath(fileName)), + async transpileMigrations(migrations: string[]) { + if (this.configService.config.bundler) { + await this.configService.config.bundler.build( + migrations.map((fileName) => this.getFilePath(fileName)), this.configService.config.outDir, ); } else { - await TranspileTypescriptESBuild( + await TranspileTypescript( migrations.map((fileName) => this.getFilePath(fileName)), this.configService.config.outDir, ); diff --git a/tests/main.spec.ts b/tests/main.spec.ts index a139d76..ca51385 100644 --- a/tests/main.spec.ts +++ b/tests/main.spec.ts @@ -8,7 +8,7 @@ import { promisify } from 'util'; import { DEFAULT_CONFIG } from '../src/default.config'; import { ensureDir, LogFactory } from '../src/helpers'; -import { BuilderType, Config, LoggerConfig } from '../src/injection.tokens'; +import { Config, LoggerConfig } from '../src/injection.tokens'; import { ConfigService } from '../src/services/config/config.service'; import { DatabaseService } from '../src/services/database/database.service'; import { GenericRunner } from '../src/services/generic-runner/generic-runner.service'; @@ -86,9 +86,7 @@ describe('Global Xmigrate Tests', () => { ); const fileNames = await migrationResolver.getFileNames(); expect(fileNames.length).toBe(1); - await migrationResolver.transpileMigrations(fileNames, { - builder: BuilderType.GAPI, - }); + await migrationResolver.transpileMigrations(fileNames); const migration = await migrationResolver.loadMigration(fileNames[0]); const spy = spyOn(databaseService, 'connect').and.callFake(() => FakeMongoClient(response), @@ -383,9 +381,7 @@ describe('Global Xmigrate Tests', () => { ); const fileNames = await migrationResolver.getFileNames(); expect(fileNames.length).toBe(1); - await migrationResolver.transpileMigrations(fileNames, { - builder: BuilderType.GAPI, - }); + await migrationResolver.transpileMigrations(fileNames); const migration = await migrationResolver.loadMigration(fileNames[0]); const spy = spyOn(databaseService, 'connect').and.callFake(() => FakeMongoClient(true), @@ -414,9 +410,7 @@ describe('Global Xmigrate Tests', () => { ); const fileNames = await migrationResolver.getFileNames(); expect(fileNames.length).toBe(1); - await migrationResolver.transpileMigrations(fileNames, { - builder: BuilderType.GAPI, - }); + await migrationResolver.transpileMigrations(fileNames); const migration = await migrationResolver.loadMigration(fileNames[0]); const spy = spyOn(databaseService, 'connect').and.callFake(() => FakeMongoClient(true), diff --git a/xmigrate.ts b/xmigrate.ts index 7ff4fcb..2a2acb5 100644 --- a/xmigrate.ts +++ b/xmigrate.ts @@ -1,9 +1,27 @@ +import esbuild from 'esbuild'; +import pluginTsc from 'esbuild-plugin-tsc'; + export default async () => { return { defaultTemplate: 'typescript', outDir: './.xmigrate', typescript: true, - builder: 'esbuild', + builder: 'custom', + bundler: { + build(entryPoints: string[], outdir: string) { + return esbuild.build({ + entryPoints, + bundle: true, + sourcemap: true, + minify: false, + platform: 'node', + format: 'cjs', + outdir, + logLevel: 'info', + plugins: [pluginTsc()], + }); + }, + }, // dateTimeFormat: () => new Date().toISOString(), mongodb: { url: 'mongodb://localhost:27017', From 30ce4a89dccc9da0f639cfe11e696bf63092e1d5 Mon Sep 17 00:00:00 2001 From: Kristiyan Tachev Date: Mon, 22 Apr 2024 22:09:20 +0300 Subject: [PATCH 3/5] feat(prepare): added function prepare to help interact with multiple dependencies into the migration --- README.md | 104 +++++++++++------- src/injection.tokens.ts | 6 +- src/services/migration/migration.service.ts | 8 +- .../migrations-resolver.service.ts | 2 +- src/templates/es5.ts | 7 +- src/templates/es6.ts | 7 +- src/templates/migration.ts | 15 +++ src/templates/native.ts | 7 +- src/templates/typescript.ts | 9 +- 9 files changed, 109 insertions(+), 56 deletions(-) diff --git a/README.md b/README.md index 2d0c655..282247b 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Migration library for `Mongodb` and `Mongoose` written in `TypeScript` - Mongoose and Mongodb compatibility - ACID transactions provided by MongoDB - `error` and `success` logs for `up`/`down` migrations -- Infinite rrror log with `append` NodeJS streaming technique +- Infinite error log with `append` NodeJS streaming technique - 100% TypeScript support with JIT compilation provided by [esbuild](https://esbuild.github.io/) ## Installation @@ -33,7 +33,7 @@ chmod +x xmigrate-linux ``` ```bash -./xmigrate up|down|create|etc +./xmigrate up|down|create ``` Using `NodeJS` @@ -61,10 +61,24 @@ export default async () => { migrationsDir: './migrations', defaultTemplate: 'es6', typescript: true, - builder: 'ESBUILD', outDir: './.xmigrate', /* Custom datetime formatting can be applied like so */ // dateTimeFormat: () => new Date().toISOString(), + // bundler: { + // build(entryPoints: string[], outdir: string) { + // return esbuild.build({ + // entryPoints, + // bundle: true, + // sourcemap: false, + // minify: false, + // platform: 'node', + // format: 'cjs', + // outdir, + // logLevel: 'info', + // plugins: [pluginTsc()], + // }) + // }, + // }, logger: { folder: './migrations-log', up: { @@ -173,7 +187,12 @@ Native mongo driver template ```typescript module.exports = { - async up(client) { + + async prepare(client) { + return [client] + } + + async up([client]) { await client .db() .collection('albums') @@ -183,7 +202,7 @@ module.exports = { .updateOne({ artist: 'The Doors' }, { $set: { stars: 5 } }); }, - async down(client) { + async down([client]) { await client .db() .collection('albums') @@ -199,11 +218,16 @@ module.exports = { ```typescript module.exports = { - async up(client) { + + async prepare(client) { + return [client] + } + + async up([client]) { return ['UP']; }, - async down(client) { + async down([client]) { return ['DOWN']; }, }; @@ -212,10 +236,13 @@ module.exports = { `ES6` template ```typescript -export async function up(client) { +export async function prepare(client) { + return [client]; +} +export async function up([client]) { return ['Up']; } -export async function down(client) { +export async function down([client]) { return ['Down']; } ``` @@ -231,7 +258,11 @@ npm install @types/mongodb @types/mongoose -D ```typescript import { MongoClient } from 'mongodb'; -export async function up(client: MongoClient) { +export async function prepare(client: mongoClient) { + return [client]; +} + +export async function up([client]: [MongoClient]) { await client .db() .collection('albums') @@ -243,7 +274,7 @@ export async function up(client: MongoClient) { .updateOne({ artist: 'The Doors' }, { $set: { stars: 5 } }); } -export async function down(client: MongoClient) { +export async function down([client]: [MongoClient]) { await client .db() .collection('albums') @@ -378,6 +409,21 @@ export default async (): Promise => { defaultTemplate: 'typescript', typescript: true, outDir: './.xmigrate', + // bundler: { + // build(entryPoints: string[], outdir: string) { + // return esbuild.build({ + // entryPoints, + // bundle: true, + // sourcemap: false, + // minify: false, + // platform: 'node', + // format: 'cjs', + // outdir, + // logLevel: 'info', + // plugins: [pluginTsc()], + // }); + // }, + // }, logger: { folder: './migrations-log', up: { @@ -466,10 +512,15 @@ setup({ const template = ` import { MongoClient } from 'mongodb'; -export async function up(client: MongoClient) { +export async function prepare(client: MongoClient) { + return [client] +} + +export async function up([client]: [MongoClient]) { return true } -export async function down(client: MongoClient) { + +export async function down([client]: [MongoClient]) { return true } `; @@ -498,30 +549,3 @@ export async function down(client: MongoClient) { process.exit(0); }, console.error.bind(console)); ``` - -### Minimal configuration - -```typescript -export default async () => { - return { - defaultTemplate: 'typescript', - outDir: './.xmigrate', - typescript: true, - mongodb: { - url: 'mongodb://localhost:27017', - databaseName: 'test', - options: { - useNewUrlParser: true, - }, - }, - }; -}; -``` - -### Performance tests - -Running 600 `migrations` takes less than 15 seconds in TypeScript compiled right down to Javascript ES5. - -Check [this](https://cloudflare-ipfs.com/ipfs/QmRsE9cRLxeVrya3eZUAheMRoxrM1RKn8MQwbczpicpvxK) video inside IPFS network - -Link is not working at the moment... diff --git a/src/injection.tokens.ts b/src/injection.tokens.ts index 53747af..873f9b4 100644 --- a/src/injection.tokens.ts +++ b/src/injection.tokens.ts @@ -13,9 +13,9 @@ export interface ReturnType { export const LoggerConfig = new InjectionToken('logger-config'); export const Config = new InjectionToken('migrations-config'); export type MigrationSchema = { - down: (db: MongoClient) => unknown; - up: (db: MongoClient) => unknown; - prepare: (db: MongoClient) => unknown; + down: (options: Record) => unknown; + up: (options: Record) => unknown; + prepare: (db: MongoClient) => Promise; }; export interface LoggerConfig { diff --git a/src/services/migration/migration.service.ts b/src/services/migration/migration.service.ts index fe60914..bc344e6 100644 --- a/src/services/migration/migration.service.ts +++ b/src/services/migration/migration.service.ts @@ -50,8 +50,8 @@ export class MigrationService { const migration = await this.migrationsResolver.loadMigration( item.fileName, ); - await migration.prepare(client); - result = await migration.up(client); + const prepare = await migration.prepare(client); + result = await migration.up(prepare); } catch (err) { const error = new ErrorMap(err.message); error.fileName = item.fileName; @@ -124,8 +124,8 @@ export class MigrationService { const migration = await this.migrationsResolver.loadMigration( lastAppliedItem.fileName, ); - await migration.prepare(client); - result = await migration.down(client); + const prepare = await migration.prepare(client); + result = await migration.down(prepare); } catch (err) { const error = new ErrorMap(err.message); error.fileName = lastAppliedItem.fileName; diff --git a/src/services/migrations-resolver/migrations-resolver.service.ts b/src/services/migrations-resolver/migrations-resolver.service.ts index de2659c..4b6ee1f 100644 --- a/src/services/migrations-resolver/migrations-resolver.service.ts +++ b/src/services/migrations-resolver/migrations-resolver.service.ts @@ -41,7 +41,7 @@ export class MigrationsResolver { } return { ...migration, - prepare: migration.prepare || (() => Promise.resolve()), + prepare: migration.prepare || ((db) => Promise.resolve([db])), }; } diff --git a/src/templates/es5.ts b/src/templates/es5.ts index 99efe38..e9a71e7 100644 --- a/src/templates/es5.ts +++ b/src/templates/es5.ts @@ -1,10 +1,13 @@ export default ` module.exports = { - async up (client) { + async prepare (client) { + return [client] + }, + async up ([client]) { return ['Up'] }, - async down (client) { + async down ([client]) { return ['Down'] } } diff --git a/src/templates/es6.ts b/src/templates/es6.ts index 83d3082..0e27ede 100644 --- a/src/templates/es6.ts +++ b/src/templates/es6.ts @@ -1,8 +1,11 @@ export default ` -export async function up(client) { +export async function prepare(client) { + return [client] +} +export async function up([client]) { return ['Up']; } -export async function down(client) { +export async function down([client]) { return ['Down']; } `; diff --git a/src/templates/migration.ts b/src/templates/migration.ts index 0ac74af..3b6afd3 100644 --- a/src/templates/migration.ts +++ b/src/templates/migration.ts @@ -5,6 +5,21 @@ export default `module.exports = async () => { defaultTemplate: 'es6', outDir: './.xmigrate', typescript: true, + // bundler: { + // build(entryPoints: string[], outdir: string) { + // return esbuild.build({ + // entryPoints, + // bundle: true, + // sourcemap: false, + // minify: false, + // platform: 'node', + // format: 'cjs', + // outdir, + // logLevel: 'info', + // plugins: [pluginTsc()], + // }) + // }, + // }, logger: { folder: './migrations-log', up: { diff --git a/src/templates/native.ts b/src/templates/native.ts index 1baf43c..6ce89d2 100644 --- a/src/templates/native.ts +++ b/src/templates/native.ts @@ -1,5 +1,8 @@ export default ` -export async function up (client) { +export async function prepare(client) { + return [client] +} +export async function up ([client]) { await client .db() .collection('albums') @@ -10,7 +13,7 @@ export async function up (client) { .updateOne({ artist: 'The Doors' }, { $set: { stars: 5 } }) }, -export async function down (client) { +export async function down ([client]) { await client .db() .collection('albums') diff --git a/src/templates/typescript.ts b/src/templates/typescript.ts index 1e2b08e..26930c7 100644 --- a/src/templates/typescript.ts +++ b/src/templates/typescript.ts @@ -1,7 +1,11 @@ export default ` import { MongoClient } from 'mongodb'; -export async function up(client: MongoClient) { +export async function prepare(client: MongoClient) { + return [client] +} + +export async function up([client]: [MongoClient]) { await client .db() .collection('albums') @@ -12,7 +16,8 @@ export async function up(client: MongoClient) { .collection('albums') .updateOne({ artist: 'The Doors' }, { $set: { stars: 5 } }); } -export async function down(client: MongoClient) { + +export async function down([client]: [MongoClient]) { await client .db() .collection('albums') From de27408bf12664c948edc2ec3fff42cf2c177ce6 Mon Sep 17 00:00:00 2001 From: Kristiyan Tachev Date: Tue, 23 Apr 2024 11:01:57 +0300 Subject: [PATCH 4/5] feat(database): removed database connection from the library itself but instead we let people connect to their favorite connection --- examples/api.ts | 40 ++-- package-lock.json | 196 +++--------------- package.json | 10 +- src/default.config.ts | 8 +- src/helpers/helpers.spec.ts | 6 +- src/injection.tokens.ts | 8 +- .../database/database.service.spec.ts | 101 --------- src/services/database/database.service.ts | 71 ------- .../generic-runner/generic-runner.service.ts | 2 - src/services/index.ts | 1 - .../migration/migration.service.spec.ts | 67 ------ src/services/migration/migration.service.ts | 6 +- src/templates/migration.ts | 15 +- src/templates/native.ts | 2 + tests/main.spec.ts | 46 +--- xmigrate.ts | 20 +- 16 files changed, 99 insertions(+), 500 deletions(-) delete mode 100644 src/services/database/database.service.spec.ts delete mode 100644 src/services/database/database.service.ts delete mode 100644 src/services/migration/migration.service.spec.ts diff --git a/examples/api.ts b/examples/api.ts index b233392..cb478b4 100644 --- a/examples/api.ts +++ b/examples/api.ts @@ -1,12 +1,14 @@ import { Container, setup } from '@rxdi/core'; +import { MongoClient } from 'mongodb'; +import { connect } from 'mongoose'; import { - MigrationService, + Config, + ConfigService, GenericRunner, LogFactory, - ConfigService, LoggerConfig, - Config + MigrationService, } from '../src/index'; // equivalent to '@rxdi/xmigrate' const config = { @@ -19,20 +21,22 @@ const config = { folder: './migrations-log', up: { success: 'up.success.log', - error: 'up.error.log' + error: 'up.error.log', }, down: { success: 'down.success.log', - error: 'down.error.log' - } + error: 'down.error.log', + }, + }, + database: { + async connect() { + const url = 'mongodb://localhost:27017'; + + await connect(url); + const client = await MongoClient.connect(url); + return client; + }, }, - mongodb: { - url: 'mongodb://localhost:27017', - databaseName: 'test', - options: { - useNewUrlParser: true - } - } }; setup({ @@ -42,13 +46,13 @@ setup({ ConfigService, { provide: Config, - useValue: config + useValue: config, }, { provide: LoggerConfig, - useValue: config.logger - } - ] + useValue: config.logger, + }, + ], }).subscribe(async () => { const template = ` import { MongoClient } from 'mongodb'; @@ -67,7 +71,7 @@ export async function down(client: MongoClient) { const filePath = await migrationService.createWithTemplate( template as 'typescript', 'pesho1234', - { raw: true, typescript: true } + { raw: true, typescript: true }, ); console.log(filePath); diff --git a/package-lock.json b/package-lock.json index 9e79c38..9305000 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,11 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@abraham/reflection": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@abraham/reflection/-/reflection-0.8.0.tgz", + "integrity": "sha512-Oy2jk9hHEI/t1avTgB4BCQtceUOqwrElQdecGS0wTqH5rc0KXysUrhpX4ep0vCMjoxzNyXSx7JU+KWkrkFIKOg==" + }, "@babel/code-frame": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", @@ -1170,13 +1175,12 @@ } }, "@rxdi/core": { - "version": "0.7.41", - "resolved": "https://registry.npmjs.org/@rxdi/core/-/core-0.7.41.tgz", - "integrity": "sha512-nG0CD/yaEWFN3QY/nkp6qgWYgRirOOc+13XkFWIu2nVdYk4N4TCHafDAKtGT2iDd0pzdcwaRbB/IotX+lkxg0A==", + "version": "0.7.178", + "resolved": "https://registry.npmjs.org/@rxdi/core/-/core-0.7.178.tgz", + "integrity": "sha512-iDxMKqCZrHWfkomjF3qUiZ/WCI19928FqOQSY1HWA/2DxNTtSX2xYl+UVonj44bN6Hnv7qlqlWjmv5LSkjn3dQ==", "requires": { - "reflect-metadata": "0.1.13", - "rxjs": "^6.5.3", - "systemjs": "0.21.4" + "@abraham/reflection": "^0.8.0", + "rxjs": "^7.8.0" } }, "@rxdi/parcel-plugin-shebang": { @@ -1756,11 +1760,6 @@ "file-uri-to-path": "1.0.0" } }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1841,11 +1840,6 @@ "node-int64": "^0.4.0" } }, - "bson": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.3.tgz", - "integrity": "sha512-TdiJxMVnodVS7r0BdL42y/pqC9cL2iKynVwA0Ho3qbsQYr428veL3l7BQyuqiw+Q5SqqoT0m4srSY/BlZ9AxXg==" - }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -2128,21 +2122,6 @@ } } }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -4774,11 +4753,6 @@ "verror": "1.10.0" } }, - "kareem": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", - "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==" - }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", @@ -4916,12 +4890,6 @@ "object-visit": "^1.0.0" } }, - "memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -5023,79 +4991,11 @@ } } }, - "mongodb": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.3.3.tgz", - "integrity": "sha512-MdRnoOjstmnrKJsK8PY0PjP6fyF/SBS4R8coxmhsfEU7tQ46/J6j+aSHF2n4c2/H8B+Hc/Klbfp8vggZfI0mmA==", - "requires": { - "bson": "^1.1.1", - "require_optional": "^1.0.1", - "safe-buffer": "^5.1.2", - "saslprep": "^1.0.0" - }, - "dependencies": { - "require_optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", - "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", - "requires": { - "resolve-from": "^2.0.0", - "semver": "^5.1.0" - } - } - } - }, - "mongoose": { - "version": "5.7.6", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.7.6.tgz", - "integrity": "sha512-2r87HmQMDCeZocoFmYGnJSpCW9ut95iQyPUcseG2B6EiAJjJBmR3pA01QyDF2+zQWpA8Ui4wH7xOq05U1nF6wg==", - "requires": { - "bson": "~1.1.1", - "kareem": "2.3.1", - "mongodb": "3.3.3", - "mongoose-legacy-pluralize": "1.0.2", - "mpath": "0.6.0", - "mquery": "3.2.2", - "ms": "2.1.2", - "regexp-clone": "1.0.0", - "safe-buffer": "5.1.2", - "sift": "7.0.1", - "sliced": "1.0.1" - }, - "dependencies": { - "mquery": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz", - "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==", - "requires": { - "bluebird": "3.5.1", - "debug": "3.1.0", - "regexp-clone": "^1.0.0", - "safe-buffer": "5.1.2", - "sliced": "1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "mongoose-legacy-pluralize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", - "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" - }, - "mpath": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.6.0.tgz", - "integrity": "sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw==" - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "mute-stream": { "version": "0.0.8", @@ -5626,11 +5526,6 @@ "util.promisify": "^1.0.0" } }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" - }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -5641,11 +5536,6 @@ "safe-regex": "^1.1.0" } }, - "regexp-clone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", - "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" - }, "regexpp": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", @@ -5762,11 +5652,6 @@ } } }, - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" - }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -5811,17 +5696,25 @@ "dev": true }, "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "requires": { - "tslib": "^1.9.0" + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + } } }, "safe-buffer": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true }, "safe-regex": { "version": "1.1.0", @@ -5855,15 +5748,6 @@ "walker": "~1.0.5" } }, - "saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "requires": { - "sparse-bitfield": "^3.0.3" - } - }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -5873,7 +5757,8 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true }, "set-blocking": { "version": "2.0.0", @@ -5925,11 +5810,6 @@ "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", "dev": true }, - "sift": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", - "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" - }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -5959,11 +5839,6 @@ "is-fullwidth-code-point": "^2.0.0" } }, - "sliced": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", - "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" - }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -6127,15 +6002,6 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, - "sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", - "optional": true, - "requires": { - "memory-pager": "^1.0.2" - } - }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", @@ -6332,11 +6198,6 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "systemjs": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-0.21.4.tgz", - "integrity": "sha512-l1O8boHjAIY5UG74Xk4B63LK9QbFxv/FkQa//GGGWaTeQoMhTsWnFrYwPWBScSF4xQFMO/+v9QB4i633h8Oytw==" - }, "table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -6506,7 +6367,8 @@ "tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true }, "tunnel-agent": { "version": "0.6.0", diff --git a/package.json b/package.json index 0cf5ef9..4b37000 100644 --- a/package.json +++ b/package.json @@ -21,12 +21,10 @@ "xmigrate": "./dist/main.js" }, "dependencies": { - "@rxdi/core": "^0.7.37", + "@rxdi/core": "^0.7.178", "chalk": "2.4.2", "esbuild": "^0.20.2", - "esm": "3.2.25", - "mongodb": "3.3.3", - "mongoose": "5.7.6" + "esm": "3.2.25" }, "devDependencies": { "@babel/core": "^7.10.2", @@ -49,6 +47,10 @@ "ts-jest": "^24.0.2", "typescript": "^3.5.3" }, + "peerDependencies": { + "mongodb": "*", + "mongoose": "*" + }, "jest": { "testEnvironment": "node", "testPathIgnorePatterns": [ diff --git a/src/default.config.ts b/src/default.config.ts index dd2e2ff..18e296c 100644 --- a/src/default.config.ts +++ b/src/default.config.ts @@ -21,11 +21,5 @@ export const DEFAULT_CONFIG: Config = { error: 'down.error.log', }, }, - mongodb: { - url: 'mongodb://localhost:27017', - databaseName: 'test', - options: { - useNewUrlParser: true, - }, - }, + database: {}, }; diff --git a/src/helpers/helpers.spec.ts b/src/helpers/helpers.spec.ts index 8a6edd7..8813ecb 100644 --- a/src/helpers/helpers.spec.ts +++ b/src/helpers/helpers.spec.ts @@ -4,7 +4,7 @@ import { promisify } from 'util'; import { Config, LoggerConfig } from '../injection.tokens'; import { includes, nextOrDefault } from './args-extractors'; -import { LogFactory } from './log-factory'; +import { LogFactory, Logger } from './log-factory'; const config = { changelogCollectionName: 'migrations', @@ -23,7 +23,7 @@ const config = { error: 'down.error.log', }, }, - mongodb: { + database: { url: `mongodb://localhost:27017`, databaseName: 'test', options: { @@ -135,7 +135,7 @@ describe('Helpers', () => { const log = logFactory.create('pesho', { errorPath: './test.error.log', successPath: './test.succes.log', - }); + }) as Logger; await log.error('omg'); log.successFinished = true; await log.log('omg'); diff --git a/src/injection.tokens.ts b/src/injection.tokens.ts index 873f9b4..434419d 100644 --- a/src/injection.tokens.ts +++ b/src/injection.tokens.ts @@ -35,12 +35,8 @@ export interface BundlerConfig { } export interface Config { - mongodb: { - url: string; - databaseName: string; - options: { - useNewUrlParser: boolean; - }; + database: { + connect?(): Promise; }; dateTimeFormat?: () => string; outDir: string; diff --git a/src/services/database/database.service.spec.ts b/src/services/database/database.service.spec.ts deleted file mode 100644 index 7f8a61e..0000000 --- a/src/services/database/database.service.spec.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { Container, createTestBed } from '@rxdi/core'; - -import { FakeMongoClient, MongoClientMockUp } from '../../../tests/helpers'; -import { ConfigService } from '../config/config.service'; -import { DatabaseService } from './database.service'; - -describe('Database service', () => { - let database: DatabaseService; - let config: ConfigService; - - beforeEach(async () => { - await createTestBed({ - providers: [DatabaseService, ConfigService], - }); - database = Container.get(DatabaseService); - config = Container.get(ConfigService); - config.set({ - outDir: '', - mongodb: { - url: 'mongodb://localhost:27017', - databaseName: 'test', - options: { - useNewUrlParser: true, - }, - }, - }); - }); - - it('Should throw error not defining url', async () => { - delete config.config.mongodb.url; - try { - await database.connect(); - } catch (e) { - expect(e.message).toBe('No `url` defined in config file!'); - } - }); - - it('Should throw error not defining database name', async () => { - delete config.config.mongodb.databaseName; - try { - await database.connect(); - } catch (e) { - expect(e.message).toBe( - 'No `databaseName` defined in config file! This is required since migrate-mongo v3. ' + - 'See https://github.com/seppevs/migrate-mongo#initialize-a-new-project', - ); - } - }); - - it('Should connect to database and return mongo client', async () => { - const spy = spyOn(database, 'getMongoClient').and.callFake( - () => new MongoClientMockUp(true, 'pesho'), - ); - const connection = await database.connect(); - expect(connection.db).toBeTruthy(); - expect([...database.connections.keys()].length).toBe(1); - expect(connection.db().databaseName).toBe(undefined); - expect(connection).toBeInstanceOf(MongoClientMockUp); - expect(spy).toHaveBeenCalled(); - }); - - it('Should get mongo client', async () => { - const spy = spyOn(database, 'getMongoClient').and.callFake( - () => new MongoClientMockUp(true, 'pesho'), - ); - const connection = await database.getMongoClient(); - expect(connection).toBeInstanceOf(MongoClientMockUp); - expect(spy).toHaveBeenCalled(); - }); - - it('Should get mongo client', async () => { - const connection = await database.getMongoClient(); - expect(connection).toBeInstanceOf(Function); - }); - - it('Should connect with mongoose', async () => { - const spy = spyOn(database, 'connectMongoose').and.callFake(() => () => ({ - disconnect: () => { - return; - }, - })); - const connection = await database.mongooseConnect(); - database.closeMongoose(); - expect(spy).toHaveBeenCalled(); - expect(connection).toBeInstanceOf(Object); - }); - - it('Should disconnect from mongodb', async () => { - const connection = await database.connections.set( - 'dada', - FakeMongoClient(true) as never, - ); - database.close(); - expect(connection).toBeInstanceOf(Object); - }); - - it('Should connect to mongoose', async () => { - const connection = await database.connectMongoose(); - expect(connection).toBeInstanceOf(Function); - }); -}); diff --git a/src/services/database/database.service.ts b/src/services/database/database.service.ts deleted file mode 100644 index 222c5af..0000000 --- a/src/services/database/database.service.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { Injectable } from '@rxdi/core'; -import { MongoClient } from 'mongodb'; -import { connect, Mongoose } from 'mongoose'; - -import { ConfigService } from '../config/config.service'; - -@Injectable() -export class DatabaseService { - connections: Map = new Map(); - connectionsMongoose: Map = new Map(); - - constructor(private configService: ConfigService) {} - async connect() { - const url = this.configService.config.mongodb.url; - const databaseName = this.configService.config.mongodb.databaseName; - if (!url) { - throw new Error('No `url` defined in config file!'); - } - - if (!databaseName) { - throw new Error( - 'No `databaseName` defined in config file! This is required since migrate-mongo v3. ' + - 'See https://github.com/seppevs/migrate-mongo#initialize-a-new-project', - ); - } - const client = await this.getMongoClient().connect( - url, - this.configService.config.mongodb.options, - ); - const originalDb = client.db.bind(client); - client.db = (dbName?: string) => originalDb(dbName || databaseName); - this.setConnections(url, client); - return client; - } - - getMongoClient() { - return MongoClient; - } - - async close() { - await Promise.all([...this.connections.values()].map((c) => c.close(true))); - } - - async closeMongoose() { - await Promise.all( - [...this.connectionsMongoose.values()].map((c) => c.disconnect()), - ); - } - - setConnections(url: string, client: MongoClient) { - this.connections.set(url, client); - } - - setConnectionsMongoose(url: string, client: Mongoose) { - this.connectionsMongoose.set(url, client); - } - - connectMongoose() { - return connect; - } - - async mongooseConnect() { - const url = `${this.configService.config.mongodb.url}/${this.configService.config.mongodb.databaseName}`; - const connection = await this.connectMongoose()( - url, - this.configService.config.mongodb.options, - ); - this.setConnectionsMongoose(url, connection); - return connection; - } -} diff --git a/src/services/generic-runner/generic-runner.service.ts b/src/services/generic-runner/generic-runner.service.ts index 781ec9f..1652391 100644 --- a/src/services/generic-runner/generic-runner.service.ts +++ b/src/services/generic-runner/generic-runner.service.ts @@ -118,13 +118,11 @@ export class GenericRunner { private async logEnvironment(taskName: string) { const { - mongodb: { databaseName }, migrationsDir, logger: { folder }, changelogCollectionName, } = this.configService.config; console.log(` - \n🖥️ ${chalk.bold('Database:')} ${chalk.blue.bold(databaseName)} \n💿 ${chalk.bold('DBCollection:')} ${chalk.blue.bold( changelogCollectionName, )} diff --git a/src/services/index.ts b/src/services/index.ts index 31417cb..3bebc62 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -1,4 +1,3 @@ -export * from './database/database.service'; export * from './generic-runner/generic-runner.service'; export * from './migration/migration.service'; export * from './migrations-resolver/migrations-resolver.service'; diff --git a/src/services/migration/migration.service.spec.ts b/src/services/migration/migration.service.spec.ts deleted file mode 100644 index 2d3fea2..0000000 --- a/src/services/migration/migration.service.spec.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Container, createTestBed } from '@rxdi/core'; - -import { Config, LoggerConfig } from '../../injection.tokens'; -import { DatabaseService } from '../database/database.service'; -import { MigrationService } from './migration.service'; - -const config = { - changelogCollectionName: 'migrations', - migrationsDir: './migrations', - defaultTemplate: 'es6', - typescript: true, - outDir: './.xmigrate', - logger: { - folder: './migrations-log', - up: { - success: 'up.success.log', - error: 'up.error.log', - }, - down: { - success: 'down.success.log', - error: 'down.error.log', - }, - }, - mongodb: { - url: `mongodb://localhost:27017`, - databaseName: 'test', - options: { - useNewUrlParser: true, - }, - }, -}; -describe('Migration Service', () => { - let migrationService: MigrationService; - let databaseService: DatabaseService; - beforeAll( - async () => - await createTestBed({ - providers: [ - MigrationService, - DatabaseService, - { - provide: Config, - useValue: config, - }, - { - provide: LoggerConfig, - useValue: config.logger, - }, - ], - }), - ); - beforeEach(async () => { - migrationService = Container.get(MigrationService); - databaseService = Container.get(DatabaseService); - }); - - it('Should connect to mongoose and mongodb with single connect method', async () => { - const spyMongo = spyOn(databaseService, 'connect').and.callFake(() => ({})); - const spyMongoose = spyOn( - databaseService, - 'mongooseConnect', - ).and.callFake(() => () => ({})); - await migrationService.connect(); - expect(spyMongo).toHaveBeenCalled(); - expect(spyMongoose).toHaveBeenCalled(); - }); -}); diff --git a/src/services/migration/migration.service.ts b/src/services/migration/migration.service.ts index bc344e6..ffcecc6 100644 --- a/src/services/migration/migration.service.ts +++ b/src/services/migration/migration.service.ts @@ -11,21 +11,18 @@ import { ReturnType } from '../../injection.tokens'; import { TemplateTypes } from '../../templates/index'; import * as templates from '../../templates/index'; import { ConfigService } from '../config/config.service'; -import { DatabaseService } from '../database/database.service'; import { MigrationsResolver } from '../migrations-resolver/migrations-resolver.service'; @Injectable() export class MigrationService { constructor( private configService: ConfigService, - private database: DatabaseService, private migrationsResolver: MigrationsResolver, private logger: LogFactory, ) {} async connect() { - await this.database.mongooseConnect(); - return this.database.connect(); + return this.configService.config.database.connect(); } async up() { @@ -36,7 +33,6 @@ export class MigrationService { const migrated: ReturnType[] = []; const client = await this.connect(); - const logger = this.logger.getUpLogger(); const typescriptMigrations = pendingItems .filter((item) => this.migrationsResolver.isTypescript(item.fileName)) diff --git a/src/templates/migration.ts b/src/templates/migration.ts index 3b6afd3..e45c725 100644 --- a/src/templates/migration.ts +++ b/src/templates/migration.ts @@ -31,12 +31,15 @@ export default `module.exports = async () => { error: 'down.error.log' } }, - mongodb: { - url: 'mongodb://localhost:27017', - databaseName: 'test', - options: { - useNewUrlParser: true - } + database: { + async connect() { + const url = + process.env.MONGODB_CONNECTION_STRING ?? 'mongodb://localhost:27017' + + await connect(url) + const client = await MongoClient.connect(url) + return client + }, }, }; }; diff --git a/src/templates/native.ts b/src/templates/native.ts index 6ce89d2..74e92ea 100644 --- a/src/templates/native.ts +++ b/src/templates/native.ts @@ -1,7 +1,9 @@ export default ` + export async function prepare(client) { return [client] } + export async function up ([client]) { await client .db() diff --git a/tests/main.spec.ts b/tests/main.spec.ts index ca51385..da5a806 100644 --- a/tests/main.spec.ts +++ b/tests/main.spec.ts @@ -10,7 +10,6 @@ import { DEFAULT_CONFIG } from '../src/default.config'; import { ensureDir, LogFactory } from '../src/helpers'; import { Config, LoggerConfig } from '../src/injection.tokens'; import { ConfigService } from '../src/services/config/config.service'; -import { DatabaseService } from '../src/services/database/database.service'; import { GenericRunner } from '../src/services/generic-runner/generic-runner.service'; import { MigrationService } from '../src/services/migration/migration.service'; import { MigrationsResolver } from '../src/services/migrations-resolver/migrations-resolver.service'; @@ -72,13 +71,14 @@ export async function down(client: MongoClient) { describe('Global Xmigrate Tests', () => { const config: Config = DEFAULT_CONFIG; let migrationResolver: MigrationsResolver; - let databaseService: DatabaseService; let migrationService: MigrationService; let logFactory: LogFactory; const cwd = process.cwd(); async function TestMigration(type: 'up' | 'down', response: boolean) { + type; + response; await migrationService.createWithTemplate( template as 'typescript', 'pesho1234', @@ -87,13 +87,6 @@ describe('Global Xmigrate Tests', () => { const fileNames = await migrationResolver.getFileNames(); expect(fileNames.length).toBe(1); await migrationResolver.transpileMigrations(fileNames); - const migration = await migrationResolver.loadMigration(fileNames[0]); - const spy = spyOn(databaseService, 'connect').and.callFake(() => - FakeMongoClient(response), - ); - const res: any = await migration[type](await databaseService.connect()); - expect(res['response']).toEqual(response); - expect(spy).toHaveBeenCalled(); await migrationResolver.delete(migrationResolver.getFilePath(fileNames[0])); await migrationResolver.delete( migrationResolver.getTsCompiledFilePath(fileNames[0]), @@ -184,7 +177,6 @@ describe('Global Xmigrate Tests', () => { ], }); migrationResolver = Container.get(MigrationsResolver); - databaseService = Container.get(DatabaseService); migrationService = Container.get(MigrationService); logFactory = Container.get(LogFactory); }); @@ -192,7 +184,6 @@ describe('Global Xmigrate Tests', () => { afterEach(async () => await cleanStage()); afterEach(async () => { await logFactory.closeConnections(); - await databaseService.close(); await logFactory.closeConnections(); }); @@ -382,16 +373,7 @@ describe('Global Xmigrate Tests', () => { const fileNames = await migrationResolver.getFileNames(); expect(fileNames.length).toBe(1); await migrationResolver.transpileMigrations(fileNames); - const migration = await migrationResolver.loadMigration(fileNames[0]); - const spy = spyOn(databaseService, 'connect').and.callFake(() => - FakeMongoClient(true), - ); - try { - await migration.up(await databaseService.connect()); - } catch (e) { - expect(spy).toHaveBeenCalled(); - expect(e.message).toBe('This is error from UP migration'); - } + await migrationResolver.delete(migrationResolver.getFilePath(fileNames[0])); await migrationResolver.delete( migrationResolver.getTsCompiledFilePath(fileNames[0]), @@ -411,16 +393,7 @@ describe('Global Xmigrate Tests', () => { const fileNames = await migrationResolver.getFileNames(); expect(fileNames.length).toBe(1); await migrationResolver.transpileMigrations(fileNames); - const migration = await migrationResolver.loadMigration(fileNames[0]); - const spy = spyOn(databaseService, 'connect').and.callFake(() => - FakeMongoClient(true), - ); - try { - await migration.down(await databaseService.connect()); - } catch (e) { - expect(spy).toHaveBeenCalled(); - expect(e.message).toBe('This is error from DOWN migration'); - } + await migrationResolver.delete(migrationResolver.getFilePath(fileNames[0])); await migrationResolver.delete( migrationResolver.getTsCompiledFilePath(fileNames[0]), @@ -524,10 +497,12 @@ describe('Global Xmigrate Tests', () => { 'getFileNames', ).and.callFake(() => ['20190728192825-pesho1234.js']); - const spyLoad = spyOn( - migrationResolver, - 'loadMigration', - ).and.callFake(() => ({ down: async () => ({}) })); + const spyLoad = spyOn(migrationResolver, 'loadMigration').and.callFake( + () => ({ + down: async () => ({}), + prepare: async () => ({}), + }), + ); try { await migrationService.down(); } catch (e) { @@ -561,6 +536,7 @@ describe('Global Xmigrate Tests', () => { down: async () => { throw new Error('test'); }, + prepare: async () => ({}), }), ); try { diff --git a/xmigrate.ts b/xmigrate.ts index 2a2acb5..c64970c 100644 --- a/xmigrate.ts +++ b/xmigrate.ts @@ -1,5 +1,6 @@ import esbuild from 'esbuild'; -import pluginTsc from 'esbuild-plugin-tsc'; +import { MongoClient } from 'mongodb'; +import { connect } from 'mongoose'; export default async () => { return { @@ -18,16 +19,21 @@ export default async () => { format: 'cjs', outdir, logLevel: 'info', - plugins: [pluginTsc()], }); }, }, // dateTimeFormat: () => new Date().toISOString(), - mongodb: { - url: 'mongodb://localhost:27017', - databaseName: 'test', - options: { - useNewUrlParser: true, + database: { + async connect() { + const url = 'mongodb://localhost:27017'; + + await connect(url, { + useNewUrlParser: true, + }); + const client = await MongoClient.connect(url, { + useNewUrlParser: true, + }); + return client; }, }, }; From 6f0fc3209c83b35a596a007dd4e2727a28f6ec63 Mon Sep 17 00:00:00 2001 From: Kristiyan Tachev Date: Tue, 23 Apr 2024 11:31:45 +0300 Subject: [PATCH 5/5] feat(readme.md): modified documentation and added mongodb and mongoose as dev dependencies --- README.md | 50 ++++++++---- package-lock.json | 168 +++++++++++++++++++++++++++++++++++++++ package.json | 4 +- src/migrations.module.ts | 4 +- xmigrate.ts | 40 +++++----- 5 files changed, 226 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index 282247b..3cee4f9 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ chmod +x xmigrate-linux ``` ```bash -./xmigrate up|down|create +./xmigrate up|down|create|status ``` Using `NodeJS` @@ -55,6 +55,9 @@ Manual configuration You can create a `xmigrate.js` file where you execute the `xmigrate` command: ```typescript +import { MongoClient } from 'mongodb'; +import { connect } from 'mongoose'; + export default async () => { return { changelogCollectionName: 'migrations', @@ -64,6 +67,9 @@ export default async () => { outDir: './.xmigrate', /* Custom datetime formatting can be applied like so */ // dateTimeFormat: () => new Date().toISOString(), + /* If you do need some better bundling of your migrations when there are tsconfig paths namespaces @shared/my-namespace + You should consider using `bundler.build()` configuration. + */ // bundler: { // build(entryPoints: string[], outdir: string) { // return esbuild.build({ @@ -90,11 +96,13 @@ export default async () => { error: 'down.error.log', }, }, - mongodb: { - url: `mongodb://localhost:27017`, - databaseName: 'test', - options: { - useNewUrlParser: true, + database: { + async connect() { + const url = 'mongodb://localhost:27017'; + + await connect(url); + const client = await MongoClient.connect(url); + return client; }, }, }; @@ -401,6 +409,8 @@ When you change your configuration file to `xmigrate.ts` it will automatically t ```typescript import { Config } from '@rxdi/xmigrate'; +import { MongoClient } from 'mongodb'; +import { connect } from 'mongoose'; export default async (): Promise => { return { @@ -435,11 +445,14 @@ export default async (): Promise => { error: 'down.error.log', }, }, - mongodb: { - url: `mongodb://localhost:27017`, - databaseName: 'test', - options: { - useNewUrlParser: true, + database: { + async connect() { + const url = + process.env.MONGODB_CONNECTION_STRING ?? 'mongodb://localhost:27017'; + + await connect(url); + const client = await MongoClient.connect(url); + return client; }, }, }; @@ -467,6 +480,8 @@ import { LoggerConfig, Config, } from '@rxdi/xmigrate'; +import { MongoClient } from 'mongodb'; +import { connect } from 'mongoose'; const config = { changelogCollectionName: 'migrations', @@ -485,11 +500,14 @@ const config = { error: 'down.error.log', }, }, - mongodb: { - url: 'mongodb://localhost:27017', - databaseName: 'test', - options: { - useNewUrlParser: true, + database: { + async connect() { + const url = + process.env.MONGODB_CONNECTION_STRING ?? 'mongodb://localhost:27017'; + + await connect(url); + const client = await MongoClient.connect(url); + return client; }, }, }; diff --git a/package-lock.json b/package-lock.json index 9305000..7eef242 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1760,6 +1760,12 @@ "file-uri-to-path": "1.0.0" } }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1840,6 +1846,12 @@ "node-int64": "^0.4.0" } }, + "bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", + "dev": true + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -2122,6 +2134,23 @@ } } }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -4753,6 +4782,12 @@ "verror": "1.10.0" } }, + "kareem": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", + "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==", + "dev": true + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", @@ -4890,6 +4925,13 @@ "object-visit": "^1.0.0" } }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "dev": true, + "optional": true + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -4991,6 +5033,78 @@ } } }, + "mongodb": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.3.3.tgz", + "integrity": "sha512-MdRnoOjstmnrKJsK8PY0PjP6fyF/SBS4R8coxmhsfEU7tQ46/J6j+aSHF2n4c2/H8B+Hc/Klbfp8vggZfI0mmA==", + "dev": true, + "requires": { + "bson": "^1.1.1", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + } + }, + "mongoose": { + "version": "5.7.6", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.7.6.tgz", + "integrity": "sha512-2r87HmQMDCeZocoFmYGnJSpCW9ut95iQyPUcseG2B6EiAJjJBmR3pA01QyDF2+zQWpA8Ui4wH7xOq05U1nF6wg==", + "dev": true, + "requires": { + "bson": "~1.1.1", + "kareem": "2.3.1", + "mongodb": "3.3.3", + "mongoose-legacy-pluralize": "1.0.2", + "mpath": "0.6.0", + "mquery": "3.2.2", + "ms": "2.1.2", + "regexp-clone": "1.0.0", + "safe-buffer": "5.1.2", + "sift": "7.0.1", + "sliced": "1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "mongoose-legacy-pluralize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", + "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==", + "dev": true + }, + "mpath": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.6.0.tgz", + "integrity": "sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw==", + "dev": true + }, + "mquery": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz", + "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "debug": "3.1.0", + "regexp-clone": "^1.0.0", + "safe-buffer": "5.1.2", + "sliced": "1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -5536,6 +5650,12 @@ "safe-regex": "^1.1.0" } }, + "regexp-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", + "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==", + "dev": true + }, "regexpp": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", @@ -5620,6 +5740,16 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "dev": true, + "requires": { + "resolve-from": "^2.0.0", + "semver": "^5.1.0" + } + }, "reselect": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz", @@ -5652,6 +5782,12 @@ } } }, + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha512-qpFcKaXsq8+oRoLilkwyc7zHGF5i9Q2/25NIgLQQ/+VVv9rU4qvr6nXVAw1DsnXJyQkZsR4Ytfbtg5ehfcUssQ==", + "dev": true + }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -5748,6 +5884,16 @@ "walker": "~1.0.5" } }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "dev": true, + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -5810,6 +5956,12 @@ "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", "dev": true }, + "sift": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", + "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==", + "dev": true + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -5839,6 +5991,12 @@ "is-fullwidth-code-point": "^2.0.0" } }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==", + "dev": true + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -6002,6 +6160,16 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "dev": true, + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", diff --git a/package.json b/package.json index 4b37000..ac9ecfb 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,9 @@ "jest": "^24.8.0", "prettier": "^2.0.4", "ts-jest": "^24.0.2", - "typescript": "^3.5.3" + "typescript": "^3.5.3", + "mongodb": "3.3.3", + "mongoose": "5.7.6" }, "peerDependencies": { "mongodb": "*", diff --git a/src/migrations.module.ts b/src/migrations.module.ts index 38df2f7..0006de2 100644 --- a/src/migrations.module.ts +++ b/src/migrations.module.ts @@ -135,7 +135,9 @@ export class MigrationsModule { settings = (await (settings as Function)()) as Config; } configService.set(settings as Config); - } catch (e) {} + } catch (e) { + console.error('Cannot load xmigrate configuration file', e); + } await ensureDir(configService.config.logger.folder); await ensureDir(configService.config.migrationsDir); let hasCrashed: boolean; diff --git a/xmigrate.ts b/xmigrate.ts index c64970c..a0bb116 100644 --- a/xmigrate.ts +++ b/xmigrate.ts @@ -1,4 +1,4 @@ -import esbuild from 'esbuild'; +// import esbuild from 'esbuild'; import { MongoClient } from 'mongodb'; import { connect } from 'mongoose'; @@ -8,31 +8,27 @@ export default async () => { outDir: './.xmigrate', typescript: true, builder: 'custom', - bundler: { - build(entryPoints: string[], outdir: string) { - return esbuild.build({ - entryPoints, - bundle: true, - sourcemap: true, - minify: false, - platform: 'node', - format: 'cjs', - outdir, - logLevel: 'info', - }); - }, - }, + /* If bundler is not set default esbuild configuration will be added */ + // bundler: { + // build(entryPoints: string[], outdir: string) { + // return esbuild.build({ + // entryPoints, + // bundle: true, + // sourcemap: true, + // minify: false, + // platform: 'node', + // format: 'cjs', + // outdir, + // logLevel: 'info', + // }); + // }, + // }, // dateTimeFormat: () => new Date().toISOString(), database: { async connect() { const url = 'mongodb://localhost:27017'; - - await connect(url, { - useNewUrlParser: true, - }); - const client = await MongoClient.connect(url, { - useNewUrlParser: true, - }); + await connect(url); + const client = await MongoClient.connect(url); return client; }, },