@steedos/standard-object-database 2.7.27-beta.6 → 2.7.28-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/LICENSE.txt +12 -652
  2. package/main/default/client/object_fields.client.js +14 -1
  3. package/main/default/objectTranslations/objects.en/objects.en.objectTranslation.yml +4 -1
  4. package/main/default/objectTranslations/objects.zh-CN/objects.zh-CN.objectTranslation.yml +5 -2
  5. package/main/default/objects/object_fields/fields/auto_fill_mapping.$.to.field.yml +28 -13
  6. package/main/default/objects/object_fields/fields/is_name.field.yml +1 -1
  7. package/main/default/objects/object_fields/listviews/all.listview.yml +1 -0
  8. package/main/default/objects/object_functions/fields/script.field.yml +3 -2
  9. package/main/default/objects/object_triggers/fields/handler.field.yml +3 -2
  10. package/main/default/objects/objects/fields/datasource.field.yml +3 -4
  11. package/main/default/objects/objects/fields/enable_audit.field.yml +6 -0
  12. package/main/default/objects/objects/fields/enable_chatter.field.yml +1 -0
  13. package/main/default/objects/objects/fields/table_name.field.yml +6 -3
  14. package/main/default/objects/objects/fields/table_pk_generated.field.yml +8 -0
  15. package/main/default/objects/objects/fields/table_pk_is_name.field.yml +8 -0
  16. package/main/default/objects/objects/fields/table_pk_name.field.yml +12 -0
  17. package/main/default/objects/objects/fields/table_pk_type.field.yml +14 -0
  18. package/main/default/objects/objects/objects.object.yml +8 -0
  19. package/main/default/pages/object_detail.page.amis.json +2 -1
  20. package/main/default/pages/object_form.page.amis.json +1 -1
  21. package/main/default/server/object_fields.object.js +5 -2
  22. package/main/default/server/objects.object.js +163 -114
  23. package/main/default/services/suggestions.service.js +1 -0
  24. package/main/default/triggers/object_fields.trigger.js +8 -0
  25. package/main/default/triggers/objects.trigger.js +36 -0
  26. package/package.json +5 -5
@@ -243,12 +243,25 @@ Steedos.ObjectFieldManager.getSummaryFiltersOperation = function(field_type) {
243
243
  flex-grow: 0;
244
244
  }
245
245
 
246
+ .defaultValue_field .defaultValue_field_formula_hidden > .antd-Form-label {
247
+ display: none;
248
+ }
249
+ .defaultValue_field .defaultValue_field_formula_hidden > .antd-Form-value .antd-FormulaPicker .antd-InputBox {
250
+ display: none;
251
+ }
252
+
246
253
  .defaultValue_field .defaultValue_field_formula_hidden {
247
254
  margin-left: 0.5rem;
248
255
  }
249
256
 
250
257
  .defaultValue_field.steedos-defaultValue-html-edit .defaultValue_field_formula_hidden {
251
- margin-left: 0px;
258
+ margin-left: 7rem;
259
+ }
260
+
261
+ @media (max-width: 767px) {
262
+ .defaultValue_field.steedos-defaultValue-html-edit .defaultValue_field_formula_hidden {
263
+ margin-left: 0rem;
264
+ }
252
265
  }
253
266
  </style>`);
254
267
  $("head").append(styleCss);
@@ -19,7 +19,6 @@ fields:
19
19
  description:
20
20
  table_name:
21
21
  label: Table Name
22
- help: The default data source does not support this property
23
22
  description:
24
23
  icon:
25
24
  label: Icon
@@ -78,6 +77,10 @@ fields:
78
77
  label: Enable Instances
79
78
  help:
80
79
  description:
80
+ enable_audit:
81
+ label: Enable Audit
82
+ help:
83
+ description:
81
84
  enable_chatter:
82
85
  label: Enable Comments
83
86
  help:
@@ -15,8 +15,7 @@ fields:
15
15
  help: API 名称只能包含小写字母、数字,必须以字母开头,不能以下划线字符结尾或包含两个连续的下划线字符
16
16
  description:
17
17
  table_name:
18
- label: 数据库表名称
19
- help: 默认数据源不支持此属性
18
+ label: 表名称
20
19
  description:
21
20
  icon:
22
21
  label: 图标
@@ -75,6 +74,10 @@ fields:
75
74
  label: 显示审批单子表
76
75
  help:
77
76
  description:
77
+ enable_audit:
78
+ label: 记录字段历史
79
+ help:
80
+ description:
78
81
  enable_chatter:
79
82
  label: 允许添加评论
80
83
  help:
@@ -21,7 +21,8 @@ filtersFunction: !<tag:yaml.org,2002:js/function> |-
21
21
  "email": ["email", "text", "textarea"]
22
22
  };
23
23
  var currentFilter = [];
24
- var referenceObject = BuilderAmisObject && BuilderAmisObject.AmisLib && BuilderAmisObject.AmisLib.getUISchemaSync(values.reference_to);
24
+ //这里调用getUISchemaSync时传入true强制抓取最新schema是因为:设置自动填充时,如果from中选择了一个刚新建的字段,下面的fromField变量会取不到刚新建的字段,造成设置to属性会报错
25
+ var referenceObject = BuilderAmisObject && BuilderAmisObject.AmisLib && BuilderAmisObject.AmisLib.getUISchemaSync(values.reference_to, true);
25
26
  var fromField = referenceObject && referenceObject.fields[values.from];
26
27
 
27
28
  if (values.multiple) {
@@ -37,20 +38,34 @@ filtersFunction: !<tag:yaml.org,2002:js/function> |-
37
38
  currentFilter.push(['multiple', '!=', true]);
38
39
  }
39
40
  }
40
- if (fromField && fromField.data_type) {
41
- currentFilter.push(['type', 'in', fieldFilters[fromField.data_type] || fromField.data_type.split()]);
42
- }else if (fromField) {
43
- currentFilter.push(['type', 'in', fieldFilters[fromField.type] || fromField.type.split()]);
44
- if (fromField.type == "lookup" || fromField.type == "master_detail") {
45
- if(fromField.reference_to === "users"){
46
- currentFilter.push([['reference_to', '=', "users"],"or", ['reference_to', '=', "space_users"]]);
41
+ if (fromField) {
42
+ if(fromField.type == "select"){
43
+ //要注意下拉框字段类型有data_type属性,可能为boolean/number/text/null,默认值为null,表示text类型
44
+ var fromFieldDataType = fromField.data_type || "text";
45
+ currentFilter.push(['type', '=', 'select']);
46
+ if (fromFieldDataType === "text") {
47
+ currentFilter.push([['data_type', '=', 'text'], 'or', ['data_type', '=', null]]);
47
48
  }
48
- else{
49
- if (fromField.reference_to) {
50
- currentFilter.push(['reference_to', '=', fromField.reference_to]);
49
+ else {
50
+ currentFilter.push(['data_type', '=', fromFieldDataType]);
51
+ }
52
+ }
53
+ else if (fromField.data_type) {
54
+ // 公式字段类型按data_type属性处理
55
+ currentFilter.push(['type', 'in', fieldFilters[fromField.data_type] || fromField.data_type.split()]);
56
+ } else {
57
+ currentFilter.push(['type', 'in', fieldFilters[fromField.type] || fromField.type.split()]);
58
+ if (fromField.type == "lookup" || fromField.type == "master_detail") {
59
+ if(fromField.reference_to === "users"){
60
+ currentFilter.push([['reference_to', '=', "users"],"or", ['reference_to', '=', "space_users"]]);
51
61
  }
52
- if (fromField.reference_to_field) {
53
- currentFilter.push(['reference_to_field', '=', fromField.reference_to_field]);
62
+ else{
63
+ if (fromField.reference_to) {
64
+ currentFilter.push(['reference_to', '=', fromField.reference_to]);
65
+ }
66
+ if (fromField.reference_to_field) {
67
+ currentFilter.push(['reference_to_field', '=', fromField.reference_to_field]);
68
+ }
54
69
  }
55
70
  }
56
71
  }
@@ -6,4 +6,4 @@ hidden: false
6
6
  label: Is Name
7
7
  sort_no: 650
8
8
  type: boolean
9
- visible_on: ${ARRAYSOME(['text', 'textarea', 'autonumber', 'date', 'datetime', 'time', 'formula', 'lookup', 'master_detail'], item => item === type) && !multiple}
9
+ visible_on: ${ARRAYSOME(['text', 'textarea', 'autonumber', 'date', 'datetime', 'time', 'formula', 'lookup', 'master_detail', 'number', 'select'], item => item === type) && !multiple}
@@ -2,6 +2,7 @@ name: all
2
2
  columns:
3
3
  - label
4
4
  - name
5
+ - column_name
5
6
  - group
6
7
  - type
7
8
  - object
@@ -5,9 +5,10 @@ language: javascript
5
5
  is_wide: true
6
6
  required: true
7
7
  defaultValue: |-
8
- // global: {_:lodash, moment, validator, filters}
9
- // objects
10
8
  // ctx: {input, params, broker, getObject, getUser}
9
+ // objects: all steedos objects
10
+ // db: mongodb client instance
11
+ // npm: {_, moment, validator, filters}
11
12
  editorDidMount: >-
12
13
  if(window._registerCompletionItemProviderFunction){
13
14
  return ;
@@ -5,10 +5,11 @@ language: javascript
5
5
  is_wide: true
6
6
  required: true
7
7
  defaultValue: |-
8
- // global: {_:lodash, moment, validator, filters}
9
8
  // ctx
10
- // objects
9
+ // objects: all steedos objects
10
+ // db: mongodb client instance
11
11
  // services
12
+ // npm: {_, moment, validator, filters}
12
13
  editorDidMount: >-
13
14
  if(window._registerCompletionItemProviderTrigger){
14
15
  return ;
@@ -1,13 +1,12 @@
1
1
  name: datasource
2
2
  amis:
3
- disabledOn: '${is_system == true}'
3
+ disabledOn: '${is_system == true || !!recordId}'
4
4
  defaultValue: default
5
5
  filters: []
6
- group: advanced
7
6
  hidden: false
8
7
  label: Datasource
9
8
  reference_to: datasources
10
9
  required: false
11
10
  showIcon: false
12
- sort_no: 180
13
- type: master_detail
11
+ sort_no: 5
12
+ type: lookup
@@ -0,0 +1,6 @@
1
+ name: enable_audit
2
+ type: boolean
3
+ label: Enable Audit
4
+ group: Switch
5
+ sort_no: 305
6
+ visible_on: '{{ Meteor.settings.public.platform && ["platform-standard", "platform-enterprise", "platform-professional"].includes(Meteor.settings.public.platform.product) }}'
@@ -4,3 +4,4 @@ hidden: false
4
4
  label: Enable Comments
5
5
  sort_no: 300
6
6
  type: boolean
7
+ visible_on: '{{ Meteor.settings.public.platform && ["platform-standard", "platform-enterprise", "platform-professional"].includes(Meteor.settings.public.platform.product) }}'
@@ -1,11 +1,14 @@
1
1
  name: table_name
2
2
  amis:
3
3
  disabledOn: '${is_system == true}'
4
- group: advanced
4
+ requiredOn: ${datasource != null &&(datasource != "meteor") &&(datasource != "default")}
5
+ group: 外部数据源
5
6
  hidden: false
6
7
  index: true
7
- inlineHelpText: The default data source does not support this property
8
8
  label: Table Name
9
9
  searchable: true
10
- sort_no: 190
10
+ sort_no: 51
11
11
  type: text
12
+ description: 数据库中表的名称
13
+ visible_on: >-
14
+ ${datasource != null &&(datasource != "meteor") &&(datasource != "default")}
@@ -0,0 +1,8 @@
1
+ name: table_pk_generated
2
+ group: 外部数据源
3
+ hidden: false
4
+ label: 主键是否自增
5
+ sort_no: 194
6
+ type: boolean
7
+ visible_on: >-
8
+ ${datasource != null &&(datasource != "meteor") &&(datasource != "default")}
@@ -0,0 +1,8 @@
1
+ name: table_pk_is_name
2
+ group: 外部数据源
3
+ hidden: false
4
+ label: 主键作为对象名称字段
5
+ sort_no: 195
6
+ type: boolean
7
+ visible_on: >-
8
+ ${datasource != null &&(datasource != "meteor") &&(datasource != "default")}
@@ -0,0 +1,12 @@
1
+ name: table_pk_name
2
+ group: 外部数据源
3
+ hidden: false
4
+ index: true
5
+ label: 主键字段名
6
+ searchable: true
7
+ sort_no: 191
8
+ type: text
9
+ required: true
10
+ description: 数据库表的主键字段名
11
+ visible_on: >-
12
+ ${datasource != null &&(datasource != "meteor") &&(datasource != "default")}
@@ -0,0 +1,14 @@
1
+ name: table_pk_type
2
+ group: 外部数据源
3
+ hidden: false
4
+ label: 主键值类型
5
+ sort_no: 192
6
+ type: select
7
+ required: true
8
+ options:
9
+ - label: 字符串
10
+ value: text
11
+ - label: 数值
12
+ value: number
13
+ visible_on: >-
14
+ ${datasource != null &&(datasource != "meteor") &&(datasource != "default")}
@@ -3,7 +3,15 @@ custom: true
3
3
  enable_dataloader: false
4
4
  field_groups:
5
5
  - group_name: switch
6
+ collapsed: true
7
+ - group_name: 外部数据源
8
+ collapsed: false
6
9
  - group_name: advanced
10
+ collapsed: true
11
+ - group_name: 高级
12
+ collapsed: true
13
+ - group_name: 界面
14
+ collapsed: true
7
15
  hidden: true
8
16
  icon: orders
9
17
  label: Objects
@@ -41,7 +41,8 @@
41
41
  "relatedKey": "object"
42
42
  }
43
43
  ],
44
- "id": "u:f1a52545b642"
44
+ "id": "u:f1a52545b642",
45
+ "unmountOnExit": true
45
46
  },
46
47
  {
47
48
  "title": "${'objects_amis_list_view' | t}",
@@ -7,7 +7,7 @@
7
7
  "objectApiName": "objects",
8
8
  "recordId": "${recordId}",
9
9
  "className": "",
10
- "enableTabs": true,
10
+ "enableTabs": false,
11
11
  "mode": "edit",
12
12
  "layout": "horizontal",
13
13
  "apiRequestAdaptor": "console.log('api.data.query===', api.data.query);api.data.query = api.data.query.replace('objects__update', 'objects__upsert')",
@@ -279,6 +279,9 @@ function onChangeName(oldName, newDoc){
279
279
  //[Task]: 字段名允许输入大写字母 #6702
280
280
  //只能包含字母、数字,必须以字母开头,不能以下划线字符结尾或包含两个连续的下划线字符 TODO 支持表格
281
281
  function checkName(name){
282
+ if(name === '_id'){
283
+ return true;
284
+ }
282
285
  var reg = new RegExp('^[a-zA-Z]([A-Za-z0-9]|_(?!_))*[A-Za-z0-9]$'); //支持表格类型的验证表达式(待优化.$.限制只能出现一次): new RegExp('^[a-z]([a-z0-9]|_(?!_))*(\\.\\$\\.\\w+)*[a-z0-9]$')
283
286
  //TODO 撤销注释
284
287
  if(!reg.test(name)){
@@ -300,8 +303,8 @@ function allowChangeObject(){
300
303
  }
301
304
 
302
305
  function checkNameField(nameField){
303
- if(["text", "textarea", "autonumber", "date", "datetime", "time", "formula", "lookup", "master_detail"].indexOf(nameField.type) < 0){
304
- throw new Error("只有文本、长文本、自动编号、日期、日期时间、时间、公式、相关表这些类型的字段可以被设置为名称字段");
306
+ if(["text", "textarea", "autonumber", "date", "datetime", "time", "formula", "lookup", "master_detail", 'number', 'select'].indexOf(nameField.type) < 0){
307
+ throw new Error("只有文本、长文本、自动编号、日期、日期时间、时间、公式、相关表、数值这些类型的字段可以被设置为名称字段");
305
308
  } else if(nameField.type == "lookup" && nameField.multiple) {
306
309
  throw new Error("多选的相关表字段不可以被设置为名称字段");
307
310
  }
@@ -304,121 +304,170 @@ let objectTriggers = {
304
304
  on: "server",
305
305
  when: "after.insert",
306
306
  todo: function (userId, doc) {
307
- //新增object时,默认新建一个name字段
308
- Creator.getCollection("object_fields").insert({
309
- object: doc.name,
310
- owner: userId,
311
- _name: "name",
312
- label: "名称",
313
- space: doc.space,
314
- type: "text",
315
- required: true,
316
- index: true,
317
- searchable: true,
318
- filterable: true,
319
- sort_no: 10
320
- });
321
- Creator.getCollection("object_fields").insert({
322
- object: doc.name,
323
- owner: userId,
324
- _name: "created",
325
- name: "created",
326
- label: "创建时间",
327
- space: doc.space,
328
- type: "datetime",
329
- group: '',
330
- sort_no: 9999,
331
- readonly: true,
332
- disabled: true,
333
- sortable: true
334
- });
335
- Creator.getCollection("object_fields").insert({
336
- object: doc.name,
337
- owner: userId,
338
- _name: "created_by",
339
- name: "created_by",
340
- label: "创建人",
341
- space: doc.space,
342
- type: "lookup",
343
- reference_to: 'users',
344
- group: '',
345
- sort_no: 9999,
346
- readonly: true,
347
- disabled: true,
348
- });
349
- Creator.getCollection("object_fields").insert({
350
- object: doc.name,
351
- owner: userId,
352
- _name: "modified",
353
- name: "modified",
354
- label: "修改时间",
355
- space: doc.space,
356
- type: "datetime",
357
- group: '',
358
- sort_no: 9999,
359
- readonly: true,
360
- disabled: true,
361
- sortable: true
362
- });
363
- Creator.getCollection("object_fields").insert({
364
- object: doc.name,
365
- owner: userId,
366
- _name: "modified_by",
367
- name: "modified_by",
368
- label: "修改人",
369
- space: doc.space,
370
- type: "lookup",
371
- reference_to: 'users',
372
- group: '',
373
- sort_no: 9999,
374
- readonly: true,
375
- disabled: true,
376
- });
377
- // Creator.getCollection("object_fields").insert({
378
- // object: doc.name,
379
- // owner: userId,
380
- // _name: "owner",
381
- // label: "所有者",
382
- // space: doc.space,
383
- // type: "lookup",
384
- // reference_to: "users",
385
- // sortable: true,
386
- // index: true,
387
- // defaultValue: "{userId}",
388
- // omit: true,
389
- // hidden: true
390
- // });
391
- Creator.getCollection("object_listviews").insert({
392
- name: "all",
393
- label: "所有",
394
- space: doc.space,
395
- owner: userId,
396
- object_name: doc.name,
397
- shared_to: "space",
398
- filter_scope: "space",
399
- crud_mode: 'table',
400
- columns: [{field: 'name'}, {field: 'created_by'}, {field: 'created'}],
401
- "sort" : [
402
- {
403
- "field_name" : "created",
404
- "order" : "desc"
405
- }
406
- ]
407
- });
408
- Creator.getCollection("object_listviews").insert({
409
- name: "recent",
410
- label: "最近查看",
411
- space: doc.space,
412
- owner: userId,
413
- object_name: doc.name,
414
- shared_to: "space",
415
- filter_scope: "space",
416
- crud_mode: 'table',
417
- columns: [{field: 'name'}]
418
- });
419
-
307
+ if(doc.datasource != 'meteor' && doc.datasource != 'default' && doc.datasource){
308
+ let { table_pk_name, table_pk_type, table_pk_generated, table_pk_is_name } = doc;
309
+
310
+ if(!table_pk_name){
311
+ table_pk_name = 'id'
312
+ }
313
+
314
+ if(!table_pk_type){
315
+ table_pk_type = 'number'
316
+ }
317
+
318
+ Creator.getCollection("object_fields").insert({
319
+ object: doc.name,
320
+ owner: userId,
321
+ _name: "_id",
322
+ name: '_id',
323
+ label: "ID",
324
+ column_name: table_pk_name,
325
+ primary: true,
326
+ generated: table_pk_generated,
327
+ space: doc.space,
328
+ type: table_pk_type,
329
+ searchable: true,
330
+ filterable: true,
331
+ sort_no: 5,
332
+ is_name: table_pk_is_name,
333
+ locked: true
334
+ });
335
+
336
+ Creator.getCollection("object_listviews").insert({
337
+ name: "all",
338
+ label: "所有",
339
+ space: doc.space,
340
+ owner: userId,
341
+ object_name: doc.name,
342
+ shared_to: "space",
343
+ filter_scope: "space",
344
+ crud_mode: 'table',
345
+ columns: [{field: '_id'}],
346
+ "sort" : [
347
+ {
348
+ "field_name" : "_id",
349
+ "order" : "asc"
350
+ }
351
+ ]
352
+ });
353
+
354
+ }else{
355
+ //新增object时,默认新建一个name字段
356
+ Creator.getCollection("object_fields").insert({
357
+ object: doc.name,
358
+ owner: userId,
359
+ _name: "name",
360
+ label: "名称",
361
+ space: doc.space,
362
+ type: "text",
363
+ required: true,
364
+ index: true,
365
+ searchable: true,
366
+ filterable: true,
367
+ sort_no: 10
368
+ });
369
+ Creator.getCollection("object_fields").insert({
370
+ object: doc.name,
371
+ owner: userId,
372
+ _name: "created",
373
+ name: "created",
374
+ label: "创建时间",
375
+ space: doc.space,
376
+ type: "datetime",
377
+ group: '',
378
+ sort_no: 9999,
379
+ readonly: true,
380
+ disabled: true,
381
+ sortable: true
382
+ });
383
+ Creator.getCollection("object_fields").insert({
384
+ object: doc.name,
385
+ owner: userId,
386
+ _name: "created_by",
387
+ name: "created_by",
388
+ label: "创建人",
389
+ space: doc.space,
390
+ type: "lookup",
391
+ reference_to: 'users',
392
+ group: '',
393
+ sort_no: 9999,
394
+ readonly: true,
395
+ disabled: true,
396
+ });
397
+ Creator.getCollection("object_fields").insert({
398
+ object: doc.name,
399
+ owner: userId,
400
+ _name: "modified",
401
+ name: "modified",
402
+ label: "修改时间",
403
+ space: doc.space,
404
+ type: "datetime",
405
+ group: '',
406
+ sort_no: 9999,
407
+ readonly: true,
408
+ disabled: true,
409
+ sortable: true
410
+ });
411
+ Creator.getCollection("object_fields").insert({
412
+ object: doc.name,
413
+ owner: userId,
414
+ _name: "modified_by",
415
+ name: "modified_by",
416
+ label: "修改人",
417
+ space: doc.space,
418
+ type: "lookup",
419
+ reference_to: 'users',
420
+ group: '',
421
+ sort_no: 9999,
422
+ readonly: true,
423
+ disabled: true,
424
+ });
425
+ // Creator.getCollection("object_fields").insert({
426
+ // object: doc.name,
427
+ // owner: userId,
428
+ // _name: "owner",
429
+ // label: "所有者",
430
+ // space: doc.space,
431
+ // type: "lookup",
432
+ // reference_to: "users",
433
+ // sortable: true,
434
+ // index: true,
435
+ // defaultValue: "{userId}",
436
+ // omit: true,
437
+ // hidden: true
438
+ // });
439
+ Creator.getCollection("object_listviews").insert({
440
+ name: "all",
441
+ label: "所有",
442
+ space: doc.space,
443
+ owner: userId,
444
+ object_name: doc.name,
445
+ shared_to: "space",
446
+ filter_scope: "space",
447
+ crud_mode: 'table',
448
+ columns: [{field: 'name'}, {field: 'created_by'}, {field: 'created'}],
449
+ "sort" : [
450
+ {
451
+ "field_name" : "created",
452
+ "order" : "desc"
453
+ }
454
+ ]
455
+ });
456
+ Creator.getCollection("object_listviews").insert({
457
+ name: "recent",
458
+ label: "最近查看",
459
+ space: doc.space,
460
+ owner: userId,
461
+ object_name: doc.name,
462
+ shared_to: "space",
463
+ filter_scope: "space",
464
+ crud_mode: 'table',
465
+ columns: [{field: 'name'}]
466
+ });
467
+ }
420
468
  initObjectPermission(userId, doc);
421
469
  }
470
+
422
471
  },
423
472
  "before.update.server.objects": {
424
473
  on: "server",
@@ -467,7 +516,7 @@ let objectTriggers = {
467
516
  var set = modifier.$set || {}
468
517
  if((set.name || set.datasource) && this.previous.name != doc.name){
469
518
  onChangeObjectName(this.previous.name, doc);
470
- }
519
+ };
471
520
  }
472
521
  },
473
522
  "before.remove.server.objects": {
@@ -124,6 +124,7 @@ module.exports = {
124
124
  directDelete(id: SteedosIDType, userSession?: SteedosUserSession): Promise<any>;
125
125
  count(query: SteedosQueryOptions, userSession?: SteedosUserSession): Promise<any>;
126
126
  _makeNewID(): Promise<any>;
127
+ sql(sql: string, param?: any): Promise<any>;
127
128
  }
128
129
  ${objectsTypes}
129
130
  ${servicesTypes}