@forestadmin/datasource-sql 1.12.0 → 1.12.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/index.d.ts
CHANGED
|
@@ -11,6 +11,6 @@ export declare function createSqlDataSource(uriOrOptions: PlainConnectionOptions
|
|
|
11
11
|
/** Preprocess the connection options so that they can be cached for faster connections */
|
|
12
12
|
export declare function preprocessOptions(uriOrOptions: PlainConnectionOptionsOrUri): Promise<PlainConnectionOptions>;
|
|
13
13
|
export * from './connection/errors';
|
|
14
|
-
export type { PlainConnectionOptionsOrUri as ConnectionOptions, Table, SslMode,
|
|
14
|
+
export type { PlainConnectionOptionsOrUri as ConnectionOptions, Table, SslMode, LegacyIntrospection as Introspection, };
|
|
15
15
|
export { listCollectionsFromIntrospection };
|
|
16
16
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -19,61 +19,104 @@ class PostgreSQLDialect {
|
|
|
19
19
|
if (!tableNames?.length)
|
|
20
20
|
return [];
|
|
21
21
|
const conditions = `(${tableNames
|
|
22
|
-
.map((_, index) => `(
|
|
23
|
-
AND
|
|
22
|
+
.map((_, index) => `(columns.table_schema = :schemaName${index}
|
|
23
|
+
AND columns.table_name = :tableName${index}
|
|
24
24
|
)`)
|
|
25
25
|
.join(' OR ')})`;
|
|
26
26
|
// Query inspired by Sequelize, but adapted for multiple tables
|
|
27
27
|
// and support of multiple databases
|
|
28
28
|
const query = `
|
|
29
|
-
SELECT
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
29
|
+
SELECT
|
|
30
|
+
"Schema",
|
|
31
|
+
"Table",
|
|
32
|
+
"Field",
|
|
33
|
+
"Constraint",
|
|
34
|
+
"Default",
|
|
35
|
+
"Null",
|
|
36
|
+
"Identity",
|
|
37
|
+
"Type",
|
|
38
|
+
"ElementType",
|
|
39
|
+
"Comment",
|
|
40
|
+
CASE WHEN SUBSTRING("TechnicalElementType", 1, LENGTH("Schema") + 1) = "Schema" || '.'
|
|
41
|
+
THEN SUBSTRING("TechnicalElementType", LENGTH("Schema") + 2)
|
|
42
|
+
ELSE "TechnicalElementType"
|
|
43
|
+
END AS "TechnicalElementType",
|
|
41
44
|
(SELECT array_agg(en.enumlabel)
|
|
42
|
-
FROM pg_catalog.pg_type t
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
45
|
+
FROM pg_catalog.pg_type t
|
|
46
|
+
JOIN pg_catalog.pg_enum en ON t.oid = en.enumtypid
|
|
47
|
+
INNER JOIN pg_catalog.pg_namespace ON pg_namespace.oid = t.typnamespace
|
|
48
|
+
WHERE (pg_namespace.nspname = "Schema" AND t.typname = udt_name)
|
|
49
|
+
OR (pg_namespace.nspname = 'public' AND t.typname = "TechnicalElementType")
|
|
50
|
+
OR CONCAT(pg_namespace.nspname, '.', t.typname) = "TechnicalElementType"
|
|
51
|
+
) AS "Special"
|
|
52
|
+
FROM (
|
|
53
|
+
SELECT
|
|
54
|
+
*,
|
|
55
|
+
(CASE
|
|
56
|
+
WHEN "ElementType" LIKE '"%"[]'
|
|
57
|
+
THEN SUBSTRING("ElementType", 2, LENGTH("ElementType") - 4)
|
|
58
|
+
WHEN "ElementType" LIKE '%[]'
|
|
59
|
+
THEN SUBSTRING("ElementType", 1, LENGTH("ElementType") - 2)
|
|
60
|
+
ELSE NULL
|
|
61
|
+
END) AS "TechnicalElementType"
|
|
62
|
+
FROM (
|
|
63
|
+
SELECT
|
|
64
|
+
columns.table_schema as "Schema",
|
|
65
|
+
columns.table_name as "Table",
|
|
66
|
+
columns.column_name as "Field",
|
|
67
|
+
pk.constraint_type as "Constraint",
|
|
68
|
+
columns.column_default as "Default",
|
|
69
|
+
columns.is_nullable as "Null",
|
|
70
|
+
columns.identity_generation as "Identity",
|
|
71
|
+
columns.udt_name as "udt_name",
|
|
72
|
+
(CASE
|
|
73
|
+
WHEN columns.udt_name = 'hstore'
|
|
74
|
+
THEN columns.udt_name
|
|
75
|
+
ELSE columns.data_type
|
|
76
|
+
END)
|
|
77
|
+
||
|
|
78
|
+
(CASE
|
|
79
|
+
WHEN columns.character_maximum_length IS NOT NULL
|
|
80
|
+
THEN '(' || columns.character_maximum_length || ')'
|
|
81
|
+
ELSE ''
|
|
82
|
+
END) as "Type",
|
|
83
|
+
pg_catalog.format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS "ElementType",
|
|
84
|
+
(SELECT pgd.description
|
|
85
|
+
FROM pg_catalog.pg_statio_all_tables AS st
|
|
86
|
+
INNER JOIN pg_catalog.pg_description pgd on (pgd.objoid=st.relid)
|
|
87
|
+
WHERE columns.ordinal_position=pgd.objsubid AND columns.table_name=st.relname
|
|
88
|
+
) AS "Comment"
|
|
89
|
+
FROM
|
|
90
|
+
information_schema.columns
|
|
91
|
+
LEFT JOIN (
|
|
92
|
+
SELECT tc.table_schema, tc.table_name,
|
|
93
|
+
cu.column_name, tc.constraint_type
|
|
94
|
+
FROM information_schema.TABLE_CONSTRAINTS tc
|
|
95
|
+
JOIN information_schema.KEY_COLUMN_USAGE cu
|
|
96
|
+
ON tc.table_schema=cu.table_schema
|
|
97
|
+
AND tc.table_name=cu.table_name
|
|
98
|
+
AND tc.constraint_name=cu.constraint_name
|
|
99
|
+
AND tc.constraint_type='PRIMARY KEY'
|
|
100
|
+
AND tc.constraint_catalog=:database
|
|
101
|
+
) pk ON pk.table_schema=columns.table_schema
|
|
102
|
+
AND pk.table_name=columns.table_name
|
|
103
|
+
AND pk.column_name=columns.column_name
|
|
104
|
+
INNER JOIN pg_catalog.pg_namespace ON (
|
|
105
|
+
pg_namespace.nspname = columns.table_schema
|
|
106
|
+
)
|
|
107
|
+
INNER JOIN pg_catalog.pg_class ON (
|
|
108
|
+
pg_class.relname = columns.table_name
|
|
109
|
+
AND pg_namespace.oid = pg_class.relnamespace
|
|
110
|
+
)
|
|
111
|
+
INNER JOIN pg_catalog.pg_attribute ON (
|
|
112
|
+
pg_class.oid = pg_attribute.attrelid
|
|
113
|
+
AND pg_attribute.attname = columns.column_name
|
|
114
|
+
)
|
|
115
|
+
WHERE columns.table_catalog = :database
|
|
116
|
+
AND ${conditions}
|
|
117
|
+
ORDER BY columns.table_schema, columns.table_name, columns.ordinal_position
|
|
118
|
+
) as raw_info
|
|
119
|
+
) as with_technical_element_type;
|
|
77
120
|
`;
|
|
78
121
|
const replacements = tableNames.reduce((acc, tableName, index) => ({
|
|
79
122
|
...acc,
|
|
@@ -108,15 +151,15 @@ class PostgreSQLDialect {
|
|
|
108
151
|
}
|
|
109
152
|
getColumnDescription(dbColumn) {
|
|
110
153
|
const type = dbColumn.Type.toUpperCase();
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
: dbColumn.ElementType?.toUpperCase();
|
|
154
|
+
const special = (0, parse_array_1.default)(dbColumn.Special);
|
|
155
|
+
const elementType = dbColumn.TechnicalElementType || dbColumn.ElementType;
|
|
114
156
|
const sequelizeColumn = {
|
|
115
157
|
type,
|
|
116
|
-
|
|
158
|
+
// Don't change the casing of types when it's an enum
|
|
159
|
+
elementType: special ? elementType : elementType?.toUpperCase(),
|
|
117
160
|
allowNull: dbColumn.Null === 'YES',
|
|
118
161
|
comment: dbColumn.Comment,
|
|
119
|
-
special
|
|
162
|
+
special,
|
|
120
163
|
primaryKey: dbColumn.Constraint === 'PRIMARY KEY',
|
|
121
164
|
defaultValue: dbColumn.Default,
|
|
122
165
|
// Supabase databases do not expose a default value for auto-increment columns
|
|
@@ -182,4 +225,4 @@ class PostgreSQLDialect {
|
|
|
182
225
|
}
|
|
183
226
|
}
|
|
184
227
|
exports.default = PostgreSQLDialect;
|
|
185
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
228
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaW50cm9zcGVjdGlvbi9kaWFsZWN0cy9wb3N0Z3Jlc3FsLWRpYWxlY3QvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5Q0FBa0Q7QUFFbEQsZ0VBQXVDO0FBdUJ2QyxNQUFxQixpQkFBaUI7SUFDcEMsZ0JBQWdCO1FBQ2QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELGtCQUFrQixDQUFDLGVBQXlDO1FBQzFELE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUNmLFVBQXNDLEVBQ3RDLFNBQW9CO1FBRXBCLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLEVBQUU7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDO1NBQ3RGO1FBRUQsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFbkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVO2FBQzlCLEdBQUcsQ0FDRixDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUNYLHNDQUFzQyxLQUFLO2lEQUNKLEtBQUs7Y0FDeEMsQ0FDUDthQUNBLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBRW5CLCtEQUErRDtRQUMvRCxvQ0FBb0M7UUFDcEMsTUFBTSxLQUFLLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7a0JBd0ZBLFVBQVU7Ozs7S0FJdkIsQ0FBQztRQUVGLE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQ3BDLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDMUIsR0FBRyxHQUFH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
|
|
@@ -90,6 +90,7 @@ class SqlTypeConverter {
|
|
|
90
90
|
case 'REAL':
|
|
91
91
|
return 'REAL';
|
|
92
92
|
case 'NUMERIC':
|
|
93
|
+
case this.typeStartsWith(upType, 'NUMERIC'):
|
|
93
94
|
case this.typeContains(upType, 'DECIMAL'):
|
|
94
95
|
return 'DECIMAL';
|
|
95
96
|
case 'DOUBLE':
|
|
@@ -121,4 +122,4 @@ class SqlTypeConverter {
|
|
|
121
122
|
}
|
|
122
123
|
exports.default = SqlTypeConverter;
|
|
123
124
|
SqlTypeConverter.enumRegex = /ENUM\((.*)\)/i;
|
|
124
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsLXR5cGUtY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludHJvc3BlY3Rpb24vaGVscGVycy9zcWwtdHlwZS1jb252ZXJ0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFJQSxNQUFxQixnQkFBZ0I7SUFHbkMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ2xCLGVBQXlDLEVBQ3pDLFVBQTZCO1FBRTdCLFFBQVEsVUFBVSxDQUFDLElBQUksRUFBRTtZQUN2QixLQUFLLE9BQU87Z0JBQ1YsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBRW5FLEtBQUssY0FBYyxDQUFDO1lBQ3BCLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztnQkFDOUQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRXRDO2dCQUNFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1NBQzNFO0lBQ0gsQ0FBQztJQUVELGdFQUFnRTtJQUN4RCxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQTZCO1FBQ3RELE9BQU8sVUFBVSxDQUFDLFVBQVUsRUFBRSxNQUFNLEdBQUcsQ0FBQztZQUN0QyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsVUFBVSxFQUFFO1lBQ2pELENBQUMsQ0FBQywwREFBMEQ7Z0JBQzFELEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxNQUFNLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUMxQyxlQUF5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
|