@mikro-orm/knex 7.0.0-dev.9 → 7.0.0-dev.91

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 (59) hide show
  1. package/AbstractSqlConnection.d.ts +11 -5
  2. package/AbstractSqlConnection.js +78 -32
  3. package/AbstractSqlDriver.d.ts +9 -5
  4. package/AbstractSqlDriver.js +267 -227
  5. package/AbstractSqlPlatform.js +5 -5
  6. package/PivotCollectionPersister.d.ts +8 -4
  7. package/PivotCollectionPersister.js +55 -31
  8. package/README.md +3 -2
  9. package/SqlEntityManager.d.ts +10 -2
  10. package/SqlEntityManager.js +11 -2
  11. package/dialects/mssql/MsSqlNativeQueryBuilder.d.ts +2 -0
  12. package/dialects/mssql/MsSqlNativeQueryBuilder.js +42 -3
  13. package/dialects/mysql/MySqlExceptionConverter.d.ts +3 -3
  14. package/dialects/mysql/MySqlExceptionConverter.js +4 -5
  15. package/dialects/mysql/MySqlSchemaHelper.js +2 -2
  16. package/dialects/postgresql/PostgreSqlTableCompiler.d.ts +1 -0
  17. package/dialects/postgresql/PostgreSqlTableCompiler.js +1 -0
  18. package/dialects/sqlite/BaseSqliteConnection.d.ts +3 -2
  19. package/dialects/sqlite/BaseSqliteConnection.js +2 -14
  20. package/dialects/sqlite/BaseSqlitePlatform.js +1 -2
  21. package/dialects/sqlite/SqliteExceptionConverter.d.ts +2 -2
  22. package/dialects/sqlite/SqliteExceptionConverter.js +6 -4
  23. package/dialects/sqlite/SqliteSchemaHelper.js +5 -6
  24. package/index.d.ts +2 -1
  25. package/index.js +2 -1
  26. package/package.json +5 -5
  27. package/plugin/index.d.ts +53 -0
  28. package/plugin/index.js +42 -0
  29. package/plugin/transformer.d.ts +115 -0
  30. package/plugin/transformer.js +883 -0
  31. package/query/ArrayCriteriaNode.d.ts +1 -0
  32. package/query/ArrayCriteriaNode.js +3 -0
  33. package/query/CriteriaNode.d.ts +4 -5
  34. package/query/CriteriaNode.js +13 -9
  35. package/query/CriteriaNodeFactory.js +12 -7
  36. package/query/NativeQueryBuilder.js +1 -1
  37. package/query/ObjectCriteriaNode.d.ts +1 -0
  38. package/query/ObjectCriteriaNode.js +35 -8
  39. package/query/QueryBuilder.d.ts +59 -10
  40. package/query/QueryBuilder.js +166 -50
  41. package/query/QueryBuilderHelper.d.ts +1 -1
  42. package/query/QueryBuilderHelper.js +20 -14
  43. package/query/ScalarCriteriaNode.d.ts +3 -3
  44. package/query/ScalarCriteriaNode.js +9 -7
  45. package/query/index.d.ts +1 -0
  46. package/query/index.js +1 -0
  47. package/query/raw.d.ts +59 -0
  48. package/query/raw.js +68 -0
  49. package/query/rawKnex.d.ts +58 -0
  50. package/query/rawKnex.js +72 -0
  51. package/schema/DatabaseSchema.js +25 -4
  52. package/schema/DatabaseTable.d.ts +5 -4
  53. package/schema/DatabaseTable.js +65 -34
  54. package/schema/SchemaComparator.js +5 -6
  55. package/schema/SchemaHelper.d.ts +2 -0
  56. package/schema/SchemaHelper.js +14 -10
  57. package/schema/SqlSchemaGenerator.d.ts +13 -6
  58. package/schema/SqlSchemaGenerator.js +41 -20
  59. package/typings.d.ts +85 -3
@@ -1,4 +1,4 @@
1
- import { AbstractSchemaGenerator, type ClearDatabaseOptions, type CreateSchemaOptions, type DropSchemaOptions, type EnsureDatabaseOptions, type ISchemaGenerator, type MikroORM, type Transaction, type UpdateSchemaOptions } from '@mikro-orm/core';
1
+ import { AbstractSchemaGenerator, type ClearDatabaseOptions, type CreateSchemaOptions, type Dictionary, type DropSchemaOptions, type EnsureDatabaseOptions, type EntityMetadata, type ISchemaGenerator, type MikroORM, type Transaction, type UpdateSchemaOptions } from '@mikro-orm/core';
2
2
  import type { SchemaDifference } from '../typings.js';
3
3
  import { DatabaseSchema } from './DatabaseSchema.js';
4
4
  import type { AbstractSqlDriver } from '../AbstractSqlDriver.js';
@@ -8,24 +8,27 @@ export declare class SqlSchemaGenerator extends AbstractSchemaGenerator<Abstract
8
8
  disableForeignKeys?: boolean;
9
9
  createForeignKeyConstraints?: boolean;
10
10
  ignoreSchema?: string[];
11
+ skipTables?: (string | RegExp)[];
12
+ skipColumns?: Dictionary<(string | RegExp)[]>;
11
13
  managementDbName?: string;
12
14
  };
13
15
  protected lastEnsuredDatabase?: string;
14
16
  static register(orm: MikroORM): void;
15
- createSchema(options?: CreateSchemaOptions): Promise<void>;
17
+ create(options?: CreateSchemaOptions): Promise<void>;
16
18
  /**
17
19
  * Returns true if the database was created.
18
20
  */
19
21
  ensureDatabase(options?: EnsureDatabaseOptions): Promise<boolean>;
20
22
  getTargetSchema(schema?: string): DatabaseSchema;
23
+ protected getOrderedMetadata(schema?: string): EntityMetadata[];
21
24
  getCreateSchemaSQL(options?: CreateSchemaOptions): Promise<string>;
22
- dropSchema(options?: DropSchemaOptions): Promise<void>;
25
+ drop(options?: DropSchemaOptions): Promise<void>;
23
26
  createNamespace(name: string): Promise<void>;
24
27
  dropNamespace(name: string): Promise<void>;
25
- clearDatabase(options?: ClearDatabaseOptions): Promise<void>;
28
+ clear(options?: ClearDatabaseOptions): Promise<void>;
26
29
  getDropSchemaSQL(options?: Omit<DropSchemaOptions, 'dropDb'>): Promise<string>;
27
30
  private getSchemaName;
28
- updateSchema(options?: UpdateSchemaOptions<DatabaseSchema>): Promise<void>;
31
+ update(options?: UpdateSchemaOptions<DatabaseSchema>): Promise<void>;
29
32
  getUpdateSchemaSQL(options?: UpdateSchemaOptions<DatabaseSchema>): Promise<string>;
30
33
  getUpdateSchemaMigrationSQL(options?: UpdateSchemaOptions<DatabaseSchema>): Promise<{
31
34
  up: string;
@@ -45,7 +48,9 @@ export declare class SqlSchemaGenerator extends AbstractSchemaGenerator<Abstract
45
48
  /**
46
49
  * creates new database and connects to it
47
50
  */
48
- createDatabase(name?: string): Promise<void>;
51
+ createDatabase(name?: string, options?: {
52
+ skipOnConnect?: boolean;
53
+ }): Promise<void>;
49
54
  dropDatabase(name?: string): Promise<void>;
50
55
  execute(sql: string, options?: {
51
56
  wrap?: boolean;
@@ -54,5 +59,7 @@ export declare class SqlSchemaGenerator extends AbstractSchemaGenerator<Abstract
54
59
  dropTableIfExists(name: string, schema?: string): Promise<void>;
55
60
  private wrapSchema;
56
61
  private append;
62
+ private matchName;
63
+ private isTableSkipped;
57
64
  }
58
65
  export { SqlSchemaGenerator as SchemaGenerator };
@@ -8,7 +8,7 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
8
8
  static register(orm) {
9
9
  orm.config.registerExtension('@mikro-orm/schema-generator', () => new SqlSchemaGenerator(orm.em));
10
10
  }
11
- async createSchema(options) {
11
+ async create(options) {
12
12
  await this.ensureDatabase();
13
13
  const sql = await this.getCreateSchemaSQL(options);
14
14
  await this.execute(sql);
@@ -17,6 +17,7 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
17
17
  * Returns true if the database was created.
18
18
  */
19
19
  async ensureDatabase(options) {
20
+ await this.connection.ensureConnection();
20
21
  const dbName = this.config.get('dbName');
21
22
  if (this.lastEnsuredDatabase === dbName && !options?.forceCheck) {
22
23
  return true;
@@ -27,18 +28,17 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
27
28
  const managementDbName = this.helper.getManagementDbName();
28
29
  if (managementDbName) {
29
30
  this.config.set('dbName', managementDbName);
30
- await this.driver.reconnect();
31
- await this.createDatabase(dbName);
32
- this.config.set('dbName', dbName);
33
- await this.driver.reconnect();
31
+ await this.driver.reconnect({ skipOnConnect: true });
32
+ await this.createDatabase(dbName, { skipOnConnect: true });
34
33
  }
35
34
  if (options?.create) {
36
- await this.createSchema(options);
35
+ await this.create(options);
37
36
  }
38
37
  return true;
39
38
  }
39
+ /* v8 ignore next */
40
40
  if (options?.clear) {
41
- await this.clearDatabase(options);
41
+ await this.clear({ ...options, clearIdentityMap: false });
42
42
  }
43
43
  return false;
44
44
  }
@@ -47,6 +47,15 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
47
47
  const schemaName = schema ?? this.config.get('schema') ?? this.platform.getDefaultSchemaName();
48
48
  return DatabaseSchema.fromMetadata(metadata, this.platform, this.config, schemaName);
49
49
  }
50
+ getOrderedMetadata(schema) {
51
+ const metadata = super.getOrderedMetadata(schema);
52
+ // Filter out skipped tables
53
+ return metadata.filter(meta => {
54
+ const tableName = meta.tableName;
55
+ const tableSchema = meta.schema ?? schema ?? this.config.get('schema');
56
+ return !this.isTableSkipped(tableName, tableSchema);
57
+ });
58
+ }
50
59
  async getCreateSchemaSQL(options = {}) {
51
60
  const toSchema = this.getTargetSchema(options.schema);
52
61
  const ret = [];
@@ -60,7 +69,7 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
60
69
  if (this.platform.supportsNativeEnums()) {
61
70
  const created = [];
62
71
  for (const [enumName, enumOptions] of Object.entries(toSchema.getNativeEnums())) {
63
- /* v8 ignore next 3 */
72
+ /* v8 ignore next */
64
73
  if (created.includes(enumName)) {
65
74
  continue;
66
75
  }
@@ -80,7 +89,7 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
80
89
  }
81
90
  return this.wrapSchema(ret, options);
82
91
  }
83
- async dropSchema(options = {}) {
92
+ async drop(options = {}) {
84
93
  if (options.dropDb) {
85
94
  const name = this.config.get('dbName');
86
95
  return this.dropDatabase(name);
@@ -96,11 +105,11 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
96
105
  const sql = this.helper.getDropNamespaceSQL(name);
97
106
  await this.execute(sql);
98
107
  }
99
- async clearDatabase(options) {
108
+ async clear(options) {
100
109
  // truncate by default, so no value is considered as true
101
- /* v8 ignore next 3 */
110
+ /* v8 ignore next */
102
111
  if (options?.truncate === false) {
103
- return super.clearDatabase(options);
112
+ return super.clear(options);
104
113
  }
105
114
  await this.execute(this.helper.disableForeignKeysSQL());
106
115
  const schema = options?.schema ?? this.config.get('schema', this.platform.getDefaultSchemaName());
@@ -111,7 +120,9 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
111
120
  .execute();
112
121
  }
113
122
  await this.execute(this.helper.enableForeignKeysSQL());
114
- this.clearIdentityMap();
123
+ if (options?.clearIdentityMap ?? true) {
124
+ this.clearIdentityMap();
125
+ }
115
126
  }
116
127
  async getDropSchemaSQL(options = {}) {
117
128
  await this.ensureDatabase();
@@ -156,7 +167,7 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
156
167
  }
157
168
  return resolvedName;
158
169
  }
159
- async updateSchema(options = {}) {
170
+ async update(options = {}) {
160
171
  const sql = await this.getUpdateSchemaSQL(options);
161
172
  await this.execute(sql);
162
173
  }
@@ -185,7 +196,7 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
185
196
  options.dropTables ??= true;
186
197
  const toSchema = this.getTargetSchema(options.schema);
187
198
  const schemas = toSchema.getNamespaces();
188
- const fromSchema = options.fromSchema ?? (await DatabaseSchema.create(this.connection, this.platform, this.config, options.schema, schemas));
199
+ const fromSchema = options.fromSchema ?? (await DatabaseSchema.create(this.connection, this.platform, this.config, options.schema, schemas, undefined, this.options.skipTables));
189
200
  const wildcardSchemaTables = Object.values(this.metadata.getAll()).filter(meta => meta.schema === '*').map(meta => meta.tableName);
190
201
  fromSchema.prune(options.schema, wildcardSchemaTables);
191
202
  toSchema.prune(options.schema, wildcardSchemaTables);
@@ -280,15 +291,14 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
280
291
  /**
281
292
  * creates new database and connects to it
282
293
  */
283
- async createDatabase(name) {
294
+ async createDatabase(name, options) {
284
295
  name ??= this.config.get('dbName');
285
296
  const sql = this.helper.getCreateDatabaseSQL('' + this.platform.quoteIdentifier(name));
286
297
  if (sql) {
287
- // console.log(sql);
288
298
  await this.execute(sql);
289
299
  }
290
300
  this.config.set('dbName', name);
291
- await this.driver.reconnect();
301
+ await this.driver.reconnect(options);
292
302
  }
293
303
  async dropDatabase(name) {
294
304
  name ??= this.config.get('dbName');
@@ -318,12 +328,10 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
318
328
  if (this.platform.supportsMultipleStatements()) {
319
329
  for (const group of groups) {
320
330
  const query = group.join('\n');
321
- // console.log(query);
322
331
  await this.driver.execute(query);
323
332
  }
324
333
  return;
325
334
  }
326
- // console.log(groups);
327
335
  await Utils.runSerial(groups.flat(), line => this.driver.execute(line));
328
336
  }
329
337
  async dropTableIfExists(name, schema) {
@@ -349,6 +357,19 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
349
357
  append(array, sql, pad) {
350
358
  return this.helper.append(array, sql, pad);
351
359
  }
360
+ matchName(name, nameToMatch) {
361
+ return typeof nameToMatch === 'string'
362
+ ? name.toLocaleLowerCase() === nameToMatch.toLocaleLowerCase()
363
+ : nameToMatch.test(name);
364
+ }
365
+ isTableSkipped(tableName, schemaName) {
366
+ const skipTables = this.options.skipTables;
367
+ if (!skipTables || skipTables.length === 0) {
368
+ return false;
369
+ }
370
+ const fullTableName = schemaName ? `${schemaName}.${tableName}` : tableName;
371
+ return skipTables.some(pattern => this.matchName(tableName, pattern) || this.matchName(fullTableName, pattern));
372
+ }
352
373
  }
353
374
  // for back compatibility
354
375
  export { SqlSchemaGenerator as SchemaGenerator };
package/typings.d.ts CHANGED
@@ -1,9 +1,11 @@
1
- import type { DeferMode, CheckCallback, Dictionary, EntityProperty, GroupOperator, RawQueryFragment, QBFilterQuery, QueryOrderMap, Type, QueryFlag, AnyEntity, EntityName } from '@mikro-orm/core';
1
+ import type { Generated, Kysely } from 'kysely';
2
+ import type { DeferMode, CheckCallback, Dictionary, EntityProperty, GroupOperator, RawQueryFragment, QBFilterQuery, QueryOrderMap, Type, QueryFlag, AnyEntity, EntityName, EntitySchemaWithMeta, Primary, PrimaryProperty, Opt } from '@mikro-orm/core';
2
3
  import type { JoinType, QueryType } from './query/enums.js';
3
4
  import type { DatabaseSchema } from './schema/DatabaseSchema.js';
4
5
  import type { DatabaseTable } from './schema/DatabaseTable.js';
5
6
  import type { QueryBuilder } from './query/QueryBuilder.js';
6
7
  import type { NativeQueryBuilder } from './query/NativeQueryBuilder.js';
8
+ import type { MikroKyselyPluginOptions } from './plugin/index.js';
7
9
  export interface Table {
8
10
  table_name: string;
9
11
  schema_name?: string;
@@ -27,6 +29,7 @@ export interface JoinOptions {
27
29
  cond_?: Dictionary;
28
30
  subquery?: string;
29
31
  nested?: Set<JoinOptions>;
32
+ parent?: JoinOptions;
30
33
  }
31
34
  export interface Column {
32
35
  name: string;
@@ -74,7 +77,7 @@ export interface IndexDef {
74
77
  storageEngineIndexType?: 'hash' | 'btree';
75
78
  predicate?: string;
76
79
  }>;
77
- deferMode?: DeferMode;
80
+ deferMode?: DeferMode | `${DeferMode}`;
78
81
  }
79
82
  export interface CheckDef<T = unknown> {
80
83
  name: string;
@@ -171,11 +174,13 @@ export interface ICriteriaNodeProcessOptions {
171
174
  ignoreBranching?: boolean;
172
175
  preferNoBranch?: boolean;
173
176
  type?: 'orderBy';
177
+ filter?: boolean;
174
178
  }
175
179
  export interface ICriteriaNode<T extends object> {
176
180
  readonly entityName: string;
177
181
  readonly parent?: ICriteriaNode<T> | undefined;
178
182
  readonly key?: string | undefined;
183
+ readonly strict?: boolean;
179
184
  payload: any;
180
185
  prop?: EntityProperty;
181
186
  index?: number;
@@ -183,8 +188,85 @@ export interface ICriteriaNode<T extends object> {
183
188
  shouldInline(payload: any): boolean;
184
189
  willAutoJoin(qb: IQueryBuilder<T>, alias?: string, options?: ICriteriaNodeProcessOptions): boolean;
185
190
  shouldRename(payload: any): boolean;
186
- renameFieldToPK<T>(qb: IQueryBuilder<T>): string;
191
+ renameFieldToPK<T>(qb: IQueryBuilder<T>, ownerAlias?: string): string;
187
192
  getPath(addIndex?: boolean): string;
188
193
  getPivotPath(path: string): string;
189
194
  }
195
+ export type MaybeReturnType<T> = T extends (...args: any[]) => infer R ? R : T;
196
+ export type InferEntityProperties<Schema> = Schema extends EntitySchemaWithMeta<any, any, any, any, infer Properties> ? Properties : never;
197
+ export type InferKyselyDB<TEntities extends {
198
+ name: string;
199
+ }, TOptions extends MikroKyselyPluginOptions = {}> = MapValueAsTable<MapByName<TEntities>, TOptions>;
200
+ export type InferDBFromKysely<TKysely extends Kysely<any>> = TKysely extends Kysely<infer TDB> ? TDB : never;
201
+ type PreferStringLiteral<TCandidate, TFallback> = [
202
+ TCandidate
203
+ ] extends [never] ? TFallback : string extends TCandidate ? TFallback : TCandidate extends string ? TCandidate : TFallback;
204
+ export type MapByName<T extends {
205
+ name: string;
206
+ tableName?: string;
207
+ }> = {
208
+ [P in T as PreferStringLiteral<NonNullable<P['tableName']>, P['name']>]: P;
209
+ };
210
+ export type MapValueAsTable<TMap extends Record<string, any>, TOptions extends MikroKyselyPluginOptions = {}> = {
211
+ [K in keyof TMap as TransformName<K, TOptions['tableNamingStrategy'] extends 'entity' ? 'entity' : 'underscore'>]: InferKyselyTable<TMap[K], TOptions>;
212
+ };
213
+ export type InferKyselyTable<TSchema extends EntitySchemaWithMeta, TOptions extends MikroKyselyPluginOptions = {}> = ExcludeNever<{
214
+ -readonly [K in keyof InferEntityProperties<TSchema> as TransformColumnName<K, TOptions['columnNamingStrategy'] extends 'property' ? 'property' : 'underscore', MaybeReturnType<InferEntityProperties<TSchema>[K]>>]: InferColumnValue<MaybeReturnType<InferEntityProperties<TSchema>[K]>, TOptions['processOnCreateHooks'] extends true ? true : false>;
215
+ }>;
216
+ type TransformName<TName, TNamingStrategy extends 'underscore' | 'entity'> = TNamingStrategy extends 'underscore' ? TName extends string ? SnakeCase<TName> : TName : TName;
217
+ type TransformColumnName<TName, TNamingStrategy extends 'underscore' | 'property', TBuilder> = TNamingStrategy extends 'property' ? TName : TBuilder extends {
218
+ '~options': {
219
+ fieldName: string;
220
+ };
221
+ } ? TBuilder['~options']['fieldName'] : TName extends string ? MaybeJoinColumnName<SnakeCase<TName>, TBuilder> : never;
222
+ type MaybeJoinColumnName<TName extends string, TBuilder> = TBuilder extends {
223
+ '~type'?: {
224
+ value: infer Value;
225
+ };
226
+ '~options': {
227
+ kind: 'm:1';
228
+ };
229
+ } ? PrimaryProperty<Value> extends string ? `${TName}_${SnakeCase<PrimaryProperty<Value>>}` : never : TBuilder extends {
230
+ '~type'?: {
231
+ value: infer Value;
232
+ };
233
+ '~options': {
234
+ kind: '1:1';
235
+ owner: true;
236
+ };
237
+ } ? PrimaryProperty<Value> extends string ? `${TName}_${SnakeCase<PrimaryProperty<Value>>}` : never : TName;
238
+ export type SnakeCase<TName extends string> = TName extends `${infer P1}${infer P2}` ? P2 extends Uncapitalize<P2> ? `${Uncapitalize<P1>}${SnakeCase<P2>}` : `${Uncapitalize<P1>}_${SnakeCase<Uncapitalize<P2>>}` : TName;
239
+ type InferColumnValue<TBuilder, TProcessOnCreate extends boolean> = TBuilder extends {
240
+ '~type'?: {
241
+ value: infer Value;
242
+ };
243
+ '~options': infer TOptions;
244
+ } ? MaybeNever<MaybeGenerated<MaybeJoinKey<Value, TOptions>, TOptions, TProcessOnCreate>, TOptions> : never;
245
+ type MaybeGenerated<TValue, TOptions, TProcessOnCreate extends boolean> = TOptions extends {
246
+ nullable: true;
247
+ } ? (TValue | null) : TOptions extends {
248
+ autoincrement: true;
249
+ } ? Generated<TValue> : TOptions extends {
250
+ default: true;
251
+ } ? Generated<TValue> : TOptions extends {
252
+ defaultRaw: true;
253
+ } ? Generated<TValue> : TProcessOnCreate extends false ? TValue : TOptions extends {
254
+ onCreate: Function;
255
+ } ? Generated<TValue> : TValue;
256
+ type MaybeJoinKey<TValue, TOptions> = TOptions extends {
257
+ kind: 'm:1';
258
+ } ? UnwrapOpt<Primary<TValue>> : TOptions extends {
259
+ kind: '1:1';
260
+ } ? TOptions extends {
261
+ owner: true;
262
+ } ? UnwrapOpt<Primary<TValue>> : never : TValue;
263
+ type UnwrapOpt<TValue> = TValue extends Opt<infer OriginalValue> ? OriginalValue : TValue;
264
+ type MaybeNever<TValue, TOptions> = TOptions extends {
265
+ persist: true;
266
+ } ? never : TOptions extends {
267
+ kind: 'm:n';
268
+ } ? never : TValue;
269
+ type ExcludeNever<TMap extends Record<string, any>> = {
270
+ [K in keyof TMap as TMap[K] extends never ? never : K]: TMap[K];
271
+ };
190
272
  export {};