@sqb/connect 4.12.1 → 4.14.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/cjs/client/cursor.js +1 -1
- package/cjs/client/extensions.js +38 -11
- package/cjs/client/helpers.js +7 -6
- package/cjs/client/sqb-client.js +2 -2
- package/cjs/client/sqb-connection.js +7 -4
- package/cjs/index.js +18 -20
- package/cjs/orm/backward.js +5 -5
- package/cjs/orm/commands/command.helper.js +38 -10
- package/cjs/orm/commands/create.command.js +2 -1
- package/cjs/orm/commands/find.command.js +3 -1
- package/cjs/orm/commands/row-converter.js +5 -10
- package/cjs/orm/decorators/column.decorator.js +1 -2
- package/cjs/orm/decorators/embedded.decorator.js +1 -2
- package/cjs/orm/decorators/entity.decorator.js +1 -2
- package/cjs/orm/decorators/events.decorator.js +6 -7
- package/cjs/orm/decorators/foreignkey.decorator.js +1 -2
- package/cjs/orm/decorators/index.decorator.js +1 -2
- package/cjs/orm/decorators/link.decorator.js +7 -5
- package/cjs/orm/decorators/primarykey.decorator.js +3 -3
- package/cjs/orm/decorators/transform.decorator.js +2 -3
- package/cjs/orm/model/association.js +9 -11
- package/cjs/orm/model/entity-metadata.js +4 -2
- package/cjs/orm/repository.class.js +13 -33
- package/cjs/orm/util/apply-mixins.js +3 -3
- package/cjs/orm/util/extract-keyvalues.js +7 -5
- package/cjs/orm/util/orm.helper.js +8 -12
- package/cjs/orm/util/parse-fields-projection.js +3 -5
- package/cjs/orm/util/serialize-field.js +1 -2
- package/esm/client/cursor.js +1 -1
- package/esm/client/extensions.js +36 -8
- package/esm/client/helpers.js +2 -0
- package/esm/client/sqb-client.js +3 -3
- package/esm/client/sqb-connection.js +7 -4
- package/esm/index.js +17 -17
- package/esm/orm/commands/command.helper.js +35 -6
- package/esm/orm/commands/create.command.js +2 -1
- package/esm/orm/commands/find.command.js +3 -1
- package/esm/orm/commands/row-converter.js +5 -10
- package/esm/orm/decorators/link.decorator.js +6 -3
- package/esm/orm/decorators/primarykey.decorator.js +2 -1
- package/esm/orm/model/association.js +9 -11
- package/esm/orm/model/entity-metadata.js +4 -2
- package/esm/orm/repository.class.js +13 -33
- package/esm/orm/util/apply-mixins.js +2 -1
- package/esm/orm/util/extract-keyvalues.js +6 -3
- package/esm/orm/util/orm.helper.js +2 -6
- package/esm/orm/util/parse-fields-projection.js +1 -3
- package/package.json +6 -5
- package/types/client/adapter.d.ts +1 -1
- package/types/client/cursor-stream.d.ts +0 -1
- package/types/client/extensions.d.ts +14 -3
- package/types/client/sqb-client.d.ts +1 -1
- package/types/client/sqb-connection.d.ts +1 -1
- package/types/client/types.d.ts +1 -1
- package/types/index.d.ts +17 -17
- package/types/orm/commands/find.command.d.ts +1 -1
- package/types/orm/commands/row-converter.d.ts +1 -1
- package/types/orm/repository.class.d.ts +2 -1
|
@@ -63,17 +63,15 @@ export class Association {
|
|
|
63
63
|
this._targetProperty = foreign._targetProperty;
|
|
64
64
|
return;
|
|
65
65
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
66
|
+
// Try to determine key fields from foreign key from target to source
|
|
67
|
+
foreign = await EntityMetadata.getForeignKeyFor(target, source);
|
|
68
|
+
if (foreign && foreign !== this) {
|
|
69
|
+
await foreign._resolveKeys();
|
|
70
|
+
this._sourceKey = foreign._targetKey;
|
|
71
|
+
this._sourceProperty = foreign._targetProperty;
|
|
72
|
+
this._targetKey = foreign._sourceKey;
|
|
73
|
+
this._targetProperty = foreign._sourceProperty;
|
|
74
|
+
return;
|
|
77
75
|
}
|
|
78
76
|
if (this.many) {
|
|
79
77
|
if (!sourceKey) {
|
|
@@ -56,8 +56,9 @@ export var EntityMetadata;
|
|
|
56
56
|
EntityMetadata.getEmbeddedField = getEmbeddedField;
|
|
57
57
|
function getAssociationField(entity, fieldName) {
|
|
58
58
|
const el = getField(entity, fieldName);
|
|
59
|
-
if (el && !isAssociationField(el))
|
|
59
|
+
if (el && !isAssociationField(el)) {
|
|
60
60
|
throw new Error(`"${el.name}" requested as "association" but it is "${el.kind}"`);
|
|
61
|
+
}
|
|
61
62
|
return el;
|
|
62
63
|
}
|
|
63
64
|
EntityMetadata.getAssociationField = getAssociationField;
|
|
@@ -85,13 +86,14 @@ export var EntityMetadata;
|
|
|
85
86
|
return out;
|
|
86
87
|
}
|
|
87
88
|
// Create a cached name array
|
|
88
|
-
if (!Object.prototype.hasOwnProperty.call(entity, '_fieldNames'))
|
|
89
|
+
if (!Object.prototype.hasOwnProperty.call(entity, '_fieldNames')) {
|
|
89
90
|
Object.defineProperty(entity, '_fieldNames', {
|
|
90
91
|
enumerable: false,
|
|
91
92
|
configurable: true,
|
|
92
93
|
writable: true,
|
|
93
94
|
value: Object.values(entity.fields).map(m => m.name),
|
|
94
95
|
});
|
|
96
|
+
}
|
|
95
97
|
return entity._fieldNames;
|
|
96
98
|
}
|
|
97
99
|
EntityMetadata.getFieldNames = getFieldNames;
|
|
@@ -34,47 +34,31 @@ export class Repository extends TypedEventEmitterClass(AsyncEventEmitter) {
|
|
|
34
34
|
}, options);
|
|
35
35
|
}
|
|
36
36
|
exists(keyValue, options) {
|
|
37
|
-
return this._execute(async (connection) => {
|
|
38
|
-
return this._exists(keyValue, { ...options, connection });
|
|
39
|
-
}, options);
|
|
37
|
+
return this._execute(async (connection) => this._exists(keyValue, { ...options, connection }), options);
|
|
40
38
|
}
|
|
41
39
|
existsOne(options) {
|
|
42
|
-
return this._execute(async (connection) => {
|
|
43
|
-
return this._existsOne({ ...options, connection });
|
|
44
|
-
}, options);
|
|
40
|
+
return this._execute(async (connection) => this._existsOne({ ...options, connection }), options);
|
|
45
41
|
}
|
|
46
42
|
count(options) {
|
|
47
|
-
return this._execute(async (connection) => {
|
|
48
|
-
return this._count({ ...options, connection });
|
|
49
|
-
}, options);
|
|
43
|
+
return this._execute(async (connection) => this._count({ ...options, connection }), options);
|
|
50
44
|
}
|
|
51
45
|
findById(keyValue, options) {
|
|
52
|
-
return this._execute(async (connection) => {
|
|
53
|
-
return this._find(keyValue, { ...options, connection });
|
|
54
|
-
}, options);
|
|
46
|
+
return this._execute(async (connection) => this._find(keyValue, { ...options, connection }), options);
|
|
55
47
|
}
|
|
56
48
|
findOne(options) {
|
|
57
|
-
return this._execute(async (connection) => {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
});
|
|
62
|
-
}, options);
|
|
49
|
+
return this._execute(async (connection) => await this._findOne({
|
|
50
|
+
...options,
|
|
51
|
+
connection,
|
|
52
|
+
}), options);
|
|
63
53
|
}
|
|
64
54
|
findMany(options) {
|
|
65
|
-
return this._execute(async (connection) => {
|
|
66
|
-
return this._findMany({ ...options, connection });
|
|
67
|
-
}, options);
|
|
55
|
+
return this._execute(async (connection) => this._findMany({ ...options, connection }), options);
|
|
68
56
|
}
|
|
69
57
|
delete(keyValue, options) {
|
|
70
|
-
return this._execute(async (connection) => {
|
|
71
|
-
return this._delete(keyValue, { ...options, connection });
|
|
72
|
-
}, options);
|
|
58
|
+
return this._execute(async (connection) => this._delete(keyValue, { ...options, connection }), options);
|
|
73
59
|
}
|
|
74
60
|
deleteMany(options) {
|
|
75
|
-
return this._execute(async (connection) => {
|
|
76
|
-
return this._deleteMany({ ...options, connection });
|
|
77
|
-
}, options);
|
|
61
|
+
return this._execute(async (connection) => this._deleteMany({ ...options, connection }), options);
|
|
78
62
|
}
|
|
79
63
|
update(keyValue, values, options) {
|
|
80
64
|
return this._execute(async (connection) => {
|
|
@@ -85,14 +69,10 @@ export class Repository extends TypedEventEmitterClass(AsyncEventEmitter) {
|
|
|
85
69
|
}, options);
|
|
86
70
|
}
|
|
87
71
|
updateOnly(keyValue, values, options) {
|
|
88
|
-
return this._execute(async (connection) => {
|
|
89
|
-
return !!(await this._update(keyValue, values, { ...options, connection }));
|
|
90
|
-
}, options);
|
|
72
|
+
return this._execute(async (connection) => !!(await this._update(keyValue, values, { ...options, connection })), options);
|
|
91
73
|
}
|
|
92
74
|
updateMany(values, options) {
|
|
93
|
-
return this._execute(async (connection) => {
|
|
94
|
-
return this._updateMany(values, { ...options, connection });
|
|
95
|
-
});
|
|
75
|
+
return this._execute(async (connection) => this._updateMany(values, { ...options, connection }));
|
|
96
76
|
}
|
|
97
77
|
async _execute(fn, opts) {
|
|
98
78
|
let connection = opts?.connection;
|
|
@@ -4,8 +4,9 @@ export function applyMixins(derivedCtor, baseCtor, filter) {
|
|
|
4
4
|
name === '__proto__' ||
|
|
5
5
|
name === 'toJSON' ||
|
|
6
6
|
name === 'toString' ||
|
|
7
|
-
(filter && !filter(name)))
|
|
7
|
+
(filter && !filter(name))) {
|
|
8
8
|
continue;
|
|
9
|
+
}
|
|
9
10
|
Object.defineProperty(derivedCtor.prototype, name, Object.getOwnPropertyDescriptor(baseCtor.prototype, name) || Object.create(null));
|
|
10
11
|
}
|
|
11
12
|
}
|
|
@@ -8,14 +8,16 @@ export function extractKeyValues(entityDef, valueOrInstance, keepOther) {
|
|
|
8
8
|
const col = EntityMetadata.getField(entityDef, k);
|
|
9
9
|
if (!col)
|
|
10
10
|
throw new Error(`Unknown column (${k}) defined as primary key in entity "${entityDef.name}"`);
|
|
11
|
-
if (!isColumnField(col))
|
|
11
|
+
if (!isColumnField(col)) {
|
|
12
12
|
throw new Error(`Column (${k}) defined as primary key in entity "${entityDef.name}" is not a data column`);
|
|
13
|
+
}
|
|
13
14
|
};
|
|
14
15
|
// if entity's primary key has more than one key field
|
|
15
16
|
if (primaryIndex.columns.length > 1) {
|
|
16
|
-
if (typeof valueOrInstance !== 'object')
|
|
17
|
+
if (typeof valueOrInstance !== 'object') {
|
|
17
18
|
throw new Error(`"${entityDef.name}" entity` +
|
|
18
19
|
` has more than one primary key field and you must provide all values with an key/value pair`);
|
|
20
|
+
}
|
|
19
21
|
const valueKeys = Object.keys(valueOrInstance);
|
|
20
22
|
const valueKeysUpper = valueKeys.map(x => x.toUpperCase());
|
|
21
23
|
const out = {};
|
|
@@ -41,8 +43,9 @@ export function extractKeyValues(entityDef, valueOrInstance, keepOther) {
|
|
|
41
43
|
const valueKeys = Object.keys(valueOrInstance);
|
|
42
44
|
const valueKeysUpper = valueKeys.map(x => x.toUpperCase());
|
|
43
45
|
const k = valueKeysUpper.indexOf(primaryColumnName.toUpperCase());
|
|
44
|
-
if (k < 0)
|
|
46
|
+
if (k < 0) {
|
|
45
47
|
throw new Error(`Value of key field "${entityDef.name}.${primaryColumnName}" required to perform this operation`);
|
|
48
|
+
}
|
|
46
49
|
const out = { [primaryColumnName]: valueOrInstance[valueKeys[k]] };
|
|
47
50
|
if (keepOther) {
|
|
48
51
|
for (let i = 0; i < valueKeys.length; i++) {
|
|
@@ -8,12 +8,8 @@ export function isEntityClass(fn) {
|
|
|
8
8
|
export function isColumnField(f) {
|
|
9
9
|
return !!(f && f.name && f.kind === 'column');
|
|
10
10
|
}
|
|
11
|
-
export const isEmbeddedField = (f) =>
|
|
12
|
-
|
|
13
|
-
};
|
|
14
|
-
export const isAssociationField = (f) => {
|
|
15
|
-
return !!(f && f.name && f.kind === 'association');
|
|
16
|
-
};
|
|
11
|
+
export const isEmbeddedField = (f) => !!(f && f.name && f.kind === 'object');
|
|
12
|
+
export const isAssociationField = (f) => !!(f && f.name && f.kind === 'association');
|
|
17
13
|
export async function resolveEntity(ctorThunk) {
|
|
18
14
|
if (typeof ctorThunk !== 'function')
|
|
19
15
|
return;
|
|
@@ -22,9 +22,7 @@ export function parseFieldsProjection(projection, keepCase) {
|
|
|
22
22
|
}
|
|
23
23
|
function parse(input, target) {
|
|
24
24
|
/** Add dot before brackets which is required to split fields */
|
|
25
|
-
input = input.replace(NO_DOT_BRACKET_PATTERN, s =>
|
|
26
|
-
return s.charAt(0) + '.' + s.substring(1);
|
|
27
|
-
});
|
|
25
|
+
input = input.replace(NO_DOT_BRACKET_PATTERN, s => s.charAt(0) + '.' + s.substring(1));
|
|
28
26
|
const fields = splitString(input, {
|
|
29
27
|
delimiters: '.',
|
|
30
28
|
brackets: true,
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sqb/connect",
|
|
3
3
|
"description": "Multi-dialect database connection framework written with TypeScript",
|
|
4
|
-
"version": "4.
|
|
4
|
+
"version": "4.14.0",
|
|
5
5
|
"author": "Panates",
|
|
6
6
|
"contributors": [
|
|
7
7
|
"Eray Hanoglu <e.hanoglu@panates.com>",
|
|
@@ -36,10 +36,11 @@
|
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"debug": "^4.3.5",
|
|
39
|
+
"doublylinked": "^2.5.4",
|
|
39
40
|
"fast-tokenizer": "^1.3.0",
|
|
40
41
|
"lightning-pool": "^4.2.2",
|
|
41
42
|
"lodash": "^4.17.21",
|
|
42
|
-
"power-tasks": "^1.7.
|
|
43
|
+
"power-tasks": "^1.7.4",
|
|
43
44
|
"putil-isplainobject": "^1.1.5",
|
|
44
45
|
"putil-merge": "^3.12.1",
|
|
45
46
|
"putil-promisify": "^1.10.1",
|
|
@@ -49,11 +50,11 @@
|
|
|
49
50
|
},
|
|
50
51
|
"devDependencies": {
|
|
51
52
|
"@types/debug": "^4.1.12",
|
|
52
|
-
"@types/lodash": "^4.17.
|
|
53
|
-
"
|
|
53
|
+
"@types/lodash": "^4.17.7",
|
|
54
|
+
"postgrejs": "^2.15.1"
|
|
54
55
|
},
|
|
55
56
|
"peerDependencies": {
|
|
56
|
-
"@sqb/builder": "^4.
|
|
57
|
+
"@sqb/builder": "^4.14.0",
|
|
57
58
|
"reflect-metadata": "^0.2.2"
|
|
58
59
|
},
|
|
59
60
|
"engines": {
|
|
@@ -1,4 +1,15 @@
|
|
|
1
|
+
import { SerializerExtension } from '@sqb/builder';
|
|
1
2
|
import { Adapter } from './adapter.js';
|
|
2
|
-
export declare
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
export declare class AdapterRegistry {
|
|
4
|
+
protected static adapters: Adapter[];
|
|
5
|
+
static get size(): number;
|
|
6
|
+
static register(...adapters: Adapter[]): void;
|
|
7
|
+
static forEach(callback: (value: Adapter, index: number) => void, thisArg?: any): void;
|
|
8
|
+
static items(): IterableIterator<Adapter>;
|
|
9
|
+
static unRegister(...extensions: Adapter[]): void;
|
|
10
|
+
static getAll(dialect: string): Adapter[];
|
|
11
|
+
static get(index: number): SerializerExtension | undefined;
|
|
12
|
+
static findDialect(dialect: string): SerializerExtension | undefined;
|
|
13
|
+
static findDriver(dialect: string): SerializerExtension | undefined;
|
|
14
|
+
static has(extension: Adapter): boolean;
|
|
15
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { classes } from '@sqb/builder';
|
|
1
2
|
import { Pool as LightningPool } from 'lightning-pool';
|
|
2
3
|
import { Maybe, Type } from 'ts-gems';
|
|
3
|
-
import { classes } from '@sqb/builder';
|
|
4
4
|
import { Repository } from '../orm/repository.class.js';
|
|
5
5
|
import { SqbConnection } from './sqb-connection.js';
|
|
6
6
|
import { ClientConfiguration, ClientDefaults, ConnectionOptions, QueryExecuteOptions, QueryRequest, QueryResult, TransactionFunction } from './types.js';
|
package/types/client/types.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { DataType, ParamOptions } from '@sqb/builder';
|
|
1
2
|
import type { PoolConfiguration } from 'lightning-pool';
|
|
2
3
|
import { Maybe } from 'ts-gems';
|
|
3
|
-
import { DataType, ParamOptions } from '@sqb/builder';
|
|
4
4
|
import type { Adapter } from './adapter';
|
|
5
5
|
import type { Cursor } from './cursor';
|
|
6
6
|
import type { FieldInfoMap } from './field-info-map';
|
package/types/index.d.ts
CHANGED
|
@@ -1,23 +1,12 @@
|
|
|
1
1
|
import 'reflect-metadata';
|
|
2
|
-
export * from './client/types.js';
|
|
3
2
|
export * from './client/adapter.js';
|
|
3
|
+
export * from './client/cursor.js';
|
|
4
|
+
export * from './client/extensions.js';
|
|
4
5
|
export * from './client/sqb-client.js';
|
|
5
6
|
export * from './client/sqb-connection.js';
|
|
6
|
-
export * from './client/
|
|
7
|
-
export
|
|
8
|
-
export * from './orm/orm.type.js';
|
|
9
|
-
export * from './orm/orm.const.js';
|
|
7
|
+
export * from './client/types.js';
|
|
8
|
+
export * from './orm/backward.js';
|
|
10
9
|
export * from './orm/base-entity.js';
|
|
11
|
-
export * from './orm/repository.class.js';
|
|
12
|
-
export * from './orm/model/entity-metadata.js';
|
|
13
|
-
export * from './orm/model/field-metadata.js';
|
|
14
|
-
export * from './orm/model/column-field-metadata.js';
|
|
15
|
-
export * from './orm/model/embedded-field-metadata.js';
|
|
16
|
-
export * from './orm/model/association-field-metadata.js';
|
|
17
|
-
export * from './orm/model/association.js';
|
|
18
|
-
export * from './orm/model/association-node.js';
|
|
19
|
-
export * from './orm/model/index-metadata.js';
|
|
20
|
-
export * from './orm/model/link-chain.js';
|
|
21
10
|
export * from './orm/decorators/column.decorator.js';
|
|
22
11
|
export * from './orm/decorators/embedded.decorator.js';
|
|
23
12
|
export * from './orm/decorators/entity.decorator.js';
|
|
@@ -27,6 +16,17 @@ export * from './orm/decorators/index.decorator.js';
|
|
|
27
16
|
export * from './orm/decorators/link.decorator.js';
|
|
28
17
|
export * from './orm/decorators/primarykey.decorator.js';
|
|
29
18
|
export * from './orm/decorators/transform.decorator.js';
|
|
30
|
-
export
|
|
19
|
+
export * from './orm/model/association.js';
|
|
20
|
+
export * from './orm/model/association-field-metadata.js';
|
|
21
|
+
export * from './orm/model/association-node.js';
|
|
22
|
+
export * from './orm/model/column-field-metadata.js';
|
|
23
|
+
export * from './orm/model/embedded-field-metadata.js';
|
|
24
|
+
export * from './orm/model/entity-metadata.js';
|
|
25
|
+
export * from './orm/model/field-metadata.js';
|
|
26
|
+
export * from './orm/model/index-metadata.js';
|
|
27
|
+
export * from './orm/model/link-chain.js';
|
|
28
|
+
export * from './orm/orm.const.js';
|
|
29
|
+
export * from './orm/orm.type.js';
|
|
30
|
+
export * from './orm/repository.class.js';
|
|
31
|
+
export { isAssociationField, isColumnField, isEmbeddedField, isEntityClass } from './orm/util/orm.helper.js';
|
|
31
32
|
export * from './orm/util/parse-fields-projection.js';
|
|
32
|
-
export * from './orm/backward.js';
|
|
@@ -38,6 +38,6 @@ export declare class FindCommand {
|
|
|
38
38
|
private _selectColumn;
|
|
39
39
|
filter(filter: any): Promise<void>;
|
|
40
40
|
sort(sortFields: string[]): Promise<void>;
|
|
41
|
-
execute(args: Pick<FindCommandArgs, 'connection' | 'distinct' | 'offset' | 'limit' | 'params' | 'onTransformRow'>): Promise<any[]>;
|
|
41
|
+
execute(args: Pick<FindCommandArgs, 'connection' | 'distinct' | 'offset' | 'limit' | 'params' | 'onTransformRow' | 'prettyPrint'>): Promise<any[]>;
|
|
42
42
|
private _getEntityFromAlias;
|
|
43
43
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Type } from 'ts-gems';
|
|
2
1
|
import { DataType } from '@sqb/builder';
|
|
2
|
+
import { Type } from 'ts-gems';
|
|
3
3
|
import type { FieldInfoMap } from '../../client/field-info-map';
|
|
4
4
|
import { SqbConnection } from '../../client/sqb-connection.js';
|
|
5
5
|
import { ColumnTransformFunction } from '../orm.type.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { PartialDTO, PatchDTO, StrictOmit, Type } from 'ts-gems';
|
|
2
1
|
import { LogicalOperator } from '@sqb/builder';
|
|
2
|
+
import { PartialDTO, PatchDTO, StrictOmit, Type } from 'ts-gems';
|
|
3
3
|
import { FieldInfoMap } from '../client/field-info-map.js';
|
|
4
4
|
import { SqbClient } from '../client/sqb-client.js';
|
|
5
5
|
import { SqbConnection } from '../client/sqb-connection.js';
|
|
@@ -16,6 +16,7 @@ export declare namespace Repository {
|
|
|
16
16
|
type TransformRowFunction = (fields: FieldInfoMap, row: object, obj: object) => void;
|
|
17
17
|
interface CommandOptions {
|
|
18
18
|
connection?: SqbConnection;
|
|
19
|
+
prettyPrint?: boolean;
|
|
19
20
|
}
|
|
20
21
|
interface CreateOptions extends CommandOptions, Projection {
|
|
21
22
|
}
|