From abbe0409630284cca10d14f9ea88a222b17821c7 Mon Sep 17 00:00:00 2001 From: Regev Brody Date: Mon, 27 Apr 2020 15:12:03 +0300 Subject: [PATCH] feat: add migration scripts to typeorm #66 (#67) --- .gitignore | 1 + .npmignore | 1 + jest.config.js | 2 +- package.json | 7 +- src/db/impl/connectionOptionsProvider.ts | 49 +++++++++++ src/db/impl/connectionProvider.ts | 31 +++---- src/db/index.ts | 4 + .../interfaces/IConnectionOptionsProvider.ts | 5 ++ src/db/interfaces/IConnectionSettings.ts | 2 +- .../1587733162051-autoGeneratedMigration.ts | 22 +++++ .../testers/repositoryProviderTester.ts | 56 ++++++------- .../db/impl/connectionOptionsProvider.spec.ts | 81 ++++++++++++++++++ test/src/db/impl/connectionProvider.spec.ts | 83 +++++++++---------- .../impl/dependencyRepositoryProvider.spec.ts | 4 +- ...ependencyVersionRepositoryProvider.spec.ts | 6 +- test/src/db/index.spec.ts | 7 ++ .../src/db/impl/connectionProvider.spec.ts | 1 - .../impl/dependencyRepositoryProvider.spec.ts | 1 - ...ependencyVersionRepositoryProvider.spec.ts | 1 - ...ontributors.ts => generateContributors.ts} | 0 tools/getOrmConnection.ts | 12 +++ tools/utils/cli-setup.ts | 7 ++ tools/utils/logger.ts | 8 ++ yarn.lock | 2 +- 24 files changed, 290 insertions(+), 103 deletions(-) create mode 100644 src/db/impl/connectionOptionsProvider.ts create mode 100644 src/db/interfaces/IConnectionOptionsProvider.ts create mode 100644 src/db/migrations/1587733162051-autoGeneratedMigration.ts create mode 100644 test/src/db/impl/connectionOptionsProvider.spec.ts rename tools/{generate-contributors.ts => generateContributors.ts} (100%) create mode 100644 tools/getOrmConnection.ts create mode 100644 tools/utils/cli-setup.ts create mode 100644 tools/utils/logger.ts diff --git a/.gitignore b/.gitignore index ad001c84..b8df45de 100755 --- a/.gitignore +++ b/.gitignore @@ -71,3 +71,4 @@ typings/ # stryker temp files .stryker-tmp /reports +!/tools diff --git a/.npmignore b/.npmignore index 15d39fa1..43105a28 100644 --- a/.npmignore +++ b/.npmignore @@ -99,3 +99,4 @@ tools/ /stryker.conf.js /.stryker-tmp/ /reports/ +tools/ diff --git a/jest.config.js b/jest.config.js index 923269ca..f0751b37 100644 --- a/jest.config.js +++ b/jest.config.js @@ -6,7 +6,7 @@ const config = { }, }, testEnvironment: 'node', - collectCoverageFrom: ['/src/**/*.ts', '!/src/**/*.d.ts'], + collectCoverageFrom: ['/src/**/*.ts', '!/src/**/*.d.ts', '!/src/db/migrations/**'], setupFilesAfterEnv: ['/test/setup.ts'], coverageDirectory: 'coverage', coverageReporters: ['text-summary', 'lcov'], diff --git a/package.json b/package.json index cba1f4a3..805f705d 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "envcheck": "node -e \"if(!/yarn\\.js$/.test(process.env.npm_execpath))throw new Error('Use yarn')\"", "preinstall": "yarn run envcheck", "postinstall": "yarn run compile", - "versionupdate": "yarn run ncu && rm yarn.lock && yarn install", + "versionupdate": "yarn run ncu --error-level 2 || (yarn run ncu && rm yarn.lock && yarn install)", "clean:dist": "rm -rf dist && rm -f .buildcache", "prebuild": "yarn run lint && yarn run clean:dist", "build": "yarn run tsc -p tsconfig.build.json", @@ -67,7 +67,8 @@ "format:fix": "yarn run prettier --write \"./**/*.{ts,js,json,md}\"", "format:check": "yarn run prettier --list-different \"./**/*.{ts,js,json,md}\"", "check:spelling": "cspell --config=.cspell.json \"**/*.{md,ts,js}\"", - "generate-contributors": "yarn run ts-node --transpile-only ./tools/generate-contributors.ts && yarn run all-contributors generate", + "generate-contributors": "yarn run ts-node --transpile-only ./tools/generateContributors.ts && yarn run all-contributors generate", + "generate-migrations": "yarn run ts-node node_modules/.bin/typeorm migration:generate --config tools/getOrmConnection.ts --name autoGeneratedMigration", "check-clean-workspace-after-install": "git diff --quiet --exit-code", "docs:changelog": "yarn run changelog --allow-unknown", "mutation-test": "yarn run stryker run" @@ -126,7 +127,7 @@ "moment": "~2.24.0", "pacote": "~11.1.4", "reflect-metadata": "~0.1.13", - "shell-quote": "^1.7.2", + "shell-quote": "~1.7.2", "simple-git": "~1.132.0", "sqlite3": "~4.1.1", "tmp": "~0.1.0", diff --git a/src/db/impl/connectionOptionsProvider.ts b/src/db/impl/connectionOptionsProvider.ts new file mode 100644 index 00000000..79109d1d --- /dev/null +++ b/src/db/impl/connectionOptionsProvider.ts @@ -0,0 +1,49 @@ +import { injectable, multiInject } from 'inversify'; +import * as path from 'path'; +import { memoize } from '../../utils/memoize/memoize'; +import { IConnectionSettings } from '../interfaces/IConnectionSettings'; +import { IEntity, IEntityConstructor } from '../interfaces/IEntity'; +import { ConnectionOptions } from 'typeorm/connection/ConnectionOptions'; +import { IConnectionOptionsProvider } from '../interfaces/IConnectionOptionsProvider'; + +const DB_FILE = `cache.db`; +const MIGRATIONS_DIR = path.join(__dirname, `..`, `migrations`); +const MIGRATIONS_DIR_RELATIVE = MIGRATIONS_DIR.slice(process.cwd().length + 1); +const MIGRATIONS_FILES = path.join(MIGRATIONS_DIR, `**`, `!(*.d).[jt]s`); + +@injectable() +export class ConnectionOptionsProvider extends IConnectionOptionsProvider { + constructor( + private readonly settings: IConnectionSettings, + @multiInject(IEntity) private readonly entities: IEntityConstructor[] + ) { + super(); + } + + @memoize() + public getConnectionOptions(): ConnectionOptions { + const connectionOptions: ConnectionOptions = { + name: this.settings.migrationGenerationConfig ? `default` : this.settings.databaseFilePath, + type: `sqlite`, + database: path.join(this.settings.databaseFilePath, DB_FILE), + synchronize: false, + migrations: [MIGRATIONS_FILES], + logging: false, + dropSchema: false, + entities: this.entities, + cli: { + migrationsDir: MIGRATIONS_DIR_RELATIVE, + }, + }; + Object.defineProperty(connectionOptions, `migrationsRun`, { + get: (): boolean => { + return true; + }, + set: (): void => { + // Do nothing as we want migration generation to build incremental queries + }, + enumerable: true, + }); + return connectionOptions; + } +} diff --git a/src/db/impl/connectionProvider.ts b/src/db/impl/connectionProvider.ts index 7795a3c6..9c131b7b 100644 --- a/src/db/impl/connectionProvider.ts +++ b/src/db/impl/connectionProvider.ts @@ -1,25 +1,19 @@ -import { inject, injectable, multiInject } from 'inversify'; +import { inject, injectable } from 'inversify'; import { Connection } from 'typeorm/connection/Connection'; -import * as path from 'path'; import { memoize } from '../../utils/memoize/memoize'; import { IConnectionProvider } from '../interfaces/IConnectionProvider'; -import { IConnectionSettings } from '../interfaces/IConnectionSettings'; import { TypeOrm, TYPES } from '../../container/nodeModulesContainer'; -import { IEntity, IEntityConstructor } from '../interfaces/IEntity'; import { ILoggerFactory } from '../../utils/logger'; import { ILogger } from '../../utils/logger/interfaces/ILogger'; -import { ConnectionOptions } from 'typeorm/connection/ConnectionOptions'; - -const DB_FILE = `cache.db`; +import { IConnectionOptionsProvider } from '../interfaces/IConnectionOptionsProvider'; @injectable() export class ConnectionProvider extends IConnectionProvider { private readonly logger: ILogger; constructor( - private readonly settings: IConnectionSettings, @inject(TYPES.TypeOrm) private readonly typeorm: TypeOrm, - @multiInject(IEntity) private readonly entities: IEntityConstructor[], + private readonly connectionOptionsProvider: IConnectionOptionsProvider, loggerFactory: ILoggerFactory ) { super(); @@ -28,18 +22,19 @@ export class ConnectionProvider extends IConnectionProvider { @memoize() public async getConnection(): Promise { - const connectionOptions: ConnectionOptions = { - name: this.settings.databaseFilePath, - type: `sqlite`, - database: path.join(this.settings.databaseFilePath, DB_FILE), - synchronize: true, - logging: false, - dropSchema: this.settings.dropSchema, - entities: this.entities, - }; + const connectionOptions = this.connectionOptionsProvider.getConnectionOptions(); this.logger.debug(`Creating connection of type ${connectionOptions.type} to db ${connectionOptions.database}`); const connection = await this.typeorm.createConnection(connectionOptions); this.logger.debug(`Connection created successfully`); + const isOutOfSync = await this.isOutOfSync(connection); + if (isOutOfSync) { + throw new Error(`DB schema is out of sync`); + } return connection; } + + private async isOutOfSync(connection: Connection): Promise { + const sqlInMemory = await connection.driver.createSchemaBuilder().log(); + return sqlInMemory.upQueries.length > 0; + } } diff --git a/src/db/index.ts b/src/db/index.ts index 296c2a59..89f62ed6 100644 --- a/src/db/index.ts +++ b/src/db/index.ts @@ -10,6 +10,8 @@ import { IEntity } from './interfaces/IEntity'; import { Dependency } from './entities/dependency'; import { DependencyVersion } from './entities/dependencyVersion'; import { namedOrMultiConstraint } from '../container/utils'; +import { IConnectionOptionsProvider } from './interfaces/IConnectionOptionsProvider'; +import { ConnectionOptionsProvider } from './impl/connectionOptionsProvider'; export const EntitiesTags = { dependencyVersion: DependencyVersion.TAG, @@ -23,6 +25,7 @@ export const dbModulesBinder = (bind: Bind): void => { bind(IDependencyVersionRepositoryProvider) .to(DependencyVersionRepositoryProvider) .inSingletonScope(); + bind(IConnectionOptionsProvider).to(ConnectionOptionsProvider).inSingletonScope(); bind(IConnectionProvider).to(ConnectionProvider).inSingletonScope(); bind(IEntity).toConstantValue(Dependency).when(namedOrMultiConstraint(EntitiesTags.dependency, IEntity)); bind(IEntity) @@ -34,5 +37,6 @@ export * from './interfaces/IConnectionProvider'; export * from './interfaces/IDependencyRepositoryProvider'; export * from './interfaces/IDependencyVersionRepositoryProvider'; export * from './interfaces/IConnectionSettings'; +export * from './interfaces/IConnectionOptionsProvider'; export * from './entities/dependency'; export * from './entities/dependencyVersion'; diff --git a/src/db/interfaces/IConnectionOptionsProvider.ts b/src/db/interfaces/IConnectionOptionsProvider.ts new file mode 100644 index 00000000..15d2dd36 --- /dev/null +++ b/src/db/interfaces/IConnectionOptionsProvider.ts @@ -0,0 +1,5 @@ +import { ConnectionOptions } from 'typeorm'; + +export abstract class IConnectionOptionsProvider { + public abstract getConnectionOptions(): ConnectionOptions; +} diff --git a/src/db/interfaces/IConnectionSettings.ts b/src/db/interfaces/IConnectionSettings.ts index 8e6d087b..abdc6b87 100644 --- a/src/db/interfaces/IConnectionSettings.ts +++ b/src/db/interfaces/IConnectionSettings.ts @@ -1,4 +1,4 @@ export abstract class IConnectionSettings { public abstract readonly databaseFilePath: string; - public abstract readonly dropSchema: boolean; + public abstract readonly migrationGenerationConfig?: boolean; } diff --git a/src/db/migrations/1587733162051-autoGeneratedMigration.ts b/src/db/migrations/1587733162051-autoGeneratedMigration.ts new file mode 100644 index 00000000..07b42d1f --- /dev/null +++ b/src/db/migrations/1587733162051-autoGeneratedMigration.ts @@ -0,0 +1,22 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +// eslint-disable-next-line @typescript-eslint/class-name-casing +export class autoGeneratedMigration1587733162051 implements MigrationInterface { + name = `autoGeneratedMigration1587733162051`; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TABLE "dependency" ("name" text NOT NULL, "version" text NOT NULL, "targetNode" text NOT NULL, "match" boolean, "reason" text, PRIMARY KEY ("name", "version", "targetNode"))`, + undefined + ); + await queryRunner.query( + `CREATE TABLE "dependency_version" ("name" text NOT NULL, "version" text NOT NULL, "repoUrl" text NOT NULL, "releaseDate" text NOT NULL, "commitSha" text, PRIMARY KEY ("name", "version"))`, + undefined + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP TABLE "dependency_version"`, undefined); + await queryRunner.query(`DROP TABLE "dependency"`, undefined); + } +} diff --git a/test/common/testers/repositoryProviderTester.ts b/test/common/testers/repositoryProviderTester.ts index 19b70fff..ef0088ec 100644 --- a/test/common/testers/repositoryProviderTester.ts +++ b/test/common/testers/repositoryProviderTester.ts @@ -11,37 +11,35 @@ export const testRepositoryProvider = E, RepositoryProvider: new (connectionProvider: IConnectionProvider) => P ): void => { - describe(`${Entity} repository provider`, () => { - const repositoryMock = mock>(); - const connectionMock = mock(); - connectionMock.getRepository.mockReturnValue(repositoryMock); - const connectionProviderMock = mock(); - connectionProviderMock.getConnection.mockResolvedValue(connectionMock); - let dependencyRepositoryProvider: IRepositoryProvider; + const repositoryMock = mock>(); + const connectionMock = mock(); + connectionMock.getRepository.mockReturnValue(repositoryMock); + const connectionProviderMock = mock(); + connectionProviderMock.getConnection.mockResolvedValue(connectionMock); + let dependencyRepositoryProvider: IRepositoryProvider; - beforeEach(() => { - mockClear(connectionProviderMock); - mockClear(connectionMock); - mockClear(repositoryMock); - dependencyRepositoryProvider = new RepositoryProvider(connectionProviderMock); - }); + beforeEach(() => { + mockClear(connectionProviderMock); + mockClear(connectionMock); + mockClear(repositoryMock); + dependencyRepositoryProvider = new RepositoryProvider(connectionProviderMock); + }); - it(`should cache repo`, async () => { - const repo = await dependencyRepositoryProvider.getRepository(); - const repo2 = await dependencyRepositoryProvider.getRepository(); - expect(repo).toBe(repo2); - expect(repo).toBe(repositoryMock); - expect(connectionMock.getRepository).toBeCalledTimes(1); - expect(connectionProviderMock.getConnection).toBeCalledTimes(1); - }); + it(`should cache repo`, async () => { + const repo = await dependencyRepositoryProvider.getRepository(); + const repo2 = await dependencyRepositoryProvider.getRepository(); + expect(repo).toBe(repo2); + expect(repo).toBe(repositoryMock); + expect(connectionMock.getRepository).toBeCalledTimes(1); + expect(connectionProviderMock.getConnection).toBeCalledTimes(1); + }); - it(`should use connection properly`, async () => { - const repo = await dependencyRepositoryProvider.getRepository(); - expect(repo).toBe(repositoryMock); - expect(connectionProviderMock.getConnection).toBeCalledTimes(1); - expect(connectionMock.getRepository).toBeCalledTimes(1); - expect(connectionProviderMock.getConnection).toHaveBeenCalledWith(); - expect(connectionMock.getRepository).toHaveBeenCalledWith(Entity); - }); + it(`should use connection properly`, async () => { + const repo = await dependencyRepositoryProvider.getRepository(); + expect(repo).toBe(repositoryMock); + expect(connectionProviderMock.getConnection).toBeCalledTimes(1); + expect(connectionMock.getRepository).toBeCalledTimes(1); + expect(connectionProviderMock.getConnection).toHaveBeenCalledWith(); + expect(connectionMock.getRepository).toHaveBeenCalledWith(Entity); }); }; diff --git a/test/src/db/impl/connectionOptionsProvider.spec.ts b/test/src/db/impl/connectionOptionsProvider.spec.ts new file mode 100644 index 00000000..52ef3a60 --- /dev/null +++ b/test/src/db/impl/connectionOptionsProvider.spec.ts @@ -0,0 +1,81 @@ +import * as path from 'path'; +import { Dependency, IConnectionSettings } from '../../../../src/db'; +import * as tmp from 'tmp'; +import { normalize, join } from 'path'; +import { ConnectionOptionsProvider } from '../../../../src/db/impl/connectionOptionsProvider'; + +describe(`connection options provider`, () => { + let tmpDir: string; + + beforeEach(() => { + tmpDir = tmp.dirSync().name; + }); + + it(`should not be able to change the migrationsRun property`, async () => { + const settings: IConnectionSettings = { + databaseFilePath: tmpDir, + }; + const connectionOptionsProvider = new ConnectionOptionsProvider(settings, [Dependency]); + const options = connectionOptionsProvider.getConnectionOptions(); + expect(options.migrationsRun).toBe(true); + Object.assign(options, { + migrationsRun: false, + }); + expect(options.migrationsRun).toBe(true); + }); + + it(`should generate options properly`, async () => { + const settings: IConnectionSettings = { + databaseFilePath: tmpDir, + }; + const connectionOptionsProvider = new ConnectionOptionsProvider(settings, [Dependency]); + const options = connectionOptionsProvider.getConnectionOptions(); + expect(options).toEqual({ + name: tmpDir, + type: `sqlite`, + database: path.join(tmpDir, `cache.db`), + synchronize: false, + migrationsRun: true, + migrations: [normalize(join(__dirname, `../../../../src/db/migrations/**/!(*.d).[jt]s`))], + cli: { + migrationsDir: normalize(`src/db/migrations`), + }, + logging: false, + dropSchema: false, + entities: [Dependency], + }); + }); + + it(`should generate options properly for migration`, async () => { + const settings: IConnectionSettings = { + databaseFilePath: tmpDir, + migrationGenerationConfig: true, + }; + const connectionOptionsProvider = new ConnectionOptionsProvider(settings, [Dependency]); + const options = connectionOptionsProvider.getConnectionOptions(); + expect(options).toEqual({ + name: `default`, + type: `sqlite`, + database: path.join(tmpDir, `cache.db`), + synchronize: false, + migrationsRun: true, + migrations: [normalize(join(__dirname, `../../../../src/db/migrations/**/!(*.d).[jt]s`))], + cli: { + migrationsDir: normalize(`src/db/migrations`), + }, + logging: false, + dropSchema: false, + entities: [Dependency], + }); + }); + + it(`should cache connection options`, async () => { + const settings: IConnectionSettings = { + databaseFilePath: tmpDir, + }; + const connectionOptionsProvider = new ConnectionOptionsProvider(settings, []); + const options = connectionOptionsProvider.getConnectionOptions(); + const options2 = connectionOptionsProvider.getConnectionOptions(); + expect(options).toBe(options2); + }); +}); diff --git a/test/src/db/impl/connectionProvider.spec.ts b/test/src/db/impl/connectionProvider.spec.ts index 5c4df509..739691e1 100644 --- a/test/src/db/impl/connectionProvider.spec.ts +++ b/test/src/db/impl/connectionProvider.spec.ts @@ -1,69 +1,64 @@ -import * as path from 'path'; -import { Dependency, DependencyVersion, IConnectionSettings } from '../../../../src/db'; -import * as tmp from 'tmp'; +import { IConnectionOptionsProvider } from '../../../../src/db'; import { ConnectionProvider } from '../../../../src/db/impl/connectionProvider'; import { TypeOrm } from '../../../../src/container/nodeModulesContainer'; import { loggerFactory } from '../../../common/logger'; -import { mock, mockClear } from 'jest-mock-extended'; -import { Connection } from 'typeorm'; +import { mock, mockClear, mockDeep, mockReset } from 'jest-mock-extended'; +import { Connection, ConnectionOptions } from 'typeorm'; +import { SchemaBuilder } from 'typeorm/schema-builder/SchemaBuilder'; describe(`connection provider`, () => { - let tmpDir: string; - const connectionMock = mock(); + const connectionOptionsPlaceholder: ConnectionOptions = { + type: `sqlite`, + database: `database`, + }; + const connectionOptionsProviderMock = mock(); + connectionOptionsProviderMock.getConnectionOptions.mockReturnValue(connectionOptionsPlaceholder); + const connectionMock = mockDeep(); const typeOrmMock = mock(); + const schemaBuilderMock = mock(); typeOrmMock.createConnection.mockResolvedValue(connectionMock); + connectionMock.driver.createSchemaBuilder.mockReturnValue(schemaBuilderMock); beforeEach(() => { - tmpDir = tmp.dirSync().name; + mockReset(schemaBuilderMock); mockClear(typeOrmMock); }); it(`should call createConnection properly`, async () => { - const settings: IConnectionSettings = { - databaseFilePath: tmpDir, - dropSchema: false, - }; - const connectionProvider = new ConnectionProvider(settings, typeOrmMock, [Dependency], loggerFactory); + schemaBuilderMock.log.mockResolvedValue({ + upQueries: [], + downQueries: [], + }); + const connectionProvider = new ConnectionProvider(typeOrmMock, connectionOptionsProviderMock, loggerFactory); const conn = await connectionProvider.getConnection(); expect(conn).toBe(connectionMock); expect(typeOrmMock.createConnection).toBeCalledTimes(1); - expect(typeOrmMock.createConnection).toHaveBeenCalledWith({ - name: tmpDir, - type: `sqlite`, - database: path.join(tmpDir, `cache.db`), - synchronize: true, - logging: false, - dropSchema: false, - entities: [Dependency], - }); + expect(typeOrmMock.createConnection).toHaveBeenCalledWith(connectionOptionsPlaceholder); }); - it(`should call createConnection properly with drop schema`, async () => { - const settings: IConnectionSettings = { - databaseFilePath: tmpDir, - dropSchema: true, - }; - const connectionProvider = new ConnectionProvider(settings, typeOrmMock, [DependencyVersion], loggerFactory); - const conn = await connectionProvider.getConnection(); - expect(conn).toBe(connectionMock); - expect(typeOrmMock.createConnection).toBeCalledTimes(1); - expect(typeOrmMock.createConnection).toHaveBeenCalledWith({ - name: tmpDir, - type: `sqlite`, - database: path.join(tmpDir, `cache.db`), - synchronize: true, - logging: false, - dropSchema: true, - entities: [DependencyVersion], + it(`should fail it out of sync`, async () => { + schemaBuilderMock.log.mockResolvedValue({ + upQueries: [ + { + query: `query`, + }, + ], + downQueries: [], + }); + const connectionProvider = new ConnectionProvider(typeOrmMock, connectionOptionsProviderMock, loggerFactory); + const promise = connectionProvider.getConnection(); + await expect(promise).rejects.toBeInstanceOf(Error); + await expect(promise).rejects.toMatchObject({ + message: expect.stringContaining(`DB schema is out of sync`), }); }); it(`should cache connection`, async () => { - const settings: IConnectionSettings = { - databaseFilePath: tmpDir, - dropSchema: false, - }; - const connectionProvider = new ConnectionProvider(settings, typeOrmMock, [], loggerFactory); + schemaBuilderMock.log.mockResolvedValue({ + upQueries: [], + downQueries: [], + }); + const connectionProvider = new ConnectionProvider(typeOrmMock, connectionOptionsProviderMock, loggerFactory); const conn = await connectionProvider.getConnection(); const conn2 = await connectionProvider.getConnection(); expect(conn).toBe(conn2); diff --git a/test/src/db/impl/dependencyRepositoryProvider.spec.ts b/test/src/db/impl/dependencyRepositoryProvider.spec.ts index cc5ba0d8..034e4a20 100644 --- a/test/src/db/impl/dependencyRepositoryProvider.spec.ts +++ b/test/src/db/impl/dependencyRepositoryProvider.spec.ts @@ -2,4 +2,6 @@ import { Dependency } from '../../../../src/db'; import { DependencyRepositoryProvider } from '../../../../src/db/impl/dependencyRepositoryProvider'; import { testRepositoryProvider } from '../../../common/testers/repositoryProviderTester'; -testRepositoryProvider(Dependency, DependencyRepositoryProvider); +describe(`Dependency repository provider`, () => { + testRepositoryProvider(Dependency, DependencyRepositoryProvider); +}); diff --git a/test/src/db/impl/dependencyVersionRepositoryProvider.spec.ts b/test/src/db/impl/dependencyVersionRepositoryProvider.spec.ts index c4929586..6003dc21 100644 --- a/test/src/db/impl/dependencyVersionRepositoryProvider.spec.ts +++ b/test/src/db/impl/dependencyVersionRepositoryProvider.spec.ts @@ -1,5 +1,7 @@ import { DependencyVersion } from '../../../../src/db'; -import { DependencyVersionRepositoryProvider } from '../../../../src/db/impl/dependencyVersionRepositoryProvider'; import { testRepositoryProvider } from '../../../common/testers/repositoryProviderTester'; +import { DependencyVersionRepositoryProvider } from '../../../../src/db/impl/dependencyVersionRepositoryProvider'; -testRepositoryProvider(DependencyVersion, DependencyVersionRepositoryProvider); +describe(`DependencyVersion repository provider`, () => { + testRepositoryProvider(DependencyVersion, DependencyVersionRepositoryProvider); +}); diff --git a/test/src/db/index.spec.ts b/test/src/db/index.spec.ts index c22a3327..abb71d12 100644 --- a/test/src/db/index.spec.ts +++ b/test/src/db/index.spec.ts @@ -3,6 +3,7 @@ import { Dependency, DependencyVersion, EntitiesTags, + IConnectionOptionsProvider, IConnectionProvider, IDependencyRepositoryProvider, IDependencyVersionRepositoryProvider, @@ -12,6 +13,7 @@ import { DependencyVersionRepositoryProvider } from '../../../src/db/impl/depend import { ConnectionProvider } from '../../../src/db/impl/connectionProvider'; import { IEntity } from '../../../src/db/interfaces/IEntity'; import { BindingTypes, testBindings } from '../../common/testers/bindingTester'; +import { ConnectionOptionsProvider } from '../../../src/db/impl/connectionOptionsProvider'; testBindings({ name: `db module container`, @@ -27,6 +29,11 @@ testBindings({ binded: DependencyVersionRepositoryProvider, type: BindingTypes.SINGELTON, }, + { + binder: IConnectionOptionsProvider, + binded: ConnectionOptionsProvider, + type: BindingTypes.SINGELTON, + }, { binder: IConnectionProvider, binded: ConnectionProvider, diff --git a/testInteg/src/db/impl/connectionProvider.spec.ts b/testInteg/src/db/impl/connectionProvider.spec.ts index 32e78c8c..5f54cbf5 100644 --- a/testInteg/src/db/impl/connectionProvider.spec.ts +++ b/testInteg/src/db/impl/connectionProvider.spec.ts @@ -12,7 +12,6 @@ describe(`connection provider e2e`, () => { const tmpDir = tmp.dirSync().name; container.bind(IConnectionSettings).toConstantValue({ databaseFilePath: tmpDir, - dropSchema: false, }); connectionProvider = container.get(IConnectionProvider); conn = await connectionProvider.getConnection(); diff --git a/testInteg/src/db/impl/dependencyRepositoryProvider.spec.ts b/testInteg/src/db/impl/dependencyRepositoryProvider.spec.ts index 184f9339..5df02e7c 100644 --- a/testInteg/src/db/impl/dependencyRepositoryProvider.spec.ts +++ b/testInteg/src/db/impl/dependencyRepositoryProvider.spec.ts @@ -17,7 +17,6 @@ describe(`dependency repository provider e2e`, () => { const tmpDir = tmp.dirSync().name; container.bind(IConnectionSettings).toConstantValue({ databaseFilePath: tmpDir, - dropSchema: false, }); dependencyRepositoryProvider = container.get(IDependencyRepositoryProvider); const connectionProvider = container.get(IConnectionProvider); diff --git a/testInteg/src/db/impl/dependencyVersionRepositoryProvider.spec.ts b/testInteg/src/db/impl/dependencyVersionRepositoryProvider.spec.ts index bcf64333..1c4550aa 100644 --- a/testInteg/src/db/impl/dependencyVersionRepositoryProvider.spec.ts +++ b/testInteg/src/db/impl/dependencyVersionRepositoryProvider.spec.ts @@ -21,7 +21,6 @@ describe(`dependency version repository provider e2e`, () => { const tmpDir = tmp.dirSync().name; container.bind(IConnectionSettings).toConstantValue({ databaseFilePath: tmpDir, - dropSchema: false, }); dependencyVersionRepositoryProvider = container.get(IDependencyVersionRepositoryProvider); const connectionProvider = container.get(IConnectionProvider); diff --git a/tools/generate-contributors.ts b/tools/generateContributors.ts similarity index 100% rename from tools/generate-contributors.ts rename to tools/generateContributors.ts diff --git a/tools/getOrmConnection.ts b/tools/getOrmConnection.ts new file mode 100644 index 00000000..ff5fafc9 --- /dev/null +++ b/tools/getOrmConnection.ts @@ -0,0 +1,12 @@ +import './utils/cli-setup'; +import { container } from '../src/container'; +import * as tmp from 'tmp'; +import { IConnectionOptionsProvider, IConnectionSettings } from '../src/db'; + +const tmpDir = tmp.dirSync().name; +container.bind(IConnectionSettings).toConstantValue({ + databaseFilePath: tmpDir, + migrationGenerationConfig: true, +}); +const connectionOptionsProvider = container.get(IConnectionOptionsProvider); +module.exports = connectionOptionsProvider.getConnectionOptions(); diff --git a/tools/utils/cli-setup.ts b/tools/utils/cli-setup.ts new file mode 100644 index 00000000..b2a1cd1f --- /dev/null +++ b/tools/utils/cli-setup.ts @@ -0,0 +1,7 @@ +import 'reflect-metadata'; +import 'array-flat-polyfill'; +import { container } from '../../src/container'; +import { ILoggerSettings } from '../../src/utils/logger'; +import { loggerSettings } from './logger'; + +container.bind(ILoggerSettings).toConstantValue(loggerSettings); diff --git a/tools/utils/logger.ts b/tools/utils/logger.ts new file mode 100644 index 00000000..3a19c23f --- /dev/null +++ b/tools/utils/logger.ts @@ -0,0 +1,8 @@ +import { LoggerFactory } from '../../src/utils/logger/impl/loggerFactory'; +import { ILoggerFactory, ILoggerSettings } from '../../src/utils/logger'; + +export const loggerSettings: ILoggerSettings = { + debugMode: true, + traceMode: true, +}; +export const loggerFactory: ILoggerFactory = new LoggerFactory(loggerSettings); diff --git a/yarn.lock b/yarn.lock index 1dbc2674..17c26e05 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6329,7 +6329,7 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.7.2: +shell-quote@~1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==