@exogee/graphweaver-mikroorm 0.2.24 → 1.0.0-beta.2

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.
Files changed (80) hide show
  1. package/lib/config.js.map +1 -1
  2. package/lib/database.d.ts +3 -3
  3. package/lib/database.js +7 -11
  4. package/lib/database.js.map +2 -2
  5. package/lib/decorators/external-id-field.js.map +2 -2
  6. package/lib/decorators/index.js +4 -0
  7. package/lib/entities/audit-change.d.ts +1 -2
  8. package/lib/entities/audit-change.js +3 -6
  9. package/lib/entities/audit-change.js.map +2 -2
  10. package/lib/entities/audit-related-entity-change.d.ts +1 -2
  11. package/lib/entities/audit-related-entity-change.js +2 -4
  12. package/lib/entities/audit-related-entity-change.js.map +2 -2
  13. package/lib/entities/index.d.ts +0 -1
  14. package/lib/entities/index.js +5 -1
  15. package/lib/entities/index.js.map +2 -2
  16. package/lib/index.d.ts +1 -1
  17. package/lib/index.js +14 -2
  18. package/lib/index.js.map +2 -2
  19. package/lib/introspection/files/base-file.js.map +1 -1
  20. package/lib/introspection/files/data-entity-file.js +10 -12
  21. package/lib/introspection/files/data-entity-file.js.map +2 -2
  22. package/lib/introspection/files/data-entity-index-file.js +3 -3
  23. package/lib/introspection/files/data-entity-index-file.js.map +2 -2
  24. package/lib/introspection/files/data-source-index-file.js.map +1 -1
  25. package/lib/introspection/files/database-file.js +2 -2
  26. package/lib/introspection/files/database-file.js.map +2 -2
  27. package/lib/introspection/files/index.d.ts +0 -2
  28. package/lib/introspection/files/index.js +9 -2
  29. package/lib/introspection/files/index.js.map +2 -2
  30. package/lib/introspection/files/schema-entity-file.d.ts +2 -1
  31. package/lib/introspection/files/schema-entity-file.js +41 -25
  32. package/lib/introspection/files/schema-entity-file.js.map +3 -3
  33. package/lib/introspection/files/schema-index-file.js +3 -19
  34. package/lib/introspection/files/schema-index-file.js.map +2 -2
  35. package/lib/introspection/generate.js +22 -20
  36. package/lib/introspection/generate.js.map +2 -2
  37. package/lib/plugins/clear-database-context.js +1 -0
  38. package/lib/plugins/clear-database-context.js.map +1 -1
  39. package/lib/{base-resolver → provider}/assign.d.ts +1 -1
  40. package/lib/{base-resolver → provider}/assign.js +41 -13
  41. package/lib/provider/assign.js.map +7 -0
  42. package/lib/{base-resolver → provider}/index.js +7 -3
  43. package/lib/provider/index.js.map +7 -0
  44. package/lib/{base-resolver → provider}/provider.d.ts +13 -15
  45. package/lib/{base-resolver → provider}/provider.js +45 -43
  46. package/lib/provider/provider.js.map +7 -0
  47. package/lib/types/date-type.d.ts +5 -5
  48. package/lib/types/date-type.js +8 -11
  49. package/lib/types/date-type.js.map +2 -2
  50. package/lib/types/decimal-type.d.ts +5 -5
  51. package/lib/types/decimal-type.js +12 -20
  52. package/lib/types/decimal-type.js.map +2 -2
  53. package/lib/types/index.js +5 -0
  54. package/lib/types/time-type.d.ts +5 -5
  55. package/lib/types/time-type.js +12 -20
  56. package/lib/types/time-type.js.map +2 -2
  57. package/lib/utils/authentication-context.js.map +1 -1
  58. package/lib/utils/change-tracker.js +10 -9
  59. package/lib/utils/change-tracker.js.map +2 -2
  60. package/lib/utils/index.js +7 -0
  61. package/lib/utils/tracked-entity.d.ts +1 -2
  62. package/lib/utils/tracked-entity.js +2 -4
  63. package/lib/utils/tracked-entity.js.map +2 -2
  64. package/lib/utils/untracked-property.d.ts +0 -1
  65. package/lib/utils/untracked-property.js +0 -1
  66. package/lib/utils/untracked-property.js.map +2 -2
  67. package/package.json +20 -20
  68. package/lib/base-resolver/assign.js.map +0 -7
  69. package/lib/base-resolver/index.js.map +0 -7
  70. package/lib/base-resolver/provider.js.map +0 -7
  71. package/lib/entities/base-entity.d.ts +0 -5
  72. package/lib/entities/base-entity.js +0 -37
  73. package/lib/entities/base-entity.js.map +0 -7
  74. package/lib/introspection/files/schema-entity-index-file.d.ts +0 -6
  75. package/lib/introspection/files/schema-entity-index-file.js +0 -44
  76. package/lib/introspection/files/schema-entity-index-file.js.map +0 -7
  77. package/lib/introspection/files/schema-resolver-file.d.ts +0 -6
  78. package/lib/introspection/files/schema-resolver-file.js +0 -62
  79. package/lib/introspection/files/schema-resolver-file.js.map +0 -7
  80. /package/lib/{base-resolver → provider}/index.d.ts +0 -0
@@ -42,7 +42,7 @@ class DatabaseFile {
42
42
  ...isSQLite ? [`import { SqliteDriver } from 'mikro-orm-sqlite-wasm';`] : [],
43
43
  `import { entities } from './entities';`
44
44
  ];
45
- const exports = [`export const connections = [connection];`];
45
+ const exports2 = [`export const connections = [connection];`];
46
46
  const pad = " ";
47
47
  const config = this.connection.mikroOrmConfig;
48
48
  const connection = [`export const connection = {`];
@@ -65,7 +65,7 @@ class DatabaseFile {
65
65
 
66
66
  ${connection.join("\n")}
67
67
 
68
- ${exports.join("\n")}
68
+ ${exports2.join("\n")}
69
69
  `;
70
70
  }
71
71
  }
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/introspection/files/database-file.ts"],
4
4
  "sourcesContent": ["import { Options } from '@mikro-orm/core';\nimport { ConnectionOptions, DatabaseType } from '../../database';\n\nexport class DatabaseFile {\n\tconstructor(\n\t\tprotected readonly databaseType: DatabaseType,\n\t\tprotected readonly connection: ConnectionOptions\n\t) {}\n\n\tgetBasePath() {\n\t\treturn `backend/`;\n\t}\n\n\tgetBaseName() {\n\t\treturn 'database.ts';\n\t}\n\n\tgenerate(): string {\n\t\tconst isPostgresql = this.databaseType === 'postgresql';\n\t\tconst isMySQL = this.databaseType === 'mysql';\n\t\tconst isSQLite = this.databaseType === 'sqlite';\n\t\tconst imports = [\n\t\t\t...(isPostgresql ? [`import { PostgreSqlDriver } from '@mikro-orm/postgresql';`] : []),\n\t\t\t...(isMySQL ? [`import { MySqlDriver } from '@mikro-orm/mysql';`] : []),\n\t\t\t...(isSQLite ? [`import { SqliteDriver } from 'mikro-orm-sqlite-wasm';`] : []),\n\t\t\t`import { entities } from './entities';`,\n\t\t];\n\t\tconst exports = [`export const connections = [connection];`];\n\n\t\tconst pad = '\\t';\n\n\t\tconst config = this.connection.mikroOrmConfig as Options;\n\n\t\tconst connection = [`export const connection = {`];\n\t\tconnection.push(`${pad}connectionManagerId: '${this.databaseType}',`);\n\t\tconnection.push(`${pad}mikroOrmConfig: {`);\n\t\tconnection.push(`${pad}${pad}entities: entities,`);\n\t\tconnection.push(\n\t\t\t`${pad}${pad}driver: ${\n\t\t\t\tisPostgresql ? 'PostgreSqlDriver' : isMySQL ? 'MySqlDriver' : 'SqliteDriver'\n\t\t\t},`\n\t\t);\n\t\tconnection.push(`${pad}${pad}dbName: '${config.dbName}',`);\n\t\tif (!isSQLite) {\n\t\t\tconnection.push(`${pad}${pad}host: '${config.host}',`);\n\t\t\tconnection.push(`${pad}${pad}user: '${config.user}',`);\n\t\t\tconnection.push(`${pad}${pad}password: '${config.password}',`);\n\t\t\tconnection.push(`${pad}${pad}port: ${config.port},`);\n\t\t}\n\t\tconnection.push(`${pad}},`);\n\t\tconnection.push(`};`);\n\n\t\treturn `${imports.join('\\n')}\\n\\n${connection.join('\\n')}\\n\\n${exports.join('\\n')}\\n`;\n\t}\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGO,MAAM,aAAa;AAAA,EACzB,YACoB,cACA,YAClB;AAFkB;AACA;AAAA,EACjB;AAAA,EAEH,cAAc;AACb,WAAO;AAAA,EACR;AAAA,EAEA,cAAc;AACb,WAAO;AAAA,EACR;AAAA,EAEA,WAAmB;AAClB,UAAM,eAAe,KAAK,iBAAiB;AAC3C,UAAM,UAAU,KAAK,iBAAiB;AACtC,UAAM,WAAW,KAAK,iBAAiB;AACvC,UAAM,UAAU;AAAA,MACf,GAAI,eAAe,CAAC,2DAA2D,IAAI,CAAC;AAAA,MACpF,GAAI,UAAU,CAAC,iDAAiD,IAAI,CAAC;AAAA,MACrE,GAAI,WAAW,CAAC,uDAAuD,IAAI,CAAC;AAAA,MAC5E;AAAA,IACD;AACA,UAAM,UAAU,CAAC,0CAA0C;AAE3D,UAAM,MAAM;AAEZ,UAAM,SAAS,KAAK,WAAW;AAE/B,UAAM,aAAa,CAAC,6BAA6B;AACjD,eAAW,KAAK,GAAG,4BAA4B,KAAK,gBAAgB;AACpE,eAAW,KAAK,GAAG,sBAAsB;AACzC,eAAW,KAAK,GAAG,MAAM,wBAAwB;AACjD,eAAW;AAAA,MACV,GAAG,MAAM,cACR,eAAe,qBAAqB,UAAU,gBAAgB;AAAA,IAEhE;AACA,eAAW,KAAK,GAAG,MAAM,eAAe,OAAO,UAAU;AACzD,QAAI,CAAC,UAAU;AACd,iBAAW,KAAK,GAAG,MAAM,aAAa,OAAO,QAAQ;AACrD,iBAAW,KAAK,GAAG,MAAM,aAAa,OAAO,QAAQ;AACrD,iBAAW,KAAK,GAAG,MAAM,iBAAiB,OAAO,YAAY;AAC7D,iBAAW,KAAK,GAAG,MAAM,YAAY,OAAO,OAAO;AAAA,IACpD;AACA,eAAW,KAAK,GAAG,OAAO;AAC1B,eAAW,KAAK,IAAI;AAEpB,WAAO,GAAG,QAAQ,KAAK,IAAI;AAAA;AAAA,EAAQ,WAAW,KAAK,IAAI;AAAA;AAAA,EAAQ,QAAQ,KAAK,IAAI;AAAA;AAAA,EACjF;AACD;",
6
- "names": []
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGO,MAAM,aAAa;AAAA,EACzB,YACoB,cACA,YAClB;AAFkB;AACA;AAAA,EACjB;AAAA,EAEH,cAAc;AACb,WAAO;AAAA,EACR;AAAA,EAEA,cAAc;AACb,WAAO;AAAA,EACR;AAAA,EAEA,WAAmB;AAClB,UAAM,eAAe,KAAK,iBAAiB;AAC3C,UAAM,UAAU,KAAK,iBAAiB;AACtC,UAAM,WAAW,KAAK,iBAAiB;AACvC,UAAM,UAAU;AAAA,MACf,GAAI,eAAe,CAAC,2DAA2D,IAAI,CAAC;AAAA,MACpF,GAAI,UAAU,CAAC,iDAAiD,IAAI,CAAC;AAAA,MACrE,GAAI,WAAW,CAAC,uDAAuD,IAAI,CAAC;AAAA,MAC5E;AAAA,IACD;AACA,UAAMA,WAAU,CAAC,0CAA0C;AAE3D,UAAM,MAAM;AAEZ,UAAM,SAAS,KAAK,WAAW;AAE/B,UAAM,aAAa,CAAC,6BAA6B;AACjD,eAAW,KAAK,GAAG,GAAG,yBAAyB,KAAK,YAAY,IAAI;AACpE,eAAW,KAAK,GAAG,GAAG,mBAAmB;AACzC,eAAW,KAAK,GAAG,GAAG,GAAG,GAAG,qBAAqB;AACjD,eAAW;AAAA,MACV,GAAG,GAAG,GAAG,GAAG,WACX,eAAe,qBAAqB,UAAU,gBAAgB,cAC/D;AAAA,IACD;AACA,eAAW,KAAK,GAAG,GAAG,GAAG,GAAG,YAAY,OAAO,MAAM,IAAI;AACzD,QAAI,CAAC,UAAU;AACd,iBAAW,KAAK,GAAG,GAAG,GAAG,GAAG,UAAU,OAAO,IAAI,IAAI;AACrD,iBAAW,KAAK,GAAG,GAAG,GAAG,GAAG,UAAU,OAAO,IAAI,IAAI;AACrD,iBAAW,KAAK,GAAG,GAAG,GAAG,GAAG,cAAc,OAAO,QAAQ,IAAI;AAC7D,iBAAW,KAAK,GAAG,GAAG,GAAG,GAAG,SAAS,OAAO,IAAI,GAAG;AAAA,IACpD;AACA,eAAW,KAAK,GAAG,GAAG,IAAI;AAC1B,eAAW,KAAK,IAAI;AAEpB,WAAO,GAAG,QAAQ,KAAK,IAAI,CAAC;AAAA;AAAA,EAAO,WAAW,KAAK,IAAI,CAAC;AAAA;AAAA,EAAOA,SAAQ,KAAK,IAAI,CAAC;AAAA;AAAA,EAClF;AACD;",
6
+ "names": ["exports"]
7
7
  }
@@ -2,7 +2,5 @@ export * from './data-entity-file';
2
2
  export * from './data-entity-index-file';
3
3
  export * from './data-source-index-file';
4
4
  export * from './schema-entity-file';
5
- export * from './schema-entity-index-file';
6
5
  export * from './schema-index-file';
7
- export * from './schema-resolver-file';
8
6
  export * from './database-file';
@@ -19,8 +19,15 @@ __reExport(files_exports, require("./data-entity-file"), module.exports);
19
19
  __reExport(files_exports, require("./data-entity-index-file"), module.exports);
20
20
  __reExport(files_exports, require("./data-source-index-file"), module.exports);
21
21
  __reExport(files_exports, require("./schema-entity-file"), module.exports);
22
- __reExport(files_exports, require("./schema-entity-index-file"), module.exports);
23
22
  __reExport(files_exports, require("./schema-index-file"), module.exports);
24
- __reExport(files_exports, require("./schema-resolver-file"), module.exports);
25
23
  __reExport(files_exports, require("./database-file"), module.exports);
24
+ // Annotate the CommonJS export names for ESM import in node:
25
+ 0 && (module.exports = {
26
+ ...require("./data-entity-file"),
27
+ ...require("./data-entity-index-file"),
28
+ ...require("./data-source-index-file"),
29
+ ...require("./schema-entity-file"),
30
+ ...require("./schema-index-file"),
31
+ ...require("./database-file")
32
+ });
26
33
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/introspection/files/index.ts"],
4
- "sourcesContent": ["export * from './data-entity-file';\nexport * from './data-entity-index-file';\nexport * from './data-source-index-file';\nexport * from './schema-entity-file';\nexport * from './schema-entity-index-file';\nexport * from './schema-index-file';\nexport * from './schema-resolver-file';\nexport * from './database-file';\n"],
5
- "mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,0BAAc,+BAAd;AACA,0BAAc,qCADd;AAEA,0BAAc,qCAFd;AAGA,0BAAc,iCAHd;AAIA,0BAAc,uCAJd;AAKA,0BAAc,gCALd;AAMA,0BAAc,mCANd;AAOA,0BAAc,4BAPd;",
4
+ "sourcesContent": ["export * from './data-entity-file';\nexport * from './data-entity-index-file';\nexport * from './data-source-index-file';\nexport * from './schema-entity-file';\nexport * from './schema-index-file';\nexport * from './database-file';\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,0BAAc,+BAAd;AACA,0BAAc,qCADd;AAEA,0BAAc,qCAFd;AAGA,0BAAc,iCAHd;AAIA,0BAAc,gCAJd;AAKA,0BAAc,4BALd;",
6
6
  "names": []
7
7
  }
@@ -4,11 +4,12 @@ export declare class SchemaEntityFile extends BaseFile {
4
4
  protected readonly meta: EntityMetadata;
5
5
  protected readonly namingStrategy: NamingStrategy;
6
6
  protected readonly platform: Platform;
7
+ protected readonly entityLookup: Map<string, EntityMetadata<any>>;
7
8
  protected readonly coreImports: Set<string>;
8
9
  protected readonly scalarImports: Set<string>;
9
10
  protected readonly entityImports: Set<string>;
10
11
  protected readonly enumImports: Set<string>;
11
- constructor(meta: EntityMetadata, namingStrategy: NamingStrategy, platform: Platform);
12
+ constructor(meta: EntityMetadata, namingStrategy: NamingStrategy, platform: Platform, entityLookup: Map<string, EntityMetadata<any>>);
12
13
  getBasePath(): string;
13
14
  getBaseName(): string;
14
15
  generate(): string;
@@ -18,6 +18,10 @@ var __copyProps = (to, from, except, desc) => {
18
18
  return to;
19
19
  };
20
20
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
21
25
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
26
  mod
23
27
  ));
@@ -32,42 +36,37 @@ var import_base_file = require("./base-file");
32
36
  var import_utils = require("../utils");
33
37
  var import_pluralize = __toESM(require("pluralize"));
34
38
  class SchemaEntityFile extends import_base_file.BaseFile {
35
- constructor(meta, namingStrategy, platform) {
39
+ constructor(meta, namingStrategy, platform, entityLookup) {
36
40
  super(meta, namingStrategy, platform);
37
41
  this.meta = meta;
38
42
  this.namingStrategy = namingStrategy;
39
43
  this.platform = platform;
44
+ this.entityLookup = entityLookup;
40
45
  this.coreImports = /* @__PURE__ */ new Set();
41
46
  this.scalarImports = /* @__PURE__ */ new Set();
42
47
  this.entityImports = /* @__PURE__ */ new Set();
43
48
  this.enumImports = /* @__PURE__ */ new Set();
44
49
  }
45
50
  getBasePath() {
46
- const dirName = (0, import_utils.pascalToKebabCaseString)(this.meta.className);
47
- return `backend/schema/${dirName}/`;
51
+ return `backend/schema/`;
48
52
  }
49
53
  getBaseName() {
50
- return "entity.ts";
54
+ const fileName = (0, import_utils.pascalToKebabCaseString)(this.meta.className);
55
+ return `${fileName}.ts`;
51
56
  }
52
57
  generate() {
53
58
  const enumDefinitions = [];
54
- let classBody = "\n";
59
+ let classBody = "";
55
60
  const props = Object.values(this.meta.properties);
56
61
  props.forEach((prop) => {
57
62
  const decorator = this.getPropertyDecorator(prop);
58
63
  const definition = this.getPropertyDefinition(prop);
59
- if (!classBody.endsWith("\n\n")) {
64
+ if (classBody && !classBody.endsWith("\n\n")) {
60
65
  classBody += "\n";
61
66
  }
62
- if (["name", "title"].includes(prop.name.toLowerCase())) {
63
- this.coreImports.add("SummaryField");
64
- classBody += ` @SummaryField()
65
- `;
66
- }
67
67
  classBody += decorator;
68
68
  classBody += definition;
69
- if (props[props.length - 1] !== prop)
70
- classBody += "\n";
69
+ if (props[props.length - 1] !== prop) classBody += "\n";
71
70
  if (prop.enum) {
72
71
  const enumClassName = this.namingStrategy.getClassName(
73
72
  this.meta.collection + "_" + prop.fieldNames[0],
@@ -81,13 +80,13 @@ class SchemaEntityFile extends import_base_file.BaseFile {
81
80
  file += enumDefinitions.join("\n");
82
81
  file += "\n\n";
83
82
  }
84
- this.coreImports.add("ObjectType");
85
- file += `@ObjectType(${this.quote(this.meta.className)})
83
+ this.coreImports.add("Entity");
84
+ file += `@Entity<${this.meta.className}>(${this.quote(this.meta.className)}, {
85
+ provider: new MikroBackendProvider(Orm${this.meta.className}, connection),
86
+ })
86
87
  `;
87
- this.coreImports.add("GraphQLEntity");
88
- file += `export class ${this.meta.className} extends GraphQLEntity<Orm${this.meta.className}> {
88
+ file += `export class ${this.meta.className} {
89
89
  `;
90
- file += ` public dataEntity!: Orm${this.meta.className};`;
91
90
  file += `${classBody}}
92
91
  `;
93
92
  const imports = [
@@ -98,12 +97,14 @@ class SchemaEntityFile extends import_base_file.BaseFile {
98
97
  `import { ${[...this.scalarImports].sort().join(", ")} } from '@exogee/graphweaver-scalars';`
99
98
  );
100
99
  }
100
+ imports.push(`import { MikroBackendProvider } from '@exogee/graphweaver-mikroorm';`);
101
101
  const entityImports = [...this.entityImports].filter((e) => e !== this.meta.className);
102
102
  entityImports.sort().forEach((entity) => {
103
- imports.push(`import { ${entity} } from '../${(0, import_utils.pascalToKebabCaseString)(entity)}';`);
103
+ imports.push(`import { ${entity} } from './${(0, import_utils.pascalToKebabCaseString)(entity)}';`);
104
104
  });
105
105
  imports.push(
106
- `import { ${this.enumImports.size > 0 ? [...this.enumImports].sort().join(", ") + ", " : ""}${this.meta.className} as Orm${this.meta.className} } from '../../entities';`
106
+ `import { ${this.enumImports.size > 0 ? [...this.enumImports].sort().join(", ") + ", " : ""}${this.meta.className} as Orm${this.meta.className} } from '../entities';`,
107
+ `import { connection } from '../database';`
107
108
  );
108
109
  file = `${imports.join("\n")}
109
110
 
@@ -132,9 +133,6 @@ ${file}`;
132
133
  const isEnumOrNonStringDefault = prop.enum || typeof prop.default !== "string";
133
134
  const useDefault = prop.default != null && isEnumOrNonStringDefault;
134
135
  const optional = prop.nullable ? "?" : useDefault ? "" : "!";
135
- if (prop.primary) {
136
- return `${padding}id!: ${this.getTypescriptPropertyType(prop)};`;
137
- }
138
136
  const file = `${prop.name}${optional}: ${this.getTypescriptPropertyType(prop)}`;
139
137
  if (!useDefault) {
140
138
  return `${padding + file};
@@ -199,13 +197,21 @@ ${file}`;
199
197
  return `${decorator}(() => ${this.getGraphQLPropertyType(prop)})
200
198
  `;
201
199
  }
202
- return `${decorator}(() => ${this.getGraphQLPropertyType(prop)}, { ${Object.entries(options).map(([opt, val]) => `${opt}: ${val}`).join(", ")} })
200
+ return `${decorator}(() => ${this.getGraphQLPropertyType(prop)}, { ${Object.entries(options).map(([opt, val]) => `${opt}: ${JSON.stringify(val).replaceAll('"', "")}`).join(", ")} })
203
201
  `;
204
202
  }
205
203
  getCommonDecoratorOptions(options, prop) {
206
204
  if (prop.nullable && !prop.mappedBy) {
207
205
  options.nullable = true;
208
206
  }
207
+ if (prop.primary) {
208
+ options.primaryKeyField = true;
209
+ }
210
+ if (prop.name === "name") {
211
+ options.adminUIOptions = { summaryField: true };
212
+ } else if (prop.name === "title" && !this.meta.props.find((prop2) => prop2.name === "name")) {
213
+ options.adminUIOptions = { summaryField: true };
214
+ }
209
215
  }
210
216
  getManyToManyDecoratorOptions(options, prop) {
211
217
  this.entityImports.add(prop.type);
@@ -217,7 +223,17 @@ ${file}`;
217
223
  }
218
224
  getForeignKeyDecoratorOptions(options, prop) {
219
225
  this.entityImports.add(prop.type);
220
- options.id = `(entity) => entity.${prop.name}?.id`;
226
+ const relatedEntity = this.entityLookup.get(prop.type);
227
+ if (!relatedEntity) {
228
+ throw new Error(
229
+ `Internal Error: Related entity ${prop.type} should exist but could not be found in the entity lookup.`
230
+ );
231
+ }
232
+ if (relatedEntity.primaryKeys.length !== 1) {
233
+ throw new Error(`Composite primary keys are not supported.`);
234
+ }
235
+ const [primaryKey] = relatedEntity.getPrimaryProps();
236
+ options.id = `(entity) => entity.${prop.name}?.unwrap().${primaryKey.name}`;
221
237
  }
222
238
  getDecoratorType(prop) {
223
239
  if ([import_core.ReferenceKind.ONE_TO_ONE, import_core.ReferenceKind.MANY_TO_ONE].includes(prop.kind)) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/introspection/files/schema-entity-file.ts"],
4
- "sourcesContent": ["import type {\n\tDictionary,\n\tEntityMetadata,\n\tEntityProperty,\n\tNamingStrategy,\n\tPlatform,\n} from '@mikro-orm/core';\nimport { ReferenceKind, Utils } from '@mikro-orm/core';\n\nimport { BaseFile } from './base-file';\nimport { pascalToCamelCaseString, pascalToKebabCaseString } from '../utils';\nimport pluralize from 'pluralize';\n\nexport class SchemaEntityFile extends BaseFile {\n\tprotected readonly coreImports = new Set<string>();\n\tprotected readonly scalarImports = new Set<string>();\n\tprotected readonly entityImports = new Set<string>();\n\tprotected readonly enumImports = new Set<string>();\n\n\tconstructor(\n\t\tprotected readonly meta: EntityMetadata,\n\t\tprotected readonly namingStrategy: NamingStrategy,\n\t\tprotected readonly platform: Platform\n\t) {\n\t\tsuper(meta, namingStrategy, platform);\n\t}\n\n\tgetBasePath() {\n\t\tconst dirName = pascalToKebabCaseString(this.meta.className);\n\t\treturn `backend/schema/${dirName}/`;\n\t}\n\n\tgetBaseName() {\n\t\treturn 'entity.ts';\n\t}\n\n\tgenerate(): string {\n\t\tconst enumDefinitions: string[] = [];\n\t\tlet classBody = '\\n';\n\t\tconst props = Object.values(this.meta.properties);\n\t\tprops.forEach((prop) => {\n\t\t\tconst decorator = this.getPropertyDecorator(prop);\n\t\t\tconst definition = this.getPropertyDefinition(prop);\n\n\t\t\tif (!classBody.endsWith('\\n\\n')) {\n\t\t\t\tclassBody += '\\n';\n\t\t\t}\n\n\t\t\t// Add a summary field if we have a name or title attribute\n\t\t\tif (['name', 'title'].includes(prop.name.toLowerCase())) {\n\t\t\t\tthis.coreImports.add('SummaryField');\n\t\t\t\tclassBody += `\\t@SummaryField()\\n`;\n\t\t\t}\n\t\t\tclassBody += decorator;\n\t\t\tclassBody += definition;\n\n\t\t\tif (props[props.length - 1] !== prop) classBody += '\\n';\n\n\t\t\tif (prop.enum) {\n\t\t\t\tconst enumClassName = this.namingStrategy.getClassName(\n\t\t\t\t\tthis.meta.collection + '_' + prop.fieldNames[0],\n\t\t\t\t\t'_'\n\t\t\t\t);\n\t\t\t\tenumDefinitions.push(this.getEnumClassDefinition(enumClassName));\n\t\t\t}\n\t\t});\n\n\t\tlet file = '';\n\n\t\tif (enumDefinitions.length) {\n\t\t\tfile += enumDefinitions.join('\\n');\n\t\t\tfile += '\\n\\n';\n\t\t}\n\n\t\tthis.coreImports.add('ObjectType');\n\t\tfile += `@ObjectType(${this.quote(this.meta.className)})\\n`;\n\n\t\tthis.coreImports.add('GraphQLEntity');\n\t\tfile += `export class ${this.meta.className} extends GraphQLEntity<Orm${this.meta.className}> {\\n`;\n\t\tfile += `\\tpublic dataEntity!: Orm${this.meta.className};`;\n\n\t\tfile += `${classBody}}\\n`;\n\t\tconst imports = [\n\t\t\t`import { ${[...this.coreImports].sort().join(', ')} } from '@exogee/graphweaver';`,\n\t\t];\n\n\t\tif (this.scalarImports.size > 0) {\n\t\t\timports.push(\n\t\t\t\t`import { ${[...this.scalarImports]\n\t\t\t\t\t.sort()\n\t\t\t\t\t.join(', ')} } from '@exogee/graphweaver-scalars';`\n\t\t\t);\n\t\t}\n\n\t\tconst entityImports = [...this.entityImports].filter((e) => e !== this.meta.className);\n\t\tentityImports.sort().forEach((entity) => {\n\t\t\timports.push(`import { ${entity} } from '../${pascalToKebabCaseString(entity)}';`);\n\t\t});\n\n\t\timports.push(\n\t\t\t`import { ${this.enumImports.size > 0 ? [...this.enumImports].sort().join(', ') + ', ' : ''}${\n\t\t\t\tthis.meta.className\n\t\t\t} as Orm${this.meta.className} } from '../../entities';`\n\t\t);\n\n\t\tfile = `${imports.join('\\n')}\\n\\n${file}`;\n\n\t\treturn file;\n\t}\n\n\tprotected getTypescriptPropertyType(prop: EntityProperty): string {\n\t\tif (['jsonb', 'json', 'any'].includes(prop.columnTypes?.[0])) {\n\t\t\treturn `Record<string, unknown>`;\n\t\t}\n\n\t\tif (prop.columnTypes?.[0] === 'date') {\n\t\t\treturn 'Date';\n\t\t}\n\n\t\tif (prop.type === 'unknown') {\n\t\t\t//fallback to string if unknown\n\t\t\treturn 'string';\n\t\t}\n\n\t\treturn prop.type;\n\t}\n\n\tprotected getPropertyDefinition(prop: EntityProperty): string {\n\t\tconst padding = '\\t';\n\n\t\tif ([ReferenceKind.ONE_TO_MANY, ReferenceKind.MANY_TO_MANY].includes(prop.kind)) {\n\t\t\tthis.entityImports.add(prop.type);\n\t\t\treturn `${padding}${prop.name}!: ${prop.type}[];\\n`;\n\t\t}\n\n\t\t// string defaults are usually things like SQL functions, but can be also enums, for that `useDefault` should be true\n\t\tconst isEnumOrNonStringDefault = prop.enum || typeof prop.default !== 'string';\n\t\tconst useDefault = prop.default != null && isEnumOrNonStringDefault;\n\t\tconst optional = prop.nullable ? '?' : useDefault ? '' : '!';\n\n\t\tif (prop.primary) {\n\t\t\treturn `${padding}id!: ${this.getTypescriptPropertyType(prop)};`;\n\t\t}\n\n\t\tconst file = `${prop.name}${optional}: ${this.getTypescriptPropertyType(prop)}`;\n\n\t\tif (!useDefault) {\n\t\t\treturn `${padding + file};\\n`;\n\t\t}\n\n\t\tif (prop.enum && typeof prop.default === 'string') {\n\t\t\treturn `${padding}${file} = ${prop.type}.${prop.default.toUpperCase()};\\n`;\n\t\t}\n\n\t\treturn `${padding}${prop.name} = ${prop.default};\\n`;\n\t}\n\n\tprotected getEnumClassDefinition(enumClassName: string): string {\n\t\tthis.coreImports.add('registerEnumType');\n\t\tthis.enumImports.add(enumClassName);\n\t\treturn `registerEnumType(${enumClassName}, { name: ${this.quote(enumClassName)} });`;\n\t}\n\n\tprivate getGraphQLPropertyType(prop: EntityProperty): string {\n\t\tif (prop.primary) {\n\t\t\tthis.coreImports.add('ID');\n\t\t\treturn 'ID';\n\t\t}\n\n\t\tif (prop.type === 'Date') {\n\t\t\tthis.scalarImports.add('ISODateStringScalar');\n\t\t\treturn 'ISODateStringScalar';\n\t\t}\n\n\t\tif (prop.columnTypes?.[0] === 'date') {\n\t\t\treturn 'Date';\n\t\t}\n\n\t\tif (prop.type === 'unknown') {\n\t\t\treturn 'String';\n\t\t}\n\n\t\tif (['jsonb', 'json', 'any'].includes(prop.columnTypes?.[0])) {\n\t\t\tthis.scalarImports.add('GraphQLJSON');\n\t\t\treturn `GraphQLJSON`;\n\t\t}\n\n\t\tif (prop.type.includes('[]')) {\n\t\t\treturn `[${prop.type.charAt(0).toUpperCase() + prop.type.slice(1).replace('[]', '')}]`;\n\t\t}\n\n\t\tif ([ReferenceKind.MANY_TO_MANY, ReferenceKind.ONE_TO_MANY].includes(prop.kind)) {\n\t\t\treturn `[${prop.type.charAt(0).toUpperCase() + prop.type.slice(1).replace('[]', '')}]`;\n\t\t}\n\n\t\tif (prop.pivotTable) {\n\t\t\treturn `[${prop.type.charAt(0).toUpperCase() + prop.type.slice(1)}]`;\n\t\t}\n\n\t\treturn prop.type.charAt(0).toUpperCase() + prop.type.slice(1);\n\t}\n\n\tprivate getPropertyDecorator(prop: EntityProperty): string {\n\t\tconst padding = '\\t';\n\t\tconst options = {} as Dictionary;\n\t\tlet decorator = this.getDecoratorType(prop);\n\n\t\tif (prop.kind === ReferenceKind.MANY_TO_MANY) {\n\t\t\tthis.getManyToManyDecoratorOptions(options, prop);\n\t\t} else if (prop.kind === ReferenceKind.ONE_TO_MANY) {\n\t\t\tthis.getOneToManyDecoratorOptions(options, prop);\n\t\t} else if (prop.kind !== ReferenceKind.SCALAR) {\n\t\t\tthis.getForeignKeyDecoratorOptions(options, prop);\n\t\t}\n\n\t\tthis.getCommonDecoratorOptions(options, prop);\n\t\tdecorator = [decorator].map((d) => padding + d).join('\\n');\n\n\t\tif (!Utils.hasObjectKeys(options)) {\n\t\t\treturn `${decorator}(() => ${this.getGraphQLPropertyType(prop)})\\n`;\n\t\t}\n\n\t\treturn `${decorator}(() => ${this.getGraphQLPropertyType(prop)}, { ${Object.entries(options)\n\t\t\t.map(([opt, val]) => `${opt}: ${val}`)\n\t\t\t.join(', ')} })\\n`;\n\t}\n\n\tprotected getCommonDecoratorOptions(options: Dictionary, prop: EntityProperty): void {\n\t\tif (prop.nullable && !prop.mappedBy) {\n\t\t\toptions.nullable = true;\n\t\t}\n\t}\n\n\tprotected getManyToManyDecoratorOptions(options: Dictionary, prop: EntityProperty) {\n\t\tthis.entityImports.add(prop.type);\n\t\toptions.relatedField = this.quote(pluralize(pascalToCamelCaseString(this.meta.className)));\n\t}\n\n\tprotected getOneToManyDecoratorOptions(options: Dictionary, prop: EntityProperty) {\n\t\tthis.entityImports.add(prop.type);\n\t\toptions.relatedField = this.quote(prop.mappedBy);\n\t}\n\n\tprotected getForeignKeyDecoratorOptions(options: Dictionary, prop: EntityProperty) {\n\t\tthis.entityImports.add(prop.type);\n\t\toptions.id = `(entity) => entity.${prop.name}?.id`;\n\t}\n\n\tprotected getDecoratorType(prop: EntityProperty): string {\n\t\tif ([ReferenceKind.ONE_TO_ONE, ReferenceKind.MANY_TO_ONE].includes(prop.kind)) {\n\t\t\tthis.coreImports.add('RelationshipField');\n\t\t\treturn `@RelationshipField<${this.meta.className}>`;\n\t\t}\n\n\t\tif ([ReferenceKind.ONE_TO_MANY, ReferenceKind.MANY_TO_MANY].includes(prop.kind)) {\n\t\t\tthis.coreImports.add('RelationshipField');\n\t\t\treturn `@RelationshipField<${prop.type}>`;\n\t\t}\n\n\t\tthis.coreImports.add('Field');\n\t\treturn '@Field';\n\t}\n}\n"],
5
- "mappings": "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",
6
- "names": ["pluralize"]
4
+ "sourcesContent": ["import type {\n\tDictionary,\n\tEntityMetadata,\n\tEntityProperty,\n\tNamingStrategy,\n\tPlatform,\n} from '@mikro-orm/core';\nimport { ReferenceKind, Utils } from '@mikro-orm/core';\n\nimport { BaseFile } from './base-file';\nimport { pascalToCamelCaseString, pascalToKebabCaseString } from '../utils';\nimport pluralize from 'pluralize';\n\nexport class SchemaEntityFile extends BaseFile {\n\tprotected readonly coreImports = new Set<string>();\n\tprotected readonly scalarImports = new Set<string>();\n\tprotected readonly entityImports = new Set<string>();\n\tprotected readonly enumImports = new Set<string>();\n\n\tconstructor(\n\t\tprotected readonly meta: EntityMetadata,\n\t\tprotected readonly namingStrategy: NamingStrategy,\n\t\tprotected readonly platform: Platform,\n\t\tprotected readonly entityLookup: Map<string, EntityMetadata<any>>\n\t) {\n\t\tsuper(meta, namingStrategy, platform);\n\t}\n\n\tgetBasePath() {\n\t\treturn `backend/schema/`;\n\t}\n\n\tgetBaseName() {\n\t\tconst fileName = pascalToKebabCaseString(this.meta.className);\n\t\treturn `${fileName}.ts`;\n\t}\n\n\tgenerate(): string {\n\t\tconst enumDefinitions: string[] = [];\n\t\tlet classBody = '';\n\t\tconst props = Object.values(this.meta.properties);\n\t\tprops.forEach((prop) => {\n\t\t\tconst decorator = this.getPropertyDecorator(prop);\n\t\t\tconst definition = this.getPropertyDefinition(prop);\n\n\t\t\tif (classBody && !classBody.endsWith('\\n\\n')) {\n\t\t\t\tclassBody += '\\n';\n\t\t\t}\n\n\t\t\tclassBody += decorator;\n\t\t\tclassBody += definition;\n\n\t\t\tif (props[props.length - 1] !== prop) classBody += '\\n';\n\n\t\t\tif (prop.enum) {\n\t\t\t\tconst enumClassName = this.namingStrategy.getClassName(\n\t\t\t\t\tthis.meta.collection + '_' + prop.fieldNames[0],\n\t\t\t\t\t'_'\n\t\t\t\t);\n\t\t\t\tenumDefinitions.push(this.getEnumClassDefinition(enumClassName));\n\t\t\t}\n\t\t});\n\n\t\tlet file = '';\n\n\t\tif (enumDefinitions.length) {\n\t\t\tfile += enumDefinitions.join('\\n');\n\t\t\tfile += '\\n\\n';\n\t\t}\n\n\t\tthis.coreImports.add('Entity');\n\t\tfile += `@Entity<${this.meta.className}>(${this.quote(this.meta.className)}, {\\n\\tprovider: new MikroBackendProvider(Orm${this.meta.className}, connection),\\n})\\n`;\n\t\tfile += `export class ${this.meta.className} {\\n`;\n\t\tfile += `${classBody}}\\n`;\n\t\tconst imports = [\n\t\t\t`import { ${[...this.coreImports].sort().join(', ')} } from '@exogee/graphweaver';`,\n\t\t];\n\n\t\tif (this.scalarImports.size > 0) {\n\t\t\timports.push(\n\t\t\t\t`import { ${[...this.scalarImports]\n\t\t\t\t\t.sort()\n\t\t\t\t\t.join(', ')} } from '@exogee/graphweaver-scalars';`\n\t\t\t);\n\t\t}\n\n\t\timports.push(`import { MikroBackendProvider } from '@exogee/graphweaver-mikroorm';`);\n\n\t\tconst entityImports = [...this.entityImports].filter((e) => e !== this.meta.className);\n\t\tentityImports.sort().forEach((entity) => {\n\t\t\timports.push(`import { ${entity} } from './${pascalToKebabCaseString(entity)}';`);\n\t\t});\n\n\t\timports.push(\n\t\t\t`import { ${this.enumImports.size > 0 ? [...this.enumImports].sort().join(', ') + ', ' : ''}${\n\t\t\t\tthis.meta.className\n\t\t\t} as Orm${this.meta.className} } from '../entities';`,\n\t\t\t`import { connection } from '../database';`\n\t\t);\n\n\t\tfile = `${imports.join('\\n')}\\n\\n${file}`;\n\n\t\treturn file;\n\t}\n\n\tprotected getTypescriptPropertyType(prop: EntityProperty): string {\n\t\tif (['jsonb', 'json', 'any'].includes(prop.columnTypes?.[0])) {\n\t\t\treturn `Record<string, unknown>`;\n\t\t}\n\n\t\tif (prop.columnTypes?.[0] === 'date') {\n\t\t\treturn 'Date';\n\t\t}\n\n\t\tif (prop.type === 'unknown') {\n\t\t\t//fallback to string if unknown\n\t\t\treturn 'string';\n\t\t}\n\n\t\treturn prop.type;\n\t}\n\n\tprotected getPropertyDefinition(prop: EntityProperty): string {\n\t\tconst padding = '\\t';\n\n\t\tif ([ReferenceKind.ONE_TO_MANY, ReferenceKind.MANY_TO_MANY].includes(prop.kind)) {\n\t\t\tthis.entityImports.add(prop.type);\n\t\t\treturn `${padding}${prop.name}!: ${prop.type}[];\\n`;\n\t\t}\n\n\t\t// string defaults are usually things like SQL functions, but can be also enums, for that `useDefault` should be true\n\t\tconst isEnumOrNonStringDefault = prop.enum || typeof prop.default !== 'string';\n\t\tconst useDefault = prop.default != null && isEnumOrNonStringDefault;\n\t\tconst optional = prop.nullable ? '?' : useDefault ? '' : '!';\n\n\t\tconst file = `${prop.name}${optional}: ${this.getTypescriptPropertyType(prop)}`;\n\n\t\tif (!useDefault) {\n\t\t\treturn `${padding + file};\\n`;\n\t\t}\n\n\t\tif (prop.enum && typeof prop.default === 'string') {\n\t\t\treturn `${padding}${file} = ${prop.type}.${prop.default.toUpperCase()};\\n`;\n\t\t}\n\n\t\treturn `${padding}${prop.name} = ${prop.default};\\n`;\n\t}\n\n\tprotected getEnumClassDefinition(enumClassName: string): string {\n\t\tthis.coreImports.add('registerEnumType');\n\t\tthis.enumImports.add(enumClassName);\n\t\treturn `registerEnumType(${enumClassName}, { name: ${this.quote(enumClassName)} });`;\n\t}\n\n\tprivate getGraphQLPropertyType(prop: EntityProperty): string {\n\t\tif (prop.primary) {\n\t\t\tthis.coreImports.add('ID');\n\t\t\treturn 'ID';\n\t\t}\n\n\t\tif (prop.type === 'Date') {\n\t\t\tthis.scalarImports.add('ISODateStringScalar');\n\t\t\treturn 'ISODateStringScalar';\n\t\t}\n\n\t\tif (prop.columnTypes?.[0] === 'date') {\n\t\t\treturn 'Date';\n\t\t}\n\n\t\tif (prop.type === 'unknown') {\n\t\t\treturn 'String';\n\t\t}\n\n\t\tif (['jsonb', 'json', 'any'].includes(prop.columnTypes?.[0])) {\n\t\t\tthis.scalarImports.add('GraphQLJSON');\n\t\t\treturn `GraphQLJSON`;\n\t\t}\n\n\t\tif (prop.type.includes('[]')) {\n\t\t\treturn `[${prop.type.charAt(0).toUpperCase() + prop.type.slice(1).replace('[]', '')}]`;\n\t\t}\n\n\t\tif ([ReferenceKind.MANY_TO_MANY, ReferenceKind.ONE_TO_MANY].includes(prop.kind)) {\n\t\t\treturn `[${prop.type.charAt(0).toUpperCase() + prop.type.slice(1).replace('[]', '')}]`;\n\t\t}\n\n\t\tif (prop.pivotTable) {\n\t\t\treturn `[${prop.type.charAt(0).toUpperCase() + prop.type.slice(1)}]`;\n\t\t}\n\n\t\treturn prop.type.charAt(0).toUpperCase() + prop.type.slice(1);\n\t}\n\n\tprivate getPropertyDecorator(prop: EntityProperty): string {\n\t\tconst padding = '\\t';\n\t\tconst options = {} as Dictionary;\n\t\tlet decorator = this.getDecoratorType(prop);\n\n\t\tif (prop.kind === ReferenceKind.MANY_TO_MANY) {\n\t\t\tthis.getManyToManyDecoratorOptions(options, prop);\n\t\t} else if (prop.kind === ReferenceKind.ONE_TO_MANY) {\n\t\t\tthis.getOneToManyDecoratorOptions(options, prop);\n\t\t} else if (prop.kind !== ReferenceKind.SCALAR) {\n\t\t\tthis.getForeignKeyDecoratorOptions(options, prop);\n\t\t}\n\n\t\tthis.getCommonDecoratorOptions(options, prop);\n\t\tdecorator = [decorator].map((d) => padding + d).join('\\n');\n\n\t\tif (!Utils.hasObjectKeys(options)) {\n\t\t\treturn `${decorator}(() => ${this.getGraphQLPropertyType(prop)})\\n`;\n\t\t}\n\n\t\treturn `${decorator}(() => ${this.getGraphQLPropertyType(prop)}, { ${Object.entries(options)\n\t\t\t.map(([opt, val]) => `${opt}: ${JSON.stringify(val).replaceAll('\"', '')}`)\n\t\t\t.join(', ')} })\\n`;\n\t}\n\n\tprotected getCommonDecoratorOptions(options: Dictionary, prop: EntityProperty): void {\n\t\tif (prop.nullable && !prop.mappedBy) {\n\t\t\toptions.nullable = true;\n\t\t}\n\n\t\tif (prop.primary) {\n\t\t\toptions.primaryKeyField = true;\n\t\t}\n\n\t\t// If there's a property called 'name' it should be the summary field. If not, and there's a field called 'title'\n\t\t// then it should be the summary field.\n\t\tif (prop.name === 'name') {\n\t\t\toptions.adminUIOptions = { summaryField: true };\n\t\t} else if (prop.name === 'title' && !this.meta.props.find((prop) => prop.name === 'name')) {\n\t\t\toptions.adminUIOptions = { summaryField: true };\n\t\t}\n\t}\n\n\tprotected getManyToManyDecoratorOptions(options: Dictionary, prop: EntityProperty) {\n\t\tthis.entityImports.add(prop.type);\n\t\toptions.relatedField = this.quote(pluralize(pascalToCamelCaseString(this.meta.className)));\n\t}\n\n\tprotected getOneToManyDecoratorOptions(options: Dictionary, prop: EntityProperty) {\n\t\tthis.entityImports.add(prop.type);\n\t\toptions.relatedField = this.quote(prop.mappedBy);\n\t}\n\n\tprotected getForeignKeyDecoratorOptions(options: Dictionary, prop: EntityProperty) {\n\t\tthis.entityImports.add(prop.type);\n\n\t\tconst relatedEntity = this.entityLookup.get(prop.type);\n\t\tif (!relatedEntity) {\n\t\t\tthrow new Error(\n\t\t\t\t`Internal Error: Related entity ${prop.type} should exist but could not be found in the entity lookup.`\n\t\t\t);\n\t\t}\n\t\tif (relatedEntity.primaryKeys.length !== 1) {\n\t\t\tthrow new Error(`Composite primary keys are not supported.`);\n\t\t}\n\t\tconst [primaryKey] = relatedEntity.getPrimaryProps();\n\n\t\toptions.id = `(entity) => entity.${prop.name}?.unwrap().${primaryKey.name}`;\n\t}\n\n\tprotected getDecoratorType(prop: EntityProperty): string {\n\t\tif ([ReferenceKind.ONE_TO_ONE, ReferenceKind.MANY_TO_ONE].includes(prop.kind)) {\n\t\t\tthis.coreImports.add('RelationshipField');\n\t\t\treturn `@RelationshipField<${this.meta.className}>`;\n\t\t}\n\n\t\tif ([ReferenceKind.ONE_TO_MANY, ReferenceKind.MANY_TO_MANY].includes(prop.kind)) {\n\t\t\tthis.coreImports.add('RelationshipField');\n\t\t\treturn `@RelationshipField<${prop.type}>`;\n\t\t}\n\n\t\tthis.coreImports.add('Field');\n\t\treturn '@Field';\n\t}\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["prop", "pluralize"]
7
7
  }
@@ -32,25 +32,9 @@ class SchemaIndexFile {
32
32
  return "index.ts";
33
33
  }
34
34
  generate() {
35
- let file = "export const resolvers = [\n";
36
- const padding = " ";
37
- const imports = [];
38
- const exports = [];
39
- for (const meta of this.metadata) {
40
- if (!meta.pivotTable) {
41
- const filename = meta.className.replace(/([a-z0–9])([A-Z])/g, "$1-$2").toLowerCase();
42
- exports.push(`export * from './${filename}';`);
43
- imports.push(`import { ${meta.className}Resolver } from './${filename}';`);
44
- file += `${padding}${meta.className}Resolver,
45
- `;
46
- }
47
- }
48
- file += "];\n";
49
- return `${imports.join("\n")}
50
-
51
- ${exports.join("\n")}
52
-
53
- ${file}`;
35
+ return this.metadata.filter((meta) => !meta.pivotTable).map(
36
+ (meta) => `import './${meta.className.replace(/([a-z0–9])([A-Z])/g, "$1-$2").toLowerCase()}';`
37
+ ).join("\n") + "\n";
54
38
  }
55
39
  }
56
40
  // Annotate the CommonJS export names for ESM import in node:
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/introspection/files/schema-index-file.ts"],
4
- "sourcesContent": ["import { EntityMetadata } from '@mikro-orm/core';\n\nexport class SchemaIndexFile {\n\tconstructor(protected readonly metadata: EntityMetadata<any>[]) {}\n\n\tgetBasePath() {\n\t\treturn `backend/schema`;\n\t}\n\n\tgetBaseName() {\n\t\treturn 'index.ts';\n\t}\n\n\tgenerate(): string {\n\t\tlet file = 'export const resolvers = [\\n';\n\t\tconst padding = '\\t';\n\t\tconst imports: string[] = [];\n\t\tconst exports: string[] = [];\n\n\t\tfor (const meta of this.metadata) {\n\t\t\tif (!meta.pivotTable) {\n\t\t\t\tconst filename = meta.className.replace(/([a-z0\u20139])([A-Z])/g, '$1-$2').toLowerCase();\n\t\t\t\texports.push(`export * from './${filename}';`);\n\t\t\t\timports.push(`import { ${meta.className}Resolver } from './${filename}';`);\n\t\t\t\tfile += `${padding}${meta.className}Resolver,\\n`;\n\t\t\t}\n\t\t}\n\n\t\tfile += '];\\n';\n\n\t\treturn `${imports.join('\\n')}\\n\\n${exports.join('\\n')}\\n\\n${file}`;\n\t}\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,MAAM,gBAAgB;AAAA,EAC5B,YAA+B,UAAiC;AAAjC;AAAA,EAAkC;AAAA,EAEjE,cAAc;AACb,WAAO;AAAA,EACR;AAAA,EAEA,cAAc;AACb,WAAO;AAAA,EACR;AAAA,EAEA,WAAmB;AAClB,QAAI,OAAO;AACX,UAAM,UAAU;AAChB,UAAM,UAAoB,CAAC;AAC3B,UAAM,UAAoB,CAAC;AAE3B,eAAW,QAAQ,KAAK,UAAU;AACjC,UAAI,CAAC,KAAK,YAAY;AACrB,cAAM,WAAW,KAAK,UAAU,QAAQ,sBAAsB,OAAO,EAAE,YAAY;AACnF,gBAAQ,KAAK,oBAAoB,YAAY;AAC7C,gBAAQ,KAAK,YAAY,KAAK,+BAA+B,YAAY;AACzE,gBAAQ,GAAG,UAAU,KAAK;AAAA;AAAA,MAC3B;AAAA,IACD;AAEA,YAAQ;AAER,WAAO,GAAG,QAAQ,KAAK,IAAI;AAAA;AAAA,EAAQ,QAAQ,KAAK,IAAI;AAAA;AAAA,EAAQ;AAAA,EAC7D;AACD;",
4
+ "sourcesContent": ["import { EntityMetadata } from '@mikro-orm/core';\n\nexport class SchemaIndexFile {\n\tconstructor(protected readonly metadata: EntityMetadata<any>[]) {}\n\n\tgetBasePath() {\n\t\treturn `backend/schema`;\n\t}\n\n\tgetBaseName() {\n\t\treturn 'index.ts';\n\t}\n\n\tgenerate(): string {\n\t\treturn (\n\t\t\tthis.metadata\n\t\t\t\t.filter((meta) => !meta.pivotTable)\n\t\t\t\t.map(\n\t\t\t\t\t(meta) =>\n\t\t\t\t\t\t`import './${meta.className.replace(/([a-z0\u20139])([A-Z])/g, '$1-$2').toLowerCase()}';`\n\t\t\t\t)\n\t\t\t\t.join('\\n') + '\\n'\n\t\t);\n\t}\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,MAAM,gBAAgB;AAAA,EAC5B,YAA+B,UAAiC;AAAjC;AAAA,EAAkC;AAAA,EAEjE,cAAc;AACb,WAAO;AAAA,EACR;AAAA,EAEA,cAAc;AACb,WAAO;AAAA,EACR;AAAA,EAEA,WAAmB;AAClB,WACC,KAAK,SACH,OAAO,CAAC,SAAS,CAAC,KAAK,UAAU,EACjC;AAAA,MACA,CAAC,SACA,aAAa,KAAK,UAAU,QAAQ,sBAAsB,OAAO,EAAE,YAAY,CAAC;AAAA,IAClF,EACC,KAAK,IAAI,IAAI;AAAA,EAEjB;AACD;",
6
6
  "names": []
7
7
  }
@@ -18,6 +18,10 @@ var __copyProps = (to, from, except, desc) => {
18
18
  return to;
19
19
  };
20
20
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
21
25
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
26
  mod
23
27
  ));
@@ -62,8 +66,7 @@ const generateBidirectionalRelations = (metadata) => {
62
66
  };
63
67
  const inverseMeta = metadata.find((m) => m.className === meta.className);
64
68
  const inverseProp = inverseMeta?.props.find((p) => p.name === newProp.mappedBy);
65
- if (inverseProp)
66
- inverseProp.inversedBy = newProp.name;
69
+ if (inverseProp) inverseProp.inversedBy = newProp.name;
67
70
  if (prop.kind === import_core.ReferenceKind.MANY_TO_ONE) {
68
71
  const name = (0, import_utils.pascalToCamelCaseString)(meta.className);
69
72
  newProp.name = (0, import_pluralize.default)(name);
@@ -83,13 +86,16 @@ const generateBidirectionalRelations = (metadata) => {
83
86
  }
84
87
  }
85
88
  };
86
- const detectManyToManyRelations = (metadata, namingStrategy) => {
89
+ const detectManyToManyRelations = (metadata) => {
87
90
  for (const meta of metadata) {
88
- if (meta.compositePK && meta.primaryKeys.length === meta.relations.length && meta.relations.length === 2 && meta.relations.length === meta.props.length && meta.relations.every((prop) => prop.kind === import_core.ReferenceKind.MANY_TO_ONE)) {
91
+ if (meta.compositePK && // needs to have composite PK
92
+ meta.primaryKeys.length === meta.relations.length && // all relations are PKs
93
+ meta.relations.length === 2 && // there are exactly two relation properties
94
+ meta.relations.length === meta.props.length && // all properties are relations
95
+ meta.relations.every((prop) => prop.kind === import_core.ReferenceKind.MANY_TO_ONE)) {
89
96
  meta.pivotTable = true;
90
97
  const owner = metadata.find((m) => m.className === meta.relations[0].type);
91
- if (!owner)
92
- throw new Error("No Owner");
98
+ if (!owner) throw new Error("No Owner");
93
99
  const name = (0, import_utils.pascalToCamelCaseString)(meta.relations?.[1]?.type);
94
100
  owner.addProperty({
95
101
  name: (0, import_pluralize.default)(name),
@@ -152,8 +158,7 @@ Import Failed: Duplicate foreign keys detected on column/s (${columnNames.toStri
152
158
  };
153
159
  const convertSchemaToMetadata = async (schema, platform, namingStrategy) => {
154
160
  const helper = platform.getSchemaHelper();
155
- if (!helper)
156
- throw new Error("cannot connect to database");
161
+ if (!helper) throw new Error("cannot connect to database");
157
162
  const metadata = schema.getTables().sort((a, b) => a.name.localeCompare(b.name)).map((table) => {
158
163
  assertUniqueForeignKeys(table);
159
164
  return table.getEntityDeclaration(namingStrategy, helper, "never");
@@ -165,7 +170,7 @@ const convertSchemaToMetadata = async (schema, platform, namingStrategy) => {
165
170
  );
166
171
  }
167
172
  convertToCamelCasePropertyNames(metadata);
168
- detectManyToManyRelations(metadata, namingStrategy);
173
+ detectManyToManyRelations(metadata);
169
174
  generateIdentifiedReferences(metadata);
170
175
  generateBidirectionalRelations(metadata);
171
176
  generateSingularTypeReferences(metadata);
@@ -208,23 +213,21 @@ const generate = async (databaseType, options) => {
208
213
  const schema = await import_knex.DatabaseSchema.create(connection, platform, config);
209
214
  console.log("Building metadata...");
210
215
  const metadata = await convertSchemaToMetadata(schema, platform, namingStrategy);
216
+ const entityLookup = /* @__PURE__ */ new Map();
217
+ for (const meta of metadata) {
218
+ entityLookup.set(meta.className, meta);
219
+ }
211
220
  const source = [];
212
221
  const summaryOfEntities = [];
213
222
  for (const meta of metadata) {
214
223
  if (!meta.pivotTable) {
215
224
  const dataEntityFile = new import_files.DataEntityFile(meta, namingStrategy, platform, databaseType);
216
- const schemaEntityFile = new import_files.SchemaEntityFile(meta, namingStrategy, platform);
217
- const schemaIndexFile = new import_files.SchemaEntityIndexFile(meta, namingStrategy, platform);
218
- const schemaResolverFile = new import_files.SchemaResolverFile(meta, namingStrategy, platform);
219
- source.push(dataEntityFile, schemaEntityFile, schemaIndexFile, schemaResolverFile);
225
+ const schemaEntityFile = new import_files.SchemaEntityFile(meta, namingStrategy, platform, entityLookup);
226
+ source.push(dataEntityFile, schemaEntityFile);
220
227
  summaryOfEntities.push({
221
228
  name: meta.className,
222
229
  entityFilePath: `${dataEntityFile.getBasePath()}${dataEntityFile.getBaseName()}`,
223
- schemaFilePath: `${schemaIndexFile.getBasePath()}: ${[
224
- schemaIndexFile.getBaseName(),
225
- schemaEntityFile.getBaseName(),
226
- schemaResolverFile.getBaseName()
227
- ].join(", ")}`
230
+ schemaFilePath: `${schemaEntityFile.getBasePath()}${schemaEntityFile.getBaseName()}`
228
231
  });
229
232
  }
230
233
  }
@@ -250,8 +253,7 @@ Imported ${summaryOfEntities.length} entities, creating the above files in your
250
253
  );
251
254
  return files;
252
255
  } catch (err) {
253
- if (err instanceof IntrospectionError)
254
- throw err;
256
+ if (err instanceof IntrospectionError) throw err;
255
257
  throw new IntrospectionError(
256
258
  `Warning: Unable to connect to database.`,
257
259
  hasErrorMessage(err) ? err.message : "Please check the connection settings and try again"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/introspection/generate.ts"],
4
- "sourcesContent": ["import { DatabaseSchema, AbstractSqlPlatform, DatabaseTable } from '@mikro-orm/knex';\nimport {\n\tEntityMetadata,\n\tEntityProperty,\n\tNamingStrategy,\n\tReferenceKind,\n\tUtils,\n} from '@mikro-orm/core';\nimport pluralize from 'pluralize';\n\nimport { ConnectionManager, ConnectionOptions, DatabaseType } from '../database';\nimport {\n\tDataEntityFile,\n\tDataEntityIndexFile,\n\tDataSourceIndexFile,\n\tSchemaEntityFile,\n\tSchemaIndexFile,\n\tSchemaResolverFile,\n\tSchemaEntityIndexFile,\n\tDatabaseFile,\n} from './files';\nimport { pascalToCamelCaseString } from './utils';\n\nconst CONNECTION_MANAGER_ID = 'generate';\n\nexport class IntrospectionError extends Error {\n\tprotected type: string;\n\tconstructor(\n\t\tprotected title = '',\n\t\tmessage = ''\n\t) {\n\t\tsuper(message);\n\t\tthis.type = 'IntrospectionError';\n\t\tthis.title = title;\n\t\tthis.message = message;\n\t}\n}\n\nconst hasErrorMessage = (error: any): error is { message: string } => error.message;\n\nconst generateBidirectionalRelations = (metadata: EntityMetadata[]): void => {\n\tfor (const meta of metadata.filter((m) => !m.pivotTable)) {\n\t\tfor (const prop of meta.relations) {\n\t\t\tif (!prop.name.includes('Inverse')) {\n\t\t\t\tconst targetMeta = metadata.find((m) => m.className === prop.type);\n\t\t\t\tconst newProp = {\n\t\t\t\t\tname: prop.name + 'Inverse',\n\t\t\t\t\ttype: meta.className,\n\t\t\t\t\tjoinColumns: prop.fieldNames,\n\t\t\t\t\treferencedTableName: meta.tableName,\n\t\t\t\t\treferencedColumnNames: Utils.flatten(\n\t\t\t\t\t\t(targetMeta?.getPrimaryProps() ?? []).map((pk) => pk.fieldNames)\n\t\t\t\t\t),\n\t\t\t\t\tmappedBy: prop.name,\n\t\t\t\t} as EntityProperty;\n\n\t\t\t\t// Add reference to the inverse entity\n\t\t\t\tconst inverseMeta = metadata.find((m) => m.className === meta.className);\n\t\t\t\tconst inverseProp = inverseMeta?.props.find((p) => p.name === newProp.mappedBy);\n\t\t\t\tif (inverseProp) inverseProp.inversedBy = newProp.name;\n\n\t\t\t\tif (prop.kind === ReferenceKind.MANY_TO_ONE) {\n\t\t\t\t\tconst name = pascalToCamelCaseString(meta.className);\n\t\t\t\t\tnewProp.name = pluralize(name);\n\t\t\t\t\tnewProp.kind = ReferenceKind.ONE_TO_MANY;\n\t\t\t\t} else if (prop.kind === ReferenceKind.ONE_TO_ONE && !prop.mappedBy) {\n\t\t\t\t\tnewProp.kind = ReferenceKind.ONE_TO_ONE;\n\t\t\t\t\tnewProp.nullable = true;\n\t\t\t\t} else if (prop.kind === ReferenceKind.MANY_TO_MANY && !prop.mappedBy) {\n\t\t\t\t\tconst name = pascalToCamelCaseString(meta.className);\n\t\t\t\t\tnewProp.name = pluralize(name);\n\t\t\t\t\tnewProp.kind = ReferenceKind.MANY_TO_MANY;\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\ttargetMeta?.addProperty(newProp);\n\t\t\t}\n\t\t}\n\t}\n};\n\nconst detectManyToManyRelations = (metadata: EntityMetadata[], namingStrategy: NamingStrategy) => {\n\tfor (const meta of metadata) {\n\t\tif (\n\t\t\tmeta.compositePK && // needs to have composite PK\n\t\t\tmeta.primaryKeys.length === meta.relations.length && // all relations are PKs\n\t\t\tmeta.relations.length === 2 && // there are exactly two relation properties\n\t\t\tmeta.relations.length === meta.props.length && // all properties are relations\n\t\t\tmeta.relations.every((prop) => prop.kind === ReferenceKind.MANY_TO_ONE) // all relations are m:1\n\t\t) {\n\t\t\tmeta.pivotTable = true;\n\t\t\tconst owner = metadata.find((m) => m.className === meta.relations[0].type);\n\t\t\tif (!owner) throw new Error('No Owner');\n\t\t\tconst name = pascalToCamelCaseString(meta.relations?.[1]?.type);\n\t\t\towner.addProperty({\n\t\t\t\tname: pluralize(name),\n\t\t\t\tkind: ReferenceKind.MANY_TO_MANY,\n\t\t\t\tpivotTable: meta.tableName,\n\t\t\t\ttype: meta.relations[1].type,\n\t\t\t\tjoinColumns: meta.relations[0].fieldNames,\n\t\t\t\tinverseJoinColumns: meta.relations[1].fieldNames,\n\t\t\t} as EntityProperty);\n\t\t}\n\t}\n};\n\nconst generateIdentifiedReferences = (metadata: EntityMetadata[]): void => {\n\tfor (const meta of metadata.filter((m) => !m.pivotTable)) {\n\t\tfor (const prop of meta.relations) {\n\t\t\tif ([ReferenceKind.MANY_TO_ONE, ReferenceKind.ONE_TO_ONE].includes(prop.kind)) {\n\t\t\t\tconst name = pascalToCamelCaseString(prop.type);\n\t\t\t\tprop.name = pluralize.singular(name);\n\t\t\t\tprop.ref = true;\n\t\t\t}\n\t\t}\n\t}\n};\n\nconst generateSingularTypeReferences = (metadata: EntityMetadata[]): void => {\n\tfor (const meta of metadata.filter((m) => !m.pivotTable)) {\n\t\tmeta.className = pluralize.singular(meta.className);\n\t\tfor (const prop of meta.relations) {\n\t\t\tprop.type = pluralize.singular(prop.type);\n\t\t}\n\t}\n};\n\n// Convert properties like FirstName to firstName\nconst convertToCamelCasePropertyNames = (metadata: EntityMetadata[]): void => {\n\tfor (const meta of metadata.filter((m) => !m.pivotTable)) {\n\t\tconst props = Object.values(meta.properties);\n\t\tprops.forEach((prop) => {\n\t\t\tprop.name = pascalToCamelCaseString(prop.name);\n\t\t});\n\t}\n};\n\nconst assertUniqueForeignKeys = (table: DatabaseTable): void => {\n\tconst uniqueForeignKeys = new Set();\n\tconst definedForeignKeys = Object.values(table.getForeignKeys());\n\n\tfor (const foreignKey of definedForeignKeys) {\n\t\tconst { localTableName, referencedTableName, columnNames, referencedColumnNames } = foreignKey;\n\t\tconst serializedValue = JSON.stringify({\n\t\t\tlocalTableName,\n\t\t\tcolumnNames: columnNames.sort(),\n\t\t\treferencedTableName,\n\t\t\treferencedColumnNames: referencedColumnNames.sort(),\n\t\t});\n\n\t\tif (uniqueForeignKeys.has(serializedValue)) {\n\t\t\tthrow new Error(\n\t\t\t\t`\\n\\nImport Failed: Duplicate foreign keys detected on column/s (${columnNames.toString()}) in table \"${\n\t\t\t\t\ttable.name\n\t\t\t\t}\".`\n\t\t\t);\n\t\t}\n\n\t\tuniqueForeignKeys.add(serializedValue);\n\t}\n};\n\nconst convertSchemaToMetadata = async (\n\tschema: DatabaseSchema,\n\tplatform: AbstractSqlPlatform,\n\tnamingStrategy: NamingStrategy\n) => {\n\tconst helper = platform.getSchemaHelper();\n\n\tif (!helper) throw new Error('cannot connect to database');\n\n\tconst metadata = schema\n\t\t.getTables()\n\t\t.sort((a, b) => a.name.localeCompare(b.name))\n\t\t.map((table) => {\n\t\t\tassertUniqueForeignKeys(table);\n\t\t\treturn table.getEntityDeclaration(namingStrategy, helper, 'never');\n\t\t});\n\n\tif (metadata.length === 0) {\n\t\tthrow new IntrospectionError(\n\t\t\t`Warning: No tables found, this database is empty.`,\n\t\t\t`Make sure you have tables in this database and then try again.`\n\t\t);\n\t}\n\n\tconvertToCamelCasePropertyNames(metadata);\n\tdetectManyToManyRelations(metadata, namingStrategy);\n\tgenerateIdentifiedReferences(metadata);\n\tgenerateBidirectionalRelations(metadata);\n\tgenerateSingularTypeReferences(metadata);\n\n\treturn metadata;\n};\n\nconst openConnection = async (type: DatabaseType, options: ConnectionOptions) => {\n\t// eslint-disable-next-line @typescript-eslint/no-var-requires\n\tconst module = require(`@mikro-orm/${type}`);\n\tconst PLATFORMS = {\n\t\tmysql: 'MySqlDriver',\n\t\tpostgresql: 'PostgreSqlDriver',\n\t\tsqlite: 'SqliteDriver',\n\t};\n\tawait ConnectionManager.connect(CONNECTION_MANAGER_ID, {\n\t\tmikroOrmConfig: {\n\t\t\tdriver: module[PLATFORMS[type]],\n\t\t\t...options.mikroOrmConfig,\n\t\t},\n\t});\n};\n\nconst closeConnection = async () => {\n\tconsole.log('Closing database connection...');\n\tawait ConnectionManager.close(CONNECTION_MANAGER_ID);\n\tconsole.log('Database connection closed.');\n};\n\ntype File =\n\t| DataEntityFile\n\t| SchemaEntityFile\n\t| SchemaEntityIndexFile\n\t| SchemaIndexFile\n\t| SchemaResolverFile\n\t| DataEntityIndexFile\n\t| DataSourceIndexFile\n\t| DatabaseFile;\n\nexport const generate = async (databaseType: DatabaseType, options: ConnectionOptions) => {\n\ttry {\n\t\tawait openConnection(databaseType, options);\n\n\t\tconst database = ConnectionManager.database(CONNECTION_MANAGER_ID);\n\t\tif (!database)\n\t\t\tthrow new IntrospectionError(\n\t\t\t\t`Warning: Unable to connect to database.`,\n\t\t\t\t'Please check the connection settings and try again'\n\t\t\t);\n\n\t\tconst config = database.em.config;\n\t\tconst driver = database.em.getDriver();\n\t\tconst platform = driver.getPlatform();\n\t\tconst namingStrategy = config.getNamingStrategy();\n\t\tconst connection = driver.getConnection();\n\n\t\tconsole.log('Fetching database schema...');\n\t\tconst schema = await DatabaseSchema.create(connection, platform, config);\n\t\tconsole.log('Building metadata...');\n\t\tconst metadata = await convertSchemaToMetadata(schema, platform, namingStrategy);\n\n\t\tconst source: File[] = [];\n\n\t\tconst summaryOfEntities: { name: string; entityFilePath: string; schemaFilePath: string }[] =\n\t\t\t[];\n\n\t\tfor (const meta of metadata) {\n\t\t\tif (!meta.pivotTable) {\n\t\t\t\tconst dataEntityFile = new DataEntityFile(meta, namingStrategy, platform, databaseType);\n\t\t\t\tconst schemaEntityFile = new SchemaEntityFile(meta, namingStrategy, platform);\n\t\t\t\tconst schemaIndexFile = new SchemaEntityIndexFile(meta, namingStrategy, platform);\n\t\t\t\tconst schemaResolverFile = new SchemaResolverFile(meta, namingStrategy, platform);\n\t\t\t\tsource.push(dataEntityFile, schemaEntityFile, schemaIndexFile, schemaResolverFile);\n\t\t\t\tsummaryOfEntities.push({\n\t\t\t\t\tname: meta.className,\n\t\t\t\t\tentityFilePath: `${dataEntityFile.getBasePath()}${dataEntityFile.getBaseName()}`,\n\t\t\t\t\tschemaFilePath: `${schemaIndexFile.getBasePath()}: ${[\n\t\t\t\t\t\tschemaIndexFile.getBaseName(),\n\t\t\t\t\t\tschemaEntityFile.getBaseName(),\n\t\t\t\t\t\tschemaResolverFile.getBaseName(),\n\t\t\t\t\t].join(', ')}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Export all the entities from the data source directory\n\t\tsource.push(new DataEntityIndexFile(metadata, databaseType));\n\t\t// Export the data source from the entities directory\n\t\tsource.push(new DataSourceIndexFile(databaseType));\n\t\t// Export the data source from the entities directory\n\t\tsource.push(new SchemaIndexFile(metadata));\n\t\t// Export the database connection to its own file\n\t\tsource.push(new DatabaseFile(databaseType, options));\n\n\t\tconst files = source.map((file) => {\n\t\t\treturn {\n\t\t\t\tpath: file.getBasePath(),\n\t\t\t\tname: file.getBaseName(),\n\t\t\t\tcontents: file.generate(),\n\t\t\t\tneedOverwriteWarning: !![DatabaseFile, SchemaIndexFile].some((cls) => file instanceof cls),\n\t\t\t};\n\t\t});\n\n\t\tawait closeConnection();\n\n\t\tconsole.log('\\nImport Summary:');\n\t\tconsole.table(summaryOfEntities);\n\t\tconsole.log(\n\t\t\t`\\nImported ${summaryOfEntities.length} entities, creating the above files in your Graphweaver project. \\n`\n\t\t);\n\n\t\treturn files;\n\t} catch (err) {\n\t\tif (err instanceof IntrospectionError) throw err;\n\n\t\tthrow new IntrospectionError(\n\t\t\t`Warning: Unable to connect to database.`,\n\t\t\thasErrorMessage(err) ? err.message : 'Please check the connection settings and try again'\n\t\t);\n\t}\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { DatabaseSchema, AbstractSqlPlatform, DatabaseTable } from '@mikro-orm/knex';\nimport {\n\tEntityMetadata,\n\tEntityProperty,\n\tNamingStrategy,\n\tReferenceKind,\n\tUtils,\n} from '@mikro-orm/core';\nimport pluralize from 'pluralize';\n\nimport { ConnectionManager, ConnectionOptions, DatabaseType } from '../database';\nimport {\n\tDataEntityFile,\n\tDataEntityIndexFile,\n\tDataSourceIndexFile,\n\tSchemaEntityFile,\n\tSchemaIndexFile,\n\tDatabaseFile,\n} from './files';\nimport { pascalToCamelCaseString } from './utils';\n\nconst CONNECTION_MANAGER_ID = 'generate';\n\nexport class IntrospectionError extends Error {\n\tprotected type: string;\n\tconstructor(\n\t\tprotected title = '',\n\t\tmessage = ''\n\t) {\n\t\tsuper(message);\n\t\tthis.type = 'IntrospectionError';\n\t\tthis.title = title;\n\t\tthis.message = message;\n\t}\n}\n\nconst hasErrorMessage = (error: any): error is { message: string } => error.message;\n\nconst generateBidirectionalRelations = (metadata: EntityMetadata[]): void => {\n\tfor (const meta of metadata.filter((m) => !m.pivotTable)) {\n\t\tfor (const prop of meta.relations) {\n\t\t\tif (!prop.name.includes('Inverse')) {\n\t\t\t\tconst targetMeta = metadata.find((m) => m.className === prop.type);\n\t\t\t\tconst newProp = {\n\t\t\t\t\tname: prop.name + 'Inverse',\n\t\t\t\t\ttype: meta.className,\n\t\t\t\t\tjoinColumns: prop.fieldNames,\n\t\t\t\t\treferencedTableName: meta.tableName,\n\t\t\t\t\treferencedColumnNames: Utils.flatten(\n\t\t\t\t\t\t(targetMeta?.getPrimaryProps() ?? []).map((pk) => pk.fieldNames)\n\t\t\t\t\t),\n\t\t\t\t\tmappedBy: prop.name,\n\t\t\t\t} as EntityProperty;\n\n\t\t\t\t// Add reference to the inverse entity\n\t\t\t\tconst inverseMeta = metadata.find((m) => m.className === meta.className);\n\t\t\t\tconst inverseProp = inverseMeta?.props.find((p) => p.name === newProp.mappedBy);\n\t\t\t\tif (inverseProp) inverseProp.inversedBy = newProp.name;\n\n\t\t\t\tif (prop.kind === ReferenceKind.MANY_TO_ONE) {\n\t\t\t\t\tconst name = pascalToCamelCaseString(meta.className);\n\t\t\t\t\tnewProp.name = pluralize(name);\n\t\t\t\t\tnewProp.kind = ReferenceKind.ONE_TO_MANY;\n\t\t\t\t} else if (prop.kind === ReferenceKind.ONE_TO_ONE && !prop.mappedBy) {\n\t\t\t\t\tnewProp.kind = ReferenceKind.ONE_TO_ONE;\n\t\t\t\t\tnewProp.nullable = true;\n\t\t\t\t} else if (prop.kind === ReferenceKind.MANY_TO_MANY && !prop.mappedBy) {\n\t\t\t\t\tconst name = pascalToCamelCaseString(meta.className);\n\t\t\t\t\tnewProp.name = pluralize(name);\n\t\t\t\t\tnewProp.kind = ReferenceKind.MANY_TO_MANY;\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\ttargetMeta?.addProperty(newProp);\n\t\t\t}\n\t\t}\n\t}\n};\n\nconst detectManyToManyRelations = (metadata: EntityMetadata[]) => {\n\tfor (const meta of metadata) {\n\t\tif (\n\t\t\tmeta.compositePK && // needs to have composite PK\n\t\t\tmeta.primaryKeys.length === meta.relations.length && // all relations are PKs\n\t\t\tmeta.relations.length === 2 && // there are exactly two relation properties\n\t\t\tmeta.relations.length === meta.props.length && // all properties are relations\n\t\t\tmeta.relations.every((prop) => prop.kind === ReferenceKind.MANY_TO_ONE) // all relations are m:1\n\t\t) {\n\t\t\tmeta.pivotTable = true;\n\t\t\tconst owner = metadata.find((m) => m.className === meta.relations[0].type);\n\t\t\tif (!owner) throw new Error('No Owner');\n\t\t\tconst name = pascalToCamelCaseString(meta.relations?.[1]?.type);\n\t\t\towner.addProperty({\n\t\t\t\tname: pluralize(name),\n\t\t\t\tkind: ReferenceKind.MANY_TO_MANY,\n\t\t\t\tpivotTable: meta.tableName,\n\t\t\t\ttype: meta.relations[1].type,\n\t\t\t\tjoinColumns: meta.relations[0].fieldNames,\n\t\t\t\tinverseJoinColumns: meta.relations[1].fieldNames,\n\t\t\t} as EntityProperty);\n\t\t}\n\t}\n};\n\nconst generateIdentifiedReferences = (metadata: EntityMetadata[]): void => {\n\tfor (const meta of metadata.filter((m) => !m.pivotTable)) {\n\t\tfor (const prop of meta.relations) {\n\t\t\tif ([ReferenceKind.MANY_TO_ONE, ReferenceKind.ONE_TO_ONE].includes(prop.kind)) {\n\t\t\t\tconst name = pascalToCamelCaseString(prop.type);\n\t\t\t\tprop.name = pluralize.singular(name);\n\t\t\t\tprop.ref = true;\n\t\t\t}\n\t\t}\n\t}\n};\n\nconst generateSingularTypeReferences = (metadata: EntityMetadata[]): void => {\n\tfor (const meta of metadata.filter((m) => !m.pivotTable)) {\n\t\tmeta.className = pluralize.singular(meta.className);\n\t\tfor (const prop of meta.relations) {\n\t\t\tprop.type = pluralize.singular(prop.type);\n\t\t}\n\t}\n};\n\n// Convert properties like FirstName to firstName\nconst convertToCamelCasePropertyNames = (metadata: EntityMetadata[]): void => {\n\tfor (const meta of metadata.filter((m) => !m.pivotTable)) {\n\t\tconst props = Object.values(meta.properties);\n\t\tprops.forEach((prop) => {\n\t\t\tprop.name = pascalToCamelCaseString(prop.name);\n\t\t});\n\t}\n};\n\nconst assertUniqueForeignKeys = (table: DatabaseTable): void => {\n\tconst uniqueForeignKeys = new Set();\n\tconst definedForeignKeys = Object.values(table.getForeignKeys());\n\n\tfor (const foreignKey of definedForeignKeys) {\n\t\tconst { localTableName, referencedTableName, columnNames, referencedColumnNames } = foreignKey;\n\t\tconst serializedValue = JSON.stringify({\n\t\t\tlocalTableName,\n\t\t\tcolumnNames: columnNames.sort(),\n\t\t\treferencedTableName,\n\t\t\treferencedColumnNames: referencedColumnNames.sort(),\n\t\t});\n\n\t\tif (uniqueForeignKeys.has(serializedValue)) {\n\t\t\tthrow new Error(\n\t\t\t\t`\\n\\nImport Failed: Duplicate foreign keys detected on column/s (${columnNames.toString()}) in table \"${\n\t\t\t\t\ttable.name\n\t\t\t\t}\".`\n\t\t\t);\n\t\t}\n\n\t\tuniqueForeignKeys.add(serializedValue);\n\t}\n};\n\nconst convertSchemaToMetadata = async (\n\tschema: DatabaseSchema,\n\tplatform: AbstractSqlPlatform,\n\tnamingStrategy: NamingStrategy\n) => {\n\tconst helper = platform.getSchemaHelper();\n\n\tif (!helper) throw new Error('cannot connect to database');\n\n\tconst metadata = schema\n\t\t.getTables()\n\t\t.sort((a, b) => a.name.localeCompare(b.name))\n\t\t.map((table) => {\n\t\t\tassertUniqueForeignKeys(table);\n\t\t\treturn table.getEntityDeclaration(namingStrategy, helper, 'never');\n\t\t});\n\n\tif (metadata.length === 0) {\n\t\tthrow new IntrospectionError(\n\t\t\t`Warning: No tables found, this database is empty.`,\n\t\t\t`Make sure you have tables in this database and then try again.`\n\t\t);\n\t}\n\n\tconvertToCamelCasePropertyNames(metadata);\n\tdetectManyToManyRelations(metadata);\n\tgenerateIdentifiedReferences(metadata);\n\tgenerateBidirectionalRelations(metadata);\n\tgenerateSingularTypeReferences(metadata);\n\n\treturn metadata;\n};\n\nconst openConnection = async (type: DatabaseType, options: ConnectionOptions) => {\n\t// eslint-disable-next-line @typescript-eslint/no-var-requires\n\tconst module = require(`@mikro-orm/${type}`);\n\tconst PLATFORMS = {\n\t\tmysql: 'MySqlDriver',\n\t\tpostgresql: 'PostgreSqlDriver',\n\t\tsqlite: 'SqliteDriver',\n\t};\n\tawait ConnectionManager.connect(CONNECTION_MANAGER_ID, {\n\t\tmikroOrmConfig: {\n\t\t\tdriver: module[PLATFORMS[type]],\n\t\t\t...options.mikroOrmConfig,\n\t\t},\n\t});\n};\n\nconst closeConnection = async () => {\n\tconsole.log('Closing database connection...');\n\tawait ConnectionManager.close(CONNECTION_MANAGER_ID);\n\tconsole.log('Database connection closed.');\n};\n\ntype File =\n\t| DataEntityFile\n\t| SchemaEntityFile\n\t| SchemaIndexFile\n\t| DataEntityIndexFile\n\t| DataSourceIndexFile\n\t| DatabaseFile;\n\nexport const generate = async (databaseType: DatabaseType, options: ConnectionOptions) => {\n\ttry {\n\t\tawait openConnection(databaseType, options);\n\n\t\tconst database = ConnectionManager.database(CONNECTION_MANAGER_ID);\n\t\tif (!database)\n\t\t\tthrow new IntrospectionError(\n\t\t\t\t`Warning: Unable to connect to database.`,\n\t\t\t\t'Please check the connection settings and try again'\n\t\t\t);\n\n\t\tconst config = database.em.config;\n\t\tconst driver = database.em.getDriver();\n\t\tconst platform = driver.getPlatform();\n\t\tconst namingStrategy = config.getNamingStrategy();\n\t\tconst connection = driver.getConnection();\n\n\t\tconsole.log('Fetching database schema...');\n\t\tconst schema = await DatabaseSchema.create(connection, platform, config);\n\t\tconsole.log('Building metadata...');\n\t\tconst metadata = await convertSchemaToMetadata(schema, platform, namingStrategy);\n\n\t\t// Build a lookup for efficient cross-referencing later.\n\t\tconst entityLookup = new Map<string, EntityMetadata<any>>();\n\t\tfor (const meta of metadata) {\n\t\t\tentityLookup.set(meta.className, meta);\n\t\t}\n\n\t\tconst source: File[] = [];\n\n\t\tconst summaryOfEntities: { name: string; entityFilePath: string; schemaFilePath: string }[] =\n\t\t\t[];\n\n\t\tfor (const meta of metadata) {\n\t\t\tif (!meta.pivotTable) {\n\t\t\t\tconst dataEntityFile = new DataEntityFile(meta, namingStrategy, platform, databaseType);\n\t\t\t\tconst schemaEntityFile = new SchemaEntityFile(meta, namingStrategy, platform, entityLookup);\n\t\t\t\tsource.push(dataEntityFile, schemaEntityFile);\n\t\t\t\tsummaryOfEntities.push({\n\t\t\t\t\tname: meta.className,\n\t\t\t\t\tentityFilePath: `${dataEntityFile.getBasePath()}${dataEntityFile.getBaseName()}`,\n\t\t\t\t\tschemaFilePath: `${schemaEntityFile.getBasePath()}${schemaEntityFile.getBaseName()}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Export all the entities from the data source directory\n\t\tsource.push(new DataEntityIndexFile(metadata, databaseType));\n\t\t// Export the data source from the entities directory\n\t\tsource.push(new DataSourceIndexFile(databaseType));\n\t\t// Export the data source from the entities directory\n\t\tsource.push(new SchemaIndexFile(metadata));\n\t\t// Export the database connection to its own file\n\t\tsource.push(new DatabaseFile(databaseType, options));\n\n\t\tconst files = source.map((file) => {\n\t\t\treturn {\n\t\t\t\tpath: file.getBasePath(),\n\t\t\t\tname: file.getBaseName(),\n\t\t\t\tcontents: file.generate(),\n\t\t\t\tneedOverwriteWarning: !![DatabaseFile, SchemaIndexFile].some((cls) => file instanceof cls),\n\t\t\t};\n\t\t});\n\n\t\tawait closeConnection();\n\n\t\tconsole.log('\\nImport Summary:');\n\t\tconsole.table(summaryOfEntities);\n\t\tconsole.log(\n\t\t\t`\\nImported ${summaryOfEntities.length} entities, creating the above files in your Graphweaver project. \\n`\n\t\t);\n\n\t\treturn files;\n\t} catch (err) {\n\t\tif (err instanceof IntrospectionError) throw err;\n\n\t\tthrow new IntrospectionError(\n\t\t\t`Warning: Unable to connect to database.`,\n\t\t\thasErrorMessage(err) ? err.message : 'Please check the connection settings and try again'\n\t\t);\n\t}\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["pluralize", "module"]
7
7
  }
@@ -24,6 +24,7 @@ module.exports = __toCommonJS(clear_database_context_exports);
24
24
  var import_logger = require("@exogee/logger");
25
25
  var import_database = require("../database");
26
26
  const ClearDatabaseContext = {
27
+ // We need to ensure the Entity Manager is clear on each request
27
28
  async requestDidStart() {
28
29
  try {
29
30
  for (const connection of import_database.ConnectionManager.getConnections()) {
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/plugins/clear-database-context.ts"],
4
4
  "sourcesContent": ["import { ApolloServerPlugin } from '@apollo/server';\nimport { logger } from '@exogee/logger';\n\nimport { ConnectionManager } from '../database';\n\nexport const ClearDatabaseContext: ApolloServerPlugin = {\n\t// We need to ensure the Entity Manager is clear on each request\n\tasync requestDidStart() {\n\t\ttry {\n\t\t\tfor (const connection of ConnectionManager.getConnections()) {\n\t\t\t\tconnection.em.clear();\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tlogger.trace('failed to clear default database.');\n\t\t}\n\t},\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAAuB;AAEvB,sBAAkC;AAE3B,MAAM,uBAA2C;AAAA,EAEvD,MAAM,kBAAkB;AACvB,QAAI;AACH,iBAAW,cAAc,kCAAkB,eAAe,GAAG;AAC5D,mBAAW,GAAG,MAAM;AAAA,MACrB;AAAA,IACD,SAAS,KAAP;AACD,2BAAO,MAAM,mCAAmC;AAAA,IACjD;AAAA,EACD;AACD;",
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAAuB;AAEvB,sBAAkC;AAE3B,MAAM,uBAA2C;AAAA;AAAA,EAEvD,MAAM,kBAAkB;AACvB,QAAI;AACH,iBAAW,cAAc,kCAAkB,eAAe,GAAG;AAC5D,mBAAW,GAAG,MAAM;AAAA,MACrB;AAAA,IACD,SAAS,KAAK;AACb,2BAAO,MAAM,mCAAmC;AAAA,IACjD;AAAA,EACD;AACD;",
6
6
  "names": []
7
7
  }
@@ -3,5 +3,5 @@ interface AssignOptions {
3
3
  create?: boolean;
4
4
  update?: boolean;
5
5
  }
6
- export declare const assign: <T extends Partial<T>>(entity: T, data: EntityData<T>, options?: AssignOptions, visited?: Set<Partial<any>>, em?: import("@mikro-orm/knex").EntityManager<import("@mikro-orm/postgresql").PostgreSqlDriver> | import("@mikro-orm/knex").EntityManager<import("@mikro-orm/mysql").MySqlDriver>) => Promise<T>;
6
+ export declare const assign: <T extends Partial<T>>(entity: T, data: EntityData<T>, options?: AssignOptions, visited?: Set<Partial<any>>, em?: import("@mikro-orm/knex").EntityManager<import("@mikro-orm/postgresql").PostgreSqlDriver> | import("@mikro-orm/knex").EntityManager<import("@mikro-orm/mysql").MySqlDriver> | import("@mikro-orm/knex").EntityManager<import("@mikro-orm/sqlite").SqliteDriver>) => Promise<T>;
7
7
  export {};