xansql 1.0.0
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/Types/fields/Array.d.ts +7 -0
- package/Types/fields/Array.js +6 -0
- package/Types/fields/Array.js.map +1 -0
- package/Types/fields/Array.mjs +6 -0
- package/Types/fields/Array.mjs.map +1 -0
- package/Types/fields/Boolean.d.ts +8 -0
- package/Types/fields/Boolean.js +11 -0
- package/Types/fields/Boolean.js.map +1 -0
- package/Types/fields/Boolean.mjs +11 -0
- package/Types/fields/Boolean.mjs.map +1 -0
- package/Types/fields/Date.d.ts +10 -0
- package/Types/fields/Date.js +22 -0
- package/Types/fields/Date.js.map +1 -0
- package/Types/fields/Date.mjs +22 -0
- package/Types/fields/Date.mjs.map +1 -0
- package/Types/fields/Enum.d.ts +8 -0
- package/Types/fields/Enum.js +10 -0
- package/Types/fields/Enum.js.map +1 -0
- package/Types/fields/Enum.mjs +10 -0
- package/Types/fields/Enum.mjs.map +1 -0
- package/Types/fields/File.d.ts +7 -0
- package/Types/fields/File.js +6 -0
- package/Types/fields/File.js.map +1 -0
- package/Types/fields/File.mjs +6 -0
- package/Types/fields/File.mjs.map +1 -0
- package/Types/fields/IDField.d.ts +6 -0
- package/Types/fields/IDField.js +2 -0
- package/Types/fields/IDField.js.map +1 -0
- package/Types/fields/IDField.mjs +2 -0
- package/Types/fields/IDField.mjs.map +1 -0
- package/Types/fields/Number.d.ts +8 -0
- package/Types/fields/Number.js +11 -0
- package/Types/fields/Number.js.map +1 -0
- package/Types/fields/Number.mjs +11 -0
- package/Types/fields/Number.mjs.map +1 -0
- package/Types/fields/Object.d.ts +8 -0
- package/Types/fields/Object.js +11 -0
- package/Types/fields/Object.js.map +1 -0
- package/Types/fields/Object.mjs +11 -0
- package/Types/fields/Object.mjs.map +1 -0
- package/Types/fields/Record.d.ts +8 -0
- package/Types/fields/Record.js +11 -0
- package/Types/fields/Record.js.map +1 -0
- package/Types/fields/Record.mjs +11 -0
- package/Types/fields/Record.mjs.map +1 -0
- package/Types/fields/Schema.d.ts +16 -0
- package/Types/fields/Schema.js +34 -0
- package/Types/fields/Schema.js.map +1 -0
- package/Types/fields/Schema.mjs +34 -0
- package/Types/fields/Schema.mjs.map +1 -0
- package/Types/fields/String.d.ts +10 -0
- package/Types/fields/String.js +20 -0
- package/Types/fields/String.js.map +1 -0
- package/Types/fields/String.mjs +20 -0
- package/Types/fields/String.mjs.map +1 -0
- package/Types/fields/Tuple.d.ts +8 -0
- package/Types/fields/Tuple.js +11 -0
- package/Types/fields/Tuple.js.map +1 -0
- package/Types/fields/Tuple.mjs +11 -0
- package/Types/fields/Tuple.mjs.map +1 -0
- package/Types/fields/Union.d.ts +8 -0
- package/Types/fields/Union.js +11 -0
- package/Types/fields/Union.js.map +1 -0
- package/Types/fields/Union.mjs +11 -0
- package/Types/fields/Union.mjs.map +1 -0
- package/Types/index.d.ts +56 -0
- package/Types/index.js +129 -0
- package/Types/index.js.map +1 -0
- package/Types/index.mjs +129 -0
- package/Types/index.mjs.map +1 -0
- package/Types/types.d.ts +20 -0
- package/core/ExcuteMeta.d.ts +11 -0
- package/core/ExcuteMeta.js +22 -0
- package/core/ExcuteMeta.js.map +1 -0
- package/core/ExcuteMeta.mjs +22 -0
- package/core/ExcuteMeta.mjs.map +1 -0
- package/core/Xansql.d.ts +46 -0
- package/core/Xansql.js +132 -0
- package/core/Xansql.js.map +1 -0
- package/core/Xansql.mjs +132 -0
- package/core/Xansql.mjs.map +1 -0
- package/core/XansqlError.js +11 -0
- package/core/XansqlError.js.map +1 -0
- package/core/XansqlError.mjs +11 -0
- package/core/XansqlError.mjs.map +1 -0
- package/core/XansqlResult.d.ts +12 -0
- package/core/XansqlResult.js +32 -0
- package/core/XansqlResult.js.map +1 -0
- package/core/XansqlResult.mjs +32 -0
- package/core/XansqlResult.mjs.map +1 -0
- package/core/classes/EventManager.d.ts +72 -0
- package/core/classes/EventManager.js +21 -0
- package/core/classes/EventManager.js.map +1 -0
- package/core/classes/EventManager.mjs +21 -0
- package/core/classes/EventManager.mjs.map +1 -0
- package/core/classes/ForeignInfo.js +51 -0
- package/core/classes/ForeignInfo.js.map +1 -0
- package/core/classes/ForeignInfo.mjs +51 -0
- package/core/classes/ForeignInfo.mjs.map +1 -0
- package/core/classes/Migration/ForeingMigration.d.ts +12 -0
- package/core/classes/Migration/ForeingMigration.js +52 -0
- package/core/classes/Migration/ForeingMigration.js.map +1 -0
- package/core/classes/Migration/ForeingMigration.mjs +52 -0
- package/core/classes/Migration/ForeingMigration.mjs.map +1 -0
- package/core/classes/Migration/IndexMigration.d.ts +12 -0
- package/core/classes/Migration/IndexMigration.js +49 -0
- package/core/classes/Migration/IndexMigration.js.map +1 -0
- package/core/classes/Migration/IndexMigration.mjs +49 -0
- package/core/classes/Migration/IndexMigration.mjs.map +1 -0
- package/core/classes/Migration/TableMigration.d.ts +33 -0
- package/core/classes/Migration/TableMigration.js +215 -0
- package/core/classes/Migration/TableMigration.js.map +1 -0
- package/core/classes/Migration/TableMigration.mjs +215 -0
- package/core/classes/Migration/TableMigration.mjs.map +1 -0
- package/core/classes/Migration/index.d.ts +12 -0
- package/core/classes/Migration/index.js +189 -0
- package/core/classes/Migration/index.js.map +1 -0
- package/core/classes/Migration/index.mjs +189 -0
- package/core/classes/Migration/index.mjs.map +1 -0
- package/core/classes/ModelFormatter.js +166 -0
- package/core/classes/ModelFormatter.js.map +1 -0
- package/core/classes/ModelFormatter.mjs +166 -0
- package/core/classes/ModelFormatter.mjs.map +1 -0
- package/core/classes/TypesGenerator.d.ts +13 -0
- package/core/classes/TypesGenerator.js +170 -0
- package/core/classes/TypesGenerator.js.map +1 -0
- package/core/classes/TypesGenerator.mjs +170 -0
- package/core/classes/TypesGenerator.mjs.map +1 -0
- package/core/classes/XansqlConfig.js +33 -0
- package/core/classes/XansqlConfig.js.map +1 -0
- package/core/classes/XansqlConfig.mjs +33 -0
- package/core/classes/XansqlConfig.mjs.map +1 -0
- package/core/classes/XansqlFetch.js +304 -0
- package/core/classes/XansqlFetch.js.map +1 -0
- package/core/classes/XansqlFetch.mjs +304 -0
- package/core/classes/XansqlFetch.mjs.map +1 -0
- package/core/classes/XansqlTransaction.d.ts +13 -0
- package/core/classes/XansqlTransaction.js +46 -0
- package/core/classes/XansqlTransaction.js.map +1 -0
- package/core/classes/XansqlTransaction.mjs +46 -0
- package/core/classes/XansqlTransaction.mjs.map +1 -0
- package/core/type.d.ts +117 -0
- package/index.d.ts +3 -0
- package/index.js +1 -0
- package/index.js.map +1 -0
- package/index.mjs +1 -0
- package/index.mjs.map +1 -0
- package/model/Args/RelationExcuteArgs.js +5 -0
- package/model/Args/RelationExcuteArgs.js.map +1 -0
- package/model/Args/RelationExcuteArgs.mjs +5 -0
- package/model/Args/RelationExcuteArgs.mjs.map +1 -0
- package/model/Args/WhereArgs.js +226 -0
- package/model/Args/WhereArgs.js.map +1 -0
- package/model/Args/WhereArgs.mjs +226 -0
- package/model/Args/WhereArgs.mjs.map +1 -0
- package/model/Base.d.ts +26 -0
- package/model/Base.js +64 -0
- package/model/Base.js.map +1 -0
- package/model/Base.mjs +64 -0
- package/model/Base.mjs.map +1 -0
- package/model/Executer/Aggregate/SelectArgs.js +59 -0
- package/model/Executer/Aggregate/SelectArgs.js.map +1 -0
- package/model/Executer/Aggregate/SelectArgs.mjs +59 -0
- package/model/Executer/Aggregate/SelectArgs.mjs.map +1 -0
- package/model/Executer/Aggregate/index.js +59 -0
- package/model/Executer/Aggregate/index.js.map +1 -0
- package/model/Executer/Aggregate/index.mjs +59 -0
- package/model/Executer/Aggregate/index.mjs.map +1 -0
- package/model/Executer/Create/CreateDataArgs.js +145 -0
- package/model/Executer/Create/CreateDataArgs.js.map +1 -0
- package/model/Executer/Create/CreateDataArgs.mjs +145 -0
- package/model/Executer/Create/CreateDataArgs.mjs.map +1 -0
- package/model/Executer/Create/index.js +101 -0
- package/model/Executer/Create/index.js.map +1 -0
- package/model/Executer/Create/index.mjs +101 -0
- package/model/Executer/Create/index.mjs.map +1 -0
- package/model/Executer/Delete/index.js +112 -0
- package/model/Executer/Delete/index.js.map +1 -0
- package/model/Executer/Delete/index.mjs +112 -0
- package/model/Executer/Delete/index.mjs.map +1 -0
- package/model/Executer/Find/DistinctArgs.js +32 -0
- package/model/Executer/Find/DistinctArgs.js.map +1 -0
- package/model/Executer/Find/DistinctArgs.mjs +32 -0
- package/model/Executer/Find/DistinctArgs.mjs.map +1 -0
- package/model/Executer/Find/LimitArgs.js +31 -0
- package/model/Executer/Find/LimitArgs.js.map +1 -0
- package/model/Executer/Find/LimitArgs.mjs +31 -0
- package/model/Executer/Find/LimitArgs.mjs.map +1 -0
- package/model/Executer/Find/OrderByArgs.js +29 -0
- package/model/Executer/Find/OrderByArgs.js.map +1 -0
- package/model/Executer/Find/OrderByArgs.mjs +29 -0
- package/model/Executer/Find/OrderByArgs.mjs.map +1 -0
- package/model/Executer/Find/SelectArgs.js +119 -0
- package/model/Executer/Find/SelectArgs.js.map +1 -0
- package/model/Executer/Find/SelectArgs.mjs +119 -0
- package/model/Executer/Find/SelectArgs.mjs.map +1 -0
- package/model/Executer/Find/index.js +338 -0
- package/model/Executer/Find/index.js.map +1 -0
- package/model/Executer/Find/index.mjs +338 -0
- package/model/Executer/Find/index.mjs.map +1 -0
- package/model/Executer/Update/UpdateDataArgs.js +124 -0
- package/model/Executer/Update/UpdateDataArgs.js.map +1 -0
- package/model/Executer/Update/UpdateDataArgs.mjs +124 -0
- package/model/Executer/Update/UpdateDataArgs.mjs.map +1 -0
- package/model/Executer/Update/index.js +207 -0
- package/model/Executer/Update/index.js.map +1 -0
- package/model/Executer/Update/index.mjs +207 -0
- package/model/Executer/Update/index.mjs.map +1 -0
- package/model/include/ValueFormatter.js +99 -0
- package/model/include/ValueFormatter.js.map +1 -0
- package/model/include/ValueFormatter.mjs +99 -0
- package/model/include/ValueFormatter.mjs.map +1 -0
- package/model/index.d.ts +29 -0
- package/model/index.js +236 -0
- package/model/index.js.map +1 -0
- package/model/index.mjs +236 -0
- package/model/index.mjs.map +1 -0
- package/model/type.d.ts +106 -0
- package/package.json +32 -0
- package/readme.md +359 -0
- package/utils/chunker.js +53 -0
- package/utils/chunker.js.map +1 -0
- package/utils/chunker.mjs +53 -0
- package/utils/chunker.mjs.map +1 -0
- package/utils/index.js +49 -0
- package/utils/index.js.map +1 -0
- package/utils/index.mjs +49 -0
- package/utils/index.mjs.map +1 -0
- package/utils/sha256.js +66 -0
- package/utils/sha256.js.map +1 -0
- package/utils/sha256.mjs +66 -0
- package/utils/sha256.mjs.map +1 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import XqlArray from'../../Types/fields/Array.mjs';import XqlSchema from'../../Types/fields/Schema.mjs';import XansqlError from'../XansqlError.mjs';/**
|
|
2
|
+
* Foreign Key Class
|
|
3
|
+
* @description This class is used to handle foreign key relationships between models
|
|
4
|
+
* @example
|
|
5
|
+
* const foreignInfo = Foreign.info(model, column);
|
|
6
|
+
* console.log(foreignInfo);
|
|
7
|
+
*/
|
|
8
|
+
class Foreign {
|
|
9
|
+
static is(field) {
|
|
10
|
+
return this.isArray(field) || this.isSchema(field);
|
|
11
|
+
}
|
|
12
|
+
static isArray(field) {
|
|
13
|
+
return field instanceof XqlArray && this.isSchema(field.type);
|
|
14
|
+
}
|
|
15
|
+
static isSchema(field) {
|
|
16
|
+
return field instanceof XqlSchema;
|
|
17
|
+
}
|
|
18
|
+
static get(model, column) {
|
|
19
|
+
model.table;
|
|
20
|
+
let schema = model.schema;
|
|
21
|
+
let field = schema[column];
|
|
22
|
+
if (this.isArray(field)) {
|
|
23
|
+
const foreignType = field.type;
|
|
24
|
+
return {
|
|
25
|
+
table: foreignType.table,
|
|
26
|
+
column: foreignType.column,
|
|
27
|
+
relation: {
|
|
28
|
+
main: foreignType.column,
|
|
29
|
+
target: model.IDColumn,
|
|
30
|
+
},
|
|
31
|
+
sql: `${foreignType.table}.${foreignType.column} = ${model.table}.${model.IDColumn}`
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
else if (this.isSchema(field)) {
|
|
35
|
+
const FModel = model.xansql.getModel(field.table);
|
|
36
|
+
return {
|
|
37
|
+
table: field.table,
|
|
38
|
+
column: field.column,
|
|
39
|
+
relation: {
|
|
40
|
+
main: FModel.IDColumn,
|
|
41
|
+
target: column
|
|
42
|
+
},
|
|
43
|
+
sql: `${field.table}.${FModel.IDColumn} = ${model.table}.${column}`
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
throw new XansqlError({
|
|
47
|
+
message: `Field ${column} in model ${model.table} is not a foreign key.`,
|
|
48
|
+
model: model.table,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}export{Foreign as default};//# sourceMappingURL=ForeignInfo.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ForeignInfo.mjs","sources":["../../../src/core/classes/ForeignInfo.ts"],"sourcesContent":["import Model from \"../../model\";\nimport XqlArray from \"../../Types/fields/Array\";\nimport XqlSchema from \"../../Types/fields/Schema\";\nimport { XqlFields } from \"../../Types/types\";\nimport XansqlError from \"../XansqlError\";\n\n\nexport type ForeignInfoType = {\n table: string\n column: string\n relation: {\n main: string\n target: string\n }\n sql: string\n}\n/**\n * Foreign Key Class\n * @description This class is used to handle foreign key relationships between models\n * @example\n * const foreignInfo = Foreign.info(model, column);\n * console.log(foreignInfo);\n */\nclass Foreign {\n\n static is(field: XqlFields) {\n return this.isArray(field) || this.isSchema(field)\n }\n\n static isArray(field: XqlFields) {\n return field instanceof XqlArray && this.isSchema((field as any).type)\n }\n\n static isSchema(field: XqlFields) {\n return field instanceof XqlSchema\n }\n\n static get(model: Model, column: string): ForeignInfoType {\n let table = model.table\n let schema = model.schema\n let field: any = schema[column]\n\n if (this.isArray(field)) {\n const foreignType = field.type as XqlSchema;\n return {\n table: foreignType.table,\n column: foreignType.column,\n relation: {\n main: foreignType.column,\n target: model.IDColumn,\n },\n sql: `${foreignType.table}.${foreignType.column} = ${model.table}.${model.IDColumn}`\n }\n } else if (this.isSchema(field)) {\n const FModel = model.xansql.getModel(field.table)\n return {\n table: field.table,\n column: field.column,\n relation: {\n main: FModel.IDColumn,\n target: column\n },\n sql: `${field.table}.${FModel.IDColumn} = ${model.table}.${column}`\n }\n }\n throw new XansqlError({\n message: `Field ${column} in model ${model.table} is not a foreign key.`,\n model: model.table,\n });\n }\n\n}\n\nexport default Foreign"],"names":[],"mappings":"oJAgBA;;;;;;AAMG;AACH,MAAM,OAAO,CAAA;IAEV,OAAO,EAAE,CAAC,KAAgB,EAAA;AACvB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;IACrD;IAEA,OAAO,OAAO,CAAC,KAAgB,EAAA;AAC5B,QAAA,OAAO,KAAK,YAAY,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAE,KAAa,CAAC,IAAI,CAAC;IACzE;IAEA,OAAO,QAAQ,CAAC,KAAgB,EAAA;QAC7B,OAAO,KAAK,YAAY,SAAS;IACpC;AAEA,IAAA,OAAO,GAAG,CAAC,KAAY,EAAE,MAAc,EAAA;AACpC,QAAY,KAAK,CAAC;AAClB,QAAA,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM;AACzB,QAAA,IAAI,KAAK,GAAQ,MAAM,CAAC,MAAM,CAAC;AAE/B,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACtB,YAAA,MAAM,WAAW,GAAG,KAAK,CAAC,IAAiB;YAC3C,OAAO;gBACJ,KAAK,EAAE,WAAW,CAAC,KAAK;gBACxB,MAAM,EAAE,WAAW,CAAC,MAAM;AAC1B,gBAAA,QAAQ,EAAE;oBACP,IAAI,EAAE,WAAW,CAAC,MAAM;oBACxB,MAAM,EAAE,KAAK,CAAC,QAAQ;AACxB,iBAAA;AACD,gBAAA,GAAG,EAAE,CAAA,EAAG,WAAW,CAAC,KAAK,IAAI,WAAW,CAAC,MAAM,CAAA,GAAA,EAAM,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAA;aACpF;QACJ;AAAO,aAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AAC9B,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;YACjD,OAAO;gBACJ,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,MAAM,EAAE,KAAK,CAAC,MAAM;AACpB,gBAAA,QAAQ,EAAE;oBACP,IAAI,EAAE,MAAM,CAAC,QAAQ;AACrB,oBAAA,MAAM,EAAE;AACV,iBAAA;AACD,gBAAA,GAAG,EAAE,CAAA,EAAG,KAAK,CAAC,KAAK,CAAA,CAAA,EAAI,MAAM,CAAC,QAAQ,MAAM,KAAK,CAAC,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA;aACnE;QACJ;QACA,MAAM,IAAI,WAAW,CAAC;AACnB,YAAA,OAAO,EAAE,CAAA,MAAA,EAAS,MAAM,aAAa,KAAK,CAAC,KAAK,CAAA,sBAAA,CAAwB;YACxE,KAAK,EAAE,KAAK,CAAC,KAAK;AACpB,SAAA,CAAC;IACL;AAEF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import Xansql from '../../Xansql.js';
|
|
2
|
+
|
|
3
|
+
declare class ForeignKeyMigration {
|
|
4
|
+
xansql: Xansql;
|
|
5
|
+
constructor(xansql: Xansql);
|
|
6
|
+
identifier(table: string, column: string): string;
|
|
7
|
+
foreigns(): string[];
|
|
8
|
+
buildCreate(table: string, column: string, refTable?: string, refColumn?: string): string;
|
|
9
|
+
buildDrop(table: string, column: string): string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export { ForeignKeyMigration as default };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var index=require('../../../utils/index.js'),ForeignInfo=require('../ForeignInfo.js');class ForeignKeyMigration {
|
|
2
|
+
constructor(xansql) {
|
|
3
|
+
this.xansql = xansql;
|
|
4
|
+
}
|
|
5
|
+
identifier(table, column) {
|
|
6
|
+
return `fk_${table}_${column}`;
|
|
7
|
+
}
|
|
8
|
+
foreigns() {
|
|
9
|
+
const models = this.xansql.models;
|
|
10
|
+
let statements = [];
|
|
11
|
+
for (const model of models.values()) {
|
|
12
|
+
const schema = (model === null || model === void 0 ? void 0 : model.schema) || {};
|
|
13
|
+
for (const column in schema) {
|
|
14
|
+
const field = schema[column];
|
|
15
|
+
if (ForeignInfo.default.isSchema(field)) {
|
|
16
|
+
const fkSql = this.buildCreate(model.table, column);
|
|
17
|
+
statements.push(fkSql);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return statements;
|
|
22
|
+
}
|
|
23
|
+
buildCreate(table, column, refTable = '', refColumn = '') {
|
|
24
|
+
const engine = this.xansql.config.dialect.engine;
|
|
25
|
+
const model = this.xansql.models.get(table);
|
|
26
|
+
const schema = (model === null || model === void 0 ? void 0 : model.schema) || {};
|
|
27
|
+
const field = schema[column];
|
|
28
|
+
const meta = field.meta || {};
|
|
29
|
+
const isOptional = meta.nullable || meta.optional;
|
|
30
|
+
const fk = this.identifier(table, column);
|
|
31
|
+
let sql = `CONSTRAINT ${fk} FOREIGN KEY (${index.quote(engine, column)}) REFERENCES ${index.quote(engine, refTable)}(${index.quote(engine, refColumn)})`;
|
|
32
|
+
if (isOptional) {
|
|
33
|
+
sql += ` ON DELETE SET NULL ON UPDATE CASCADE`;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
sql += ` ON DELETE CASCADE ON UPDATE CASCADE`;
|
|
37
|
+
}
|
|
38
|
+
return sql;
|
|
39
|
+
}
|
|
40
|
+
buildDrop(table, column) {
|
|
41
|
+
const engine = this.xansql.config.dialect.engine;
|
|
42
|
+
const fkName = this.identifier(table, column);
|
|
43
|
+
let sql = '';
|
|
44
|
+
if (engine === 'postgresql' || engine === 'sqlite') {
|
|
45
|
+
sql += `ALTER TABLE ${table} DROP CONSTRAINT IF EXISTS ${fkName};`;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
sql += `ALTER TABLE ${table} DROP FOREIGN KEY IF EXISTS ${fkName};`;
|
|
49
|
+
}
|
|
50
|
+
return sql;
|
|
51
|
+
}
|
|
52
|
+
}exports.default=ForeignKeyMigration;//# sourceMappingURL=ForeingMigration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ForeingMigration.js","sources":["../../../../src/core/classes/Migration/ForeingMigration.ts"],"sourcesContent":["import { quote } from \"../../../utils\";\nimport Foreign from \"../ForeignInfo\";\nimport Xansql from \"../../Xansql\";\n\n\nclass ForeignKeyMigration {\n xansql: Xansql;\n\n constructor(xansql: Xansql) {\n this.xansql = xansql;\n }\n\n identifier(table: string, column: string) {\n return `fk_${table}_${column}`;\n }\n\n foreigns() {\n const models = this.xansql.models;\n let statements: string[] = [];\n\n for (const model of models.values()) {\n const schema = model?.schema || {};\n for (const column in schema) {\n const field = schema[column];\n if (Foreign.isSchema(field)) {\n const fkSql = this.buildCreate(model.table, column);\n statements.push(fkSql);\n }\n }\n }\n\n return statements;\n }\n\n buildCreate(table: string, column: string, refTable: string = '', refColumn: string = '') {\n const engine = this.xansql.config.dialect.engine;\n const model = this.xansql.models.get(table);\n const schema = model?.schema || {};\n const field = schema[column];\n const meta = field.meta || {};\n const isOptional = meta.nullable || meta.optional;\n const fk = this.identifier(table, column);\n\n let sql = `CONSTRAINT ${fk} FOREIGN KEY (${quote(engine, column)}) REFERENCES ${quote(engine, refTable)}(${quote(engine, refColumn)})`;\n if (isOptional) {\n sql += ` ON DELETE SET NULL ON UPDATE CASCADE`;\n } else {\n sql += ` ON DELETE CASCADE ON UPDATE CASCADE`;\n }\n\n return sql;\n }\n\n buildDrop(table: string, column: string) {\n const engine = this.xansql.config.dialect.engine;\n const fkName = this.identifier(table, column);\n let sql = '';\n if (engine === 'postgresql' || engine === 'sqlite') {\n sql += `ALTER TABLE ${table} DROP CONSTRAINT IF EXISTS ${fkName};`;\n } else {\n sql += `ALTER TABLE ${table} DROP FOREIGN KEY IF EXISTS ${fkName};`;\n }\n return sql;\n }\n}\n\nexport default ForeignKeyMigration;"],"names":["Foreign","quote"],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import {quote}from'../../../utils/index.mjs';import Foreign from'../ForeignInfo.mjs';class ForeignKeyMigration {
|
|
2
|
+
constructor(xansql) {
|
|
3
|
+
this.xansql = xansql;
|
|
4
|
+
}
|
|
5
|
+
identifier(table, column) {
|
|
6
|
+
return `fk_${table}_${column}`;
|
|
7
|
+
}
|
|
8
|
+
foreigns() {
|
|
9
|
+
const models = this.xansql.models;
|
|
10
|
+
let statements = [];
|
|
11
|
+
for (const model of models.values()) {
|
|
12
|
+
const schema = (model === null || model === void 0 ? void 0 : model.schema) || {};
|
|
13
|
+
for (const column in schema) {
|
|
14
|
+
const field = schema[column];
|
|
15
|
+
if (Foreign.isSchema(field)) {
|
|
16
|
+
const fkSql = this.buildCreate(model.table, column);
|
|
17
|
+
statements.push(fkSql);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return statements;
|
|
22
|
+
}
|
|
23
|
+
buildCreate(table, column, refTable = '', refColumn = '') {
|
|
24
|
+
const engine = this.xansql.config.dialect.engine;
|
|
25
|
+
const model = this.xansql.models.get(table);
|
|
26
|
+
const schema = (model === null || model === void 0 ? void 0 : model.schema) || {};
|
|
27
|
+
const field = schema[column];
|
|
28
|
+
const meta = field.meta || {};
|
|
29
|
+
const isOptional = meta.nullable || meta.optional;
|
|
30
|
+
const fk = this.identifier(table, column);
|
|
31
|
+
let sql = `CONSTRAINT ${fk} FOREIGN KEY (${quote(engine, column)}) REFERENCES ${quote(engine, refTable)}(${quote(engine, refColumn)})`;
|
|
32
|
+
if (isOptional) {
|
|
33
|
+
sql += ` ON DELETE SET NULL ON UPDATE CASCADE`;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
sql += ` ON DELETE CASCADE ON UPDATE CASCADE`;
|
|
37
|
+
}
|
|
38
|
+
return sql;
|
|
39
|
+
}
|
|
40
|
+
buildDrop(table, column) {
|
|
41
|
+
const engine = this.xansql.config.dialect.engine;
|
|
42
|
+
const fkName = this.identifier(table, column);
|
|
43
|
+
let sql = '';
|
|
44
|
+
if (engine === 'postgresql' || engine === 'sqlite') {
|
|
45
|
+
sql += `ALTER TABLE ${table} DROP CONSTRAINT IF EXISTS ${fkName};`;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
sql += `ALTER TABLE ${table} DROP FOREIGN KEY IF EXISTS ${fkName};`;
|
|
49
|
+
}
|
|
50
|
+
return sql;
|
|
51
|
+
}
|
|
52
|
+
}export{ForeignKeyMigration as default};//# sourceMappingURL=ForeingMigration.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ForeingMigration.mjs","sources":["../../../../src/core/classes/Migration/ForeingMigration.ts"],"sourcesContent":["import { quote } from \"../../../utils\";\nimport Foreign from \"../ForeignInfo\";\nimport Xansql from \"../../Xansql\";\n\n\nclass ForeignKeyMigration {\n xansql: Xansql;\n\n constructor(xansql: Xansql) {\n this.xansql = xansql;\n }\n\n identifier(table: string, column: string) {\n return `fk_${table}_${column}`;\n }\n\n foreigns() {\n const models = this.xansql.models;\n let statements: string[] = [];\n\n for (const model of models.values()) {\n const schema = model?.schema || {};\n for (const column in schema) {\n const field = schema[column];\n if (Foreign.isSchema(field)) {\n const fkSql = this.buildCreate(model.table, column);\n statements.push(fkSql);\n }\n }\n }\n\n return statements;\n }\n\n buildCreate(table: string, column: string, refTable: string = '', refColumn: string = '') {\n const engine = this.xansql.config.dialect.engine;\n const model = this.xansql.models.get(table);\n const schema = model?.schema || {};\n const field = schema[column];\n const meta = field.meta || {};\n const isOptional = meta.nullable || meta.optional;\n const fk = this.identifier(table, column);\n\n let sql = `CONSTRAINT ${fk} FOREIGN KEY (${quote(engine, column)}) REFERENCES ${quote(engine, refTable)}(${quote(engine, refColumn)})`;\n if (isOptional) {\n sql += ` ON DELETE SET NULL ON UPDATE CASCADE`;\n } else {\n sql += ` ON DELETE CASCADE ON UPDATE CASCADE`;\n }\n\n return sql;\n }\n\n buildDrop(table: string, column: string) {\n const engine = this.xansql.config.dialect.engine;\n const fkName = this.identifier(table, column);\n let sql = '';\n if (engine === 'postgresql' || engine === 'sqlite') {\n sql += `ALTER TABLE ${table} DROP CONSTRAINT IF EXISTS ${fkName};`;\n } else {\n sql += `ALTER TABLE ${table} DROP FOREIGN KEY IF EXISTS ${fkName};`;\n }\n return sql;\n }\n}\n\nexport default ForeignKeyMigration;"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import Xansql from '../../Xansql.js';
|
|
2
|
+
|
|
3
|
+
declare class IndexMigration {
|
|
4
|
+
xansql: Xansql;
|
|
5
|
+
constructor(xansql: Xansql);
|
|
6
|
+
identifier(table: string, column: string): string;
|
|
7
|
+
indexes(): string[];
|
|
8
|
+
buildCreate(table: string, column: string): string;
|
|
9
|
+
buildDrop(table: string, column: string): string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export { IndexMigration as default };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var index=require('../../../utils/index.js');class IndexMigration {
|
|
2
|
+
constructor(xansql) {
|
|
3
|
+
this.xansql = xansql;
|
|
4
|
+
}
|
|
5
|
+
identifier(table, column) {
|
|
6
|
+
const model = this.xansql.models.get(table);
|
|
7
|
+
const field = model === null || model === void 0 ? void 0 : model.schema[column];
|
|
8
|
+
const meta = (field === null || field === void 0 ? void 0 : field.meta) || {};
|
|
9
|
+
return `${table}_${column}${meta.unique ? '_unique_index' : '_index'}`;
|
|
10
|
+
}
|
|
11
|
+
indexes() {
|
|
12
|
+
const models = this.xansql.models;
|
|
13
|
+
let statements = [];
|
|
14
|
+
for (const model of models.values()) {
|
|
15
|
+
const schema = (model === null || model === void 0 ? void 0 : model.schema) || {};
|
|
16
|
+
for (const column in schema) {
|
|
17
|
+
const field = schema[column];
|
|
18
|
+
const meta = field.meta || {};
|
|
19
|
+
if (meta.index) {
|
|
20
|
+
const indexSql = this.buildCreate(model.table, column);
|
|
21
|
+
statements.push(indexSql);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return statements;
|
|
26
|
+
}
|
|
27
|
+
buildCreate(table, column) {
|
|
28
|
+
const engine = this.xansql.config.dialect.engine;
|
|
29
|
+
const model = this.xansql.models.get(table);
|
|
30
|
+
const field = model === null || model === void 0 ? void 0 : model.schema[column];
|
|
31
|
+
const meta = (field === null || field === void 0 ? void 0 : field.meta) || {};
|
|
32
|
+
const unique = meta.unique ? 'UNIQUE' : '';
|
|
33
|
+
const indexName = this.identifier(table, column);
|
|
34
|
+
let sql = `CREATE ${unique} INDEX ${indexName} ON ${index.quote(engine, table)} (${index.quote(engine, column)});`;
|
|
35
|
+
return sql;
|
|
36
|
+
}
|
|
37
|
+
buildDrop(table, column) {
|
|
38
|
+
const engine = this.xansql.config.dialect.engine;
|
|
39
|
+
const indexName = this.identifier(table, column);
|
|
40
|
+
let sql = '';
|
|
41
|
+
if (engine === 'postgresql' || engine === 'sqlite') {
|
|
42
|
+
sql += `DROP INDEX IF EXISTS ${indexName};`;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
sql += `DROP INDEX IF EXISTS ${indexName} ON ${table};`;
|
|
46
|
+
}
|
|
47
|
+
return sql;
|
|
48
|
+
}
|
|
49
|
+
}exports.default=IndexMigration;//# sourceMappingURL=IndexMigration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IndexMigration.js","sources":["../../../../src/core/classes/Migration/IndexMigration.ts"],"sourcesContent":["import { quote } from \"../../../utils\";\nimport Xansql from \"../../Xansql\";\n\n\nclass IndexMigration {\n xansql: Xansql;\n constructor(xansql: Xansql) {\n this.xansql = xansql;\n }\n\n identifier(table: string, column: string) {\n const model = this.xansql.models.get(table);\n const field = model?.schema[column];\n const meta = field?.meta || {};\n return `${table}_${column}${meta.unique ? '_unique_index' : '_index'}`;\n }\n\n indexes() {\n const models = this.xansql.models;\n let statements: string[] = [];\n\n for (const model of models.values()) {\n const schema = model?.schema || {};\n for (const column in schema) {\n const field = schema[column];\n const meta = field.meta || {};\n if (meta.index) {\n const indexSql = this.buildCreate(model.table, column);\n statements.push(indexSql);\n }\n }\n }\n\n return statements\n }\n\n buildCreate(table: string, column: string) {\n const engine = this.xansql.config.dialect.engine;\n const model = this.xansql.models.get(table);\n const field = model?.schema[column];\n const meta = field?.meta || {};\n const unique = meta.unique ? 'UNIQUE' : '';\n const indexName = this.identifier(table, column);\n let sql = `CREATE ${unique} INDEX ${indexName} ON ${quote(engine, table)} (${quote(engine, column)});`\n return sql;\n }\n\n buildDrop(table: string, column: string) {\n const engine = this.xansql.config.dialect.engine;\n const indexName = this.identifier(table, column);\n let sql = '';\n if (engine === 'postgresql' || engine === 'sqlite') {\n sql += `DROP INDEX IF EXISTS ${indexName};`;\n } else {\n sql += `DROP INDEX IF EXISTS ${indexName} ON ${table};`;\n }\n return sql;\n }\n}\n\nexport default IndexMigration;"],"names":["quote"],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import {quote}from'../../../utils/index.mjs';class IndexMigration {
|
|
2
|
+
constructor(xansql) {
|
|
3
|
+
this.xansql = xansql;
|
|
4
|
+
}
|
|
5
|
+
identifier(table, column) {
|
|
6
|
+
const model = this.xansql.models.get(table);
|
|
7
|
+
const field = model === null || model === void 0 ? void 0 : model.schema[column];
|
|
8
|
+
const meta = (field === null || field === void 0 ? void 0 : field.meta) || {};
|
|
9
|
+
return `${table}_${column}${meta.unique ? '_unique_index' : '_index'}`;
|
|
10
|
+
}
|
|
11
|
+
indexes() {
|
|
12
|
+
const models = this.xansql.models;
|
|
13
|
+
let statements = [];
|
|
14
|
+
for (const model of models.values()) {
|
|
15
|
+
const schema = (model === null || model === void 0 ? void 0 : model.schema) || {};
|
|
16
|
+
for (const column in schema) {
|
|
17
|
+
const field = schema[column];
|
|
18
|
+
const meta = field.meta || {};
|
|
19
|
+
if (meta.index) {
|
|
20
|
+
const indexSql = this.buildCreate(model.table, column);
|
|
21
|
+
statements.push(indexSql);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return statements;
|
|
26
|
+
}
|
|
27
|
+
buildCreate(table, column) {
|
|
28
|
+
const engine = this.xansql.config.dialect.engine;
|
|
29
|
+
const model = this.xansql.models.get(table);
|
|
30
|
+
const field = model === null || model === void 0 ? void 0 : model.schema[column];
|
|
31
|
+
const meta = (field === null || field === void 0 ? void 0 : field.meta) || {};
|
|
32
|
+
const unique = meta.unique ? 'UNIQUE' : '';
|
|
33
|
+
const indexName = this.identifier(table, column);
|
|
34
|
+
let sql = `CREATE ${unique} INDEX ${indexName} ON ${quote(engine, table)} (${quote(engine, column)});`;
|
|
35
|
+
return sql;
|
|
36
|
+
}
|
|
37
|
+
buildDrop(table, column) {
|
|
38
|
+
const engine = this.xansql.config.dialect.engine;
|
|
39
|
+
const indexName = this.identifier(table, column);
|
|
40
|
+
let sql = '';
|
|
41
|
+
if (engine === 'postgresql' || engine === 'sqlite') {
|
|
42
|
+
sql += `DROP INDEX IF EXISTS ${indexName};`;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
sql += `DROP INDEX IF EXISTS ${indexName} ON ${table};`;
|
|
46
|
+
}
|
|
47
|
+
return sql;
|
|
48
|
+
}
|
|
49
|
+
}export{IndexMigration as default};//# sourceMappingURL=IndexMigration.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IndexMigration.mjs","sources":["../../../../src/core/classes/Migration/IndexMigration.ts"],"sourcesContent":["import { quote } from \"../../../utils\";\nimport Xansql from \"../../Xansql\";\n\n\nclass IndexMigration {\n xansql: Xansql;\n constructor(xansql: Xansql) {\n this.xansql = xansql;\n }\n\n identifier(table: string, column: string) {\n const model = this.xansql.models.get(table);\n const field = model?.schema[column];\n const meta = field?.meta || {};\n return `${table}_${column}${meta.unique ? '_unique_index' : '_index'}`;\n }\n\n indexes() {\n const models = this.xansql.models;\n let statements: string[] = [];\n\n for (const model of models.values()) {\n const schema = model?.schema || {};\n for (const column in schema) {\n const field = schema[column];\n const meta = field.meta || {};\n if (meta.index) {\n const indexSql = this.buildCreate(model.table, column);\n statements.push(indexSql);\n }\n }\n }\n\n return statements\n }\n\n buildCreate(table: string, column: string) {\n const engine = this.xansql.config.dialect.engine;\n const model = this.xansql.models.get(table);\n const field = model?.schema[column];\n const meta = field?.meta || {};\n const unique = meta.unique ? 'UNIQUE' : '';\n const indexName = this.identifier(table, column);\n let sql = `CREATE ${unique} INDEX ${indexName} ON ${quote(engine, table)} (${quote(engine, column)});`\n return sql;\n }\n\n buildDrop(table: string, column: string) {\n const engine = this.xansql.config.dialect.engine;\n const indexName = this.identifier(table, column);\n let sql = '';\n if (engine === 'postgresql' || engine === 'sqlite') {\n sql += `DROP INDEX IF EXISTS ${indexName};`;\n } else {\n sql += `DROP INDEX IF EXISTS ${indexName} ON ${table};`;\n }\n return sql;\n }\n}\n\nexport default IndexMigration;"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import Model from '../../../model/index.js';
|
|
2
|
+
import Xansql from '../../Xansql.js';
|
|
3
|
+
import ForeignKeyMigration from './ForeingMigration.js';
|
|
4
|
+
import IndexMigration from './IndexMigration.js';
|
|
5
|
+
|
|
6
|
+
declare class Migration {
|
|
7
|
+
xansql: Xansql;
|
|
8
|
+
readonly ForeignKeyMigration: ForeignKeyMigration;
|
|
9
|
+
readonly IndexMigration: IndexMigration;
|
|
10
|
+
constructor(xansql: Xansql);
|
|
11
|
+
statements(): {
|
|
12
|
+
options: string[];
|
|
13
|
+
tables: {
|
|
14
|
+
table: string;
|
|
15
|
+
sql: string;
|
|
16
|
+
}[];
|
|
17
|
+
indexes: {
|
|
18
|
+
table: string;
|
|
19
|
+
sql: string;
|
|
20
|
+
}[];
|
|
21
|
+
};
|
|
22
|
+
buildCreate(model: Model): {
|
|
23
|
+
sql: string;
|
|
24
|
+
indexes: {
|
|
25
|
+
table: string;
|
|
26
|
+
sql: string;
|
|
27
|
+
}[];
|
|
28
|
+
};
|
|
29
|
+
buildDrop(model: any): string;
|
|
30
|
+
buildColumn(table: string, column: string): string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export { Migration as default };
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var Array=require('../../../Types/fields/Array.js'),Boolean=require('../../../Types/fields/Boolean.js'),Date=require('../../../Types/fields/Date.js'),Enum=require('../../../Types/fields/Enum.js'),File=require('../../../Types/fields/File.js'),IDField=require('../../../Types/fields/IDField.js'),Number=require('../../../Types/fields/Number.js'),Object$1=require('../../../Types/fields/Object.js'),Record=require('../../../Types/fields/Record.js'),Schema=require('../../../Types/fields/Schema.js'),String=require('../../../Types/fields/String.js'),Tuple=require('../../../Types/fields/Tuple.js'),Union=require('../../../Types/fields/Union.js'),index=require('../../../utils/index.js'),XansqlError=require('../../XansqlError.js'),ForeignInfo=require('../ForeignInfo.js'),ForeingMigration=require('./ForeingMigration.js'),IndexMigration=require('./IndexMigration.js');class Migration {
|
|
2
|
+
constructor(xansql) {
|
|
3
|
+
this.xansql = xansql;
|
|
4
|
+
this.ForeignKeyMigration = new ForeingMigration.default(xansql);
|
|
5
|
+
this.IndexMigration = new IndexMigration.default(xansql);
|
|
6
|
+
}
|
|
7
|
+
statements() {
|
|
8
|
+
const engine = this.xansql.config.dialect.engine;
|
|
9
|
+
const models = this.xansql.models;
|
|
10
|
+
const options = [];
|
|
11
|
+
const tables = [];
|
|
12
|
+
const indexes = [];
|
|
13
|
+
if (engine === 'sqlite') {
|
|
14
|
+
options.push(`PRAGMA foreign_keys = ON;`);
|
|
15
|
+
options.push(`PRAGMA journal_mode = WAL;`);
|
|
16
|
+
options.push(`PRAGMA wal_autocheckpoint = 1000;`);
|
|
17
|
+
options.push(`PRAGMA synchronous = NORMAL;`);
|
|
18
|
+
}
|
|
19
|
+
else if (engine === 'postgresql') {
|
|
20
|
+
options.push(`SET client_min_messages TO WARNING;`);
|
|
21
|
+
options.push(`SET standard_conforming_strings = ON;`);
|
|
22
|
+
}
|
|
23
|
+
else if (engine === 'mysql') {
|
|
24
|
+
options.push(`SET sql_mode = 'STRICT_ALL_TABLES';`);
|
|
25
|
+
options.push(`SET FOREIGN_KEY_CHECKS = 1;`);
|
|
26
|
+
options.push(`SET sql_safe_updates = 1;`);
|
|
27
|
+
}
|
|
28
|
+
for (const table of models.keys()) {
|
|
29
|
+
const model = models.get(table);
|
|
30
|
+
const { sql, indexes: modelIndexes } = this.buildCreate(model);
|
|
31
|
+
indexes.push(...modelIndexes);
|
|
32
|
+
tables.push({
|
|
33
|
+
table,
|
|
34
|
+
sql
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
options,
|
|
39
|
+
tables,
|
|
40
|
+
indexes
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
buildCreate(model) {
|
|
44
|
+
const engine = this.xansql.config.dialect.engine;
|
|
45
|
+
let indexes = [];
|
|
46
|
+
const table = model.table;
|
|
47
|
+
const schema = (model === null || model === void 0 ? void 0 : model.schema) || {};
|
|
48
|
+
let sqls = [];
|
|
49
|
+
for (const column in schema) {
|
|
50
|
+
const field = schema[column];
|
|
51
|
+
const meta = field.meta || {};
|
|
52
|
+
const sql = this.buildColumn(table, column);
|
|
53
|
+
sql && sqls.push(sql);
|
|
54
|
+
if (ForeignInfo.default.isSchema(field)) {
|
|
55
|
+
const info = ForeignInfo.default.get(model, column);
|
|
56
|
+
const fk = this.ForeignKeyMigration.buildCreate(table, column, info.table, info.relation.main);
|
|
57
|
+
if (fk) {
|
|
58
|
+
sqls.push(fk);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (meta.index && !meta.unique) {
|
|
62
|
+
const indexSql = this.IndexMigration.buildCreate(table, column);
|
|
63
|
+
indexes.push({ table, sql: indexSql });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
let sql = `CREATE TABLE IF NOT EXISTS ${index.quote(engine, table)} (${sqls.join(',')})`;
|
|
67
|
+
if (engine === 'mysql') {
|
|
68
|
+
sql += ` ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;`;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
sql += ` ;`;
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
sql,
|
|
75
|
+
indexes
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
buildDrop(model) {
|
|
79
|
+
const engine = this.xansql.config.dialect.engine;
|
|
80
|
+
const table = model.table;
|
|
81
|
+
let sql = `DROP TABLE IF EXISTS ${index.quote(engine, table)};`;
|
|
82
|
+
return sql;
|
|
83
|
+
}
|
|
84
|
+
buildColumn(table, column) {
|
|
85
|
+
const engine = this.xansql.config.dialect.engine;
|
|
86
|
+
const model = this.xansql.models.get(table);
|
|
87
|
+
const field = model === null || model === void 0 ? void 0 : model.schema[column];
|
|
88
|
+
const meta = (field === null || field === void 0 ? void 0 : field.meta) || {};
|
|
89
|
+
const nullable = meta.nullable || meta.optional ? 'NULL' : 'NOT NULL';
|
|
90
|
+
const unique = meta.unique ? 'UNIQUE' : '';
|
|
91
|
+
const col = (column, sqlType) => {
|
|
92
|
+
return ` ${index.quote(engine, column)} ${sqlType} ${nullable} ${unique}`.trim();
|
|
93
|
+
};
|
|
94
|
+
let sql = '';
|
|
95
|
+
if (field instanceof IDField.default) {
|
|
96
|
+
if (engine === 'mysql') {
|
|
97
|
+
sql += col(column, "INT AUTO_INCREMENT PRIMARY KEY");
|
|
98
|
+
}
|
|
99
|
+
else if (engine === 'postgresql') {
|
|
100
|
+
sql += col(column, "SERIAL PRIMARY KEY");
|
|
101
|
+
}
|
|
102
|
+
else if (engine === 'sqlite') {
|
|
103
|
+
sql += col(column, "INTEGER PRIMARY KEY AUTOINCREMENT");
|
|
104
|
+
}
|
|
105
|
+
else if (engine === 'mssql') {
|
|
106
|
+
sql += col(column, "INT IDENTITY(1,1) PRIMARY KEY");
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else if (field instanceof Schema.default) {
|
|
110
|
+
if (engine === 'mysql') {
|
|
111
|
+
sql += col(column, "INT");
|
|
112
|
+
}
|
|
113
|
+
else if (engine === 'postgresql' || engine === 'sqlite') {
|
|
114
|
+
sql += col(column, "INTEGER");
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else if (field instanceof String.default) {
|
|
118
|
+
let length = meta.length || meta.max;
|
|
119
|
+
if (meta.text || length > 65535 || engine === 'sqlite') {
|
|
120
|
+
sql += col(column, "TEXT");
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
sql += col(column, `VARCHAR(${length || 255})`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else if (field instanceof File.default) {
|
|
127
|
+
sql += col(column, "VARCHAR(255)");
|
|
128
|
+
}
|
|
129
|
+
else if (field instanceof Number.default) {
|
|
130
|
+
if (engine === "mysql") {
|
|
131
|
+
if (meta.integer) {
|
|
132
|
+
sql += col(column, "INT");
|
|
133
|
+
}
|
|
134
|
+
else if (meta.float) {
|
|
135
|
+
sql += col(column, "FLOAT");
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
sql += col(column, "DECIMAL(10, 2)");
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else if (engine === "postgresql" || engine === "sqlite") {
|
|
142
|
+
if (meta.integer) {
|
|
143
|
+
sql += col(column, "INTEGER");
|
|
144
|
+
}
|
|
145
|
+
else if (meta.float) {
|
|
146
|
+
sql += col(column, "REAL");
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
sql += col(column, engine === "sqlite" ? "NUMERIC" : "NUMERIC(10, 2)");
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
else if (field instanceof Boolean.default) {
|
|
154
|
+
if (engine === "mysql" || engine === "postgresql") {
|
|
155
|
+
sql += col(column, "BOOLEAN");
|
|
156
|
+
}
|
|
157
|
+
else if (engine === "sqlite") {
|
|
158
|
+
sql += col(column, "INTEGER"); // SQLite has no BOOLEAN → use INTEGER (0/1)
|
|
159
|
+
}
|
|
160
|
+
else if (engine === "mssql") {
|
|
161
|
+
sql += col(column, "BIT"); // MSSQL uses BIT for boolean
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else if (field instanceof Date.default) {
|
|
165
|
+
if (engine === "mysql") {
|
|
166
|
+
sql += col(column, "DATETIME");
|
|
167
|
+
}
|
|
168
|
+
else if (engine === "postgresql") {
|
|
169
|
+
sql += col(column, "TIMESTAMP");
|
|
170
|
+
}
|
|
171
|
+
else if (engine === "sqlite") {
|
|
172
|
+
sql += col(column, "TEXT"); // store ISO string (SQLite has no native DATETIME)
|
|
173
|
+
}
|
|
174
|
+
else if (engine === "mssql") {
|
|
175
|
+
sql += col(column, "DATETIME2");
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
else if (field instanceof Enum.default) {
|
|
179
|
+
if (engine === "mysql") {
|
|
180
|
+
sql += col(column, `ENUM(${field.values.map((v) => index.quote(engine, v)).join(', ')})`);
|
|
181
|
+
}
|
|
182
|
+
else if (engine === "postgresql") {
|
|
183
|
+
const enumName = `${column}_enum`;
|
|
184
|
+
sql += `CREATE TYPE ${enumName} AS ENUM (${field.values.map((v) => index.quote(engine, v)).join(', ')}); `;
|
|
185
|
+
sql += col(column, enumName);
|
|
186
|
+
}
|
|
187
|
+
else if (engine === "sqlite") {
|
|
188
|
+
const values = field.values.map((v) => index.quote(engine, v)).join(", ");
|
|
189
|
+
sql += `"${column}" TEXT CHECK("${column}" IN (${values})) ${nullable} ${unique}, `;
|
|
190
|
+
}
|
|
191
|
+
else if (engine === "mssql") {
|
|
192
|
+
const values = field.values.map((v) => index.quote(engine, v)).join(", ");
|
|
193
|
+
sql += `"${column}" NVARCHAR(255) CHECK("${column}" IN (${values})) ${nullable} ${unique}, `;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
else if (field instanceof Object$1.default || field instanceof Record.default || field instanceof Tuple.default || field instanceof Union.default) {
|
|
197
|
+
sql += col(column, "TEXT");
|
|
198
|
+
}
|
|
199
|
+
else if (field instanceof Array.default) {
|
|
200
|
+
const arrayType = field.type;
|
|
201
|
+
const isSchemaArray = arrayType instanceof Schema.default;
|
|
202
|
+
if (!isSchemaArray) {
|
|
203
|
+
sql += col(column, "TEXT");
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
throw new XansqlError.default({
|
|
208
|
+
message: `Unsupported field type for column "${column}" in table "${table}".`,
|
|
209
|
+
model: table,
|
|
210
|
+
column
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
return sql;
|
|
214
|
+
}
|
|
215
|
+
}exports.default=Migration;//# sourceMappingURL=TableMigration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableMigration.js","sources":["../../../../src/core/classes/Migration/TableMigration.ts"],"sourcesContent":["import Model from \"../../../model\";\nimport XqlArray from \"../../../Types/fields/Array\";\nimport XqlBoolean from \"../../../Types/fields/Boolean\";\nimport XqlDate from \"../../../Types/fields/Date\";\nimport XqlEnum from \"../../../Types/fields/Enum\";\nimport XqlFile from \"../../../Types/fields/File\";\nimport XqlIDField from \"../../../Types/fields/IDField\";\nimport XqlNumber from \"../../../Types/fields/Number\";\nimport XqlObject from \"../../../Types/fields/Object\";\nimport XqlRecord from \"../../../Types/fields/Record\";\nimport XqlSchema from \"../../../Types/fields/Schema\";\nimport XqlString from \"../../../Types/fields/String\";\nimport XqlTuple from \"../../../Types/fields/Tuple\";\nimport XqlUnion from \"../../../Types/fields/Union\";\nimport { quote } from \"../../../utils\";\nimport Xansql from \"../../Xansql\";\nimport XansqlError from \"../../XansqlError\";\nimport Foreign from \"../ForeignInfo\";\nimport ForeignKeyMigration from \"./ForeingMigration\";\nimport IndexMigration from \"./IndexMigration\";\n\nclass Migration {\n xansql: Xansql;\n readonly ForeignKeyMigration: ForeignKeyMigration\n readonly IndexMigration: IndexMigration\n constructor(xansql: Xansql) {\n this.xansql = xansql;\n this.ForeignKeyMigration = new ForeignKeyMigration(xansql);\n this.IndexMigration = new IndexMigration(xansql);\n }\n\n statements() {\n const engine = this.xansql.config.dialect.engine;\n const models = this.xansql.models;\n\n const options: string[] = []\n const tables: ({ table: string, sql: string })[] = [];\n const indexes: ({ table: string, sql: string })[] = [];\n\n if (engine === 'sqlite') {\n options.push(`PRAGMA foreign_keys = ON;`);\n options.push(`PRAGMA journal_mode = WAL;`);\n options.push(`PRAGMA wal_autocheckpoint = 1000;`);\n options.push(`PRAGMA synchronous = NORMAL;`);\n } else if (engine === 'postgresql') {\n options.push(`SET client_min_messages TO WARNING;`);\n options.push(`SET standard_conforming_strings = ON;`);\n } else if (engine === 'mysql') {\n options.push(`SET sql_mode = 'STRICT_ALL_TABLES';`);\n options.push(`SET FOREIGN_KEY_CHECKS = 1;`);\n options.push(`SET sql_safe_updates = 1;`);\n }\n\n for (const table of models.keys()) {\n const model = models.get(table);\n const { sql, indexes: modelIndexes } = this.buildCreate(model!);\n indexes.push(...modelIndexes);\n tables.push({\n table,\n sql\n });\n }\n\n return {\n options,\n tables,\n indexes\n }\n }\n\n buildCreate(model: Model) {\n const engine = this.xansql.config.dialect.engine;\n let indexes: ({ table: string, sql: string })[] = [];\n const table = model.table;\n const schema = model?.schema || {};\n let sqls: string[] = [];\n\n for (const column in schema) {\n const field = schema[column];\n const meta = field.meta || {};\n const sql = this.buildColumn(table, column);\n sql && sqls.push(sql);\n\n if (Foreign.isSchema(field)) {\n const info = Foreign.get(model!, column)\n const fk = this.ForeignKeyMigration.buildCreate(table, column, info.table, info.relation.main);\n if (fk) {\n sqls.push(fk);\n }\n }\n\n if (meta.index && !meta.unique) {\n const indexSql = this.IndexMigration.buildCreate(table, column);\n indexes.push({ table, sql: indexSql });\n }\n }\n\n let sql = `CREATE TABLE IF NOT EXISTS ${quote(engine, table)} (${sqls.join(',')})`;\n if (engine === 'mysql') {\n sql += ` ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;`;\n } else {\n sql += ` ;`;\n }\n\n return {\n sql,\n indexes\n }\n }\n\n buildDrop(model: any) {\n const engine = this.xansql.config.dialect.engine;\n const table = model.table;\n let sql = `DROP TABLE IF EXISTS ${quote(engine, table)};`;\n return sql;\n }\n\n buildColumn(table: string, column: string) {\n const engine = this.xansql.config.dialect.engine;\n const model = this.xansql.models.get(table);\n const field = model?.schema[column];\n const meta = field?.meta || {};\n const nullable = meta.nullable || meta.optional ? 'NULL' : 'NOT NULL';\n const unique = meta.unique ? 'UNIQUE' : '';\n const col = (column: string, sqlType: string) => {\n return ` ${quote(engine, column)} ${sqlType} ${nullable} ${unique}`.trim()\n };\n let sql = ''\n if (field instanceof XqlIDField) {\n if (engine === 'mysql') {\n sql += col(column, \"INT AUTO_INCREMENT PRIMARY KEY\");\n } else if (engine === 'postgresql') {\n sql += col(column, \"SERIAL PRIMARY KEY\")\n } else if (engine === 'sqlite') {\n sql += col(column, \"INTEGER PRIMARY KEY AUTOINCREMENT\")\n } else if (engine === 'mssql') {\n sql += col(column, \"INT IDENTITY(1,1) PRIMARY KEY\")\n }\n } else if (field instanceof XqlSchema) {\n if (engine === 'mysql') {\n sql += col(column, \"INT\")\n } else if (engine === 'postgresql' || engine === 'sqlite') {\n sql += col(column, \"INTEGER\")\n }\n } else if (field instanceof XqlString) {\n let length = meta.length || meta.max\n if (meta.text || length > 65535 || engine === 'sqlite') {\n sql += col(column, \"TEXT\")\n } else {\n sql += col(column, `VARCHAR(${length || 255})`)\n }\n } else if (field instanceof XqlFile) {\n sql += col(column, \"VARCHAR(255)\")\n } else if (field instanceof XqlNumber) {\n if (engine === \"mysql\") {\n if (meta.integer) {\n sql += col(column, \"INT\")\n } else if (meta.float) {\n sql += col(column, \"FLOAT\")\n } else {\n sql += col(column, \"DECIMAL(10, 2)\")\n }\n } else if (engine === \"postgresql\" || engine === \"sqlite\") {\n if (meta.integer) {\n sql += col(column, \"INTEGER\")\n } else if (meta.float) {\n sql += col(column, \"REAL\")\n } else {\n sql += col(column, engine === \"sqlite\" ? \"NUMERIC\" : \"NUMERIC(10, 2)\")\n }\n }\n } else if (field instanceof XqlBoolean) {\n if (engine === \"mysql\" || engine === \"postgresql\") {\n sql += col(column, \"BOOLEAN\")\n } else if (engine === \"sqlite\") {\n sql += col(column, \"INTEGER\") // SQLite has no BOOLEAN → use INTEGER (0/1)\n } else if (engine === \"mssql\") {\n sql += col(column, \"BIT\") // MSSQL uses BIT for boolean\n }\n } else if (field instanceof XqlDate) {\n if (engine === \"mysql\") {\n sql += col(column, \"DATETIME\")\n } else if (engine === \"postgresql\") {\n sql += col(column, \"TIMESTAMP\")\n } else if (engine === \"sqlite\") {\n sql += col(column, \"TEXT\") // store ISO string (SQLite has no native DATETIME)\n } else if (engine === \"mssql\") {\n sql += col(column, \"DATETIME2\")\n }\n } else if (field instanceof XqlEnum) {\n if (engine === \"mysql\") {\n sql += col(column, `ENUM(${(field as any).values.map((v: any) => quote(engine, v)).join(', ')})`)\n } else if (engine === \"postgresql\") {\n const enumName = `${column}_enum`;\n sql += `CREATE TYPE ${enumName} AS ENUM (${(field as any).values.map((v: any) => quote(engine, v)).join(', ')}); `\n sql += col(column, enumName)\n } else if (engine === \"sqlite\") {\n const values = (field as any).values.map((v: any) => quote(engine, v)).join(\", \");\n sql += `\"${column}\" TEXT CHECK(\"${column}\" IN (${values})) ${nullable} ${unique}, `\n } else if (engine === \"mssql\") {\n const values = (field as any).values.map((v: any) => quote(engine, v)).join(\", \");\n sql += `\"${column}\" NVARCHAR(255) CHECK(\"${column}\" IN (${values})) ${nullable} ${unique}, `\n }\n } else if (field instanceof XqlObject || field instanceof XqlRecord || field instanceof XqlTuple || field instanceof XqlUnion) {\n sql += col(column, \"TEXT\")\n } else if (field instanceof XqlArray) {\n const arrayType = (field as any).type;\n const isSchemaArray = arrayType instanceof XqlSchema;\n if (!isSchemaArray) {\n sql += col(column, \"TEXT\")\n }\n } else {\n throw new XansqlError({\n message: `Unsupported field type for column \"${column}\" in table \"${table}\".`,\n model: table,\n column\n });\n }\n return sql;\n }\n}\n\nexport default Migration"],"names":["ForeignKeyMigration","IndexMigration","Foreign","quote","XqlIDField","XqlSchema","XqlString","XqlFile","XqlNumber","XqlBoolean","XqlDate","XqlEnum","XqlObject","XqlRecord","XqlTuple","XqlUnion","XqlArray","XansqlError"],"mappings":"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"}
|