Skip to content

Commit

Permalink
feat : log files loaded from glob patterns
Browse files Browse the repository at this point in the history
This new feature logs the files that are loaded using the glob patterns to aid in debugging.

Closes: #4162
  • Loading branch information
traore_a committed Jun 23, 2019
1 parent 117185b commit 838d205
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 27 deletions.
16 changes: 16 additions & 0 deletions docs/troubleshooting.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Troubleshooting

* [Glob patterns](#glob-patterns)

## Glob Patterns

Glob patterns are used in the TypeOrm to specify the locations of entities, migrations, subscriber and other information. Errors in the patterns can lead to the common `RepositoryNotFoundError` and familiar errors. In order to check if any files were loaded by TypeOrm using the glob patterns, all you need to do is set the logging level to `info` such as explained in the [Logging](./logging.md) section of the documentation. This will allow you to have logs in the console that may look like this:

```bash
# in case of an error
INFO: No classes were found using the provided glob pattern: "dist/**/*.entity{.ts}"
```
```bash
# when files are found
INFO: All classes found using provided glob pattern "dist/**/*.entity{.js,.ts}" : "dist/app/user/user.entity.js | dist/app/common/common.entity.js"
```
16 changes: 16 additions & 0 deletions docs/zh_CN/troubleshooting.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# 故障排除

* [全球模式](#全球模式)

## 全球模式

在类型中使用全局模式来指定实体,迁移,订户和其他信息的位置。模式中的错误可能导致常见的`RepositoryNotFoundError`和熟悉的错误。为了检查TypeOrm是否使用glob模式加载了任何文件,您需要做的就是将日志级别设置为`info`,如文档的[Logging](./logging.md)部分所述。 这将允许您拥有可能如下所示的日志:

```bash
# 如果出错
INFO: No classes were found using the provided glob pattern: "dist/**/*.entity{.ts}"
```
```bash
# 何时找到文件
INFO: All classes found using provided glob pattern "dist/**/*.entity{.js,.ts}" : "dist/app/user/user.entity.js | dist/app/common/common.entity.js"
```
34 changes: 17 additions & 17 deletions src/connection/ConnectionMetadataBuilder.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import {importClassesFromDirectories} from "../util/DirectoryExportedClassesLoader";
import {OrmUtils} from "../util/OrmUtils";
import {getFromContainer} from "../container";
import {MigrationInterface} from "../migration/MigrationInterface";
import {getMetadataArgsStorage} from "../index";
import {EntityMetadataBuilder} from "../metadata-builder/EntityMetadataBuilder";
import {EntitySchemaTransformer} from "../entity-schema/EntitySchemaTransformer";
import {Connection} from "./Connection";
import {EntitySchema} from "../entity-schema/EntitySchema";
import {EntityMetadata} from "../metadata/EntityMetadata";
import {EntitySubscriberInterface} from "../subscriber/EntitySubscriberInterface";
import { getFromContainer } from "../container";
import { EntitySchema } from "../entity-schema/EntitySchema";
import { EntitySchemaTransformer } from "../entity-schema/EntitySchemaTransformer";
import { getMetadataArgsStorage } from "../index";
import { EntityMetadataBuilder } from "../metadata-builder/EntityMetadataBuilder";
import { EntityMetadata } from "../metadata/EntityMetadata";
import { MigrationInterface } from "../migration/MigrationInterface";
import { EntitySubscriberInterface } from "../subscriber/EntitySubscriberInterface";
import { importClassesFromDirectories } from "../util/DirectoryExportedClassesLoader";
import { OrmUtils } from "../util/OrmUtils";
import { Connection } from "./Connection";

/**
* Builds migration instances, subscriber instances and entity metadatas for the given classes.
Expand All @@ -29,18 +29,18 @@ export class ConnectionMetadataBuilder {
/**
* Builds migration instances for the given classes or directories.
*/
buildMigrations(migrations: (Function|string)[]): MigrationInterface[] {
buildMigrations(migrations: (Function | string)[]): MigrationInterface[] {
const [migrationClasses, migrationDirectories] = OrmUtils.splitClassesAndStrings(migrations);
const allMigrationClasses = [...migrationClasses, ...importClassesFromDirectories(migrationDirectories)];
const allMigrationClasses = [...migrationClasses, ...importClassesFromDirectories(this.connection.logger, migrationDirectories)];
return allMigrationClasses.map(migrationClass => getFromContainer<MigrationInterface>(migrationClass));
}

/**
* Builds subscriber instances for the given classes or directories.
*/
buildSubscribers(subscribers: (Function|string)[]): EntitySubscriberInterface<any>[] {
buildSubscribers(subscribers: (Function | string)[]): EntitySubscriberInterface<any>[] {
const [subscriberClasses, subscriberDirectories] = OrmUtils.splitClassesAndStrings(subscribers || []);
const allSubscriberClasses = [...subscriberClasses, ...importClassesFromDirectories(subscriberDirectories)];
const allSubscriberClasses = [...subscriberClasses, ...importClassesFromDirectories(this.connection.logger, subscriberDirectories)];
return getMetadataArgsStorage()
.filterSubscribers(allSubscriberClasses)
.map(metadata => getFromContainer<EntitySubscriberInterface<any>>(metadata.target));
Expand All @@ -49,14 +49,14 @@ export class ConnectionMetadataBuilder {
/**
* Builds entity metadatas for the given classes or directories.
*/
buildEntityMetadatas(entities: (Function|EntitySchema<any>|string)[]): EntityMetadata[] {
buildEntityMetadatas(entities: (Function | EntitySchema<any> | string)[]): EntityMetadata[] {
// todo: instead we need to merge multiple metadata args storages

const [entityClassesOrSchemas, entityDirectories] = OrmUtils.splitClassesAndStrings(entities || []);
const entityClasses: Function[] = entityClassesOrSchemas.filter(entityClass => (entityClass instanceof EntitySchema) === false) as any;
const entitySchemas: EntitySchema<any>[] = entityClassesOrSchemas.filter(entityClass => entityClass instanceof EntitySchema) as any;

const allEntityClasses = [...entityClasses, ...importClassesFromDirectories(entityDirectories)];
const allEntityClasses = [...entityClasses, ...importClassesFromDirectories(this.connection.logger, entityDirectories)];
allEntityClasses.forEach(entityClass => { // if we have entity schemas loaded from directories
if (entityClass instanceof EntitySchema) {
entitySchemas.push(entityClass);
Expand Down
14 changes: 7 additions & 7 deletions src/logger/AdvancedConsoleLogger.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {LoggerOptions} from "./LoggerOptions";
import {PlatformTools} from "../platform/PlatformTools";
import {QueryRunner} from "../query-runner/QueryRunner";
import {Logger} from "./Logger";
import { PlatformTools } from "../platform/PlatformTools";
import { QueryRunner } from "../query-runner/QueryRunner";
import { Logger } from "./Logger";
import { LoggerOptions } from "./LoggerOptions";

/**
* Performs logging of the events in TypeORM.
Expand Down Expand Up @@ -70,15 +70,15 @@ export class AdvancedConsoleLogger implements Logger {
* Perform logging using given logger, or by default to the console.
* Log has its own level and message.
*/
log(level: "log"|"info"|"warn", message: any, queryRunner?: QueryRunner) {
log(level: "log" | "info" | "warn", message: any, queryRunner?: QueryRunner) {
switch (level) {
case "log":
if (this.options === "all" || (this.options instanceof Array && this.options.indexOf("log") !== -1))
console.log(message);
PlatformTools.log(message);
break;
case "info":
if (this.options === "all" || (this.options instanceof Array && this.options.indexOf("info") !== -1))
console.info(message);
PlatformTools.logInfo("INFO:", message);
break;
case "warn":
if (this.options === "all" || (this.options instanceof Array && this.options.indexOf("warn") !== -1))
Expand Down
15 changes: 12 additions & 3 deletions src/util/DirectoryExportedClassesLoader.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
import {PlatformTools} from "../platform/PlatformTools";
import {EntitySchema} from "../index";
import { EntitySchema } from "../index";
import { Logger } from "../logger/Logger";
import { PlatformTools } from "../platform/PlatformTools";

/**
* Loads all exported classes from the given directory.
*/
export function importClassesFromDirectories(directories: string[], formats = [".js", ".ts"]): Function[] {
export function importClassesFromDirectories(logger: Logger, directories: string[], formats = [".js", ".ts"]): Function[] {

const logLevel = "info";
const classesNotFoundMessage = "No classes were found using the provided glob pattern: ";
const classesFoundMessage = "All classes found using provided glob pattern";
function loadFileClasses(exported: any, allLoaded: Function[]) {
if (typeof exported === "function" || exported instanceof EntitySchema) {
allLoaded.push(exported);
Expand All @@ -24,6 +28,11 @@ export function importClassesFromDirectories(directories: string[], formats = ["
return allDirs.concat(PlatformTools.load("glob").sync(PlatformTools.pathNormalize(dir)));
}, [] as string[]);

if (directories.length > 0 && allFiles.length === 0) {
logger.log(logLevel, `${classesNotFoundMessage} "${directories}"`);
} else if (allFiles.length > 0) {
logger.log(logLevel, `${classesFoundMessage} "${directories}" : "${allFiles}"`);
}
const dirs = allFiles
.filter(file => {
const dtsExtension = file.substring(file.length - 5, file.length);
Expand Down

0 comments on commit 838d205

Please sign in to comment.