typeorm 0.3.23-dev.04f3d3f → 0.3.23-dev.184f463

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -29,8 +29,20 @@ export class EntityListenerMetadata {
29
29
  * Executes listener method of the given entity.
30
30
  */
31
31
  execute(entity) {
32
- if (!this.embeddedMetadata)
33
- return entity[this.propertyName]();
32
+ // Check if the Embedded Metadata does not exist
33
+ if (!this.embeddedMetadata) {
34
+ // Get the Entity's Method
35
+ const entityMethod = entity[this.propertyName];
36
+ // Check if the Entity Method does not exist
37
+ if (!entityMethod)
38
+ throw new Error(`Entity listener method "${this.propertyName}" does not exist in entity "${entity.constructor.name}".`);
39
+ // Check if the Entity Method is not a function
40
+ if (typeof entityMethod !== "function")
41
+ throw new Error(`Entity listener method "${this.propertyName}" in entity "${entity.constructor.name}" must be a function but got "${typeof entityMethod}".`);
42
+ // Call and return the Entity Method
43
+ return entityMethod.call(entity);
44
+ }
45
+ // Call the Embedded Method
34
46
  this.callEntityEmbeddedMethod(entity, this.embeddedMetadata.propertyPath.split("."));
35
47
  }
36
48
  // ---------------------------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"sources":["../browser/src/metadata/EntityListenerMetadata.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,OAAO,sBAAsB;IA+B/B,wEAAwE;IACxE,cAAc;IACd,wEAAwE;IAExE,YAAY,OAIX;QACG,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAA;QAC5C,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAA;QAChD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAA;QACjC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,CAAA;QAC7C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAA;IACjC,CAAC;IAED,wEAAwE;IACxE,iBAAiB;IACjB,wEAAwE;IAExE;;OAEG;IACH,SAAS,CAAC,MAAqB;QAC3B,2DAA2D;QAC3D,OAAO,CACH,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,MAAM,CAAC,WAAW,IAAI,oIAAoI;YACzL,CAAC,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,UAAU;gBAC7C,MAAM,CAAC,WAAW,CAAC,SAAS;oBACxB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CACtC,CAAA,CAAC,yDAAyD;IAC/D,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,MAAqB;QACzB,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAA;QAE9D,IAAI,CAAC,wBAAwB,CACzB,MAAM,EACN,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAChD,CAAA;IACL,CAAC;IAED,wEAAwE;IACxE,oBAAoB;IACpB,wEAAwE;IAExE;;OAEG;IACO,wBAAwB,CAC9B,MAAqB,EACrB,aAAuB;QAEvB,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,EAAE,CAAA;QAC1C,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;YAAE,OAAM;QAElD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;gBACtC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,QAAuB,EAAE,EAAE,CACjD,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAChC,CAAA;YACL,CAAC;iBAAM,CAAC;gBACJ,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAA;YAC7C,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAI,MAAM,CAAC,YAAY,CAAC;gBACpB,IAAI,CAAC,wBAAwB,CACzB,MAAM,CAAC,YAAY,CAAC,EACpB,aAAa,CAChB,CAAA;QACT,CAAC;IACL,CAAC;CACJ","file":"EntityListenerMetadata.js","sourcesContent":["import { EventListenerType } from \"./types/EventListenerTypes\"\nimport { EntityListenerMetadataArgs } from \"../metadata-args/EntityListenerMetadataArgs\"\nimport { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { EntityMetadata } from \"./EntityMetadata\"\nimport { EmbeddedMetadata } from \"./EmbeddedMetadata\"\n\n/**\n * This metadata contains all information about entity's listeners.\n */\nexport class EntityListenerMetadata {\n // ---------------------------------------------------------------------\n // Properties\n // ---------------------------------------------------------------------\n\n /**\n * Entity metadata of the listener.\n */\n entityMetadata: EntityMetadata\n\n /**\n * Embedded metadata of the listener, in the case if listener is in embedded.\n */\n embeddedMetadata?: EmbeddedMetadata\n\n /**\n * Target class to which metadata is applied.\n * This can be different then entityMetadata.target in the case if listener is in the embedded.\n */\n target: Function | string\n\n /**\n * Target's property name to which this metadata is applied.\n */\n propertyName: string\n\n /**\n * The type of the listener.\n */\n type: EventListenerType\n\n // ---------------------------------------------------------------------\n // Constructor\n // ---------------------------------------------------------------------\n\n constructor(options: {\n entityMetadata: EntityMetadata\n embeddedMetadata?: EmbeddedMetadata\n args: EntityListenerMetadataArgs\n }) {\n this.entityMetadata = options.entityMetadata\n this.embeddedMetadata = options.embeddedMetadata\n this.target = options.args.target\n this.propertyName = options.args.propertyName\n this.type = options.args.type\n }\n\n // ---------------------------------------------------------------------\n // Public Methods\n // ---------------------------------------------------------------------\n\n /**\n * Checks if entity listener is allowed to be executed on the given entity.\n */\n isAllowed(entity: ObjectLiteral) {\n // todo: create in entity metadata method like isInherited?\n return (\n this.entityMetadata.target === entity.constructor || // todo: .constructor won't work for entity schemas, but there are no entity listeners in schemas since there are no objects, right?\n (typeof this.entityMetadata.target === \"function\" &&\n entity.constructor.prototype instanceof\n this.entityMetadata.target)\n ) // todo: also need to implement entity schema inheritance\n }\n\n /**\n * Executes listener method of the given entity.\n */\n execute(entity: ObjectLiteral) {\n if (!this.embeddedMetadata) return entity[this.propertyName]()\n\n this.callEntityEmbeddedMethod(\n entity,\n this.embeddedMetadata.propertyPath.split(\".\"),\n )\n }\n\n // ---------------------------------------------------------------------\n // Protected Methods\n // ---------------------------------------------------------------------\n\n /**\n * Calls embedded entity listener method no matter how nested it is.\n */\n protected callEntityEmbeddedMethod(\n entity: ObjectLiteral,\n propertyPaths: string[],\n ): void {\n const propertyPath = propertyPaths.shift()\n if (!propertyPath || !entity[propertyPath]) return\n\n if (propertyPaths.length === 0) {\n if (Array.isArray(entity[propertyPath])) {\n entity[propertyPath].map((embedded: ObjectLiteral) =>\n embedded[this.propertyName](),\n )\n } else {\n entity[propertyPath][this.propertyName]()\n }\n } else {\n if (entity[propertyPath])\n this.callEntityEmbeddedMethod(\n entity[propertyPath],\n propertyPaths,\n )\n }\n }\n}\n"],"sourceRoot":".."}
1
+ {"version":3,"sources":["../browser/src/metadata/EntityListenerMetadata.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,OAAO,sBAAsB;IA+B/B,wEAAwE;IACxE,cAAc;IACd,wEAAwE;IAExE,YAAY,OAIX;QACG,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAA;QAC5C,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAA;QAChD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAA;QACjC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,CAAA;QAC7C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAA;IACjC,CAAC;IAED,wEAAwE;IACxE,iBAAiB;IACjB,wEAAwE;IAExE;;OAEG;IACH,SAAS,CAAC,MAAqB;QAC3B,2DAA2D;QAC3D,OAAO,CACH,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,MAAM,CAAC,WAAW,IAAI,oIAAoI;YACzL,CAAC,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,UAAU;gBAC7C,MAAM,CAAC,WAAW,CAAC,SAAS;oBACxB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CACtC,CAAA,CAAC,yDAAyD;IAC/D,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,MAAqB;QACzB,gDAAgD;QAChD,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACzB,0BAA0B;YAC1B,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YAE9C,4CAA4C;YAC5C,IAAI,CAAC,YAAY;gBACb,MAAM,IAAI,KAAK,CACX,2BAA2B,IAAI,CAAC,YAAY,+BAA+B,MAAM,CAAC,WAAW,CAAC,IAAI,IAAI,CACzG,CAAA;YAEL,+CAA+C;YAC/C,IAAI,OAAO,YAAY,KAAK,UAAU;gBAClC,MAAM,IAAI,KAAK,CACX,2BAA2B,IAAI,CAAC,YAAY,gBACxC,MAAM,CAAC,WAAW,CAAC,IACvB,iCAAiC,OAAO,YAAY,IAAI,CAC3D,CAAA;YAEL,oCAAoC;YACpC,OAAO,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACpC,CAAC;QAED,2BAA2B;QAC3B,IAAI,CAAC,wBAAwB,CACzB,MAAM,EACN,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAChD,CAAA;IACL,CAAC;IAED,wEAAwE;IACxE,oBAAoB;IACpB,wEAAwE;IAExE;;OAEG;IACO,wBAAwB,CAC9B,MAAqB,EACrB,aAAuB;QAEvB,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,EAAE,CAAA;QAC1C,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;YAAE,OAAM;QAElD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;gBACtC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,QAAuB,EAAE,EAAE,CACjD,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAChC,CAAA;YACL,CAAC;iBAAM,CAAC;gBACJ,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAA;YAC7C,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAI,MAAM,CAAC,YAAY,CAAC;gBACpB,IAAI,CAAC,wBAAwB,CACzB,MAAM,CAAC,YAAY,CAAC,EACpB,aAAa,CAChB,CAAA;QACT,CAAC;IACL,CAAC;CACJ","file":"EntityListenerMetadata.js","sourcesContent":["import { EventListenerType } from \"./types/EventListenerTypes\"\nimport { EntityListenerMetadataArgs } from \"../metadata-args/EntityListenerMetadataArgs\"\nimport { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { EntityMetadata } from \"./EntityMetadata\"\nimport { EmbeddedMetadata } from \"./EmbeddedMetadata\"\n\n/**\n * This metadata contains all information about entity's listeners.\n */\nexport class EntityListenerMetadata {\n // ---------------------------------------------------------------------\n // Properties\n // ---------------------------------------------------------------------\n\n /**\n * Entity metadata of the listener.\n */\n entityMetadata: EntityMetadata\n\n /**\n * Embedded metadata of the listener, in the case if listener is in embedded.\n */\n embeddedMetadata?: EmbeddedMetadata\n\n /**\n * Target class to which metadata is applied.\n * This can be different then entityMetadata.target in the case if listener is in the embedded.\n */\n target: Function | string\n\n /**\n * Target's property name to which this metadata is applied.\n */\n propertyName: string\n\n /**\n * The type of the listener.\n */\n type: EventListenerType\n\n // ---------------------------------------------------------------------\n // Constructor\n // ---------------------------------------------------------------------\n\n constructor(options: {\n entityMetadata: EntityMetadata\n embeddedMetadata?: EmbeddedMetadata\n args: EntityListenerMetadataArgs\n }) {\n this.entityMetadata = options.entityMetadata\n this.embeddedMetadata = options.embeddedMetadata\n this.target = options.args.target\n this.propertyName = options.args.propertyName\n this.type = options.args.type\n }\n\n // ---------------------------------------------------------------------\n // Public Methods\n // ---------------------------------------------------------------------\n\n /**\n * Checks if entity listener is allowed to be executed on the given entity.\n */\n isAllowed(entity: ObjectLiteral) {\n // todo: create in entity metadata method like isInherited?\n return (\n this.entityMetadata.target === entity.constructor || // todo: .constructor won't work for entity schemas, but there are no entity listeners in schemas since there are no objects, right?\n (typeof this.entityMetadata.target === \"function\" &&\n entity.constructor.prototype instanceof\n this.entityMetadata.target)\n ) // todo: also need to implement entity schema inheritance\n }\n\n /**\n * Executes listener method of the given entity.\n */\n execute(entity: ObjectLiteral) {\n // Check if the Embedded Metadata does not exist\n if (!this.embeddedMetadata) {\n // Get the Entity's Method\n const entityMethod = entity[this.propertyName]\n\n // Check if the Entity Method does not exist\n if (!entityMethod)\n throw new Error(\n `Entity listener method \"${this.propertyName}\" does not exist in entity \"${entity.constructor.name}\".`,\n )\n\n // Check if the Entity Method is not a function\n if (typeof entityMethod !== \"function\")\n throw new Error(\n `Entity listener method \"${this.propertyName}\" in entity \"${\n entity.constructor.name\n }\" must be a function but got \"${typeof entityMethod}\".`,\n )\n\n // Call and return the Entity Method\n return entityMethod.call(entity)\n }\n\n // Call the Embedded Method\n this.callEntityEmbeddedMethod(\n entity,\n this.embeddedMetadata.propertyPath.split(\".\"),\n )\n }\n\n // ---------------------------------------------------------------------\n // Protected Methods\n // ---------------------------------------------------------------------\n\n /**\n * Calls embedded entity listener method no matter how nested it is.\n */\n protected callEntityEmbeddedMethod(\n entity: ObjectLiteral,\n propertyPaths: string[],\n ): void {\n const propertyPath = propertyPaths.shift()\n if (!propertyPath || !entity[propertyPath]) return\n\n if (propertyPaths.length === 0) {\n if (Array.isArray(entity[propertyPath])) {\n entity[propertyPath].map((embedded: ObjectLiteral) =>\n embedded[this.propertyName](),\n )\n } else {\n entity[propertyPath][this.propertyName]()\n }\n } else {\n if (entity[propertyPath])\n this.callEntityEmbeddedMethod(\n entity[propertyPath],\n propertyPaths,\n )\n }\n }\n}\n"],"sourceRoot":".."}
@@ -25,6 +25,8 @@ export interface UpdateEvent<Entity> {
25
25
  manager: EntityManager;
26
26
  /**
27
27
  * Updating entity.
28
+ *
29
+ * Contains the same data that was passed to the updating method, be it the instance of an entity or the partial entity.
28
30
  */
29
31
  entity: ObjectLiteral | undefined;
30
32
  /**
@@ -33,6 +35,8 @@ export interface UpdateEvent<Entity> {
33
35
  metadata: EntityMetadata;
34
36
  /**
35
37
  * Updating entity in the database.
38
+ *
39
+ * Is set only when one of the following methods are used: .save(), .remove(), .softRemove(), and .recover()
36
40
  */
37
41
  databaseEntity: Entity;
38
42
  /**
@@ -1 +1 @@
1
- {"version":3,"sources":["../browser/src/subscriber/event/UpdateEvent.ts"],"names":[],"mappings":"","file":"UpdateEvent.js","sourcesContent":["import { ColumnMetadata } from \"../../metadata/ColumnMetadata\"\nimport { RelationMetadata } from \"../../metadata/RelationMetadata\"\nimport { EntityManager } from \"../../entity-manager/EntityManager\"\nimport { QueryRunner } from \"../../query-runner/QueryRunner\"\nimport { DataSource } from \"../../data-source/DataSource\"\nimport { EntityMetadata } from \"../../metadata/EntityMetadata\"\nimport { ObjectLiteral } from \"../../common/ObjectLiteral\"\n\n/**\n * UpdateEvent is an object that broadcaster sends to the entity subscriber when entity is being updated in the database.\n */\nexport interface UpdateEvent<Entity> {\n /**\n * Connection used in the event.\n */\n connection: DataSource\n\n /**\n * QueryRunner used in the event transaction.\n * All database operations in the subscribed event listener should be performed using this query runner instance.\n */\n queryRunner: QueryRunner\n\n /**\n * EntityManager used in the event transaction.\n * All database operations in the subscribed event listener should be performed using this entity manager instance.\n */\n manager: EntityManager\n\n /**\n * Updating entity.\n */\n entity: ObjectLiteral | undefined\n\n /**\n * Metadata of the entity.\n */\n metadata: EntityMetadata\n\n /**\n * Updating entity in the database.\n */\n databaseEntity: Entity\n\n /**\n * List of updated columns. In query builder has no affected\n */\n updatedColumns: ColumnMetadata[]\n\n /**\n * List of updated relations. In query builder has no affected\n */\n updatedRelations: RelationMetadata[]\n}\n"],"sourceRoot":"../.."}
1
+ {"version":3,"sources":["../browser/src/subscriber/event/UpdateEvent.ts"],"names":[],"mappings":"","file":"UpdateEvent.js","sourcesContent":["import { ColumnMetadata } from \"../../metadata/ColumnMetadata\"\nimport { RelationMetadata } from \"../../metadata/RelationMetadata\"\nimport { EntityManager } from \"../../entity-manager/EntityManager\"\nimport { QueryRunner } from \"../../query-runner/QueryRunner\"\nimport { DataSource } from \"../../data-source/DataSource\"\nimport { EntityMetadata } from \"../../metadata/EntityMetadata\"\nimport { ObjectLiteral } from \"../../common/ObjectLiteral\"\n\n/**\n * UpdateEvent is an object that broadcaster sends to the entity subscriber when entity is being updated in the database.\n */\nexport interface UpdateEvent<Entity> {\n /**\n * Connection used in the event.\n */\n connection: DataSource\n\n /**\n * QueryRunner used in the event transaction.\n * All database operations in the subscribed event listener should be performed using this query runner instance.\n */\n queryRunner: QueryRunner\n\n /**\n * EntityManager used in the event transaction.\n * All database operations in the subscribed event listener should be performed using this entity manager instance.\n */\n manager: EntityManager\n\n /**\n * Updating entity.\n *\n * Contains the same data that was passed to the updating method, be it the instance of an entity or the partial entity.\n */\n entity: ObjectLiteral | undefined\n\n /**\n * Metadata of the entity.\n */\n metadata: EntityMetadata\n\n /**\n * Updating entity in the database.\n *\n * Is set only when one of the following methods are used: .save(), .remove(), .softRemove(), and .recover()\n */\n databaseEntity: Entity\n\n /**\n * List of updated columns. In query builder has no affected\n */\n updatedColumns: ColumnMetadata[]\n\n /**\n * List of updated relations. In query builder has no affected\n */\n updatedRelations: RelationMetadata[]\n}\n"],"sourceRoot":"../.."}
@@ -9,6 +9,8 @@ export declare class MigrationCreateCommand implements yargs.CommandModule {
9
9
  path: string;
10
10
  } & {
11
11
  o: boolean;
12
+ } & {
13
+ esm: boolean;
12
14
  } & {
13
15
  t: number | boolean;
14
16
  }>;
@@ -22,5 +24,5 @@ export declare class MigrationCreateCommand implements yargs.CommandModule {
22
24
  /**
23
25
  * Gets contents of the migration file in Javascript.
24
26
  */
25
- protected static getJavascriptTemplate(name: string, timestamp: number): string;
27
+ protected static getJavascriptTemplate(name: string, timestamp: number, esm: boolean): string;
26
28
  }
@@ -27,6 +27,11 @@ class MigrationCreateCommand {
27
27
  type: "boolean",
28
28
  default: false,
29
29
  describe: "Generate a migration file on Javascript instead of Typescript",
30
+ })
31
+ .option("esm", {
32
+ type: "boolean",
33
+ default: false,
34
+ describe: "Generate a migration file on ESM instead of CommonJS",
30
35
  })
31
36
  .option("t", {
32
37
  alias: "timestamp",
@@ -44,7 +49,7 @@ class MigrationCreateCommand {
44
49
  const filename = path_1.default.basename(inputPath);
45
50
  const fullPath = path_1.default.dirname(inputPath) + "/" + timestamp + "-" + filename;
46
51
  const fileContent = args.outputJs
47
- ? MigrationCreateCommand.getJavascriptTemplate(filename, timestamp)
52
+ ? MigrationCreateCommand.getJavascriptTemplate(filename, timestamp, args.esm)
48
53
  : MigrationCreateCommand.getTemplate(filename, timestamp);
49
54
  await CommandUtils_1.CommandUtils.createFile(fullPath + (args.outputJs ? ".js" : ".ts"), fileContent);
50
55
  console.log(`Migration ${ansis_1.default.blue(fullPath + (args.outputJs ? ".js" : ".ts"))} has been generated successfully.`);
@@ -77,8 +82,17 @@ export class ${(0, StringUtils_1.camelCase)(name, true)}${timestamp} implements
77
82
  /**
78
83
  * Gets contents of the migration file in Javascript.
79
84
  */
80
- static getJavascriptTemplate(name, timestamp) {
81
- return `module.exports = class ${(0, StringUtils_1.camelCase)(name, true)}${timestamp} {
85
+ static getJavascriptTemplate(name, timestamp, esm) {
86
+ const exportMethod = esm ? "export" : "module.exports =";
87
+ return `/**
88
+ * @typedef {import('typeorm').MigrationInterface} MigrationInterface
89
+ */
90
+
91
+ /**
92
+ * @class
93
+ * @implements {MigrationInterface}
94
+ */
95
+ ${exportMethod} class ${(0, StringUtils_1.camelCase)(name, true)}${timestamp} {
82
96
 
83
97
  async up(queryRunner) {
84
98
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/MigrationCreateCommand.ts"],"names":[],"mappings":";;;;AAAA,0DAAwB;AACxB,wDAAuB;AAEvB,6DAAyD;AACzD,qDAA+C;AAC/C,iDAA6C;AAE7C;;GAEG;AACH,MAAa,sBAAsB;IAAnC;QACI,YAAO,GAAG,yBAAyB,CAAA;QACnC,aAAQ,GAAG,+BAA+B,CAAA;IAmG9C,CAAC;IAjGG,OAAO,CAAC,IAAgB;QACpB,OAAO,IAAI;aACN,UAAU,CAAC,MAAM,EAAE;YAChB,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,4BAA4B;YACtC,YAAY,EAAE,IAAI;SACrB,CAAC;aACD,MAAM,CAAC,GAAG,EAAE;YACT,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,KAAK;YACd,QAAQ,EACJ,+DAA+D;SACtE,CAAC;aACD,MAAM,CAAC,GAAG,EAAE;YACT,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,yCAAyC;SACtD,CAAC,CAAA;IACV,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAA6C;QACvD,IAAI,CAAC;YACD,MAAM,SAAS,GAAG,2BAAY,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBACvC,CAAC,CAAC,IAAI,CAAC,IAAI;gBACX,CAAC,CAAC,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;YAC5C,MAAM,QAAQ,GAAG,cAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;YACzC,MAAM,QAAQ,GACV,cAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,SAAS,GAAG,GAAG,GAAG,QAAQ,CAAA;YAE9D,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ;gBAC7B,CAAC,CAAC,sBAAsB,CAAC,qBAAqB,CACxC,QAAQ,EACR,SAAS,CACZ;gBACH,CAAC,CAAC,sBAAsB,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;YAE7D,MAAM,2BAAY,CAAC,UAAU,CACzB,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAC1C,WAAW,CACd,CAAA;YACD,OAAO,CAAC,GAAG,CACP,aAAa,eAAI,CAAC,IAAI,CAClB,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAC7C,mCAAmC,CACvC,CAAA;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,6BAAa,CAAC,SAAS,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAA;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACnB,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,2BAA2B;IAC3B,4EAA4E;IAE5E;;OAEG;IACO,MAAM,CAAC,WAAW,CAAC,IAAY,EAAE,SAAiB;QACxD,OAAO;;eAEA,IAAA,uBAAS,EACZ,IAAI,EACJ,IAAI,CACP,GAAG,SAAS;;;;;;;;;CASpB,CAAA;IACG,CAAC;IAED;;OAEG;IACO,MAAM,CAAC,qBAAqB,CAClC,IAAY,EACZ,SAAiB;QAEjB,OAAO,0BAA0B,IAAA,uBAAS,EAAC,IAAI,EAAE,IAAI,CAAC,GAAG,SAAS;;;;;;;;;CASzE,CAAA;IACG,CAAC;CACJ;AArGD,wDAqGC","file":"MigrationCreateCommand.js","sourcesContent":["import ansi from \"ansis\"\nimport path from \"path\"\nimport yargs from \"yargs\"\nimport { PlatformTools } from \"../platform/PlatformTools\"\nimport { camelCase } from \"../util/StringUtils\"\nimport { CommandUtils } from \"./CommandUtils\"\n\n/**\n * Creates a new migration file.\n */\nexport class MigrationCreateCommand implements yargs.CommandModule {\n command = \"migration:create <path>\"\n describe = \"Creates a new migration file.\"\n\n builder(args: yargs.Argv) {\n return args\n .positional(\"path\", {\n type: \"string\",\n describe: \"Path of the migration file\",\n demandOption: true,\n })\n .option(\"o\", {\n alias: \"outputJs\",\n type: \"boolean\",\n default: false,\n describe:\n \"Generate a migration file on Javascript instead of Typescript\",\n })\n .option(\"t\", {\n alias: \"timestamp\",\n type: \"number\",\n default: false,\n describe: \"Custom timestamp for the migration name\",\n })\n }\n\n async handler(args: yargs.Arguments<any & { path: string }>) {\n try {\n const timestamp = CommandUtils.getTimestamp(args.timestamp)\n const inputPath = args.path.startsWith(\"/\")\n ? args.path\n : path.resolve(process.cwd(), args.path)\n const filename = path.basename(inputPath)\n const fullPath =\n path.dirname(inputPath) + \"/\" + timestamp + \"-\" + filename\n\n const fileContent = args.outputJs\n ? MigrationCreateCommand.getJavascriptTemplate(\n filename,\n timestamp,\n )\n : MigrationCreateCommand.getTemplate(filename, timestamp)\n\n await CommandUtils.createFile(\n fullPath + (args.outputJs ? \".js\" : \".ts\"),\n fileContent,\n )\n console.log(\n `Migration ${ansi.blue(\n fullPath + (args.outputJs ? \".js\" : \".ts\"),\n )} has been generated successfully.`,\n )\n } catch (err) {\n PlatformTools.logCmdErr(\"Error during migration creation:\", err)\n process.exit(1)\n }\n }\n\n // -------------------------------------------------------------------------\n // Protected Static Methods\n // -------------------------------------------------------------------------\n\n /**\n * Gets contents of the migration file.\n */\n protected static getTemplate(name: string, timestamp: number): string {\n return `import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class ${camelCase(\n name,\n true,\n )}${timestamp} implements MigrationInterface {\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n }\n\n}\n`\n }\n\n /**\n * Gets contents of the migration file in Javascript.\n */\n protected static getJavascriptTemplate(\n name: string,\n timestamp: number,\n ): string {\n return `module.exports = class ${camelCase(name, true)}${timestamp} {\n\n async up(queryRunner) {\n }\n\n async down(queryRunner) {\n }\n\n}\n`\n }\n}\n"],"sourceRoot":".."}
1
+ {"version":3,"sources":["../../src/commands/MigrationCreateCommand.ts"],"names":[],"mappings":"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","file":"MigrationCreateCommand.js","sourcesContent":["import ansi from \"ansis\"\nimport path from \"path\"\nimport yargs from \"yargs\"\nimport { PlatformTools } from \"../platform/PlatformTools\"\nimport { camelCase } from \"../util/StringUtils\"\nimport { CommandUtils } from \"./CommandUtils\"\n\n/**\n * Creates a new migration file.\n */\nexport class MigrationCreateCommand implements yargs.CommandModule {\n command = \"migration:create <path>\"\n describe = \"Creates a new migration file.\"\n\n builder(args: yargs.Argv) {\n return args\n .positional(\"path\", {\n type: \"string\",\n describe: \"Path of the migration file\",\n demandOption: true,\n })\n .option(\"o\", {\n alias: \"outputJs\",\n type: \"boolean\",\n default: false,\n describe:\n \"Generate a migration file on Javascript instead of Typescript\",\n })\n .option(\"esm\", {\n type: \"boolean\",\n default: false,\n describe:\n \"Generate a migration file on ESM instead of CommonJS\",\n })\n .option(\"t\", {\n alias: \"timestamp\",\n type: \"number\",\n default: false,\n describe: \"Custom timestamp for the migration name\",\n })\n }\n\n async handler(args: yargs.Arguments<any & { path: string }>) {\n try {\n const timestamp = CommandUtils.getTimestamp(args.timestamp)\n const inputPath = args.path.startsWith(\"/\")\n ? args.path\n : path.resolve(process.cwd(), args.path)\n const filename = path.basename(inputPath)\n const fullPath =\n path.dirname(inputPath) + \"/\" + timestamp + \"-\" + filename\n\n const fileContent = args.outputJs\n ? MigrationCreateCommand.getJavascriptTemplate(\n filename,\n timestamp,\n args.esm,\n )\n : MigrationCreateCommand.getTemplate(filename, timestamp)\n\n await CommandUtils.createFile(\n fullPath + (args.outputJs ? \".js\" : \".ts\"),\n fileContent,\n )\n console.log(\n `Migration ${ansi.blue(\n fullPath + (args.outputJs ? \".js\" : \".ts\"),\n )} has been generated successfully.`,\n )\n } catch (err) {\n PlatformTools.logCmdErr(\"Error during migration creation:\", err)\n process.exit(1)\n }\n }\n\n // -------------------------------------------------------------------------\n // Protected Static Methods\n // -------------------------------------------------------------------------\n\n /**\n * Gets contents of the migration file.\n */\n protected static getTemplate(name: string, timestamp: number): string {\n return `import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class ${camelCase(\n name,\n true,\n )}${timestamp} implements MigrationInterface {\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n }\n\n}\n`\n }\n\n /**\n * Gets contents of the migration file in Javascript.\n */\n protected static getJavascriptTemplate(\n name: string,\n timestamp: number,\n esm: boolean,\n ): string {\n const exportMethod = esm ? \"export\" : \"module.exports =\"\n return `/**\n * @typedef {import('typeorm').MigrationInterface} MigrationInterface\n */\n\n/**\n * @class\n * @implements {MigrationInterface}\n */\n${exportMethod} class ${camelCase(name, true)}${timestamp} {\n\n async up(queryRunner) {\n }\n\n async down(queryRunner) {\n }\n\n}\n`\n }\n}\n"],"sourceRoot":".."}
@@ -13,6 +13,8 @@ export declare class MigrationGenerateCommand implements yargs.CommandModule {
13
13
  p: boolean;
14
14
  } & {
15
15
  o: boolean;
16
+ } & {
17
+ esm: boolean;
16
18
  } & {
17
19
  dr: boolean;
18
20
  } & {
@@ -34,7 +36,7 @@ export declare class MigrationGenerateCommand implements yargs.CommandModule {
34
36
  /**
35
37
  * Gets contents of the migration file in Javascript.
36
38
  */
37
- protected static getJavascriptTemplate(name: string, timestamp: number, upSqls: string[], downSqls: string[]): string;
39
+ protected static getJavascriptTemplate(name: string, timestamp: number, upSqls: string[], downSqls: string[], esm: boolean): string;
38
40
  /**
39
41
  *
40
42
  */
@@ -41,6 +41,11 @@ class MigrationGenerateCommand {
41
41
  type: "boolean",
42
42
  default: false,
43
43
  describe: "Generate a migration file on Javascript instead of Typescript",
44
+ })
45
+ .option("esm", {
46
+ type: "boolean",
47
+ default: false,
48
+ describe: "Generate a migration file on ESM instead of CommonJS",
44
49
  })
45
50
  .option("dr", {
46
51
  alias: "dryrun",
@@ -125,7 +130,7 @@ class MigrationGenerateCommand {
125
130
  process_1.default.exit(1);
126
131
  }
127
132
  const fileContent = args.outputJs
128
- ? MigrationGenerateCommand.getJavascriptTemplate(path_1.default.basename(fullPath), timestamp, upSqls, downSqls.reverse())
133
+ ? MigrationGenerateCommand.getJavascriptTemplate(path_1.default.basename(fullPath), timestamp, upSqls, downSqls.reverse(), args.esm)
129
134
  : MigrationGenerateCommand.getTemplate(path_1.default.basename(fullPath), timestamp, upSqls, downSqls.reverse());
130
135
  if (args.check) {
131
136
  console.log(ansis_1.default.yellow `Unexpected changes in database schema were found in check mode:\n\n${ansis_1.default.white(fileContent)}`);
@@ -186,9 +191,18 @@ ${downSqls.join(`
186
191
  /**
187
192
  * Gets contents of the migration file in Javascript.
188
193
  */
189
- static getJavascriptTemplate(name, timestamp, upSqls, downSqls) {
194
+ static getJavascriptTemplate(name, timestamp, upSqls, downSqls, esm) {
190
195
  const migrationName = `${(0, StringUtils_1.camelCase)(name, true)}${timestamp}`;
191
- return `module.exports = class ${migrationName} {
196
+ const exportMethod = esm ? "export" : "module.exports =";
197
+ return `/**
198
+ * @typedef {import('typeorm').MigrationInterface} MigrationInterface
199
+ */
200
+
201
+ /**
202
+ * @class
203
+ * @implements {MigrationInterface}
204
+ */
205
+ ${exportMethod} class ${migrationName} {
192
206
  name = '${migrationName}'
193
207
 
194
208
  async up(queryRunner) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/MigrationGenerateCommand.ts"],"names":[],"mappings":"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","file":"MigrationGenerateCommand.js","sourcesContent":["import { format } from \"@sqltools/formatter/lib/sqlFormatter\"\nimport ansi from \"ansis\"\nimport path from \"path\"\nimport process from \"process\"\nimport yargs from \"yargs\"\nimport { DataSource } from \"../data-source\"\nimport { PlatformTools } from \"../platform/PlatformTools\"\nimport { camelCase } from \"../util/StringUtils\"\nimport { CommandUtils } from \"./CommandUtils\"\n\n/**\n * Generates a new migration file with sql needs to be executed to update schema.\n */\nexport class MigrationGenerateCommand implements yargs.CommandModule {\n command = \"migration:generate <path>\"\n describe =\n \"Generates a new migration file with sql needs to be executed to update schema.\"\n\n builder(args: yargs.Argv) {\n return args\n .positional(\"path\", {\n type: \"string\",\n describe: \"Path of the migration file\",\n demandOption: true,\n })\n .option(\"dataSource\", {\n alias: \"d\",\n type: \"string\",\n describe:\n \"Path to the file where your DataSource instance is defined.\",\n demandOption: true,\n })\n .option(\"p\", {\n alias: \"pretty\",\n type: \"boolean\",\n default: false,\n describe: \"Pretty-print generated SQL\",\n })\n .option(\"o\", {\n alias: \"outputJs\",\n type: \"boolean\",\n default: false,\n describe:\n \"Generate a migration file on Javascript instead of Typescript\",\n })\n .option(\"dr\", {\n alias: \"dryrun\",\n type: \"boolean\",\n default: false,\n describe:\n \"Prints out the contents of the migration instead of writing it to a file\",\n })\n .option(\"ch\", {\n alias: \"check\",\n type: \"boolean\",\n default: false,\n describe:\n \"Verifies that the current database is up to date and that no migrations are needed. Otherwise exits with code 1.\",\n })\n .option(\"t\", {\n alias: \"timestamp\",\n type: \"number\",\n default: false,\n describe: \"Custom timestamp for the migration name\",\n })\n }\n\n async handler(args: yargs.Arguments<any & { path: string }>) {\n const timestamp = CommandUtils.getTimestamp(args.timestamp)\n const extension = args.outputJs ? \".js\" : \".ts\"\n const fullPath = args.path.startsWith(\"/\")\n ? args.path\n : path.resolve(process.cwd(), args.path)\n const filename = timestamp + \"-\" + path.basename(fullPath) + extension\n\n let dataSource: DataSource | undefined = undefined\n try {\n dataSource = await CommandUtils.loadDataSource(\n path.resolve(process.cwd(), args.dataSource as string),\n )\n dataSource.setOptions({\n synchronize: false,\n migrationsRun: false,\n dropSchema: false,\n logging: false,\n })\n await dataSource.initialize()\n\n const upSqls: string[] = [],\n downSqls: string[] = []\n\n try {\n const sqlInMemory = await dataSource.driver\n .createSchemaBuilder()\n .log()\n\n if (args.pretty) {\n sqlInMemory.upQueries.forEach((upQuery) => {\n upQuery.query = MigrationGenerateCommand.prettifyQuery(\n upQuery.query,\n )\n })\n sqlInMemory.downQueries.forEach((downQuery) => {\n downQuery.query =\n MigrationGenerateCommand.prettifyQuery(\n downQuery.query,\n )\n })\n }\n\n sqlInMemory.upQueries.forEach((upQuery) => {\n upSqls.push(\n \" await queryRunner.query(`\" +\n upQuery.query.replaceAll(\"`\", \"\\\\`\") +\n \"`\" +\n MigrationGenerateCommand.queryParams(\n upQuery.parameters,\n ) +\n \");\",\n )\n })\n sqlInMemory.downQueries.forEach((downQuery) => {\n downSqls.push(\n \" await queryRunner.query(`\" +\n downQuery.query.replaceAll(\"`\", \"\\\\`\") +\n \"`\" +\n MigrationGenerateCommand.queryParams(\n downQuery.parameters,\n ) +\n \");\",\n )\n })\n } finally {\n await dataSource.destroy()\n }\n\n if (!upSqls.length) {\n if (args.check) {\n console.log(\n ansi.green`No changes in database schema were found`,\n )\n process.exit(0)\n } else {\n console.log(\n ansi.yellow`No changes in database schema were found - cannot generate a migration. To create a new empty migration use \"typeorm migration:create\" command`,\n )\n process.exit(1)\n }\n } else if (!args.path) {\n console.log(ansi.yellow`Please specify a migration path`)\n process.exit(1)\n }\n\n const fileContent = args.outputJs\n ? MigrationGenerateCommand.getJavascriptTemplate(\n path.basename(fullPath),\n timestamp,\n upSqls,\n downSqls.reverse(),\n )\n : MigrationGenerateCommand.getTemplate(\n path.basename(fullPath),\n timestamp,\n upSqls,\n downSqls.reverse(),\n )\n\n if (args.check) {\n console.log(\n ansi.yellow`Unexpected changes in database schema were found in check mode:\\n\\n${ansi.white(\n fileContent,\n )}`,\n )\n process.exit(1)\n }\n\n if (args.dryrun) {\n console.log(\n ansi.green(\n `Migration ${ansi.blue(\n fullPath + extension,\n )} has content:\\n\\n${ansi.white(fileContent)}`,\n ),\n )\n } else {\n const migrationFileName =\n path.dirname(fullPath) + \"/\" + filename\n await CommandUtils.createFile(migrationFileName, fileContent)\n\n console.log(\n ansi.green`Migration ${ansi.blue(\n migrationFileName,\n )} has been generated successfully.`,\n )\n if (args.exitProcess !== false) {\n process.exit(0)\n }\n }\n } catch (err) {\n PlatformTools.logCmdErr(\"Error during migration generation:\", err)\n process.exit(1)\n }\n }\n\n // -------------------------------------------------------------------------\n // Protected Static Methods\n // -------------------------------------------------------------------------\n\n /**\n * Formats query parameters for migration queries if parameters actually exist\n */\n protected static queryParams(parameters: any[] | undefined): string {\n if (!parameters || !parameters.length) {\n return \"\"\n }\n\n return `, ${JSON.stringify(parameters)}`\n }\n\n /**\n * Gets contents of the migration file.\n */\n protected static getTemplate(\n name: string,\n timestamp: number,\n upSqls: string[],\n downSqls: string[],\n ): string {\n const migrationName = `${camelCase(name, true)}${timestamp}`\n\n return `import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class ${migrationName} implements MigrationInterface {\n name = '${migrationName}'\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n${upSqls.join(`\n`)}\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n${downSqls.join(`\n`)}\n }\n\n}\n`\n }\n\n /**\n * Gets contents of the migration file in Javascript.\n */\n protected static getJavascriptTemplate(\n name: string,\n timestamp: number,\n upSqls: string[],\n downSqls: string[],\n ): string {\n const migrationName = `${camelCase(name, true)}${timestamp}`\n\n return `module.exports = class ${migrationName} {\n name = '${migrationName}'\n\n async up(queryRunner) {\n${upSqls.join(`\n`)}\n }\n\n async down(queryRunner) {\n${downSqls.join(`\n`)}\n }\n}\n`\n }\n\n /**\n *\n */\n protected static prettifyQuery(query: string) {\n const formattedQuery = format(query, { indent: \" \" })\n return (\n \"\\n\" + formattedQuery.replace(/^/gm, \" \") + \"\\n \"\n )\n }\n}\n"],"sourceRoot":".."}
1
+ {"version":3,"sources":["../../src/commands/MigrationGenerateCommand.ts"],"names":[],"mappings":"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","file":"MigrationGenerateCommand.js","sourcesContent":["import { format } from \"@sqltools/formatter/lib/sqlFormatter\"\nimport ansi from \"ansis\"\nimport path from \"path\"\nimport process from \"process\"\nimport yargs from \"yargs\"\nimport { DataSource } from \"../data-source\"\nimport { PlatformTools } from \"../platform/PlatformTools\"\nimport { camelCase } from \"../util/StringUtils\"\nimport { CommandUtils } from \"./CommandUtils\"\n\n/**\n * Generates a new migration file with sql needs to be executed to update schema.\n */\nexport class MigrationGenerateCommand implements yargs.CommandModule {\n command = \"migration:generate <path>\"\n describe =\n \"Generates a new migration file with sql needs to be executed to update schema.\"\n\n builder(args: yargs.Argv) {\n return args\n .positional(\"path\", {\n type: \"string\",\n describe: \"Path of the migration file\",\n demandOption: true,\n })\n .option(\"dataSource\", {\n alias: \"d\",\n type: \"string\",\n describe:\n \"Path to the file where your DataSource instance is defined.\",\n demandOption: true,\n })\n .option(\"p\", {\n alias: \"pretty\",\n type: \"boolean\",\n default: false,\n describe: \"Pretty-print generated SQL\",\n })\n .option(\"o\", {\n alias: \"outputJs\",\n type: \"boolean\",\n default: false,\n describe:\n \"Generate a migration file on Javascript instead of Typescript\",\n })\n .option(\"esm\", {\n type: \"boolean\",\n default: false,\n describe:\n \"Generate a migration file on ESM instead of CommonJS\",\n })\n .option(\"dr\", {\n alias: \"dryrun\",\n type: \"boolean\",\n default: false,\n describe:\n \"Prints out the contents of the migration instead of writing it to a file\",\n })\n .option(\"ch\", {\n alias: \"check\",\n type: \"boolean\",\n default: false,\n describe:\n \"Verifies that the current database is up to date and that no migrations are needed. Otherwise exits with code 1.\",\n })\n .option(\"t\", {\n alias: \"timestamp\",\n type: \"number\",\n default: false,\n describe: \"Custom timestamp for the migration name\",\n })\n }\n\n async handler(args: yargs.Arguments<any & { path: string }>) {\n const timestamp = CommandUtils.getTimestamp(args.timestamp)\n const extension = args.outputJs ? \".js\" : \".ts\"\n const fullPath = args.path.startsWith(\"/\")\n ? args.path\n : path.resolve(process.cwd(), args.path)\n const filename = timestamp + \"-\" + path.basename(fullPath) + extension\n\n let dataSource: DataSource | undefined = undefined\n try {\n dataSource = await CommandUtils.loadDataSource(\n path.resolve(process.cwd(), args.dataSource as string),\n )\n dataSource.setOptions({\n synchronize: false,\n migrationsRun: false,\n dropSchema: false,\n logging: false,\n })\n await dataSource.initialize()\n\n const upSqls: string[] = [],\n downSqls: string[] = []\n\n try {\n const sqlInMemory = await dataSource.driver\n .createSchemaBuilder()\n .log()\n\n if (args.pretty) {\n sqlInMemory.upQueries.forEach((upQuery) => {\n upQuery.query = MigrationGenerateCommand.prettifyQuery(\n upQuery.query,\n )\n })\n sqlInMemory.downQueries.forEach((downQuery) => {\n downQuery.query =\n MigrationGenerateCommand.prettifyQuery(\n downQuery.query,\n )\n })\n }\n\n sqlInMemory.upQueries.forEach((upQuery) => {\n upSqls.push(\n \" await queryRunner.query(`\" +\n upQuery.query.replaceAll(\"`\", \"\\\\`\") +\n \"`\" +\n MigrationGenerateCommand.queryParams(\n upQuery.parameters,\n ) +\n \");\",\n )\n })\n sqlInMemory.downQueries.forEach((downQuery) => {\n downSqls.push(\n \" await queryRunner.query(`\" +\n downQuery.query.replaceAll(\"`\", \"\\\\`\") +\n \"`\" +\n MigrationGenerateCommand.queryParams(\n downQuery.parameters,\n ) +\n \");\",\n )\n })\n } finally {\n await dataSource.destroy()\n }\n\n if (!upSqls.length) {\n if (args.check) {\n console.log(\n ansi.green`No changes in database schema were found`,\n )\n process.exit(0)\n } else {\n console.log(\n ansi.yellow`No changes in database schema were found - cannot generate a migration. To create a new empty migration use \"typeorm migration:create\" command`,\n )\n process.exit(1)\n }\n } else if (!args.path) {\n console.log(ansi.yellow`Please specify a migration path`)\n process.exit(1)\n }\n\n const fileContent = args.outputJs\n ? MigrationGenerateCommand.getJavascriptTemplate(\n path.basename(fullPath),\n timestamp,\n upSqls,\n downSqls.reverse(),\n args.esm,\n )\n : MigrationGenerateCommand.getTemplate(\n path.basename(fullPath),\n timestamp,\n upSqls,\n downSqls.reverse(),\n )\n\n if (args.check) {\n console.log(\n ansi.yellow`Unexpected changes in database schema were found in check mode:\\n\\n${ansi.white(\n fileContent,\n )}`,\n )\n process.exit(1)\n }\n\n if (args.dryrun) {\n console.log(\n ansi.green(\n `Migration ${ansi.blue(\n fullPath + extension,\n )} has content:\\n\\n${ansi.white(fileContent)}`,\n ),\n )\n } else {\n const migrationFileName =\n path.dirname(fullPath) + \"/\" + filename\n await CommandUtils.createFile(migrationFileName, fileContent)\n\n console.log(\n ansi.green`Migration ${ansi.blue(\n migrationFileName,\n )} has been generated successfully.`,\n )\n if (args.exitProcess !== false) {\n process.exit(0)\n }\n }\n } catch (err) {\n PlatformTools.logCmdErr(\"Error during migration generation:\", err)\n process.exit(1)\n }\n }\n\n // -------------------------------------------------------------------------\n // Protected Static Methods\n // -------------------------------------------------------------------------\n\n /**\n * Formats query parameters for migration queries if parameters actually exist\n */\n protected static queryParams(parameters: any[] | undefined): string {\n if (!parameters || !parameters.length) {\n return \"\"\n }\n\n return `, ${JSON.stringify(parameters)}`\n }\n\n /**\n * Gets contents of the migration file.\n */\n protected static getTemplate(\n name: string,\n timestamp: number,\n upSqls: string[],\n downSqls: string[],\n ): string {\n const migrationName = `${camelCase(name, true)}${timestamp}`\n\n return `import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class ${migrationName} implements MigrationInterface {\n name = '${migrationName}'\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n${upSqls.join(`\n`)}\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n${downSqls.join(`\n`)}\n }\n\n}\n`\n }\n\n /**\n * Gets contents of the migration file in Javascript.\n */\n protected static getJavascriptTemplate(\n name: string,\n timestamp: number,\n upSqls: string[],\n downSqls: string[],\n esm: boolean,\n ): string {\n const migrationName = `${camelCase(name, true)}${timestamp}`\n\n const exportMethod = esm ? \"export\" : \"module.exports =\"\n\n return `/**\n * @typedef {import('typeorm').MigrationInterface} MigrationInterface\n */\n\n/**\n * @class\n * @implements {MigrationInterface}\n */\n${exportMethod} class ${migrationName} {\n name = '${migrationName}'\n\n async up(queryRunner) {\n${upSqls.join(`\n`)}\n }\n\n async down(queryRunner) {\n${downSqls.join(`\n`)}\n }\n}\n`\n }\n\n /**\n *\n */\n protected static prettifyQuery(query: string) {\n const formattedQuery = format(query, { indent: \" \" })\n return (\n \"\\n\" + formattedQuery.replace(/^/gm, \" \") + \"\\n \"\n )\n }\n}\n"],"sourceRoot":".."}
@@ -90,6 +90,12 @@ export interface MysqlConnectionOptions extends BaseDataSourceOptions, MysqlConn
90
90
  * but you can specify it manually
91
91
  */
92
92
  readonly connectorPackage?: "mysql" | "mysql2";
93
+ /**
94
+ * If a value is specified for maxQueryExecutionTime, in addition to generating a warning log when a query exceeds this time limit,
95
+ * the specified maxQueryExecutionTime value is also used as the timeout for the query.
96
+ * For more information, check https://github.com/mysqljs/mysql?tab=readme-ov-file#timeouts
97
+ */
98
+ readonly enableQueryTimeout?: boolean;
93
99
  /**
94
100
  * Replication setup.
95
101
  */
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/driver/mysql/MysqlConnectionOptions.ts"],"names":[],"mappings":"","file":"MysqlConnectionOptions.js","sourcesContent":["import { BaseDataSourceOptions } from \"../../data-source/BaseDataSourceOptions\"\nimport { ReplicationMode } from \"../types/ReplicationMode\"\nimport { MysqlConnectionCredentialsOptions } from \"./MysqlConnectionCredentialsOptions\"\n\n/**\n * MySQL specific connection options.\n *\n * @see https://github.com/mysqljs/mysql#connection-options\n */\nexport interface MysqlConnectionOptions\n extends BaseDataSourceOptions,\n MysqlConnectionCredentialsOptions {\n /**\n * Database type.\n */\n readonly type: \"mysql\" | \"mariadb\"\n\n /**\n * The driver object\n * This defaults to require(\"mysql\").\n * Falls back to require(\"mysql2\")\n */\n readonly driver?: any\n\n /**\n * The charset for the connection. This is called \"collation\" in the SQL-level of MySQL (like utf8_general_ci).\n * If a SQL-level charset is specified (like utf8mb4) then the default collation for that charset is used.\n * Default: 'UTF8_GENERAL_CI'\n */\n readonly charset?: string\n\n /**\n * The timezone configured on the MySQL server.\n * This is used to type cast server date/time values to JavaScript Date object and vice versa.\n * This can be 'local', 'Z', or an offset in the form +HH:MM or -HH:MM. (Default: 'local')\n */\n readonly timezone?: string\n\n /**\n * The milliseconds before a timeout occurs during the initial connection to the MySQL server. (Default: 10000)\n */\n readonly connectTimeout?: number\n\n /**\n * The milliseconds before a timeout occurs during the initial connection to the MySQL server. (Default: 10000)\n * This difference between connectTimeout and acquireTimeout is subtle and is described in the mysqljs/mysql docs\n * https://github.com/mysqljs/mysql/tree/master#pool-options\n */\n readonly acquireTimeout?: number\n\n /**\n * Allow connecting to MySQL instances that ask for the old (insecure) authentication method. (Default: false)\n */\n readonly insecureAuth?: boolean\n\n /**\n * When dealing with big numbers (BIGINT and DECIMAL columns) in the database, you should enable this option (Default: false)\n */\n readonly supportBigNumbers?: boolean\n\n /**\n * Enabling both supportBigNumbers and bigNumberStrings forces big numbers (BIGINT and DECIMAL columns) to be always\n * returned as JavaScript String objects (Default: false). Enabling supportBigNumbers but leaving bigNumberStrings\n * disabled will return big numbers as String objects only when they cannot be accurately represented with\n * [JavaScript Number objects](http://ecma262-5.com/ELS5_HTML.htm#Section_8.5) (which happens when they exceed the [-2^53, +2^53] range),\n * otherwise they will be returned as Number objects. This option is ignored if supportBigNumbers is disabled.\n */\n readonly bigNumberStrings?: boolean\n\n /**\n * Force date types (TIMESTAMP, DATETIME, DATE) to be returned as strings rather then inflated into JavaScript Date objects.\n * Can be true/false or an array of type names to keep as strings.\n */\n readonly dateStrings?: boolean | string[]\n\n /**\n * Prints protocol details to stdout. Can be true/false or an array of packet type names that should be printed.\n * (Default: false)\n */\n readonly debug?: boolean | string[]\n\n /**\n * Generates stack traces on Error to include call site of library entrance (\"long stack traces\").\n * Slight performance penalty for most calls. (Default: true)\n */\n readonly trace?: boolean\n\n /**\n * Allow multiple mysql statements per query. Be careful with this, it could increase the scope of SQL injection attacks.\n * (Default: false)\n */\n readonly multipleStatements?: boolean\n\n /**\n * Use spatial functions like GeomFromText and AsText which are removed in MySQL 8.\n * (Default: true)\n */\n readonly legacySpatialSupport?: boolean\n\n /**\n * List of connection flags to use other than the default ones. It is also possible to blacklist default ones.\n * For more information, check https://github.com/mysqljs/mysql#connection-flags.\n */\n readonly flags?: string[]\n\n /**\n * TypeORM will automatically use package found in your node_modules, prioritizing mysql over mysql2,\n * but you can specify it manually\n */\n readonly connectorPackage?: \"mysql\" | \"mysql2\"\n\n /**\n * Replication setup.\n */\n readonly replication?: {\n /**\n * Master server used by orm to perform writes.\n */\n readonly master: MysqlConnectionCredentialsOptions\n\n /**\n * List of read-from servers (slaves).\n */\n readonly slaves: MysqlConnectionCredentialsOptions[]\n\n /**\n * If true, PoolCluster will attempt to reconnect when connection fails. (Default: true)\n */\n readonly canRetry?: boolean\n\n /**\n * If connection fails, node's errorCount increases.\n * When errorCount is greater than removeNodeErrorCount, remove a node in the PoolCluster. (Default: 5)\n */\n readonly removeNodeErrorCount?: number\n\n /**\n * If connection fails, specifies the number of milliseconds before another connection attempt will be made.\n * If set to 0, then node will be removed instead and never re-used. (Default: 0)\n */\n readonly restoreNodeTimeout?: number\n\n /**\n * Determines how slaves are selected:\n * RR: Select one alternately (Round-Robin).\n * RANDOM: Select the node by random function.\n * ORDER: Select the first node available unconditionally.\n */\n readonly selector?: \"RR\" | \"RANDOM\" | \"ORDER\"\n\n /**\n * Default connection pool to use for SELECT queries\n * @default \"slave\"\n */\n readonly defaultMode?: ReplicationMode\n }\n}\n"],"sourceRoot":"../.."}
1
+ {"version":3,"sources":["../../src/driver/mysql/MysqlConnectionOptions.ts"],"names":[],"mappings":"","file":"MysqlConnectionOptions.js","sourcesContent":["import { BaseDataSourceOptions } from \"../../data-source/BaseDataSourceOptions\"\nimport { ReplicationMode } from \"../types/ReplicationMode\"\nimport { MysqlConnectionCredentialsOptions } from \"./MysqlConnectionCredentialsOptions\"\n\n/**\n * MySQL specific connection options.\n *\n * @see https://github.com/mysqljs/mysql#connection-options\n */\nexport interface MysqlConnectionOptions\n extends BaseDataSourceOptions,\n MysqlConnectionCredentialsOptions {\n /**\n * Database type.\n */\n readonly type: \"mysql\" | \"mariadb\"\n\n /**\n * The driver object\n * This defaults to require(\"mysql\").\n * Falls back to require(\"mysql2\")\n */\n readonly driver?: any\n\n /**\n * The charset for the connection. This is called \"collation\" in the SQL-level of MySQL (like utf8_general_ci).\n * If a SQL-level charset is specified (like utf8mb4) then the default collation for that charset is used.\n * Default: 'UTF8_GENERAL_CI'\n */\n readonly charset?: string\n\n /**\n * The timezone configured on the MySQL server.\n * This is used to type cast server date/time values to JavaScript Date object and vice versa.\n * This can be 'local', 'Z', or an offset in the form +HH:MM or -HH:MM. (Default: 'local')\n */\n readonly timezone?: string\n\n /**\n * The milliseconds before a timeout occurs during the initial connection to the MySQL server. (Default: 10000)\n */\n readonly connectTimeout?: number\n\n /**\n * The milliseconds before a timeout occurs during the initial connection to the MySQL server. (Default: 10000)\n * This difference between connectTimeout and acquireTimeout is subtle and is described in the mysqljs/mysql docs\n * https://github.com/mysqljs/mysql/tree/master#pool-options\n */\n readonly acquireTimeout?: number\n\n /**\n * Allow connecting to MySQL instances that ask for the old (insecure) authentication method. (Default: false)\n */\n readonly insecureAuth?: boolean\n\n /**\n * When dealing with big numbers (BIGINT and DECIMAL columns) in the database, you should enable this option (Default: false)\n */\n readonly supportBigNumbers?: boolean\n\n /**\n * Enabling both supportBigNumbers and bigNumberStrings forces big numbers (BIGINT and DECIMAL columns) to be always\n * returned as JavaScript String objects (Default: false). Enabling supportBigNumbers but leaving bigNumberStrings\n * disabled will return big numbers as String objects only when they cannot be accurately represented with\n * [JavaScript Number objects](http://ecma262-5.com/ELS5_HTML.htm#Section_8.5) (which happens when they exceed the [-2^53, +2^53] range),\n * otherwise they will be returned as Number objects. This option is ignored if supportBigNumbers is disabled.\n */\n readonly bigNumberStrings?: boolean\n\n /**\n * Force date types (TIMESTAMP, DATETIME, DATE) to be returned as strings rather then inflated into JavaScript Date objects.\n * Can be true/false or an array of type names to keep as strings.\n */\n readonly dateStrings?: boolean | string[]\n\n /**\n * Prints protocol details to stdout. Can be true/false or an array of packet type names that should be printed.\n * (Default: false)\n */\n readonly debug?: boolean | string[]\n\n /**\n * Generates stack traces on Error to include call site of library entrance (\"long stack traces\").\n * Slight performance penalty for most calls. (Default: true)\n */\n readonly trace?: boolean\n\n /**\n * Allow multiple mysql statements per query. Be careful with this, it could increase the scope of SQL injection attacks.\n * (Default: false)\n */\n readonly multipleStatements?: boolean\n\n /**\n * Use spatial functions like GeomFromText and AsText which are removed in MySQL 8.\n * (Default: true)\n */\n readonly legacySpatialSupport?: boolean\n\n /**\n * List of connection flags to use other than the default ones. It is also possible to blacklist default ones.\n * For more information, check https://github.com/mysqljs/mysql#connection-flags.\n */\n readonly flags?: string[]\n\n /**\n * TypeORM will automatically use package found in your node_modules, prioritizing mysql over mysql2,\n * but you can specify it manually\n */\n readonly connectorPackage?: \"mysql\" | \"mysql2\"\n\n /**\n * If a value is specified for maxQueryExecutionTime, in addition to generating a warning log when a query exceeds this time limit,\n * the specified maxQueryExecutionTime value is also used as the timeout for the query.\n * For more information, check https://github.com/mysqljs/mysql?tab=readme-ov-file#timeouts\n */\n readonly enableQueryTimeout?: boolean\n\n /**\n * Replication setup.\n */\n readonly replication?: {\n /**\n * Master server used by orm to perform writes.\n */\n readonly master: MysqlConnectionCredentialsOptions\n\n /**\n * List of read-from servers (slaves).\n */\n readonly slaves: MysqlConnectionCredentialsOptions[]\n\n /**\n * If true, PoolCluster will attempt to reconnect when connection fails. (Default: true)\n */\n readonly canRetry?: boolean\n\n /**\n * If connection fails, node's errorCount increases.\n * When errorCount is greater than removeNodeErrorCount, remove a node in the PoolCluster. (Default: 5)\n */\n readonly removeNodeErrorCount?: number\n\n /**\n * If connection fails, specifies the number of milliseconds before another connection attempt will be made.\n * If set to 0, then node will be removed instead and never re-used. (Default: 0)\n */\n readonly restoreNodeTimeout?: number\n\n /**\n * Determines how slaves are selected:\n * RR: Select one alternately (Round-Robin).\n * RANDOM: Select the node by random function.\n * ORDER: Select the first node available unconditionally.\n */\n readonly selector?: \"RR\" | \"RANDOM\" | \"ORDER\"\n\n /**\n * Default connection pool to use for SELECT queries\n * @default \"slave\"\n */\n readonly defaultMode?: ReplicationMode\n }\n}\n"],"sourceRoot":"../.."}
@@ -147,8 +147,13 @@ class MysqlQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
147
147
  const databaseConnection = await this.connect();
148
148
  this.driver.connection.logger.logQuery(query, parameters, this);
149
149
  this.broadcaster.broadcastBeforeQueryEvent(broadcasterResult, query, parameters);
150
+ const enableQueryTimeout = this.driver.options.enableQueryTimeout;
151
+ const maxQueryExecutionTime = this.driver.options.maxQueryExecutionTime;
152
+ const queryPayload = enableQueryTimeout && maxQueryExecutionTime
153
+ ? { sql: query, timeout: maxQueryExecutionTime }
154
+ : query;
150
155
  const queryStartTime = +new Date();
151
- databaseConnection.query(query, parameters, async (err, raw) => {
156
+ databaseConnection.query(queryPayload, parameters, async (err, raw) => {
152
157
  // log slow queries if maxQueryExecution time is set
153
158
  const maxQueryExecutionTime = this.driver.options.maxQueryExecutionTime;
154
159
  const queryEndTime = +new Date();