@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.
- package/lib/config.js.map +1 -1
- package/lib/database.d.ts +3 -3
- package/lib/database.js +7 -11
- package/lib/database.js.map +2 -2
- package/lib/decorators/external-id-field.js.map +2 -2
- package/lib/decorators/index.js +4 -0
- package/lib/entities/audit-change.d.ts +1 -2
- package/lib/entities/audit-change.js +3 -6
- package/lib/entities/audit-change.js.map +2 -2
- package/lib/entities/audit-related-entity-change.d.ts +1 -2
- package/lib/entities/audit-related-entity-change.js +2 -4
- package/lib/entities/audit-related-entity-change.js.map +2 -2
- package/lib/entities/index.d.ts +0 -1
- package/lib/entities/index.js +5 -1
- package/lib/entities/index.js.map +2 -2
- package/lib/index.d.ts +1 -1
- package/lib/index.js +14 -2
- package/lib/index.js.map +2 -2
- package/lib/introspection/files/base-file.js.map +1 -1
- package/lib/introspection/files/data-entity-file.js +10 -12
- package/lib/introspection/files/data-entity-file.js.map +2 -2
- package/lib/introspection/files/data-entity-index-file.js +3 -3
- package/lib/introspection/files/data-entity-index-file.js.map +2 -2
- package/lib/introspection/files/data-source-index-file.js.map +1 -1
- package/lib/introspection/files/database-file.js +2 -2
- package/lib/introspection/files/database-file.js.map +2 -2
- package/lib/introspection/files/index.d.ts +0 -2
- package/lib/introspection/files/index.js +9 -2
- package/lib/introspection/files/index.js.map +2 -2
- package/lib/introspection/files/schema-entity-file.d.ts +2 -1
- package/lib/introspection/files/schema-entity-file.js +41 -25
- package/lib/introspection/files/schema-entity-file.js.map +3 -3
- package/lib/introspection/files/schema-index-file.js +3 -19
- package/lib/introspection/files/schema-index-file.js.map +2 -2
- package/lib/introspection/generate.js +22 -20
- package/lib/introspection/generate.js.map +2 -2
- package/lib/plugins/clear-database-context.js +1 -0
- package/lib/plugins/clear-database-context.js.map +1 -1
- package/lib/{base-resolver → provider}/assign.d.ts +1 -1
- package/lib/{base-resolver → provider}/assign.js +41 -13
- package/lib/provider/assign.js.map +7 -0
- package/lib/{base-resolver → provider}/index.js +7 -3
- package/lib/provider/index.js.map +7 -0
- package/lib/{base-resolver → provider}/provider.d.ts +13 -15
- package/lib/{base-resolver → provider}/provider.js +45 -43
- package/lib/provider/provider.js.map +7 -0
- package/lib/types/date-type.d.ts +5 -5
- package/lib/types/date-type.js +8 -11
- package/lib/types/date-type.js.map +2 -2
- package/lib/types/decimal-type.d.ts +5 -5
- package/lib/types/decimal-type.js +12 -20
- package/lib/types/decimal-type.js.map +2 -2
- package/lib/types/index.js +5 -0
- package/lib/types/time-type.d.ts +5 -5
- package/lib/types/time-type.js +12 -20
- package/lib/types/time-type.js.map +2 -2
- package/lib/utils/authentication-context.js.map +1 -1
- package/lib/utils/change-tracker.js +10 -9
- package/lib/utils/change-tracker.js.map +2 -2
- package/lib/utils/index.js +7 -0
- package/lib/utils/tracked-entity.d.ts +1 -2
- package/lib/utils/tracked-entity.js +2 -4
- package/lib/utils/tracked-entity.js.map +2 -2
- package/lib/utils/untracked-property.d.ts +0 -1
- package/lib/utils/untracked-property.js +0 -1
- package/lib/utils/untracked-property.js.map +2 -2
- package/package.json +20 -20
- package/lib/base-resolver/assign.js.map +0 -7
- package/lib/base-resolver/index.js.map +0 -7
- package/lib/base-resolver/provider.js.map +0 -7
- package/lib/entities/base-entity.d.ts +0 -5
- package/lib/entities/base-entity.js +0 -37
- package/lib/entities/base-entity.js.map +0 -7
- package/lib/introspection/files/schema-entity-index-file.d.ts +0 -6
- package/lib/introspection/files/schema-entity-index-file.js +0 -44
- package/lib/introspection/files/schema-entity-index-file.js.map +0 -7
- package/lib/introspection/files/schema-resolver-file.d.ts +0 -6
- package/lib/introspection/files/schema-resolver-file.js +0 -62
- package/lib/introspection/files/schema-resolver-file.js.map +0 -7
- /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
|
|
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
|
-
${
|
|
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,
|
|
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-
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,0BAAc,+BAAd;AACA,0BAAc,qCADd;AAEA,0BAAc,qCAFd;AAGA,0BAAc,iCAHd;AAIA,0BAAc,
|
|
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
|
-
|
|
47
|
-
return `backend/schema/${dirName}/`;
|
|
51
|
+
return `backend/schema/`;
|
|
48
52
|
}
|
|
49
53
|
getBaseName() {
|
|
50
|
-
|
|
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 = "
|
|
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("
|
|
85
|
-
file += `@
|
|
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.
|
|
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 '
|
|
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 '
|
|
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
|
-
|
|
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\
|
|
5
|
-
"mappings": "
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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\
|
|
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,
|
|
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
|
|
89
|
+
const detectManyToManyRelations = (metadata) => {
|
|
87
90
|
for (const meta of metadata) {
|
|
88
|
-
if (meta.compositePK &&
|
|
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
|
|
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
|
-
|
|
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: `${
|
|
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": "
|
|
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,
|
|
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 {};
|