@tachybase/module-collection 1.3.21 → 1.3.23
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/externalVersion.js +4 -8
- package/dist/server/actions/collectionImportExportMeta.d.ts +1 -1
- package/dist/server/actions/collectionImportExportMeta.js +5 -5
- package/dist/server/collections/collectionCategories.d.ts +1 -1
- package/dist/server/collections/collections.d.ts +1 -1
- package/dist/server/collections/fields.d.ts +1 -1
- package/dist/server/hooks/afterCreateForForeignKeyField.d.ts +1 -1
- package/dist/server/hooks/afterCreateForForeignKeyField.js +1 -0
- package/dist/server/hooks/afterCreateForReverseField.d.ts +1 -1
- package/dist/server/hooks/afterDestroyForForeignKeyField.d.ts +1 -1
- package/dist/server/hooks/afterUpdateForForeignKeyField.d.ts +2 -0
- package/dist/server/hooks/afterUpdateForForeignKeyField.js +249 -0
- package/dist/server/hooks/beforeCreateForChildrenCollection.d.ts +1 -1
- package/dist/server/hooks/beforeCreateForReverseField.d.ts +1 -1
- package/dist/server/hooks/beforeCreateForValidateField.d.ts +1 -1
- package/dist/server/hooks/beforeCreateForViewCollection.d.ts +1 -1
- package/dist/server/hooks/beforeDestroyForeignKey.d.ts +1 -1
- package/dist/server/hooks/beforeInitOptions.d.ts +1 -1
- package/dist/server/hooks/beforeInitOptions.js +8 -8
- package/dist/server/migrations/20220613103214-alert-sub-table.d.ts +1 -1
- package/dist/server/migrations/20220613103214-alert-sub-table.js +1 -1
- package/dist/server/migrations/20220704225714-drop-foreign-keys.d.ts +1 -1
- package/dist/server/migrations/20220704225714-drop-foreign-keys.js +1 -1
- package/dist/server/migrations/20221101111110-update-foreign-fields.d.ts +1 -1
- package/dist/server/migrations/20221101111110-update-foreign-fields.js +1 -1
- package/dist/server/migrations/20221104151410-update-collections-hidden.d.ts +1 -1
- package/dist/server/migrations/20221104151410-update-collections-hidden.js +1 -1
- package/dist/server/migrations/20221121111110-update-fk-type.d.ts +1 -1
- package/dist/server/migrations/20221121111110-update-fk-type.js +4 -5
- package/dist/server/migrations/20221121111113-update-id-to-bigint.d.ts +1 -1
- package/dist/server/migrations/20221121111113-update-id-to-bigint.js +4 -5
- package/dist/server/migrations/20221221103220-timestamps.d.ts +1 -1
- package/dist/server/migrations/20221221103220-timestamps.js +1 -1
- package/dist/server/migrations/20230225111112-drop-ui-schema-relation.d.ts +1 -1
- package/dist/server/migrations/20230225111112-drop-ui-schema-relation.js +1 -1
- package/dist/server/migrations/20230509111114-alert-ui-schema.d.ts +1 -1
- package/dist/server/migrations/20230509111114-alert-ui-schema.js +1 -1
- package/dist/server/migrations/20230623145414-number-step.d.ts +1 -1
- package/dist/server/migrations/20230623145414-number-step.js +1 -1
- package/dist/server/migrations/20230704222935-tableoid.d.ts +1 -1
- package/dist/server/migrations/20230704222935-tableoid.js +1 -1
- package/dist/server/migrations/20230918024546-set-collection-schema.d.ts +1 -1
- package/dist/server/migrations/20230918024546-set-collection-schema.js +1 -1
- package/dist/server/migrations/20240220153103-install-main-datasource.d.ts +1 -1
- package/dist/server/migrations/20240220153103-install-main-datasource.js +1 -1
- package/dist/server/models/collection.d.ts +1 -1
- package/dist/server/models/collection.js +2 -2
- package/dist/server/models/field.d.ts +2 -2
- package/dist/server/models/field.js +2 -2
- package/dist/server/repositories/collection-repository.d.ts +1 -1
- package/dist/server/repositories/collection-repository.js +3 -4
- package/dist/server/resourcers/sql.d.ts +1 -1
- package/dist/server/resourcers/sql.js +2 -2
- package/dist/server/resourcers/views.js +2 -2
- package/dist/server/server.d.ts +1 -2
- package/dist/server/server.js +10 -9
- package/package.json +9 -16
package/dist/externalVersion.js
CHANGED
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
module.exports = {
|
|
2
|
-
"@tachybase/client": "1.3.
|
|
3
|
-
"@tachybase/
|
|
4
|
-
"@
|
|
5
|
-
"@tachybase/server": "1.3.21",
|
|
2
|
+
"@tachybase/client": "1.3.23",
|
|
3
|
+
"@tachybase/module-error-handler": "1.3.23",
|
|
4
|
+
"@tego/server": "1.3.43",
|
|
6
5
|
"async-mutex": "0.5.0",
|
|
7
6
|
"lodash": "4.17.21",
|
|
8
|
-
"@tachybase/test": "1.3.
|
|
9
|
-
"@tachybase/actions": "1.3.21",
|
|
10
|
-
"@tachybase/resourcer": "1.3.21",
|
|
11
|
-
"@tachybase/utils": "1.3.21",
|
|
7
|
+
"@tachybase/test": "1.3.43",
|
|
12
8
|
"sequelize": "6.37.5",
|
|
13
9
|
"dayjs": "1.11.13"
|
|
14
10
|
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { ResourceOptions } from '@
|
|
1
|
+
import { ResourceOptions } from '@tego/server';
|
|
2
2
|
export declare const collectionImportExportMeta: ResourceOptions;
|
|
@@ -32,19 +32,19 @@ __export(collectionImportExportMeta_exports, {
|
|
|
32
32
|
module.exports = __toCommonJS(collectionImportExportMeta_exports);
|
|
33
33
|
var import_promises = __toESM(require("node:fs/promises"));
|
|
34
34
|
var import_node_os = __toESM(require("node:os"));
|
|
35
|
-
var
|
|
35
|
+
var import_server = require("@tego/server");
|
|
36
36
|
const collectionImportExportMeta = {
|
|
37
37
|
name: "collections",
|
|
38
38
|
middleware: async (ctx, next) => {
|
|
39
39
|
if (ctx.action.actionName === "importMeta") {
|
|
40
|
-
const storage =
|
|
40
|
+
const storage = import_server.koaMulter.diskStorage({
|
|
41
41
|
destination: import_node_os.default.tmpdir(),
|
|
42
42
|
filename: function(req, file, cb) {
|
|
43
43
|
const randomName = Date.now().toString() + Math.random().toString().slice(2);
|
|
44
44
|
cb(null, randomName);
|
|
45
45
|
}
|
|
46
46
|
});
|
|
47
|
-
const upload = (0,
|
|
47
|
+
const upload = (0, import_server.koaMulter)({ storage }).single("file");
|
|
48
48
|
return upload(ctx, next);
|
|
49
49
|
} else {
|
|
50
50
|
return next();
|
|
@@ -150,12 +150,12 @@ const collectionImportExportMeta = {
|
|
|
150
150
|
return;
|
|
151
151
|
}
|
|
152
152
|
if (collection && collection.name !== meta.name) {
|
|
153
|
-
meta.key = (0,
|
|
153
|
+
meta.key = (0, import_server.uid)();
|
|
154
154
|
return;
|
|
155
155
|
} else {
|
|
156
156
|
collection = existCollections.find((v) => v.name === meta.name);
|
|
157
157
|
if (collection) {
|
|
158
|
-
collection.name = `t_${(0,
|
|
158
|
+
collection.name = `t_${(0, import_server.uid)()}`;
|
|
159
159
|
collectionNameMap[meta.name] = collection.name;
|
|
160
160
|
meta.name = collection.name;
|
|
161
161
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import Database from '@
|
|
1
|
+
import { Database } from '@tego/server';
|
|
2
2
|
export declare function afterCreateForForeignKeyField(db: Database): (model: any, options: any) => Promise<void>;
|
|
@@ -122,6 +122,7 @@ function afterCreateForForeignKeyField(db) {
|
|
|
122
122
|
source
|
|
123
123
|
} = model.get();
|
|
124
124
|
if (source) return;
|
|
125
|
+
if (target === "__temp__") return;
|
|
125
126
|
if (["oho", "o2m"].includes(interfaceType)) {
|
|
126
127
|
const values = generateFkOptions(target, foreignKey);
|
|
127
128
|
await createFieldIfNotExists({
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import Database from '@
|
|
1
|
+
import { Database } from '@tego/server';
|
|
2
2
|
export declare function afterDestroyForForeignKeyField(db: Database): (model: any, opts: any) => Promise<void>;
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var afterUpdateForForeignKeyField_exports = {};
|
|
19
|
+
__export(afterUpdateForForeignKeyField_exports, {
|
|
20
|
+
afterUpdateForForeignKeyField: () => afterUpdateForForeignKeyField
|
|
21
|
+
});
|
|
22
|
+
module.exports = __toCommonJS(afterUpdateForForeignKeyField_exports);
|
|
23
|
+
function afterUpdateForForeignKeyField(db) {
|
|
24
|
+
function generateFkOptions(collectionName, foreignKey) {
|
|
25
|
+
const collection = db.getCollection(collectionName);
|
|
26
|
+
if (!collection) {
|
|
27
|
+
throw new Error("collection not found");
|
|
28
|
+
}
|
|
29
|
+
const M = collection.model;
|
|
30
|
+
const attr = M.rawAttributes[foreignKey];
|
|
31
|
+
if (!attr) {
|
|
32
|
+
throw new Error(`${collectionName}.${foreignKey} does not exists`);
|
|
33
|
+
}
|
|
34
|
+
return attribute2field(attr);
|
|
35
|
+
}
|
|
36
|
+
function attribute2field(attribute) {
|
|
37
|
+
let type = "bigInt";
|
|
38
|
+
if (attribute.type.constructor.name === "INTEGER") {
|
|
39
|
+
type = "integer";
|
|
40
|
+
} else if (attribute.type.constructor.name === "STRING") {
|
|
41
|
+
type = "string";
|
|
42
|
+
}
|
|
43
|
+
const name = attribute.fieldName;
|
|
44
|
+
const data = {
|
|
45
|
+
interface: "integer",
|
|
46
|
+
name,
|
|
47
|
+
type,
|
|
48
|
+
uiSchema: {
|
|
49
|
+
type: "number",
|
|
50
|
+
title: name,
|
|
51
|
+
"x-component": "InputNumber",
|
|
52
|
+
"x-read-pretty": true
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
if (type === "string") {
|
|
56
|
+
data["interface"] = "input";
|
|
57
|
+
data["uiSchema"] = {
|
|
58
|
+
type: "string",
|
|
59
|
+
title: name,
|
|
60
|
+
"x-component": "Input",
|
|
61
|
+
"x-read-pretty": true
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return data;
|
|
65
|
+
}
|
|
66
|
+
async function createFieldIfNotExists({ values, transaction }) {
|
|
67
|
+
const { collectionName, name } = values;
|
|
68
|
+
if (!collectionName || !name) {
|
|
69
|
+
throw new Error(`field options invalid`);
|
|
70
|
+
}
|
|
71
|
+
const r = db.getRepository("fields");
|
|
72
|
+
const instance = await r.findOne({
|
|
73
|
+
filter: {
|
|
74
|
+
collectionName,
|
|
75
|
+
name
|
|
76
|
+
},
|
|
77
|
+
transaction
|
|
78
|
+
});
|
|
79
|
+
if (instance) {
|
|
80
|
+
if (instance.type !== values.type) {
|
|
81
|
+
throw new Error(`fk type invalid`);
|
|
82
|
+
}
|
|
83
|
+
instance.set("sort", 1);
|
|
84
|
+
instance.set("isForeignKey", true);
|
|
85
|
+
await instance.save({ transaction });
|
|
86
|
+
} else {
|
|
87
|
+
const creatInstance = await r.create({
|
|
88
|
+
values: {
|
|
89
|
+
isForeignKey: true,
|
|
90
|
+
...values
|
|
91
|
+
},
|
|
92
|
+
transaction
|
|
93
|
+
});
|
|
94
|
+
creatInstance.set("sort", 1);
|
|
95
|
+
await creatInstance.save({ transaction });
|
|
96
|
+
}
|
|
97
|
+
await r.update({
|
|
98
|
+
filter: {
|
|
99
|
+
collectionName,
|
|
100
|
+
options: {
|
|
101
|
+
primaryKey: true
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
values: {
|
|
105
|
+
sort: 0
|
|
106
|
+
},
|
|
107
|
+
transaction
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
const hook = async (model, { transaction, context }) => {
|
|
111
|
+
var _a;
|
|
112
|
+
if (!context) return;
|
|
113
|
+
const {
|
|
114
|
+
interface: interfaceType,
|
|
115
|
+
collectionName,
|
|
116
|
+
target: newTarget,
|
|
117
|
+
foreignKey: newForeignKey,
|
|
118
|
+
otherKey: newOtherKey,
|
|
119
|
+
through,
|
|
120
|
+
source,
|
|
121
|
+
type
|
|
122
|
+
} = model.get();
|
|
123
|
+
if (source || !interfaceType) return;
|
|
124
|
+
if (newTarget === "__temp__") return;
|
|
125
|
+
const { target: oldTarget, foreignKey: oldForeignKey, otherKey: oldOtherKey } = model.previous("options") || {};
|
|
126
|
+
const fieldsRepo = db.getRepository("fields");
|
|
127
|
+
const hasTargetChanged = oldTarget !== void 0 && oldTarget !== newTarget;
|
|
128
|
+
const hasForeignKeyChanged = oldForeignKey !== void 0 && oldForeignKey !== newForeignKey;
|
|
129
|
+
const hasOtherKeyChanged = oldOtherKey !== void 0 && oldOtherKey !== newOtherKey;
|
|
130
|
+
const needUpdate = hasTargetChanged || hasForeignKeyChanged || hasOtherKeyChanged;
|
|
131
|
+
const collection = db.getCollection(model.get("collectionName"));
|
|
132
|
+
collection == null ? void 0 : collection.updateField(model.get("name"), model.get());
|
|
133
|
+
const field = collection == null ? void 0 : collection.getField(model.get("name"));
|
|
134
|
+
if (!needUpdate) return;
|
|
135
|
+
try {
|
|
136
|
+
(_a = field == null ? void 0 : field.unbind) == null ? void 0 : _a.call(field);
|
|
137
|
+
field.bind();
|
|
138
|
+
} catch (e) {
|
|
139
|
+
throw e;
|
|
140
|
+
}
|
|
141
|
+
async function removeOldForeignKeyField(collection2, fkName) {
|
|
142
|
+
if (!collection2 || !fkName) return;
|
|
143
|
+
const exists = await fieldsRepo.findOne({
|
|
144
|
+
filter: {
|
|
145
|
+
collectionName: collection2,
|
|
146
|
+
name: fkName
|
|
147
|
+
// isForeignKey: true,
|
|
148
|
+
},
|
|
149
|
+
transaction
|
|
150
|
+
});
|
|
151
|
+
if (exists) {
|
|
152
|
+
await fieldsRepo.destroy({
|
|
153
|
+
filter: {
|
|
154
|
+
collectionName: collection2,
|
|
155
|
+
name: fkName
|
|
156
|
+
// isForeignKey: true,
|
|
157
|
+
},
|
|
158
|
+
transaction
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (["oho", "o2m"].includes(interfaceType)) {
|
|
163
|
+
await removeOldForeignKeyField(oldTarget, oldForeignKey);
|
|
164
|
+
const values = generateFkOptions(newTarget, newForeignKey);
|
|
165
|
+
await createFieldIfNotExists({
|
|
166
|
+
values: {
|
|
167
|
+
collectionName: newTarget,
|
|
168
|
+
...values
|
|
169
|
+
},
|
|
170
|
+
transaction
|
|
171
|
+
});
|
|
172
|
+
} else if (["obo", "m2o"].includes(interfaceType)) {
|
|
173
|
+
await removeOldForeignKeyField(collectionName, oldForeignKey);
|
|
174
|
+
const values = generateFkOptions(collectionName, newForeignKey);
|
|
175
|
+
await createFieldIfNotExists({
|
|
176
|
+
values: {
|
|
177
|
+
collectionName,
|
|
178
|
+
...values
|
|
179
|
+
},
|
|
180
|
+
transaction
|
|
181
|
+
});
|
|
182
|
+
} else if (["linkTo", "m2m"].includes(interfaceType)) {
|
|
183
|
+
if (type !== "belongsToMany") {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const collectionsRepo = db.getRepository("collections");
|
|
187
|
+
const existingThrough = await collectionsRepo.findOne({
|
|
188
|
+
filter: {
|
|
189
|
+
name: through
|
|
190
|
+
},
|
|
191
|
+
transaction
|
|
192
|
+
});
|
|
193
|
+
if (existingThrough) {
|
|
194
|
+
await collectionsRepo.destroy({
|
|
195
|
+
filter: {
|
|
196
|
+
name: through
|
|
197
|
+
},
|
|
198
|
+
transaction
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
await collectionsRepo.create({
|
|
202
|
+
values: {
|
|
203
|
+
name: through,
|
|
204
|
+
title: through,
|
|
205
|
+
timestamps: true,
|
|
206
|
+
autoGenId: false,
|
|
207
|
+
hidden: true,
|
|
208
|
+
autoCreate: true,
|
|
209
|
+
isThrough: true,
|
|
210
|
+
sortable: false
|
|
211
|
+
},
|
|
212
|
+
context,
|
|
213
|
+
transaction
|
|
214
|
+
});
|
|
215
|
+
const opts1 = generateFkOptions(through, newForeignKey);
|
|
216
|
+
const opts2 = generateFkOptions(through, newOtherKey);
|
|
217
|
+
await createFieldIfNotExists({
|
|
218
|
+
values: {
|
|
219
|
+
collectionName: through,
|
|
220
|
+
...opts1
|
|
221
|
+
},
|
|
222
|
+
transaction
|
|
223
|
+
});
|
|
224
|
+
await createFieldIfNotExists({
|
|
225
|
+
values: {
|
|
226
|
+
collectionName: through,
|
|
227
|
+
...opts2
|
|
228
|
+
},
|
|
229
|
+
transaction
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
await model.migrate({
|
|
233
|
+
isNew: true,
|
|
234
|
+
transaction
|
|
235
|
+
});
|
|
236
|
+
};
|
|
237
|
+
return async (model, options) => {
|
|
238
|
+
try {
|
|
239
|
+
await hook(model, options);
|
|
240
|
+
} catch (error) {
|
|
241
|
+
console.error("Failed to update foreign key field:", error);
|
|
242
|
+
throw error;
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
247
|
+
0 && (module.exports = {
|
|
248
|
+
afterUpdateForForeignKeyField
|
|
249
|
+
});
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import Database from '@
|
|
1
|
+
import { Database } from '@tego/server';
|
|
2
2
|
export declare function beforeDestroyForeignKey(db: Database): (model: any, opts: any) => Promise<void>;
|
|
@@ -21,7 +21,7 @@ __export(beforeInitOptions_exports, {
|
|
|
21
21
|
beforeInitOptions: () => beforeInitOptions
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(beforeInitOptions_exports);
|
|
24
|
-
var
|
|
24
|
+
var import_server = require("@tego/server");
|
|
25
25
|
var import_sequelize = require("sequelize");
|
|
26
26
|
const setTargetKey = (db, model) => {
|
|
27
27
|
if (model.get("targetKey")) {
|
|
@@ -54,7 +54,7 @@ const beforeInitOptions = {
|
|
|
54
54
|
}
|
|
55
55
|
const defaults = {
|
|
56
56
|
// targetKey: 'id',
|
|
57
|
-
foreignKey: `f_${(0,
|
|
57
|
+
foreignKey: `f_${(0, import_server.uid)()}`
|
|
58
58
|
};
|
|
59
59
|
for (const key in defaults) {
|
|
60
60
|
if (model.get(key)) {
|
|
@@ -71,9 +71,9 @@ const beforeInitOptions = {
|
|
|
71
71
|
const defaults = {
|
|
72
72
|
// targetKey: 'id',
|
|
73
73
|
// sourceKey: 'id',
|
|
74
|
-
through: `t_${(0,
|
|
75
|
-
foreignKey: `f_${(0,
|
|
76
|
-
otherKey: `f_${(0,
|
|
74
|
+
through: `t_${(0, import_server.uid)()}`,
|
|
75
|
+
foreignKey: `f_${(0, import_server.uid)()}`,
|
|
76
|
+
otherKey: `f_${(0, import_server.uid)()}`
|
|
77
77
|
};
|
|
78
78
|
for (const key in defaults) {
|
|
79
79
|
if (model.get(key)) {
|
|
@@ -91,8 +91,8 @@ const beforeInitOptions = {
|
|
|
91
91
|
const defaults = {
|
|
92
92
|
// targetKey: 'id',
|
|
93
93
|
// sourceKey: 'id',
|
|
94
|
-
foreignKey: `f_${(0,
|
|
95
|
-
target: `t_${(0,
|
|
94
|
+
foreignKey: `f_${(0, import_server.uid)()}`,
|
|
95
|
+
target: `t_${(0, import_server.uid)()}`
|
|
96
96
|
};
|
|
97
97
|
for (const key in defaults) {
|
|
98
98
|
if (model.get(key)) {
|
|
@@ -112,7 +112,7 @@ const beforeInitOptions = {
|
|
|
112
112
|
}
|
|
113
113
|
const defaults = {
|
|
114
114
|
// sourceKey: 'id',
|
|
115
|
-
foreignKey: `f_${(0,
|
|
115
|
+
foreignKey: `f_${(0, import_server.uid)()}`
|
|
116
116
|
};
|
|
117
117
|
for (const key in defaults) {
|
|
118
118
|
if (model.get(key)) {
|
|
@@ -20,7 +20,7 @@ __export(alert_sub_table_exports, {
|
|
|
20
20
|
default: () => alert_sub_table_default
|
|
21
21
|
});
|
|
22
22
|
module.exports = __toCommonJS(alert_sub_table_exports);
|
|
23
|
-
var import_server = require("@
|
|
23
|
+
var import_server = require("@tego/server");
|
|
24
24
|
class alert_sub_table_default extends import_server.Migration {
|
|
25
25
|
constructor() {
|
|
26
26
|
super(...arguments);
|
|
@@ -20,7 +20,7 @@ __export(drop_foreign_keys_exports, {
|
|
|
20
20
|
default: () => drop_foreign_keys_default
|
|
21
21
|
});
|
|
22
22
|
module.exports = __toCommonJS(drop_foreign_keys_exports);
|
|
23
|
-
var import_server = require("@
|
|
23
|
+
var import_server = require("@tego/server");
|
|
24
24
|
class drop_foreign_keys_default extends import_server.Migration {
|
|
25
25
|
constructor() {
|
|
26
26
|
super(...arguments);
|
|
@@ -20,7 +20,7 @@ __export(update_foreign_fields_exports, {
|
|
|
20
20
|
default: () => DropForeignKeysMigration
|
|
21
21
|
});
|
|
22
22
|
module.exports = __toCommonJS(update_foreign_fields_exports);
|
|
23
|
-
var import_server = require("@
|
|
23
|
+
var import_server = require("@tego/server");
|
|
24
24
|
var import_afterCreateForForeignKeyField = require("../hooks/afterCreateForForeignKeyField");
|
|
25
25
|
class DropForeignKeysMigration extends import_server.Migration {
|
|
26
26
|
constructor() {
|
|
@@ -20,7 +20,7 @@ __export(update_collections_hidden_exports, {
|
|
|
20
20
|
default: () => UpdateCollectionsHiddenMigration
|
|
21
21
|
});
|
|
22
22
|
module.exports = __toCommonJS(update_collections_hidden_exports);
|
|
23
|
-
var import_server = require("@
|
|
23
|
+
var import_server = require("@tego/server");
|
|
24
24
|
class UpdateCollectionsHiddenMigration extends import_server.Migration {
|
|
25
25
|
constructor() {
|
|
26
26
|
super(...arguments);
|
|
@@ -20,8 +20,7 @@ __export(update_fk_type_exports, {
|
|
|
20
20
|
default: () => UpdateIdToBigIntMigrator
|
|
21
21
|
});
|
|
22
22
|
module.exports = __toCommonJS(update_fk_type_exports);
|
|
23
|
-
var
|
|
24
|
-
var import_server = require("@tachybase/server");
|
|
23
|
+
var import_server = require("@tego/server");
|
|
25
24
|
class UpdateIdToBigIntMigrator extends import_server.Migration {
|
|
26
25
|
constructor() {
|
|
27
26
|
super(...arguments);
|
|
@@ -51,7 +50,7 @@ class UpdateIdToBigIntMigrator extends import_server.Migration {
|
|
|
51
50
|
const updateToBigInt = async (model, fieldName) => {
|
|
52
51
|
let sql;
|
|
53
52
|
const tableName = model.tableName;
|
|
54
|
-
if (model.rawAttributes[fieldName].type instanceof
|
|
53
|
+
if (model.rawAttributes[fieldName].type instanceof import_server.DataTypes.INTEGER) {
|
|
55
54
|
if (db.inDialect("postgres")) {
|
|
56
55
|
sql = `ALTER TABLE "${tableName}" ALTER COLUMN "${fieldName}" SET DATA TYPE BIGINT;`;
|
|
57
56
|
} else if (db.inDialect("mysql", "mariadb")) {
|
|
@@ -61,7 +60,7 @@ class UpdateIdToBigIntMigrator extends import_server.Migration {
|
|
|
61
60
|
{
|
|
62
61
|
[attributeName]: queryInterface.normalizeAttribute({
|
|
63
62
|
...dataTypeOrOptions,
|
|
64
|
-
type:
|
|
63
|
+
type: import_server.DataTypes.BIGINT
|
|
65
64
|
})
|
|
66
65
|
},
|
|
67
66
|
{
|
|
@@ -96,7 +95,7 @@ class UpdateIdToBigIntMigrator extends import_server.Migration {
|
|
|
96
95
|
if (primaryKeyField && primaryKeyField.primaryKey) {
|
|
97
96
|
await updateToBigInt(model, model.primaryKeyField);
|
|
98
97
|
}
|
|
99
|
-
if (model.tableAttributes["sort"] && model.tableAttributes["sort"].type instanceof
|
|
98
|
+
if (model.tableAttributes["sort"] && model.tableAttributes["sort"].type instanceof import_server.DataTypes.INTEGER) {
|
|
100
99
|
await updateToBigInt(model, "sort");
|
|
101
100
|
}
|
|
102
101
|
const associations = model.associations;
|
|
@@ -20,8 +20,7 @@ __export(update_id_to_bigint_exports, {
|
|
|
20
20
|
default: () => UpdateIdToBigIntMigrator
|
|
21
21
|
});
|
|
22
22
|
module.exports = __toCommonJS(update_id_to_bigint_exports);
|
|
23
|
-
var
|
|
24
|
-
var import_server = require("@tachybase/server");
|
|
23
|
+
var import_server = require("@tego/server");
|
|
25
24
|
class UpdateIdToBigIntMigrator extends import_server.Migration {
|
|
26
25
|
constructor() {
|
|
27
26
|
super(...arguments);
|
|
@@ -70,7 +69,7 @@ class UpdateIdToBigIntMigrator extends import_server.Migration {
|
|
|
70
69
|
fieldRecord.set("type", "bigInt");
|
|
71
70
|
await fieldRecord.save();
|
|
72
71
|
}
|
|
73
|
-
if (model.rawAttributes[fieldName].type instanceof
|
|
72
|
+
if (model.rawAttributes[fieldName].type instanceof import_server.DataTypes.INTEGER) {
|
|
74
73
|
if (db.inDialect("postgres")) {
|
|
75
74
|
sql = `ALTER TABLE ${quoteTableName} ALTER COLUMN "${columnName}" SET DATA TYPE BIGINT;`;
|
|
76
75
|
} else if (db.inDialect("mysql", "mariadb")) {
|
|
@@ -80,7 +79,7 @@ class UpdateIdToBigIntMigrator extends import_server.Migration {
|
|
|
80
79
|
{
|
|
81
80
|
[attributeName]: queryInterface.normalizeAttribute({
|
|
82
81
|
...dataTypeOrOptions,
|
|
83
|
-
type:
|
|
82
|
+
type: import_server.DataTypes.BIGINT
|
|
84
83
|
})
|
|
85
84
|
},
|
|
86
85
|
{
|
|
@@ -138,7 +137,7 @@ class UpdateIdToBigIntMigrator extends import_server.Migration {
|
|
|
138
137
|
if (primaryKeyField && primaryKeyField.primaryKey) {
|
|
139
138
|
await updateToBigInt(model, model.primaryKeyField);
|
|
140
139
|
}
|
|
141
|
-
if (model.tableAttributes["sort"] && model.tableAttributes["sort"].type instanceof
|
|
140
|
+
if (model.tableAttributes["sort"] && model.tableAttributes["sort"].type instanceof import_server.DataTypes.INTEGER) {
|
|
142
141
|
await updateToBigInt(model, "sort");
|
|
143
142
|
}
|
|
144
143
|
const associations = model.associations;
|
|
@@ -20,7 +20,7 @@ __export(timestamps_exports, {
|
|
|
20
20
|
default: () => timestamps_default
|
|
21
21
|
});
|
|
22
22
|
module.exports = __toCommonJS(timestamps_exports);
|
|
23
|
-
var import_server = require("@
|
|
23
|
+
var import_server = require("@tego/server");
|
|
24
24
|
class timestamps_default extends import_server.Migration {
|
|
25
25
|
constructor() {
|
|
26
26
|
super(...arguments);
|
|
@@ -20,7 +20,7 @@ __export(drop_ui_schema_relation_exports, {
|
|
|
20
20
|
default: () => drop_ui_schema_relation_default
|
|
21
21
|
});
|
|
22
22
|
module.exports = __toCommonJS(drop_ui_schema_relation_exports);
|
|
23
|
-
var import_server = require("@
|
|
23
|
+
var import_server = require("@tego/server");
|
|
24
24
|
class drop_ui_schema_relation_default extends import_server.Migration {
|
|
25
25
|
constructor() {
|
|
26
26
|
super(...arguments);
|
|
@@ -20,7 +20,7 @@ __export(alert_ui_schema_exports, {
|
|
|
20
20
|
default: () => alert_ui_schema_default
|
|
21
21
|
});
|
|
22
22
|
module.exports = __toCommonJS(alert_ui_schema_exports);
|
|
23
|
-
var import_server = require("@
|
|
23
|
+
var import_server = require("@tego/server");
|
|
24
24
|
class alert_ui_schema_default extends import_server.Migration {
|
|
25
25
|
constructor() {
|
|
26
26
|
super(...arguments);
|
|
@@ -30,7 +30,7 @@ __export(number_step_exports, {
|
|
|
30
30
|
default: () => number_step_default
|
|
31
31
|
});
|
|
32
32
|
module.exports = __toCommonJS(number_step_exports);
|
|
33
|
-
var import_server = require("@
|
|
33
|
+
var import_server = require("@tego/server");
|
|
34
34
|
var import_lodash = __toESM(require("lodash"));
|
|
35
35
|
class number_step_default extends import_server.Migration {
|
|
36
36
|
constructor() {
|
|
@@ -30,7 +30,7 @@ __export(tableoid_exports, {
|
|
|
30
30
|
default: () => tableoid_default
|
|
31
31
|
});
|
|
32
32
|
module.exports = __toCommonJS(tableoid_exports);
|
|
33
|
-
var import_server = require("@
|
|
33
|
+
var import_server = require("@tego/server");
|
|
34
34
|
var import_lodash = __toESM(require("lodash"));
|
|
35
35
|
class tableoid_default extends import_server.Migration {
|
|
36
36
|
constructor() {
|
|
@@ -20,7 +20,7 @@ __export(set_collection_schema_exports, {
|
|
|
20
20
|
default: () => set_collection_schema_default
|
|
21
21
|
});
|
|
22
22
|
module.exports = __toCommonJS(set_collection_schema_exports);
|
|
23
|
-
var import_server = require("@
|
|
23
|
+
var import_server = require("@tego/server");
|
|
24
24
|
class set_collection_schema_default extends import_server.Migration {
|
|
25
25
|
constructor() {
|
|
26
26
|
super(...arguments);
|
|
@@ -20,7 +20,7 @@ __export(install_main_datasource_exports, {
|
|
|
20
20
|
default: () => install_main_datasource_default
|
|
21
21
|
});
|
|
22
22
|
module.exports = __toCommonJS(install_main_datasource_exports);
|
|
23
|
-
var import_server = require("@
|
|
23
|
+
var import_server = require("@tego/server");
|
|
24
24
|
class install_main_datasource_default extends import_server.Migration {
|
|
25
25
|
constructor() {
|
|
26
26
|
super(...arguments);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Collection, Database, MagicAttributeModel, SyncOptions, Transactionable } from '@tego/server';
|
|
2
2
|
import { QueryInterfaceDropTableOptions } from 'sequelize';
|
|
3
3
|
interface LoadOptions extends Transactionable {
|
|
4
4
|
skipField?: boolean | Array<string>;
|
|
@@ -30,9 +30,9 @@ __export(collection_exports, {
|
|
|
30
30
|
CollectionModel: () => CollectionModel
|
|
31
31
|
});
|
|
32
32
|
module.exports = __toCommonJS(collection_exports);
|
|
33
|
-
var
|
|
33
|
+
var import_server = require("@tego/server");
|
|
34
34
|
var import_lodash = __toESM(require("lodash"));
|
|
35
|
-
class CollectionModel extends
|
|
35
|
+
class CollectionModel extends import_server.MagicAttributeModel {
|
|
36
36
|
get db() {
|
|
37
37
|
return this.constructor.database;
|
|
38
38
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Collection, Database, MagicAttributeModel, SyncOptions, Transactionable } from '@tego/server';
|
|
2
2
|
interface LoadOptions extends Transactionable {
|
|
3
3
|
skipExist?: boolean;
|
|
4
4
|
}
|
|
@@ -8,7 +8,7 @@ interface MigrateOptions extends SyncOptions, Transactionable {
|
|
|
8
8
|
export declare class FieldModel extends MagicAttributeModel {
|
|
9
9
|
get db(): Database;
|
|
10
10
|
isAssociationField(): boolean;
|
|
11
|
-
load(loadOptions?: LoadOptions): Promise<import("@
|
|
11
|
+
load(loadOptions?: LoadOptions): Promise<import("@tego/server").Field>;
|
|
12
12
|
syncSortByField(options: Transactionable): Promise<void>;
|
|
13
13
|
migrate({ isNew, ...options }?: MigrateOptions): Promise<void>;
|
|
14
14
|
remove(options?: any): Promise<void>;
|
|
@@ -20,8 +20,8 @@ __export(field_exports, {
|
|
|
20
20
|
FieldModel: () => FieldModel
|
|
21
21
|
});
|
|
22
22
|
module.exports = __toCommonJS(field_exports);
|
|
23
|
-
var
|
|
24
|
-
class FieldModel extends
|
|
23
|
+
var import_server = require("@tego/server");
|
|
24
|
+
class FieldModel extends import_server.MagicAttributeModel {
|
|
25
25
|
get db() {
|
|
26
26
|
return this.constructor.database;
|
|
27
27
|
}
|
|
@@ -30,10 +30,9 @@ __export(collection_repository_exports, {
|
|
|
30
30
|
CollectionRepository: () => CollectionRepository
|
|
31
31
|
});
|
|
32
32
|
module.exports = __toCommonJS(collection_repository_exports);
|
|
33
|
-
var
|
|
34
|
-
var import_utils = require("@tachybase/utils");
|
|
33
|
+
var import_server = require("@tego/server");
|
|
35
34
|
var import_lodash = __toESM(require("lodash"));
|
|
36
|
-
class CollectionRepository extends
|
|
35
|
+
class CollectionRepository extends import_server.Repository {
|
|
37
36
|
setApp(app) {
|
|
38
37
|
this.app = app;
|
|
39
38
|
}
|
|
@@ -41,7 +40,7 @@ class CollectionRepository extends import_database.Repository {
|
|
|
41
40
|
var _a, _b, _c;
|
|
42
41
|
const { filter, skipExist } = options;
|
|
43
42
|
const instances = await this.find({ filter, appends: ["fields"] });
|
|
44
|
-
const graphlib =
|
|
43
|
+
const graphlib = import_server.CollectionsGraph.graphlib();
|
|
45
44
|
const graph = new graphlib.Graph();
|
|
46
45
|
const nameMap = {};
|
|
47
46
|
const viewCollections = [];
|
|
@@ -20,7 +20,7 @@ __export(sql_exports, {
|
|
|
20
20
|
default: () => sql_default
|
|
21
21
|
});
|
|
22
22
|
module.exports = __toCommonJS(sql_exports);
|
|
23
|
-
var
|
|
23
|
+
var import_server = require("@tego/server");
|
|
24
24
|
const updateCollection = async (ctx, transaction) => {
|
|
25
25
|
const { filterByTk, values } = ctx.action.params;
|
|
26
26
|
const repo = ctx.db.getRepository("collections");
|
|
@@ -60,7 +60,7 @@ var sql_default = {
|
|
|
60
60
|
if (!/^select/i.test(sql) && !/^with([\s\S]+)select([\s\S]+)/i.test(sql)) {
|
|
61
61
|
ctx.throw(400, ctx.t("Only select query allowed"));
|
|
62
62
|
}
|
|
63
|
-
const tmpCollection = new
|
|
63
|
+
const tmpCollection = new import_server.SqlCollection({ name: "tmp", sql }, { database: ctx.db });
|
|
64
64
|
const model = tmpCollection.model;
|
|
65
65
|
const data = await model.findAll({ attributes: ["*"], limit: 5, raw: true });
|
|
66
66
|
let fields = {};
|
|
@@ -20,14 +20,14 @@ __export(views_exports, {
|
|
|
20
20
|
default: () => views_default
|
|
21
21
|
});
|
|
22
22
|
module.exports = __toCommonJS(views_exports);
|
|
23
|
-
var
|
|
23
|
+
var import_server = require("@tego/server");
|
|
24
24
|
var views_default = {
|
|
25
25
|
name: "dbViews",
|
|
26
26
|
actions: {
|
|
27
27
|
async get(ctx, next) {
|
|
28
28
|
const { filterByTk, schema } = ctx.action.params;
|
|
29
29
|
const db = ctx.app.db;
|
|
30
|
-
const fields = await
|
|
30
|
+
const fields = await import_server.ViewFieldInference.inferFields({
|
|
31
31
|
db,
|
|
32
32
|
viewName: filterByTk,
|
|
33
33
|
viewSchema: schema
|
package/dist/server/server.d.ts
CHANGED
package/dist/server/server.js
CHANGED
|
@@ -31,16 +31,16 @@ __export(server_exports, {
|
|
|
31
31
|
default: () => server_default
|
|
32
32
|
});
|
|
33
33
|
module.exports = __toCommonJS(server_exports);
|
|
34
|
-
var
|
|
35
|
-
var process = __toESM(require("process"));
|
|
36
|
-
var
|
|
37
|
-
var
|
|
38
|
-
var import_server = require("@tachybase/server");
|
|
34
|
+
var import_node_path = __toESM(require("node:path"));
|
|
35
|
+
var process = __toESM(require("node:process"));
|
|
36
|
+
var import_node_worker_threads = require("node:worker_threads");
|
|
37
|
+
var import_server = require("@tego/server");
|
|
39
38
|
var import_async_mutex = require("async-mutex");
|
|
40
39
|
var import_lodash = __toESM(require("lodash"));
|
|
41
40
|
var import__ = require(".");
|
|
42
41
|
var import_collectionImportExportMeta = require("./actions/collectionImportExportMeta");
|
|
43
42
|
var import_hooks = require("./hooks");
|
|
43
|
+
var import_afterUpdateForForeignKeyField = require("./hooks/afterUpdateForForeignKeyField");
|
|
44
44
|
var import_beforeCreateForValidateField = require("./hooks/beforeCreateForValidateField");
|
|
45
45
|
var import_beforeCreateForViewCollection = require("./hooks/beforeCreateForViewCollection");
|
|
46
46
|
var import_models = require("./models");
|
|
@@ -68,7 +68,7 @@ class CollectionManagerPlugin extends import_server.Plugin {
|
|
|
68
68
|
});
|
|
69
69
|
this.db.addMigrations({
|
|
70
70
|
namespace: "collection-manager",
|
|
71
|
-
directory:
|
|
71
|
+
directory: import_node_path.default.resolve(__dirname, "./migrations"),
|
|
72
72
|
context: {
|
|
73
73
|
plugin: this
|
|
74
74
|
}
|
|
@@ -148,6 +148,7 @@ class CollectionManagerPlugin extends import_server.Plugin {
|
|
|
148
148
|
model.set("sortBy", model.get("foreignKey") + "Sort");
|
|
149
149
|
}
|
|
150
150
|
});
|
|
151
|
+
this.app.db.on("fields.afterUpdate", (0, import_afterUpdateForForeignKeyField.afterUpdateForForeignKeyField)(this.app.db));
|
|
151
152
|
this.app.db.on("fields.afterUpdate", async (model, { context, transaction }) => {
|
|
152
153
|
const prevOptions = model.previous("options");
|
|
153
154
|
const currentOptions = model.get("options");
|
|
@@ -217,7 +218,7 @@ class CollectionManagerPlugin extends import_server.Plugin {
|
|
|
217
218
|
});
|
|
218
219
|
};
|
|
219
220
|
this.app.on("beforeStart", loadCollections);
|
|
220
|
-
if (!
|
|
221
|
+
if (!import_node_worker_threads.isMainThread) {
|
|
221
222
|
return;
|
|
222
223
|
}
|
|
223
224
|
this.app.resourcer.use(
|
|
@@ -239,12 +240,12 @@ class CollectionManagerPlugin extends import_server.Plugin {
|
|
|
239
240
|
this.app.resourcer.define(import_collectionImportExportMeta.collectionImportExportMeta);
|
|
240
241
|
}
|
|
241
242
|
async load() {
|
|
242
|
-
await this.importCollections(
|
|
243
|
+
await this.importCollections(import_node_path.default.resolve(__dirname, "./collections"));
|
|
243
244
|
this.db.getRepository("collections").setApp(this.app);
|
|
244
245
|
const errorHandlerPlugin = this.app.getPlugin("error-handler");
|
|
245
246
|
errorHandlerPlugin.errorHandler.register(
|
|
246
247
|
(err) => {
|
|
247
|
-
return err instanceof
|
|
248
|
+
return err instanceof import_server.UniqueConstraintError;
|
|
248
249
|
},
|
|
249
250
|
(err, ctx) => {
|
|
250
251
|
return ctx.throw(400, ctx.t(`The value of ${Object.keys(err.fields)} field duplicated`));
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tachybase/module-collection",
|
|
3
3
|
"displayName": "Data source: Main",
|
|
4
|
-
"version": "1.3.
|
|
4
|
+
"version": "1.3.23",
|
|
5
5
|
"description": "TachyBase main database, supports relational databases such as MySQL, PostgreSQL, SQLite and so on.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"Data sources"
|
|
@@ -11,25 +11,18 @@
|
|
|
11
11
|
"dependencies": {},
|
|
12
12
|
"devDependencies": {
|
|
13
13
|
"@hapi/topo": "^6.0.2",
|
|
14
|
-
"@
|
|
14
|
+
"@tachybase/test": "^1.3.43",
|
|
15
|
+
"@tego/client": "^1.3.43",
|
|
16
|
+
"@tego/server": "^1.3.43",
|
|
17
|
+
"@types/lodash": "^4.17.20",
|
|
15
18
|
"async-mutex": "^0.5.0",
|
|
16
19
|
"lodash": "4.17.21",
|
|
17
20
|
"sequelize": "^6.37.5",
|
|
18
|
-
"toposort": "^2.0.2"
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
"@tachybase/actions": "1.3.21",
|
|
22
|
-
"@tachybase/database": "1.3.21",
|
|
23
|
-
"@tachybase/client": "1.3.21",
|
|
24
|
-
"@tachybase/module-error-handler": "1.3.21",
|
|
25
|
-
"@tachybase/test": "1.3.21",
|
|
26
|
-
"@tachybase/resourcer": "1.3.21",
|
|
27
|
-
"@tachybase/server": "1.3.21",
|
|
28
|
-
"@tachybase/utils": "1.3.21"
|
|
21
|
+
"toposort": "^2.0.2",
|
|
22
|
+
"@tachybase/client": "1.3.23",
|
|
23
|
+
"@tachybase/module-error-handler": "1.3.23"
|
|
29
24
|
},
|
|
30
25
|
"description.zh-CN": "TachyBase 主数据库,支持 MySQL、PostgreSQL、SQLite 等关系型数据库。",
|
|
31
26
|
"displayName.zh-CN": "数据源:主数据库",
|
|
32
|
-
"scripts": {
|
|
33
|
-
"build": "tachybase-build --no-dts @tachybase/module-collection"
|
|
34
|
-
}
|
|
27
|
+
"scripts": {}
|
|
35
28
|
}
|