imodel 0.3.1 → 0.4.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/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * imodel v0.3.1
2
+ * imodel v0.4.0
3
3
  * (c) 2019-2025 undefined
4
4
  * @license undefined
5
5
  */
@@ -52,6 +52,7 @@ function isPseudo(model) {
52
52
  }
53
53
 
54
54
  const now = Symbol();
55
+ const uuid = Symbol();
55
56
  const increment$1 = Symbol();
56
57
  const decrement$1 = Symbol();
57
58
  const multiply$1 = Symbol();
@@ -63,38 +64,10 @@ var values = /*#__PURE__*/Object.freeze({
63
64
  divide: divide$1,
64
65
  increment: increment$1,
65
66
  multiply: multiply$1,
66
- now: now
67
+ now: now,
68
+ uuid: uuid
67
69
  });
68
70
 
69
- /** @import { Fields, FieldType } from './types' */
70
- /**
71
- *
72
- * @param {Fields} fields
73
- * @returns {Fields<keyof FieldType>}
74
- */
75
- function toBaseFields(fields) {
76
- /** @type {Fields<keyof FieldType>} */
77
- const allFields = {};
78
- for (const [k, v] of Object.entries(fields)) {
79
- const {
80
- type
81
- } = v;
82
- if (typeof type === 'string') {
83
- // @ts-ignore
84
- allFields[k] = v;
85
- continue;
86
- }
87
- if (!type.table) {
88
- allFields[k] = {
89
- ...v,
90
- type: 'object',
91
- primary: 0
92
- };
93
- }
94
- }
95
- return allFields;
96
- }
97
-
98
71
  /** @import { Options, Queryable } from '../types' */
99
72
  /**
100
73
  *
@@ -162,81 +135,45 @@ async function getSpecificValue(val) {
162
135
  return value;
163
136
  }
164
137
 
165
- /** @import { SetValue } from '../../set.mjs' */
166
- /** @import { Fields, Skip } from '../../types' */
167
- /**
168
- *
169
- * @param {Fields} fields
170
- * @param {Record<string, SetValue> | null | undefined} [update]
171
- * @param {boolean | Skip} [skip]
172
- * @returns {Promise<Record<string, SetValue>>}
173
- */
174
- async function getSetNewValue(fields, update, skip) {
175
- const data = {
176
- ...update
177
- };
178
- if (!(skip === true || skip && skip.specific)) {
179
- for (const [name, field] of Object.entries(fields)) {
180
- if (field.primary) {
181
- continue;
182
- }
183
- const updating = await getSpecificValue(field.updating);
184
- if (updating !== void 0) {
185
- data[name] = updating;
186
- }
187
- }
188
- }
189
- return Object.fromEntries(Object.entries(data).filter(([k, v]) => {
190
- const field = k in fields && fields[k];
191
- if (!field) {
192
- return;
193
- }
194
- if (field.immutable) {
195
- if (!skip) {
196
- return;
197
- }
198
- if (skip !== true && !skip.immutable) {
199
- return;
200
- }
201
- }
202
- return true;
203
- }));
204
- }
205
-
206
138
  /** @import { Fields } from '../../types' */
207
139
  /**
208
140
  *
209
141
  * @param {Record<string, any>} data
210
- * @param {Fields} fields
142
+ * @param {Fields} columns
143
+ * @param {Record<string, string> | null} fieldColumns
211
144
  * @returns {Promise<Record<string, any>>}
212
145
  */
213
- async function getInsertValue(data, fields) {
146
+ async function getInsertValue(data, columns, fieldColumns) {
214
147
  const insertValue = {};
215
- for (const [k, field] of Object.entries(fields)) {
216
- const creating = await getSpecificValue(field.creating);
148
+ for (const [k, col] of fieldColumns ? Object.entries(fieldColumns) : Object.keys(columns).map(v => [v, v])) {
149
+ const column = columns[col];
150
+ if (!column) {
151
+ continue;
152
+ }
153
+ const creating = await getSpecificValue(column.creating);
217
154
  if (creating !== void 0) {
218
- insertValue[k] = creating;
155
+ insertValue[col] = creating;
219
156
  continue;
220
157
  }
221
- const updating = await getSpecificValue(field.updating);
158
+ const updating = await getSpecificValue(column.updating);
222
159
  if (updating !== void 0) {
223
- insertValue[k] = updating;
160
+ insertValue[col] = updating;
224
161
  continue;
225
162
  }
226
163
  const val = data[k];
227
164
  if (val !== undefined) {
228
- insertValue[k] = val;
165
+ insertValue[col] = val;
229
166
  continue;
230
167
  }
231
- const def = field.default;
168
+ const def = column.default;
232
169
  if (def === undefined) {
233
170
  continue;
234
171
  }
235
172
  if (typeof def === 'function') {
236
- insertValue[k] = def(data);
173
+ insertValue[col] = def(data);
237
174
  continue;
238
175
  }
239
- insertValue[k] = def;
176
+ insertValue[col] = def;
240
177
  }
241
178
  return insertValue;
242
179
  }
@@ -288,58 +225,91 @@ function setDefaultOptions(v) {
288
225
  return v;
289
226
  }
290
227
 
228
+ /**
229
+ *
230
+ * @param {*} item
231
+ * @param {[string, string][]} mapList
232
+ * @returns
233
+ */
234
+ function createFilter(item, mapList) {
235
+ /** @type {[string, any][]} */
236
+ const values = mapList.map(([k, v]) => [k, item[v]]);
237
+ return sub => {
238
+ for (const [k, v] of values) {
239
+ // eslint-disable-next-line eqeqeq
240
+ if (sub[k] != v) {
241
+ return false;
242
+ }
243
+ }
244
+ return true;
245
+ };
246
+ }
247
+
291
248
  /** @import { FieldDefine, Fields, FieldType, TableDefine } from '../../types' */
292
249
  /**
293
250
  *
294
251
  * @param {Fields} fields
295
- * @returns {[Fields<keyof FieldType>, [string, FieldDefine<TableDefine>][]]}
252
+ * @returns {[columns: Fields<keyof FieldType>, fieldColumns: Record<string, string> | null, [string, FieldDefine<TableDefine>][], baseFields: Fields<keyof FieldType>]}
296
253
  */
297
- function separateFields(fields) {
254
+ function toColumns(fields) {
255
+ /** @type {Fields<keyof FieldType>} */
256
+ const baseFields = Object.create(null);
298
257
  /** @type {Fields<keyof FieldType>} */
299
- const base = Object.create(null);
258
+ const columns = Object.create(null);
259
+ /** @type {Record<string, string>} */
260
+ const fieldColumns = Object.create(null);
261
+ let named = false;
300
262
  /** @type {[string, FieldDefine<TableDefine>][]} */
301
263
  const sub = [];
302
264
  for (const [k, v] of Object.entries(fields)) {
303
265
  const {
304
266
  type
305
267
  } = v;
268
+ if (!type) {
269
+ continue;
270
+ }
271
+ const column = v.column || k;
306
272
  if (typeof type === 'string') {
307
273
  // @ts-ignore
308
- base[k] = v;
309
- } else if (!type.table) {
310
- base[k] = {
274
+ baseFields[k] = columns[column] = v;
275
+ fieldColumns[k] = column;
276
+ if (k !== column) {
277
+ named = true;
278
+ }
279
+ continue;
280
+ }
281
+ if (!type.table) {
282
+ baseFields[k] = columns[column] = {
311
283
  ...v,
312
284
  type: 'object',
313
285
  primary: 0
314
286
  };
315
- } else {
316
- // @ts-ignore
317
- sub.push([k, v]);
287
+ fieldColumns[k] = column;
288
+ if (k !== column) {
289
+ named = true;
290
+ }
291
+ continue;
318
292
  }
293
+ // @ts-ignore
294
+ sub.push([k, v]);
319
295
  }
320
- return [base, sub];
296
+ return [columns, named ? fieldColumns : null, sub, baseFields];
321
297
  }
322
298
 
323
299
  /**
324
300
  *
325
- * @param {*} item
326
- * @param {[string, string][]} mapList
327
- * @returns
301
+ * @param {Record<string, any>[]} list
302
+ * @param {Record<string, string>?} fieldColumns
328
303
  */
329
- function createFilter(item, mapList) {
330
- /** @type {[string, any][]} */
331
- const values = mapList.map(([k, v]) => [k, item[v]]);
332
- return sub => {
333
- for (const [k, v] of values) {
334
- if (sub[k] !== v) {
335
- return false;
336
- }
337
- }
338
- return true;
339
- };
304
+ function toFieldList(list, fieldColumns) {
305
+ if (!fieldColumns) {
306
+ return list;
307
+ }
308
+ const map = Object.entries(fieldColumns);
309
+ return list.map(it => Object.fromEntries(map.map(([k, v]) => [k, it[v]])));
340
310
  }
341
311
 
342
- /** @import { Environment, FieldDefine, Fields, GetName, IConnection, TableDefine } from '../types' */
312
+ /** @import { Environment, FieldDefine, Fields, IConnection, TableDefine } from '../types' */
343
313
  /**
344
314
  *
345
315
  * @param {any} p
@@ -447,13 +417,13 @@ async function createSub(conn, env, fields, newList, list) {
447
417
  }
448
418
  continue;
449
419
  }
450
- const [baseFields, tableFields] = separateFields(fields);
451
- const insertKeys = Object.entries(baseFields).map(v => v[0]);
452
- const insertValues = await Promise.all(fieldValues.map(d => getInsertValue(d, fields)));
420
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
421
+ const insertKeys = Object.entries(columns).map(v => v[0]);
422
+ const insertValues = await Promise.all(fieldValues.map(d => getInsertValue(d, columns, fieldColumns)));
453
423
  const {
454
424
  table
455
425
  } = type;
456
- const result = table && typeof table === 'object' ? table.insert(env, conn, '', baseFields, insertValues, insertKeys) : conn.insert(env, table || '', baseFields, insertValues, insertKeys);
426
+ const result = (table && typeof table === 'object' ? table.insert(env, conn, columns, insertValues, insertKeys) : conn.insert(env, table || '', columns, insertValues, insertKeys)).then(r => toFieldList(r, fieldColumns));
457
427
  promises.push(result.then(r => createSub(conn, env, tableFields, fieldValues, r)));
458
428
  promises.push(array ? result.then(values => {
459
429
  for (const [value] of allList) {
@@ -498,16 +468,16 @@ async function create(conn, env, model, p, mapDo = defaultMap) {
498
468
  }
499
469
  records.push(data);
500
470
  }
501
- const [baseFields, tableFields] = separateFields(fields);
502
- const insertValues = await Promise.all(records.map(d => getInsertValue(d, baseFields)));
471
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
472
+ const insertValues = await Promise.all(records.map(d => getInsertValue(d, columns, fieldColumns)));
503
473
  let insertKeys = [];
504
474
  if (!insertKeys.length && !isArray) {
505
- insertKeys = Object.entries(insertValues[0]).filter(([k, v]) => v !== undefined && k in baseFields).map(([k]) => k);
475
+ insertKeys = Object.entries(insertValues[0]).filter(([k, v]) => v !== undefined && k in columns).map(([k]) => k);
506
476
  }
507
477
  if (!insertKeys.length) {
508
- insertKeys = Object.entries(baseFields).map(([k]) => k);
478
+ insertKeys = Object.entries(columns).map(([k]) => k);
509
479
  }
510
- const list = table && typeof table === 'object' ? await table.insert(env, conn, '', baseFields, insertValues, insertKeys) : await conn.insert(env, table || '', baseFields, insertValues, insertKeys);
480
+ const list = toFieldList(table && typeof table === 'object' ? await table.insert(env, conn, columns, insertValues, insertKeys) : await conn.insert(env, table || '', columns, insertValues, insertKeys), fieldColumns);
511
481
  await createSub(conn, env, tableFields, records, list);
512
482
  const value = list.map((v, i) => mapDo(v, getOtherValues(records[i], fields)));
513
483
  return isArray ? value : value[0];
@@ -516,12 +486,12 @@ async function create(conn, env, model, p, mapDo = defaultMap) {
516
486
  /** @import { Fields } from './types' */
517
487
  /**
518
488
  *
519
- * @param {Fields} fields
489
+ * @param {Fields} fieldsOrColumns
520
490
  * @returns {string[]}
521
491
  */
522
- function getPrimaryKeys(fields) {
523
- const list = Object.entries(fields);
524
- const primaryKeys = list.filter(([v, o]) => typeof o.type === 'string' && o.primary);
492
+ function getPrimaryKeys(fieldsOrColumns) {
493
+ const list = Object.entries(fieldsOrColumns);
494
+ const primaryKeys = list.filter(([v, o]) => o.type && typeof o.type === 'string' && o.primary);
525
495
  if (primaryKeys.length) {
526
496
  return primaryKeys.map(([k]) => k);
527
497
  }
@@ -530,8 +500,8 @@ function getPrimaryKeys(fields) {
530
500
 
531
501
  /** @import { Constraint, Fields, FieldType } from '../../types' */
532
502
  /**
533
- * @param {Fields<keyof FieldType>} fields
534
- * @param {Fields<keyof FieldType>} parentFields
503
+ * @param {Fields} fields
504
+ * @param {Set<string>} parentFields
535
505
  * @param {Record<string, string | Constraint> | undefined} constraints
536
506
  * @returns {[string, string][]?}
537
507
  */
@@ -549,7 +519,7 @@ function getMapList(fields, parentFields, constraints) {
549
519
  if (typeof field !== 'string') {
550
520
  continue;
551
521
  }
552
- if (!(field in parentFields)) {
522
+ if (!parentFields.has(field)) {
553
523
  continue;
554
524
  }
555
525
  where.push([k, field]);
@@ -564,17 +534,17 @@ function getMapList(fields, parentFields, constraints) {
564
534
  /**
565
535
  *
566
536
  * @param {Record<string, Constraint> | undefined} value
567
- * @param {Fields<keyof FieldType>} fields
537
+ * @param {Fields<keyof FieldType>} columns
568
538
  * @returns {[string, unknown][]}
569
539
  */
570
- function getValueEntries(value, fields) {
540
+ function getValueEntries(value, columns) {
571
541
  if (!value) {
572
542
  return [];
573
543
  }
574
544
  /** @type {[string, unknown][]} */
575
545
  const where = [];
576
546
  for (const [k, v] of Object.entries(value)) {
577
- if (!(k in fields)) {
547
+ if (!(k in columns)) {
578
548
  continue;
579
549
  }
580
550
  if (!v || typeof v !== 'object') {
@@ -620,18 +590,68 @@ function valueEntries2where(value) {
620
590
  }));
621
591
  }
622
592
 
623
- /** @import { Environment, FieldDefine, Fields, FieldType, GetName, IConnection, MatchArg, Queryable, TableDefine } from '../types' */
593
+ /** @import { WhereValue } from '../../Where.mjs' */
594
+ /**
595
+ *
596
+ * @param {WhereValue['field']} field
597
+ * @param {Record<string, string>} fieldColumns
598
+ * @returns {WhereValue['field']}
599
+ */
600
+ function field$2(field, fieldColumns) {
601
+ if (!field) {
602
+ return field;
603
+ }
604
+ if (!Array.isArray(field)) {
605
+ if (typeof field === 'string') {
606
+ return fieldColumns[field];
607
+ }
608
+ return {
609
+ ...field,
610
+ field: fieldColumns[field.field]
611
+ };
612
+ }
613
+ return field.map(field => {
614
+ if (typeof field === 'string') {
615
+ return fieldColumns[field];
616
+ }
617
+ return {
618
+ ...field,
619
+ field: fieldColumns[field.field]
620
+ };
621
+ });
622
+ }
623
+ /**
624
+ *
625
+ * @param {WhereValue[] | null | undefined} where
626
+ * @param {Record<string, string>?} fieldColumns
627
+ * @returns {WhereValue[]}
628
+ */
629
+ function where2column(where, fieldColumns) {
630
+ if (!where) {
631
+ return [];
632
+ }
633
+ if (!fieldColumns) {
634
+ return where;
635
+ }
636
+ // @ts-ignore
637
+ return where.map(v => ({
638
+ ...v,
639
+ field: field$2(v.field, fieldColumns)
640
+ }));
641
+ }
642
+
643
+ /** @import { Environment, FieldDefine, IConnection, Queryable, TableDefine } from '../types' */
624
644
  /**
625
645
  *
626
646
  * @param {IConnection} conn
627
647
  * @param {any[]} list
628
648
  * @param {[string, FieldDefine<TableDefine>][]} fields
629
- * @param {Fields<keyof FieldType>} baseFields
649
+ * @param {Set<string>} baseFieldSet
630
650
  * @param {Environment} env
631
651
  * @param {boolean} [hasResult]
632
652
  * @returns
633
653
  */
634
- async function deleteSub(conn, list, fields, baseFields, env, hasResult) {
654
+ async function deleteSub(conn, list, fields, baseFieldSet, env, hasResult) {
635
655
  if (!list.length) {
636
656
  return list;
637
657
  }
@@ -646,29 +666,25 @@ async function deleteSub(conn, list, fields, baseFields, env, hasResult) {
646
666
  const {
647
667
  fields
648
668
  } = type;
649
- const [subfields, tableFields] = separateFields(fields);
650
- const mapList = getMapList(subfields, baseFields, constraints);
669
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
670
+ const mapList = getMapList(fields, baseFieldSet, constraints);
651
671
  if (!mapList) {
652
672
  continue;
653
673
  }
654
- const value = getValueEntries(constraints, subfields);
655
- const where = [subList2where(list, mapList), ...valueEntries2where(value)];
674
+ const value = getValueEntries(constraints, columns);
675
+ const where = where2column([subList2where(list, mapList), ...valueEntries2where(value)], fieldColumns);
656
676
  const {
657
677
  table
658
678
  } = type;
659
- /** @type {MatchArg} */
660
- const argv = {
661
- table: typeof table === 'string' ? table : '',
662
- fields: subfields,
663
- where
664
- };
679
+ const tableName = typeof table === 'string' ? table : '';
665
680
  if (!tableFields.length && !hasResult) {
666
- const result = table && typeof table === 'object' ? table.delete(env, conn, argv) : conn.delete(env, argv);
681
+ const result = table && typeof table === 'object' ? table.delete(env, conn, columns, where) : conn.delete(env, tableName, columns, where);
667
682
  promises.push(result);
668
683
  continue;
669
684
  }
670
- const result = table && typeof table === 'object' ? table.deleteReturn(env, conn, argv, Object.keys(subfields)) : conn.deleteReturn(env, argv, Object.keys(subfields));
671
- promises.push(result.then(l => deleteSub(conn, l, tableFields, subfields, env, hasResult)));
685
+ const result = (table && typeof table === 'object' ? table.deleteReturn(env, conn, Object.keys(columns), columns, where) : conn.deleteReturn(env, Object.keys(columns), tableName, columns, where)).then(r => toFieldList(r, fieldColumns));
686
+ const subFieldSet = new Set(Object.keys(fieldColumns || columns));
687
+ promises.push(result.then(l => deleteSub(conn, l, tableFields, subFieldSet, env, hasResult)));
672
688
  constraintEntries.find(([k, v]) => v.noField)?.[0];
673
689
  promises.push(array ? result.then(subList => {
674
690
  for (const item of list) {
@@ -696,39 +712,93 @@ async function deleteMany(conn, queryable, env) {
696
712
  table,
697
713
  fields
698
714
  } = queryable;
699
- const {
700
- where
701
- } = queryable.options;
702
- const [baseFields, tableFields] = separateFields(fields);
715
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
716
+ const where = where2column(queryable.options.where, fieldColumns);
703
717
  if (!tableFields.length) {
704
- return table && typeof table === 'object' ? table.delete(env, conn, {
705
- table: '',
706
- fields: baseFields,
707
- where
708
- }) : conn.delete(env, {
709
- table: table || '',
710
- fields: baseFields,
711
- where
712
- });
718
+ return table && typeof table === 'object' ? table.delete(env, conn, columns, where) : conn.delete(env, table || '', columns, where);
713
719
  }
714
- const list = table && typeof table === 'object' ? await table.deleteReturn(env, conn, {
715
- table: '',
716
- fields: baseFields,
717
- where
718
- }, Object.keys(baseFields)) : await conn.deleteReturn(env, {
719
- table: table || '',
720
- fields: baseFields,
721
- where
722
- }, Object.keys(baseFields));
720
+ const list = toFieldList(table && typeof table === 'object' ? await table.deleteReturn(env, conn, Object.keys(columns), columns, where) : await conn.deleteReturn(env, Object.keys(columns), table || '', columns, where), fieldColumns);
723
721
  if (!list) {
724
722
  return 0;
725
723
  }
726
- await deleteSub(conn, list, tableFields, baseFields, env);
724
+ const baseFieldSet = new Set(Object.keys(fieldColumns || columns));
725
+ await deleteSub(conn, list, tableFields, baseFieldSet, env);
727
726
  return list.length;
728
727
  }
729
728
 
729
+ /**
730
+ *
731
+ * @param {string[]} list
732
+ * @param {Record<string, string>?} fieldColumns
733
+ */
734
+ function field2column(list, fieldColumns) {
735
+ if (!fieldColumns) {
736
+ return list;
737
+ }
738
+ return list.map(k => fieldColumns[k]);
739
+ }
740
+
741
+ /**
742
+ *
743
+ * @param {Record<string, any>[]} list
744
+ * @param {Record<string, string>?} fieldColumns
745
+ */
746
+ function toColumnList(list, fieldColumns) {
747
+ if (!fieldColumns) {
748
+ return list;
749
+ }
750
+ const map = Object.entries(fieldColumns);
751
+ return list.map(it => Object.fromEntries(map.map(([k, v]) => [v, it[k]])));
752
+ }
753
+
754
+ /** @import { SetValue } from '../../set.mjs' */
755
+ /** @import { Fields, Skip, FieldType } from '../../types' */
756
+ /**
757
+ *
758
+ * @param {Fields<keyof FieldType>} columns
759
+ * @param {Record<string, string> | null} fieldColumns
760
+ * @param {Record<string, SetValue> | null | undefined} [update]
761
+ * @param {boolean | Skip} [skip]
762
+ * @returns {Promise<Record<string, SetValue>>}
763
+ */
764
+ async function getSetValue$1(columns, fieldColumns, update, skip) {
765
+ /** @type {Record<string, SetValue>} */
766
+ const data = {};
767
+ if (update) {
768
+ for (const [k, v] of Object.entries(update)) {
769
+ const key = fieldColumns ? fieldColumns[k] : k;
770
+ const field = columns[key];
771
+ if (!field) {
772
+ continue;
773
+ }
774
+ if (field.immutable) {
775
+ if (!skip) {
776
+ continue;
777
+ }
778
+ if (skip !== true && !skip.immutable) {
779
+ continue;
780
+ }
781
+ }
782
+ data[key] = v;
783
+ }
784
+ }
785
+ if (!(skip === true || skip && skip.specific)) {
786
+ for (const [name, field] of Object.entries(columns)) {
787
+ if (field.primary) {
788
+ continue;
789
+ }
790
+ const updating = await getSpecificValue(field.updating);
791
+ if (updating === void 0) {
792
+ continue;
793
+ }
794
+ data[name] = updating;
795
+ }
796
+ }
797
+ return data;
798
+ }
799
+
730
800
  /* eslint-disable no-labels */
731
- /** @import { Constraint, Environment, FieldDefine, GetName, IConnection, TableDefine } from '../types' */
801
+ /** @import { Constraint, Environment, FieldDefine, IConnection, TableDefine } from '../types' */
732
802
  /** @import { WhereValue } from '../Where.mjs' */
733
803
  /**
734
804
  *
@@ -743,9 +813,6 @@ function classify(newList, oldList, keys, notFound, found) {
743
813
  oldValue: for (let i = 0; i < oldList.length; i++) {
744
814
  const old = oldList[i];
745
815
  for (const k of keys) {
746
- if (n[k] === undefined) {
747
- continue;
748
- }
749
816
  if (old[k] !== n[k]) {
750
817
  continue oldValue;
751
818
  }
@@ -835,24 +902,23 @@ async function updateItem(conn, env, updatedOldNewList, key, type, array, constr
835
902
  if (!has) {
836
903
  return;
837
904
  }
838
- const oldList = oldListValues.flat();
839
- const newList = newListValues.flat();
840
- const {
841
- fields
842
- } = type;
905
+ const [columns, fieldColumns, tableFields, fields] = toColumns(type.fields);
843
906
  /** @type {Record<string, any>} */
844
- const commonKeys = {};
845
- for (const [k, v] of Object.entries(constraints || {})) {
907
+ const commonValues = {};
908
+ for (const [k, v] of constraintEntries) {
846
909
  const {
847
910
  field,
848
911
  value
849
912
  } = v;
850
- if (field || value !== undefined) {
851
- commonKeys[k] = 1;
913
+ if (!field && value !== undefined) {
914
+ commonValues[k] = value;
852
915
  }
853
916
  }
854
- const [baseFields, tableFields] = separateFields(fields);
855
- const primaryKeys = getPrimaryKeys(baseFields);
917
+ const oldList = oldListValues.flat();
918
+ const newList = newListValues.flat();
919
+ const primaryKeys = getPrimaryKeys(fields);
920
+ const fieldKeys = Object.keys(fields);
921
+ const columnKeys = Object.keys(columns);
856
922
  // 分离出新建、修改、删除
857
923
  // TODO: 优化分离逻辑
858
924
  const needDelete = oldList;
@@ -864,9 +930,9 @@ async function updateItem(conn, env, updatedOldNewList, key, type, array, constr
864
930
  const needUpdate = [];
865
931
  /** @type {Record<string, any>[]} */
866
932
  const unmatched = [];
867
- const aKeys = Object.keys(baseFields).filter(v => !(v in commonKeys));
933
+ const aKeys = fieldKeys.filter(v => !(v in commonValues));
934
+ const pKeys = primaryKeys.filter(v => !(v in commonValues));
868
935
  classify(newList, needDelete, aKeys, unmatched, eq);
869
- const pKeys = primaryKeys.filter(v => !(v in commonKeys));
870
936
  classify(unmatched, needDelete, pKeys, needCreate, needUpdate);
871
937
  const {
872
938
  table
@@ -874,10 +940,10 @@ async function updateItem(conn, env, updatedOldNewList, key, type, array, constr
874
940
  if (needDelete.length) {
875
941
  // 批量删除
876
942
  /** @type {WhereValue[]} */
877
- const where = primaryKeys.filter(v => v in commonKeys).map(k => ({
943
+ const where = primaryKeys.filter(v => v in commonValues).map(k => ({
878
944
  field: k,
879
945
  operator: '=',
880
- value: commonKeys[k] ?? null
946
+ value: commonValues[k] ?? null
881
947
  }));
882
948
  if (pKeys.length === 1) {
883
949
  const [key] = pKeys;
@@ -893,16 +959,8 @@ async function updateItem(conn, env, updatedOldNewList, key, type, array, constr
893
959
  value: needDelete.map(v => pKeys.map(k => v[k] ?? null))
894
960
  });
895
961
  }
896
- const promise = typeof table === 'object' ? table.deleteReturn(env, conn, {
897
- table: '',
898
- fields: baseFields,
899
- where
900
- }, Object.keys(baseFields)) : conn.deleteReturn(env, {
901
- table: table || '',
902
- fields: baseFields,
903
- where
904
- }, Object.keys(baseFields));
905
- promises.push(promise.then(list => deleteSub(conn, list, tableFields, baseFields, env)));
962
+ const promise = typeof table === 'object' ? table.deleteReturn(env, conn, columnKeys, columns, where2column(where, fieldColumns)) : conn.deleteReturn(env, columnKeys, table || '', columns, where2column(where, fieldColumns));
963
+ promises.push(promise.then(list => deleteSub(conn, toFieldList(list, fieldColumns), tableFields, new Set(Object.keys(fieldColumns || columns)), env)));
906
964
  }
907
965
  /** @type {typeof updatedOldNewList} */
908
966
  const list = eq.map(([n, o]) => [{
@@ -914,34 +972,37 @@ async function updateItem(conn, env, updatedOldNewList, key, type, array, constr
914
972
  const subPromises = [list];
915
973
  // 批量修改
916
974
  if (needUpdate.length) {
917
- const keys = new Set(needUpdate.map(v => Object.keys(v[0])).flat());
918
- const update = await getSetNewValue(baseFields);
919
- for (const k of Object.keys(update)) {
920
- keys.delete(k);
975
+ let keysColumn = new Set(needUpdate.map(v => Object.keys(v[0])).flat());
976
+ if (fieldColumns) {
977
+ keysColumn = new Set(field2column([...keysColumn], fieldColumns));
921
978
  }
922
- const setKeys = Object.entries(baseFields).filter(([, v]) => typeof v.type === 'string' && !v.primary && !v.immutable).map(v => v[0]).filter(v => keys.has(v));
979
+ const updateColumn = await getSetValue$1(columns, fieldColumns);
980
+ for (const k of Object.keys(updateColumn)) {
981
+ keysColumn.delete(k);
982
+ }
983
+ const setKeysColumn = Object.entries(columns).filter(([, v]) => !v.primary && !v.immutable).map(v => v[0]).filter(v => keysColumn.has(v));
923
984
  /** @type {WhereValue[]} */
924
- const where = Object.entries(commonKeys).filter(([k]) => primaryKeys.includes(k)).map(([k, v]) => ({
985
+ const where = Object.entries(commonValues).filter(([k]) => primaryKeys.includes(k)).map(([k, v]) => ({
925
986
  field: k,
926
987
  operator: '=',
927
988
  value: v
928
989
  }));
929
990
  for (const [value, old] of needUpdate) {
930
- for (const key of setKeys) {
991
+ for (const key of fieldKeys) {
931
992
  if (value[key] !== undefined) {
932
993
  continue;
933
994
  }
934
995
  value[key] = old[key];
935
996
  }
936
997
  }
937
- const list = typeof table === 'object' ? table.updateManyReturn(env, conn, '', baseFields, update, pKeys, setKeys, needUpdate.map(v => v[0]), where, Object.keys(baseFields)) : conn.updateManyReturn(env, table || '', baseFields, update, pKeys, setKeys, needUpdate.map(v => v[0]), where, Object.keys(baseFields));
998
+ const list = (typeof table === 'object' ? table.updateManyReturn(env, conn, columns, updateColumn, field2column(pKeys, fieldColumns), setKeysColumn, toColumnList(needUpdate.map(v => v[0]), fieldColumns), where2column(where, fieldColumns), columnKeys) : conn.updateManyReturn(env, table || '', columns, updateColumn, field2column(pKeys, fieldColumns), setKeysColumn, toColumnList(needUpdate.map(v => v[0]), fieldColumns), where2column(where, fieldColumns), columnKeys)).then(l => toFieldList(l, fieldColumns));
938
999
  listPromises.push(list);
939
1000
  subPromises.push(list.then(u => u.map((u, i) => [u, ...needUpdate[i]])));
940
1001
  }
941
1002
  // 批量新建
942
1003
  if (needCreate.length) {
943
- const key = Object.entries(baseFields);
944
- const list = typeof table === 'object' ? table.insert(env, conn, '', baseFields, await Promise.all(needCreate.map(d => getInsertValue(d, baseFields))), key.map(v => v[0])) : conn.insert(env, table || '', baseFields, await Promise.all(needCreate.map(d => getInsertValue(d, baseFields))), key.map(v => v[0]));
1004
+ const subColumnData = await Promise.all(needCreate.map(d => getInsertValue(d, columns, fieldColumns)));
1005
+ const list = (typeof table === 'object' ? table.insert(env, conn, columns, subColumnData, Object.keys(columns)) : conn.insert(env, table || '', columns, subColumnData, Object.keys(columns))).then(l => toFieldList(l, fieldColumns));
945
1006
  listPromises.push(list);
946
1007
  promises.push(list.then(list => createSub(conn, env, tableFields, needCreate, list)));
947
1008
  }
@@ -1014,29 +1075,21 @@ async function updateData (conn, model, data, newData, env) {
1014
1075
  fields
1015
1076
  } = model;
1016
1077
  const savedData = data;
1017
- const has = keys.filter(v => v in fields && (typeof fields[v]?.type === 'string' || !fields[v]?.type.table)).length;
1078
+ const has = keys.filter(v => v in fields && (typeof fields[v]?.type === 'string' || fields[v]?.type && !fields[v]?.type.table)).length;
1018
1079
  /** @type {WhereValue[]} */
1019
1080
  const where = getPrimaryKeys(fields).map(k => ({
1020
1081
  field: k,
1021
1082
  operator: '=',
1022
1083
  value: savedData[k]
1023
1084
  }));
1024
- const [baseFields, tableFields] = separateFields(fields);
1085
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
1025
1086
  let list = [];
1026
1087
  if (!has) {
1027
1088
  list = [data];
1028
1089
  } else if (table && typeof table === 'object') {
1029
- list = await table.updateReturn(env, conn, {
1030
- table: '',
1031
- fields: baseFields,
1032
- where
1033
- }, await getSetNewValue(fields, newData), Object.keys(baseFields));
1090
+ list = toFieldList(await table.updateReturn(env, conn, Object.keys(columns), columns, await getSetValue$1(columns, fieldColumns, newData), where2column(where, fieldColumns)), fieldColumns);
1034
1091
  } else {
1035
- list = await conn.updateReturn(env, {
1036
- table: table || '',
1037
- fields: baseFields,
1038
- where
1039
- }, await getSetNewValue(fields, newData), Object.keys(baseFields));
1092
+ list = toFieldList(await conn.updateReturn(env, Object.keys(columns), table || '', columns, await getSetValue$1(columns, fieldColumns, newData), where2column(where, fieldColumns)), fieldColumns);
1040
1093
  }
1041
1094
  const oldList = [data];
1042
1095
  const newList = [newData];
@@ -1046,16 +1099,31 @@ async function updateData (conn, model, data, newData, env) {
1046
1099
  return list[0];
1047
1100
  }
1048
1101
 
1102
+ /** @import { SetValue } from '../../set.mjs' */
1103
+ /**
1104
+ *
1105
+ * @param {Record<string, SetValue>} update
1106
+ * @param {Record<string, string>?} fieldColumns
1107
+ * @returns {Record<string, SetValue>}
1108
+ */
1109
+ function set2column(update, fieldColumns) {
1110
+ if (!fieldColumns) {
1111
+ return update;
1112
+ }
1113
+ // @ts-ignore
1114
+ return Object.fromEntries(Object.entries(update).map(([k, v]) => [fieldColumns[k], v]));
1115
+ }
1116
+
1049
1117
  /** @import { SetValue } from '../../set.mjs' */
1050
1118
  /** @import { Fields } from '../../types' */
1051
1119
  /**
1052
1120
  *
1053
- * @param {Fields} fields
1121
+ * @param {Fields} columns
1054
1122
  * @param {Record<string, SetValue>} update
1055
1123
  * @returns
1056
1124
  */
1057
- async function setDeleteTimestamp(fields, update) {
1058
- for (const [name, field] of Object.entries(fields)) {
1125
+ async function setDeleteTimestamp(columns, update) {
1126
+ for (const [name, field] of Object.entries(columns)) {
1059
1127
  if (field.primary) {
1060
1128
  continue;
1061
1129
  }
@@ -1069,7 +1137,7 @@ async function setDeleteTimestamp(fields, update) {
1069
1137
 
1070
1138
  /** @import { WhereValue } from '../Where.mjs' */
1071
1139
  /** @import { SetValue } from '../set.mjs' */
1072
- /** @import { Environment, IConnection, GetName, TableDefine } from '../types' */
1140
+ /** @import { Environment, IConnection, TableDefine } from '../types' */
1073
1141
  /**
1074
1142
  *
1075
1143
  * @param {IConnection} conn
@@ -1084,13 +1152,13 @@ async function pseudoDestroy (conn, tableDef, data, update, env) {
1084
1152
  table,
1085
1153
  fields
1086
1154
  } = tableDef;
1087
- const baseFields = toBaseFields(fields);
1088
1155
  /** @type {WhereValue[]} */
1089
1156
  const where = getPrimaryKeys(fields).map(k => ({
1090
1157
  field: k,
1091
1158
  operator: '=',
1092
1159
  value: data[k]
1093
1160
  }));
1161
+ const [columns, fieldColumns] = toColumns(fields);
1094
1162
  const pseudo = tableDef.pseudo || '';
1095
1163
  where.push({
1096
1164
  field: pseudo,
@@ -1102,24 +1170,13 @@ async function pseudoDestroy (conn, tableDef, data, update, env) {
1102
1170
  };
1103
1171
  const pseudoValue = Number(new Date());
1104
1172
  value[pseudo] = pseudoValue;
1105
- await setDeleteTimestamp(fields, value);
1106
- const [dataUpdated] = table && typeof table === 'object' ? await table.updateReturn(env, conn, {
1107
- table: '',
1108
- fields: baseFields,
1109
- where
1110
- }, value, Object.keys(baseFields)) : await conn.updateReturn(env, {
1111
- table: table || '',
1112
- fields: baseFields,
1113
- where
1114
- }, value, Object.keys(baseFields));
1115
- if (!dataUpdated) {
1116
- return null;
1117
- }
1118
- return dataUpdated;
1173
+ const set = set2column(value, fieldColumns);
1174
+ await setDeleteTimestamp(columns, set);
1175
+ const dataUpdated = table && typeof table === 'object' ? await table.updateReturn(env, conn, Object.keys(columns), columns, set, where2column(where, fieldColumns)) : await conn.updateReturn(env, Object.keys(columns), table || '', columns, set, where2column(where, fieldColumns));
1176
+ return toFieldList(dataUpdated, fieldColumns)[0] || null;
1119
1177
  }
1120
1178
 
1121
- /** @import { WhereValue } from '../Where.mjs' */
1122
- /** @import { IConnection, TableDefine, Environment, GetName } from '../types' */
1179
+ /** @import { IConnection, TableDefine, Environment } from '../types' */
1123
1180
  /**
1124
1181
  *
1125
1182
  * @param {IConnection} conn
@@ -1133,23 +1190,15 @@ async function completelyDelete (conn, tableDef, data, env) {
1133
1190
  table,
1134
1191
  fields
1135
1192
  } = tableDef;
1136
- const [baseFields, tableFields] = separateFields(fields);
1137
- /** @type {WhereValue[]} */
1138
- const where = getPrimaryKeys(fields).map(k => ({
1193
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
1194
+ const where = where2column(getPrimaryKeys(fields).map(k => ({
1139
1195
  field: k,
1140
1196
  operator: '=',
1141
1197
  value: data[k]
1142
- }));
1143
- const list = table && typeof table === 'object' ? await table.deleteReturn(env, conn, {
1144
- table: '',
1145
- fields: baseFields,
1146
- where
1147
- }, Object.keys(baseFields)) : await conn.deleteReturn(env, {
1148
- table: table || '',
1149
- fields: baseFields,
1150
- where
1151
- }, Object.keys(baseFields));
1152
- const [deleted] = await deleteSub(conn, list, tableFields, baseFields, env, true);
1198
+ })), fieldColumns);
1199
+ const list = toFieldList(table && typeof table === 'object' ? await table.deleteReturn(env, conn, Object.keys(columns), columns, where) : await conn.deleteReturn(env, Object.keys(columns), table || '', columns, where), fieldColumns);
1200
+ const baseFieldSet = new Set(Object.keys(fieldColumns || columns));
1201
+ const [deleted] = await deleteSub(conn, list, tableFields, baseFieldSet, env, true);
1153
1202
  return deleted || null;
1154
1203
  }
1155
1204
 
@@ -1159,15 +1208,39 @@ const Save = Symbol();
1159
1208
  const Create = Symbol();
1160
1209
  const Build = Symbol();
1161
1210
 
1162
- /** @import { Fields, FieldType, Select } from '../types' */
1211
+ /** @import { Fields, FieldType, Select } from '../../types' */
1163
1212
  /**
1164
- * @param {Fields<keyof FieldType>} fields
1213
+ * @param {Select} select
1214
+ * @param {Record<string, string>} fieldColumns
1215
+ * @returns {Select}
1216
+ */
1217
+ function toSelectItem(select, fieldColumns) {
1218
+ return {
1219
+ ...select,
1220
+ field: fieldColumns[select.field]
1221
+ };
1222
+ }
1223
+ /**
1224
+ * @param {Fields<keyof FieldType>} columns
1225
+ * @param {Record<string, string>?} fieldColumns
1165
1226
  * @param {Record<string, Select>?} [select]
1166
1227
  * @returns {[string, Select][]}
1167
1228
  */
1168
- function toSelect(fields, select) {
1229
+ function select2column(columns, fieldColumns, select) {
1169
1230
  const list = select ? Object.entries(select) : [];
1170
- return list.length ? list : Object.keys(fields).map(k => [k, {
1231
+ if (list.length) {
1232
+ if (!fieldColumns) {
1233
+ return list;
1234
+ }
1235
+ return list.map(([k, s]) => [k, toSelectItem(s, fieldColumns)]);
1236
+ }
1237
+ if (fieldColumns) {
1238
+ return Object.entries(fieldColumns).map(([f, c]) => [f, {
1239
+ field: c
1240
+ }]);
1241
+ }
1242
+ let keys = Object.keys(columns);
1243
+ return keys.map(k => [k, {
1171
1244
  field: k
1172
1245
  }]);
1173
1246
  }
@@ -1175,32 +1248,45 @@ function toSelect(fields, select) {
1175
1248
  /** @import { Fields, FieldType } from '../../types' */
1176
1249
  /**
1177
1250
  *
1178
- * @param {Fields<keyof FieldType>} fields
1179
- * @param {string} [noField]
1251
+ * @param {Fields<keyof FieldType>} columns
1252
+ * @param {string} [noColumn]
1180
1253
  * @returns {[string, boolean][]}
1181
1254
  */
1182
- function getDefaultSort(fields, noField) {
1255
+ function getDefaultSort(columns, noColumn) {
1183
1256
  /** @type {[string, boolean, number][]} */
1184
- const sorted = Object.entries(fields).map(([f, d]) => [f, (d.sort || 0) < 0, Math.abs(d.sort || 0)]);
1257
+ const sorted = Object.entries(columns).map(([f, d]) => [f, (d.sort || 0) < 0, Math.abs(d.sort || 0)]);
1185
1258
  /** @type {[string, boolean][]} */
1186
1259
  const sort = sorted.filter(v => v[2]).sort(([,, a], [,, b]) => a - b).map(([a, b]) => [a, b]);
1187
- if (noField) {
1188
- sort.unshift([noField, false]);
1260
+ if (noColumn) {
1261
+ sort.unshift([noColumn, false]);
1189
1262
  }
1190
1263
  return sort;
1191
1264
  }
1192
1265
 
1193
- /** @import { Environment, FieldDefine, Fields, FieldType, GetName, IConnection, TableDefine } from '../types' */
1266
+ /**
1267
+ *
1268
+ * @param {[field: string, desc: boolean][]} sort
1269
+ * @param {Record<string, string>?} fieldColumns
1270
+ * @returns {[field: string, desc: boolean][]}
1271
+ */
1272
+ function sort2column(sort, fieldColumns) {
1273
+ if (!fieldColumns) {
1274
+ return sort;
1275
+ }
1276
+ return sort.map(([f, d]) => [fieldColumns[f], d]);
1277
+ }
1278
+
1279
+ /** @import { Environment, FieldDefine, Fields, FieldType, IConnection, TableDefine } from '../types' */
1194
1280
  /**
1195
1281
  *
1196
1282
  * @param {IConnection} conn
1197
1283
  * @param {any[]} list
1198
1284
  * @param {[string, FieldDefine<TableDefine>][]} fields
1199
- * @param {Fields<keyof FieldType>} baseFields
1285
+ * @param {Set<string>} baseFieldSet
1200
1286
  * @param {Environment} env
1201
1287
  * @returns {Promise<any[]>}
1202
1288
  */
1203
- async function findSub(conn, list, fields, baseFields, env) {
1289
+ async function findSub(conn, list, fields, baseFieldSet, env) {
1204
1290
  if (!list.length) {
1205
1291
  return list;
1206
1292
  }
@@ -1216,31 +1302,29 @@ async function findSub(conn, list, fields, baseFields, env) {
1216
1302
  const {
1217
1303
  fields
1218
1304
  } = type;
1219
- const [subfields, tableFields] = separateFields(fields);
1220
- const mapList = getMapList(subfields, baseFields, constraints);
1305
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
1306
+ const noColumn = noField && fieldColumns ? fieldColumns[noField] : noField;
1307
+ const mapList = getMapList(fields, baseFieldSet, constraints);
1221
1308
  if (!mapList) {
1222
1309
  continue;
1223
1310
  }
1224
- const value = getValueEntries(constraints, subfields);
1225
- const where = [subList2where(list, mapList), ...valueEntries2where(value)];
1311
+ const value = getValueEntries(constraints, columns);
1312
+ const where = where2column([subList2where(list, mapList), ...valueEntries2where(value)], fieldColumns);
1313
+ const select = select2column(columns, fieldColumns);
1226
1314
  const {
1227
1315
  table
1228
1316
  } = type;
1229
1317
  /** @type {PromiseLike<object[] | object>} */
1230
- const result = table && typeof table === 'object' ? table.select(env, conn, {
1231
- table: '',
1232
- fields: subfields,
1318
+ const result = table && typeof table === 'object' ? table.find(env, conn, columns, {
1233
1319
  where,
1234
- sort: getDefaultSort(subfields, noField),
1235
- select: toSelect(subfields)
1236
- }) : conn.select(env, {
1237
- table: table || '',
1238
- fields: subfields,
1320
+ sort: getDefaultSort(columns, noColumn),
1321
+ select
1322
+ }) : conn.find(env, table || '', columns, {
1239
1323
  where,
1240
- sort: getDefaultSort(subfields, noField),
1241
- select: toSelect(subfields)
1324
+ sort: getDefaultSort(columns, noColumn),
1325
+ select
1242
1326
  });
1243
- promises.push(result.then(list => findSub(conn, list, tableFields, subfields, env)));
1327
+ promises.push(result.then(list => findSub(conn, list, tableFields, new Set(Object.keys(fieldColumns || columns)), env)));
1244
1328
  promises.push(array ? result.then(subList => {
1245
1329
  for (const item of list) {
1246
1330
  item[key] = subList.filter(createFilter(item, mapList));
@@ -1271,33 +1355,27 @@ async function find(conn, p, env) {
1271
1355
  where,
1272
1356
  sort,
1273
1357
  offset,
1274
- limit,
1275
- alias
1358
+ limit
1276
1359
  } = getOptions(p);
1277
- const [baseFields, tableFields] = separateFields(fields);
1278
- const list = table && typeof table === 'object' ? await table.select(env, conn, {
1279
- table: '',
1280
- fields: baseFields,
1281
- alias,
1282
- where,
1360
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
1361
+ const list = table && typeof table === 'object' ? await table.find(env, conn, columns, {
1362
+ where: where2column(where, fieldColumns),
1283
1363
  offset,
1284
1364
  limit,
1285
- sort: sort?.length ? sort : getDefaultSort(baseFields),
1286
- select: toSelect(baseFields)
1287
- }) : await conn.select(env, {
1288
- table: table || '',
1289
- fields: baseFields,
1290
- alias,
1291
- where,
1365
+ sort: sort?.length ? sort2column(sort, fieldColumns) : getDefaultSort(columns),
1366
+ select: select2column(columns, fieldColumns)
1367
+ }) : await conn.find(env, table || '', columns, {
1368
+ where: where2column(where, fieldColumns),
1292
1369
  offset,
1293
1370
  limit,
1294
- sort: sort?.length ? sort : getDefaultSort(baseFields),
1295
- select: toSelect(baseFields)
1371
+ sort: sort?.length ? sort2column(sort, fieldColumns) : getDefaultSort(columns),
1372
+ select: select2column(columns, fieldColumns)
1296
1373
  });
1297
1374
  if (!list.length) {
1298
1375
  return [];
1299
1376
  }
1300
- await findSub(conn, list, tableFields, baseFields, env);
1377
+ const baseFieldSet = new Set(Object.keys(fieldColumns || columns));
1378
+ await findSub(conn, list, tableFields, baseFieldSet, env);
1301
1379
  if (typeof p[Build] !== 'function') {
1302
1380
  return list;
1303
1381
  }
@@ -1306,7 +1384,7 @@ async function find(conn, p, env) {
1306
1384
  return list.map(it => R(it, true, env));
1307
1385
  }
1308
1386
 
1309
- /** @import { Environment, TableDefine, IConnection, GetName } from '../types' */
1387
+ /** @import { Environment, TableDefine, IConnection } from '../types' */
1310
1388
  /**
1311
1389
  *
1312
1390
  * @template {TableDefine} T
@@ -1323,28 +1401,22 @@ async function first(conn, p, env) {
1323
1401
  // @ts-ignore
1324
1402
  const {
1325
1403
  where,
1326
- sort,
1327
- alias
1404
+ sort
1328
1405
  } = getOptions(p);
1329
- const [baseFields, tableFields] = separateFields(fields);
1330
- const list = table && typeof table === 'object' ? await table.select(env, conn, {
1331
- table: '',
1332
- fields: baseFields,
1333
- alias,
1334
- where,
1406
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
1407
+ const list = table && typeof table === 'object' ? await table.find(env, conn, columns, {
1408
+ where: where2column(where, fieldColumns),
1335
1409
  limit: 1,
1336
- sort: sort?.length ? sort : getDefaultSort(baseFields),
1337
- select: toSelect(baseFields)
1338
- }) : await conn.select(env, {
1339
- table: table || '',
1340
- fields: baseFields,
1341
- alias,
1342
- where,
1410
+ sort: sort?.length ? sort2column(sort, fieldColumns) : getDefaultSort(columns),
1411
+ select: select2column(columns, fieldColumns)
1412
+ }) : await conn.find(env, table || '', columns, {
1413
+ where: where2column(where, fieldColumns),
1343
1414
  limit: 1,
1344
- sort: sort?.length ? sort : getDefaultSort(baseFields),
1345
- select: toSelect(baseFields)
1415
+ sort: sort?.length ? sort2column(sort, fieldColumns) : getDefaultSort(columns),
1416
+ select: select2column(columns, fieldColumns)
1346
1417
  });
1347
- const [item] = await findSub(conn, list, tableFields, baseFields, env);
1418
+ const baseFieldSet = new Set(Object.keys(fieldColumns || columns));
1419
+ const [item] = await findSub(conn, list, tableFields, baseFieldSet, env);
1348
1420
  if (!item) {
1349
1421
  return null;
1350
1422
  }
@@ -1354,7 +1426,7 @@ async function first(conn, p, env) {
1354
1426
  return p[Build](item, true, env);
1355
1427
  }
1356
1428
 
1357
- /** @import { Environment, GetName, IConnection, Queryable } from '../types' */
1429
+ /** @import { Environment, IConnection, Queryable } from '../types' */
1358
1430
  /**
1359
1431
  * @param {IConnection} conn
1360
1432
  * @param {Queryable} queryable
@@ -1369,23 +1441,16 @@ async function pseudoDeleteMany(conn, queryable, update, env) {
1369
1441
  const {
1370
1442
  where
1371
1443
  } = getOptions(queryable);
1444
+ const [columns, fieldColumns] = toColumns(fields);
1372
1445
  const value = typeof update !== 'object' ? {} : {
1373
1446
  ...update
1374
1447
  };
1375
1448
  const pseudoValue = Number(new Date());
1376
1449
  const pseudo = queryable.pseudo || '';
1377
1450
  value[pseudo] = pseudoValue;
1378
- await setDeleteTimestamp(fields, value);
1379
- const baseFields = toBaseFields(fields);
1380
- const list = table && typeof table === 'object' ? await table.updateReturn(env, conn, {
1381
- table: '',
1382
- fields: baseFields,
1383
- where
1384
- }, value, Object.keys(baseFields)) : await conn.updateReturn(env, {
1385
- table: table || '',
1386
- fields: baseFields,
1387
- where
1388
- }, value, Object.keys(baseFields));
1451
+ const set = set2column(value, fieldColumns);
1452
+ await setDeleteTimestamp(columns, set);
1453
+ const list = table && typeof table === 'object' ? await table.updateReturn(env, conn, Object.keys(columns), columns, set, where2column(where, fieldColumns)) : await conn.updateReturn(env, Object.keys(columns), table || '', columns, set, where2column(where, fieldColumns));
1389
1454
  return list.length;
1390
1455
  }
1391
1456
 
@@ -1424,7 +1489,7 @@ function table2db(tables) {
1424
1489
  map.set(table, t);
1425
1490
  allTables.push(t);
1426
1491
  }
1427
- const dbFields = t.fields;
1492
+ const dbColumns = t.fields;
1428
1493
  for (const [name, field] of Object.entries(fields)) {
1429
1494
  const {
1430
1495
  type,
@@ -1438,10 +1503,11 @@ function table2db(tables) {
1438
1503
  if (!type) {
1439
1504
  continue;
1440
1505
  }
1441
- const old = dbFields[name];
1506
+ const key = field.column || name;
1507
+ const old = dbColumns[key];
1442
1508
  if (typeof type === 'string') {
1443
1509
  if (!old) {
1444
- t.fields[name] = {
1510
+ t.fields[key] = {
1445
1511
  type,
1446
1512
  size,
1447
1513
  scale,
@@ -1451,7 +1517,7 @@ function table2db(tables) {
1451
1517
  primary
1452
1518
  };
1453
1519
  } else {
1454
- t.fields[name] = {
1520
+ t.fields[key] = {
1455
1521
  type,
1456
1522
  size: size || old.size,
1457
1523
  scale: scale || old.scale,
@@ -1463,14 +1529,11 @@ function table2db(tables) {
1463
1529
  }
1464
1530
  continue;
1465
1531
  }
1466
- if (typeof type !== 'object') {
1467
- continue;
1468
- }
1469
1532
  if (type.table) {
1470
1533
  continue;
1471
1534
  }
1472
1535
  if (!old) {
1473
- t.fields[name] = {
1536
+ t.fields[key] = {
1474
1537
  type: 'object',
1475
1538
  nullable,
1476
1539
  array
@@ -1488,7 +1551,7 @@ function table2db(tables) {
1488
1551
  for (const {
1489
1552
  type
1490
1553
  } of Object.values(fields)) {
1491
- if (!type || typeof type !== 'object') {
1554
+ if (!type || typeof type === 'string') {
1492
1555
  continue;
1493
1556
  }
1494
1557
  list.push(type);
@@ -1711,6 +1774,7 @@ class Connection {
1711
1774
  if (newData) {
1712
1775
  /** @type {any} */
1713
1776
  const doc = data;
1777
+ // @ts-ignore
1714
1778
  return updateData(conn, model, doc, newData, this.#env);
1715
1779
  }
1716
1780
  return create(conn, this.#env, model, data);
@@ -1761,6 +1825,7 @@ class Connection {
1761
1825
  };
1762
1826
  if (typeof data[PseudoDestroy] !== 'function') {
1763
1827
  const conn = await this.#getConnection();
1828
+ // @ts-ignore
1764
1829
  return pseudoDestroy(conn, tableDef, data, update, this.#env);
1765
1830
  }
1766
1831
  const r = /** @type {PseudoDestroy} */data;
@@ -1831,22 +1896,24 @@ class Connection {
1831
1896
  table,
1832
1897
  fields
1833
1898
  }, data, keys) {
1834
- const baseFields = toBaseFields(fields);
1899
+ const [columns, fieldColumns] = toColumns(fields);
1835
1900
  const isArray = Array.isArray(data);
1836
- const insertValues = (isArray ? data : [data]).map(d => getInsertValue(d, fields));
1901
+ const insertValues = (isArray ? data : [data]).map(d => getInsertValue(d, columns, fieldColumns));
1837
1902
  if (!insertValues.length) {
1838
1903
  throw new Error();
1839
1904
  }
1840
- let insertKeys = [...new Set(keys || [])].filter(k => k in baseFields);
1905
+ let insertKeys = fieldColumns ? [...new Set(keys || [])].map(k => fieldColumns[k]).filter(Boolean) : [...new Set(keys || [])].filter(k => k in columns);
1841
1906
  if (!insertKeys.length && !isArray) {
1842
- insertKeys = Object.entries(insertValues[0]).filter(([k, v]) => v !== undefined && k in baseFields).map(([k]) => k);
1907
+ insertKeys = Object.entries(insertValues[0]).filter(([k, v]) => v !== undefined && k in columns).map(([k]) => k);
1843
1908
  }
1844
1909
  if (!insertKeys.length) {
1845
- insertKeys = Object.entries(baseFields).map(v => v[0]);
1910
+ insertKeys = Object.entries(columns).map(v => v[0]);
1846
1911
  }
1847
1912
  const conn = await this.#getConnection();
1848
- const p = table && typeof table === 'object' ? await table.insert(this.#env, conn, '', baseFields, insertValues, insertKeys) : await conn.insert(this.#env, table || '', baseFields, insertValues, insertKeys);
1849
- return isArray ? (/** @type {*}*/p) : p[0];
1913
+ const result = table && typeof table === 'object' ? await table.insert(this.#env, conn, columns, insertValues, insertKeys) : await conn.insert(this.#env, table || '', columns, insertValues, insertKeys);
1914
+ const list = toFieldList(result, fieldColumns);
1915
+ // @ts-ignore
1916
+ return isArray ? list : list[0];
1850
1917
  }
1851
1918
  /**
1852
1919
  * @param {TableDefine} tableDefine
@@ -1859,16 +1926,9 @@ class Connection {
1859
1926
  table,
1860
1927
  fields
1861
1928
  }, update, where, skip) {
1929
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
1862
1930
  const conn = await this.#getConnection();
1863
- return table && typeof table === 'object' ? table.update(this.#env, conn, {
1864
- table: '',
1865
- fields: toBaseFields(fields),
1866
- where: where || undefined
1867
- }, await getSetNewValue(fields, update, skip)) : conn.update(this.#env, {
1868
- table: table || '',
1869
- fields: toBaseFields(fields),
1870
- where: where || undefined
1871
- }, await getSetNewValue(fields, update, skip));
1931
+ return table && typeof table === 'object' ? table.update(this.#env, conn, columns, await getSetValue$1(columns, fieldColumns, update, skip), where2column(where, fieldColumns)) : conn.update(this.#env, table || '', columns, await getSetValue$1(columns, fieldColumns, update, skip), where2column(where, fieldColumns));
1872
1932
  }
1873
1933
  /**
1874
1934
  * @template {Fields<MainFieldType>} T
@@ -1883,17 +1943,10 @@ class Connection {
1883
1943
  table,
1884
1944
  fields
1885
1945
  }, update, returning, where, skip) {
1946
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
1886
1947
  const conn = await this.#getConnection();
1887
- const baseFields = toBaseFields(fields);
1888
- return table && typeof table === 'object' ? table.updateReturn(this.#env, conn, {
1889
- table: '',
1890
- fields: baseFields,
1891
- where: where || undefined
1892
- }, await getSetNewValue(fields, update, skip), returning?.length ? returning : Object.keys(baseFields)) : conn.updateReturn(this.#env, {
1893
- table: table || '',
1894
- fields: baseFields,
1895
- where: where || undefined
1896
- }, await getSetNewValue(fields, update, skip), returning?.length ? returning : Object.keys(baseFields));
1948
+ const result = table && typeof table === 'object' ? await table.updateReturn(this.#env, conn, returning?.length ? field2column(returning, fieldColumns) : Object.keys(columns), columns, await getSetValue$1(columns, fieldColumns, update, skip), where2column(where, fieldColumns)) : await conn.updateReturn(this.#env, returning?.length ? field2column(returning, fieldColumns) : Object.keys(columns), table || '', columns, await getSetValue$1(columns, fieldColumns, update, skip), where2column(where, fieldColumns));
1949
+ return toFieldList(result, fieldColumns);
1897
1950
  }
1898
1951
  /**
1899
1952
  * @param {TableDefine} tableDefine
@@ -1907,11 +1960,11 @@ class Connection {
1907
1960
  table,
1908
1961
  fields
1909
1962
  }, pKeys, setKeys, list, skip) {
1910
- const baseFields = toBaseFields(fields);
1911
- const update = await getSetNewValue(fields, null, skip);
1912
- const [whereFields, setFields] = getKeys(baseFields, update, pKeys, setKeys);
1963
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
1964
+ const update = await getSetValue$1(columns, fieldColumns, null, skip);
1965
+ const [whereColumns, setColumns] = getKeys(columns, update, field2column(pKeys, fieldColumns), field2column(setKeys, fieldColumns));
1913
1966
  const conn = await this.#getConnection();
1914
- return table && typeof table === 'object' ? table.updateMany(this.#env, conn, '', baseFields, update, whereFields, setFields, list, []) : conn.updateMany(this.#env, table || '', baseFields, update, whereFields, setFields, list, []);
1967
+ return table && typeof table === 'object' ? table.updateMany(this.#env, conn, columns, update, whereColumns, setColumns, toColumnList(list, fieldColumns), []) : conn.updateMany(this.#env, table || '', columns, update, whereColumns, setColumns, list, []);
1915
1968
  }
1916
1969
  /**
1917
1970
  * @template {Fields<MainFieldType>} T
@@ -1927,11 +1980,12 @@ class Connection {
1927
1980
  table,
1928
1981
  fields
1929
1982
  }, pKeys, setKeys, list, returning, skip) {
1930
- const baseFields = toBaseFields(fields);
1931
- const update = getSetNewValue(fields, null, skip);
1932
- const [whereFields, setFields] = getKeys(baseFields, update, pKeys, setKeys);
1983
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
1984
+ const update = getSetValue$1(columns, fieldColumns, null, skip);
1985
+ const [whereColumns, setColumns] = getKeys(columns, update, field2column(pKeys, fieldColumns), field2column(setKeys, fieldColumns));
1933
1986
  const conn = await this.#getConnection();
1934
- return table && typeof table === 'object' ? table.updateManyReturn(this.#env, conn, '', baseFields, update, whereFields, setFields, list, [], returning?.length ? returning : Object.keys(baseFields)) : conn.updateManyReturn(this.#env, table || '', baseFields, update, whereFields, setFields, list, [], returning?.length ? returning : Object.keys(baseFields));
1987
+ const result = table && typeof table === 'object' ? await table.updateManyReturn(this.#env, conn, columns, update, whereColumns, setColumns, toColumnList(list, fieldColumns), [], returning?.length ? field2column(returning, fieldColumns) : Object.keys(columns)) : await conn.updateManyReturn(this.#env, table || '', columns, update, whereColumns, setColumns, toColumnList(list, fieldColumns), [], returning?.length ? field2column(returning, fieldColumns) : Object.keys(columns));
1988
+ return toFieldList(result, fieldColumns);
1935
1989
  }
1936
1990
  /**
1937
1991
  * @param {TableDefine} tableDefine
@@ -1942,16 +1996,9 @@ class Connection {
1942
1996
  table,
1943
1997
  fields
1944
1998
  }, where) {
1999
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
1945
2000
  const conn = await this.#getConnection();
1946
- return table && typeof table === 'object' ? table.delete(this.#env, conn, {
1947
- table: '',
1948
- fields: toBaseFields(fields),
1949
- where
1950
- }) : conn.delete(this.#env, {
1951
- table: table || '',
1952
- fields: toBaseFields(fields),
1953
- where
1954
- });
2001
+ return table && typeof table === 'object' ? table.delete(this.#env, conn, columns, where2column(where, fieldColumns)) : conn.delete(this.#env, table || '', columns, where2column(where, fieldColumns));
1955
2002
  }
1956
2003
  /**
1957
2004
  * @template {Fields<MainFieldType>} T
@@ -1964,17 +2011,10 @@ class Connection {
1964
2011
  table,
1965
2012
  fields
1966
2013
  }, returning, where) {
2014
+ const [columns, fieldColumns, tableFields] = toColumns(fields);
1967
2015
  const conn = await this.#getConnection();
1968
- const baseFields = toBaseFields(fields);
1969
- return table && typeof table === 'object' ? table.deleteReturn(this.#env, conn, {
1970
- table: '',
1971
- fields: baseFields,
1972
- where
1973
- }, returning?.length ? returning : Object.keys(baseFields)) : conn.deleteReturn(this.#env, {
1974
- table: table || '',
1975
- fields: baseFields,
1976
- where
1977
- }, returning?.length ? returning : Object.keys(baseFields));
2016
+ const result = table && typeof table === 'object' ? await table.deleteReturn(this.#env, conn, returning?.length ? field2column(returning, fieldColumns) : Object.keys(columns), columns, where2column(where, fieldColumns)) : await conn.deleteReturn(this.#env, returning?.length ? field2column(returning, fieldColumns) : Object.keys(columns), table || '', columns, where2column(where, fieldColumns));
2017
+ return toFieldList(result, fieldColumns);
1978
2018
  }
1979
2019
  /**
1980
2020
  *
@@ -1982,50 +2022,49 @@ class Connection {
1982
2022
  * @returns {Promise<number>}
1983
2023
  */
1984
2024
  async count(queryable) {
2025
+ const [columns, fieldColumns, tableFields] = toColumns(queryable.fields);
1985
2026
  const {
1986
- table,
1987
- fields
2027
+ table
1988
2028
  } = queryable;
1989
2029
  const options = getOptions(queryable);
2030
+ const where = where2column(options.where, fieldColumns);
1990
2031
  const conn = await this.#getConnection();
1991
- return table && typeof table === 'object' ? table.count(this.#env, conn, {
1992
- ...options,
1993
- table: '',
1994
- fields: toBaseFields(fields)
1995
- }) : conn.count(this.#env, {
1996
- ...options,
1997
- table: table || '',
1998
- fields: toBaseFields(fields)
1999
- });
2032
+ return table && typeof table === 'object' ? table.count(this.#env, conn, columns, where) : conn.count(this.#env, table || '', columns, where);
2000
2033
  }
2001
2034
  /**
2002
2035
  * @param {Queryable} queryable
2003
2036
  * @returns {Promise<any[]>}
2004
2037
  */
2005
2038
  async select(queryable) {
2039
+ const [columns, fieldColumns, tableFields] = toColumns(queryable.fields);
2006
2040
  const {
2007
2041
  table
2008
2042
  } = queryable;
2009
- const fields = toBaseFields(queryable.fields);
2010
2043
  const options = getOptions(queryable);
2044
+ const {
2045
+ offset,
2046
+ limit
2047
+ } = options;
2048
+ const where = where2column(options.where, fieldColumns);
2011
2049
  const conn = await this.#getConnection();
2012
- const select = toSelect(fields, options.select);
2050
+ const select = select2column(columns, fieldColumns, options.select);
2013
2051
  const {
2014
2052
  sort
2015
2053
  } = options;
2016
- return table && typeof table === 'object' ? table.select(this.#env, conn, {
2017
- ...options,
2018
- table: '',
2019
- fields,
2054
+ const result = table && typeof table === 'object' ? await table.find(this.#env, conn, columns, {
2055
+ offset,
2056
+ limit,
2057
+ where,
2020
2058
  select,
2021
- sort: sort?.length ? sort : getDefaultSort(fields)
2022
- }) : conn.select(this.#env, {
2023
- ...options,
2024
- table: table || '',
2025
- fields,
2059
+ sort: sort?.length ? sort2column(sort, fieldColumns) : getDefaultSort(columns)
2060
+ }) : await conn.find(this.#env, table || '', columns, {
2061
+ offset,
2062
+ limit,
2063
+ where,
2026
2064
  select,
2027
- sort: sort?.length ? sort : getDefaultSort(fields)
2065
+ sort: sort?.length ? sort2column(sort, fieldColumns) : getDefaultSort(columns)
2028
2066
  });
2067
+ return result;
2029
2068
  }
2030
2069
  /**
2031
2070
  * @param {string} table
@@ -2124,62 +2163,6 @@ class Connection {
2124
2163
  const conn = await this.#getConnection();
2125
2164
  return conn.renameTable(this.#env, table, newName);
2126
2165
  }
2127
- /**
2128
- * @param {string} view
2129
- * @param {Queryable} queryable
2130
- * @returns {Promise<number>}
2131
- */
2132
- async createView(view, queryable) {
2133
- const conn = await this.#getConnection();
2134
- const {
2135
- table
2136
- } = queryable;
2137
- const fields = toBaseFields(queryable.fields);
2138
- const options = getOptions(queryable);
2139
- const select = toSelect(fields, options.select);
2140
- return conn.createView(this.#env, view, {
2141
- ...options,
2142
- table: typeof table === 'string' ? table : '',
2143
- fields,
2144
- select
2145
- });
2146
- }
2147
- /**
2148
- * @param {string} view
2149
- * @returns {Promise<number>}
2150
- */
2151
- async dropView(view) {
2152
- const conn = await this.#getConnection();
2153
- return conn.dropView(this.#env, view);
2154
- }
2155
- /**
2156
- * @param {string} view
2157
- * @param {Queryable} queryable
2158
- * @returns {Promise<number>}
2159
- */
2160
- async createMaterializedView(view, queryable) {
2161
- const conn = await this.#getConnection();
2162
- const {
2163
- table
2164
- } = queryable;
2165
- const fields = toBaseFields(queryable.fields);
2166
- const options = getOptions(queryable);
2167
- const select = toSelect(fields, options.select);
2168
- return conn.createMaterializedView(this.#env, view, {
2169
- ...options,
2170
- table: typeof table === 'string' ? table : '',
2171
- fields,
2172
- select
2173
- });
2174
- }
2175
- /**
2176
- * @param {string} view
2177
- * @returns {Promise<number>}
2178
- */
2179
- async dropMaterializedView(view) {
2180
- const conn = await this.#getConnection();
2181
- return conn.dropMaterializedView(this.#env, view);
2182
- }
2183
2166
  /** @type {AbortController[]} */
2184
2167
  #layers = [];
2185
2168
  /**
@@ -2520,12 +2503,7 @@ function submodel(type, constraints, p1, p2) {
2520
2503
  const define = {
2521
2504
  ...p,
2522
2505
  constraints,
2523
- type: {
2524
- table: type.table,
2525
- fields: type.fields,
2526
- pseudo: type.pseudo,
2527
- indexes: type.indexes
2528
- },
2506
+ type,
2529
2507
  array,
2530
2508
  nullable: false,
2531
2509
  immutable
@@ -2891,6 +2869,16 @@ function prop(prop, value) {
2891
2869
  return (_, ctx) => setProp(ctx, prop, value);
2892
2870
  }
2893
2871
 
2872
+ /** @import { FieldDecorator } from './index.mjs' */
2873
+ /**
2874
+ *
2875
+ * @param {string} [column]
2876
+ * @returns {FieldDecorator<any>}
2877
+ */
2878
+ function column(column) {
2879
+ return (_, ctx) => setProp(ctx, 'column', column);
2880
+ }
2881
+
2894
2882
  /** @import { FieldDecorator } from './index.mjs' */
2895
2883
  /**
2896
2884
  *
@@ -3652,7 +3640,7 @@ class Where {
3652
3640
  }
3653
3641
  }
3654
3642
 
3655
- /** @typedef {SetValue.Increment | SetValue.Decrement | SetValue.Multiply | SetValue.Divide | string | number | bigint | boolean | null | typeof now | (string | number | bigint | boolean)[]} SetValue */
3643
+ /** @typedef {SetValue.Increment | SetValue.Decrement | SetValue.Multiply | SetValue.Divide | string | number | bigint | boolean | null | typeof now | typeof uuid | (string | number | bigint | boolean)[]} SetValue */
3656
3644
  /** @typedef {{[values.increment]: number | bigint}} SetValue.Increment */
3657
3645
  /** @typedef {{[values.decrement]: number | bigint}} SetValue.Decrement */
3658
3646
  /** @typedef {{[values.multiply]: number | bigint}} SetValue.Multiply */
@@ -4414,7 +4402,7 @@ function getInitValue(field, value) {
4414
4402
  if (typeof type === 'string') {
4415
4403
  return getBaseTypeValue(type, field.array, value, true);
4416
4404
  }
4417
- if (!type.table) {
4405
+ if (!type?.table) {
4418
4406
  return getBaseTypeValue('object', field.array, value, true);
4419
4407
  }
4420
4408
  const {
@@ -4444,6 +4432,9 @@ function getInitValue(field, value) {
4444
4432
  const {
4445
4433
  type
4446
4434
  } = field;
4435
+ if (!type) {
4436
+ continue;
4437
+ }
4447
4438
  if (typeof type === 'string') {
4448
4439
  doc[key] = getBaseTypeValue(type, field.array, values[key]);
4449
4440
  } else if (!type.table) {
@@ -4471,6 +4462,9 @@ function getSetValue(field, value, immutable) {
4471
4462
  }
4472
4463
  return getBaseTypeValue(type, field.array, value, true);
4473
4464
  }
4465
+ if (!type) {
4466
+ return;
4467
+ }
4474
4468
  if (!type.table) {
4475
4469
  return getBaseTypeValue('object', field.array, value, true);
4476
4470
  }
@@ -4502,6 +4496,9 @@ function getSetValue(field, value, immutable) {
4502
4496
  const {
4503
4497
  type
4504
4498
  } = field;
4499
+ if (!type) {
4500
+ continue;
4501
+ }
4505
4502
  if (typeof type === 'string') {
4506
4503
  if (typeof type !== 'string') {
4507
4504
  continue;
@@ -4661,6 +4658,9 @@ class Model {
4661
4658
  const {
4662
4659
  type
4663
4660
  } = field;
4661
+ if (!type) {
4662
+ continue;
4663
+ }
4664
4664
  // eslint-disable-next-line no-nested-ternary
4665
4665
  values[key] = typeof type === 'string' ? getBaseTypeValue(type, field.array)
4666
4666
  // eslint-disable-next-line no-nested-ternary
@@ -5204,4 +5204,4 @@ function field(type, {
5204
5204
  };
5205
5205
  }
5206
5206
 
5207
- export { Build, Connection, Create, Destroy, Model, PseudoDestroy, Query, Save, Submodel, Where, creating, decrement, field as define, deleted, deleting, divide, field$1 as field, getPrimaryFields, getPrimaryKeys, immutable, increment, index, isDevelopment, isPseudo, submodel as model, multiply, now, primary, prop, pseudo, setDevelopment, sort, submodel, toNot, toPrimaries, toPrimary, undeleted, updating, values, withDeleted };
5207
+ export { Build, Connection, Create, Destroy, Model, PseudoDestroy, Query, Save, Submodel, Where, column, creating, decrement, field as define, deleted, deleting, divide, field$1 as field, getPrimaryFields, getPrimaryKeys, immutable, increment, index, isDevelopment, isPseudo, submodel as model, multiply, now, primary, prop, pseudo, setDevelopment, sort, submodel, toNot, toPrimaries, toPrimary, undeleted, updating, uuid, values, withDeleted };