@solidxai/core 0.1.10 → 0.1.11-beta.1
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/dist/controllers/datasource-introspection.controller.d.ts +234 -0
- package/dist/controllers/datasource-introspection.controller.d.ts.map +1 -0
- package/dist/controllers/datasource-introspection.controller.js +98 -0
- package/dist/controllers/datasource-introspection.controller.js.map +1 -0
- package/dist/controllers/datasource-management.controller.d.ts +18 -0
- package/dist/controllers/datasource-management.controller.d.ts.map +1 -0
- package/dist/controllers/datasource-management.controller.js +55 -0
- package/dist/controllers/datasource-management.controller.js.map +1 -0
- package/dist/dtos/create-datasource-management.dto.d.ts +25 -0
- package/dist/dtos/create-datasource-management.dto.d.ts.map +1 -0
- package/dist/dtos/create-datasource-management.dto.js +169 -0
- package/dist/dtos/create-datasource-management.dto.js.map +1 -0
- package/dist/dtos/datasource-introspection-mapping.dto.d.ts +45 -0
- package/dist/dtos/datasource-introspection-mapping.dto.d.ts.map +1 -0
- package/dist/dtos/datasource-introspection-mapping.dto.js +233 -0
- package/dist/dtos/datasource-introspection-mapping.dto.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces/datasource-introspection-provider.interface.d.ts +26 -0
- package/dist/interfaces/datasource-introspection-provider.interface.d.ts.map +1 -0
- package/dist/interfaces/datasource-introspection-provider.interface.js +3 -0
- package/dist/interfaces/datasource-introspection-provider.interface.js.map +1 -0
- package/dist/repository/scheduled-job.repository.d.ts +3 -0
- package/dist/repository/scheduled-job.repository.d.ts.map +1 -1
- package/dist/repository/scheduled-job.repository.js +60 -0
- package/dist/repository/scheduled-job.repository.js.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.d.ts +32 -1
- package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js +1011 -230
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +21 -0
- package/dist/services/action-metadata.service.d.ts +7 -0
- package/dist/services/action-metadata.service.d.ts.map +1 -1
- package/dist/services/action-metadata.service.js +76 -3
- package/dist/services/action-metadata.service.js.map +1 -1
- package/dist/services/authentication.service.js +1 -1
- package/dist/services/authentication.service.js.map +1 -1
- package/dist/services/dashboard-providers/mq-dashboard-latency-trend-provider.service.d.ts.map +1 -1
- package/dist/services/dashboard-providers/mq-dashboard-latency-trend-provider.service.js +2 -2
- package/dist/services/dashboard-providers/mq-dashboard-latency-trend-provider.service.js.map +1 -1
- package/dist/services/dashboard-providers/mq-dashboard-messages-over-time-provider.service.d.ts.map +1 -1
- package/dist/services/dashboard-providers/mq-dashboard-messages-over-time-provider.service.js +2 -2
- package/dist/services/dashboard-providers/mq-dashboard-messages-over-time-provider.service.js.map +1 -1
- package/dist/services/dashboard-providers/mq-dashboard-provider-utils.d.ts +3 -0
- package/dist/services/dashboard-providers/mq-dashboard-provider-utils.d.ts.map +1 -1
- package/dist/services/dashboard-providers/mq-dashboard-provider-utils.js +71 -0
- package/dist/services/dashboard-providers/mq-dashboard-provider-utils.js.map +1 -1
- package/dist/services/dashboard-providers/mq-dashboard-queue-sla-heatmap-provider.service.d.ts.map +1 -1
- package/dist/services/dashboard-providers/mq-dashboard-queue-sla-heatmap-provider.service.js +3 -3
- package/dist/services/dashboard-providers/mq-dashboard-queue-sla-heatmap-provider.service.js.map +1 -1
- package/dist/services/datasource-introspection/mssql-datasource-introspection-provider.service.d.ts +11 -0
- package/dist/services/datasource-introspection/mssql-datasource-introspection-provider.service.d.ts.map +1 -0
- package/dist/services/datasource-introspection/mssql-datasource-introspection-provider.service.js +181 -0
- package/dist/services/datasource-introspection/mssql-datasource-introspection-provider.service.js.map +1 -0
- package/dist/services/datasource-introspection/mysql-datasource-introspection-provider.service.d.ts +11 -0
- package/dist/services/datasource-introspection/mysql-datasource-introspection-provider.service.d.ts.map +1 -0
- package/dist/services/datasource-introspection/mysql-datasource-introspection-provider.service.js +90 -0
- package/dist/services/datasource-introspection/mysql-datasource-introspection-provider.service.js.map +1 -0
- package/dist/services/datasource-introspection/postgres-datasource-introspection-provider.service.d.ts +11 -0
- package/dist/services/datasource-introspection/postgres-datasource-introspection-provider.service.d.ts.map +1 -0
- package/dist/services/datasource-introspection/postgres-datasource-introspection-provider.service.js +156 -0
- package/dist/services/datasource-introspection/postgres-datasource-introspection-provider.service.js.map +1 -0
- package/dist/services/datasource-introspection.service.d.ts +288 -0
- package/dist/services/datasource-introspection.service.d.ts.map +1 -0
- package/dist/services/datasource-introspection.service.js +1278 -0
- package/dist/services/datasource-introspection.service.js.map +1 -0
- package/dist/services/datasource-management.service.d.ts +60 -0
- package/dist/services/datasource-management.service.d.ts.map +1 -0
- package/dist/services/datasource-management.service.js +461 -0
- package/dist/services/datasource-management.service.js.map +1 -0
- package/dist/services/field-metadata.service.d.ts.map +1 -1
- package/dist/services/field-metadata.service.js +19 -0
- package/dist/services/field-metadata.service.js.map +1 -1
- package/dist/services/model-metadata.service.d.ts +1 -3
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js +47 -15
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/role-metadata.service.d.ts +5 -0
- package/dist/services/role-metadata.service.d.ts.map +1 -1
- package/dist/services/role-metadata.service.js +85 -31
- package/dist/services/role-metadata.service.js.map +1 -1
- package/dist/services/selection-providers/mq-dashboard-message-broker-variable-options-provider.service.d.ts.map +1 -1
- package/dist/services/selection-providers/mq-dashboard-message-broker-variable-options-provider.service.js +2 -3
- package/dist/services/selection-providers/mq-dashboard-message-broker-variable-options-provider.service.js.map +1 -1
- package/dist/services/selection-providers/mq-dashboard-queue-name-variable-options-provider.service.d.ts.map +1 -1
- package/dist/services/selection-providers/mq-dashboard-queue-name-variable-options-provider.service.js +2 -3
- package/dist/services/selection-providers/mq-dashboard-queue-name-variable-options-provider.service.js.map +1 -1
- package/dist/services/setting.service.d.ts +1 -0
- package/dist/services/setting.service.d.ts.map +1 -1
- package/dist/services/setting.service.js +32 -8
- package/dist/services/setting.service.js.map +1 -1
- package/dist/services/solid-ts-morph.service.d.ts +1 -1
- package/dist/services/solid-ts-morph.service.d.ts.map +1 -1
- package/dist/services/solid-ts-morph.service.js.map +1 -1
- package/dist/services/view-metadata.service.d.ts +6 -0
- package/dist/services/view-metadata.service.d.ts.map +1 -1
- package/dist/services/view-metadata.service.js +66 -1
- package/dist/services/view-metadata.service.js.map +1 -1
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +16 -0
- package/dist/solid-core.module.js.map +1 -1
- package/dist-tests/api/authenticate.spec.js +119 -0
- package/dist-tests/api/authenticate.spec.js.map +1 -0
- package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +97 -0
- package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +1 -0
- package/dist-tests/api/ping.spec.js +21 -0
- package/dist-tests/api/ping.spec.js.map +1 -0
- package/dist-tests/helpers/auth.js +41 -0
- package/dist-tests/helpers/auth.js.map +1 -0
- package/dist-tests/helpers/env.js +11 -0
- package/dist-tests/helpers/env.js.map +1 -0
- package/docs/agent-hub-grooming.md +301 -0
- package/docs/dashboards/AGENTIC_DASHBOARD_IMPLEMENTATION_PLAN.md +438 -0
- package/docs/dashboards/dashboard-curl-smoke-tests.txt +146 -0
- package/docs/dashboards/delete-legacy-dashboard-metadata.sql +172 -0
- package/docs/datasource-introspection-ddl-analysis.md +326 -0
- package/docs/datasource-introspection-implementation-plan.md +306 -0
- package/docs/grouping-enhancements.md +89 -0
- package/docs/java-spring/README.md +3 -0
- package/docs/java-spring/solid-core-module-deep-dive-report.md +1317 -0
- package/docs/module-package-import-handoff.md +691 -0
- package/docs/seed-changes.md +65 -0
- package/docs/test-data-workflow.md +200 -0
- package/docs/type-declaration-import-issue.md +24 -0
- package/package.json +1 -1
- package/src/controllers/datasource-introspection.controller.ts +58 -0
- package/src/controllers/datasource-management.controller.ts +24 -0
- package/src/dtos/create-datasource-management.dto.ts +139 -0
- package/src/dtos/datasource-introspection-mapping.dto.ts +182 -0
- package/src/index.ts +5 -0
- package/src/interfaces/datasource-introspection-provider.interface.ts +28 -0
- package/src/repository/scheduled-job.repository.ts +73 -0
- package/src/seeders/module-metadata-seeder.service.ts +1223 -262
- package/src/seeders/seed-data/solid-core-metadata.json +22 -1
- package/src/services/action-metadata.service.ts +87 -2
- package/src/services/authentication.service.ts +1 -1
- package/src/services/dashboard-providers/mq-dashboard-latency-trend-provider.service.ts +9 -4
- package/src/services/dashboard-providers/mq-dashboard-messages-over-time-provider.service.ts +9 -4
- package/src/services/dashboard-providers/mq-dashboard-provider-utils.ts +82 -0
- package/src/services/dashboard-providers/mq-dashboard-queue-sla-heatmap-provider.service.ts +10 -4
- package/src/services/datasource-introspection/mssql-datasource-introspection-provider.service.ts +185 -0
- package/src/services/datasource-introspection/mysql-datasource-introspection-provider.service.ts +95 -0
- package/src/services/datasource-introspection/postgres-datasource-introspection-provider.service.ts +160 -0
- package/src/services/datasource-introspection.service.ts +1536 -0
- package/src/services/datasource-management.service.ts +566 -0
- package/src/services/field-metadata.service.ts +21 -1
- package/src/services/model-metadata.service.ts +50 -13
- package/src/services/role-metadata.service.ts +100 -47
- package/src/services/selection-providers/mq-dashboard-message-broker-variable-options-provider.service.ts +2 -4
- package/src/services/selection-providers/mq-dashboard-queue-name-variable-options-provider.service.ts +2 -4
- package/src/services/setting.service.ts +43 -12
- package/src/services/solid-ts-morph.service.ts +2 -2
- package/src/services/view-metadata.service.ts +79 -1
- package/src/solid-core.module.ts +16 -0
- package/.claude/settings.local.json +0 -15
- package/src/services/1.js +0 -6
package/dist/services/datasource-introspection/mysql-datasource-introspection-provider.service.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DataSource } from "typeorm";
|
|
2
|
+
import { DatasourceIntrospectionColumn, DatasourceIntrospectionProvider, DatasourceIntrospectionTableRef } from "../../interfaces/datasource-introspection-provider.interface";
|
|
3
|
+
export declare class MysqlDatasourceIntrospectionProviderService implements DatasourceIntrospectionProvider {
|
|
4
|
+
readonly type = "mysql";
|
|
5
|
+
supports(type: string): boolean;
|
|
6
|
+
listTables(dataSource: DataSource): Promise<DatasourceIntrospectionTableRef[]>;
|
|
7
|
+
listColumns(dataSource: DataSource): Promise<DatasourceIntrospectionColumn[]>;
|
|
8
|
+
getTableDefinition(dataSource: DataSource, table: DatasourceIntrospectionTableRef): Promise<string | null>;
|
|
9
|
+
private toNumberOrNull;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=mysql-datasource-introspection-provider.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql-datasource-introspection-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/datasource-introspection/mysql-datasource-introspection-provider.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EACH,6BAA6B,EAC7B,+BAA+B,EAC/B,+BAA+B,EAClC,MAAM,4DAA4D,CAAC;AAEpE,qBACa,2CAA4C,YAAW,+BAA+B;IAC/F,QAAQ,CAAC,IAAI,WAAW;IAExB,QAAQ,CAAC,IAAI,EAAE,MAAM;IAIf,UAAU,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,+BAA+B,EAAE,CAAC;IAiB9E,WAAW,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,6BAA6B,EAAE,CAAC;IAkC7E,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,+BAA+B,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAmBhH,OAAO,CAAC,cAAc;CAQzB"}
|
package/dist/services/datasource-introspection/mysql-datasource-introspection-provider.service.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.MysqlDatasourceIntrospectionProviderService = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
let MysqlDatasourceIntrospectionProviderService = class MysqlDatasourceIntrospectionProviderService {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.type = "mysql";
|
|
14
|
+
}
|
|
15
|
+
supports(type) {
|
|
16
|
+
return type?.toLowerCase() === this.type;
|
|
17
|
+
}
|
|
18
|
+
async listTables(dataSource) {
|
|
19
|
+
const rows = await dataSource.query(`
|
|
20
|
+
SELECT
|
|
21
|
+
TABLE_SCHEMA AS tableSchema,
|
|
22
|
+
TABLE_NAME AS tableName
|
|
23
|
+
FROM INFORMATION_SCHEMA.TABLES
|
|
24
|
+
WHERE TABLE_TYPE = 'BASE TABLE'
|
|
25
|
+
AND TABLE_SCHEMA = DATABASE()
|
|
26
|
+
ORDER BY TABLE_SCHEMA, TABLE_NAME
|
|
27
|
+
`);
|
|
28
|
+
return rows.map((row) => ({
|
|
29
|
+
tableSchema: row.tableSchema ?? null,
|
|
30
|
+
tableName: row.tableName,
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
async listColumns(dataSource) {
|
|
34
|
+
const rows = await dataSource.query(`
|
|
35
|
+
SELECT
|
|
36
|
+
TABLE_SCHEMA AS tableSchema,
|
|
37
|
+
TABLE_NAME AS tableName,
|
|
38
|
+
COLUMN_NAME AS columnName,
|
|
39
|
+
DATA_TYPE AS dataType,
|
|
40
|
+
EXTRA AS extra,
|
|
41
|
+
IS_NULLABLE AS isNullable,
|
|
42
|
+
COLUMN_DEFAULT AS defaultValue,
|
|
43
|
+
CHARACTER_MAXIMUM_LENGTH AS characterMaximumLength,
|
|
44
|
+
NUMERIC_PRECISION AS numericPrecision,
|
|
45
|
+
NUMERIC_SCALE AS numericScale,
|
|
46
|
+
ORDINAL_POSITION AS ordinalPosition
|
|
47
|
+
FROM INFORMATION_SCHEMA.COLUMNS
|
|
48
|
+
WHERE TABLE_SCHEMA = DATABASE()
|
|
49
|
+
ORDER BY TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION
|
|
50
|
+
`);
|
|
51
|
+
return rows.map((row) => ({
|
|
52
|
+
tableSchema: row.tableSchema ?? null,
|
|
53
|
+
tableName: row.tableName,
|
|
54
|
+
columnName: row.columnName,
|
|
55
|
+
dataType: row.dataType,
|
|
56
|
+
isAutoGenerated: String(row.extra ?? "").toLowerCase().includes("auto_increment"),
|
|
57
|
+
isNullable: String(row.isNullable).toUpperCase() === "YES",
|
|
58
|
+
defaultValue: row.defaultValue ?? null,
|
|
59
|
+
characterMaximumLength: this.toNumberOrNull(row.characterMaximumLength),
|
|
60
|
+
numericPrecision: this.toNumberOrNull(row.numericPrecision),
|
|
61
|
+
numericScale: this.toNumberOrNull(row.numericScale),
|
|
62
|
+
ordinalPosition: this.toNumberOrNull(row.ordinalPosition),
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
async getTableDefinition(dataSource, table) {
|
|
66
|
+
const schemaName = table.tableSchema ?? dataSource.options.database;
|
|
67
|
+
const rows = await dataSource.query(`SHOW CREATE TABLE \`${schemaName}\`.\`${table.tableName}\``);
|
|
68
|
+
const firstRow = rows?.[0];
|
|
69
|
+
if (!firstRow || typeof firstRow !== "object") {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
const ddlKey = Object.keys(firstRow).find((key) => key.toLowerCase().startsWith("create table"));
|
|
73
|
+
if (!ddlKey) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
return String(firstRow[ddlKey] ?? "").trim() || null;
|
|
77
|
+
}
|
|
78
|
+
toNumberOrNull(value) {
|
|
79
|
+
if (value === null || value === undefined || value === "") {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
const parsed = Number(value);
|
|
83
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
exports.MysqlDatasourceIntrospectionProviderService = MysqlDatasourceIntrospectionProviderService;
|
|
87
|
+
exports.MysqlDatasourceIntrospectionProviderService = MysqlDatasourceIntrospectionProviderService = __decorate([
|
|
88
|
+
(0, common_1.Injectable)()
|
|
89
|
+
], MysqlDatasourceIntrospectionProviderService);
|
|
90
|
+
//# sourceMappingURL=mysql-datasource-introspection-provider.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql-datasource-introspection-provider.service.js","sourceRoot":"","sources":["../../../src/services/datasource-introspection/mysql-datasource-introspection-provider.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AASrC,IAAM,2CAA2C,GAAjD,MAAM,2CAA2C;IAAjD;QACM,SAAI,GAAG,OAAO,CAAC;IAoF5B,CAAC;IAlFG,QAAQ,CAAC,IAAY;QACjB,OAAO,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAsB;QACnC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC;;;;;;;;SAQnC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;YAC3B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;YACpC,SAAS,EAAE,GAAG,CAAC,SAAS;SAC3B,CAAC,CAAC,CAAC;IACR,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAAsB;QACpC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;SAgBnC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;YAC3B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;YACpC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACjF,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK;YAC1D,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,IAAI;YACtC,sBAAsB,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,sBAAsB,CAAC;YACvE,gBAAgB,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAC3D,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC;YACnD,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC;SAC5D,CAAC,CAAC,CAAC;IACR,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,UAAsB,EAAE,KAAsC;QACnF,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,IAAI,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC;QACpE,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAC/B,uBAAuB,UAAU,QAAQ,KAAK,CAAC,SAAS,IAAI,CAC/D,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;QACjG,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IACzD,CAAC;IAEO,cAAc,CAAC,KAAc;QACjC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACnD,CAAC;CACJ,CAAA;AArFY,kGAA2C;sDAA3C,2CAA2C;IADvD,IAAA,mBAAU,GAAE;GACA,2CAA2C,CAqFvD","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { DataSource } from \"typeorm\";\nimport {\n DatasourceIntrospectionColumn,\n DatasourceIntrospectionProvider,\n DatasourceIntrospectionTableRef,\n} from \"src/interfaces/datasource-introspection-provider.interface\";\n\n@Injectable()\nexport class MysqlDatasourceIntrospectionProviderService implements DatasourceIntrospectionProvider {\n readonly type = \"mysql\";\n\n supports(type: string) {\n return type?.toLowerCase() === this.type;\n }\n\n async listTables(dataSource: DataSource): Promise<DatasourceIntrospectionTableRef[]> {\n const rows = await dataSource.query(`\n SELECT\n TABLE_SCHEMA AS tableSchema,\n TABLE_NAME AS tableName\n FROM INFORMATION_SCHEMA.TABLES\n WHERE TABLE_TYPE = 'BASE TABLE'\n AND TABLE_SCHEMA = DATABASE()\n ORDER BY TABLE_SCHEMA, TABLE_NAME\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n }));\n }\n\n async listColumns(dataSource: DataSource): Promise<DatasourceIntrospectionColumn[]> {\n const rows = await dataSource.query(`\n SELECT\n TABLE_SCHEMA AS tableSchema,\n TABLE_NAME AS tableName,\n COLUMN_NAME AS columnName,\n DATA_TYPE AS dataType,\n EXTRA AS extra,\n IS_NULLABLE AS isNullable,\n COLUMN_DEFAULT AS defaultValue,\n CHARACTER_MAXIMUM_LENGTH AS characterMaximumLength,\n NUMERIC_PRECISION AS numericPrecision,\n NUMERIC_SCALE AS numericScale,\n ORDINAL_POSITION AS ordinalPosition\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA = DATABASE()\n ORDER BY TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n columnName: row.columnName,\n dataType: row.dataType,\n isAutoGenerated: String(row.extra ?? \"\").toLowerCase().includes(\"auto_increment\"),\n isNullable: String(row.isNullable).toUpperCase() === \"YES\",\n defaultValue: row.defaultValue ?? null,\n characterMaximumLength: this.toNumberOrNull(row.characterMaximumLength),\n numericPrecision: this.toNumberOrNull(row.numericPrecision),\n numericScale: this.toNumberOrNull(row.numericScale),\n ordinalPosition: this.toNumberOrNull(row.ordinalPosition),\n }));\n }\n\n async getTableDefinition(dataSource: DataSource, table: DatasourceIntrospectionTableRef): Promise<string | null> {\n const schemaName = table.tableSchema ?? dataSource.options.database;\n const rows = await dataSource.query(\n `SHOW CREATE TABLE \\`${schemaName}\\`.\\`${table.tableName}\\``,\n );\n\n const firstRow = rows?.[0];\n if (!firstRow || typeof firstRow !== \"object\") {\n return null;\n }\n\n const ddlKey = Object.keys(firstRow).find((key) => key.toLowerCase().startsWith(\"create table\"));\n if (!ddlKey) {\n return null;\n }\n\n return String(firstRow[ddlKey] ?? \"\").trim() || null;\n }\n\n private toNumberOrNull(value: unknown) {\n if (value === null || value === undefined || value === \"\") {\n return null;\n }\n\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DataSource } from "typeorm";
|
|
2
|
+
import { DatasourceIntrospectionColumn, DatasourceIntrospectionProvider, DatasourceIntrospectionTableRef } from "../../interfaces/datasource-introspection-provider.interface";
|
|
3
|
+
export declare class PostgresDatasourceIntrospectionProviderService implements DatasourceIntrospectionProvider {
|
|
4
|
+
readonly type = "postgres";
|
|
5
|
+
supports(type: string): boolean;
|
|
6
|
+
listTables(dataSource: DataSource): Promise<DatasourceIntrospectionTableRef[]>;
|
|
7
|
+
listColumns(dataSource: DataSource): Promise<DatasourceIntrospectionColumn[]>;
|
|
8
|
+
getTableDefinition(dataSource: DataSource, table: DatasourceIntrospectionTableRef): Promise<string | null>;
|
|
9
|
+
private toNumberOrNull;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=postgres-datasource-introspection-provider.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-datasource-introspection-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/datasource-introspection/postgres-datasource-introspection-provider.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EACH,6BAA6B,EAC7B,+BAA+B,EAC/B,+BAA+B,EAClC,MAAM,4DAA4D,CAAC;AAEpE,qBACa,8CAA+C,YAAW,+BAA+B;IAClG,QAAQ,CAAC,IAAI,cAAc;IAE3B,QAAQ,CAAC,IAAI,EAAE,MAAM;IAIf,UAAU,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,+BAA+B,EAAE,CAAC;IAiB9E,WAAW,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,6BAA6B,EAAE,CAAC;IAsC7E,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,+BAA+B,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgFhH,OAAO,CAAC,cAAc;CAQzB"}
|
package/dist/services/datasource-introspection/postgres-datasource-introspection-provider.service.js
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.PostgresDatasourceIntrospectionProviderService = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
let PostgresDatasourceIntrospectionProviderService = class PostgresDatasourceIntrospectionProviderService {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.type = "postgres";
|
|
14
|
+
}
|
|
15
|
+
supports(type) {
|
|
16
|
+
return type?.toLowerCase() === this.type;
|
|
17
|
+
}
|
|
18
|
+
async listTables(dataSource) {
|
|
19
|
+
const rows = await dataSource.query(`
|
|
20
|
+
SELECT
|
|
21
|
+
TABLE_SCHEMA AS "tableSchema",
|
|
22
|
+
TABLE_NAME AS "tableName"
|
|
23
|
+
FROM INFORMATION_SCHEMA.TABLES
|
|
24
|
+
WHERE TABLE_TYPE = 'BASE TABLE'
|
|
25
|
+
AND TABLE_SCHEMA NOT IN ('pg_catalog', 'information_schema')
|
|
26
|
+
ORDER BY TABLE_SCHEMA, TABLE_NAME
|
|
27
|
+
`);
|
|
28
|
+
return rows.map((row) => ({
|
|
29
|
+
tableSchema: row.tableSchema ?? null,
|
|
30
|
+
tableName: row.tableName,
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
async listColumns(dataSource) {
|
|
34
|
+
const rows = await dataSource.query(`
|
|
35
|
+
SELECT
|
|
36
|
+
TABLE_SCHEMA AS "tableSchema",
|
|
37
|
+
TABLE_NAME AS "tableName",
|
|
38
|
+
COLUMN_NAME AS "columnName",
|
|
39
|
+
DATA_TYPE AS "dataType",
|
|
40
|
+
CASE
|
|
41
|
+
WHEN is_identity = 'YES' THEN true
|
|
42
|
+
WHEN COLUMN_DEFAULT LIKE 'nextval(%' THEN true
|
|
43
|
+
ELSE false
|
|
44
|
+
END AS "isAutoGenerated",
|
|
45
|
+
IS_NULLABLE AS "isNullable",
|
|
46
|
+
COLUMN_DEFAULT AS "defaultValue",
|
|
47
|
+
CHARACTER_MAXIMUM_LENGTH AS "characterMaximumLength",
|
|
48
|
+
NUMERIC_PRECISION AS "numericPrecision",
|
|
49
|
+
NUMERIC_SCALE AS "numericScale",
|
|
50
|
+
ORDINAL_POSITION AS "ordinalPosition"
|
|
51
|
+
FROM INFORMATION_SCHEMA.COLUMNS
|
|
52
|
+
WHERE TABLE_SCHEMA NOT IN ('pg_catalog', 'information_schema')
|
|
53
|
+
ORDER BY TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION
|
|
54
|
+
`);
|
|
55
|
+
return rows.map((row) => ({
|
|
56
|
+
tableSchema: row.tableSchema ?? null,
|
|
57
|
+
tableName: row.tableName,
|
|
58
|
+
columnName: row.columnName,
|
|
59
|
+
dataType: row.dataType,
|
|
60
|
+
isAutoGenerated: Boolean(row.isAutoGenerated),
|
|
61
|
+
isNullable: String(row.isNullable).toUpperCase() === "YES",
|
|
62
|
+
defaultValue: row.defaultValue ?? null,
|
|
63
|
+
characterMaximumLength: this.toNumberOrNull(row.characterMaximumLength),
|
|
64
|
+
numericPrecision: this.toNumberOrNull(row.numericPrecision),
|
|
65
|
+
numericScale: this.toNumberOrNull(row.numericScale),
|
|
66
|
+
ordinalPosition: this.toNumberOrNull(row.ordinalPosition),
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
async getTableDefinition(dataSource, table) {
|
|
70
|
+
const rows = await dataSource.query(`
|
|
71
|
+
WITH target_table AS (
|
|
72
|
+
SELECT c.oid, n.nspname AS schema_name, c.relname AS table_name
|
|
73
|
+
FROM pg_class c
|
|
74
|
+
INNER JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
75
|
+
WHERE c.relkind = 'r'
|
|
76
|
+
AND c.relname = $1
|
|
77
|
+
AND ($2::text IS NULL OR n.nspname = $2)
|
|
78
|
+
LIMIT 1
|
|
79
|
+
),
|
|
80
|
+
column_lines AS (
|
|
81
|
+
SELECT
|
|
82
|
+
a.attnum,
|
|
83
|
+
format(
|
|
84
|
+
' %I %s%s%s%s',
|
|
85
|
+
a.attname,
|
|
86
|
+
format_type(a.atttypid, a.atttypmod),
|
|
87
|
+
CASE
|
|
88
|
+
WHEN a.attidentity = 'a' THEN ' GENERATED ALWAYS AS IDENTITY'
|
|
89
|
+
WHEN a.attidentity = 'd' THEN ' GENERATED BY DEFAULT AS IDENTITY'
|
|
90
|
+
ELSE ''
|
|
91
|
+
END,
|
|
92
|
+
CASE
|
|
93
|
+
WHEN ad.adbin IS NOT NULL THEN ' DEFAULT ' || pg_get_expr(ad.adbin, ad.adrelid)
|
|
94
|
+
ELSE ''
|
|
95
|
+
END,
|
|
96
|
+
CASE
|
|
97
|
+
WHEN a.attnotnull THEN ' NOT NULL'
|
|
98
|
+
ELSE ''
|
|
99
|
+
END
|
|
100
|
+
) AS line
|
|
101
|
+
FROM target_table tt
|
|
102
|
+
INNER JOIN pg_attribute a ON a.attrelid = tt.oid
|
|
103
|
+
LEFT JOIN pg_attrdef ad
|
|
104
|
+
ON ad.adrelid = a.attrelid
|
|
105
|
+
AND ad.adnum = a.attnum
|
|
106
|
+
WHERE a.attnum > 0
|
|
107
|
+
AND NOT a.attisdropped
|
|
108
|
+
),
|
|
109
|
+
constraint_lines AS (
|
|
110
|
+
SELECT
|
|
111
|
+
c.conname,
|
|
112
|
+
format(' CONSTRAINT %I %s', c.conname, pg_get_constraintdef(c.oid, true)) AS line
|
|
113
|
+
FROM target_table tt
|
|
114
|
+
INNER JOIN pg_constraint c ON c.conrelid = tt.oid
|
|
115
|
+
WHERE c.contype IN ('p', 'u', 'f', 'c')
|
|
116
|
+
)
|
|
117
|
+
SELECT format(
|
|
118
|
+
'CREATE TABLE %I.%I (\n%s%s\n);',
|
|
119
|
+
tt.schema_name,
|
|
120
|
+
tt.table_name,
|
|
121
|
+
COALESCE(
|
|
122
|
+
(
|
|
123
|
+
SELECT string_agg(line, ',\n' ORDER BY attnum)
|
|
124
|
+
FROM column_lines
|
|
125
|
+
),
|
|
126
|
+
''
|
|
127
|
+
),
|
|
128
|
+
COALESCE(
|
|
129
|
+
(
|
|
130
|
+
SELECT CASE
|
|
131
|
+
WHEN EXISTS (SELECT 1 FROM constraint_lines)
|
|
132
|
+
THEN ',\n' || string_agg(line, ',\n' ORDER BY conname)
|
|
133
|
+
ELSE ''
|
|
134
|
+
END
|
|
135
|
+
FROM constraint_lines
|
|
136
|
+
),
|
|
137
|
+
''
|
|
138
|
+
)
|
|
139
|
+
) AS ddl
|
|
140
|
+
FROM target_table tt
|
|
141
|
+
`, [table.tableName, table.tableSchema]);
|
|
142
|
+
return rows?.[0]?.ddl ?? null;
|
|
143
|
+
}
|
|
144
|
+
toNumberOrNull(value) {
|
|
145
|
+
if (value === null || value === undefined || value === "") {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
const parsed = Number(value);
|
|
149
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
exports.PostgresDatasourceIntrospectionProviderService = PostgresDatasourceIntrospectionProviderService;
|
|
153
|
+
exports.PostgresDatasourceIntrospectionProviderService = PostgresDatasourceIntrospectionProviderService = __decorate([
|
|
154
|
+
(0, common_1.Injectable)()
|
|
155
|
+
], PostgresDatasourceIntrospectionProviderService);
|
|
156
|
+
//# sourceMappingURL=postgres-datasource-introspection-provider.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-datasource-introspection-provider.service.js","sourceRoot":"","sources":["../../../src/services/datasource-introspection/postgres-datasource-introspection-provider.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AASrC,IAAM,8CAA8C,GAApD,MAAM,8CAA8C;IAApD;QACM,SAAI,GAAG,UAAU,CAAC;IAqJ/B,CAAC;IAnJG,QAAQ,CAAC,IAAY;QACjB,OAAO,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAsB;QACnC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC;;;;;;;;SAQnC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;YAC3B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;YACpC,SAAS,EAAE,GAAG,CAAC,SAAS;SAC3B,CAAC,CAAC,CAAC;IACR,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAAsB;QACpC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;SAoBnC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;YAC3B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;YACpC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;YAC7C,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK;YAC1D,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,IAAI;YACtC,sBAAsB,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,sBAAsB,CAAC;YACvE,gBAAgB,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAC3D,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC;YACnD,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC;SAC5D,CAAC,CAAC,CAAC;IACR,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,UAAsB,EAAE,KAAsC;QACnF,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAC/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAuEC,EACD,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,CACvC,CAAC;QAEF,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC;IAClC,CAAC;IAEO,cAAc,CAAC,KAAc;QACjC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACnD,CAAC;CACJ,CAAA;AAtJY,wGAA8C;yDAA9C,8CAA8C;IAD1D,IAAA,mBAAU,GAAE;GACA,8CAA8C,CAsJ1D","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { DataSource } from \"typeorm\";\nimport {\n DatasourceIntrospectionColumn,\n DatasourceIntrospectionProvider,\n DatasourceIntrospectionTableRef,\n} from \"src/interfaces/datasource-introspection-provider.interface\";\n\n@Injectable()\nexport class PostgresDatasourceIntrospectionProviderService implements DatasourceIntrospectionProvider {\n readonly type = \"postgres\";\n\n supports(type: string) {\n return type?.toLowerCase() === this.type;\n }\n\n async listTables(dataSource: DataSource): Promise<DatasourceIntrospectionTableRef[]> {\n const rows = await dataSource.query(`\n SELECT\n TABLE_SCHEMA AS \"tableSchema\",\n TABLE_NAME AS \"tableName\"\n FROM INFORMATION_SCHEMA.TABLES\n WHERE TABLE_TYPE = 'BASE TABLE'\n AND TABLE_SCHEMA NOT IN ('pg_catalog', 'information_schema')\n ORDER BY TABLE_SCHEMA, TABLE_NAME\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n }));\n }\n\n async listColumns(dataSource: DataSource): Promise<DatasourceIntrospectionColumn[]> {\n const rows = await dataSource.query(`\n SELECT\n TABLE_SCHEMA AS \"tableSchema\",\n TABLE_NAME AS \"tableName\",\n COLUMN_NAME AS \"columnName\",\n DATA_TYPE AS \"dataType\",\n CASE\n WHEN is_identity = 'YES' THEN true\n WHEN COLUMN_DEFAULT LIKE 'nextval(%' THEN true\n ELSE false\n END AS \"isAutoGenerated\",\n IS_NULLABLE AS \"isNullable\",\n COLUMN_DEFAULT AS \"defaultValue\",\n CHARACTER_MAXIMUM_LENGTH AS \"characterMaximumLength\",\n NUMERIC_PRECISION AS \"numericPrecision\",\n NUMERIC_SCALE AS \"numericScale\",\n ORDINAL_POSITION AS \"ordinalPosition\"\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA NOT IN ('pg_catalog', 'information_schema')\n ORDER BY TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n columnName: row.columnName,\n dataType: row.dataType,\n isAutoGenerated: Boolean(row.isAutoGenerated),\n isNullable: String(row.isNullable).toUpperCase() === \"YES\",\n defaultValue: row.defaultValue ?? null,\n characterMaximumLength: this.toNumberOrNull(row.characterMaximumLength),\n numericPrecision: this.toNumberOrNull(row.numericPrecision),\n numericScale: this.toNumberOrNull(row.numericScale),\n ordinalPosition: this.toNumberOrNull(row.ordinalPosition),\n }));\n }\n\n async getTableDefinition(dataSource: DataSource, table: DatasourceIntrospectionTableRef): Promise<string | null> {\n const rows = await dataSource.query(\n `\n WITH target_table AS (\n SELECT c.oid, n.nspname AS schema_name, c.relname AS table_name\n FROM pg_class c\n INNER JOIN pg_namespace n ON n.oid = c.relnamespace\n WHERE c.relkind = 'r'\n AND c.relname = $1\n AND ($2::text IS NULL OR n.nspname = $2)\n LIMIT 1\n ),\n column_lines AS (\n SELECT\n a.attnum,\n format(\n ' %I %s%s%s%s',\n a.attname,\n format_type(a.atttypid, a.atttypmod),\n CASE\n WHEN a.attidentity = 'a' THEN ' GENERATED ALWAYS AS IDENTITY'\n WHEN a.attidentity = 'd' THEN ' GENERATED BY DEFAULT AS IDENTITY'\n ELSE ''\n END,\n CASE\n WHEN ad.adbin IS NOT NULL THEN ' DEFAULT ' || pg_get_expr(ad.adbin, ad.adrelid)\n ELSE ''\n END,\n CASE\n WHEN a.attnotnull THEN ' NOT NULL'\n ELSE ''\n END\n ) AS line\n FROM target_table tt\n INNER JOIN pg_attribute a ON a.attrelid = tt.oid\n LEFT JOIN pg_attrdef ad\n ON ad.adrelid = a.attrelid\n AND ad.adnum = a.attnum\n WHERE a.attnum > 0\n AND NOT a.attisdropped\n ),\n constraint_lines AS (\n SELECT\n c.conname,\n format(' CONSTRAINT %I %s', c.conname, pg_get_constraintdef(c.oid, true)) AS line\n FROM target_table tt\n INNER JOIN pg_constraint c ON c.conrelid = tt.oid\n WHERE c.contype IN ('p', 'u', 'f', 'c')\n )\n SELECT format(\n 'CREATE TABLE %I.%I (\\n%s%s\\n);',\n tt.schema_name,\n tt.table_name,\n COALESCE(\n (\n SELECT string_agg(line, ',\\n' ORDER BY attnum)\n FROM column_lines\n ),\n ''\n ),\n COALESCE(\n (\n SELECT CASE\n WHEN EXISTS (SELECT 1 FROM constraint_lines)\n THEN ',\\n' || string_agg(line, ',\\n' ORDER BY conname)\n ELSE ''\n END\n FROM constraint_lines\n ),\n ''\n )\n ) AS ddl\n FROM target_table tt\n `,\n [table.tableName, table.tableSchema],\n );\n\n return rows?.[0]?.ddl ?? null;\n }\n\n private toNumberOrNull(value: unknown) {\n if (value === null || value === undefined || value === \"\") {\n return null;\n }\n\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n}\n"]}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import { ModuleRef } from "@nestjs/core";
|
|
2
|
+
import { DatasourceIntrospectionMappingDto } from "../dtos/datasource-introspection-mapping.dto";
|
|
3
|
+
import { LegacyTableType } from "../enums/legacy-table-type.enum";
|
|
4
|
+
import { ModuleMetadataHelperService } from "../helpers/module-metadata-helper.service";
|
|
5
|
+
import { ModelMetadataHelperService } from "../helpers/model-metadata-helper.service";
|
|
6
|
+
import { ModelMetadataRepository } from "../repository/model-metadata.repository";
|
|
7
|
+
import { ModuleMetadataRepository } from "../repository/module-metadata.repository";
|
|
8
|
+
import { DatasourceManagementService } from "./datasource-management.service";
|
|
9
|
+
import { FieldMetadataService } from "./field-metadata.service";
|
|
10
|
+
import { ModelMetadataService } from "./model-metadata.service";
|
|
11
|
+
import { MssqlDatasourceIntrospectionProviderService } from "./datasource-introspection/mssql-datasource-introspection-provider.service";
|
|
12
|
+
import { MysqlDatasourceIntrospectionProviderService } from "./datasource-introspection/mysql-datasource-introspection-provider.service";
|
|
13
|
+
import { PostgresDatasourceIntrospectionProviderService } from "./datasource-introspection/postgres-datasource-introspection-provider.service";
|
|
14
|
+
type TableInventoryRecord = {
|
|
15
|
+
schema: string | null;
|
|
16
|
+
tableName: string;
|
|
17
|
+
mapped: boolean;
|
|
18
|
+
mappedModelId: number | null;
|
|
19
|
+
mappedModelSingularName: string | null;
|
|
20
|
+
mappedModelDisplayName: string | null;
|
|
21
|
+
mappedModuleId: number | null;
|
|
22
|
+
mappedModuleName: string | null;
|
|
23
|
+
mappedModuleDisplayName: string | null;
|
|
24
|
+
suggestedLegacyTableType: LegacyTableType;
|
|
25
|
+
suggestedBaseClassName: string;
|
|
26
|
+
suggestedIdColumnName: string | null;
|
|
27
|
+
suggestedUserKeyField: string;
|
|
28
|
+
columnCount: number;
|
|
29
|
+
physicalColumnCount: number;
|
|
30
|
+
};
|
|
31
|
+
type TableDetailColumnRecord = {
|
|
32
|
+
columnName: string;
|
|
33
|
+
fieldName: string;
|
|
34
|
+
dataType: string;
|
|
35
|
+
solidFieldType: string;
|
|
36
|
+
ormType: string;
|
|
37
|
+
nullable: boolean;
|
|
38
|
+
defaultValue: string | null;
|
|
39
|
+
characterMaximumLength: number | null;
|
|
40
|
+
numericPrecision: number | null;
|
|
41
|
+
numericScale: number | null;
|
|
42
|
+
ordinalPosition: number | null;
|
|
43
|
+
isAutoGenerated: boolean;
|
|
44
|
+
handledBySuperclass: boolean;
|
|
45
|
+
superclassFieldName: string | null;
|
|
46
|
+
};
|
|
47
|
+
type TableDdlRecord = {
|
|
48
|
+
statement: string | null;
|
|
49
|
+
available: boolean;
|
|
50
|
+
note: string | null;
|
|
51
|
+
};
|
|
52
|
+
export declare class DatasourceIntrospectionService {
|
|
53
|
+
private readonly moduleRef;
|
|
54
|
+
private readonly datasourceManagementService;
|
|
55
|
+
private readonly moduleMetadataRepository;
|
|
56
|
+
private readonly modelMetadataRepository;
|
|
57
|
+
private readonly moduleMetadataHelperService;
|
|
58
|
+
private readonly modelMetadataHelperService;
|
|
59
|
+
private readonly fieldMetadataService;
|
|
60
|
+
private readonly modelMetadataService;
|
|
61
|
+
private readonly mssqlProvider;
|
|
62
|
+
private readonly mysqlProvider;
|
|
63
|
+
private readonly postgresProvider;
|
|
64
|
+
private readonly supportedDatasourceTypes;
|
|
65
|
+
constructor(moduleRef: ModuleRef, datasourceManagementService: DatasourceManagementService, moduleMetadataRepository: ModuleMetadataRepository, modelMetadataRepository: ModelMetadataRepository, moduleMetadataHelperService: ModuleMetadataHelperService, modelMetadataHelperService: ModelMetadataHelperService, fieldMetadataService: FieldMetadataService, modelMetadataService: ModelMetadataService, mssqlProvider: MssqlDatasourceIntrospectionProviderService, mysqlProvider: MysqlDatasourceIntrospectionProviderService, postgresProvider: PostgresDatasourceIntrospectionProviderService);
|
|
66
|
+
getBootstrap(moduleId: number): Promise<{
|
|
67
|
+
data: {
|
|
68
|
+
module: {
|
|
69
|
+
id: any;
|
|
70
|
+
name: any;
|
|
71
|
+
displayName: any;
|
|
72
|
+
description: any;
|
|
73
|
+
defaultDataSource: any;
|
|
74
|
+
};
|
|
75
|
+
datasources: {
|
|
76
|
+
name: string;
|
|
77
|
+
displayName: string;
|
|
78
|
+
type: import("../dtos/create-model-metadata.dto").DatasourceType;
|
|
79
|
+
envPrefix: string;
|
|
80
|
+
isDefault: boolean;
|
|
81
|
+
synchronize: boolean;
|
|
82
|
+
host: string;
|
|
83
|
+
port: number;
|
|
84
|
+
database: string;
|
|
85
|
+
}[];
|
|
86
|
+
recommendedDatasourceName: string;
|
|
87
|
+
};
|
|
88
|
+
}>;
|
|
89
|
+
getTables(moduleId: number, datasourceName: string): Promise<{
|
|
90
|
+
data: {
|
|
91
|
+
module: {
|
|
92
|
+
id: any;
|
|
93
|
+
name: any;
|
|
94
|
+
displayName: any;
|
|
95
|
+
description: any;
|
|
96
|
+
defaultDataSource: any;
|
|
97
|
+
};
|
|
98
|
+
datasource: {
|
|
99
|
+
name: string;
|
|
100
|
+
displayName: string;
|
|
101
|
+
type: import("../dtos/create-model-metadata.dto").DatasourceType;
|
|
102
|
+
envPrefix: string;
|
|
103
|
+
isDefault: boolean;
|
|
104
|
+
synchronize: boolean;
|
|
105
|
+
host: string;
|
|
106
|
+
port: number;
|
|
107
|
+
database: string;
|
|
108
|
+
};
|
|
109
|
+
synchronizeBlocked: boolean;
|
|
110
|
+
synchronizeMessage: string;
|
|
111
|
+
records: any[];
|
|
112
|
+
meta: {
|
|
113
|
+
totalRecords: number;
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
} | {
|
|
117
|
+
data: {
|
|
118
|
+
module: {
|
|
119
|
+
id: any;
|
|
120
|
+
name: any;
|
|
121
|
+
displayName: any;
|
|
122
|
+
description: any;
|
|
123
|
+
defaultDataSource: any;
|
|
124
|
+
};
|
|
125
|
+
datasource: {
|
|
126
|
+
name: string;
|
|
127
|
+
displayName: string;
|
|
128
|
+
type: import("../dtos/create-model-metadata.dto").DatasourceType;
|
|
129
|
+
envPrefix: string;
|
|
130
|
+
isDefault: boolean;
|
|
131
|
+
synchronize: boolean;
|
|
132
|
+
host: string;
|
|
133
|
+
port: number;
|
|
134
|
+
database: string;
|
|
135
|
+
};
|
|
136
|
+
synchronizeBlocked: boolean;
|
|
137
|
+
synchronizeMessage: any;
|
|
138
|
+
records: TableInventoryRecord[];
|
|
139
|
+
meta: {
|
|
140
|
+
totalRecords: number;
|
|
141
|
+
};
|
|
142
|
+
};
|
|
143
|
+
}>;
|
|
144
|
+
getTableDetail(moduleId: number, datasourceName: string, tableName: string, schema?: string): Promise<{
|
|
145
|
+
data: {
|
|
146
|
+
module: {
|
|
147
|
+
id: any;
|
|
148
|
+
name: any;
|
|
149
|
+
displayName: any;
|
|
150
|
+
description: any;
|
|
151
|
+
defaultDataSource: any;
|
|
152
|
+
};
|
|
153
|
+
datasource: {
|
|
154
|
+
name: string;
|
|
155
|
+
displayName: string;
|
|
156
|
+
type: import("../dtos/create-model-metadata.dto").DatasourceType;
|
|
157
|
+
envPrefix: string;
|
|
158
|
+
isDefault: boolean;
|
|
159
|
+
synchronize: boolean;
|
|
160
|
+
host: string;
|
|
161
|
+
port: number;
|
|
162
|
+
database: string;
|
|
163
|
+
};
|
|
164
|
+
table: TableInventoryRecord;
|
|
165
|
+
columns: TableDetailColumnRecord[];
|
|
166
|
+
rawDdl: TableDdlRecord;
|
|
167
|
+
userKeyCandidates: {
|
|
168
|
+
isDefault: boolean;
|
|
169
|
+
name: string;
|
|
170
|
+
label: string;
|
|
171
|
+
score: number;
|
|
172
|
+
reason: string;
|
|
173
|
+
}[];
|
|
174
|
+
suggestedMetadata: {
|
|
175
|
+
singularName: any;
|
|
176
|
+
pluralName: any;
|
|
177
|
+
displayName: any;
|
|
178
|
+
tableName: string;
|
|
179
|
+
schema: string;
|
|
180
|
+
dataSource: string;
|
|
181
|
+
dataSourceType: import("../dtos/create-model-metadata.dto").DatasourceType;
|
|
182
|
+
legacyTableType: LegacyTableType;
|
|
183
|
+
baseClassName: string;
|
|
184
|
+
userKeyField: string;
|
|
185
|
+
synchronize: boolean;
|
|
186
|
+
};
|
|
187
|
+
};
|
|
188
|
+
}>;
|
|
189
|
+
previewMapping(moduleId: number, mappingDto: DatasourceIntrospectionMappingDto): Promise<{
|
|
190
|
+
data: {
|
|
191
|
+
operation: "create" | "update";
|
|
192
|
+
mappedModelId: number;
|
|
193
|
+
metadataJson: {
|
|
194
|
+
filePath: string;
|
|
195
|
+
model: Record<string, any>;
|
|
196
|
+
};
|
|
197
|
+
migration: {
|
|
198
|
+
willGenerate: boolean;
|
|
199
|
+
filePath: string | null;
|
|
200
|
+
fileName: string | null;
|
|
201
|
+
className: string | null;
|
|
202
|
+
timestamp: number | null;
|
|
203
|
+
content: string | null;
|
|
204
|
+
note: string;
|
|
205
|
+
missingSystemColumns: string[];
|
|
206
|
+
};
|
|
207
|
+
summary: {
|
|
208
|
+
includedColumnNames: string[];
|
|
209
|
+
removedColumnNames: string[];
|
|
210
|
+
missingSystemColumns: string[];
|
|
211
|
+
generatedSystemColumnCount: number;
|
|
212
|
+
};
|
|
213
|
+
};
|
|
214
|
+
}>;
|
|
215
|
+
applyMapping(moduleId: number, mappingDto: DatasourceIntrospectionMappingDto): Promise<{
|
|
216
|
+
data: {
|
|
217
|
+
modelId: number;
|
|
218
|
+
operation: "create" | "update";
|
|
219
|
+
metadataJson: {
|
|
220
|
+
filePath: string;
|
|
221
|
+
model: Record<string, any>;
|
|
222
|
+
};
|
|
223
|
+
migration: {
|
|
224
|
+
written: boolean;
|
|
225
|
+
willGenerate: boolean;
|
|
226
|
+
filePath: string | null;
|
|
227
|
+
fileName: string | null;
|
|
228
|
+
className: string | null;
|
|
229
|
+
timestamp: number | null;
|
|
230
|
+
content: string | null;
|
|
231
|
+
note: string;
|
|
232
|
+
missingSystemColumns: string[];
|
|
233
|
+
};
|
|
234
|
+
summary: {
|
|
235
|
+
includedColumnNames: string[];
|
|
236
|
+
removedColumnNames: string[];
|
|
237
|
+
missingSystemColumns: string[];
|
|
238
|
+
generatedSystemColumnCount: number;
|
|
239
|
+
};
|
|
240
|
+
};
|
|
241
|
+
}>;
|
|
242
|
+
private buildMappingPreview;
|
|
243
|
+
private buildModelPayload;
|
|
244
|
+
private buildModelPayloadFromReviewedModel;
|
|
245
|
+
private buildMetadataJsonPreview;
|
|
246
|
+
private buildMetadataJsonPreviewFromReviewedModel;
|
|
247
|
+
private buildMetadataPreviewFields;
|
|
248
|
+
private buildMigrationPreview;
|
|
249
|
+
private sanitizeExistingFieldPayload;
|
|
250
|
+
private normalizeReviewedMetadataModel;
|
|
251
|
+
private normalizeReviewedField;
|
|
252
|
+
private matchExistingFieldForReviewedModel;
|
|
253
|
+
private buildFieldPayload;
|
|
254
|
+
private toFieldPreviewKey;
|
|
255
|
+
private getLegacySystemColumnDefinitions;
|
|
256
|
+
private renderMigrationTemplate;
|
|
257
|
+
private renderTableColumnLiteral;
|
|
258
|
+
private buildMigrationObjectName;
|
|
259
|
+
private toMigrationTableName;
|
|
260
|
+
private buildRawDdl;
|
|
261
|
+
private buildTableInventory;
|
|
262
|
+
private buildModelMap;
|
|
263
|
+
private groupColumnsByTable;
|
|
264
|
+
private detectLegacyTableType;
|
|
265
|
+
private getSuggestedIdColumn;
|
|
266
|
+
private buildUserKeyCandidates;
|
|
267
|
+
private toDetailColumnRecord;
|
|
268
|
+
private getSuperclassFieldName;
|
|
269
|
+
private getLegacySuperclassFieldName;
|
|
270
|
+
private isHandledBySuperclass;
|
|
271
|
+
private getBaseClassName;
|
|
272
|
+
private toSolidFieldType;
|
|
273
|
+
private toOrmFieldType;
|
|
274
|
+
private toFieldName;
|
|
275
|
+
private toSingularNameCandidate;
|
|
276
|
+
private toPluralNameCandidate;
|
|
277
|
+
private toTableKey;
|
|
278
|
+
private toModelMapKey;
|
|
279
|
+
private buildSynchronizeBlockedMessage;
|
|
280
|
+
private resolveDataSourceByName;
|
|
281
|
+
private getProvider;
|
|
282
|
+
private requireDatasource;
|
|
283
|
+
private loadModule;
|
|
284
|
+
private toModuleSummary;
|
|
285
|
+
private toDatasourceSummary;
|
|
286
|
+
}
|
|
287
|
+
export {};
|
|
288
|
+
//# sourceMappingURL=datasource-introspection.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datasource-introspection.service.d.ts","sourceRoot":"","sources":["../../src/services/datasource-introspection.service.ts"],"names":[],"mappings":"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"}
|